Source code for sm_bluesky.common.plan_stubs.detection
from typing import Any
import bluesky.plan_stubs as bps
from bluesky.plan_stubs import abs_set
from bluesky.protocols import Flyable
from bluesky.utils import MsgGenerator, plan, short_uid
from dodal.devices.single_trigger_detector import SingleTriggerDetector
from ophyd_async.core import FlyMotorInfo
from ophyd_async.epics.adcore import AreaDetector
from sm_bluesky.log import LOGGER
[docs]
@plan
def set_area_detector_acquire_time(
det: AreaDetector | SingleTriggerDetector, acquire_time: float, wait: bool = True
) -> MsgGenerator:
"""
Set the acquire time on an area detector.
Parameters
----------
det : AreaDetector | SingleTriggerDetector
The detector whose acquire time is to be set.
acquire_time : float
The desired acquire time.
wait : bool, optional
Whether to wait for the operation to complete, by default True.
Returns
-------
MsgGenerator
A Bluesky generator for setting the acquire time.
"""
drv = det.drv if isinstance(det, SingleTriggerDetector) else det.driver
yield from abs_set(drv.acquire_time, acquire_time, wait=wait)
@plan
def fly_trigger_and_read(
motor: Flyable,
fly_info: FlyMotorInfo,
dets: list[Any],
) -> MsgGenerator:
grp = short_uid("kickoff")
yield from bps.kickoff(motor, group=grp, wait=True)
LOGGER.info(f"flying motor = {motor.name} at with info = {fly_info}")
status = yield from bps.complete(motor)
yield from bps.trigger_and_read(dets + [motor])
while not status.done:
yield from bps.trigger_and_read(dets + [motor])
yield from bps.checkpoint()