Add new edge selector to digital twin
CI for debye_bec / test (push) Failing after 1m28s
CI for debye_bec / test (pull_request) Failing after 51s

This commit is contained in:
x01da
2026-08-11 08:09:28 +02:00
parent 734639dc40
commit 86121bcc7f
2 changed files with 55 additions and 4 deletions
@@ -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
@@ -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,