magscope.zlut_generation
========================

.. py:module:: magscope.zlut_generation


Attributes
----------

.. autoapisummary::

   magscope.zlut_generation.logger


Classes
-------

.. autoapisummary::

   magscope.zlut_generation.GeneratedZLUTResult
   magscope.zlut_generation.ZLUTGenerationManager


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

.. py:data:: logger

.. py:class:: GeneratedZLUTResult

   .. py:attribute:: bead_id
      :type:  int


   .. py:attribute:: zlut_array
      :type:  numpy.ndarray


.. py:class:: ZLUTGenerationManager

   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:: _TRACKING_ACQUISITION_MODES


   .. py:attribute:: _active
      :value: False



   .. py:attribute:: _cancel_requested
      :value: False



   .. py:attribute:: _current_step_index
      :value: 0



   .. py:attribute:: _dataset
      :type:  magscope.datatypes.ZLUTSweepDataset | None
      :value: None



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



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



   .. py:attribute:: _generated_zluts
      :type:  dict[int, GeneratedZLUTResult]


   .. py:attribute:: _last_progress_emit
      :value: 0.0



   .. py:attribute:: _phase
      :value: 'idle'



   .. py:attribute:: _previous_acquisition_on
      :value: False



   .. py:attribute:: _profile_length
      :type:  int | None
      :value: None



   .. py:attribute:: _profiles_per_bead
      :value: 0



   .. py:attribute:: _pending_start_request
      :type:  tuple[float, float, float, int] | None
      :value: None



   .. py:attribute:: _current_step_capture_earliest_timestamp
      :value: 0.0



   .. py:attribute:: _current_step_profiles_written
      :value: 0



   .. py:attribute:: _requested_range
      :type:  tuple[float, float, float] | None
      :value: None



   .. py:attribute:: _selected_bead_id
      :type:  int | None
      :value: None



   .. py:attribute:: _session_bead_roi_ids


   .. py:attribute:: _session_bead_roi_values


   .. py:attribute:: _step_capture_complete
      :value: False



   .. py:attribute:: _steps


   .. py:method:: setup()


   .. py:method:: do_main_loop()


   .. py:method:: quit()

      Shutdown the process (and ask the other processes to quit too).



   .. py:method:: start_generation(start_nm: float, step_nm: float, stop_nm: float, profiles_per_bead: int)


   .. py:method:: cancel_generation()


   .. py:method:: report_profile_length(profile_length: int | None = None)


   .. py:method:: report_focus_motor_limits(z_min: float, z_max: float) -> None


   .. py:method:: handle_capture_complete(step_index: int, written_count: int, written_profiles_per_bead: int, error: str | None = None)


   .. py:method:: select_generated_bead(bead_id: int)


   .. py:method:: save_generated_zlut(filepath: str, bead_id: int, load_after_save: bool = True)


   .. py:method:: cancel_evaluation()


   .. py:method:: _prepare_session(start_nm: float, step_nm: float, stop_nm: float, profiles_per_bead: int) -> None


   .. py:method:: _create_dataset() -> None


   .. py:method:: _issue_move_for_current_step() -> None


   .. py:method:: _advance_when_in_position() -> None


   .. py:method:: _advance_after_capture() -> None


   .. py:method:: _complete_session() -> None


   .. py:method:: _cancel_session() -> None


   .. py:method:: _fail_session(reason: str) -> None


   .. py:method:: _fail_evaluation(reason: str) -> None


   .. py:method:: _fail_startup(exc: Exception) -> None


   .. py:method:: _cleanup_runtime_state(*, destroy_dataset: bool) -> None


   .. py:method:: _reset_dataset(*, destroy: bool) -> None


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


   .. py:method:: _clear_pending_profile_length_request() -> None


   .. py:method:: _bead_id_payload() -> tuple[int, Ellipsis]


   .. py:method:: _bead_roi_payload() -> tuple[tuple[int, int, int, int], Ellipsis]


   .. py:method:: _maybe_send_progress() -> None


   .. py:method:: _send_progress(*, force: bool) -> None


   .. py:method:: _send_state(status: str, *, detail: str | None = None, running: bool = False, can_cancel: bool = False, phase: str = 'idle') -> None


   .. py:method:: _send_evaluation_state(*, active: bool) -> None


   .. py:method:: _build_generated_zluts() -> None


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


   .. py:method:: _validate_sweep_limits(start_nm: float, stop_nm: float, z_min: float, z_max: float) -> None
      :staticmethod:



   .. py:method:: _build_steps(start_nm: float, step_nm: float, stop_nm: float) -> numpy.ndarray
      :staticmethod:



