From c9536d9380ff62a2f836e48000b92c196ba031e1 Mon Sep 17 00:00:00 2001 From: Holler Mirko Date: Wed, 9 Oct 2024 14:29:19 +0200 Subject: [PATCH] various fixes --- .../plugins/flomni/flomni.py | 2 +- .../plugins/omny/omny_alignment_mixin.py | 2 +- csaxs_bec/devices/omny/galil/ogalil_ophyd.py | 59 ++++++++++++++++++- csaxs_bec/devices/omny/rt/rt_omny_ophyd.py | 13 ++-- csaxs_bec/scans/flomni_fermat_scan.py | 4 +- csaxs_bec/scans/omny_fermat_scan.py | 25 +------- 6 files changed, 69 insertions(+), 36 deletions(-) diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index b31c5a9..8fd6161 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -1051,7 +1051,7 @@ class FlomniAlignmentMixin: value = line.split(" ")[2] name = line.split(" ")[0].split("[")[0] if name == "corr_pos": - corr_pos.append(float(value) / 1000) + corr_pos.append(float(value)) elif name == "corr_angle": corr_angle.append(float(value)) print( diff --git a/csaxs_bec/bec_ipython_client/plugins/omny/omny_alignment_mixin.py b/csaxs_bec/bec_ipython_client/plugins/omny/omny_alignment_mixin.py index e3b2060..f40c0a5 100644 --- a/csaxs_bec/bec_ipython_client/plugins/omny/omny_alignment_mixin.py +++ b/csaxs_bec/bec_ipython_client/plugins/omny/omny_alignment_mixin.py @@ -186,7 +186,7 @@ class OMNYAlignmentMixin: value = line.split(" ")[2] name = line.split(" ")[0].split("[")[0] if name == "corr_pos": - corr_pos.append(float(value) / 1000) + corr_pos.append(float(value)) elif name == "corr_angle": corr_angle.append(float(value)) print( diff --git a/csaxs_bec/devices/omny/galil/ogalil_ophyd.py b/csaxs_bec/devices/omny/galil/ogalil_ophyd.py index f30a7b2..527ae18 100644 --- a/csaxs_bec/devices/omny/galil/ogalil_ophyd.py +++ b/csaxs_bec/devices/omny/galil/ogalil_ophyd.py @@ -53,6 +53,10 @@ class GalilMotorResolution(GalilSignalRO): class OMNYGalilReadbackSignal(GalilSignalRO): + + previous_rotation_angle = 0 + ignore_glitch = True + @retry_once @threadlocked def _socket_get(self) -> float: @@ -76,9 +80,31 @@ class OMNYGalilReadbackSignal(GalilSignalRO): def read(self): self._metadata["timestamp"] = time.time() val = super().read() + #if reading rotation stage angle if self.parent.axis_Id_numeric == 2 and self.controller.sock.port == 8083: + current_readback_value = val[self.parent.name]["value"] + #print (f"previous rotation angle {self.previous_rotation_angle}, current readback {current_readback_value}.") + if np.fabs((self.previous_rotation_angle-current_readback_value)>10): + message = f"Glitch detected in rotation stage. Previous rotation angle {self.previous_rotation_angle}, current readback {current_readback_value}." + print(message) + self.parent.device_manager.connector.send_client_info(message, scope="glitch detector", show_asap=True) + + val = super().read() + current_readback_value = val[self.parent.name]["value"] + + if np.fabs((self.previous_rotation_angle-current_readback_value)>10): + message = f"Glitch detected in rotation stage second read. Previous rotation angle {self.previous_rotation_angle}, current readback {current_readback_value}. Disabling the controller." + print(message) + self.parent.device_manager.connector.send_client_info(message, scope="glitch detector", show_asap=True) + + self.parent.device_manager.devices["osamroy"].obj.controller.socket_put_confirmed("allaxref=0") + self.parent.device_manager.devices["osamroy"].obj.enabled = False + + return val + + self.previous_rotation_angle = current_readback_value try: rt = self.parent.device_manager.devices["rtx"] if rt.enabled: @@ -88,6 +114,7 @@ class OMNYGalilReadbackSignal(GalilSignalRO): return val + class OMNYGalilController(GalilController): USER_ACCESS = [ "describe", @@ -213,7 +240,7 @@ class OMNYGalilController(GalilController): class OMNYGalilMotor(Device, PositionerBase): - USER_ACCESS = ["controller", "find_reference", "drive_axis_to_limit", "_ogalil_folerr_reset_and_ignore", "_ogalil_set_axis_to_pos_wo_reference_search", "get_motor_limit_switch", "axis_is_referenced", "get_motor_temperature", "folerr_status"] + USER_ACCESS = ["controller", "find_reference", "omny_osamx_to_scan_center", "drive_axis_to_limit", "_ogalil_folerr_reset_and_ignore", "_ogalil_set_axis_to_pos_wo_reference_search", "get_motor_limit_switch", "axis_is_referenced", "get_motor_temperature", "folerr_status"] readback = Cpt(OMNYGalilReadbackSignal, signal_name="readback", kind="hinted") user_setpoint = Cpt(GalilSetpointSignal, signal_name="setpoint") motor_resolution = Cpt(GalilMotorResolution, signal_name="resolution", kind="config") @@ -450,7 +477,35 @@ class OMNYGalilMotor(Device, PositionerBase): check if an axis is referenced """ return self.controller.axis_is_referenced(self.axis_Id_numeric) - + + def _get_user_param_safe(self, device, var): + param = self.device_manager.devices[device].user_parameter + if not param or param.get(var) is None: + raise ValueError(f"Device {device} has no user parameter definition for {var}.") + return param.get(var) + + def omny_osamx_to_scan_center(self, cenx): + if self.controller.sock.port == 8082 and self.axis_Id_numeric == 0: + # get last setpoint + osamx = self.device_manager.devices["osamx"] + osamx_current_setpoint = osamx.obj.readback.get() + omny_samx_in = self._get_user_param_safe("osamx","in") + if np.fabs(osamx_current_setpoint-(omny_samx_in+cenx/1000)) > 0.025: + message=f"Moving osamx to scan center. new osamx target {omny_samx_in+cenx/1000:.3f}." + logger.info(message) + + osamx.read_only = False + #osamx.controller.("osamx", "controller.socket_put_confirmed('axspeed[0]=1000')") + osamx.set(omny_samx_in+cenx/1000) + time.sleep(0.1) + while(osamx.motor_is_moving.get()): + time.sleep(0.05) + osamx.read_only = True + time.sleep(2) + rt = self.device_manager.devices["rtx"] + if rt.enabled: + rt.obj.controller.laser_tracker_on() + rt.obj.controller.laser_tracker_check_and_wait_for_signalstrength() def folerr_status(self) -> bool: return self.controller.folerr_status(self.axis_Id_numeric) diff --git a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py index c011a23..7195f9d 100644 --- a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py +++ b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py @@ -266,7 +266,7 @@ class RtOMNYController(Controller): def laser_tracker_check_and_wait_for_signalstrength(self): - print("Checking laser tracker...") + self.get_device_manager().connector.send_client_info("Checking laser tracker...", scope="", show_asap=True) if not self.laser_tracker_check_enabled(): print("laser_tracker_check_and_wait_for_signalstrength: The laser tracker is not even enabled.") return @@ -288,8 +288,8 @@ class RtOMNYController(Controller): if signal < low_signal: self.get_device_manager().connector.send_client_info(f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m", scope="laser_tracker_check_and_wait_for_signalstrength", show_asap=True) - self.omny_interferometer_align_tracking() - print("Checking laser tracker completed.") + self.omny_interferometer_align_tracking() + self.get_device_manager().connector.send_client_info("Checking laser tracker completed.", scope="", show_asap=True) def omny_interferometer_align_tracking(self): mirror_channel=6 @@ -945,11 +945,12 @@ class RtOMNYController(Controller): f" {self.average_stdeviations_y_st_fzp/read_counter*1000:.1f}." ) - print( + self.get_device_manager().connector.send_client_info( "OMNY statistics: Average of all standard deviations [nm]: x" f" {self.average_stdeviations_x_st_fzp/read_counter*1000:.1f}, y" - f" {self.average_stdeviations_y_st_fzp/read_counter*1000:.1f}." - ) + f" {self.average_stdeviations_y_st_fzp/read_counter*1000:.1f}.", + scope="", show_asap=True) + def publish_device_data(self, signals, point_id): self.get_device_manager().connector.set_and_publish( diff --git a/csaxs_bec/scans/flomni_fermat_scan.py b/csaxs_bec/scans/flomni_fermat_scan.py index c9b8f18..2a2dd91 100644 --- a/csaxs_bec/scans/flomni_fermat_scan.py +++ b/csaxs_bec/scans/flomni_fermat_scan.py @@ -59,8 +59,8 @@ class FlomniFermatScan(SyncFlyScanBase): Args: fovx(float) [um]: Fov in the piezo plane (i.e. piezo range). Max 200 um fovy(float) [um]: Fov in the piezo plane (i.e. piezo range). Max 100 um - cenx(float) [mm]: center position in x. - ceny(float) [mm]: center position in y. + cenx(float) [um]: center position in x. + ceny(float) [um]: center position in y. exp_time(float) [s]: exposure time step(float) [um]: stepsize zshift(float) [um]: shift in z diff --git a/csaxs_bec/scans/omny_fermat_scan.py b/csaxs_bec/scans/omny_fermat_scan.py index b6521d2..924e20e 100644 --- a/csaxs_bec/scans/omny_fermat_scan.py +++ b/csaxs_bec/scans/omny_fermat_scan.py @@ -162,31 +162,8 @@ class OMNYFermatScan(SyncFlyScanBase): wait_type="move", device=["rtx", "rtz"], wait_group="prepare_setup_part2" ) yield from self._transfer_positions_to_omny() - yield from self.omny_osamx_to_scan_center() + yield from self.stubs.send_rpc_and_wait("osamx","omny_osamx_to_scan_center",self.cenx) - def omny_osamx_to_scan_center(self): - # get last setpoint - osamx_current_setpoint = yield from self.stubs.send_rpc_and_wait( - "osamx", "user_setpoint.get" - ) - omny_samx_in = self._get_user_param_safe("osamx","in") - if np.fabs(osamx_current_setpoint-(omny_samx_in+self.cenx/1000)) > 0.025: - logger.info("Moving osamx to scan center") - self.device_manager.devices["osamx"].read_only = False -# yield from self.stubs.send_rpc_and_wait("osamx", "controller.socket_put_confirmed('axspeed[0]=1000')") - yield from self.stubs.set(device="osamx", value=omny_samx_in+self.cenx/1000, wait_group="osamx_mv") - yield from self.stubs.wait(wait_type="move", device="osamx", wait_group="osamx_mv") - self.device_manager.devices["osamx"].read_only = True - time.sleep(4) - yield from self.stubs.send_rpc_and_wait("rtx", "controller.laser_tracker_on") - yield from self.stubs.send_rpc_and_wait("rtx", "controller.laser_tracker_check_and_wait_for_signalstrength") - - def _get_user_param_safe(self, device, var): - param = self.device_manager.devices[device].user_parameter - if not param or param.get(var) is None: - raise ValueError(f"Device {device} has no user parameter definition for {var}.") - return param.get(var) - def omny_rotation(self, angle): # get last setpoint (cannot be based on pos get because they will deviate slightly) osamroy_current_setpoint = yield from self.stubs.send_rpc_and_wait(