From 6dbe7ef6d7aa4e2328467b31e57c6547f8a7c65c Mon Sep 17 00:00:00 2001 From: x12sa Date: Wed, 17 Jun 2026 14:26:57 +0200 Subject: [PATCH 1/2] Automatic backup triggered by new deployment --- .../simulated_omny/simulated_bl_endstation.yaml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/csaxs_bec/device_configs/simulated_omny/simulated_bl_endstation.yaml b/csaxs_bec/device_configs/simulated_omny/simulated_bl_endstation.yaml index 2ac5201..5deb8c7 100644 --- a/csaxs_bec/device_configs/simulated_omny/simulated_bl_endstation.yaml +++ b/csaxs_bec/device_configs/simulated_omny/simulated_bl_endstation.yaml @@ -18,4 +18,7 @@ fsh: readoutPriority: monitored flomni: - - !include ../ptycho_flomni.yaml \ No newline at end of file + - !include ../ptycho_flomni.yaml + +machine: + - !include ../machine.yml -- 2.52.0 From 134395dadddd70ed838241ee22e663f35b15b5f6 Mon Sep 17 00:00:00 2001 From: x12sa Date: Thu, 18 Jun 2026 23:09:27 +0200 Subject: [PATCH 2/2] Automatic backup triggered by new deployment --- .../plugins/flomni/flomni.py | 88 ++++++++----------- 1 file changed, 36 insertions(+), 52 deletions(-) diff --git a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py index 82b4a96..9d4cd64 100644 --- a/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py +++ b/csaxs_bec/bec_ipython_client/plugins/flomni/flomni.py @@ -9,12 +9,13 @@ import numpy as np from bec_lib import bec_logger from bec_lib.alarm_handler import AlarmBase from bec_lib.pdf_writer import PDFWriter +from bec_lib.scan_repeat import scan_repeat from typeguard import typechecked from csaxs_bec.bec_ipython_client.plugins.cSAXS import cSAXSBeamlineChecks from csaxs_bec.bec_ipython_client.plugins.flomni.flomni_optics_mixin import FlomniOpticsMixin -from csaxs_bec.bec_ipython_client.plugins.flomni.x_ray_eye_align import XrayEyeAlign from csaxs_bec.bec_ipython_client.plugins.flomni.gui_tools import flomniGuiTools +from csaxs_bec.bec_ipython_client.plugins.flomni.x_ray_eye_align import XrayEyeAlign from csaxs_bec.bec_ipython_client.plugins.omny.omny_general_tools import ( OMNYTools, PtychoReconstructor, @@ -786,9 +787,7 @@ class FlomniSampleTransferMixin: dev.ftransy.controller.socket_put_confirmed("confirm=1") else: print("Stopping.") - raise FlomniError( - "User abort sample transfer." - ) + raise FlomniError("User abort sample transfer.") def ftransfer_gripper_is_open(self) -> bool: status = bool(float(dev.ftransy.controller.socket_put_and_receive("MG @OUT[9]").strip())) @@ -811,7 +810,7 @@ class FlomniSampleTransferMixin: def ftransfer_gripper_move(self, position: int): self.check_position_is_valid(position) - #this is not used for sample stage position! + # this is not used for sample stage position! self._ftransfer_shiftx = -0.15 self._ftransfer_shiftz = -0.5 @@ -1314,12 +1313,13 @@ class Flomni( from csaxs_bec.bec_ipython_client.plugins.flomni.flomni_webpage_generator import ( FlomniWebpageGenerator, ) + self._webpage_gen = FlomniWebpageGenerator( bec_client=client, output_dir="~/data/raw/webpage/", - #upload_url="http://s1090968537.online.de/upload.php", # optional + # upload_url="http://s1090968537.online.de/upload.php", # optional upload_url="https://v1p0zyg2w9n2k9c1.myfritz.net/upload.php", - local_port=8080 + local_port=8080, ) self._webpage_gen.start() @@ -1645,7 +1645,7 @@ class Flomni( end_scan_number = bec.queue.next_scan_number for scan_nr in range(start_scan_number, end_scan_number): - #self._write_tomo_scan_number(scan_nr, angle, 0) + # self._write_tomo_scan_number(scan_nr, angle, 0) alignment_scan_numbers.append(scan_nr) umv(dev.fsamroy, 0) @@ -1655,7 +1655,7 @@ class Flomni( # summary of alignment scan numbers scan_list_str = ", ".join(str(s) for s in alignment_scan_numbers) - #print(f"\nAlignment scan numbers ({len(alignment_scan_numbers)} total): {scan_list_str}") + # print(f"\nAlignment scan numbers ({len(alignment_scan_numbers)} total): {scan_list_str}") # BEC scilog entry (no logo) scilog_content = ( @@ -1665,7 +1665,9 @@ class Flomni( f"Alignment scan numbers: {scan_list_str}\n" ) print(scilog_content) - bec.messaging.scilog.new().add_text(scilog_content.replace("\n", "
")).add_tags("alignmentscan").send() + bec.messaging.scilog.new().add_text(scilog_content.replace("\n", "
")).add_tags( + "alignmentscan" + ).send() def write_alignment_scan_numbers(self, first_scan): import os @@ -1691,8 +1693,6 @@ class Flomni( f.write(" ".join(map(str, x_vals)) + "\n") f.write(" ".join(map(str, zeros)) + "\n") - - def sub_tomo_scan(self, subtomo_number, start_angle=None): """ Performs a sub tomogram scan. @@ -1795,41 +1795,27 @@ class Flomni( # finally do the scan at this angle self._tomo_scan_at_angle(angle, subtomo_number) + @scan_repeat(max_repeats=10, default=True) def _tomo_scan_at_angle(self, angle, subtomo_number): - successful = False - error_caught = False + if 0 <= angle < 180.05: self.progress["heartbeat"] = datetime.datetime.now().isoformat() print(f"Starting flOMNI scan for angle {angle} in subtomo {subtomo_number}") self._print_progress() - while not successful: - # self.bl_chk._bl_chk_start() - 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: - raise exc - # if self.bl_chk._bl_chk_stop() and not error_caught: - successful = True - # else: - # self.bl_chk._bl_chk_wait_until_recovered() + 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 + start_scan_number = bec.queue.next_scan_number + for i in range(num_repeats): + self._at_each_angle(angle) + end_scan_number = bec.queue.next_scan_number for scan_nr in range(start_scan_number, end_scan_number): self._write_tomo_scan_number(scan_nr, angle, subtomo_number) @@ -1859,7 +1845,7 @@ class Flomni( or (self.tomo_type == 3 and projection_number == None) ): - #pylint: disable=undefined-variable + # pylint: disable=undefined-variable if bec.active_account != "": self.tomo_id = self.add_sample_database( self.sample_name, @@ -2164,7 +2150,6 @@ class Flomni( self.tomo_reconstruct() - def tomo_parameters(self): """print and update the tomo parameters""" print("Current settings:") @@ -2317,7 +2302,7 @@ class Flomni( f"{'First scan number:':<{padding}}{self.client.queue.next_scan_number:>{padding}}\n", f"{'Last scan number approx.:':<{padding}}{self.client.queue.next_scan_number + int(180 / self.tomo_angle_stepsize * 8) + 10:>{padding}}\n", f"{'Current photon energy:':<{padding}}To be implemented\n", - #f"{'Current photon energy:':<{padding}}{dev.mokev.read()['mokev']['value']:>{padding}.4f}\n", + # f"{'Current photon energy:':<{padding}}{dev.mokev.read()['mokev']['value']:>{padding}.4f}\n", f"{'Exposure time:':<{padding}}{self.tomo_countingtime:>{padding}.2f}\n", f"{'Fermat spiral step size:':<{padding}}{self.tomo_shellstep:>{padding}.2f}\n", f"{'FOV:':<{padding}}{fovxy:>{padding}}\n", @@ -2326,7 +2311,9 @@ class Flomni( f"{'Angular step within sub-tomogram:':<{padding}}{self.tomo_angle_stepsize:>{padding}.2f}\n", ] content = "".join(content) - user_target = os.path.expanduser(f"~/data/raw/documentation/tomo_scan_ID_{self.tomo_id}.pdf") + user_target = os.path.expanduser( + f"~/data/raw/documentation/tomo_scan_ID_{self.tomo_id}.pdf" + ) with PDFWriter(user_target) as file: file.write(header) file.write(content) @@ -2342,7 +2329,6 @@ class Flomni( # self.client.tomo_progress.send_tomo_progress_message("~/data/raw/documentation/tomo_scan_ID_{self.tomo_id}.pdf").send() import csaxs_bec - # Ensure this is a Path object, not a string csaxs_bec_basepath = Path(csaxs_bec.__file__) @@ -2350,14 +2336,12 @@ class Flomni( # Build the absolute path correctly logo_file = ( - csaxs_bec_basepath.parent - / "bec_ipython_client" - / "plugins" - / "flomni" - / logo_file_rel + csaxs_bec_basepath.parent / "bec_ipython_client" / "plugins" / "flomni" / logo_file_rel ).resolve() print(logo_file) - bec.messaging.scilog.new().add_attachment(logo_file, width=200).add_text(content.replace("\n", "
")).add_tags("tomoscan").send() + bec.messaging.scilog.new().add_attachment(logo_file, width=200).add_text( + content.replace("\n", "
") + ).add_tags("tomoscan").send() if __name__ == "__main__": -- 2.52.0