refactor(falcon): Migrate falcon to ScanServer ScanInfo model
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user