@@ -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)
|
||||
|
||||
@@ -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<br>[eV]", bottom_label="Time [s]")
|
||||
self.plot_vel = self._make_plot(
|
||||
left_label="Scan Velocity<br>[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()
|
||||
|
||||
Reference in New Issue
Block a user