Source code for apstools.plans.stage_sigs_support

"""
Support for ``stage_sigs``
+++++++++++++++++++++++++++++++++++++++

Often when writing a plan, it is desired to change the staging of one or more
``ophyd.Devices`` by modifying the ``device.stage_sigs`` dictionary(ies), then
reset them to original values after the plan.

.. autosummary::

   ~restorable_stage_sigs
   ~stage_sigs_wrapper

EXAMPLE:

For example, move the motor at 2 units/second and count the scaler for 0.5
seconds during a custom plan.  After the plan, both scaler and motor will have
their original ``.stage_sigs`` dictionaries.

.. code-block:: python
    :linenos:

    @restorable_stage_sigs([scaler, motor])
    def my_plan(start, finish, npts, ct=1, v=1):
        scaler.stage_sigs = dict(preset_time=ct)
        motor.stage_sigs = dict(velocity=v)
        yield from bp.rel_scan([scaler], motor, start, finish, npts)

    RE(my_plan(-1, 1, 11, ct=0.5, v=2))

(new in apstools release 1.6.9)
"""

import logging

from bluesky.utils import make_decorator

logger = logging.getLogger(__name__)


[docs]def stage_sigs_wrapper(user_plan, devices): """ Save stage_sigs from each device and restore after the user_plan. The user_plan is free to modify the stage_sigs of each device without further need to preserve original values. """ def display(preface): for device in devices: logger.debug("%s: %s.stage_sigs: %s", preface, device.name, device.stage_sigs) def _restore(): for device in reversed(devices): device.stage_sigs = original[device].copy() display("AFTER restore") original = {} display("ORIGINAL") for device in devices: original[device] = device.stage_sigs.copy() try: display("BEFORE plan") yield from user_plan display("AFTER plan") finally: _restore()
restorable_stage_sigs = make_decorator(stage_sigs_wrapper) # ----------------------------------------------------------------------------- # :author: Pete R. Jemian # :email: jemian@anl.gov # :copyright: (c) 2017-2024, UChicago Argonne, LLC # # Distributed under the terms of the Argonne National Laboratory Open Source License. # # The full license is in the file LICENSE.txt, distributed with this software. # -----------------------------------------------------------------------------