diff --git a/csaxs_bec/devices/epics/falcon_csaxs.py b/csaxs_bec/devices/epics/falcon_csaxs.py index da12e6b..1f5487d 100644 --- a/csaxs_bec/devices/epics/falcon_csaxs.py +++ b/csaxs_bec/devices/epics/falcon_csaxs.py @@ -7,12 +7,15 @@ from typing import Literal from bec_lib.file_utils import get_full_path from bec_lib.logger import bec_logger +from bec_server.scan_server.scans.scan_base import ScanInfo as ScanServerScanInfo from ophyd import Component as Cpt from ophyd_devices import CompareStatus, FileEventSignal from ophyd_devices.devices.areadetector.plugins import HDF5Plugin_V35 as HDF5Plugin from ophyd_devices.devices.dxp import EpicsDXPFalcon, EpicsMCARecord, Falcon from ophyd_devices.interfaces.base_classes.psi_device_base import PSIDeviceBase +from csaxs_bec.devices.utils.utils import fetch_scan_info + logger = bec_logger.logger @@ -75,6 +78,7 @@ class FalconcSAXS(PSIDeviceBase, FalconControl): self._value_pixel_per_buffer = 20 self._queue_size = 2000 self._full_path = "" + self.scan_parameters: ScanServerScanInfo | None = None def on_connected(self): """ @@ -148,18 +152,17 @@ class FalconcSAXS(PSIDeviceBase, FalconControl): This method is called when the detector is staged for acquisition. We use the information in scan_info.msg about the upcoming scan to set all relevant parameters on the detector. """ + # Fetch scan_parameters from scan_info message first + self.scan_parameters = fetch_scan_info(self.scan_info) # Calculate relevant parameters - num_points = self.scan_info.msg.num_points - frames_per_trigger = self.scan_info.msg.scan_parameters.get("frames_per_trigger", 1) + num_points = self.scan_parameters.num_points + frames_per_trigger = self.scan_parameters.frames_per_trigger overall_frames = int(num_points * frames_per_trigger) - exp_time = self.scan_info.msg.scan_parameters["exp_time"] + exp_time = self.scan_parameters.exp_time self._full_path = get_full_path(self.scan_info.msg, self.name) # Check that exposure time is larger than readout time - readout_time = max( - self.scan_info.msg.scan_parameters.get("readout_time", self.MIN_READOUT), - self.MIN_READOUT, - ) + readout_time = max(self.scan_parameters.readout_time, self.MIN_READOUT) if exp_time < readout_time: raise ValueError( f"Exposure time {exp_time} is less than minimum readout time {readout_time}" @@ -219,8 +222,8 @@ class FalconcSAXS(PSIDeviceBase, FalconControl): def on_complete(self) -> None: """Complete detector and backend""" # Calculate relevant parameters - num_points = self.scan_info.msg.num_points - frames_per_trigger = self.scan_info.msg.scan_parameters.get("frames_per_trigger", 1) + num_points = self.scan_parameters.num_points + frames_per_trigger = self.scan_parameters.frames_per_trigger overall_frames = int(num_points * frames_per_trigger) status_detector = CompareStatus(self.dxp.current_pixel, overall_frames, run=True) diff --git a/tests/tests_devices/test_falcon_csaxs.py b/tests/tests_devices/test_falcon_csaxs.py index fb1e100..4069ba6 100644 --- a/tests/tests_devices/test_falcon_csaxs.py +++ b/tests/tests_devices/test_falcon_csaxs.py @@ -19,6 +19,7 @@ from csaxs_bec.devices.epics.falcon_csaxs import ( MappingSource, TriggerSource, ) +from csaxs_bec.devices.utils.utils import fetch_scan_info @pytest.fixture(scope="function") @@ -104,9 +105,9 @@ def test_falcon_on_stage(mock_det: FalconcSAXS): num_points = 10 exp_time = 0.2 frames_per_trigger = 5 - falcon.scan_info.msg.num_points = num_points - falcon.scan_info.msg.scan_parameters["frames_per_trigger"] = frames_per_trigger - falcon.scan_info.msg.scan_parameters["exp_time"] = exp_time + falcon.scan_info.msg.info["num_points"] = num_points + falcon.scan_info.msg.info["frames_per_trigger"] = frames_per_trigger + falcon.scan_info.msg.info["exp_time"] = exp_time falcon.hdf5.array_counter.put(5) # Set to non-zero to check reset # I. Normal case @@ -128,7 +129,7 @@ def test_falcon_on_stage(mock_det: FalconcSAXS): # II. Unstage device first falcon.unstage() exp_time = 1e-3 # Smaller than readout time - falcon.scan_info.msg.scan_parameters["exp_time"] = exp_time + falcon.scan_info.msg.info["exp_time"] = exp_time with pytest.raises(ValueError): falcon.stage() assert falcon.staged is not ophyd.Staged.no @@ -184,8 +185,9 @@ def test_falcon_complete(mock_det: FalconcSAXS): num_points = 10 frames_per_trigger = 5 - falcon.scan_info.msg.num_points = num_points - falcon.scan_info.msg.scan_parameters["frames_per_trigger"] = frames_per_trigger + falcon.scan_info.msg.info["num_points"] = num_points + falcon.scan_info.msg.info["frames_per_trigger"] = frames_per_trigger + falcon.scan_parameters = fetch_scan_info(falcon.scan_info) # I. Test normal case with success falcon.dxp.current_pixel._read_pv.mock_data = num_points * frames_per_trigger - 1