celldetective 1.5.0b10__tar.gz → 1.5.0b11__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.
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/PKG-INFO +1 -1
- celldetective-1.5.0b11/celldetective/_version.py +1 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/list_widget.py +25 -10
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/event_annotator.py +32 -3
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/interactions_block.py +11 -2
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/pair_event_annotator.py +39 -31
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_measurements.py +4 -5
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_neighborhood.py +1 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/contour_viewer.py +14 -2
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/measure.py +11 -2
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/masks.py +15 -8
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/PKG-INFO +1 -1
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/SOURCES.txt +2 -0
- celldetective-1.5.0b11/tests/gui/test_event_annotator_cleanup.py +310 -0
- celldetective-1.5.0b11/tests/test_contour_format.py +299 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_measure.py +87 -0
- celldetective-1.5.0b10/celldetective/_version.py +0 -1
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/LICENSE +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/README.md +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/__main__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/datasets/segmentation_annotations/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/datasets/signal_annotations/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/event_detection_models.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/events.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/exceptions.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/extra_properties.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/filters.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/InitWindow.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/about.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/analyze_block.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/channel_norm_generator.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/components.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/feature_choice.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/figure_canvas.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/styles.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/utils.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base_annotator.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/classifier_widget.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/configure_new_exp.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/control_panel.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/dynamic_progress.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/generic_signal_plot.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/gui_utils.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/cell-populations.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/exp-structure.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/feature-btrack.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/neighborhood.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/preprocessing.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/propagate-classification.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/track-postprocessing.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/tracking.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/json_readers.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/local_correction_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/model_fit_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/operation_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/measure_annotator.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/plot_measurements.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/plot_signals_ui.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/preprocessing_block.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/process_block.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/seg_model_loader.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_base.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_segmentation.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_tracking.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_stardist_model_params.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/survival_ui.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/tableUI.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_maths.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_merge_groups.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_query_table.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_rename_col.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/thresholds_gui.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/base_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/size_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/spot_detection_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/threshold_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/workers.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/logo-large.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/logo.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/signals_icon.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash-test.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash0.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/survival2.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/vignette_signals2.png +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/vignette_signals2.svg +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/links/zenodo.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/log_manager.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/pair_signal_detection/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_effectors/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_generic/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_targets/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/signal_detection/blank +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/biased_motion.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/mcf7.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/ricm.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/ricm2.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/napari/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/napari/utils.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/neighborhood.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/preprocessing.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/background_correction.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/compute_neighborhood.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/detect_events.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/downloader.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/load_table.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/measure_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/segment_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/track_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/train_segmentation_model.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/train_signal_model.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/unified_process.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/_regionprops.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/props.json +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/relative_measurements.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/analyze_signals.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/measure_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/measure_relative.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/segment_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/segment_cells_thresholds.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/track_cells.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/train_segmentation_model.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/train_signal_model.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/segmentation.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/signals.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/tracking.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/cellpose_utils/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/color_mappings.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/data_cleaning.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/data_loaders.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/dataset_helpers.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/downloaders.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/event_detection/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/experiment.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_augmenters.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_cleaning.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_loaders.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_transforms.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/io.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/mask_cleaning.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/mask_transforms.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/maths.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/model_getters.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/model_loaders.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/normalization.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/parsing.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/plots/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/plots/regression.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/resources.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/stardist_utils/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/stats.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/types.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/dependency_links.txt +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/entry_points.txt +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/not-zip-safe +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/requires.txt +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/top_level.txt +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/setup.cfg +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/setup.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/__init__.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_enhancements.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_measure_annotator_bugfix.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_new_project.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_project.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_spot_detection_viewer.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_cellpose_fallback.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_events.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_filters.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_io.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_neighborhood.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_notebooks.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_partial_install.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_preprocessing.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_segmentation.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_signals.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_tracking.py +0 -0
- {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.5.0b11"
|
|
@@ -89,7 +89,7 @@ class ListWidget(CelldetectiveWidget):
|
|
|
89
89
|
"""
|
|
90
90
|
Retrieves and returns the items from the list widget.
|
|
91
91
|
|
|
92
|
-
This method parses any items that contain a range (formatted as 'min
|
|
92
|
+
This method parses any items that contain a range (formatted as '(min,max)')
|
|
93
93
|
into a list of two values, and casts all items to the specified `dtype`.
|
|
94
94
|
|
|
95
95
|
Returns
|
|
@@ -97,18 +97,33 @@ class ListWidget(CelldetectiveWidget):
|
|
|
97
97
|
list
|
|
98
98
|
A list of the items in the list widget, with ranges split into two values.
|
|
99
99
|
"""
|
|
100
|
+
import re
|
|
101
|
+
|
|
102
|
+
# Pattern for tuple format: "(min,max)" with optional negative numbers and decimals
|
|
103
|
+
tuple_pattern = re.compile(r"^\((-?\d+(?:\.\d+)?),\s*(-?\d+(?:\.\d+)?)\)$")
|
|
100
104
|
|
|
101
105
|
items = []
|
|
102
106
|
for x in range(self.list_widget.count()):
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
text = self.list_widget.item(x).text().strip()
|
|
108
|
+
|
|
109
|
+
# Try tuple format first: (min,max)
|
|
110
|
+
tuple_match = tuple_pattern.match(text)
|
|
111
|
+
if tuple_match:
|
|
112
|
+
try:
|
|
113
|
+
minn = self.dtype(float(tuple_match.group(1)))
|
|
114
|
+
maxx = self.dtype(float(tuple_match.group(2)))
|
|
115
|
+
items.append([minn, maxx])
|
|
116
|
+
continue
|
|
117
|
+
except ValueError:
|
|
118
|
+
pass
|
|
119
|
+
|
|
120
|
+
# Single value
|
|
121
|
+
try:
|
|
122
|
+
items.append(self.dtype(text))
|
|
123
|
+
except ValueError:
|
|
124
|
+
print(
|
|
125
|
+
f"Warning: Could not convert '{text}' to {self.dtype.__name__}, skipping..."
|
|
126
|
+
)
|
|
112
127
|
return items
|
|
113
128
|
|
|
114
129
|
def clear(self):
|
|
@@ -850,11 +850,40 @@ class EventAnnotator(BaseAnnotator):
|
|
|
850
850
|
|
|
851
851
|
try:
|
|
852
852
|
self.stop()
|
|
853
|
-
|
|
854
|
-
gc.collect()
|
|
855
|
-
except:
|
|
853
|
+
except Exception:
|
|
856
854
|
pass
|
|
857
855
|
|
|
856
|
+
# Stop and delete animation to break reference cycles
|
|
857
|
+
if hasattr(self, "anim") and self.anim:
|
|
858
|
+
try:
|
|
859
|
+
self.anim.event_source.stop()
|
|
860
|
+
except Exception:
|
|
861
|
+
pass
|
|
862
|
+
del self.anim
|
|
863
|
+
|
|
864
|
+
# Close matplotlib figures
|
|
865
|
+
if hasattr(self, "fig"):
|
|
866
|
+
try:
|
|
867
|
+
plt.close(self.fig)
|
|
868
|
+
except Exception:
|
|
869
|
+
pass
|
|
870
|
+
|
|
871
|
+
if hasattr(self, "cell_fig"):
|
|
872
|
+
try:
|
|
873
|
+
plt.close(self.cell_fig)
|
|
874
|
+
except Exception:
|
|
875
|
+
pass
|
|
876
|
+
|
|
877
|
+
# Delete large objects
|
|
878
|
+
if hasattr(self, "stack"):
|
|
879
|
+
del self.stack
|
|
880
|
+
|
|
881
|
+
if hasattr(self, "df_tracks"):
|
|
882
|
+
del self.df_tracks
|
|
883
|
+
|
|
884
|
+
gc.collect()
|
|
885
|
+
super().closeEvent(event)
|
|
886
|
+
|
|
858
887
|
def animation_generator(self):
|
|
859
888
|
"""
|
|
860
889
|
Generator yielding frame indices for the animation,
|
|
@@ -684,5 +684,14 @@ class NeighPanel(QFrame, Styles):
|
|
|
684
684
|
|
|
685
685
|
test = self.parent_window.locate_selected_position()
|
|
686
686
|
if test:
|
|
687
|
-
|
|
688
|
-
|
|
687
|
+
try:
|
|
688
|
+
self.pair_event_annotator = PairEventAnnotator(self)
|
|
689
|
+
self.pair_event_annotator.show()
|
|
690
|
+
except ValueError as e:
|
|
691
|
+
# Show useful feedback if no neighborhood detected
|
|
692
|
+
msg = QMessageBox()
|
|
693
|
+
msg.setIcon(QMessageBox.Warning)
|
|
694
|
+
msg.setText(str(e))
|
|
695
|
+
msg.setWindowTitle("Warning")
|
|
696
|
+
msg.exec_()
|
|
697
|
+
return
|
|
@@ -172,6 +172,10 @@ class PairEventAnnotator(CelldetectiveMainWindow):
|
|
|
172
172
|
print(
|
|
173
173
|
f"The following neighborhoods were detected: {self.neighborhood_cols=}..."
|
|
174
174
|
)
|
|
175
|
+
if len(self.neighborhood_cols) == 0:
|
|
176
|
+
raise ValueError(
|
|
177
|
+
"No neighborhoods detected. Please compute neighborhoods first."
|
|
178
|
+
)
|
|
175
179
|
|
|
176
180
|
self.locate_relative_tracks()
|
|
177
181
|
|
|
@@ -1449,6 +1453,7 @@ class PairEventAnnotator(CelldetectiveMainWindow):
|
|
|
1449
1453
|
self.reference_population = self.neighborhood_choice_cb.currentText().split(
|
|
1450
1454
|
"_"
|
|
1451
1455
|
)[0]
|
|
1456
|
+
self.neighbor_population = self.reference_population
|
|
1452
1457
|
|
|
1453
1458
|
if "_(" in self.current_neighborhood and ")_" in self.current_neighborhood:
|
|
1454
1459
|
self.neighbor_population = (
|
|
@@ -1457,9 +1462,6 @@ class PairEventAnnotator(CelldetectiveMainWindow):
|
|
|
1457
1462
|
self.reference_population = (
|
|
1458
1463
|
self.current_neighborhood.split("_(")[-1].split(")_")[0].split("-")[0]
|
|
1459
1464
|
)
|
|
1460
|
-
else:
|
|
1461
|
-
if "self" in self.current_neighborhood:
|
|
1462
|
-
self.neighbor_population = self.reference_population
|
|
1463
1465
|
|
|
1464
1466
|
print(f"Current neighborhood: {self.current_neighborhood}")
|
|
1465
1467
|
print(f"New reference population: {self.reference_population}")
|
|
@@ -2183,18 +2185,44 @@ class PairEventAnnotator(CelldetectiveMainWindow):
|
|
|
2183
2185
|
|
|
2184
2186
|
def closeEvent(self, event):
|
|
2185
2187
|
|
|
2186
|
-
self.stop()
|
|
2187
|
-
# result = QMessageBox.question(self,
|
|
2188
|
-
# "Confirm Exit...",
|
|
2189
|
-
# "Are you sure you want to exit ?",
|
|
2190
|
-
# QMessageBox.Yes| QMessageBox.No,
|
|
2191
|
-
# )
|
|
2192
2188
|
try:
|
|
2193
|
-
|
|
2194
|
-
except:
|
|
2189
|
+
self.stop()
|
|
2190
|
+
except Exception:
|
|
2195
2191
|
pass
|
|
2196
2192
|
|
|
2193
|
+
# Stop and delete animation to break reference cycles
|
|
2194
|
+
if hasattr(self, "anim") and self.anim:
|
|
2195
|
+
try:
|
|
2196
|
+
self.anim.event_source.stop()
|
|
2197
|
+
except Exception:
|
|
2198
|
+
pass
|
|
2199
|
+
del self.anim
|
|
2200
|
+
|
|
2201
|
+
# Close matplotlib figures
|
|
2202
|
+
if hasattr(self, "fig"):
|
|
2203
|
+
try:
|
|
2204
|
+
plt.close(self.fig)
|
|
2205
|
+
except Exception:
|
|
2206
|
+
pass
|
|
2207
|
+
|
|
2208
|
+
if hasattr(self, "cell_fig"):
|
|
2209
|
+
try:
|
|
2210
|
+
plt.close(self.cell_fig)
|
|
2211
|
+
except Exception:
|
|
2212
|
+
pass
|
|
2213
|
+
|
|
2214
|
+
# Delete large objects
|
|
2215
|
+
if hasattr(self, "stack"):
|
|
2216
|
+
del self.stack
|
|
2217
|
+
|
|
2218
|
+
if hasattr(self, "dataframes"):
|
|
2219
|
+
self.dataframes.clear()
|
|
2220
|
+
|
|
2221
|
+
if hasattr(self, "df_relative"):
|
|
2222
|
+
del self.df_relative
|
|
2223
|
+
|
|
2197
2224
|
gc.collect()
|
|
2225
|
+
super().closeEvent(event)
|
|
2198
2226
|
|
|
2199
2227
|
def animation_generator(self):
|
|
2200
2228
|
"""
|
|
@@ -2982,26 +3010,6 @@ class PairEventAnnotator(CelldetectiveMainWindow):
|
|
|
2982
3010
|
self.draw_frame(self.framedata)
|
|
2983
3011
|
self.fcanvas.canvas.draw()
|
|
2984
3012
|
|
|
2985
|
-
def set_first_frame(self):
|
|
2986
|
-
self.stop()
|
|
2987
|
-
self.framedata = 0
|
|
2988
|
-
self.draw_frame(self.framedata)
|
|
2989
|
-
self.fcanvas.canvas.draw()
|
|
2990
|
-
|
|
2991
|
-
def set_last_frame(self):
|
|
2992
|
-
self.stop()
|
|
2993
|
-
self.framedata = len(self.stack) - 1
|
|
2994
|
-
while len(np.where(self.stack[self.framedata].flatten() == 0)[0]) > 0.99 * len(
|
|
2995
|
-
self.stack[self.framedata].flatten()
|
|
2996
|
-
):
|
|
2997
|
-
self.framedata -= 1
|
|
2998
|
-
if self.framedata < 0:
|
|
2999
|
-
self.framedata = 0
|
|
3000
|
-
break
|
|
3001
|
-
|
|
3002
|
-
self.draw_frame(self.framedata)
|
|
3003
|
-
self.fcanvas.canvas.draw()
|
|
3004
|
-
|
|
3005
3013
|
def give_reference_cell_information(self):
|
|
3006
3014
|
|
|
3007
3015
|
df_reference = self.dataframes[self.reference_population]
|
|
@@ -680,16 +680,15 @@ class SettingsMeasurements(CelldetectiveSettingsPanel):
|
|
|
680
680
|
border_distances = measurement_instructions["border_distances"]
|
|
681
681
|
if border_distances is not None:
|
|
682
682
|
if isinstance(border_distances, int):
|
|
683
|
-
distances = [border_distances]
|
|
683
|
+
distances = [str(border_distances)]
|
|
684
684
|
elif isinstance(border_distances, list):
|
|
685
685
|
distances = []
|
|
686
686
|
for d in border_distances:
|
|
687
|
-
if isinstance(d, int
|
|
687
|
+
if isinstance(d, (int, float)):
|
|
688
688
|
distances.append(str(int(d)))
|
|
689
689
|
elif isinstance(d, list):
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
)
|
|
690
|
+
# Use (min,max) tuple format to match CellEdgeVisualizer output
|
|
691
|
+
distances.append(f"({int(d[0])},{int(d[1])})")
|
|
693
692
|
self.contours_list.list_widget.clear()
|
|
694
693
|
self.contours_list.list_widget.addItems(distances)
|
|
695
694
|
|
{celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/contour_viewer.py
RENAMED
|
@@ -72,6 +72,7 @@ class CellEdgeVisualizer(StackVisualizer):
|
|
|
72
72
|
labels=None,
|
|
73
73
|
initial_edge=5,
|
|
74
74
|
initial_mask_alpha=0.5,
|
|
75
|
+
single_value_mode=False,
|
|
75
76
|
*args,
|
|
76
77
|
**kwargs,
|
|
77
78
|
):
|
|
@@ -86,6 +87,7 @@ class CellEdgeVisualizer(StackVisualizer):
|
|
|
86
87
|
self.invert = invert
|
|
87
88
|
self.parent_list_widget = parent_list_widget
|
|
88
89
|
self.parent_le = parent_le
|
|
90
|
+
self.single_value_mode = single_value_mode
|
|
89
91
|
|
|
90
92
|
# SDF cache (stores label + dist_in + dist_out + voronoi)
|
|
91
93
|
self.sdf_cache = OrderedDict()
|
|
@@ -201,8 +203,18 @@ class CellEdgeVisualizer(StackVisualizer):
|
|
|
201
203
|
|
|
202
204
|
def set_measurement_in_parent_list(self):
|
|
203
205
|
# Add the edge size to the parent QListWidget
|
|
204
|
-
|
|
205
|
-
self.
|
|
206
|
+
# edge_slider is a QLabeledRangeSlider returning (min, max) tuple
|
|
207
|
+
slider_val = self.edge_slider.value()
|
|
208
|
+
if isinstance(slider_val, tuple):
|
|
209
|
+
if self.single_value_mode:
|
|
210
|
+
# For neighborhood: just output the max absolute distance
|
|
211
|
+
edge_value = str(max(abs(slider_val[0]), abs(slider_val[1])))
|
|
212
|
+
else:
|
|
213
|
+
# For contour measurements: output as "(min,max)" tuple format
|
|
214
|
+
edge_value = f"({slider_val[0]},{slider_val[1]})"
|
|
215
|
+
else:
|
|
216
|
+
edge_value = str(abs(slider_val))
|
|
217
|
+
self.parent_list_widget.addItems([edge_value])
|
|
206
218
|
self.close()
|
|
207
219
|
|
|
208
220
|
def generate_label_imshow(self):
|
|
@@ -544,10 +544,19 @@ def measure_features(
|
|
|
544
544
|
df_props = df_props[[c for c in df_props.columns if not c.endswith("_delme")]]
|
|
545
545
|
|
|
546
546
|
if border_dist is not None:
|
|
547
|
+
# Get the names of extra properties that were actually requested by the user
|
|
548
|
+
# (these were moved from features to extra_props_list earlier)
|
|
549
|
+
requested_extra_names = []
|
|
550
|
+
if extra_props_list:
|
|
551
|
+
for prop_func in extra_props_list:
|
|
552
|
+
if hasattr(prop_func, "__name__"):
|
|
553
|
+
requested_extra_names.append(prop_func.__name__)
|
|
554
|
+
|
|
547
555
|
# Filter for features containing "intensity" but not "centroid" or "peripheral"
|
|
556
|
+
# Only use user-requested features, not all available extra properties
|
|
548
557
|
intensity_features = [
|
|
549
558
|
f
|
|
550
|
-
for f in (features +
|
|
559
|
+
for f in (features + requested_extra_names)
|
|
551
560
|
if "intensity" in f and "centroid" not in f and "peripheral" not in f
|
|
552
561
|
]
|
|
553
562
|
|
|
@@ -558,7 +567,7 @@ def measure_features(
|
|
|
558
567
|
|
|
559
568
|
clean_intensity_features = []
|
|
560
569
|
for s in intensity_features:
|
|
561
|
-
if s in
|
|
570
|
+
if s in requested_extra_names:
|
|
562
571
|
intensity_extra.append(getattr(extra_props, s))
|
|
563
572
|
else:
|
|
564
573
|
clean_intensity_features.append(s)
|
|
@@ -49,8 +49,10 @@ def contour_of_instance_segmentation(label, distance, sdf=None, voronoi_map=None
|
|
|
49
49
|
"""
|
|
50
50
|
from scipy.ndimage import distance_transform_edt
|
|
51
51
|
|
|
52
|
-
# helper to parse string "rad1-rad2"
|
|
52
|
+
# helper to parse string "rad1-rad2" or "-12-13" or "-5--2"
|
|
53
53
|
if isinstance(distance, str):
|
|
54
|
+
import re
|
|
55
|
+
|
|
54
56
|
try:
|
|
55
57
|
# Check for stringified tuple "(a, b)"
|
|
56
58
|
distance = distance.strip()
|
|
@@ -74,13 +76,18 @@ def contour_of_instance_segmentation(label, distance, sdf=None, voronoi_map=None
|
|
|
74
76
|
min_r = val
|
|
75
77
|
max_r = 0
|
|
76
78
|
except ValueError:
|
|
77
|
-
# It's a range string "5-10"
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
# It's a range string like "5-10", "-12-13", or "-5--2"
|
|
80
|
+
# Use regex to parse range with potentially negative numbers
|
|
81
|
+
range_pattern = re.compile(r"^(-?\d+(?:\.\d+)?)-(-?\d+(?:\.\d+)?)$")
|
|
82
|
+
match = range_pattern.match(distance)
|
|
83
|
+
if match:
|
|
84
|
+
r1 = float(match.group(1))
|
|
85
|
+
r2 = float(match.group(2))
|
|
86
|
+
# Use the values directly as specified (min, max in SDF space)
|
|
87
|
+
min_r = min(r1, r2)
|
|
88
|
+
max_r = max(r1, r2)
|
|
89
|
+
else:
|
|
90
|
+
raise ValueError(f"Could not parse range string: {distance}")
|
|
84
91
|
|
|
85
92
|
except Exception:
|
|
86
93
|
logger.warning(
|
|
@@ -179,6 +179,7 @@ celldetective/utils/plots/regression.py
|
|
|
179
179
|
celldetective/utils/stardist_utils/__init__.py
|
|
180
180
|
tests/__init__.py
|
|
181
181
|
tests/test_cellpose_fallback.py
|
|
182
|
+
tests/test_contour_format.py
|
|
182
183
|
tests/test_events.py
|
|
183
184
|
tests/test_filters.py
|
|
184
185
|
tests/test_io.py
|
|
@@ -193,6 +194,7 @@ tests/test_tracking.py
|
|
|
193
194
|
tests/test_utils.py
|
|
194
195
|
tests/gui/__init__.py
|
|
195
196
|
tests/gui/test_enhancements.py
|
|
197
|
+
tests/gui/test_event_annotator_cleanup.py
|
|
196
198
|
tests/gui/test_measure_annotator_bugfix.py
|
|
197
199
|
tests/gui/test_new_project.py
|
|
198
200
|
tests/gui/test_project.py
|