From dbae426a87584b6574800e80bd5691592d785f9f Mon Sep 17 00:00:00 2001 From: Holler Mirko Date: Tue, 10 Sep 2024 17:52:24 +0200 Subject: [PATCH] started with implementation of RT omny --- .../bec_ipython_client/plugins/omny/omny.py | 3 + .../plugins/omny/omny_rt.py | 37 ++++---- csaxs_bec/device_configs/omny_config.yaml | 47 ++++++++++ csaxs_bec/devices/omny/rt/rt_omny_ophyd.py | 92 ++++++++++++------- .../devices/smaract/smaract_controller.py | 1 + 5 files changed, 129 insertions(+), 51 deletions(-) diff --git a/csaxs_bec/bec_ipython_client/plugins/omny/omny.py b/csaxs_bec/bec_ipython_client/plugins/omny/omny.py index 5779e05..b9a2fde 100644 --- a/csaxs_bec/bec_ipython_client/plugins/omny/omny.py +++ b/csaxs_bec/bec_ipython_client/plugins/omny/omny.py @@ -16,6 +16,7 @@ from csaxs_bec.bec_ipython_client.plugins.omny.omny_optics_mixin import OMNYOpti from csaxs_bec.bec_ipython_client.plugins.omny.omny_alignment_mixin import OMNYAlignmentMixin from csaxs_bec.bec_ipython_client.plugins.omny.omny_general_tools import OMNYTools from csaxs_bec.bec_ipython_client.plugins.omny.omny_sample_transfer_mixin import OMNYSampleTransferMixin +from csaxs_bec.bec_ipython_client.plugins.omny.omny_rt import OMNY_rt_client #from csaxs_bec.bec_ipython_client.plugins.flomni.x_ray_eye_align import XrayEyeAlign logger = bec_logger.logger @@ -516,6 +517,7 @@ class OMNY( OMNYAlignmentMixin, OMNYOpticsMixin, cSAXSBeamlineChecks, + OMNY_rt_client, ): def __init__(self, client): super().__init__() @@ -539,6 +541,7 @@ class OMNY( self.corr_angle_y_2 = [] self.progress = {} self.OMNYTools = OMNYTools(self.client) + OMNY_rt_client.__init__(self) def start_x_ray_eye_alignment(self): if self.OMNYTools.yesno( diff --git a/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py b/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py index 97ef4cf..ed58cb0 100644 --- a/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py +++ b/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py @@ -18,7 +18,7 @@ class OMNY_rt_client: self.mirror_amplitutde_increase=0 self.mirror_parameters = { 1: { - "opt_signalchannel": 4, + "opt_signalchannel": "ssi_5", "opt_mirrorname": "Inc Angle", "opt_averaging_time": 0.1, "opt_steps1_pos": 1, @@ -34,7 +34,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 2000, }, 2: { - "opt_signalchannel": 1, + "opt_signalchannel": "ssi_2", "opt_mirrorname": "Inc ST OSA Y", "opt_averaging_time": 0.1, "opt_steps1_pos": 1, @@ -50,7 +50,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 2000, }, 3: { - "opt_signalchannel": 0, + "opt_signalchannel": "ssi_1", "opt_mirrorname": "Inc OSA FZP Y", "opt_averaging_time": 0.25, "opt_steps1_pos": 1, @@ -66,7 +66,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 2500, }, 4: { - "opt_signalchannel": 1, + "opt_signalchannel": "ssi_2", "opt_mirrorname": "OSA Y", "opt_averaging_time": 0.1, "opt_steps1_pos": 1, @@ -82,7 +82,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 3000, }, 5: { - "opt_signalchannel": 0, + "opt_signalchannel": "ssi_1", "opt_mirrorname": "FZP Y", "opt_averaging_time": 0.2, "opt_steps1_pos": 6, @@ -98,7 +98,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 3000, }, 6: { - "opt_signalchannel": 3, + "opt_signalchannel": "ssi_4", "opt_mirrorname": "OSA X", "opt_averaging_time": 0.2, "opt_steps1_pos": 2, @@ -114,7 +114,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 2500, }, 7: { - "opt_signalchannel": 2, + "opt_signalchannel": "ssi_3", "opt_mirrorname": "FZP X", "opt_averaging_time": 0.2, "opt_steps1_pos": 4, @@ -130,7 +130,7 @@ class OMNY_rt_client: "opt_amplitude2_neg": 2500, }, 8: { - "opt_signalchannel": 0, + "opt_signalchannel": "ssi_1", "opt_mirrorname": "OSA Y USING SIGNAL OSA FZP", "opt_averaging_time": 0.2, "opt_steps1_pos": 1, @@ -193,11 +193,10 @@ class OMNY_rt_client: if previous_signal < self.mirror_parameters[mirror_channel]["opt_signal_min_begin"]: - raise OMNY_rt_clientError(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.") + raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.") elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]: - print(f"Interferometer signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.") - + print(f"Interferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.") else: direction = 1 cycle_counter=0 @@ -210,13 +209,13 @@ class OMNY_rt_client: while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter0: self._omny_interferometer_openloop_steps(channel, steps_pos, self.mirror_parameters[mirror_channel]["opt_amplitude_pos"]) else: self._omny_interferometer_openloop_steps(channel, steps_neg, self.mirror_parameters[mirror_channel]["opt_amplitude_neg"]) - print(f"Aligning axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") + print(f"Aligning axis ") #{self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) if previous_signal>current_sample: @@ -232,7 +231,7 @@ class OMNY_rt_client: previous_signal=current_sample cycle_counter+=1 - print(f"Finished aligning axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") + print(f"Finished aligning axis") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") def omny_tweak_interferometer(self): curses.wrapper(self._tweak_interferometer) @@ -262,19 +261,19 @@ class OMNY_rt_client: if key == curses.KEY_LEFT: if self.mirror_channel != -1: - self._omny_interferometer_openloop_steps(self.mirror_channel, self.mirror_parameters[self.mirror_channel]["opt_steps1_pos"], self.mirror_parameters[self.mirror_channel]["opt_amplitude1_pos"]+self.mirror_amplitutde_increase) + self._omny_interferometer_openloop_steps(3, self.mirror_parameters[self.mirror_channel]["opt_steps1_pos"], self.mirror_parameters[self.mirror_channel]["opt_amplitude1_pos"]+self.mirror_amplitutde_increase) elif key == curses.KEY_RIGHT: if self.mirror_channel != -1: - self._omny_interferometer_openloop_steps(self.mirror_channel, self.mirror_parameters[self.mirror_channel]["opt_steps1_neg"], self.mirror_parameters[self.mirror_channel]["opt_amplitude1_neg"]+self.mirror_amplitutde_increase) + self._omny_interferometer_openloop_steps(3, -self.mirror_parameters[self.mirror_channel]["opt_steps1_neg"], self.mirror_parameters[self.mirror_channel]["opt_amplitude1_neg"]+self.mirror_amplitutde_increase) elif key == curses.KEY_DOWN: if self.mirror_channel != -1: - self._omny_interferometer_openloop_steps(self.mirror_channel, self.mirror_parameters[self.mirror_channel]["opt_steps2_pos"], self.mirror_parameters[self.mirror_channel]["opt_amplitude2_pos"]+self.mirror_amplitutde_increase) + self._omny_interferometer_openloop_steps(4, self.mirror_parameters[self.mirror_channel]["opt_steps2_pos"], self.mirror_parameters[self.mirror_channel]["opt_amplitude2_pos"]+self.mirror_amplitutde_increase) elif key == curses.KEY_UP: if self.mirror_channel != -1: - self._omny_interferometer_openloop_steps(self.mirror_channel, self.mirror_parameters[self.mirror_channel]["opt_steps2_neg"], self.mirror_parameters[self.mirror_channel]["opt_amplitude2_neg"]+self.mirror_amplitutde_increase) + self._omny_interferometer_openloop_steps(4, -self.mirror_parameters[self.mirror_channel]["opt_steps2_neg"], self.mirror_parameters[self.mirror_channel]["opt_amplitude2_neg"]+self.mirror_amplitutde_increase) elif key == ord('1'): self.mirror_channel = 1 @@ -312,7 +311,7 @@ class OMNY_rt_client: time.sleep(0.01) - print(f"Channel {self.mirror_channel} - {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} - Autostop {self.mirror_parameters[self.mirror_channel]['opt_signal_stop']} - Signal {signal}") + #print(f"Channel {self.mirror_channel} - {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} - Autostop {self.mirror_parameters[self.mirror_channel]['opt_signal_stop']} - Signal {signal}") dev.rtx.controller._omny_interferometer_switch_alloff() self.mirror_channel = -1 diff --git a/csaxs_bec/device_configs/omny_config.yaml b/csaxs_bec/device_configs/omny_config.yaml index b275569..aed593c 100644 --- a/csaxs_bec/device_configs/omny_config.yaml +++ b/csaxs_bec/device_configs/omny_config.yaml @@ -1,3 +1,50 @@ +############################################################ +#################### flOMNI RT motors ###################### +############################################################ + +rtx: + description: OMNY rt + deviceClass: csaxs_bec.devices.omny.rt.rt_omny_ophyd.RtOMNYMotor + deviceConfig: + axis_Id: A + host: mpc3217.psi.ch + port: 3333 + sign: 1 + enabled: true + onFailure: buffer + readOnly: false + readoutPriority: on_request + userParameter: + low_signal: 11000 + min_signal: 10000 + rt_pid_voltage: -0.06219 +rty: + description: OMNY rt + deviceClass: csaxs_bec.devices.omny.rt.rt_omny_ophyd.RtOMNYMotor + deviceConfig: + axis_Id: B + host: mpc3217.psi.ch + port: 3333 + sign: 1 + enabled: true + onFailure: buffer + readOnly: false + readoutPriority: on_request + userParameter: + tomo_additional_offsety: 0 +rtz: + description: OMNY rt + deviceClass: csaxs_bec.devices.omny.rt.rt_omny_ophyd.RtOMNYMotor + deviceConfig: + axis_Id: C + host: mpc3217.psi.ch + port: 3333 + sign: 1 + enabled: true + onFailure: buffer + readOnly: false + readoutPriority: on_request + ############################################################ ##################### OMNY samples ######################### ############################################################ diff --git a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py index 0278617..bd96793 100644 --- a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py +++ b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py @@ -40,6 +40,7 @@ class RtOMNY_mirror_switchbox_Error(Exception): class RtOMNYController(Controller): _axes_per_controller = 3 USER_ACCESS = [ + "socket_put", "socket_put_and_receive", "set_rotation_angle", "feedback_disable", @@ -57,6 +58,11 @@ class RtOMNYController(Controller): "read_ssi_interferometer", "laser_tracker_check_signalstrength", "laser_tracker_check_enabled", + "_omny_interferometer_switch_open_socket", + "_omny_interferometer_switch_channel", + "_omny_interferometer_switch_LED_on", + "_omny_interferometer_switch_alloff", + "_omny_interferometer_get_signalsample", ] def __init__( @@ -136,11 +142,9 @@ class RtOMNYController(Controller): } - - def feedback_is_running(self) -> bool: self.feedback_get_status_and_ssi() - interferometer_feedback_not_running = int(self.tracker_info["feedback_error"]) + interferometer_feedback_not_running = int(self.ssi["feedback_error"]) if interferometer_feedback_not_running == 1: return False return True @@ -373,18 +377,19 @@ class RtOMNYController(Controller): t = PrettyTable() t.title = f"Interferometer signal strength" t.field_names = ["Axis", "Value"] - for i in range(4): - t.add_row([i, self.read_ssi_interferometer(i)]) + for i in range(1,6): + ssi = self.ssi[f"ssi_{i}"] + t.add_row([i, ssi]) print(t) def _omny_interferometer_switch_open_socket(self): # open a socket connection to the laser interferometer server - host = "mpc2844.psi.ch" # as both code is running on same pc + host = "mpc3217.psi.ch" # as both code is running on same pc port = 3335 # socket server port number self.switchbox_socket.connect((host, port)) # connect to the server - self._omny_interferometer_switch_put_and_receive("?000") + self._omny_interferometer_switch_put_and_receive("?000\r") time.sleep(1) @@ -393,49 +398,72 @@ class RtOMNYController(Controller): self._omny_interferometer_switch_alloff() time.sleep(0.1) if channel == 1: #Relais 1 and 2 - if "|0003\r" != self._omny_interferometer_switch_put_and_receive("\!0020003"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!0020003\r") + #if "|0003\r" != self._omny_interferometer_switch_put_and_receive("!0020003\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 2: #Relais 3 and 4 - if "|000C\r" != self._omny_interferometer_switch_put_and_receive("\!002000C"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!002000C\r") + # if "|000C\r" != self._omny_interferometer_switch_put_and_receive("!002000C\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 3: #Relais 5 and 6 - if "|0030\r" != self._omny_interferometer_switch_put_and_receive("\!0020030"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!0020030\r") + # if "|0030\r" != self._omny_interferometer_switch_put_and_receive("!0020030\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 4: #Relais 7 and 8 - if "|00C0\r" != self._omny_interferometer_switch_put_and_receive("\!00200C0"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!00200C0\r") + # if "|00C0\r" != self._omny_interferometer_switch_put_and_receive("!00200C0\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 5: #Relais 9 and 10 - if "|0300\r" != self._omny_interferometer_switch_put_and_receive("\!0020300"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!0020300\r") + # if "|0300\r" != self._omny_interferometer_switch_put_and_receive("!0020300\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 6: #Relais 11 and 12 - if "|0C00\r" != self._omny_interferometer_switch_put_and_receive("\!0020C00"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!0020C00\r") + # if "|0C00\r" != self._omny_interferometer_switch_put_and_receive("!0020C00\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 7: #Relais 13 and 14 - if "|3000\r" != self._omny_interferometer_switch_put_and_receive("\!0023000"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!0023000\r") + # if "|3000\r" != self._omny_interferometer_switch_put_and_receive("!0023000\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 8: #Relais 7 and 8 SPECIAL CASE use osafzp y signal to align osa y - if "|00C0\r" != self._omny_interferometer_switch_put_and_receive("\!00200C0"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + rback = self._omny_interferometer_switch_put_and_receive("!00200C0\r") + # if "|00C0\r" != self._omny_interferometer_switch_put_and_receive("!00200C0\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") elif channel == 9: #Relais 15 and 16 - if "|C000\r" != self._omny_interferometer_switch_put_and_receive("\!002C000"): - raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") - + rback = self._omny_interferometer_switch_put_and_receive("!002C000\r") + # if "|C000\r" != self._omny_interferometer_switch_put_and_receive("!002C000\r"): + # raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + if "0000" not in rback: + raise RtOMNY_mirror_switchbox_Error("Channel switching failed.") + def _omny_interferometer_switch_put_and_receive(self, command_str: str) -> str: - self.switchbox_socket.send(command_str.encode()) + try: + self.switchbox_socket.send(command_str.encode()) + except: + self._omny_interferometer_switch_open_socket() + time.sleep(0.1) + self.switchbox_socket.send(command_str.encode()) recv = self.switchbox_socket.recv(1024).decode() - print(f"Sent {command_str} to switchbox and received {recv}") + # print("sent") + # print(command_str) + # print("\nreceived") + # print(recv) + # print("") return recv def _omny_interferometer_switch_LED_on(self): - self._omny_interferometer_switch_put_and_receive("\!00S01") + self._omny_interferometer_switch_put_and_receive("!00S01\r") def _omny_interferometer_switch_alloff(self): #switch all off - self._omny_interferometer_switch_put_and_receive("\!0020000") + self._omny_interferometer_switch_put_and_receive("!0020000\r") #LED OFF - self._omny_interferometer_switch_put_and_receive("\!00S00") + time.sleep(0.1) + self._omny_interferometer_switch_put_and_receive("!00S00\r") + time.sleep(0.1) + alloff = self._omny_interferometer_switch_put_and_receive("?002\r") #check all off - if "_0000\r" != self._omny_interferometer_switch_put_and_receive("?002"): + if "00" not in alloff: raise RtOMNY_mirror_switchbox_Error("Not all channels switched off.") def _rt_start_averaging_SSI(self): diff --git a/csaxs_bec/devices/smaract/smaract_controller.py b/csaxs_bec/devices/smaract/smaract_controller.py index f3de0a2..772b678 100644 --- a/csaxs_bec/devices/smaract/smaract_controller.py +++ b/csaxs_bec/devices/smaract/smaract_controller.py @@ -81,6 +81,7 @@ class SmaractController(Controller): "axis_is_referenced", "all_axes_referenced", "set_closed_loop_move_speed", + "is_axis_moving", ] def __init__(