id3c.devices.omega_laser_interlock ================================== .. py:module:: id3c.devices.omega_laser_interlock .. autoapi-nested-parse:: Set up the bidirectional sample_stage.omega <-> laser_optics interlock. This module is specific to the one interlocked pair listed below. Additional interlocks belong in their own ``_interlock.py`` modules with their own ``setup__interlock`` entry points. Run once at startup, after ``make_devices()`` has populated the ophyd registry, e.g.:: from .devices.omega_laser_interlock import setup_omega_laser_interlock setup_omega_laser_interlock(oregistry) Idempotent: safe to call again after re-loading devices. Interlock relationships installed --------------------------------- * ``sample_stage.omega`` is blocked unless ``laser_optics.is_out`` is True. Mid-motion: subscribed to ``laser_optics.us.user_readback`` and ``laser_optics.ds.user_readback``; an excursion that takes the optics out of the OUT window will stop omega and fail the move with :class:`~id3c.devices.interlocked_motor.MotionInterlock`. * ``laser_optics.us`` and ``laser_optics.ds`` are blocked whenever ``sample_stage.omega`` is moving. Mid-motion: subscribed to ``omega.motor_is_moving`` (the .MOVN field), so a laser-axis move in progress will be aborted if an omega motion starts. This is the conservative, position-free choice; angular danger-zone gating is appropriate for an EPICS-IOC interlock, not this Python layer. Either device missing from the registry is logged and skipped; the other side's wiring is still attempted. Attributes ---------- .. autoapisummary:: id3c.devices.omega_laser_interlock.logger Functions --------- .. autoapisummary:: id3c.devices.omega_laser_interlock.setup_omega_laser_interlock Module Contents --------------- .. py:data:: logger .. py:function:: setup_omega_laser_interlock(oregistry) -> None Install laser_optics <-> sample_stage.omega interlocks.