refactor(falcon): Migrate falcon to ScanServer ScanInfo model
CI for csaxs_bec / test (push) Successful in 1m31s
CI for csaxs_bec / test (pull_request) Successful in 1m32s

This commit is contained in:
2026-06-22 10:48:22 +02:00
committed by wakonig_k
co-authored by wakonig_k
parent 165dbf3c69
commit 7f60c19f7a
2 changed files with 20 additions and 15 deletions
+12 -9
View File
@@ -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)
+8 -6
View File
@@ -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