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 ebcf739..1b71893 100644 --- a/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py +++ b/csaxs_bec/bec_ipython_client/plugins/omny/omny_rt.py @@ -162,104 +162,106 @@ class OMNY_rt_client: def _omny_interferometer_openloop_steps(self, channel, steps, amplitude): - if channel not in range(3,5): - raise OMNY_rt_clientError(f"invalid channel number {channel}.") + dev.rtx.controller._omny_interferometer_openloop_steps(channel, steps, amplitude) - if amplitude > 4090: - amplitude = 4090 - elif amplitude < 10: - amplitude = 10 + # if channel not in range(3,5): + # raise OMNY_rt_clientError(f"invalid channel number {channel}.") - dev.oshield.controller.move_open_loop_steps( - channel, steps, amplitude=amplitude, frequency=500 - ) - time.sleep(0.01) - while dev.oshield.controller.is_axis_moving(channel): - time.sleep(0.002) + # if amplitude > 4090: + # amplitude = 4090 + # elif amplitude < 10: + # amplitude = 10 + + # dev.oshield.controller.move_open_loop_steps( + # channel, steps, amplitude=amplitude, frequency=500 + # ) + # time.sleep(0.01) + # while dev.oshield.controller.is_axis_moving(channel): + # time.sleep(0.002) - def _omny_interferometer_optimize(self, mirror_channel, channel): - if mirror_channel == -1: - raise OMNY_rt_clientError("no mirror channel selected") - #mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror - if channel == 3: - steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"] - steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"] - opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"] - opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"] - elif channel == 4: - steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"] - steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"] - opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"] - opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"] - else: - raise OMNY_rt_clientError(f"invalid channel number {channel}.") + # def _omny_interferometer_optimize(self, mirror_channel, channel): + # if mirror_channel == -1: + # raise OMNY_rt_clientError("no mirror channel selected") + # #mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror + # if channel == 3: + # steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"] + # steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"] + # opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"] + # opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"] + # elif channel == 4: + # steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"] + # steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"] + # opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"] + # opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"] + # else: + # raise OMNY_rt_clientError(f"invalid channel number {channel}.") - previous_signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) + # previous_signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) - min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"] - if previous_signal < min_begin: - #raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.") - print(f"\rMinimum signal for auto alignment {min_begin} not reached.") - return - elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]: - print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.") - return - else: - direction = 1 - cycle_counter=0 - cycle_max=20 - reversal_counter=0 - reversal_max=4 - self.mirror_amplitutde_increase=0 + # min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"] + # if previous_signal < min_begin: + # #raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.") + # print(f"\rMinimum signal for auto alignment {min_begin} not reached.") + # return + # elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]: + # print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.") + # return + # else: + # direction = 1 + # cycle_counter=0 + # cycle_max=20 + # reversal_counter=0 + # reversal_max=4 + # self.mirror_amplitutde_increase=0 - current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) - max=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"]) + # max=current_sample - while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter0: - self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos) - verbose_str = f"channel {channel}, steps {steps_pos}" - else: - self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg) - verbose_str = f"auto action {channel}, steps {-steps_pos}" - #print(f"Aligning axis ") #{self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") + # if direction>0: + # self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos) + # verbose_str = f"channel {channel}, steps {steps_pos}" + # else: + # self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg) + # verbose_str = f"auto action {channel}, steps {-steps_pos}" + # #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"]) + # current_sample = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) - opt_mirrorname = self.mirror_parameters[self.mirror_channel]["opt_mirrorname"] + # opt_mirrorname = self.mirror_parameters[self.mirror_channel]["opt_mirrorname"] - info_str = f"\rAuto aligning Channel {self.mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}" - filling = " " * (50-len(info_str)) - # Calculate the number of filled and unfilled segments - length = 30 - percentage = current_sample / max - filled_length = int(length * percentage) - unfilled_length = length - filled_length - bar = '#' * filled_length + '-' * unfilled_length - print(info_str + filling + " " + bar + f" {max:.0f} "+verbose_str+" (q)uit \r", end='') + # info_str = f"\rAuto aligning Channel {self.mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}" + # filling = " " * (50-len(info_str)) + # # Calculate the number of filled and unfilled segments + # length = 30 + # percentage = current_sample / max + # filled_length = int(length * percentage) + # unfilled_length = length - filled_length + # bar = '#' * filled_length + '-' * unfilled_length + # print(info_str + filling + " " + bar + f" {max:.0f} "+verbose_str+" (q)uit \r", end='') - if previous_signal>current_sample: - if direction<0: - steps_pos=int(steps_pos/2) - steps_neg=int(steps_neg/2) - if steps_pos<1: - steps_pos=1 - if steps_neg<1: - steps_neg=1 - direction=direction*(-1) - reversal_counter+=1 - previous_signal=current_sample - cycle_counter+=1 + # if previous_signal>current_sample: + # if direction<0: + # steps_pos=int(steps_pos/2) + # steps_neg=int(steps_neg/2) + # if steps_pos<1: + # steps_pos=1 + # if steps_neg<1: + # steps_neg=1 + # direction=direction*(-1) + # reversal_counter+=1 + # previous_signal=current_sample + # cycle_counter+=1 - print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") + # print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") - def omny_tweak_interferometer(self): + def interferometer_tweaking(self): self._tweak_interferometer() def _tweak_interferometer(self): @@ -321,6 +323,8 @@ class OMNY_rt_client: autostop = self.mirror_parameters[self.mirror_channel]['opt_signal_stop'] averaging_time = self.mirror_parameters[self.mirror_channel]["opt_averaging_time"] print(f"\nSelected mirror channel {self.mirror_channel}: {opt_mirrorname}. Autostop {autostop}. Signal averaging time: {averaging_time}\r") + if int(key) == 6: + dev.rtx.controller.laser_tracker_on() dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel) max=0 printit=True @@ -332,10 +336,10 @@ class OMNY_rt_client: self.mirror_amplitutde_increase-=100 elif key == 'a': if self.mirror_channel != -1: - self._omny_interferometer_optimize(self.mirror_channel, 3) - self._omny_interferometer_optimize(self.mirror_channel, 4) - self._omny_interferometer_optimize(self.mirror_channel, 3) - self._omny_interferometer_optimize(self.mirror_channel, 4) + dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=3) + dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=4) + dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=3) + dev.rtx.controller._omny_interferometer_optimize(mirror_channel = self.mirror_channel, channel=4) if self.mirror_channel != -1 and printit: printit = False signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"]) @@ -408,41 +412,43 @@ class OMNY_rt_client: dev.rtx.controller.laser_tracker_show_all def omny_interferometer_align_tracking(self): - self.mirror_channel=6 - signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"]) + dev.rtx.controller.omny_interferometer_align_tracking() + # self.mirror_channel=6 + # signal = dev.rtx.controller._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"]) - if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]: - print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.") - else: - dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel) - time.sleep(0.1) - self._omny_interferometer_optimize(self.mirror_channel, 3) - self._omny_interferometer_optimize(self.mirror_channel, 4) - self._omny_interferometer_optimize(self.mirror_channel, 3) - self._omny_interferometer_optimize(self.mirror_channel, 4) - dev.rtx.controller._omny_interferometer_switch_alloff() - dev.rtx.controller.show_signal_strength_interferometer() + # if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]: + # print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.") + # else: + # dev.rtx.controller._omny_interferometer_switch_channel(self.mirror_channel) + # time.sleep(0.1) + # self._omny_interferometer_optimize(self.mirror_channel, 3) + # self._omny_interferometer_optimize(self.mirror_channel, 4) + # self._omny_interferometer_optimize(self.mirror_channel, 3) + # self._omny_interferometer_optimize(self.mirror_channel, 4) + # dev.rtx.controller._omny_interferometer_switch_alloff() + # dev.rtx.controller.show_signal_strength_interferometer() - self.mirror_channel=-1 + # self.mirror_channel=-1 def laser_tracker_check_and_wait_for_signalstrength(self): - #first check on target - dev.rtx.controller.laser_tracker_wait_on_target() - signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1) - min_signal = self.OMNYTools._get_user_param_safe("rtx","min_signal") - low_signal = self.OMNYTools._get_user_param_safe("rtx","low_signal") - wait_counter = 0 - while signal < min_signal and wait_counter<10: - print( - f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting..." - ) - wait_counter+=1 - time.sleep(0.4) - self.feedback_get_status_and_ssi() - signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1) + dev.rtx.controller.laser_tracker_check_and_wait_for_signalstrength() + # #first check on target + # dev.rtx.controller.laser_tracker_wait_on_target() + # signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1) + # min_signal = self.OMNYTools._get_user_param_safe("rtx","min_signal") + # low_signal = self.OMNYTools._get_user_param_safe("rtx","low_signal") + # wait_counter = 0 + # while signal < min_signal and wait_counter<10: + # print( + # f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting..." + # ) + # wait_counter+=1 + # time.sleep(0.4) + # self.feedback_get_status_and_ssi() + # signal = dev.rtx.controller._omny_interferometer_get_signalsample("ssi_4",0.1) - if signal < low_signal: - print( - f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m" - ) - self.omny_interferometer_align_tracking() \ No newline at end of file + # if signal < low_signal: + # print( + # f"\x1b[91mThe signal of the tracker {signal} is below the low limit of {low_signal}. Auto readjustment...\x1b[0m" + # ) + # self.omny_interferometer_align_tracking() \ No newline at end of file diff --git a/csaxs_bec/device_configs/omny_config.yaml b/csaxs_bec/device_configs/omny_config.yaml index 42e1f30..3c0b2f7 100644 --- a/csaxs_bec/device_configs/omny_config.yaml +++ b/csaxs_bec/device_configs/omny_config.yaml @@ -70,8 +70,8 @@ rtx: readOnly: false readoutPriority: on_request userParameter: - low_signal: 11000 - min_signal: 10000 + low_signal: 8500 + min_signal: 8000 rty: description: OMNY rt deviceClass: csaxs_bec.devices.omny.rt.rt_omny_ophyd.RtOMNYMotor diff --git a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py index 9c35a0f..b7e09fc 100644 --- a/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py +++ b/csaxs_bec/devices/omny/rt/rt_omny_ophyd.py @@ -37,6 +37,9 @@ logger = bec_logger.logger class RtOMNY_mirror_switchbox_Error(Exception): pass +class RtOMNY_Error(Exception): + pass + class RtOMNYController(Controller): _axes_per_controller = 3 red = "\x1b[91m" @@ -71,6 +74,11 @@ class RtOMNYController(Controller): "laser_tracker_print_intensity_for_otrack_tweaking", "laser_tracker_check_on_target", "laser_tracker_wait_on_target", + "get_mirror_parameters", + "laser_tracker_check_and_wait_for_signalstrength", + "omny_interferometer_align_tracking", + "_omny_interferometer_openloop_steps", + "_omny_interferometer_optimize", ] def __init__( @@ -99,6 +107,137 @@ class RtOMNYController(Controller): self.ssi = {} self._min_scan_buffer_reached = False self.switchbox_socket = socket.socket() + self.mirror_parameters = { + 1: { + "opt_signalchannel": "ssi_5", + "opt_mirrorname": "Inc Angle", + "opt_averaging_time": 0.1, + "opt_steps1_pos": 1, + "opt_steps1_neg": 1, + "opt_steps2_pos": 10, + "opt_steps2_neg": 10, + "opt_signal_stop": 2400, + "opt_signal_min_begin": 1000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 2000, + "opt_amplitude1_neg": 2000, + "opt_amplitude2_pos": 2000, + "opt_amplitude2_neg": 2000, + }, + 2: { + "opt_signalchannel": "ssi_2", + "opt_mirrorname": "Inc ST OSA Y", + "opt_averaging_time": 0.1, + "opt_steps1_pos": 1, + "opt_steps1_neg": 1, + "opt_steps2_pos": 1, + "opt_steps2_neg": 1, + "opt_signal_stop": 5000, + "opt_signal_min_begin": 2000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 2000, + "opt_amplitude1_neg": 2000, + "opt_amplitude2_pos": 2000, + "opt_amplitude2_neg": 2000, + }, + 3: { + "opt_signalchannel": "ssi_1", + "opt_mirrorname": "Inc OSA FZP Y", + "opt_averaging_time": 0.25, + "opt_steps1_pos": 1, + "opt_steps1_neg": 2, + "opt_steps2_pos": 1, + "opt_steps2_neg": 3, + "opt_signal_stop": 7200, + "opt_signal_min_begin": 3000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 2500, + "opt_amplitude1_neg": 2500, + "opt_amplitude2_pos": 2500, + "opt_amplitude2_neg": 2500, + }, + 4: { + "opt_signalchannel": "ssi_2", + "opt_mirrorname": "OSA Y", + "opt_averaging_time": 0.1, + "opt_steps1_pos": 1, + "opt_steps1_neg": 1, + "opt_steps2_pos": 1, + "opt_steps2_neg": 1, + "opt_signal_stop": 5000, + "opt_signal_min_begin": 2000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 3000, + "opt_amplitude1_neg": 3000, + "opt_amplitude2_pos": 3000, + "opt_amplitude2_neg": 3000, + }, + 5: { + "opt_signalchannel": "ssi_1", + "opt_mirrorname": "FZP Y", + "opt_averaging_time": 0.2, + "opt_steps1_pos": 6, + "opt_steps1_neg": 6, + "opt_steps2_pos": 8, + "opt_steps2_neg": 4, + "opt_signal_stop": 8000, + "opt_signal_min_begin": 3000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 3000, + "opt_amplitude1_neg": 3000, + "opt_amplitude2_pos": 3000, + "opt_amplitude2_neg": 3000, + }, + 6: { + "opt_signalchannel": "ssi_4", + "opt_mirrorname": "OSA X", + "opt_averaging_time": 0.2, + "opt_steps1_pos": 2, + "opt_steps1_neg": 1, + "opt_steps2_pos": 1, + "opt_steps2_neg": 1, + "opt_signal_stop": 8850, + "opt_signal_min_begin": 3000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 3000, + "opt_amplitude1_neg": 3000, + "opt_amplitude2_pos": 3700, + "opt_amplitude2_neg": 2500, + }, + 7: { + "opt_signalchannel": "ssi_3", + "opt_mirrorname": "FZP X", + "opt_averaging_time": 0.2, + "opt_steps1_pos": 4, + "opt_steps1_neg": 4, + "opt_steps2_pos": 4, + "opt_steps2_neg": 4, + "opt_signal_stop": 8000, + "opt_signal_min_begin": 4000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 2500, + "opt_amplitude1_neg": 2500, + "opt_amplitude2_pos": 2500, + "opt_amplitude2_neg": 2500, + }, + 8: { + "opt_signalchannel": "ssi_1", + "opt_mirrorname": "OSA Y USING SIGNAL OSA FZP", + "opt_averaging_time": 0.2, + "opt_steps1_pos": 1, + "opt_steps1_neg": 1, + "opt_steps2_pos": 1, + "opt_steps2_neg": 1, + "opt_signal_stop": 5000, + "opt_signal_min_begin": 2000, + "opt_step_divider": 1, + "opt_amplitude1_pos": 3000, + "opt_amplitude1_neg": 3000, + "opt_amplitude2_pos": 3000, + "opt_amplitude2_neg": 3000, + } + } + self.mirror_channel = -1 # def is_axis_moving(self, axis_Id) -> bool: # # this checks that axis is on target @@ -124,6 +263,151 @@ class RtOMNYController(Controller): threading.Thread(target=send_positions, args=(self, positions), daemon=True).start() + def get_mirror_parameters(self, mirror_number): + return self.mirror_parameters[mirror_number] + + + def laser_tracker_check_and_wait_for_signalstrength(self): + print("Checking laser tracker...") + if not self.laser_tracker_check_enabled(): + print("laser_tracker_check_and_wait_for_signalstrength: The laser tracker is not even enabled.") + return + #first check on target + self.laser_tracker_wait_on_target() + #when on target, check interferometer signal + signal = self._omny_interferometer_get_signalsample("ssi_4",0.1) + rtx = self.get_device_manager().devices.rtx + min_signal = rtx.user_parameter.get("min_signal") + low_signal = rtx.user_parameter.get("low_signal") + wait_counter = 0 + while signal < min_signal and wait_counter<10: + self.get_device_manager().connector.send_client_info(f"The signal of the tracker {signal} is below the minimum required signal of {min_signal}. Waiting...", scope="laser_tracker_check_and_wait_for_signalstrength", show_asap=True) + + wait_counter+=1 + time.sleep(0.2) + signal = self._omny_interferometer_get_signalsample("ssi_4",0.1) + + 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.") + + def omny_interferometer_align_tracking(self): + self.mirror_channel=6 + signal = self._omny_interferometer_get_signalsample(self.mirror_parameters[self.mirror_channel]["opt_signalchannel"], self.mirror_parameters[self.mirror_channel]["opt_averaging_time"]) + + if signal > self.mirror_parameters[self.mirror_channel]["opt_signal_stop"]: + print(f"Interferometer signal of axis {self.mirror_parameters[self.mirror_channel]['opt_mirrorname']} is good, no alignment needed.") + else: + self._omny_interferometer_switch_channel(self.mirror_channel) + time.sleep(0.1) + self._omny_interferometer_optimize(self.mirror_channel, 3) + self._omny_interferometer_optimize(self.mirror_channel, 4) + self._omny_interferometer_optimize(self.mirror_channel, 3) + self._omny_interferometer_optimize(self.mirror_channel, 4) + self._omny_interferometer_switch_alloff() + self.show_signal_strength_interferometer() + + self.mirror_channel=-1 + + def _omny_interferometer_openloop_steps(self, channel, steps, amplitude): + if channel not in range(3,5): + raise RtOMNY_Error(f"invalid channel number {channel}.") + + if amplitude > 4090: + amplitude = 4090 + elif amplitude < 10: + amplitude = 10 + + oshield = self.get_device_manager().devices.oshield + + oshield.obj.controller.move_open_loop_steps( + channel, steps, amplitude=amplitude, frequency=500 + ) + time.sleep(0.01) + while oshield.obj.controller.is_axis_moving(channel): + time.sleep(0.002) + + def _omny_interferometer_optimize(self, mirror_channel, channel): + if mirror_channel == -1: + raise RtOMNY_Error("no mirror channel selected") + #mirror channel is mirror number and channel is smaract channel, i.e. axis of the mirror + if channel == 3: + steps_pos = self.mirror_parameters[mirror_channel]["opt_steps1_pos"] + steps_neg = self.mirror_parameters[mirror_channel]["opt_steps1_neg"] + opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude1_pos"] + opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude1_neg"] + elif channel == 4: + steps_pos = self.mirror_parameters[mirror_channel]["opt_steps2_pos"] + steps_neg = self.mirror_parameters[mirror_channel]["opt_steps2_neg"] + opt_amplitude_pos = self.mirror_parameters[mirror_channel]["opt_amplitude2_pos"] + opt_amplitude_neg = self.mirror_parameters[mirror_channel]["opt_amplitude2_neg"] + else: + raise RtOMNY_Error(f"invalid channel number {channel}.") + + previous_signal = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) + + min_begin = self.mirror_parameters[mirror_channel]["opt_signal_min_begin"] + if previous_signal < min_begin: + #raise OMNY_rt_clientError("error1") #(f"Minimum signal of axis {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} to start alignment not present.") + print(f"\rMinimum signal for auto alignment {min_begin} not reached.") + return + elif previous_signal > self.mirror_parameters[mirror_channel]["opt_signal_stop"]: + print(f"\rInterferometer signal of axis is good") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]} is good.") + return + else: + direction = 1 + cycle_counter=0 + cycle_max=20 + reversal_counter=0 + reversal_max=4 + self.mirror_amplitutde_increase=0 + + current_sample = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) + max=current_sample + + while current_sample < self.mirror_parameters[mirror_channel]["opt_signal_stop"] and cycle_counter0: + self._omny_interferometer_openloop_steps(channel, steps_pos, opt_amplitude_pos) + verbose_str = f"channel {channel}, steps {steps_pos}" + else: + self._omny_interferometer_openloop_steps(channel, -steps_neg, opt_amplitude_neg) + verbose_str = f"auto action {channel}, steps {-steps_pos}" + #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 = self._omny_interferometer_get_signalsample(self.mirror_parameters[mirror_channel]["opt_signalchannel"], self.mirror_parameters[mirror_channel]["opt_averaging_time"]) + + opt_mirrorname = self.mirror_parameters[mirror_channel]["opt_mirrorname"] + + info_str = f"\rAuto aligning Channel {mirror_channel}, {opt_mirrorname}, Current signal: {current_sample:.0f}" + message=info_str +" (q)uit \r" + self.get_device_manager().connector.send_client_info(message, scope="_omny_interferometer_optimize", show_asap=True) + + + + if previous_signal>current_sample: + if direction<0: + steps_pos=int(steps_pos/2) + steps_neg=int(steps_neg/2) + if steps_pos<1: + steps_pos=1 + if steps_neg<1: + steps_neg=1 + direction=direction*(-1) + reversal_counter+=1 + previous_signal=current_sample + cycle_counter+=1 + + print(f"\r\nFinished aligning channel {channel} of mirror {mirror_channel}\n\r") # {self.mirror_parameters[mirror_channel]["opt_mirrorname"]}. Target: {self.mirror_parameters[mirror_channel]["opt_signal_stop"]}, current {current_sample}") + + + + + def move_to_zero(self): self.socket_put("pa0,0") self.get_axis_by_name("rtx").user_setpoint.setpoint = 0