From e2c94972946cdfb93fe96200e907237614764024 Mon Sep 17 00:00:00 2001 From: x01da Date: Thu, 6 Aug 2026 10:27:57 +0200 Subject: [PATCH] wip widget --- .../scan_control_advanced.py | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/debye_bec/bec_widgets/widgets/scan_control_advanced/scan_control_advanced.py b/debye_bec/bec_widgets/widgets/scan_control_advanced/scan_control_advanced.py index 500bc64..6c8d72d 100644 --- a/debye_bec/bec_widgets/widgets/scan_control_advanced/scan_control_advanced.py +++ b/debye_bec/bec_widgets/widgets/scan_control_advanced/scan_control_advanced.py @@ -6,6 +6,7 @@ from bec_lib import bec_logger from bec_lib.endpoints import MessageEndpoints from bec_widgets.utils.bec_dispatcher import BECDispatcher from bec_widgets.utils.colors import apply_theme +from bec_widgets.utils.error_popups import SafeSlot from bec_widgets.widgets.control.scan_control.scan_control import ScanControl from qtpy.QtCore import Qt, QTimer, Signal @@ -31,21 +32,14 @@ class ScanControlAdvanced(ScanControl): super().__init__(*args, **kwargs) self.show_motion_profile(self._selected_scan) - # self.bec_dispatcher.connect_slot( - # self.mo1_update, MessageEndpoints.device_readback("mo1_bragg_crystal_current_d_spacing") - # ) - - # Timer: update d_spacing every 1 second self.d_spacing = 0 - self._timer = QTimer(self) - self._timer.setInterval(1000) - self._timer.timeout.connect(self.update_d_spacing) - self._timer.start() + self.bec_dispatcher.connect_slot( + self.update_d_spacing, MessageEndpoints.device_readback("mo1_bragg") + ) - def update_d_spacing(self): - d_spacing = self.dev.mo1_bragg.crystal.current_d_spacing.read(cached=True)[ - "mo1_bragg_crystal_current_d_spacing" - ]["value"] + @SafeSlot(dict, dict) + def update_d_spacing(self, msg: dict, metadata: dict): + d_spacing = msg["signals"].get("mo1_bragg_crystal_current_d_spacing")["value"] if d_spacing != self.d_spacing: self.d_spacing = d_spacing self.motion_profile_widget.update_plot(d_spacing=d_spacing) @@ -108,8 +102,21 @@ class MotionProfileWidget(QWidget): super().__init__() self.parent = parent layout = QVBoxLayout(self) + self.plot_pos = pg.PlotWidget() + self.plot_pos.setLabel("left", "Energy [eV]") + self.plot_pos.setLabel("bottom", "Time [s]") + self.plot_pos.setMouseEnabled(x=False, y=False) + self.plot_pos.setMenuEnabled(False) + self.plot_pos.hideButtons() + self.plot_vel = pg.PlotWidget() + self.plot_vel.setLabel("left", "Scan Velocity [eV/s]") + self.plot_vel.setLabel("bottom", "Energy [eV]") + self.plot_vel.setMouseEnabled(x=False, y=False) + self.plot_vel.setMenuEnabled(False) + self.plot_vel.hideButtons() + layout.addWidget(self.plot_pos) layout.addWidget(self.plot_vel) self.scan_name = None @@ -147,8 +154,9 @@ class MotionProfileWidget(QWidget): logger.info(f"pos: {pos}") vel = two_pi_f * amp * np.sin(x_time * two_pi_f) energy = self.angle_to_energy(pos) + vel_e = self.velocity_to_energy_per_s(pos, vel) self.plot_pos.plot(x_time, energy) - self.plot_vel.plot(energy, vel) + self.plot_vel.plot(energy, -vel_e) if "xas_advanced_scan" in self.scan_name: if ( self.scan_parameters["e_kink"] < self.scan_parameters["start"] @@ -167,8 +175,9 @@ class MotionProfileWidget(QWidget): ) x_time = np.cumsum(t) / 1000 energy = self.angle_to_energy(pos) + vel_e = self.velocity_to_energy_per_s(pos, vel) self.plot_pos.plot(-np.flip(x_time) + x_time[-1], np.flip(energy)) - self.plot_vel.plot(energy, vel) + self.plot_vel.plot(energy, -vel_e) def energy_to_angle(self, energy: int | float): if self.d_spacing is None: @@ -191,6 +200,17 @@ class MotionProfileWidget(QWidget): wl = 2 * self.d_spacing * 1e-10 * np.sin(angle / 180 * np.pi) return C * H / (E * wl) + def velocity_to_energy_per_s(self, angle, velocity): + if self.d_spacing is None: + return 0 + return ( + -C + * H + * (np.pi / 180) + * np.cos(angle / 180 * np.pi) + / (E * 2 * self.d_spacing * 1e-10 * np.sin(angle / 180 * np.pi) ** 2) + ) * velocity + if __name__ == "__main__": app = QApplication(sys.argv)