Not so simple customization

Plans can be a mixture of “stubs” (simple plans) and pre-assembled plans.

The following plan executes 3 events in 2 runs (aka scans).

#!/usr/bin/env python3
"""
ipython3 --matplotlib=qt5 planEventsRuns.py

multi_runs_multi_events is a plan grouping 3 events into 2 runs
(runs have a unique ScanId, correspond to scans
"""
from bluesky.plans import scan
import blueskyDESY
from bluesky import RunEngine
from bluesky.callbacks.best_effort import BestEffortCallback
import bluesky.plan_stubs as bps

def one_run_multi_events(detectors, num):
    yield from bps.open_run()

    for i in range(num):
        yield from bps.trigger_and_read(detectors)

    yield from bps.close_run()

def multi_runs_multi_events(detectors, num, num_runs):
    for i in range(num_runs):
        yield from one_run_multi_events(detectors, num)
    
def main(): 

    bec = BestEffortCallback()
    AMG = blueskyDESY.getActiveMntGrp()
    print( "testMG.main: AMG %s " % repr( AMG))
    mg = blueskyDESY.Experiment( read_attrs = AMG[ 'counters']) 
    eh_mot65 = blueskyDESY.motorTango( name = 'eh_mot65')

    RE = RunEngine()

    #
    # matplotlib and printout
    #
    RE.subscribe( bec)
    RE(multi_runs_multi_events([mg], num = 3, num_runs = 2))

    return

if __name__ == "__main__":
    main()

The following plan demonstrates the usage of preprocessor decorators:

#!/usr/bin/env python3
"""
ipython3 --matplotlib=qt5 customPlan.py
"""
from bluesky.plans import scan
import blueskyDESY
from bluesky import RunEngine
from bluesky.callbacks.best_effort import BestEffortCallback
import bluesky.plan_stubs as bps
import bluesky.preprocessors as bpp

def one_run_one_event(detectors):

    # 'Stage' every device.
    for det in detectors:
        yield from bps.stage(det)

    yield from bps.open_run()
    yield from bps.trigger_and_read(detectors)
    yield from bps.close_run()

    # 'Unstage' every device.
    for det in detectors:
        yield from bps.unstage(det)

def one_run_one_eventPrePro(detectors):

    @bpp.stage_decorator(detectors)
    @bpp.run_decorator()
    def inner():
        yield from bps.trigger_and_read(detectors)

    return (yield from inner())

def main(): 

    bec = BestEffortCallback()
    AMG = blueskyDESY.getActiveMntGrp()
    print( "testMG.main: AMG %s " % repr( AMG))
    mg = blueskyDESY.Experiment( read_attrs = AMG[ 'counters']) 
    eh_mot65 = blueskyDESY.motorTango( name = 'eh_mot65')

    RE = RunEngine()

    #
    # matplotlib and printout
    #
    RE.subscribe( bec)

    print( "without prepro")
    RE( one_run_one_event([mg]))
    print( "with prepro")
    RE( one_run_one_eventPrePro([mg]))

    return

if __name__ == "__main__":
    main()