@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user