magscope.ui.controls

Contents

magscope.ui.controls#

Classes#

ControlPanelBase

MatplotlibCleanupMixin

ResponsivePlotCanvas

Figure canvas that grows taller when constrained to a narrow panel.

HelpPanel

Clickable panel that links to the MagScope documentation.

ResetPanel

Clickable panel that resets the GUI layout to defaults.

MagScopeSettingsPanel

Allow importing, exporting, and editing MagScope configuration values.

AcquisitionPanel

BeadSelectionPanel

CameraPanel

HistogramPanel

PlotSettingsPanel

AllanDeviationPanel

ProfilePanel

TrackingOptionsPanel

ScriptPanel

StatusPanel

XYLockPanel

ZLockPanel

ZLUTGenerationPanel

ZLUTSweepPreviewWidget

ZLUTGenerationDialog

ZLUTPanel

Functions#

has_tweezepy_support(→ bool)

load_tweezepy_avar(→ tuple[callable | None, str | None])

Module Contents#

class magscope.ui.controls.ControlPanelBase(manager: magscope.ui.ui.UIManager, title: str, collapsed_by_default: bool = False)[source]#

Bases: PyQt6.QtWidgets.QWidget

manager: magscope.ui.ui.UIManager[source]#
groupbox: magscope.ui.widgets.CollapsibleGroupBox[source]#
set_title(text: str) None[source]#
setLayout(layout: PyQt6.QtWidgets.QBoxLayout) None[source]#
layout() PyQt6.QtWidgets.QBoxLayout[source]#
set_highlighted(enabled: bool) None[source]#
class magscope.ui.controls.MatplotlibCleanupMixin[source]#
_init_matplotlib_cleanup() None[source]#
_dispose_matplotlib(*_args: object) None[source]#
closeEvent(event) None[source]#
class magscope.ui.controls.ResponsivePlotCanvas(figure: matplotlib.figure.Figure, *, minimum_height: int = 210, maximum_height: int | None = 235, height_for_width: float = 0.72)[source]#

Bases: matplotlib.backends.backend_qtagg.FigureCanvasQTAgg

Figure canvas that grows taller when constrained to a narrow panel.

_minimum_height = 210[source]#
_maximum_height = 235[source]#
_height_for_width = 0.72[source]#
_preferred_height = 210[source]#
_apply_preferred_height(height: int) None[source]#
_update_preferred_height(width: int) None[source]#
resizeEvent(event)[source]#
sizeHint() PyQt6.QtCore.QSize[source]#
class magscope.ui.controls.HelpPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: PyQt6.QtWidgets.QFrame

Clickable panel that links to the MagScope documentation.

HELP_URL[source]#
manager[source]#
title_label[source]#
description_label[source]#
_is_hovered = False[source]#
mouseReleaseEvent(event)[source]#
enterEvent(event)[source]#
leaveEvent(event)[source]#
_apply_styles()[source]#
class magscope.ui.controls.ResetPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: PyQt6.QtWidgets.QFrame

Clickable panel that resets the GUI layout to defaults.

manager[source]#
title_label[source]#
_is_hovered = False[source]#
mouseReleaseEvent(event)[source]#
enterEvent(event)[source]#
leaveEvent(event)[source]#
_apply_styles()[source]#
class magscope.ui.controls.MagScopeSettingsPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

Allow importing, exporting, and editing MagScope configuration values.

_current_settings[source]#
_setting_inputs: dict[str, magscope.ui.widgets.LabeledLineEditWithValue][source]#
_last_settings_update: datetime.datetime | None = None[source]#
load_button[source]#
save_button[source]#
defaults_button[source]#
apply_button[source]#
status_label[source]#
_notify(text: str) None[source]#
_format_last_updated_text() str[source]#
_show_error(message: str) None[source]#
_collect_settings_from_inputs() magscope.settings.MagScopeSettings | None[source]#
_push_settings(settings: magscope.settings.MagScopeSettings) None[source]#
_refresh_fields() None[source]#
_on_apply_clicked() None[source]#
_on_defaults_clicked() None[source]#
_on_load_clicked() None[source]#
_on_save_clicked() None[source]#
class magscope.ui.controls.AcquisitionPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

NO_DIRECTORY_SELECTED_TEXT = 'No save directory selected'[source]#
acquisition_on_checkbox[source]#
acquisition_mode_combobox[source]#
acquisition_dir_on_checkbox[source]#
acquisition_dir_button[source]#
acquisition_dir_textedit[source]#
callback_acquisition_on()[source]#
callback_acquisition_dir_on()[source]#
callback_acquisition_mode()[source]#
callback_acquisition_dir()[source]#
update_save_highlight(should_save: bool) None[source]#
class magscope.ui.controls.BeadSelectionPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

next_bead_id_label[source]#
reset_id_button[source]#
roi_size_label[source]#
clear_button[source]#
auto_select_button[source]#
update_next_bead_id_label(next_bead_id: int) None[source]#
class magscope.ui.controls.CameraPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

_last_settings_update: datetime.datetime | None = None[source]#
settings[source]#
refresh_button[source]#
last_update_label[source]#
callback_refresh()[source]#
callback_set_camera_setting(name)[source]#
update_camera_setting(name: str, value: str)[source]#
_format_last_update_text() str[source]#
class magscope.ui.controls.HistogramPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: MatplotlibCleanupMixin, ControlPanelBase

update_interval: float = 1[source]#
_update_last_time: float = 0[source]#
enable_checkbox[source]#
only_beads_checkbox[source]#
n_bins = 256[source]#
figure[source]#
canvas[source]#
axes[source]#
enabled_callback(enabled: bool) None[source]#
_groupbox_toggled(expanded: bool) None[source]#
_apply_enabled_state(enabled: bool) None[source]#
update_plot(data)[source]#
clear()[source]#
class magscope.ui.controls.PlotSettingsPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

selected_bead[source]#
reference_bead[source]#
limits: dict[str, tuple[PyQt6.QtWidgets.QLineEdit, PyQt6.QtWidgets.QLineEdit]][source]#
grid_layout[source]#
time_mode[source]#
time_label[source]#
time_limits_absolute[source]#
time_relative_window[source]#
time_inputs_stack[source]#
beads_in_view_on[source]#
beads_in_view_count[source]#
beads_in_view_marker_size[source]#
selected_bead_callback(value)[source]#
reference_bead_callback(value)[source]#
time_mode_callback(value: str)[source]#
relative_time_window_callback(_value)[source]#
limits_callback(_)[source]#
beads_in_view_on_callback()[source]#
beads_in_view_count_callback()[source]#
beads_in_view_marker_size_callback()[source]#
magscope.ui.controls.has_tweezepy_support() bool[source]#
magscope.ui.controls.load_tweezepy_avar() tuple[callable | None, str | None][source]#
class magscope.ui.controls.AllanDeviationPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: MatplotlibCleanupMixin, ControlPanelBase

_SETTINGS_GROUP = 'AllanDeviationPanel'[source]#
refresh_button[source]#
history_window[source]#
history_window_hint[source]#
taus_mode[source]#
figure[source]#
canvas[source]#
axes[source]#
status_label[source]#
_settings() PyQt6.QtCore.QSettings[source]#
_setting_key(name: str) str[source]#
_load_setting(name: str, default: str) str[source]#
_persist_controls() None[source]#
_configure_axes() None[source]#
refresh_plot() None[source]#
clear(message: str = 'Click Refresh to compute Allan deviation') None[source]#
static _parse_window_seconds(value: str) float | None[source]#
static _estimate_sampling_rate(timestamps: numpy.ndarray) float | None[source]#
static _apply_history_window(timestamps: numpy.ndarray, values: numpy.ndarray, window_seconds: float) tuple[numpy.ndarray, numpy.ndarray][source]#
static _extract_axis_series(tracks: numpy.ndarray, *, axis_name: str, selected_bead: int | None, reference_bead: int | None) tuple[numpy.ndarray, numpy.ndarray][source]#
class magscope.ui.controls.ProfilePanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: MatplotlibCleanupMixin, ControlPanelBase

enable[source]#
selected_bead_label[source]#
profile_length_label[source]#
figure[source]#
canvas[source]#
axes[source]#
enabled_callback(enabled: bool) None[source]#
_groupbox_toggled(expanded: bool) None[source]#
_apply_enabled_state(enabled: bool) None[source]#
update_plot()[source]#
clear()[source]#
class magscope.ui.controls.TrackingOptionsPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

_DEFAULTS: dict[str, Any][source]#
_current_options: dict[str, Any][source]#
_last_options_update: datetime.datetime | None = None[source]#
background_combo[source]#
iterations[source]#
line_ratio[source]#
n_local[source]#
use_fft[source]#
fft_oversample[source]#
fft_rmin[source]#
fft_rmax[source]#
fft_gaus_factor[source]#
radial_oversample[source]#
lookup_n_local[source]#
status_label[source]#
_parse_int(widget: magscope.ui.widgets.LabeledLineEditWithValue, fallback: int, *, minimum: int | None = None) int[source]#
_parse_float(widget: magscope.ui.widgets.LabeledLineEditWithValue, fallback: float, *, minimum: float | None = None) float[source]#
_update_value_labels() None[source]#
_sync_fft_enabled_state() None[source]#
_use_fft_changed(value: bool) None[source]#
_set_options(options: dict[str, Any], message: str | None = None, *, populate_inputs: bool = False) None[source]#
_format_last_updated_text() str[source]#
_populate_inputs_from_options() None[source]#
_coerce_int_value(raw: Any, *, name: str, fallback: int, minimum: int | None = None, enforce_odd: bool = False) int[source]#
_coerce_float_value(raw: Any, *, name: str, fallback: float, minimum: float | None = None) float[source]#
_coerce_bool_value(raw: Any, *, fallback: bool) bool[source]#
_load_options_from_mapping(loaded: Any) dict[str, Any][source]#
_on_load_clicked() None[source]#
_on_save_clicked() None[source]#
apply_options() None[source]#
reset_defaults() None[source]#
class magscope.ui.controls.ScriptPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

NO_SCRIPT_SELECTED_TEXT = 'No script loaded'[source]#
status_prefix = 'Status'[source]#
status_label[source]#
step_position_label[source]#
step_description_label[source]#
button_layout[source]#
load_button[source]#
start_button[source]#
pause_button[source]#
filepath_textedit[source]#
update_status(status: magscope.scripting.ScriptStatus)[source]#
update_step(current_step: int | None, total_steps: int, description: str | None)[source]#
callback_load()[source]#
callback_start()[source]#
callback_pause()[source]#
class magscope.ui.controls.StatusPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

dot_count = 0[source]#
display_rate_status[source]#
video_processors_status[source]#
video_buffer_size_status[source]#
video_buffer_status[source]#
video_buffer_status_bar[source]#
video_buffer_purge_label[source]#
update_display_rate(text)[source]#
update_video_processors_status(status_text: str)[source]#
update_video_buffer_status(status_text: str)[source]#
_update_video_buffer_size_label() None[source]#
update_video_buffer_purge(timestamp: float)[source]#
class magscope.ui.controls.XYLockPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

enabled[source]#
interval[source]#
max[source]#
window[source]#
enabled_callback()[source]#
once_callback()[source]#
interval_callback()[source]#
max_callback()[source]#
window_callback()[source]#
update_enabled(value: bool)[source]#
update_interval(value: float)[source]#
update_max(value: float)[source]#
update_window(value: int)[source]#
class magscope.ui.controls.ZLockPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

enabled[source]#
bead[source]#
target[source]#
interval[source]#
max[source]#
window[source]#
enabled_callback()[source]#
bead_callback()[source]#
target_callback()[source]#
interval_callback()[source]#
max_callback()[source]#
window_callback()[source]#
update_enabled(value: bool)[source]#
update_bead(value: int)[source]#
update_target(value: float)[source]#
update_interval(value: float)[source]#
update_max(value: float)[source]#
update_window(value: int)[source]#
class magscope.ui.controls.ZLUTGenerationPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

roi_size_label[source]#
start_input[source]#
step_input[source]#
stop_input[source]#
measurements_input[source]#
generate_button[source]#
generate_callback()[source]#
update_state(status: str, detail: str | None = None, *, running: bool = False, can_cancel: bool = False, phase: str = 'idle') None[source]#
update_progress(current_step: int, total_steps: int, capture_count: int, capture_capacity: int, motor_z_value: float | None = None) None[source]#
class magscope.ui.controls.ZLUTSweepPreviewWidget(parent: PyQt6.QtWidgets.QWidget | None = None)[source]#

Bases: MatplotlibCleanupMixin, PyQt6.QtWidgets.QWidget

_STATE_LABELS[source]#
summary_label[source]#
_preview_cmap[source]#
figure[source]#
canvas[source]#
axes[source]#
_image[source]#
clear(message: str = 'Waiting for Z-LUT sweep data...') None[source]#
update_preview(*, state: int, count: int, capacity: int, n_steps: int, n_beads: int, profiles_per_bead: int, profile_length: int, preview_image: numpy.ndarray | None, selected_bead_id: int | None, mode: str, motor_z_min: float | None, motor_z_max: float | None, expected_capture_count: int | None = None, x_axis_label: str = 'Z Position (nm)', x_axis_min: float | None = None, x_axis_max: float | None = None, image_x_min: float | None = None, image_x_max: float | None = None) None[source]#
class magscope.ui.controls.ZLUTGenerationDialog(parent: PyQt6.QtWidgets.QWidget | None = None)[source]#

Bases: PyQt6.QtWidgets.QDialog

_running = False[source]#
_evaluation_active = False[source]#
_startup_pending = False[source]#
_close_when_canceled = False[source]#
_selected_bead_id: int | None = None[source]#
status_label[source]#
detail_label[source]#
progress_label[source]#
progress_bar[source]#
preview_widget[source]#
bead_selector[source]#
cancel_button[source]#
save_button[source]#
save_and_load_button[source]#
close_button[source]#
_cancel_callback = None[source]#
_close_callback = None[source]#
_save_callback = None[source]#
_save_and_load_callback = None[source]#
_select_bead_callback = None[source]#
set_cancel_callback(callback) None[source]#
set_save_callback(callback) None[source]#
set_save_and_load_callback(callback) None[source]#
set_close_callback(callback) None[source]#
set_select_bead_callback(callback) None[source]#
_handle_cancel_clicked() None[source]#
_handle_save_clicked() None[source]#
_handle_save_and_load_clicked() None[source]#
_handle_close_clicked() None[source]#
mark_starting() None[source]#
_handle_bead_selection_changed(index: int) None[source]#
update_state(status: str, detail: str | None = None, *, running: bool = False, can_cancel: bool = False, phase: str = 'idle') None[source]#
update_progress(current_step: int, total_steps: int, capture_count: int, capture_capacity: int, motor_z_value: float | None = None) None[source]#
update_evaluation(*, active: bool, bead_ids: list[int], selected_bead_id: int | None) None[source]#
force_close() None[source]#
closeEvent(event) None[source]#
class magscope.ui.controls.ZLUTPanel(manager: magscope.ui.ui.UIManager)[source]#

Bases: ControlPanelBase

zlut_file_selected[source]#
zlut_clear_requested[source]#
NO_ZLUT_SELECTED_TEXT = 'No Z-LUT file selected'[source]#
select_button[source]#
clear_button[source]#
filepath_textedit[source]#
_metadata_layout[source]#
min_value[source]#
max_value[source]#
step_value[source]#
profile_length_value[source]#
_add_metadata_row(label_text: str) PyQt6.QtWidgets.QLabel[source]#
_select_zlut_file()[source]#
_clear_zlut()[source]#
set_filepath(path: str | None)[source]#
update_metadata(z_min: float | None = None, z_max: float | None = None, step_size: float | None = None, profile_length: int | None = None)[source]#
clear_metadata()[source]#
static _format_number(value: float | int | None, suffix: str = '') str[source]#