wip widget
CI for debye_bec / test (push) Failing after 50s

This commit is contained in:
x01da
2026-08-06 10:27:57 +02:00
parent bf5d7e9787
commit e2c9497294
@@ -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)