celldetective 1.5.0b8__tar.gz → 1.5.0b10__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.0b8 → celldetective-1.5.0b10}/PKG-INFO +1 -1
- celldetective-1.5.0b10/celldetective/_version.py +1 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/generic_signal_plot.py +14 -14
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/gui_utils.py +27 -6
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/plot_signals_ui.py +32 -15
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_measurements.py +10 -2
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/survival_ui.py +39 -11
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/tableUI.py +69 -148
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/thresholds_gui.py +45 -5
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/spot_detection_viewer.py +150 -27
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/measure.py +11 -11
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/data_cleaning.py +7 -3
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/PKG-INFO +1 -1
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/SOURCES.txt +2 -1
- celldetective-1.5.0b10/tests/gui/test_spot_detection_viewer.py +394 -0
- celldetective-1.5.0b10/tests/test_measure.py +243 -0
- celldetective-1.5.0b10/tests/test_signals.py +154 -0
- celldetective-1.5.0b8/celldetective/_version.py +0 -1
- celldetective-1.5.0b8/tests/test_measure.py +0 -141
- celldetective-1.5.0b8/tests/test_signals.py +0 -135
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/LICENSE +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/README.md +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/__main__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/datasets/segmentation_annotations/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/datasets/signal_annotations/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/event_detection_models.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/events.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/exceptions.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/extra_properties.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/filters.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/InitWindow.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/about.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/analyze_block.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/channel_norm_generator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/components.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/feature_choice.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/figure_canvas.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/list_widget.py +1 -1
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/styles.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/utils.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base_annotator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/classifier_widget.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/configure_new_exp.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/control_panel.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/dynamic_progress.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/event_annotator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/cell-populations.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/exp-structure.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/feature-btrack.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/neighborhood.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/preprocessing.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/propagate-classification.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/track-postprocessing.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/tracking.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/interactions_block.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/json_readers.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/local_correction_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/model_fit_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/operation_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/measure_annotator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/pair_event_annotator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/plot_measurements.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/preprocessing_block.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/process_block.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/seg_model_loader.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_base.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_neighborhood.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_segmentation.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_tracking.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_stardist_model_params.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_maths.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_merge_groups.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_query_table.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_rename_col.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/base_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/contour_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/size_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/threshold_viewer.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/workers.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/logo-large.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/logo.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/signals_icon.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash-test.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash0.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/survival2.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/vignette_signals2.png +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/vignette_signals2.svg +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/links/zenodo.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/log_manager.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/pair_signal_detection/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_effectors/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_generic/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_targets/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/signal_detection/blank +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/biased_motion.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/mcf7.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/ricm.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/ricm2.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/napari/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/napari/utils.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/neighborhood.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/preprocessing.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/background_correction.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/compute_neighborhood.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/detect_events.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/downloader.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/load_table.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/measure_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/segment_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/track_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/train_segmentation_model.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/train_signal_model.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/unified_process.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/_regionprops.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/props.json +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/relative_measurements.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/analyze_signals.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/measure_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/measure_relative.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/segment_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/segment_cells_thresholds.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/track_cells.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/train_segmentation_model.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/train_signal_model.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/segmentation.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/signals.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/tracking.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/cellpose_utils/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/color_mappings.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/data_loaders.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/dataset_helpers.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/downloaders.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/event_detection/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/experiment.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_augmenters.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_cleaning.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_loaders.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_transforms.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/io.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/mask_cleaning.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/mask_transforms.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/masks.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/maths.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/model_getters.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/model_loaders.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/normalization.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/parsing.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/plots/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/plots/regression.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/resources.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/stardist_utils/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/stats.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/types.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/dependency_links.txt +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/entry_points.txt +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/not-zip-safe +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/requires.txt +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/top_level.txt +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/setup.cfg +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/setup.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/__init__.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_enhancements.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_measure_annotator_bugfix.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_new_project.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_project.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_cellpose_fallback.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_events.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_filters.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_io.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_neighborhood.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_notebooks.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_partial_install.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_preprocessing.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_segmentation.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_tracking.py +0 -0
- {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_utils.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.5.0b10"
|
|
@@ -29,6 +29,7 @@ import matplotlib.pyplot as plt
|
|
|
29
29
|
|
|
30
30
|
plt.rcParams["svg.fonttype"] = "none"
|
|
31
31
|
from glob import glob
|
|
32
|
+
from celldetective import get_logger
|
|
32
33
|
from matplotlib.cm import tab10
|
|
33
34
|
from celldetective.gui.base.components import CelldetectiveWidget
|
|
34
35
|
import matplotlib.cm as mcm
|
|
@@ -36,6 +37,8 @@ import pandas as pd
|
|
|
36
37
|
|
|
37
38
|
from lifelines.utils import qth_survival_times
|
|
38
39
|
|
|
40
|
+
logger = get_logger(__name__)
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
41
44
|
|
|
@@ -317,7 +320,7 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
317
320
|
alpha = value
|
|
318
321
|
try:
|
|
319
322
|
alpha = float(alpha)
|
|
320
|
-
except:
|
|
323
|
+
except (ValueError, TypeError):
|
|
321
324
|
return None
|
|
322
325
|
if alpha > 1.0:
|
|
323
326
|
alpha = 1.0
|
|
@@ -440,7 +443,7 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
440
443
|
+ glob(self.parent_window.exp_dir + os.sep.join([f"W*", "*metadata.txt"]))
|
|
441
444
|
+ glob(self.parent_window.exp_dir + "*metadata.txt")
|
|
442
445
|
)
|
|
443
|
-
|
|
446
|
+
logger.debug(f"Found {len(self.metafiles)} metadata files.")
|
|
444
447
|
if len(self.metafiles) > 0:
|
|
445
448
|
self.metadata_found = True
|
|
446
449
|
|
|
@@ -455,17 +458,17 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
455
458
|
data = json.load(f)
|
|
456
459
|
positions = data["Summary"]["InitialPositionList"]
|
|
457
460
|
except Exception as e:
|
|
458
|
-
|
|
461
|
+
logger.debug(f"Trouble loading metadata: {e}")
|
|
459
462
|
return None
|
|
460
463
|
|
|
461
464
|
for k in range(len(positions)):
|
|
462
465
|
pos_label = positions[k]["Label"]
|
|
463
466
|
try:
|
|
464
467
|
coords = positions[k]["DeviceCoordinatesUm"]["XYStage"]
|
|
465
|
-
except:
|
|
468
|
+
except KeyError:
|
|
466
469
|
try:
|
|
467
470
|
coords = positions[k]["DeviceCoordinatesUm"]["PIXYStage"]
|
|
468
|
-
except:
|
|
471
|
+
except KeyError:
|
|
469
472
|
self.no_meta = True
|
|
470
473
|
|
|
471
474
|
if not self.no_meta:
|
|
@@ -515,8 +518,8 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
515
518
|
self.fig_scatter.tight_layout()
|
|
516
519
|
self.fig_scatter.canvas.mpl_connect("motion_notify_event", self.hover)
|
|
517
520
|
self.fig_scatter.canvas.mpl_connect("pick_event", self.unselect_position)
|
|
518
|
-
except
|
|
519
|
-
|
|
521
|
+
except (KeyError, TypeError) as e:
|
|
522
|
+
logger.debug(f"Could not plot spatial location: {e}")
|
|
520
523
|
|
|
521
524
|
def update_annot(self, ind):
|
|
522
525
|
|
|
@@ -616,19 +619,16 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
616
619
|
leg.set_visible(True)
|
|
617
620
|
|
|
618
621
|
def show_hide_legend(self):
|
|
619
|
-
|
|
622
|
+
"""Toggle legend visibility and replot to sync state."""
|
|
620
623
|
if self.legend_visible:
|
|
621
|
-
leg = self.ax.get_legend()
|
|
622
|
-
leg.set_visible(False)
|
|
623
624
|
self.legend_visible = False
|
|
624
625
|
self.legend_btn.setIcon(icon(MDI6.text_box, color="black"))
|
|
625
626
|
else:
|
|
626
|
-
leg = self.ax.get_legend()
|
|
627
|
-
leg.set_visible(True)
|
|
628
627
|
self.legend_visible = True
|
|
629
628
|
self.legend_btn.setIcon(icon(MDI6.text_box, color=self.help_color))
|
|
630
629
|
|
|
631
|
-
|
|
630
|
+
# Replot to sync legend state
|
|
631
|
+
self.plot_signals(0)
|
|
632
632
|
|
|
633
633
|
def switch_to_log(self):
|
|
634
634
|
"""
|
|
@@ -886,7 +886,7 @@ class GenericSignalPlotWidget(CelldetectiveWidget):
|
|
|
886
886
|
try:
|
|
887
887
|
self.plot_signals(0)
|
|
888
888
|
except Exception as e:
|
|
889
|
-
|
|
889
|
+
logger.debug(f"Error plotting signals: {e}")
|
|
890
890
|
|
|
891
891
|
def switch_cell_lines(self):
|
|
892
892
|
|
|
@@ -35,11 +35,19 @@ class PreprocessingLayout(QVBoxLayout, Styles):
|
|
|
35
35
|
A widget that allows user to choose preprocessing filters for an image
|
|
36
36
|
"""
|
|
37
37
|
|
|
38
|
-
def __init__(
|
|
38
|
+
def __init__(
|
|
39
|
+
self,
|
|
40
|
+
parent_window=None,
|
|
41
|
+
apply_btn_option=True,
|
|
42
|
+
extra_widget=None,
|
|
43
|
+
*args,
|
|
44
|
+
**kwargs,
|
|
45
|
+
):
|
|
39
46
|
super().__init__(*args, **kwargs)
|
|
40
47
|
|
|
41
48
|
self.parent_window = parent_window
|
|
42
49
|
self.apply_btn_option = apply_btn_option
|
|
50
|
+
self.extra_widget = extra_widget
|
|
43
51
|
self.generate_components()
|
|
44
52
|
self.add_to_layout()
|
|
45
53
|
|
|
@@ -48,7 +56,12 @@ class PreprocessingLayout(QVBoxLayout, Styles):
|
|
|
48
56
|
self.setContentsMargins(20, 20, 20, 20)
|
|
49
57
|
|
|
50
58
|
button_layout = QHBoxLayout()
|
|
51
|
-
|
|
59
|
+
v_layout = QVBoxLayout()
|
|
60
|
+
v_layout.addWidget(self.preprocess_lbl, alignment=Qt.AlignLeft)
|
|
61
|
+
if self.extra_widget is not None:
|
|
62
|
+
v_layout.addWidget(self.extra_widget, alignment=Qt.AlignLeft)
|
|
63
|
+
|
|
64
|
+
button_layout.addLayout(v_layout, 85)
|
|
52
65
|
button_layout.addWidget(self.delete_filter_btn, 5)
|
|
53
66
|
button_layout.addWidget(self.add_filter_btn, 5)
|
|
54
67
|
button_layout.addWidget(self.help_prefilter_btn, 5)
|
|
@@ -129,10 +142,12 @@ class PreprocessingLayout(QVBoxLayout, Styles):
|
|
|
129
142
|
|
|
130
143
|
class PreprocessingLayout2(PreprocessingLayout):
|
|
131
144
|
|
|
132
|
-
def __init__(self, fraction=75, *args, **kwargs):
|
|
145
|
+
def __init__(self, fraction=75, extra_widget=None, *args, **kwargs):
|
|
133
146
|
|
|
134
147
|
self.fraction = fraction
|
|
135
|
-
super().__init__(
|
|
148
|
+
super().__init__(
|
|
149
|
+
apply_btn_option=False, extra_widget=extra_widget, *args, **kwargs
|
|
150
|
+
)
|
|
136
151
|
self.preprocess_lbl.setText("Preprocessing: ")
|
|
137
152
|
self.preprocess_lbl.setStyleSheet("")
|
|
138
153
|
self.setContentsMargins(0, 0, 0, 0)
|
|
@@ -142,12 +157,18 @@ class PreprocessingLayout2(PreprocessingLayout):
|
|
|
142
157
|
main_layout = QHBoxLayout()
|
|
143
158
|
main_layout.setContentsMargins(0, 0, 0, 0)
|
|
144
159
|
main_layout.setSpacing(5)
|
|
160
|
+
main_layout.setSpacing(5)
|
|
161
|
+
|
|
145
162
|
main_layout.addWidget(self.preprocess_lbl, self.fraction, alignment=Qt.AlignTop)
|
|
146
163
|
|
|
147
164
|
list_grid = QGridLayout()
|
|
148
165
|
list_grid.addWidget(self.list, 0, 0, 2, 2)
|
|
149
166
|
list_grid.addWidget(self.add_filter_btn, 0, 2, 1, 1)
|
|
150
167
|
list_grid.addWidget(self.delete_filter_btn, 1, 2, 1, 1)
|
|
168
|
+
|
|
169
|
+
if self.extra_widget is not None:
|
|
170
|
+
list_grid.addWidget(self.extra_widget, 2, 0, 1, 3, alignment=Qt.AlignRight)
|
|
171
|
+
|
|
151
172
|
main_layout.addLayout(list_grid, 100 - self.fraction)
|
|
152
173
|
self.add_filter_btn.setFixedWidth(35) # Ensure the button width is fixed
|
|
153
174
|
self.delete_filter_btn.setFixedWidth(35)
|
|
@@ -449,8 +470,6 @@ class FilterChoice(CelldetectiveWidget):
|
|
|
449
470
|
def add_current_feature(self):
|
|
450
471
|
|
|
451
472
|
filtername = self.combo_box.currentText()
|
|
452
|
-
self.parent_window.list_widget.addItems([filtername])
|
|
453
|
-
|
|
454
473
|
filter_instructions = [filtername.split("_")[0]]
|
|
455
474
|
for a in self.arguments_le:
|
|
456
475
|
|
|
@@ -467,7 +486,9 @@ class FilterChoice(CelldetectiveWidget):
|
|
|
467
486
|
|
|
468
487
|
print(f"You added filter {filter_instructions}.")
|
|
469
488
|
|
|
489
|
+
# Update items BEFORE adding to widget to ensure signals pick up the new state
|
|
470
490
|
self.parent_window.items.append(filter_instructions)
|
|
491
|
+
self.parent_window.list_widget.addItems([filtername])
|
|
471
492
|
self.close()
|
|
472
493
|
|
|
473
494
|
def update_arguments(self):
|
|
@@ -28,6 +28,7 @@ import matplotlib.pyplot as plt
|
|
|
28
28
|
|
|
29
29
|
plt.rcParams["svg.fonttype"] = "none"
|
|
30
30
|
from glob import glob
|
|
31
|
+
from celldetective import get_logger
|
|
31
32
|
from natsort import natsorted
|
|
32
33
|
import math
|
|
33
34
|
from celldetective.gui.base.components import CelldetectiveWidget
|
|
@@ -36,6 +37,8 @@ import matplotlib.cm
|
|
|
36
37
|
from celldetective.relative_measurements import expand_pair_table
|
|
37
38
|
from celldetective.neighborhood import extract_neighborhood_in_pair_table
|
|
38
39
|
|
|
40
|
+
logger = get_logger(__name__)
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
class ConfigSignalPlot(CelldetectiveWidget):
|
|
41
44
|
"""
|
|
@@ -173,7 +176,7 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
173
176
|
if hasattr(matplotlib.cm, str(cm).lower()):
|
|
174
177
|
try:
|
|
175
178
|
self.cbs[-1].addColormap(cm.lower())
|
|
176
|
-
except:
|
|
179
|
+
except Exception:
|
|
177
180
|
pass
|
|
178
181
|
|
|
179
182
|
self.cbs[0].setCurrentIndex(1)
|
|
@@ -257,7 +260,9 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
257
260
|
)
|
|
258
261
|
)
|
|
259
262
|
if not tables_pairs:
|
|
260
|
-
|
|
263
|
+
logger.warning(
|
|
264
|
+
"No pair table found. Please compute the pair measurements."
|
|
265
|
+
)
|
|
261
266
|
return None
|
|
262
267
|
self.cols_pairs = extract_cols_from_table_list(tables_pairs)
|
|
263
268
|
|
|
@@ -333,7 +338,9 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
333
338
|
time_idx = np.array(
|
|
334
339
|
[s.startswith("t_") or s.startswith("t0_") for s in self.all_columns]
|
|
335
340
|
)
|
|
336
|
-
|
|
341
|
+
logger.debug(
|
|
342
|
+
f"class_idx={class_idx}, time_idx={time_idx}, columns={self.all_columns}"
|
|
343
|
+
)
|
|
337
344
|
|
|
338
345
|
try:
|
|
339
346
|
if len(class_idx) > 0:
|
|
@@ -345,7 +352,7 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
345
352
|
else:
|
|
346
353
|
time_columns = []
|
|
347
354
|
except Exception as e:
|
|
348
|
-
|
|
355
|
+
logger.warning(f"Columns not found: {e}")
|
|
349
356
|
self.auto_close = True
|
|
350
357
|
return None
|
|
351
358
|
|
|
@@ -435,8 +442,20 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
435
442
|
query_text = self.query_le.text()
|
|
436
443
|
if query_text != "":
|
|
437
444
|
self.df = self.df.query(query_text)
|
|
445
|
+
except pd.errors.UndefinedVariableError as e:
|
|
446
|
+
logger.warning(f"Query failed - undefined variable: {e}")
|
|
447
|
+
generic_message(
|
|
448
|
+
f"Query error: column not found.\n{e}\n\nPlease check your column names."
|
|
449
|
+
)
|
|
450
|
+
return None
|
|
451
|
+
except SyntaxError as e:
|
|
452
|
+
logger.warning(f"Query failed - syntax error: {e}")
|
|
453
|
+
generic_message(f"Query syntax error: {e}\n\nCheck your query format.")
|
|
454
|
+
return None
|
|
438
455
|
except Exception as e:
|
|
439
|
-
|
|
456
|
+
logger.warning(f"Query not applied: {e}")
|
|
457
|
+
generic_message(f"Query could not be applied: {e}")
|
|
458
|
+
return None
|
|
440
459
|
|
|
441
460
|
self.feature_selected = self.feature_cb.currentText()
|
|
442
461
|
self.feature_choice_widget.close()
|
|
@@ -454,17 +473,17 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
454
473
|
)
|
|
455
474
|
self.plot_window.show()
|
|
456
475
|
except Exception as e:
|
|
457
|
-
|
|
476
|
+
logger.debug(f"Error creating plot widget: {e}")
|
|
458
477
|
|
|
459
478
|
def process_signal(self):
|
|
460
479
|
|
|
461
480
|
self.FrameToMin = float(self.time_calibration_le.text().replace(",", "."))
|
|
462
|
-
|
|
481
|
+
logger.info(f"Time calibration set to 1 frame = {self.FrameToMin} min")
|
|
463
482
|
|
|
464
483
|
# read instructions from combobox options
|
|
465
484
|
self.load_available_tables()
|
|
466
485
|
class_col = self.class_columns[self.cbs[1].currentIndex()]
|
|
467
|
-
|
|
486
|
+
logger.debug(f"Selected class column: {class_col}")
|
|
468
487
|
|
|
469
488
|
if self.df is not None:
|
|
470
489
|
|
|
@@ -512,8 +531,8 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
512
531
|
)
|
|
513
532
|
|
|
514
533
|
if self.df is None:
|
|
515
|
-
|
|
516
|
-
generic_message("No table could be found to compute
|
|
534
|
+
logger.warning("No table could be found.")
|
|
535
|
+
generic_message("No table could be found to compute signals.")
|
|
517
536
|
self.close()
|
|
518
537
|
return None
|
|
519
538
|
else:
|
|
@@ -533,9 +552,7 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
533
552
|
# Per position signal
|
|
534
553
|
self.df = self.df.dropna(subset=["FRAME"])
|
|
535
554
|
if len(self.df) == 0:
|
|
536
|
-
|
|
537
|
-
"Warning... The dataset is empty. Please check your filters. Abort..."
|
|
538
|
-
)
|
|
555
|
+
logger.warning("The dataset is empty. Please check your filters.")
|
|
539
556
|
return None
|
|
540
557
|
|
|
541
558
|
pairs = False
|
|
@@ -714,7 +731,7 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
714
731
|
):
|
|
715
732
|
|
|
716
733
|
if "area" in list(track_group.columns):
|
|
717
|
-
|
|
734
|
+
logger.debug("Using 'area' column for first detection")
|
|
718
735
|
feat = track_group["area"].values
|
|
719
736
|
else:
|
|
720
737
|
feat = feature
|
|
@@ -731,7 +748,7 @@ class ConfigSignalPlot(CelldetectiveWidget):
|
|
|
731
748
|
matrix[cid, loc_t + 1] = second_feature
|
|
732
749
|
|
|
733
750
|
cid += 1
|
|
734
|
-
except:
|
|
751
|
+
except (KeyError, IndexError, ValueError):
|
|
735
752
|
pass
|
|
736
753
|
return matrix
|
|
737
754
|
|
|
@@ -838,7 +838,6 @@ class SettingsMeasurements(CelldetectiveSettingsPanel):
|
|
|
838
838
|
self.imshow_digit_window.canvas.draw()
|
|
839
839
|
self.imshow_digit_window.show()
|
|
840
840
|
|
|
841
|
-
|
|
842
841
|
def control_haralick_intensity_histogram(self):
|
|
843
842
|
"""
|
|
844
843
|
Load an image for the first experiment movie found.
|
|
@@ -1123,7 +1122,9 @@ class SettingsMeasurements(CelldetectiveSettingsPanel):
|
|
|
1123
1122
|
# else:
|
|
1124
1123
|
# invert_value = None
|
|
1125
1124
|
|
|
1126
|
-
from celldetective.gui.viewers.spot_detection_viewer import
|
|
1125
|
+
from celldetective.gui.viewers.spot_detection_viewer import (
|
|
1126
|
+
SpotDetectionVisualizer,
|
|
1127
|
+
)
|
|
1127
1128
|
|
|
1128
1129
|
self.spot_visual = SpotDetectionVisualizer(
|
|
1129
1130
|
frame_slider=True,
|
|
@@ -1139,6 +1140,13 @@ class SettingsMeasurements(CelldetectiveSettingsPanel):
|
|
|
1139
1140
|
parent_diameter_le=self.diameter_value,
|
|
1140
1141
|
parent_threshold_le=self.threshold_value,
|
|
1141
1142
|
parent_preprocessing_list=self.spot_preprocessing.list,
|
|
1143
|
+
initial_diameter=self.diameter_value.text(),
|
|
1144
|
+
initial_threshold=self.threshold_value.text(),
|
|
1145
|
+
initial_preprocessing=(
|
|
1146
|
+
self.spot_preprocessing.list.items
|
|
1147
|
+
if self.spot_preprocessing.list.items
|
|
1148
|
+
else None
|
|
1149
|
+
),
|
|
1142
1150
|
# parent_invert_check=self.invert_check,
|
|
1143
1151
|
# invert = self.invert_check.isChecked(),
|
|
1144
1152
|
# invert_value = self.invert_value_le.text().replace(',','.'),
|
|
@@ -19,11 +19,13 @@ from celldetective.utils.data_cleaning import extract_cols_from_table_list
|
|
|
19
19
|
from celldetective.utils.parsing import _extract_labels_from_config
|
|
20
20
|
from celldetective.utils.data_loaders import load_experiment_tables
|
|
21
21
|
import numpy as np
|
|
22
|
+
import pandas as pd
|
|
22
23
|
import os
|
|
23
24
|
import matplotlib.pyplot as plt
|
|
24
25
|
|
|
25
26
|
plt.rcParams["svg.fonttype"] = "none"
|
|
26
27
|
from glob import glob
|
|
28
|
+
from celldetective import get_logger
|
|
27
29
|
from celldetective.gui.base.styles import Styles
|
|
28
30
|
from celldetective.gui.base.components import CelldetectiveWidget
|
|
29
31
|
from matplotlib import colormaps
|
|
@@ -32,6 +34,8 @@ from celldetective.relative_measurements import expand_pair_table
|
|
|
32
34
|
import matplotlib.cm
|
|
33
35
|
from celldetective.neighborhood import extract_neighborhood_in_pair_table
|
|
34
36
|
|
|
37
|
+
logger = get_logger(__name__)
|
|
38
|
+
|
|
35
39
|
|
|
36
40
|
class ConfigSurvival(CelldetectiveWidget):
|
|
37
41
|
"""
|
|
@@ -225,7 +229,9 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
225
229
|
)
|
|
226
230
|
)
|
|
227
231
|
if not tables_pairs:
|
|
228
|
-
|
|
232
|
+
logger.warning(
|
|
233
|
+
"No pair table found. Please compute the pair measurements."
|
|
234
|
+
)
|
|
229
235
|
return None
|
|
230
236
|
self.cols_pairs = extract_cols_from_table_list(tables_pairs)
|
|
231
237
|
|
|
@@ -264,7 +270,7 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
264
270
|
and str(self.population_neigh) not in c
|
|
265
271
|
]
|
|
266
272
|
|
|
267
|
-
|
|
273
|
+
logger.debug(f"Neighborhood keys: {self.neighborhood_keys}")
|
|
268
274
|
|
|
269
275
|
time_idx = np.array(
|
|
270
276
|
[s.startswith("t_") or s.startswith("t0") for s in self.cols_pairs]
|
|
@@ -281,8 +287,8 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
281
287
|
|
|
282
288
|
try:
|
|
283
289
|
time_columns = list(self.all_columns[time_idx])
|
|
284
|
-
except:
|
|
285
|
-
|
|
290
|
+
except (IndexError, KeyError):
|
|
291
|
+
logger.warning("No column starts with 't_' for time reference.")
|
|
286
292
|
self.auto_close = True
|
|
287
293
|
return None
|
|
288
294
|
|
|
@@ -295,8 +301,15 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
295
301
|
|
|
296
302
|
def process_survival(self):
|
|
297
303
|
|
|
304
|
+
# Validate that reference time and time of interest are different
|
|
305
|
+
time_of_reference = self.cbs[1].currentText()
|
|
306
|
+
time_of_interest = self.cbs[2].currentText()
|
|
307
|
+
if time_of_reference == time_of_interest:
|
|
308
|
+
generic_message("Reference time and time of interest must be different.")
|
|
309
|
+
return None
|
|
310
|
+
|
|
298
311
|
self.FrameToMin = float(self.time_calibration_le.text().replace(",", "."))
|
|
299
|
-
self.time_of_interest =
|
|
312
|
+
self.time_of_interest = time_of_interest
|
|
300
313
|
if self.time_of_interest == "t0":
|
|
301
314
|
self.class_of_interest = "class"
|
|
302
315
|
elif self.time_of_interest.startswith("t0"):
|
|
@@ -312,8 +325,22 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
312
325
|
query_text = self.query_le.text()
|
|
313
326
|
if query_text != "":
|
|
314
327
|
self.df = self.df.query(query_text)
|
|
328
|
+
except pd.errors.UndefinedVariableError as e:
|
|
329
|
+
logger.warning(f"Query failed - undefined variable: {e}")
|
|
330
|
+
generic_message(
|
|
331
|
+
f"Query error: column not found.\n{e}\n\nPlease check your column names."
|
|
332
|
+
)
|
|
333
|
+
return None
|
|
334
|
+
except SyntaxError as e:
|
|
335
|
+
logger.warning(f"Query failed - syntax error: {e}")
|
|
336
|
+
generic_message(
|
|
337
|
+
f"Query syntax error: {e}\n\nCheck your query format (e.g., 'column > 100')."
|
|
338
|
+
)
|
|
339
|
+
return None
|
|
315
340
|
except Exception as e:
|
|
316
|
-
|
|
341
|
+
logger.warning(f"Query not applied: {e}")
|
|
342
|
+
generic_message(f"Query could not be applied: {e}")
|
|
343
|
+
return None
|
|
317
344
|
|
|
318
345
|
self.interpret_pos_location()
|
|
319
346
|
|
|
@@ -391,11 +418,12 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
391
418
|
/ self.FrameToMin
|
|
392
419
|
)
|
|
393
420
|
if not 0 < cut_observation_time <= (self.df["FRAME"].max()):
|
|
394
|
-
|
|
421
|
+
logger.warning(
|
|
422
|
+
"Invalid cut time (larger than movie length). Not applied."
|
|
423
|
+
)
|
|
395
424
|
cut_observation_time = None
|
|
396
425
|
except Exception as e:
|
|
397
|
-
|
|
398
|
-
pass
|
|
426
|
+
logger.debug(f"Cut time parsing error: {e}")
|
|
399
427
|
|
|
400
428
|
pairs = False
|
|
401
429
|
if self.neighborhood_keys is not None:
|
|
@@ -403,7 +431,7 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
403
431
|
|
|
404
432
|
# Per position survival
|
|
405
433
|
for block, movie_group in self.df.groupby(["well", "position"]):
|
|
406
|
-
|
|
434
|
+
logger.debug(f"Processing block: {block}")
|
|
407
435
|
ks = compute_survival(
|
|
408
436
|
movie_group,
|
|
409
437
|
self.class_of_interest,
|
|
@@ -413,7 +441,7 @@ class ConfigSurvival(CelldetectiveWidget):
|
|
|
413
441
|
cut_observation_time=cut_observation_time,
|
|
414
442
|
pairs=pairs,
|
|
415
443
|
)
|
|
416
|
-
|
|
444
|
+
logger.debug(f"Survival fit result: {ks}")
|
|
417
445
|
if ks is not None:
|
|
418
446
|
self.df_pos_info.loc[
|
|
419
447
|
self.df_pos_info["pos_path"] == block[1], "survival_fit"
|