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.
Files changed (204) hide show
  1. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/PKG-INFO +1 -1
  2. celldetective-1.5.0b11/celldetective/_version.py +1 -0
  3. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/list_widget.py +25 -10
  4. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/event_annotator.py +32 -3
  5. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/interactions_block.py +11 -2
  6. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/pair_event_annotator.py +39 -31
  7. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_measurements.py +4 -5
  8. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_neighborhood.py +1 -0
  9. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/contour_viewer.py +14 -2
  10. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/measure.py +11 -2
  11. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/masks.py +15 -8
  12. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/PKG-INFO +1 -1
  13. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/SOURCES.txt +2 -0
  14. celldetective-1.5.0b11/tests/gui/test_event_annotator_cleanup.py +310 -0
  15. celldetective-1.5.0b11/tests/test_contour_format.py +299 -0
  16. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_measure.py +87 -0
  17. celldetective-1.5.0b10/celldetective/_version.py +0 -1
  18. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/LICENSE +0 -0
  19. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/README.md +0 -0
  20. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/__init__.py +0 -0
  21. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/__main__.py +0 -0
  22. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/datasets/segmentation_annotations/blank +0 -0
  23. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/datasets/signal_annotations/blank +0 -0
  24. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/event_detection_models.py +0 -0
  25. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/events.py +0 -0
  26. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/exceptions.py +0 -0
  27. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/extra_properties.py +0 -0
  28. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/filters.py +0 -0
  29. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/InitWindow.py +0 -0
  30. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/__init__.py +0 -0
  31. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/about.py +0 -0
  32. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/analyze_block.py +0 -0
  33. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/__init__.py +0 -0
  34. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/channel_norm_generator.py +0 -0
  35. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/components.py +0 -0
  36. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/feature_choice.py +0 -0
  37. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/figure_canvas.py +0 -0
  38. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/styles.py +0 -0
  39. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base/utils.py +0 -0
  40. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/base_annotator.py +0 -0
  41. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/classifier_widget.py +0 -0
  42. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/configure_new_exp.py +0 -0
  43. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/control_panel.py +0 -0
  44. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/dynamic_progress.py +0 -0
  45. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/generic_signal_plot.py +0 -0
  46. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/gui_utils.py +0 -0
  47. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  48. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  49. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/cell-populations.json +0 -0
  50. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/exp-structure.json +0 -0
  51. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/feature-btrack.json +0 -0
  52. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/neighborhood.json +0 -0
  53. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  54. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/preprocessing.json +0 -0
  55. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/propagate-classification.json +0 -0
  56. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/track-postprocessing.json +0 -0
  57. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/help/tracking.json +0 -0
  58. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
  59. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/json_readers.py +0 -0
  60. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/__init__.py +0 -0
  61. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
  62. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
  63. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/local_correction_layout.py +0 -0
  64. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/model_fit_layout.py +0 -0
  65. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/operation_layout.py +0 -0
  66. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
  67. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/measure_annotator.py +0 -0
  68. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/plot_measurements.py +0 -0
  69. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/plot_signals_ui.py +0 -0
  70. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/preprocessing_block.py +0 -0
  71. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/process_block.py +0 -0
  72. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/seg_model_loader.py +0 -0
  73. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/__init__.py +0 -0
  74. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
  75. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
  76. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
  77. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_base.py +0 -0
  78. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
  79. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_segmentation.py +0 -0
  80. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
  81. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
  82. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_settings_tracking.py +0 -0
  83. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/settings/_stardist_model_params.py +0 -0
  84. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/survival_ui.py +0 -0
  85. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/tableUI.py +0 -0
  86. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/__init__.py +0 -0
  87. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_maths.py +0 -0
  88. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_merge_groups.py +0 -0
  89. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
  90. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_query_table.py +0 -0
  91. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/table_ops/_rename_col.py +0 -0
  92. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/thresholds_gui.py +0 -0
  93. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/__init__.py +0 -0
  94. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/base_viewer.py +0 -0
  95. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
  96. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/size_viewer.py +0 -0
  97. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/spot_detection_viewer.py +0 -0
  98. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/viewers/threshold_viewer.py +0 -0
  99. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/gui/workers.py +0 -0
  100. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/logo-large.png +0 -0
  101. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/logo.png +0 -0
  102. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/signals_icon.png +0 -0
  103. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash-test.png +0 -0
  104. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash.png +0 -0
  105. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/splash0.png +0 -0
  106. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/survival2.png +0 -0
  107. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/vignette_signals2.png +0 -0
  108. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/icons/vignette_signals2.svg +0 -0
  109. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/links/zenodo.json +0 -0
  110. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/log_manager.py +0 -0
  111. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/pair_signal_detection/blank +0 -0
  112. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_effectors/blank +0 -0
  113. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_generic/blank +0 -0
  114. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/segmentation_targets/blank +0 -0
  115. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/signal_detection/blank +0 -0
  116. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  117. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/mcf7.json +0 -0
  118. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  119. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/ricm.json +0 -0
  120. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/models/tracking_configs/ricm2.json +0 -0
  121. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/napari/__init__.py +0 -0
  122. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/napari/utils.py +0 -0
  123. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/neighborhood.py +0 -0
  124. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/preprocessing.py +0 -0
  125. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/__init__.py +0 -0
  126. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/background_correction.py +0 -0
  127. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/compute_neighborhood.py +0 -0
  128. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/detect_events.py +0 -0
  129. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/downloader.py +0 -0
  130. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/load_table.py +0 -0
  131. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/measure_cells.py +0 -0
  132. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/segment_cells.py +0 -0
  133. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/track_cells.py +0 -0
  134. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/train_segmentation_model.py +0 -0
  135. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/train_signal_model.py +0 -0
  136. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/processes/unified_process.py +0 -0
  137. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/__init__.py +0 -0
  138. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/_regionprops.py +0 -0
  139. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/regionprops/props.json +0 -0
  140. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/relative_measurements.py +0 -0
  141. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/analyze_signals.py +0 -0
  142. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/measure_cells.py +0 -0
  143. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/measure_relative.py +0 -0
  144. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/segment_cells.py +0 -0
  145. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  146. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/track_cells.py +0 -0
  147. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/train_segmentation_model.py +0 -0
  148. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/scripts/train_signal_model.py +0 -0
  149. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/segmentation.py +0 -0
  150. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/signals.py +0 -0
  151. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/tracking.py +0 -0
  152. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/__init__.py +0 -0
  153. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/cellpose_utils/__init__.py +0 -0
  154. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/color_mappings.py +0 -0
  155. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/data_cleaning.py +0 -0
  156. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/data_loaders.py +0 -0
  157. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/dataset_helpers.py +0 -0
  158. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/downloaders.py +0 -0
  159. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/event_detection/__init__.py +0 -0
  160. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/experiment.py +0 -0
  161. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_augmenters.py +0 -0
  162. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_cleaning.py +0 -0
  163. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_loaders.py +0 -0
  164. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/image_transforms.py +0 -0
  165. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/io.py +0 -0
  166. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/mask_cleaning.py +0 -0
  167. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/mask_transforms.py +0 -0
  168. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/maths.py +0 -0
  169. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/model_getters.py +0 -0
  170. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/model_loaders.py +0 -0
  171. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/normalization.py +0 -0
  172. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/parsing.py +0 -0
  173. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/plots/__init__.py +0 -0
  174. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/plots/regression.py +0 -0
  175. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/resources.py +0 -0
  176. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/stardist_utils/__init__.py +0 -0
  177. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/stats.py +0 -0
  178. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective/utils/types.py +0 -0
  179. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/dependency_links.txt +0 -0
  180. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/entry_points.txt +0 -0
  181. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/not-zip-safe +0 -0
  182. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/requires.txt +0 -0
  183. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/celldetective.egg-info/top_level.txt +0 -0
  184. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/setup.cfg +0 -0
  185. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/setup.py +0 -0
  186. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/__init__.py +0 -0
  187. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/__init__.py +0 -0
  188. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_enhancements.py +0 -0
  189. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_measure_annotator_bugfix.py +0 -0
  190. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_new_project.py +0 -0
  191. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_project.py +0 -0
  192. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/gui/test_spot_detection_viewer.py +0 -0
  193. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_cellpose_fallback.py +0 -0
  194. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_events.py +0 -0
  195. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_filters.py +0 -0
  196. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_io.py +0 -0
  197. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_neighborhood.py +0 -0
  198. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_notebooks.py +0 -0
  199. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_partial_install.py +0 -0
  200. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_preprocessing.py +0 -0
  201. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_segmentation.py +0 -0
  202. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_signals.py +0 -0
  203. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_tracking.py +0 -0
  204. {celldetective-1.5.0b10 → celldetective-1.5.0b11}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b10
3
+ Version: 1.5.0b11
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -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-max')
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
- if len(self.list_widget.item(x).text().split("-")) == 2:
104
- if self.list_widget.item(x).text()[0] == "-":
105
- items.append(self.dtype(self.list_widget.item(x).text()))
106
- else:
107
- minn, maxx = self.list_widget.item(x).text().split("-")
108
- to_add = [self.dtype(minn), self.dtype(maxx)]
109
- items.append(to_add)
110
- else:
111
- items.append(self.dtype(self.list_widget.item(x).text()))
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
- del self.stack
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
- self.pair_event_annotator = PairEventAnnotator(self)
688
- self.pair_event_annotator.show()
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
- del self.stack
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) | isinstance(d, float):
687
+ if isinstance(d, (int, float)):
688
688
  distances.append(str(int(d)))
689
689
  elif isinstance(d, list):
690
- distances.append(
691
- str(int(d[0])) + "-" + str(int(d[1]))
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
 
@@ -213,6 +213,7 @@ class SettingsNeighborhood(CelldetectiveWidget):
213
213
  channel_names=self.attr_parent.exp_channels,
214
214
  n_channels=self.attr_parent.nbr_channels,
215
215
  PxToUm=1,
216
+ single_value_mode=True,
216
217
  )
217
218
  self.viewer.show()
218
219
 
@@ -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.parent_list_widget.addItems([str(self.edge_slider.value())])
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 + extra)
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 extra:
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
- parts = distance.split("-")
79
- # Assumption: "A-B" where A, B positive radii for OUTER annulus.
80
- r1 = float(parts[0])
81
- r2 = float(parts[1])
82
- min_r = -max(r1, r2)
83
- max_r = -min(r1, r2)
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(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b10
3
+ Version: 1.5.0b11
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -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