Motor Positions¶
Haven is able to save the positions of one of more motors in a database; the saved positions can then be recalled later. The following functions are related to motor positions:
save_motor_position()
list_motor_positions()
recall_motor_position()
Saving a Motor Position¶
To save the position of one or more motors, call
save_motor_position()
with the motors
to be saved as arguments. These arguments can either be the name of a
previously instantiated ophyd.Device
object, or the
Device
itself. A keyword-only name argument is
also necessary, which should be a short, human-readable description of
the motor position.
import haven
# An example of using the motor names to save the position
uid = haven.save_motor_position("Aerotech_vert", "Aerotech_horiz", name="CuO A")
import ophyd
import haven
# An example of using the ophyd Devices to save the position
aerotech_vert = ophyd.EpicsMotor("25idd:m1")
aerotech_horiz = ophyd.EpicsMotor("25idd:m2")
uid = haven.save_motor_position(aerotech_vert, aerotech_horiz, name="CuO A")
save_motor_position()
returns the
database ID of the document that was created. This ID is the best
way to retrieve a motor position from the database later, though it
can be also be retrieved using the name argument provided it is
unique.
Saving All Motor Positions¶
It may be convenient to save all motor positions to the database as a
sort of checkpoint before performing some non-routine operation. This
can be done with the following line. Future work will provide a
shorted version. Remember to call
load_instrument()
first.
haven.save_motor_position(*haven.registry.findall(label="motors"), name="checkpoint before replacing monochromator")
Viewing Saved Motor Positions¶
The function list_motor_positions()
will print out a list of all the saved motor positions. This list also
contains the database ID for each position, in case that information
was not retained when saving the motor position originally.
Recalling a Saved Motor Position¶
The beamline can be set back a previously saved motor position using
the haven.motor_position.recall_motor_position()
function. This function is a bluesky-style plan, and so the plan
must be passed to a RunEngine to be effective.
The saved motor position can be retrieved using either the ID generated when the position was saved (the uid argument), or by the name argument that was chosen when the position was saved. If the *name* is not unique, no guarantee is made regarding which motor position is restored.
import haven
RE = haven.RunEngine()
# Save the motor position
uid = haven.save_motor_position("Aerotech_vert", name="start position")
# Restore the motor position
plan = haven.recall_motor_position(uid=uid)
RE(plan)
The MotorPosition Data Model¶
haven.motor_position.MotorPosition
is a pydantic model
that represents a set of motor positions in the database. Any
attribute that has a type definition (e.g. offset: float = None
)
is a data attribute and can be saved to the database.
To add a new database value, add the appropriate attribute to the
pydantic model, and modify the
save()
and
load()
methods to
accomodate the new database value.