From 4bf8952789b2e7b47206e264876c6ac6cbff19ad Mon Sep 17 00:00:00 2001 From: x01da Date: Tue, 11 Aug 2026 07:00:54 +0200 Subject: [PATCH] wip widget --- .../bec_widgets/widgets/edge_selector.py | 32 ++++++------- .../scan_control_xas/scan_control_xas.py | 47 +++++++++---------- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/debye_bec/bec_widgets/widgets/edge_selector.py b/debye_bec/bec_widgets/widgets/edge_selector.py index e578616..3d974d5 100644 --- a/debye_bec/bec_widgets/widgets/edge_selector.py +++ b/debye_bec/bec_widgets/widgets/edge_selector.py @@ -143,9 +143,9 @@ class EdgeSelector(QDialog): super().__init__(parent) self.setWindowTitle("Absorption Edge Selector") self.buttons = {} - self.active_edge = None - self.active_element = None - self.active_energy = None + self.selected_edge = None + self.selected_element = None + self.selected_energy = None self.llim = llim self.hlim = hlim @@ -210,19 +210,19 @@ class EdgeSelector(QDialog): @SafeSlot() def _edge_changed(self, *_): - self.active_edge = self.edge.currentText() + self.selected_edge = self.edge.currentText() for element, button in self.buttons.items(): # logger.info(f"{element}") - if "L" in self.active_edge and element in ["H", "He"]: + if "L" in self.selected_edge and element in ["H", "He"]: button.setDisabled(True) button.setChecked(False) - elif self.active_edge in ["L2", "L3"] and element == "Li": + elif self.selected_edge in ["L2", "L3"] and element == "Li": button.setDisabled(True) button.setChecked(False) else: - energy = xraydb.xray_edge(element, self.active_edge, True) - if self.active_element == element: - self.active_energy = energy + energy = xraydb.xray_edge(element, self.selected_edge, True) + if self.selected_element == element: + self.selected_energy = energy if energy is not None: if energy < self.llim or energy > self.hlim: button.setChecked(False) @@ -237,25 +237,25 @@ class EdgeSelector(QDialog): @SafeSlot() def _element_changed(self, element: str | None = None): if element is None: - if self.active_element is None: + if self.selected_element is None: return - element = self.active_element + element = self.selected_element # Uncheck all other buttons so only the picked one stays highlighted for e, btn in self.buttons.items(): if e != element: btn.setChecked(False) self.buttons[element].setChecked(True) - self.active_element = element - self.active_energy = xraydb.xray_edge(element, self.active_edge, True) + self.selected_element = element + self.selected_energy = xraydb.xray_edge(element, self.selected_edge, True) self.select_button.setEnabled(True) self._set_select_text() def _set_select_text(self): - if self.active_energy is not None: - if self.buttons[self.active_element].isChecked(): + if self.selected_energy is not None: + if self.buttons[self.selected_element].isChecked(): self._enable_button(self.select_button, True) self.select_button.setText( - f"Selected {self.active_element}, {self.active_edge}-edge, {self.active_energy:0.1f} eV" + f"Selected {self.selected_element}, {self.selected_edge}-edge, {self.selected_energy:0.1f} eV" ) else: self._enable_button(self.select_button, False) diff --git a/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py b/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py index 45ad514..be3c4cf 100644 --- a/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py +++ b/debye_bec/bec_widgets/widgets/scan_control_xas/scan_control_xas.py @@ -61,6 +61,9 @@ class ScanControlXAS(ScanControl): def __init__(self, *args, **kwargs): self._motion_profile_group = QGroupBox("XAS scan helper") + self._motion_profile_group.setSizePolicy( + QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed + ) motion_profile_layout = QVBoxLayout(self._motion_profile_group) self.motion_profile_widget = MotionProfileWidget(self) motion_profile_layout.addWidget(self.motion_profile_widget) @@ -82,7 +85,7 @@ class ScanControlXAS(ScanControl): self.motion_profile_widget.update_plot(d_spacing=d_spacing) def _add_metadata_form(self): - self.layout.addWidget(self._motion_profile_group, stretch=1) # type: ignore + self.layout.addWidget(self._motion_profile_group) # type: ignore super()._add_metadata_form() self._connect_scan_parameter_signals() @@ -142,16 +145,13 @@ class MotionProfileWidget(QWidget): def __init__(self, parent): super().__init__() self._parent_widget = parent - hostname = self.parent.client._hostname - start = hostname.find("x") self.beamline = "" - if start != -1: - self.beamline = hostname[start : start + 5] outer_layout = QVBoxLayout(self) outer_layout.setContentsMargins(0, 0, 0, 0) + self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) - edge_selector_layout = QHBoxLayout(self) + edge_selector_layout = QHBoxLayout() edge_selector_label = QLabel("Absorption edge:") self.edge_selector_button = QPushButton("Choose") self.edge_label = QLabel("No edge selected") @@ -160,7 +160,7 @@ class MotionProfileWidget(QWidget): edge_selector_layout.addWidget(self.edge_selector_button) edge_selector_layout.addStretch() - scan_rng_layout = QHBoxLayout(self) + scan_rng_layout = QHBoxLayout() self.scan_rng_ckbox = QCheckBox(self) self.scan_rng_ckbox.setCheckState(Qt.CheckState.Checked) scan_rng_label = QLabel("Auto adjust scan range to absorption edge") @@ -168,35 +168,24 @@ class MotionProfileWidget(QWidget): scan_rng_layout.addWidget(scan_rng_label) scan_rng_layout.addStretch() - plot_container = QWidget() - plot_layout = QHBoxLayout(plot_container) + plot_layout = QHBoxLayout() plot_layout.setContentsMargins(0, 0, 0, 0) - self.plot_pos = self._make_plot(left_label="Energy
[eV]", bottom_label="Time [s]") self.plot_vel = self._make_plot( left_label="Scan Velocity
[eV/s]", bottom_label="Energy [eV]" ) - - self.edge_energy = None - plot_layout.addWidget(self.plot_pos) plot_layout.addWidget(self.plot_vel) - plot_container.setMinimumHeight( - int(np.max([self.plot_pos.minimumHeight(), self.plot_vel.minimumHeight()])) - ) - scroll = QScrollArea() - scroll.setWidgetResizable(True) - scroll.setFrameShape(QFrame.Shape.NoFrame) - scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff) - scroll.setWidget(plot_container) + self.edge_energy = None self.edge_selection = QHBoxLayout() self.edge_selection.addLayout(edge_selector_layout) self.edge_selection.addStretch(1) + outer_layout.addLayout(self.edge_selection) outer_layout.addLayout(scan_rng_layout) - outer_layout.addWidget(scroll, stretch=1) + outer_layout.addLayout(plot_layout) self.scan_name = None self.scan_parameters = None @@ -216,8 +205,9 @@ class MotionProfileWidget(QWidget): plot.hideButtons() plot.getAxis("left").enableAutoSIPrefix(False) plot.getAxis("bottom").enableAutoSIPrefix(False) - plot.setMinimumHeight(180) - plot.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.MinimumExpanding) + plot.setMinimumHeight(150) + plot.setMaximumHeight(150) + plot.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) return plot def _add_edge_marker(self, plot, x_arr, y_arr, energy_arr, edge_marker): @@ -246,6 +236,11 @@ class MotionProfileWidget(QWidget): @SafeSlot() def _update_edge(self, *_): + if self.beamline == "": + hostname = self._parent_widget.client._hostname + start = hostname.find("x") + if start != -1: + self.beamline = hostname[start : start + 5] match self.beamline: case "x01da": dlg = EdgeSelector(self, llim=X01DA_E_MIN, hlim=X01DA_E_MAX) @@ -254,9 +249,9 @@ class MotionProfileWidget(QWidget): case _: dlg = EdgeSelector(self) if dlg.exec_(): - self.edge_energy = dlg.active_energy + self.edge_energy = dlg.selected_energy self.edge_label.setText( - f"{dlg.active_element}, {dlg.active_edge}-edge, {dlg.active_energy:0.1f} eV" + f"{dlg.selected_element}, {dlg.selected_edge}-edge, {dlg.selected_energy:0.1f} eV" ) self._update_auto_scan_rng() self.update_plot()