From 53e7593b8e2ac7ecfbfe02210a47298f5cb7bce7 Mon Sep 17 00:00:00 2001 From: x12sa Date: Thu, 12 Mar 2026 16:22:29 +0100 Subject: [PATCH] fixed centering routine fsamx movements --- csaxs_bec/devices/omny/rt/rt_flomni_ophyd.py | 47 ++++++++++++-------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/csaxs_bec/devices/omny/rt/rt_flomni_ophyd.py b/csaxs_bec/devices/omny/rt/rt_flomni_ophyd.py index e0ee6f2..e769e14 100644 --- a/csaxs_bec/devices/omny/rt/rt_flomni_ophyd.py +++ b/csaxs_bec/devices/omny/rt/rt_flomni_ophyd.py @@ -175,7 +175,10 @@ class RtFlomniController(Controller): self.set_device_read_write("fopty", False) def move_samx_to_scan_region(self, fovx: float, cenx: float): + #new routine not using fovx anymore + self.device_manager.devices.rtx.obj.move(cenx, wait=True) time.sleep(0.05) + #at cenx we expect the PID to be close to zero for a good fsamx position if self.rt_pid_voltage is None: rtx = self.device_manager.devices.rtx self.rt_pid_voltage = rtx.user_parameter.get("rt_pid_voltage") @@ -184,31 +187,39 @@ class RtFlomniController(Controller): "rt_pid_voltage not set in rtx user parameters. Please run feedback_enable_with_reset first." ) logger.info(f"Using PID voltage from rtx user parameter: {self.rt_pid_voltage}") - expected_voltage = self.rt_pid_voltage + fovx / 2 * 7 / 100 - logger.info(f"Expected PID voltage: {expected_voltage}") + expected_voltage = self.rt_pid_voltage + #logger.info(f"Expected PID voltage: {expected_voltage}") logger.info(f"Current PID voltage: {self.get_pid_x()}") - wait_on_exit = False - while True: - if np.abs(self.get_pid_x() - expected_voltage) < 1: - break - wait_on_exit = True - self.socket_put("v0") + #we allow 2V range from center, this corresponds to 30 microns + if np.abs(self.get_pid_x() - expected_voltage) < 2: + logger.info("No correction of fsamx needed") + else: fsamx = self.device_manager.devices.fsamx - fsamx.read_only = False fsamx.obj.controller.socket_put_confirmed("axspeed[4]=0.1*stppermm[4]") - fsamx.obj.pid_x_correction -= (self.get_pid_x() - expected_voltage) * 0.007 - logger.info(f"Correcting fsamx by {fsamx.obj.pid_x_correction}") - fsamx_in = fsamx.user_parameter.get("in") - fsamx.obj.move(fsamx_in + cenx / 1000 + fsamx.obj.pid_x_correction, wait=True) - fsamx.read_only = True - time.sleep(0.1) - self.laser_tracker_on() - time.sleep(0.01) + while True: + #when we correct, then to 1 V, within 15 microns + if np.abs(self.get_pid_x() - expected_voltage) < 1: + logger.info("No further correction needed") + break + wait_on_exit = True + #disable FZP piezo feedback + self.socket_put("v0") + fsamx.read_only = False + logger.info(f"Current PID voltage: {self.get_pid_x()}") + #here we accumulate the correction + fsamx.obj.pid_x_correction -= (self.get_pid_x() - expected_voltage) * 0.006 + fsamx_in = fsamx.user_parameter.get("in") + logger.info(f"Moving fsamx to {cenx / 1000 * 0.7 + fsamx.obj.pid_x_correction}, PID portion of that {fsamx.obj.pid_x_correction}") + fsamx.obj.move(fsamx_in + cenx / 1000 * 0.7 + fsamx.obj.pid_x_correction, wait=True) + fsamx.read_only = True + time.sleep(0.1) + self.laser_tracker_on() + time.sleep(0.01) if wait_on_exit: time.sleep(1) - + #enable fast FZP feedback again self.socket_put("v1") @threadlocked