From 906d7dc5ccbf6a2bfb7f33ff4a854df19cbfb3f2 Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Mon, 13 Jul 2026 17:42:39 +0200 Subject: [PATCH 1/4] chore(otf): move pre scan after setup --- xtreme_bec/scans/otf_scan.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xtreme_bec/scans/otf_scan.py b/xtreme_bec/scans/otf_scan.py index 8c7e3ed..b26dbc7 100644 --- a/xtreme_bec/scans/otf_scan.py +++ b/xtreme_bec/scans/otf_scan.py @@ -123,7 +123,6 @@ class OTFScan(ScanBase): devices, e.g. devices that have a short timeout. The pre-scan logic is typically implemented on the device itself. """ - self.actions.pre_scan_all_devices() self.dev.mirror_theta.base_velocity.put(self.default_velocity / 10) self.dev.grating_beta.base_velocity.put(self.default_velocity / 10) @@ -144,6 +143,8 @@ class OTFScan(ScanBase): self.dev.grating_beta.velocity.put(beta_speed) self.mono.sync_with_undulator.put(1) + self.actions.pre_scan_all_devices() + @scan_hook def scan_core(self): """ -- 2.54.0 From 5fddf24901e481c5ff116989145e8b0004dd1630 Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Mon, 13 Jul 2026 17:44:02 +0200 Subject: [PATCH 2/4] feat: adding bespoke pseudo motor to CMU and FMU --- xtreme_bec/device_configs/optics.yaml | 225 +++++++++----------------- xtreme_bec/devices/mirror_pseudo.py | 23 +++ 2 files changed, 103 insertions(+), 145 deletions(-) create mode 100644 xtreme_bec/devices/mirror_pseudo.py diff --git a/xtreme_bec/device_configs/optics.yaml b/xtreme_bec/device_configs/optics.yaml index 03dbe57..9904219 100644 --- a/xtreme_bec/device_configs/optics.yaml +++ b/xtreme_bec/device_configs/optics.yaml @@ -1,65 +1,65 @@ -cmu_rox: - readoutPriority: baseline - description: "Collimating mirror rotation x" - deviceClass: ophyd_devices.EpicsMotor +CMU_y: + description: CMU y pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-CMU:ROX" - onFailure: retry + prefix: X07MA-OP-CMU + override_suffixes: + user_readback: :oy + user_setpoint: :ty.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -cmu_roy: - readoutPriority: baseline - description: "Collimating mirror rotation y" - deviceClass: ophyd_devices.EpicsMotor +CMU_z: + description: CMU z pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-CMU:ROY" - onFailure: retry + prefix: X07MA-OP-CMU + override_suffixes: + user_readback: :oz + user_setpoint: :tz.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -cmu_roz: - readoutPriority: baseline - description: "Collimating mirror rotation z" - deviceClass: ophyd_devices.EpicsMotor +CMU_Rx: + description: CMU Rx pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-CMU:ROZ" - onFailure: retry + prefix: X07MA-OP-CMU + override_suffixes: + user_readback: :oRx + user_setpoint: :tRx.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -cmu_try: - readoutPriority: baseline - description: "Collimating mirror translation y" - deviceClass: ophyd_devices.EpicsMotor +CMU_Ry: + description: CMU Ry pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-CMU:TRY" - onFailure: retry + prefix: X07MA-OP-CMU + override_suffixes: + user_readback: :oRy + user_setpoint: :tRy.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -cmu_trz: - readoutPriority: baseline - description: "Collimating mirror translation z" - deviceClass: ophyd_devices.EpicsMotor +CMU_Rz: + description: CMU Rz pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-CMU:TRZ" - onFailure: retry + prefix: X07MA-OP-CMU + override_suffixes: + user_readback: :oRz + user_setpoint: :tRz.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics @@ -102,68 +102,68 @@ grating_beta: deviceTags: - optics -fmu_rox: - readoutPriority: baseline - description: "Focusing mirror rotation x" - deviceClass: ophyd_devices.EpicsMotor +FMU_y: + description: FMU y pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-FMU:ROX" - onFailure: retry + prefix: X07MA-OP-FMU + override_suffixes: + user_readback: :oy + user_setpoint: :ty.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -fmu_roy: - readoutPriority: baseline - description: "Focusing mirror rotation y" - deviceClass: ophyd_devices.EpicsMotor +FMU_z: + description: FMU z pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-FMU:ROY" - onFailure: retry + prefix: X07MA-OP-FMU + override_suffixes: + user_readback: :oz + user_setpoint: :tz.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -fmu_roz: - readoutPriority: baseline - description: "Focusing mirror rotation z" - deviceClass: ophyd_devices.EpicsMotor +FMU_Rx: + description: FMU Rx pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-FMU:ROZ" - onFailure: retry + prefix: X07MA-OP-FMU + override_suffixes: + user_readback: :oRx + user_setpoint: :tRx.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -fmu_try: - readoutPriority: baseline - description: "Focusing mirror translation y" - deviceClass: ophyd_devices.EpicsMotor +FMU_Ry: + description: FMU Ry pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-FMU:TRY" - onFailure: retry + prefix: X07MA-OP-FMU + override_suffixes: + user_readback: :oRy + user_setpoint: :tRy.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics -fmu_trz: - readoutPriority: baseline - description: "Focusing mirror translation z" - deviceClass: ophyd_devices.EpicsMotor +FMU_Rz: + description: FMU Rz pseudo motor + deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: - prefix: "X07MA-OP-FMU:TRZ" - onFailure: retry + prefix: X07MA-OP-FMU + override_suffixes: + user_readback: :oRz + user_setpoint: :tRz.A enabled: true - readOnly: false - softwareTrigger: false + readoutPriority: baseline deviceTags: - optics @@ -179,68 +179,3 @@ exit_slit: softwareTrigger: false deviceTags: - optics - -rmu_rox: - readoutPriority: baseline - description: "Refocusing mirror rotation x" - deviceClass: ophyd_devices.EpicsMotor - deviceConfig: - prefix: "X07MA-OP-RMU:ROX" - onFailure: retry - enabled: true - readOnly: false - softwareTrigger: false - deviceTags: - - optics - -rmu_roy: - readoutPriority: baseline - description: "Refocusing mirror rotation y" - deviceClass: ophyd_devices.EpicsMotor - deviceConfig: - prefix: "X07MA-OP-RMU:ROY" - onFailure: retry - enabled: true - readOnly: false - softwareTrigger: false - deviceTags: - - optics - -rmu_roz: - readoutPriority: baseline - description: "Refocusing mirror rotation z" - deviceClass: ophyd_devices.EpicsMotor - deviceConfig: - prefix: "X07MA-OP-RMU:ROZ" - onFailure: retry - enabled: true - readOnly: false - softwareTrigger: false - deviceTags: - - optics - -rmu_try: - readoutPriority: baseline - description: "Refocusing mirror translation y" - deviceClass: ophyd_devices.EpicsMotor - deviceConfig: - prefix: "X07MA-OP-RMU:TRY" - onFailure: retry - enabled: true - readOnly: false - softwareTrigger: false - deviceTags: - - optics - -rmu_trz: - readoutPriority: baseline - description: "Refocusing mirror translation z" - deviceClass: ophyd_devices.EpicsMotor - deviceConfig: - prefix: "X07MA-OP-RMU:TRZ" - onFailure: retry - enabled: true - readOnly: false - softwareTrigger: false - deviceTags: - - optics diff --git a/xtreme_bec/devices/mirror_pseudo.py b/xtreme_bec/devices/mirror_pseudo.py new file mode 100644 index 0000000..0e9b3a0 --- /dev/null +++ b/xtreme_bec/devices/mirror_pseudo.py @@ -0,0 +1,23 @@ +from ophyd import Component as Cpt +from ophyd import EpicsSignal +from ophyd_devices.devices.simple_positioner import PSISimplePositionerBase +from ophyd_devices.utils.psi_device_base_utils import TransitionStatus + + +class MirrorPseudo(PSISimplePositionerBase): + user_readback = Cpt(EpicsSignal, "R") + user_setpoint = Cpt(EpicsSignal, "S") + motor_done_move = Cpt(EpicsSignal, ":BUSY") + + def _setup_move(self, position): + """Move and do not wait until motion is complete (asynchronous)""" + + def _done_cb(status, *args, **kwargs): + self._done_moving(success=status.success) + self._move_completion_status = None + + self._move_completion_status = TransitionStatus(self.motor_done_move, transitions=[1, 0]) + self.user_setpoint.put(position, wait=False) + + self.cancel_on_stop(self._move_completion_status) + self._move_completion_status.add_callback(_done_cb) -- 2.54.0 From 1acc61ddb77be7fc9f1af09daf0a1c6e5a525fdd Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Tue, 14 Jul 2026 09:50:23 +0200 Subject: [PATCH 3/4] feat: add PGM ID coupling device configuration --- xtreme_bec/device_configs/optics.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/xtreme_bec/device_configs/optics.yaml b/xtreme_bec/device_configs/optics.yaml index 9904219..132c007 100644 --- a/xtreme_bec/device_configs/optics.yaml +++ b/xtreme_bec/device_configs/optics.yaml @@ -63,6 +63,16 @@ CMU_Rz: deviceTags: - optics +PGM_ID_coupling: + description: "PGM ID coupling" + deviceClass: ophyd_devices.EpicsSignal + deviceConfig: + read_pv: X07MA-PHS-E:OPT + enabled: true + readoutPriority: baseline + deviceTags: + - optics + mono: readoutPriority: baseline description: "PGM Monochromator" -- 2.54.0 From 509ca6a19519168bdd415336175a9bc90dd598aa Mon Sep 17 00:00:00 2001 From: wakonig_k Date: Tue, 14 Jul 2026 16:48:29 +0200 Subject: [PATCH 4/4] fix: normalize device names to lowercase in optics configuration --- xtreme_bec/device_configs/optics.yaml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/xtreme_bec/device_configs/optics.yaml b/xtreme_bec/device_configs/optics.yaml index 132c007..20ef80f 100644 --- a/xtreme_bec/device_configs/optics.yaml +++ b/xtreme_bec/device_configs/optics.yaml @@ -1,4 +1,4 @@ -CMU_y: +cmu_y: description: CMU y pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -11,7 +11,7 @@ CMU_y: deviceTags: - optics -CMU_z: +cmu_z: description: CMU z pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -24,7 +24,7 @@ CMU_z: deviceTags: - optics -CMU_Rx: +cmu_rx: description: CMU Rx pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -37,7 +37,7 @@ CMU_Rx: deviceTags: - optics -CMU_Ry: +cmu_ry: description: CMU Ry pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -50,7 +50,7 @@ CMU_Ry: deviceTags: - optics -CMU_Rz: +cmu_rz: description: CMU Rz pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -63,7 +63,7 @@ CMU_Rz: deviceTags: - optics -PGM_ID_coupling: +pgm_id_coupling: description: "PGM ID coupling" deviceClass: ophyd_devices.EpicsSignal deviceConfig: @@ -112,7 +112,7 @@ grating_beta: deviceTags: - optics -FMU_y: +fmu_y: description: FMU y pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -125,7 +125,7 @@ FMU_y: deviceTags: - optics -FMU_z: +fmu_z: description: FMU z pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -138,7 +138,7 @@ FMU_z: deviceTags: - optics -FMU_Rx: +fmu_rx: description: FMU Rx pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -151,7 +151,7 @@ FMU_Rx: deviceTags: - optics -FMU_Ry: +fmu_ry: description: FMU Ry pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: @@ -164,7 +164,7 @@ FMU_Ry: deviceTags: - optics -FMU_Rz: +fmu_rz: description: FMU Rz pseudo motor deviceClass: xtreme_bec.devices.mirror_pseudo.MirrorPseudo deviceConfig: -- 2.54.0