From bfe84c4eff1b657acfc2e9bb68fbfce70c9c8c4d Mon Sep 17 00:00:00 2001 From: x01dc Date: Tue, 18 Nov 2025 16:43:19 +0100 Subject: [PATCH] init function first version, untested --- .../plugins/cSAXS/initialize_stages.py | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 csaxs_bec/bec_ipython_client/plugins/cSAXS/initialize_stages.py diff --git a/csaxs_bec/bec_ipython_client/plugins/cSAXS/initialize_stages.py b/csaxs_bec/bec_ipython_client/plugins/cSAXS/initialize_stages.py new file mode 100644 index 0000000..d6dcc6c --- /dev/null +++ b/csaxs_bec/bec_ipython_client/plugins/cSAXS/initialize_stages.py @@ -0,0 +1,114 @@ +import builtins +import time +from pathlib import Path + +from bec_lib import bec_logger + +# Logger initialization +logger = bec_logger.logger + +if builtins.__dict__.get("bec") is not None: + bec = builtins.__dict__.get("bec") + dev = builtins.__dict__.get("dev") + umv = builtins.__dict__.get("umv") + umvr = builtins.__dict__.get("umvr") + +class cSAXSInitError(Exception): + pass + +class cSAXSError(Exception): + pass + +class cSAXSInitStagesMixin: + # Class-level mappings for axes and devices + AXIS_MAP = {c: i for i, c in enumerate("ABCDEFGHIJKLMNOPQRSTUVWXYZ")} + + devices = { + "xbpm3x": "A", + "xbpm3y": "B", + "sl3trxi": "C", + "sl3trxo": "D", + "sl3trxb": "E", + "sl3trxt": "F", + "fast_shutter_n1_x": "H", + "fast_shutter_o1_x": "G", + "fast_shutter_o2_x": "F", + "filter_array_1_x": "B", + "filter_array_2_x": "C", + "filter_array_3_x": "D", + "filter_array_4_x": "E", + "sl4trxi": "G", + "sl4trxo": "H", + "sl4trxb": "I", + "sl4trxt": "A", + "sl5trxi": "C", + "sl5trxo": "D", + "sl5trxb": "E", + "sl5trxt": "F", + "xbimtrx": "A", + "xbimtry": "B", + } + + def __init__(self): + """ + Initializes the class. No need to pass 'dev' since it's globally available. + """ + pass # No need for 'dev' parameter anymore + + def _cSAXS_smaract_stages_init(self): + """ + Initialize all Smaract stages by setting speed, finding the reference mark, and sleeping. + """ + for dev_name, axis_letter in self.devices.items(): + ch = self.AXIS_MAP[axis_letter] # Get the channel number for the axis + d = getattr(dev, dev_name) # Access the device instance using `getattr` + + try: + # Set the speed (this is an example, adjust as needed) + print(f"Setting speed for {dev_name} (axis {ch})...") + d.controller.set_closed_loop_move_speed(ch, 1) # Example speed value (1) + + # Find the reference mark for the axis + print(f"Finding reference mark for {dev_name} (axis {ch})...") + d.controller.find_reference_mark(ch, 0, 1000, 1) # Example reference find parameters + + # Sleep after the operation + print(f"Sleeping for 0.1s after initializing {dev_name} (axis {ch})...") + time.sleep(0.1) + + except AttributeError: + print(f"Device {dev_name} does not have a controller or method to initialize.") + except Exception as e: + print(f"Error initializing device {dev_name} (axis {ch}): {e}") + + def _cSAXS_smaract_stages_check_all_referenced(self): + """ + Check if all axes of the devices are referenced. + """ + for dev_name, axis_letter in self.devices.items(): + ch = self.AXIS_MAP[axis_letter] # Get the channel number for the axis + d = getattr(dev, dev_name) # Access the device instance using `getattr` + + try: + # Check if the axis is referenced on the device controller + if not d.controller.axis_is_referenced(ch): + print(f"Device {dev_name} (axis {ch}) is NOT referenced.") + else: + print(f"Device {dev_name} (axis {ch}) is referenced.") + + except AttributeError: + print(f"Device {dev_name} does not have a controller or axis_is_referenced method.") + except Exception as e: + print(f"Error checking device {dev_name} (axis {ch}): {e}") + +# Usage example: + +# Assuming `dev` is a globally available device manager containing all the device instances +# Create an instance of the mixin class +#cSAXS_init = cSAXSInitStagesMixin() + +# To initialize all stages: +#cSAXS_init._cSAXS_smaract_stages_init() + +# To check if all axes are referenced: +#cSAXS_init._cSAXS_smaract_stages_check_all_referenced()