From 6ceaa5e2bf0d2ee876b0249cd18155c5c34e609d Mon Sep 17 00:00:00 2001 From: Chi Cheng Date: Wed, 13 Mar 2024 15:56:49 +0000 Subject: [PATCH 1/4] atom selection widget performance updates and corrected type hint --- .../InputWidgets/AtomSelectionWidget.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/AtomSelectionWidget.py b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/AtomSelectionWidget.py index 02d7d92e53..0b7d34fa28 100644 --- a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/AtomSelectionWidget.py +++ b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/AtomSelectionWidget.py @@ -12,7 +12,7 @@ # @authors Scientific Computing Group at ILL (see AUTHORS) # # ************************************************************************** -from typing import Union +from typing import Union, Iterator from itertools import count, groupby from qtpy.QtCore import Qt, QEvent, Slot, QObject from qtpy.QtGui import QStandardItem @@ -26,7 +26,6 @@ QHBoxLayout, QGroupBox, QLabel, - QApplication, QTextEdit, ) from MDANSE.Framework.AtomSelector import Selector @@ -111,12 +110,12 @@ def addItem(self, text: str) -> None: """ item = QStandardItem() item.setText(text) - item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable) - item.setData(Qt.Unchecked, Qt.CheckStateRole) + item.setEnabled(True) + item.setCheckable(True) self.model().appendRow(item) self._items.append(item) - def getItems(self) -> QStandardItem: + def getItems(self) -> Iterator[QStandardItem]: """ Yields ------ @@ -240,7 +239,11 @@ def __init__(self, selector: Selector, field: QLineEdit, parent, *args, **kwargs combo_layout = QHBoxLayout() combo = CheckableComboBox() items = [i for i in v.keys() if match_exists[k][i]] + # we blocksignals here as there can be some + # performance issues with a large number of items + combo.model().blockSignals(True) combo.addItems(items) + combo.model().blockSignals(False) combo.setObjectName(k) combo.model().dataChanged.connect(self.update) label = QLabel(self._cbox_text[k]) @@ -293,12 +296,12 @@ def update(self) -> None: idxs = self.selector.get_idxs() num_sel = len(idxs) - text = f"Number of atoms selected:\n{num_sel}\n\nSelected atoms:\n" - for at in self.selector.system.atom_list: - if at.index in idxs: - text += f"{at.index}) {at.full_name}\n" + text = [f"Number of atoms selected:\n{num_sel}\n\nSelected atoms:\n"] + atoms = self.selector.system.atom_list + for idx in idxs: + text.append(f"{idx}) {atoms[idx].full_name}\n") - self.right.setText(text) + self.right.setText("".join(text)) def apply(self) -> None: """Set the field of the AtomSelectionWidget to the currently From 95109bd0360aab26c339de4b4cee5b049d7eaee9 Mon Sep 17 00:00:00 2001 From: Chi Cheng Date: Wed, 13 Mar 2024 16:37:11 +0000 Subject: [PATCH 2/4] performance update to atom selector --- MDANSE/Src/MDANSE/Framework/AtomSelector/selector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MDANSE/Src/MDANSE/Framework/AtomSelector/selector.py b/MDANSE/Src/MDANSE/Framework/AtomSelector/selector.py index ebfee05032..4171ea9923 100644 --- a/MDANSE/Src/MDANSE/Framework/AtomSelector/selector.py +++ b/MDANSE/Src/MDANSE/Framework/AtomSelector/selector.py @@ -156,7 +156,7 @@ def get_idxs(self) -> set[int]: if not switch: continue - idxs = idxs | self._funcs[k](self.system, **args) + idxs.update(self._funcs[k](self.system, **args)) if self.settings["invert"]: return self.all_idxs - idxs From 052a53a36abef3f215cbde22b2054d58759498d5 Mon Sep 17 00:00:00 2001 From: Chi Cheng Date: Thu, 14 Mar 2024 10:06:11 +0000 Subject: [PATCH 3/4] updated hdftrajectorywidget so that it doesn't load the trajectory multiple times since all it needs to do is store the path. Trajectories should always be valid since they were loaded in the trajectory tab. --- .../InputWidgets/HDFTrajectoryWidget.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py index 675df9d32f..20d2d1088c 100644 --- a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py +++ b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py @@ -2,7 +2,7 @@ # # MDANSE: Molecular Dynamics Analysis for Neutron Scattering Experiments # -# @file Src/PyQtGUI/InputWidgets/HDFTrajectoryWidget.py +# @file MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py # @brief Implements module/class/test HDFTrajectoryWidget # # @homepage https://www.isis.stfc.ac.uk/Pages/MDANSEproject.aspx @@ -12,18 +12,15 @@ # @authors Scientific Computing Group at ILL (see AUTHORS) # # ************************************************************************** - import os -from qtpy.QtWidgets import QLineEdit, QSpinBox, QLabel -from qtpy.QtCore import Slot, Signal -from qtpy.QtGui import QIntValidator +from qtpy.QtWidgets import QLabel -from MDANSE.Framework.InputData.HDFTrajectoryInputData import HDFTrajectoryInputData from MDANSE_GUI.InputWidgets.WidgetBase import WidgetBase class HDFTrajectoryWidget(WidgetBase): + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) source_object = kwargs.get("source_object", None) @@ -32,19 +29,15 @@ def __init__(self, *args, **kwargs): except AttributeError: filename = None if filename is not None: - trajectory = HDFTrajectoryInputData(filename) label = QLabel(filename, self._base) self._layout.addWidget(label) - self._configurator.configure(filename) trajectory_path, _ = os.path.split(filename) self.default_path = trajectory_path else: label = QLabel("No Trajectory available", self._base) self._layout.addWidget(label) - self._trajectory = trajectory self.default_labels() self.update_labels() - self.updateValue() if self._tooltip: tooltip_text = self._tooltip else: @@ -65,7 +58,7 @@ def default_labels(self): self._tooltip = "The input trajectory to be processed" def get_value(self): - return self._configurator["value"] + return self.default_path def get_widget_value(self): return self.get_value() From b75576e96044a4f9ff0d34d1553b37648f5c74cd Mon Sep 17 00:00:00 2001 From: Chi Cheng Date: Thu, 14 Mar 2024 10:42:47 +0000 Subject: [PATCH 4/4] analysis job run fix --- MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py | 3 ++- MDANSE_GUI/Src/MDANSE_GUI/Tabs/Visualisers/Action.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py index 20d2d1088c..32930e0db8 100644 --- a/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py +++ b/MDANSE_GUI/Src/MDANSE_GUI/InputWidgets/HDFTrajectoryWidget.py @@ -29,6 +29,7 @@ def __init__(self, *args, **kwargs): except AttributeError: filename = None if filename is not None: + self._configurator.configure(filename) label = QLabel(filename, self._base) self._layout.addWidget(label) trajectory_path, _ = os.path.split(filename) @@ -58,7 +59,7 @@ def default_labels(self): self._tooltip = "The input trajectory to be processed" def get_value(self): - return self.default_path + return self._configurator["value"] def get_widget_value(self): return self.get_value() diff --git a/MDANSE_GUI/Src/MDANSE_GUI/Tabs/Visualisers/Action.py b/MDANSE_GUI/Src/MDANSE_GUI/Tabs/Visualisers/Action.py index d58d433414..abb2622bb4 100644 --- a/MDANSE_GUI/Src/MDANSE_GUI/Tabs/Visualisers/Action.py +++ b/MDANSE_GUI/Src/MDANSE_GUI/Tabs/Visualisers/Action.py @@ -146,7 +146,6 @@ def update_panel(self, job_name: str) -> None: dtype = value[0] ddict = value[1] configurator = job_instance.configuration[key] - configurator.configure(self._input_trajectory) if not "label" in ddict.keys(): ddict["label"] = key ddict["configurator"] = configurator