def trigger_and_read(devices, name='primary', group=None): """ Trigger and read a list of detectors and bundle readings into one Event. Parameters ---------- devices : iterable devices to trigger (if they have a trigger method) and then read name : string, optional event stream name, a convenient human-friendly identifier; default name is 'primary' group : string (or any hashable object), optional identifier used by 'trigger' and 'wait' Yields ------ msg : Msg messages to 'trigger', 'wait' and 'read' """ # If devices is empty, don't emit 'create'/'save' messages. if not devices: yield from bps.null() devices = bps.separate_devices(devices) # remove redundant entries rewindable = bps.all_safe_rewind(devices) # if devices can be re-triggered def inner_trigger_and_read(): nonlocal group if group is None: group = short_uid('trigger') no_wait = True for obj in devices: if hasattr(obj, 'trigger'): no_wait = False yield from bps.trigger(obj, group=group) # Skip 'wait' if none of the devices implemented a trigger method. if not no_wait: yield from bps.wait(group=group) yield from bps.create(name) ret = {} # collect and return readings to give plan access to them for obj in devices: reading = (yield from bps.read(obj)) if reading is not None: ret.update(reading) yield from bps.save() return ret from bluesky.preprocessors import rewindable_wrapper return (yield from rewindable_wrapper(inner_trigger_and_read(), rewindable))
def test_nonrewindable_finalizer(RE, hw, start_state, msg_seq): class FakeSig: def get(self): return False det = hw.det det.rewindable = FakeSig() RE.rewindable = start_state m_col = MsgCollector() RE.msg_hook = m_col def evil_plan(): assert RE.rewindable is False yield Msg('aardvark') with pytest.raises(KeyError): RE(rewindable_wrapper(evil_plan(), False)) assert RE.rewindable is start_state assert [m.command for m in m_col.msgs] == msg_seq
def shuttergenerator(shutter, value): return (yield from bpp.rewindable_wrapper(bps.mv(shutter, value), False))