TwoPy 0.3.7__tar.gz → 0.3.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {twopy-0.3.7 → twopy-0.3.8}/PKG-INFO +1 -1
- {twopy-0.3.7 → twopy-0.3.8}/pyproject.toml +1 -1
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/export.py +15 -1
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/session.py +23 -3
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/PKG-INFO +1 -1
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_export.py +26 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_loaded_recordings.py +1 -0
- {twopy-0.3.7 → twopy-0.3.8}/README.md +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/setup.cfg +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/__init__.pyi +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/_segments.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/_version.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/background_subtraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/dff.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/dff_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/epoch_mapping.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/group_matching.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/kernels/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/kernels/_fitting.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/kernels/_stimulus.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/motion.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/persistence.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_context.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_maps.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_plotting.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/apply.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/persistence.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/qc.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_processing/signals.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/response_window_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/responses.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/timing.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/trials.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis/workflow.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/analysis_cache.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/api.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/cache_inventory.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/calibrations/pixel_calibration_profiles.csv +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/calibrations/pixel_size.csv +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/config.example.yml +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/config.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/alignment_crop.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/api.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/hdf5_writing.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/matlab_values.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/orientation.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/source_loading.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/stimulus_code.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/conversion/types.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/converted.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/context.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/discovery.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/metadata.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/native.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/native_workflows/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/native_workflows/direction_selectivity.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/native_workflows/response_kernels.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/parameters.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/provenance.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/registry.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/results.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/runner.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/custom/workflows.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/cache.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/catalog.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/connection.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/generic.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/modeled.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/search.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/sql.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/database/types.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/filenames.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/frame_ranges.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/hdf5_utils.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/inspection.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/matlab.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/__main__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-128.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-16.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-256.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-32.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-512.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon-64.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon.icns +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/assets/twopy-app-icon.png +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/custom_tab.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/database_favorite_editor.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/database_favorites.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/database_search.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/dims.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/display.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/display_paths.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/empty_state.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/errors.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/cards.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/fov_assignment.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/fov_cards.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/images.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/protocols.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/response_preview.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/responses.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/roi_assignment.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/roi_cards.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/style.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/tables.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/group_matching/window.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/interactive.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/latest_worker.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/launcher.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/live_analysis.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/load_controller.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/load_progress.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/load_workflow.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/loaded_recordings_csv.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/loading.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/movie.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/output_routing.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/paths.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/data.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/dff_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/api.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/dynamic_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/options_panel.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/paths.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/plot_area.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/response_map_area.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/response_plot_widget.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/save_actions.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/docks/visibility_state.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/export_controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/form_controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/label_visibility.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/normalization_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/panels.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/preview_strip.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/processing_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/response_map_colors.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/response_map_display.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/response_map_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/response_window_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/roi_generation/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/roi_generation/actions.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/roi_generation/controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/roi_generation/options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/plotting/widgets.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/protocols.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/responses.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/roi.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/roi_signatures.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/sidebar.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/state.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/text.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/trial_timeline.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/types.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/version_check.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/napari/viewer.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/__init__.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/dff.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/psycho5.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/roi.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/parity/saved_analysis.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/photodiode.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/photodiode_classification.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/pixel_calibration.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/pixel_calibration_profiles.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/response_roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/roi.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/roi_mask_cleanup.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/session.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/spatial.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/spatial_orientation.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/stimulus.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/synchronization.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy/typing_guards.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/SOURCES.txt +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/dependency_links.txt +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/entry_points.txt +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/requires.txt +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/src/twopy.egg-info/top_level.txt +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_api.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_background_subtraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_cache_inventory.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_config.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_conversion.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_converted.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_custom_workflows.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_database.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_dff.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_epoch_mapping.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_filenames.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_frame_ranges.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_function_inventory.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_group_matching.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_hdf5_utils.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_import.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_inspection.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_kernels.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_load_workflow.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_matlab.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_motion.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_database_search.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_display.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_group_matching_responses.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_group_matching_roi_cards.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_live_controller.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_load_controller.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_load_progress.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_load_tab.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_path_resolution.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_plot_controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_plot_data.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_plot_widgets.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_processing_controls.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_response_map_display.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_response_workflow.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_roi_generation.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_roi_visibility.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_text.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_napari_timeline.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_packaging.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_parity.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_parity_psycho5.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_parity_roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_persistence.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_photodiode_classification.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_pixel_calibration.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_pixel_calibration_profiles.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_real_fixture.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_recording_timing.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_response_map_area.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_response_maps.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_response_processing.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_response_roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_response_window_options.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_responses.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_roi.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_roi_extraction.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_roi_mask_cleanup.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_saved_analysis.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_session.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_stimulus.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_synchronization.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_trials.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_version_check.py +0 -0
- {twopy-0.3.7 → twopy-0.3.8}/tests/test_workflow.py +0 -0
|
@@ -388,7 +388,7 @@ def current_recording_image(
|
|
|
388
388
|
Returns:
|
|
389
389
|
Two-dimensional display-coordinate image.
|
|
390
390
|
"""
|
|
391
|
-
movie_layer =
|
|
391
|
+
movie_layer = _visible_layer_by_name(viewer, "aligned movie")
|
|
392
392
|
if movie_layer is not None:
|
|
393
393
|
data = np.asarray(cast(NapariLayerWithData, movie_layer).data)
|
|
394
394
|
if data.ndim == 3:
|
|
@@ -397,6 +397,12 @@ def current_recording_image(
|
|
|
397
397
|
if data.ndim == 2:
|
|
398
398
|
return cast(npt.NDArray[np.float64], data)
|
|
399
399
|
|
|
400
|
+
mean_layer = _visible_layer_by_name(viewer, "mean image")
|
|
401
|
+
if mean_layer is not None:
|
|
402
|
+
data = np.asarray(cast(NapariLayerWithData, mean_layer).data)
|
|
403
|
+
if data.ndim == 2:
|
|
404
|
+
return cast(npt.NDArray[np.float64], data)
|
|
405
|
+
|
|
400
406
|
mean_image = recording.alignment_valid_crop.crop_image(recording.mean_image)
|
|
401
407
|
return cast(npt.NDArray[np.float64], mean_image)
|
|
402
408
|
|
|
@@ -948,3 +954,11 @@ def _layer_by_name(viewer: object | None, name: str) -> object | None:
|
|
|
948
954
|
if getattr(layer, "name", None) == name:
|
|
949
955
|
return layer
|
|
950
956
|
return None
|
|
957
|
+
|
|
958
|
+
|
|
959
|
+
def _visible_layer_by_name(viewer: object | None, name: str) -> object | None:
|
|
960
|
+
"""Return a named layer only when napari is currently showing it."""
|
|
961
|
+
layer = _layer_by_name(viewer, name)
|
|
962
|
+
if layer is None or not bool(getattr(layer, "visible", True)):
|
|
963
|
+
return None
|
|
964
|
+
return layer
|
|
@@ -269,6 +269,27 @@ def remove_loaded_recording_layers(
|
|
|
269
269
|
_remove_layer(viewer, layer)
|
|
270
270
|
|
|
271
271
|
|
|
272
|
+
def _clear_all_viewer_layers(viewer: object) -> None:
|
|
273
|
+
"""Clear every viewer layer because twopy owns the layer stack."""
|
|
274
|
+
layer_collection = getattr(viewer, "layers", None)
|
|
275
|
+
clear = getattr(layer_collection, "clear", None)
|
|
276
|
+
if callable(clear):
|
|
277
|
+
clear()
|
|
278
|
+
return
|
|
279
|
+
|
|
280
|
+
for collection_name in ("images", "labels"):
|
|
281
|
+
collection = getattr(viewer, collection_name, None)
|
|
282
|
+
if isinstance(collection, list):
|
|
283
|
+
collection.clear()
|
|
284
|
+
|
|
285
|
+
selection = getattr(layer_collection, "selection", None)
|
|
286
|
+
if selection is not None and hasattr(selection, "active"):
|
|
287
|
+
try:
|
|
288
|
+
cast(_LayerSelection, selection).active = None
|
|
289
|
+
except (AttributeError, TypeError):
|
|
290
|
+
return
|
|
291
|
+
|
|
292
|
+
|
|
272
293
|
def record_loaded_view(
|
|
273
294
|
state: NapariSessionState,
|
|
274
295
|
*,
|
|
@@ -444,7 +465,7 @@ def unload_loaded_recording(state: NapariSessionState, index: int) -> None:
|
|
|
444
465
|
|
|
445
466
|
|
|
446
467
|
def unload_all_loaded_recordings(state: NapariSessionState) -> None:
|
|
447
|
-
"""Unload every recording and
|
|
468
|
+
"""Unload every recording and clear all twopy-owned layers from napari.
|
|
448
469
|
|
|
449
470
|
Args:
|
|
450
471
|
state: Mutable napari session state.
|
|
@@ -454,8 +475,7 @@ def unload_all_loaded_recordings(state: NapariSessionState) -> None:
|
|
|
454
475
|
"""
|
|
455
476
|
if len(state.loaded_recordings) == 0:
|
|
456
477
|
return
|
|
457
|
-
|
|
458
|
-
remove_loaded_recording_layers(state.viewer, loaded_recording)
|
|
478
|
+
_clear_all_viewer_layers(state.viewer)
|
|
459
479
|
state.loaded_recordings.clear()
|
|
460
480
|
clear_matching_state = getattr(
|
|
461
481
|
state.group_matching_panel,
|
|
@@ -4,6 +4,8 @@ Inputs: shared fake napari state and tiny converted recordings.
|
|
|
4
4
|
Outputs: assertions for one napari workflow area.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
from types import SimpleNamespace
|
|
8
|
+
|
|
7
9
|
from qtpy.QtWidgets import QSizePolicy
|
|
8
10
|
|
|
9
11
|
from tests.napari_support import (
|
|
@@ -41,7 +43,9 @@ from tests.napari_support import (
|
|
|
41
43
|
temporary_directory,
|
|
42
44
|
unittest,
|
|
43
45
|
)
|
|
46
|
+
from twopy.converted import RecordingData
|
|
44
47
|
from twopy.napari.output_routing import NapariOutputRoute
|
|
48
|
+
from twopy.napari.plotting.export import current_recording_image
|
|
45
49
|
from twopy.napari.plotting.panels import SidebarTextLabel
|
|
46
50
|
|
|
47
51
|
|
|
@@ -202,6 +206,28 @@ class NapariExportTest(NapariAdapterTestCase):
|
|
|
202
206
|
self.assertEqual(len(fig.axes), 2)
|
|
203
207
|
np.testing.assert_allclose(fig.axes[1].get_yticks(), (-0.2, 0.0, 0.2))
|
|
204
208
|
|
|
209
|
+
def test_recording_export_uses_visible_mean_image_when_movie_hidden(self) -> None:
|
|
210
|
+
"""Confirm recording exports match the visible image layer.
|
|
211
|
+
|
|
212
|
+
Inputs: one hidden aligned-movie layer and one visible mean-image layer.
|
|
213
|
+
Outputs: exported image data comes from the visible mean image.
|
|
214
|
+
"""
|
|
215
|
+
mean_image = np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float64)
|
|
216
|
+
movie_frame = np.array([[9.0, 9.0], [9.0, 9.0]], dtype=np.float64)
|
|
217
|
+
viewer = SimpleNamespace(
|
|
218
|
+
layers={
|
|
219
|
+
"mean image": SimpleNamespace(data=mean_image, visible=True),
|
|
220
|
+
"aligned movie": SimpleNamespace(data=movie_frame, visible=False),
|
|
221
|
+
}
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
image = current_recording_image(
|
|
225
|
+
viewer=viewer,
|
|
226
|
+
recording=cast(RecordingData, object()),
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
np.testing.assert_array_equal(image, mean_image)
|
|
230
|
+
|
|
205
231
|
def test_response_plot_export_draws_epoch_marker(self) -> None:
|
|
206
232
|
"""Confirm exported response plots show the coarse epoch top rail.
|
|
207
233
|
|
|
@@ -850,6 +850,7 @@ class NapariLoadedRecordingsTest(NapariAdapterTestCase):
|
|
|
850
850
|
|
|
851
851
|
unload_buttons["Unload all"].click()
|
|
852
852
|
|
|
853
|
+
self.assertEqual(viewer.layer_clear_calls, 1)
|
|
853
854
|
self.assertEqual(loaded_list.count(), 0)
|
|
854
855
|
self.assertFalse(sidebar_buttons["Open Group Matching"].isEnabled())
|
|
855
856
|
self.assertFalse(sidebar_buttons["Reconvert selected"].isEnabled())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|