From 86121bcc7f3ed1c4af9e9015a84cca6e44b947ec Mon Sep 17 00:00:00 2001 From: x01da Date: Tue, 11 Aug 2026 08:09:28 +0200 Subject: [PATCH] Add new edge selector to digital twin --- .../widgets/digital_twin/digital_twin.py | 27 ++++++++++++++++ .../digital_twin/panels/input_panel.py | 32 ++++++++++++++++--- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/debye_bec/bec_widgets/widgets/digital_twin/digital_twin.py b/debye_bec/bec_widgets/widgets/digital_twin/digital_twin.py index b8ff05f..f5fcbfe 100644 --- a/debye_bec/bec_widgets/widgets/digital_twin/digital_twin.py +++ b/debye_bec/bec_widgets/widgets/digital_twin/digital_twin.py @@ -35,6 +35,7 @@ from qtpy.QtWidgets import ( QWidget, ) +from ..edge_selector import EdgeSelector from .beamline import get_beamline_id from .calculations.calc_positions import calc_positions from .calculations.calc_sideview import calc_sideview @@ -66,6 +67,11 @@ logger = bec_logger.logger OFFSET_FILE_X01DA = Path(__file__).with_name("x01da_offsets.yaml") OFFSET_FILE_X10DA = Path(__file__).with_name("x10da_offsets.yaml") +X01DA_E_MIN = 4500 +X01DA_E_MAX = 60000 +X10DA_E_MIN = 4500 +X10DA_E_MAX = 35000 + class DigitalTwin(BECWidget, QWidget): """ @@ -140,6 +146,7 @@ class DigitalTwin(BECWidget, QWidget): self.setWindowTitle("Digital Twin") self.resize(1450, 950) + self.input.edge_selector.clicked_connect(self.open_edge_selector) self.input.energy.value_changed_connect(self.calc_assistant) self.input.sldi_hacc.value_changed_connect(self.calc_assistant) self.input.sldi_vacc.value_changed_connect(self.calc_assistant) @@ -162,6 +169,7 @@ class DigitalTwin(BECWidget, QWidget): self.settings.load_offsets.clicked_connect(self.load_offsets) self.settings.show_offsets.clicked_connect(self.show_offsets) + self.edge_selector_energy = 0.0 self.bragg_angle = 0.0 self.qy = 0.0 self.offsets = {} @@ -326,6 +334,7 @@ class DigitalTwin(BECWidget, QWidget): self.calc_fm_ideal_pitch() self.calc_mo1_energy_resolution() case "energy": + self.update_edge_selected() self.calc_mo1_bragg_angle() self.calc_cm_crit_pitch() self.calc_cm_reflectivity() @@ -789,6 +798,24 @@ class DigitalTwin(BECWidget, QWidget): surfaces = calc_surfaces(config) self.surface_plots.update_surfaces(scene="reality", data=surfaces) + @SafeSlot() + def open_edge_selector(self, *_): + match self.beamline: + case "x01da": + dlg = EdgeSelector(self, llim=X01DA_E_MIN, hlim=X01DA_E_MAX) + case "x10da": + dlg = EdgeSelector(self, llim=X10DA_E_MIN, hlim=X10DA_E_MAX) + case _: + dlg = EdgeSelector(self) + if dlg.exec_(): + self.input.edge_selected.setText(f"{dlg.selected_element}, {dlg.selected_edge}-edge") + self.edge_selector_energy = dlg.selected_energy + self.input.energy.set_number(dlg.selected_energy) + + def update_edge_selected(self): + if self.input.energy.value() != self.edge_selector_energy: + self.input.edge_selected.setText("-") + def calc_mo1_energy_resolution(self): """ Calculates the energy resolution of the monochromator diff --git a/debye_bec/bec_widgets/widgets/digital_twin/panels/input_panel.py b/debye_bec/bec_widgets/widgets/digital_twin/panels/input_panel.py index c0ae458..8bebec6 100644 --- a/debye_bec/bec_widgets/widgets/digital_twin/panels/input_panel.py +++ b/debye_bec/bec_widgets/widgets/digital_twin/panels/input_panel.py @@ -5,10 +5,17 @@ Panel for user inputs of the digital twin widget from typing import Union # pylint: disable=E0611 -from qtpy.QtWidgets import QVBoxLayout, QWidget +from qtpy.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget from ..types import BeamlineId -from ..widgets.qt_widgets import Button, ComboBox, Group, InputNumberField, NumberIndicator +from ..widgets.qt_widgets import ( + Button, + ComboBox, + Group, + InputNumberField, + NumberIndicator, + TextIndicator, +) class InputPanel(QWidget): @@ -28,11 +35,28 @@ class InputPanel(QWidget): # Adapt to reality self.adapt_reality = Button(label_button="Adapt to reality", enabled=True) - # Energy + # edge_selector_layout = QVBoxLayout() + # edge_selector_label = QLabel("Absorption edge:") + # self.edge_selector_button = QPushButton("Choose") + # self.edge_label = QLabel("No edge selected") + # edge_selector_layout.addWidget(edge_selector_label) + # edge_selector_layout.addWidget(self.edge_label) + # edge_selector_layout.addWidget(self.edge_selector_button) + # edge_selector_layout.addStretch() + + # Edge selector + self.edge_selector = Button("Absorption edge", "Choose", enabled=True) + + # Chosen absorption edge + self.edge_selected = TextIndicator("Chosen edge") + + # Direct Energy Input self.energy = InputNumberField( "energy", "Energy", unit="eV", init=8979, decimals=0, single_step=100, ll=4000, hl=65000 ) + self.energy_group = Group("Energy", [self.edge_selector, self.edge_selected, self.energy]) + # FE Slits Acceptance self.sldi_hacc = InputNumberField( "h_acc", @@ -156,7 +180,7 @@ class InputPanel(QWidget): "User Input", [ self.adapt_reality, - self.energy, + self.energy_group, self.sldi_ass_group, self.cm_ass_group, self.mo1_ass_group,