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.
Files changed (204) hide show
  1. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/PKG-INFO +1 -1
  2. celldetective-1.5.0b10/celldetective/_version.py +1 -0
  3. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/generic_signal_plot.py +14 -14
  4. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/gui_utils.py +27 -6
  5. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/plot_signals_ui.py +32 -15
  6. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_measurements.py +10 -2
  7. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/survival_ui.py +39 -11
  8. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/tableUI.py +69 -148
  9. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/thresholds_gui.py +45 -5
  10. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/spot_detection_viewer.py +150 -27
  11. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/measure.py +11 -11
  12. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/data_cleaning.py +7 -3
  13. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/PKG-INFO +1 -1
  14. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/SOURCES.txt +2 -1
  15. celldetective-1.5.0b10/tests/gui/test_spot_detection_viewer.py +394 -0
  16. celldetective-1.5.0b10/tests/test_measure.py +243 -0
  17. celldetective-1.5.0b10/tests/test_signals.py +154 -0
  18. celldetective-1.5.0b8/celldetective/_version.py +0 -1
  19. celldetective-1.5.0b8/tests/test_measure.py +0 -141
  20. celldetective-1.5.0b8/tests/test_signals.py +0 -135
  21. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/LICENSE +0 -0
  22. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/README.md +0 -0
  23. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/__init__.py +0 -0
  24. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/__main__.py +0 -0
  25. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/datasets/segmentation_annotations/blank +0 -0
  26. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/datasets/signal_annotations/blank +0 -0
  27. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/event_detection_models.py +0 -0
  28. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/events.py +0 -0
  29. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/exceptions.py +0 -0
  30. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/extra_properties.py +0 -0
  31. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/filters.py +0 -0
  32. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/InitWindow.py +0 -0
  33. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/__init__.py +0 -0
  34. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/about.py +0 -0
  35. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/analyze_block.py +0 -0
  36. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/__init__.py +0 -0
  37. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/channel_norm_generator.py +0 -0
  38. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/components.py +0 -0
  39. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/feature_choice.py +0 -0
  40. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/figure_canvas.py +0 -0
  41. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/list_widget.py +1 -1
  42. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/styles.py +0 -0
  43. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base/utils.py +0 -0
  44. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/base_annotator.py +0 -0
  45. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/classifier_widget.py +0 -0
  46. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/configure_new_exp.py +0 -0
  47. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/control_panel.py +0 -0
  48. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/dynamic_progress.py +0 -0
  49. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/event_annotator.py +0 -0
  50. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  51. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  52. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/cell-populations.json +0 -0
  53. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/exp-structure.json +0 -0
  54. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/feature-btrack.json +0 -0
  55. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/neighborhood.json +0 -0
  56. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  57. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/preprocessing.json +0 -0
  58. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/propagate-classification.json +0 -0
  59. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/track-postprocessing.json +0 -0
  60. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/help/tracking.json +0 -0
  61. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/interactions_block.py +0 -0
  62. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
  63. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/json_readers.py +0 -0
  64. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/__init__.py +0 -0
  65. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
  66. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
  67. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/local_correction_layout.py +0 -0
  68. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/model_fit_layout.py +0 -0
  69. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/operation_layout.py +0 -0
  70. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
  71. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/measure_annotator.py +0 -0
  72. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/pair_event_annotator.py +0 -0
  73. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/plot_measurements.py +0 -0
  74. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/preprocessing_block.py +0 -0
  75. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/process_block.py +0 -0
  76. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/seg_model_loader.py +0 -0
  77. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/__init__.py +0 -0
  78. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
  79. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
  80. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
  81. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_base.py +0 -0
  82. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
  83. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_neighborhood.py +0 -0
  84. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_segmentation.py +0 -0
  85. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
  86. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
  87. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_settings_tracking.py +0 -0
  88. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/settings/_stardist_model_params.py +0 -0
  89. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/__init__.py +0 -0
  90. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_maths.py +0 -0
  91. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_merge_groups.py +0 -0
  92. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
  93. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_query_table.py +0 -0
  94. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/table_ops/_rename_col.py +0 -0
  95. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/__init__.py +0 -0
  96. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/base_viewer.py +0 -0
  97. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
  98. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/contour_viewer.py +0 -0
  99. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/size_viewer.py +0 -0
  100. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/viewers/threshold_viewer.py +0 -0
  101. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/gui/workers.py +0 -0
  102. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/logo-large.png +0 -0
  103. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/logo.png +0 -0
  104. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/signals_icon.png +0 -0
  105. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash-test.png +0 -0
  106. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash.png +0 -0
  107. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/splash0.png +0 -0
  108. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/survival2.png +0 -0
  109. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/vignette_signals2.png +0 -0
  110. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/icons/vignette_signals2.svg +0 -0
  111. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/links/zenodo.json +0 -0
  112. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/log_manager.py +0 -0
  113. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/pair_signal_detection/blank +0 -0
  114. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_effectors/blank +0 -0
  115. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_generic/blank +0 -0
  116. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/segmentation_targets/blank +0 -0
  117. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/signal_detection/blank +0 -0
  118. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  119. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/mcf7.json +0 -0
  120. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  121. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/ricm.json +0 -0
  122. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/models/tracking_configs/ricm2.json +0 -0
  123. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/napari/__init__.py +0 -0
  124. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/napari/utils.py +0 -0
  125. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/neighborhood.py +0 -0
  126. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/preprocessing.py +0 -0
  127. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/__init__.py +0 -0
  128. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/background_correction.py +0 -0
  129. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/compute_neighborhood.py +0 -0
  130. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/detect_events.py +0 -0
  131. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/downloader.py +0 -0
  132. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/load_table.py +0 -0
  133. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/measure_cells.py +0 -0
  134. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/segment_cells.py +0 -0
  135. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/track_cells.py +0 -0
  136. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/train_segmentation_model.py +0 -0
  137. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/train_signal_model.py +0 -0
  138. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/processes/unified_process.py +0 -0
  139. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/__init__.py +0 -0
  140. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/_regionprops.py +0 -0
  141. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/regionprops/props.json +0 -0
  142. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/relative_measurements.py +0 -0
  143. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/analyze_signals.py +0 -0
  144. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/measure_cells.py +0 -0
  145. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/measure_relative.py +0 -0
  146. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/segment_cells.py +0 -0
  147. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  148. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/track_cells.py +0 -0
  149. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/train_segmentation_model.py +0 -0
  150. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/scripts/train_signal_model.py +0 -0
  151. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/segmentation.py +0 -0
  152. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/signals.py +0 -0
  153. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/tracking.py +0 -0
  154. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/__init__.py +0 -0
  155. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/cellpose_utils/__init__.py +0 -0
  156. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/color_mappings.py +0 -0
  157. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/data_loaders.py +0 -0
  158. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/dataset_helpers.py +0 -0
  159. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/downloaders.py +0 -0
  160. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/event_detection/__init__.py +0 -0
  161. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/experiment.py +0 -0
  162. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_augmenters.py +0 -0
  163. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_cleaning.py +0 -0
  164. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_loaders.py +0 -0
  165. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/image_transforms.py +0 -0
  166. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/io.py +0 -0
  167. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/mask_cleaning.py +0 -0
  168. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/mask_transforms.py +0 -0
  169. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/masks.py +0 -0
  170. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/maths.py +0 -0
  171. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/model_getters.py +0 -0
  172. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/model_loaders.py +0 -0
  173. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/normalization.py +0 -0
  174. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/parsing.py +0 -0
  175. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/plots/__init__.py +0 -0
  176. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/plots/regression.py +0 -0
  177. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/resources.py +0 -0
  178. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/stardist_utils/__init__.py +0 -0
  179. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/stats.py +0 -0
  180. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective/utils/types.py +0 -0
  181. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/dependency_links.txt +0 -0
  182. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/entry_points.txt +0 -0
  183. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/not-zip-safe +0 -0
  184. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/requires.txt +0 -0
  185. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/celldetective.egg-info/top_level.txt +0 -0
  186. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/setup.cfg +0 -0
  187. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/setup.py +0 -0
  188. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/__init__.py +0 -0
  189. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/__init__.py +0 -0
  190. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_enhancements.py +0 -0
  191. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_measure_annotator_bugfix.py +0 -0
  192. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_new_project.py +0 -0
  193. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/gui/test_project.py +0 -0
  194. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_cellpose_fallback.py +0 -0
  195. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_events.py +0 -0
  196. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_filters.py +0 -0
  197. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_io.py +0 -0
  198. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_neighborhood.py +0 -0
  199. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_notebooks.py +0 -0
  200. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_partial_install.py +0 -0
  201. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_preprocessing.py +0 -0
  202. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_segmentation.py +0 -0
  203. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_tracking.py +0 -0
  204. {celldetective-1.5.0b8 → celldetective-1.5.0b10}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b8
3
+ Version: 1.5.0b10
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.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
- print(f"Found {len(self.metafiles)} metadata files...")
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
- print(f"Trouble loading metadata: error {e}...")
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 Exception as e:
519
- pass
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
- self.plot_widget.canvas.draw_idle()
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
- print(f"{e=}")
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__(self, parent_window=None, apply_btn_option=True, *args, **kwargs):
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
- button_layout.addWidget(self.preprocess_lbl, 85, alignment=Qt.AlignLeft)
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__(apply_btn_option=False, *args, **kwargs)
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
- print("No pair table found... please compute the pair measurements...")
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
- print(f"{class_idx=} {time_idx=} {self.all_columns=}")
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
- print(f"L266 columns not found {e}")
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
- print(e, " The query is misunderstood and will not be applied...")
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
- print(f"{e=}")
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
- print(f"Time calibration set to 1 frame = {self.FrameToMin} min...")
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
- print(f"{class_col=}")
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
- print("No table could be found...")
516
- generic_message("No table could be found to compute survival...")
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
- print(
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
- print("area in list")
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 SpotDetectionVisualizer
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
- print("No pair table found... please compute the pair measurements...")
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
- print(f"{self.neighborhood_keys=}")
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
- print("no column starts with t")
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 = self.cbs[2].currentText()
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
- print(e, " The query is misunderstood and will not be applied...")
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
- print("Invalid cut time (larger than movie length)... Not applied.")
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
- print(f"{e=}")
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
- print(f"{block=}")
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
- print(f"{ks=}")
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"