magscope.beadlock
=================

.. py:module:: magscope.beadlock


Classes
-------

.. autoapisummary::

   magscope.beadlock.BeadLockManager


Module Contents
---------------

.. py:class:: BeadLockManager

   Bases: :py:obj:`magscope.processes.ManagerProcessBase`


   Abstract base class for processes in the MagScope

   Subclass requirements:
   * Each subclass should have a unique name.
   * There should only be one instance of each subclass (singleton).
   * The class name is used for consistent inter-process identification.


   .. py:attribute:: xy_lock_on
      :type:  bool
      :value: False



   .. py:attribute:: xy_lock_interval
      :type:  float


   .. py:attribute:: xy_lock_max
      :type:  float


   .. py:attribute:: xy_lock_window
      :type:  int


   .. py:attribute:: _xy_lock_last_time
      :type:  float
      :value: 0.0



   .. py:attribute:: _xy_lock_global_cutoff
      :type:  float
      :value: 0.0



   .. py:attribute:: _xy_lock_bead_cutoff
      :type:  dict[int, float]


   .. py:attribute:: _xy_lock_pending_moves
      :type:  list[int]
      :value: []



   .. py:attribute:: z_lock_on
      :type:  bool
      :value: False



   .. py:attribute:: z_lock_bead
      :type:  int
      :value: 0



   .. py:attribute:: z_lock_target
      :type:  float | None
      :value: None



   .. py:attribute:: z_lock_interval
      :type:  float


   .. py:attribute:: z_lock_max
      :type:  float


   .. py:attribute:: z_lock_window
      :type:  int


   .. py:attribute:: _z_lock_last_time
      :type:  float
      :value: 0.0



   .. py:attribute:: _z_lock_global_cutoff
      :type:  float
      :value: 0.0



   .. py:attribute:: _z_lock_expected_focus_target
      :type:  float | None
      :value: None



   .. py:attribute:: _z_lock_last_focus_target
      :type:  float | None
      :value: None



   .. py:attribute:: _focus_motor_name
      :type:  str | None
      :value: None



   .. py:attribute:: _focus_buffer
      :type:  magscope.datatypes.MatrixBuffer | None
      :value: None



   .. py:method:: setup()


   .. py:method:: do_main_loop()


   .. py:method:: do_xy_lock(now=None)

      Centers the bead-rois based on their tracked position



   .. py:method:: do_z_lock(now=None)


   .. py:method:: _averaged_bead_z(bead_id: int, window: int) -> float | None


   .. py:method:: _latest_focus_state() -> tuple[float, float, bool] | None


   .. py:method:: _advance_z_lock_cutoff(now: float | None = None) -> None


   .. py:method:: _update_z_lock_cutoff_for_external_focus_change(focus_state: tuple[float, float, bool], now: float) -> None


   .. py:method:: _focus_matrix_buffer() -> magscope.datatypes.MatrixBuffer | None


   .. py:method:: _discover_focus_motor_name() -> str | None


   .. py:method:: refresh_bead_rois()


   .. py:method:: remove_bead_from_xy_lock_pending_moves(id: int)


   .. py:method:: remove_beads_from_xy_lock_pending_moves(ids: list[int])


   .. py:method:: set_xy_lock_on(value: bool)


   .. py:method:: set_xy_lock_interval(value: float)


   .. py:method:: set_xy_lock_max(value: float)


   .. py:method:: set_xy_lock_window(value: int)


   .. py:method:: set_z_lock_on(value: bool)


   .. py:method:: set_z_lock_bead(value: int)


   .. py:method:: set_z_lock_target(value: float | None)


   .. py:method:: set_z_lock_interval(value: float)


   .. py:method:: set_z_lock_max(value: float)


   .. py:method:: set_z_lock_window(value: int)


