From d567e49b53a3d2677a1a7fbb7a5d63e475b3e749 Mon Sep 17 00:00:00 2001 From: Holler Mirko Date: Tue, 14 May 2024 12:04:00 +0200 Subject: [PATCH] fixes at beamline --- .../plugins/LamNI/x_ray_eye_align.py | 91 +++++++++++++++---- .../plugins/flomni/flomni.py | 1 + csaxs_bec/devices/rt_lamni/rt_lamni_ophyd.py | 6 +- 3 files changed, 80 insertions(+), 18 deletions(-) diff --git a/csaxs_bec/bec_ipython_client/plugins/LamNI/x_ray_eye_align.py b/csaxs_bec/bec_ipython_client/plugins/LamNI/x_ray_eye_align.py index 2a5ade6..2b39022 100644 --- a/csaxs_bec/bec_ipython_client/plugins/LamNI/x_ray_eye_align.py +++ b/csaxs_bec/bec_ipython_client/plugins/LamNI/x_ray_eye_align.py @@ -586,6 +586,27 @@ class LamNI(LamNIOpticsMixin): def tomo_circfov(self, val: float): self.client.set_global_var("tomo_circfov", val) + @property + def tomo_type(self): + val = self.client.get_global_var("tomo_type") + if val is None: + return 1 + return val + + @tomo_type.setter + def tomo_type(self, val: float): + if val == 1: + # equally spaced tomography with 8 sub tomograms + self.client.set_global_var("tomo_type", val) + # elif val == 2: + # # golden ratio tomography (sorted bunches) + # self.client.set_global_var("tomo_type", val) + # elif val == 3: + # # equally spaced tomography with starting angles shifted by golden ratio + # self.client.set_global_var("tomo_type", val) + else: + raise ValueError("Unknown tomo_type.") + @property def tomo_countingtime(self): val = self.client.get_global_var("tomo_countingtime") @@ -948,25 +969,63 @@ class LamNI(LamNIOpticsMixin): # _tomo_shift_angles (potential global variable) _tomo_shift_angles = 0 angle_end = start_angle + 360 - for angle in np.linspace( + angles = np.linspace( start_angle + _tomo_shift_angles, angle_end, num=int(360 / self.tomo_angle_stepsize) + 1, endpoint=True, - ): - successful = False - error_caught = False - if 0 <= angle < 360.05: - print(f"Starting LamNI scan for angle {angle}") - while not successful: - self._start_beam_check() - if not self.special_angles: - self._current_special_angles = [] - if self._current_special_angles: - next_special_angle = self._current_special_angles[0] - if np.isclose(angle, next_special_angle, atol=0.5): - self._current_special_angles.pop(0) - num_repeats = self.special_angle_repeats + ) + + # reverse even sub-tomograms + if not (subtomo_number % 2): + angles = np.flip(angles) + for angle in angles: + self.progress["subtomo"] = subtomo_number + self.progress["subtomo_projection"] = angles.index(angle) + self.progress["subtomo_total_projections"] = 180 / self.tomo_angle_stepsize + self.progress["projection"] = (subtomo_number - 1) * self.progress[ + "subtomo_total_projections" + ] + self.progress["subtomo_projection"] + self.progress["total_projections"] = 180 / self.tomo_angle_stepsize * 8 + self.progress["angle"] = angle + self._tomo_scan_at_angle(angle, subtomo_number) + + def _print_progress(self): + print("\x1b[95mProgress report:") + print(f"Tomo type: ....................... {self.progress['tomo_type']}") + print(f"Projection: ...................... {self.progress['projection']}") + print(f"Total projections expected ....... {self.progress['total_projections']}") + print(f"Angle: ........................... {self.progress['angle']}") + print(f"Current subtomo: ................. {self.progress['subtomo']}") + print(f"Current projection within subtomo: {self.progress['subtomo_projection']}\x1b[0m") + + def _tomo_scan_at_angle(self, angle, subtomo_number): + successful = False + error_caught = False + if 0 <= angle < 360.05: + print(f"Starting LamNI scan for angle {angle} in subtomo {subtomo_number}") + self._print_progress() + while not successful: + self._start_beam_check() + if not self.special_angles: + self._current_special_angles = [] + if self._current_special_angles: + next_special_angle = self._current_special_angles[0] + if np.isclose(angle, next_special_angle, atol=0.5): + self._current_special_angles.pop(0) + num_repeats = self.special_angle_repeats + else: + num_repeats = 1 + try: + start_scan_number = bec.queue.next_scan_number + for i in range(num_repeats): + self._at_each_angle(angle) + error_caught = False + except AlarmBase as exc: + if exc.alarm_type == "TimeoutError": + bec.queue.request_queue_reset() + time.sleep(2) + error_caught = True else: num_repeats = 1 try: @@ -1006,7 +1065,7 @@ class LamNI(LamNIOpticsMixin): scans = builtins.__dict__.get("scans") self._current_special_angles = self.special_angles.copy() - if subtomo_start == 1 and start_angle is None: + if self.tomo_type == 1 and subtomo_start == 1 and start_angle is None: # pylint: disable=undefined-variable self.tomo_id = self.add_sample_database( self.sample_name, diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index 20d74bb..3b11f13 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -309,6 +309,7 @@ class FlomniInitStagesMixin: else: print("Stopping.") return + dev.rtx.controller.feedback_disable() # positions for optics out and 50 mm distance to sample umv(dev.ftrackz, 4.73, dev.ftracky, 2.5170, dev.foptx, -14.3, dev.fopty, 3.87) diff --git a/csaxs_bec/devices/rt_lamni/rt_lamni_ophyd.py b/csaxs_bec/devices/rt_lamni/rt_lamni_ophyd.py index 902909c..dd7ccd0 100644 --- a/csaxs_bec/devices/rt_lamni/rt_lamni_ophyd.py +++ b/csaxs_bec/devices/rt_lamni/rt_lamni_ophyd.py @@ -458,7 +458,7 @@ class RtLamniReadbackSignal(RtLamniSignalRO): readback_index = 1 else: raise RtLamniError("Currently, only two axes are supported.") - + print(return_table) current_pos = float(return_table[readback_index]) current_pos *= self.parent.sign @@ -558,7 +558,9 @@ class RtLamniMotor(Device, PositionerBase): ): self.axis_Id = axis_Id self.sign = sign - self.controller = RtLamniController(socket=socket_cls(host=host, port=port)) + self.controller = RtLamniController( + socket_cls=socket_cls, socket_host=host, socket_port=port + ) self.controller.set_axis(axis=self, axis_nr=self.axis_Id_numeric) self.device_manager = device_manager self.tolerance = kwargs.pop("tolerance", 0.5)