fix: update protocls for docs in main

This commit is contained in:
appel_c 2024-11-26 11:26:57 +01:00
parent 7c06786605
commit 482e2320b9
2 changed files with 39 additions and 95 deletions

View File

@ -4,15 +4,15 @@ The protocols below can be used as teamplates for functionality to be implemeted
They further facilitate runtime checks on devices and provide a minimum set of properties required for a device to be loadable by BEC.
The protocols are:
- BECDeviceProtocol: Protocol for devices in BEC. All devices must at least implement this protocol.
- BECBaseProtocol: Protocol for devices in BEC. All devices must at least implement this protocol.
- BECSignalProtocol: Protocol for signals.
- BECScanProtocol: Protocol for the scan interface.
- BECDeviceProtocol: Protocol for the scan interface.
- BECMixinProtocol: Protocol for utilities in particular relevant for detector implementations.
- BECPositionerProtocol: Protocol for positioners.
- BECFlyerProtocol: Protocol with for flyers.
Keep in mind, that a device of type flyer should generally also implement the BECScanProtocol that provides the required functionality for scans.
Flyers in addition, also implement the BECFlyerProtocol. Similarly, positioners should also implement the BECScanProtocol and BECPositionerProtocol.
Keep in mind, that a device of type flyer should generally also implement the BECDeviceProtocol that provides the required functionality for scans.
Flyers in addition, also implement the BECFlyerProtocol. Similarly, positioners should also implement the BECDeviceProtocol and BECPositionerProtocol.
"""
@ -25,7 +25,7 @@ from ophyd_devices.utils import bec_scaninfo_mixin
@runtime_checkable
class BECDeviceProtocol(Protocol):
class BECBaseProtocol(Protocol):
"""Protocol for ophyd objects with zero functionality."""
_destroyed: bool
@ -126,11 +126,11 @@ class BECDeviceProtocol(Protocol):
@runtime_checkable
class BECSignalProtocol(Protocol):
class BECSignalProtocol(BECBaseProtocol, Protocol):
"""Protocol for BEC signals with zero functionality.
This protocol adds the specific implementation for a signal.
Please be aware that a signal must also implement BECDeviceProtocol.
Please be aware that a signal must also implement BECBaseProtocol.
Note: Currently the implementation of the protocol is not taking into account the
event_model from ophyd, i.e. _run_sbus
@ -205,7 +205,7 @@ class BECSignalProtocol(Protocol):
@runtime_checkable
class BECScanProtocol(BECDeviceProtocol, Protocol):
class BECDeviceProtocol(BECBaseProtocol, Protocol):
"""Protocol for devices offering an Protocol with all relevant functionality for scans.
In BEC, scans typically follow the order of stage, (pre_scan), trigger, unstage.
@ -263,45 +263,7 @@ class BECScanProtocol(BECDeviceProtocol, Protocol):
@runtime_checkable
class BECMixinProtocol(Protocol):
"""Protocol that offers BEC specific utility functionality for detectors."""
USER_ACCESS: list[str]
"""
List of methods/properties that will be exposed to the client interface in addition
to the the already exposed signals, methods and properties.
"""
scaninfo: bec_scaninfo_mixin
"""
BEC scan info mixin class that provides an transparent Protocol to scan parameter
as provided by BEC. It is recommended to use this Protocol to retrieve scaninfo from Redis.
"""
stopped: bool
"""
Flag to indicate if the device is stopped.
The stop method should set this flag to True, and i.e. stage to set it to False.
"""
filewriter: FileWriter
"""
The file writer mixin main purpose is to unify and centralize the creation of
file paths within BEC. Therefore, we recommend devices to use the same mixin for creation of paths.
"""
def pre_scan(self):
"""Pre-scan method is called from BEC right before executing scancore, thus
right before the start of an acquisition.
It can be used to trigger time critical functions from the device, which
are prone to run into timeouts in case called too early.
"""
@runtime_checkable
class BECPositionerProtocol(Protocol):
class BECPositionerProtocol(BECDeviceProtocol, Protocol):
"""Protocol with functionality specific for positioners in BEC."""
@property
@ -369,20 +331,9 @@ class BECPositionerProtocol(Protocol):
@runtime_checkable
class BECFlyerProtocol(BECScanProtocol, Protocol):
class BECFlyerProtocol(BECDeviceProtocol, Protocol):
"""Protocol with functionality specific for flyers in BEC."""
# def configure(self, d: dict):
# """Configure method of the flyer.
# It is an optional method, but does not need to be implemented by a flyer.
# Instead, stage can be used to prepare time critical operations on the device in preparation of a scan.
# Method to configure the flyer in preparation of a scan.
# Args:
# d (dict): Dictionary with configuration parameters, i.e. key value pairs of signal_name : value
# """
def kickoff(self) -> DeviceStatus:
"""Kickoff method for flyers.
@ -404,40 +355,40 @@ class BECFlyerProtocol(BECScanProtocol, Protocol):
@runtime_checkable
class BECRotationProtocol(Protocol):
"""Protocol which defines functionality for a tomography stage for ophyd devices"""
class BECMixinProtocol(Protocol):
"""Protocol that offers BEC specific utility functionality for detectors."""
allow_mod360: Component
"""Signal to define whether mod360 operations are allowed. """
USER_ACCESS: list[str]
"""
List of methods/properties that will be exposed to the client interface in addition
to the the already exposed signals, methods and properties.
"""
@property
def has_mod360(self) -> bool:
"""Property to check if the motor has mod360 option
scaninfo: bec_scaninfo_mixin
"""
BEC scan info mixin class that provides an transparent Protocol to scan parameter
as provided by BEC. It is recommended to use this Protocol to retrieve scaninfo from Redis.
"""
Returns:
bool: True if mod360 is possible on device, False otherwise
"""
stopped: bool
"""
Flag to indicate if the device is stopped.
The stop method should set this flag to True, and i.e. stage to set it to False.
"""
@property
def has_freerun(self) -> bool:
"""Property to check if the motor has freerun option
filewriter: FileWriter
"""
The file writer mixin main purpose is to unify and centralize the creation of
file paths within BEC. Therefore, we recommend devices to use the same mixin for creation of paths.
"""
Returns:
bool: True if freerun is allowed, False otherwise
"""
def pre_scan(self):
"""Pre-scan method is called from BEC right before executing scancore, thus
right before the start of an acquisition.
@property
def valid_rotation_modes(self) -> list[str]:
"""Method to get the valid rotation modes for the implemented motor.
Returns:
list: List of strings with valid rotation modes
"""
def apply_mod360(self) -> None:
"""Method to apply the modulus 360 operation on the specific device.
Childrens should override this method
It can be used to trigger time critical functions from the device, which
are prone to run into timeouts in case called too early.
"""

View File

@ -16,10 +16,10 @@ from ophyd import Device, Signal
from ophyd.status import wait as status_wait
from ophyd_devices.interfaces.protocols.bec_protocols import (
BECBaseProtocol,
BECDeviceProtocol,
BECFlyerProtocol,
BECPositionerProtocol,
BECScanProtocol,
BECSignalProtocol,
)
from ophyd_devices.sim.sim_camera import SimCamera
@ -157,7 +157,6 @@ def test_monitor_with_sim_init():
def test_signal__init__(signal):
"""Test the BECProtocol class"""
assert isinstance(signal, BECDeviceProtocol)
assert isinstance(signal, BECSignalProtocol)
@ -171,22 +170,17 @@ def test_camera__init__(camera):
"""Test the __init__ method of SimMonitor."""
assert isinstance(camera, SimCamera)
assert isinstance(camera, BECDeviceProtocol)
assert isinstance(camera, BECScanProtocol)
def test_positioner__init__(positioner):
"""Test the __init__ method of SimPositioner."""
assert isinstance(positioner, SimPositioner)
assert isinstance(positioner, BECDeviceProtocol)
assert isinstance(positioner, BECScanProtocol)
assert isinstance(positioner, BECPositionerProtocol)
def test_flyer__init__(flyer):
"""Test the __init__ method of SimFlyer."""
assert isinstance(flyer, SimFlyer)
assert isinstance(flyer, BECDeviceProtocol)
assert isinstance(flyer, BECScanProtocol)
assert isinstance(flyer, BECFlyerProtocol)
@ -194,7 +188,6 @@ def test_init_async_monitor(async_monitor):
"""Test the __init__ method of SimMonitorAsync."""
assert isinstance(async_monitor, SimMonitorAsync)
assert isinstance(async_monitor, BECDeviceProtocol)
assert isinstance(async_monitor, BECScanProtocol)
@pytest.mark.parametrize("center", [-10, 0, 10])