From beb02444db96e68a1b7599b506f12ab20d66b091 Mon Sep 17 00:00:00 2001 From: gac-x10da Date: Wed, 18 Jun 2025 10:38:42 +0200 Subject: [PATCH] wip fix direct implementation at the beamline --- .../device_configs/x10da_config_250616.yaml | 4 +- .../x10da_config_falcon_test.yaml | 54 +++++++++++++++++++ superxas_bec/devices/falcon_direct.py | 38 ++++++++++--- 3 files changed, 86 insertions(+), 10 deletions(-) create mode 100644 superxas_bec/device_configs/x10da_config_falcon_test.yaml diff --git a/superxas_bec/device_configs/x10da_config_250616.yaml b/superxas_bec/device_configs/x10da_config_250616.yaml index 2e174b7..5a98254 100644 --- a/superxas_bec/device_configs/x10da_config_250616.yaml +++ b/superxas_bec/device_configs/x10da_config_250616.yaml @@ -146,12 +146,12 @@ cm_yaw: softwareTrigger: false falcon: description: Falcon Sitoro detector - deviceClass: superxas_bec.devices.falcon.FalconSuperXAS + deviceClass: superxas_bec.devices.falcon_direct.FalconSuperXASDirect deviceConfig: prefix: 'X10DA-SITORO:' enabled: true onFailure: raise - readoutPriority: monitored + readoutPriority: async softwareTrigger: false filter_fe: description: Front End Filter diff --git a/superxas_bec/device_configs/x10da_config_falcon_test.yaml b/superxas_bec/device_configs/x10da_config_falcon_test.yaml new file mode 100644 index 0000000..332447f --- /dev/null +++ b/superxas_bec/device_configs/x10da_config_falcon_test.yaml @@ -0,0 +1,54 @@ +falcon: + description: Falcon Sitoro detector + deviceClass: superxas_bec.devices.falcon_direct.FalconSuperXASDirect + deviceConfig: + prefix: 'X10DA-SITORO:' + enabled: true + onFailure: raise + readoutPriority: async + softwareTrigger: false +manip_new_trx: + description: Old Sample Manipulator X-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRX + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_try: + description: Old Sample Manipulator Y-Translation + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRY + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +manip_new_trz: + description: Old Sample Manipulator Z - Along beam + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-ES1-MAN:TRZ + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +mono_energy: + description: Mono Energy + deviceClass: ophyd.EpicsMotor + deviceConfig: + prefix: X10DA-MO12-QEXAFS:E_TEST + enabled: true + onFailure: retry + readoutPriority: baseline + softwareTrigger: false +trigger: + description: Trigger Card + deviceClass: superxas_bec.devices.trigger.Trigger + deviceConfig: + prefix: 'X10DA-ES1:' + enabled: true + onFailure: raise + readoutPriority: baseline + softwareTrigger: true diff --git a/superxas_bec/devices/falcon_direct.py b/superxas_bec/devices/falcon_direct.py index 8f34f8d..ad5c5a1 100644 --- a/superxas_bec/devices/falcon_direct.py +++ b/superxas_bec/devices/falcon_direct.py @@ -5,7 +5,10 @@ from typing import TYPE_CHECKING import numpy as np from bec_lib.devicemanager import ScanInfo +from bec_server.device_server.devices.devicemanager import DeviceManagerDS from bec_lib.logger import bec_logger +from bec_lib.endpoints import MessageEndpoints +from bec_lib.messages import DeviceMessage from ophyd import Component as Cpt from ophyd import Device from ophyd import DynamicDeviceComponent as DDC @@ -149,7 +152,7 @@ class FalconControlDirect(Device): class FalconSuperXASDirect(PSIDeviceBase, FalconControlDirect): """Falcon implementierung at SuperXAS. prefix: 'X10DA-SITORO:'""" - preview = Cpt(PreviewSignal, name="preview", ndim=1, doc="Preview signal for Falcon detector") + preview = Cpt(Signal, name="preview", kind=Kind.omitted, doc="Preview signal for Falcon detector") icr = Cpt( AsyncSignal, name="icr", ndim=0, max_size=int(1e6), doc="Async input count rate signal" ) @@ -178,7 +181,7 @@ class FalconSuperXASDirect(PSIDeviceBase, FalconControlDirect): # Beamline Specific Implementations # ######################################## - def __init__(self, name: str, prefix: str = "", scan_info: ScanInfo | None = None, **kwargs): + def __init__(self, name: str, prefix: str = "", scan_info: ScanInfo | None = None, device_manager:DeviceManagerDS|None = None, **kwargs): """ Initialize Falcon device. @@ -188,7 +191,8 @@ class FalconSuperXASDirect(PSIDeviceBase, FalconControlDirect): scan_info (ScanInfo): Information about the scan **kwargs: Additional keyword arguments """ - super().__init__(name=name, prefix=prefix, scan_info=scan_info, **kwargs) + super().__init__(name=name, prefix=prefix, scan_info=scan_info, device_manager=device_manager,**kwargs) + self.dm = device_manager self._pv_timeout = 1 self._async_read_data = [ "dxp_input_count_rate", @@ -210,12 +214,13 @@ class FalconSuperXASDirect(PSIDeviceBase, FalconControlDirect): Called after the device is connected and its signals are connected. Default values for signals should be set here. """ - self.mca1.spectrum.subscribe(self._update_preview, run=False) + # self.mca1.spectrum.subscribe(self._update_preview, run=False) - def _update_preview(self, old_value, value, **kwargs) -> None: - """Update the preview signal with the latest spectrum data.""" - logger.info(f"Received new spectrum data: {value}") - self.preview.put(value) +#TODO add again once PreviewSIgnal works with GUI + # def _update_preview(self, old_value, value, **kwargs) -> None: + # """Update the preview signal with the latest spectrum data.""" + # logger.info(f"Received new spectrum data: {value}") + # self.preview.put(value) def on_stage(self) -> DeviceStatus | StatusBase | None: """ @@ -289,4 +294,21 @@ class FalconSuperXASDirect(PSIDeviceBase, FalconControlDirect): } } ) + self._send_preview_async() logger.info(f"Data sent for {self.name} at {time.time()- time_started}") + + def _send_preview_async(self)->None: + metadata = self.scan_info.msg.metadata + metadata.update({"async_update": {"type" : "add", "max_shape" : None}}) + data = {self.preview.name : {"value" : self.mca1.spectrum.get(), "timestamp" : time.time()}} + msg = DeviceMessage( + signals=data, metadata=metadata + ) + self.dm.connector.xadd( + MessageEndpoints.device_async_readback( + scan_id=self.scan_info.msg.scan_id, device=self.name + ), + msg_dict={"data": msg}, + max_size=10000, + expire=900, + )