magscope.videoprocessing

Contents

magscope.videoprocessing#

Attributes#

Classes#

VideoProcessorManager

Abstract base class for processes in the MagScope

VideoWorker

Process objects represent activity that is run in a separate process

Module Contents#

magscope.videoprocessing.ValueTypeUI8[source]#
magscope.videoprocessing.logger[source]#
magscope.videoprocessing._LOOKUP_Z_PROFILE_WARNING = 'lookup_z_profile_size_warning'[source]#
magscope.videoprocessing._DEFAULT_TRACKING_OPTIONS[source]#
class magscope.videoprocessing.VideoProcessorManager[source]#

Bases: 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.

_tasks: multiprocessing.queues.Queue | None = None[source]#
_n_workers: int | None = None[source]#
_workers: list[VideoWorker] = [][source]#
_gpu_lock: multiprocessing.synchronize.Lock[source]#
_profile_length_queue: multiprocessing.queues.Queue | None = None[source]#
_pending_profile_length_request = False[source]#
_warning_queue: multiprocessing.queues.Queue | None = None[source]#
_zlut_capture_complete_queue: multiprocessing.queues.Queue | None = None[source]#
_zlut_capture_earliest_timestamp: float | None = None[source]#
_zlut_capture_motor_z_value: float | None = None[source]#
_zlut_capture_remaining_profiles_per_bead: int | None = None[source]#
_zlut_capture_step_index: int | None = None[source]#
_zlut_frozen_bead_ids[source]#
_zlut_frozen_bead_rois[source]#
_zlut_profile_length_queue: multiprocessing.queues.Queue | None = None[source]#
_pending_zlut_profile_length_request = False[source]#
_lookup_z_warning_reported = False[source]#
_waiting_for_acquisition: bool | None = None[source]#
_save_profiles = False[source]#
_zlut_path: pathlib.Path | None[source]#
_zlut_metadata: dict[str, float | int] | None = None[source]#
_zlut = None[source]#
_tracking_options: dict[source]#
set_settings(settings: magscope.settings.MagScopeSettings)[source]#
update_tracking_options(value: dict)[source]#
setup()[source]#
do_main_loop()[source]#
_try_reserve_processing_stack() bool[source]#
_release_reserved_processing_stack() None[source]#
_stack_coordination_lock()[source]#
quit()[source]#

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

load_zlut_file(filepath: str) None[source]#
_load_default_zlut() None[source]#
unload_zlut() None[source]#
_clear_zlut_state() None[source]#
_set_zlut_from_path(path: pathlib.Path) None[source]#
static _extract_zlut_metadata(zlut_array: numpy.ndarray) dict[str, float | int][source]#
static _to_processing_array(zlut_array: numpy.ndarray)[source]#
_broadcast_zlut_metadata() None[source]#
_notify_zlut_error(path: pathlib.Path, exc: Exception) None[source]#
report_profile_length() None[source]#

Arm a one-shot profile-length report for a future processed frame.

The request intentionally rides along with the normal worker task queue instead of probing the current VideoBuffer contents immediately. This keeps the result tied to video processed after the request arrives and ensures only one worker handles the request at a time via a normal task-local flag.

report_zlut_profile_length(bead_ids: tuple[int, Ellipsis] = (), bead_rois: tuple[tuple[int, int, int, int], Ellipsis] = ()) None[source]#
_process_profile_length_reports() None[source]#

Forward the first successful worker measurement back to the UI.

Workers only enqueue successful measurements, so leaving the pending flag armed causes later normal processing tasks to keep carrying the request until one succeeds.

_process_zlut_profile_length_reports() None[source]#
clear_pending_zlut_profile_length_request() None[source]#
arm_zlut_sweep_capture(step_index: int, motor_z_value: float, remaining_profiles_per_bead: int, earliest_timestamp: float, bead_ids: tuple[int, Ellipsis] = (), bead_rois: tuple[tuple[int, int, int, int], Ellipsis] = ()) None[source]#
disarm_zlut_sweep_capture() None[source]#
_process_zlut_capture_reports() None[source]#
_add_task()[source]#
_set_zlut_frozen_rois(*, bead_ids: tuple[int, Ellipsis], bead_rois: tuple[tuple[int, int, int, int], Ellipsis]) None[source]#
_should_use_frozen_zlut_rois() bool[source]#
_process_worker_warnings() None[source]#
script_wait_until_acquisition_on(value: bool)[source]#
_finish_waiting_when_ready()[source]#
class magscope.videoprocessing.VideoWorker(tasks: multiprocessing.queues.Queue, locks: dict[str, multiprocessing.synchronize.Lock], reserved_stacks: ValueTypeUI32, completed_stacks: ValueTypeUI64, busy_count: ValueTypeUI8, gpu_lock: multiprocessing.Lock, profile_length_queue: multiprocessing.queues.Queue | None, warning_queue: multiprocessing.queues.Queue | None, zlut_capture_complete_queue: multiprocessing.queues.Queue | None, zlut_profile_length_queue: multiprocessing.queues.Queue | None, live_profile_enabled: ValueTypeUI8, live_profile_bead: ValueTypeInt)[source]#

Bases: multiprocessing.Process

Process objects represent activity that is run in a separate process

The class is analogous to threading.Thread

_gpu_lock: multiprocessing.Lock[source]#
_tasks: multiprocessing.queues.Queue[source]#
_locks: dict[str, multiprocessing.synchronize.Lock][source]#
_reserved_stacks: ValueTypeUI32[source]#
_completed_stacks: ValueTypeUI64[source]#
_busy_count: ValueTypeUI8[source]#
_profile_length_queue: multiprocessing.queues.Queue | None[source]#
_warning_queue: multiprocessing.queues.Queue | None[source]#
_zlut_capture_complete_queue: multiprocessing.queues.Queue | None[source]#
_zlut_profile_length_queue: multiprocessing.queues.Queue | None[source]#
_live_profile_enabled[source]#
_live_profile_bead[source]#
_video_buffer: magscope.datatypes.VideoBuffer | None = None[source]#
_tracks_buffer: magscope.datatypes.MatrixBuffer | None = None[source]#
_task_owes_reserved_stack = False[source]#
_zlut_sweep_dataset: magscope.datatypes.ZLUTSweepDataset | None = None[source]#
run()[source]#

Method to be run in sub-process; can be overridden in sub-class

_release_reserved_stack_if_pending() None[source]#
_stack_coordination_lock()[source]#
_report_zlut_capture_task_failure(task: dict | None, exc: Exception) None[source]#
_report_zlut_capture_task_retry(zlut_capture: dict | None) None[source]#
process(kwargs)[source]#
_notify_lookup_profile_warning(warning_records: list[warnings.WarningMessage]) None[source]#
_release_stack()[source]#