Skip to content

Commit ae7b06f

Browse files
committed
extract flying scan trigger and read logic into common.
1 parent 6df5186 commit ae7b06f

File tree

4 files changed

+89
-11
lines changed

4 files changed

+89
-11
lines changed

src/sm_bluesky/common/plan_stubs/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from .detectors import set_area_detector_acquire_time
1+
from .detection import fly_trigger_and_read, set_area_detector_acquire_time
22
from .motions import (
33
MotorTable,
44
cache_speed,
@@ -20,4 +20,5 @@
2020
"get_velocity_and_step_size",
2121
"cache_speed",
2222
"restore_speed",
23+
"fly_trigger_and_read",
2324
]

src/sm_bluesky/common/plan_stubs/detectors.py renamed to src/sm_bluesky/common/plan_stubs/detection.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
from typing import Any
2+
3+
import bluesky.plan_stubs as bps
14
from blueapi.core import MsgGenerator
25
from bluesky.plan_stubs import abs_set
3-
from bluesky.utils import plan
6+
from bluesky.protocols import Flyable
7+
from bluesky.utils import plan, short_uid
8+
from ophyd_async.core import FlyMotorInfo
49
from ophyd_async.epics.adcore import AreaDetector, SingleTriggerDetector
510

11+
from sm_bluesky.log import LOGGER
12+
613

714
@plan
815
def set_area_detector_acquire_time(
@@ -27,3 +34,19 @@ def set_area_detector_acquire_time(
2734
"""
2835
drv = det.drv if isinstance(det, SingleTriggerDetector) else det.driver
2936
yield from abs_set(drv.acquire_time, acquire_time, wait=wait)
37+
38+
39+
@plan
40+
def fly_trigger_and_read(
41+
motor: Flyable,
42+
fly_info: FlyMotorInfo,
43+
dets: list[Any],
44+
) -> MsgGenerator:
45+
grp = short_uid("kickoff")
46+
yield from bps.kickoff(motor, group=grp, wait=True)
47+
LOGGER.info(f"flying motor = {motor.name} at with info = {fly_info}")
48+
done = yield from bps.complete(motor)
49+
yield from bps.trigger_and_read(dets + [motor])
50+
while not done.done:
51+
yield from bps.trigger_and_read(dets + [motor])
52+
yield from bps.checkpoint()
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from typing import Any
2+
3+
import bluesky.plan_stubs as bps
4+
import bluesky.preprocessors as bpp
5+
from blueapi.core import MsgGenerator
6+
from bluesky.preprocessors import (
7+
finalize_wrapper,
8+
)
9+
from bluesky.protocols import Readable
10+
from bluesky.utils import plan
11+
from dodal.devices.apple2_undulator import EnergySetter
12+
from dodal.plan_stubs.data_session import attach_data_session_metadata_decorator
13+
from ophyd_async.core import FlyMotorInfo
14+
15+
from sm_bluesky.common.plan_stubs import (
16+
cache_speed,
17+
fly_trigger_and_read,
18+
restore_speed,
19+
)
20+
21+
22+
@plan
23+
@attach_data_session_metadata_decorator()
24+
def soft_fly_energy_scan(
25+
energy_device: EnergySetter,
26+
energy_start: float,
27+
energy_end: float,
28+
energy_step: float,
29+
count_time: float,
30+
dets: list[Readable],
31+
md: dict[str, Any] | None = None,
32+
):
33+
old_speeds = yield from cache_speed(
34+
[energy_device.pgm_ref().energy, energy_device.id.gap]
35+
)
36+
37+
fly_info = FlyMotorInfo(
38+
start_position=energy_start,
39+
end_position=energy_end,
40+
time_for_move=abs(energy_end - energy_start) / energy_step * count_time,
41+
)
42+
43+
@bpp.stage_decorator(dets)
44+
@bpp.run_decorator(md=md)
45+
def inn_fly_energy_scan(
46+
energy_device: EnergySetter,
47+
fly_info: FlyMotorInfo,
48+
dets: list[Readable],
49+
) -> MsgGenerator:
50+
yield from bps.prepare(energy_device, fly_info, wait=True)
51+
yield from fly_trigger_and_read(energy_device, fly_info, dets)
52+
53+
yield from finalize_wrapper(
54+
plan=inn_fly_energy_scan(energy_device, fly_info, dets),
55+
final_plan=restore_speed(old_speeds),
56+
)

src/sm_bluesky/common/plans/fast_scan.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@
1414
from ophyd_async.epics.motor import Motor
1515

1616
from sm_bluesky.common.helper import add_extra_names_to_meta
17-
from sm_bluesky.common.plan_stubs import cache_speed, check_within_limit, restore_speed
17+
from sm_bluesky.common.plan_stubs import (
18+
cache_speed,
19+
check_within_limit,
20+
fly_trigger_and_read,
21+
restore_speed,
22+
)
1823
from sm_bluesky.log import LOGGER
1924

2025

@@ -252,14 +257,7 @@ def inner_fast_scan_1d(
252257
time_for_move=abs(start - end) / motor_speed,
253258
)
254259
yield from bps.prepare(motor, fly_info, group=grp, wait=True)
255-
yield from bps.wait(group=grp)
256-
yield from bps.kickoff(motor, group=grp, wait=True)
257-
LOGGER.info(f"flying motor = {motor.name} at speed = {motor_speed}")
258-
done = yield from bps.complete(motor)
259-
yield from bps.trigger_and_read(dets + [motor])
260-
while not done.done:
261-
yield from bps.trigger_and_read(dets + [motor])
262-
yield from bps.checkpoint()
260+
yield from fly_trigger_and_read(motor, fly_info, dets)
263261

264262
yield from finalize_wrapper(
265263
plan=inner_fast_scan_1d(dets, motor, start, end, motor_speed),

0 commit comments

Comments
 (0)