celldetective 1.5.0b3__tar.gz → 1.5.0b4__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 (199) hide show
  1. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/PKG-INFO +1 -1
  2. celldetective-1.5.0b4/celldetective/_version.py +1 -0
  3. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/measure_annotator.py +3 -3
  4. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_segmentation_model_training.py +6 -0
  5. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/base_viewer.py +5 -0
  6. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/cellpose_utils/__init__.py +23 -7
  7. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/PKG-INFO +1 -1
  8. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/SOURCES.txt +2 -0
  9. celldetective-1.5.0b4/tests/gui/test_measure_annotator_bugfix.py +130 -0
  10. celldetective-1.5.0b4/tests/test_cellpose_fallback.py +101 -0
  11. celldetective-1.5.0b3/celldetective/_version.py +0 -1
  12. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/LICENSE +0 -0
  13. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/README.md +0 -0
  14. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/__init__.py +0 -0
  15. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/__main__.py +0 -0
  16. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/datasets/segmentation_annotations/blank +0 -0
  17. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/datasets/signal_annotations/blank +0 -0
  18. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/events.py +0 -0
  19. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/exceptions.py +0 -0
  20. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/extra_properties.py +0 -0
  21. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/filters.py +0 -0
  22. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/InitWindow.py +0 -0
  23. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/__init__.py +0 -0
  24. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/about.py +0 -0
  25. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/analyze_block.py +0 -0
  26. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/__init__.py +0 -0
  27. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/channel_norm_generator.py +0 -0
  28. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/components.py +0 -0
  29. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/feature_choice.py +0 -0
  30. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/figure_canvas.py +0 -0
  31. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/list_widget.py +0 -0
  32. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/styles.py +0 -0
  33. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base/utils.py +0 -0
  34. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/base_annotator.py +0 -0
  35. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/classifier_widget.py +0 -0
  36. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/configure_new_exp.py +0 -0
  37. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/control_panel.py +0 -0
  38. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/dynamic_progress.py +0 -0
  39. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/event_annotator.py +0 -0
  40. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/generic_signal_plot.py +0 -0
  41. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/gui_utils.py +0 -0
  42. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  43. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  44. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/cell-populations.json +0 -0
  45. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/exp-structure.json +0 -0
  46. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/feature-btrack.json +0 -0
  47. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/neighborhood.json +0 -0
  48. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  49. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/preprocessing.json +0 -0
  50. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/propagate-classification.json +0 -0
  51. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/track-postprocessing.json +0 -0
  52. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/help/tracking.json +0 -0
  53. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/interactions_block.py +0 -0
  54. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
  55. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/json_readers.py +0 -0
  56. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/__init__.py +0 -0
  57. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
  58. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
  59. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/local_correction_layout.py +0 -0
  60. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/model_fit_layout.py +0 -0
  61. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/operation_layout.py +0 -0
  62. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
  63. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/pair_event_annotator.py +0 -0
  64. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/plot_measurements.py +0 -0
  65. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/plot_signals_ui.py +0 -0
  66. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/preprocessing_block.py +0 -0
  67. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/process_block.py +0 -0
  68. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/seg_model_loader.py +0 -0
  69. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/__init__.py +0 -0
  70. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
  71. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
  72. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
  73. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_base.py +0 -0
  74. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
  75. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_measurements.py +0 -0
  76. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_neighborhood.py +0 -0
  77. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_segmentation.py +0 -0
  78. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
  79. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_settings_tracking.py +0 -0
  80. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/settings/_stardist_model_params.py +0 -0
  81. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/survival_ui.py +0 -0
  82. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/tableUI.py +0 -0
  83. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/__init__.py +0 -0
  84. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/_maths.py +0 -0
  85. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/_merge_groups.py +0 -0
  86. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
  87. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/_query_table.py +0 -0
  88. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/table_ops/_rename_col.py +0 -0
  89. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/thresholds_gui.py +0 -0
  90. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/__init__.py +0 -0
  91. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
  92. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/contour_viewer.py +0 -0
  93. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/size_viewer.py +0 -0
  94. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/spot_detection_viewer.py +0 -0
  95. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/viewers/threshold_viewer.py +0 -0
  96. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/gui/workers.py +0 -0
  97. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/logo-large.png +0 -0
  98. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/logo.png +0 -0
  99. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/signals_icon.png +0 -0
  100. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/splash-test.png +0 -0
  101. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/splash.png +0 -0
  102. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/splash0.png +0 -0
  103. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/survival2.png +0 -0
  104. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/vignette_signals2.png +0 -0
  105. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/icons/vignette_signals2.svg +0 -0
  106. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/links/zenodo.json +0 -0
  107. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/log_manager.py +0 -0
  108. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/measure.py +0 -0
  109. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/pair_signal_detection/blank +0 -0
  110. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/segmentation_effectors/blank +0 -0
  111. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/segmentation_generic/blank +0 -0
  112. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/segmentation_targets/blank +0 -0
  113. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/signal_detection/blank +0 -0
  114. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  115. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/tracking_configs/mcf7.json +0 -0
  116. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  117. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/tracking_configs/ricm.json +0 -0
  118. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/models/tracking_configs/ricm2.json +0 -0
  119. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/napari/__init__.py +0 -0
  120. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/napari/utils.py +0 -0
  121. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/neighborhood.py +0 -0
  122. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/preprocessing.py +0 -0
  123. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/__init__.py +0 -0
  124. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/background_correction.py +0 -0
  125. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/compute_neighborhood.py +0 -0
  126. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/detect_events.py +0 -0
  127. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/downloader.py +0 -0
  128. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/load_table.py +0 -0
  129. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/measure_cells.py +0 -0
  130. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/segment_cells.py +0 -0
  131. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/track_cells.py +0 -0
  132. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/train_segmentation_model.py +0 -0
  133. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/train_signal_model.py +0 -0
  134. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/processes/unified_process.py +0 -0
  135. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/regionprops/__init__.py +0 -0
  136. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/regionprops/_regionprops.py +0 -0
  137. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/regionprops/props.json +0 -0
  138. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/relative_measurements.py +0 -0
  139. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/analyze_signals.py +0 -0
  140. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/measure_cells.py +0 -0
  141. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/measure_relative.py +0 -0
  142. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/segment_cells.py +0 -0
  143. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  144. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/track_cells.py +0 -0
  145. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/train_segmentation_model.py +0 -0
  146. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/scripts/train_signal_model.py +0 -0
  147. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/segmentation.py +0 -0
  148. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/signals.py +0 -0
  149. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/tracking.py +0 -0
  150. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/__init__.py +0 -0
  151. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/color_mappings.py +0 -0
  152. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/data_cleaning.py +0 -0
  153. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/data_loaders.py +0 -0
  154. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/dataset_helpers.py +0 -0
  155. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/downloaders.py +0 -0
  156. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/event_detection/__init__.py +0 -0
  157. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/experiment.py +0 -0
  158. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/image_augmenters.py +0 -0
  159. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/image_cleaning.py +0 -0
  160. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/image_loaders.py +0 -0
  161. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/image_transforms.py +0 -0
  162. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/io.py +0 -0
  163. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/mask_cleaning.py +0 -0
  164. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/mask_transforms.py +0 -0
  165. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/masks.py +0 -0
  166. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/maths.py +0 -0
  167. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/model_getters.py +0 -0
  168. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/model_loaders.py +0 -0
  169. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/normalization.py +0 -0
  170. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/parsing.py +0 -0
  171. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/plots/__init__.py +0 -0
  172. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/plots/regression.py +0 -0
  173. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/resources.py +0 -0
  174. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/stardist_utils/__init__.py +0 -0
  175. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/stats.py +0 -0
  176. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective/utils/types.py +0 -0
  177. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/dependency_links.txt +0 -0
  178. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/entry_points.txt +0 -0
  179. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/not-zip-safe +0 -0
  180. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/requires.txt +0 -0
  181. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/celldetective.egg-info/top_level.txt +0 -0
  182. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/setup.cfg +0 -0
  183. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/setup.py +0 -0
  184. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/__init__.py +0 -0
  185. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/gui/__init__.py +0 -0
  186. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/gui/test_enhancements.py +0 -0
  187. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/gui/test_new_project.py +0 -0
  188. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/gui/test_project.py +0 -0
  189. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_events.py +0 -0
  190. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_filters.py +0 -0
  191. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_io.py +0 -0
  192. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_measure.py +0 -0
  193. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_neighborhood.py +0 -0
  194. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_notebooks.py +0 -0
  195. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_preprocessing.py +0 -0
  196. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_segmentation.py +0 -0
  197. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_signals.py +0 -0
  198. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_tracking.py +0 -0
  199. {celldetective-1.5.0b3 → celldetective-1.5.0b4}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b3
3
+ Version: 1.5.0b4
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.0b4"
@@ -950,9 +950,9 @@ class MeasureAnnotator(BaseAnnotator):
950
950
  ].to_numpy()
951
951
  )
952
952
  self.colors.append(
953
- self.df_tracks.loc[
954
- self.df_tracks["FRAME"] == t, ["group_color"]
955
- ].to_numpy()
953
+ self.df_tracks.loc[self.df_tracks["FRAME"] == t, ["group_color"]]
954
+ .to_numpy()
955
+ .copy()
956
956
  )
957
957
  if "TRACK_ID" in self.df_tracks.columns:
958
958
  self.tracks.append(
@@ -84,6 +84,12 @@ class SettingsSegmentationModelTraining(CelldetectiveSettingsPanel):
84
84
  self.bg_loader = BackgroundLoader()
85
85
  self.bg_loader.start()
86
86
 
87
+ def closeEvent(self, event):
88
+ if self.bg_loader.isRunning():
89
+ logger.info("Waiting for background loader to finish...")
90
+ self.bg_loader.wait()
91
+ super().closeEvent(event)
92
+
87
93
  def _add_to_layout(self):
88
94
 
89
95
  self._layout.addWidget(self.model_frame)
@@ -111,6 +111,11 @@ class StackLoader(QThread):
111
111
  # If nothing to load, wait
112
112
  self.mutex.lock()
113
113
  self.condition.wait(self.mutex, 500) # Wait 500ms or until new priority
114
+
115
+ if not self.running:
116
+ self.mutex.unlock()
117
+ break
118
+
114
119
  self.mutex.unlock()
115
120
 
116
121
 
@@ -113,13 +113,29 @@ def _prep_cellpose_model(
113
113
 
114
114
  from cellpose.models import CellposeModel
115
115
 
116
- model = CellposeModel(
117
- gpu=use_gpu,
118
- device=device,
119
- pretrained_model=path + model_name,
120
- model_type=None,
121
- nchan=n_channels,
122
- ) # diam_mean=30.0,
116
+ try:
117
+ model = CellposeModel(
118
+ gpu=use_gpu,
119
+ device=device,
120
+ pretrained_model=path + model_name,
121
+ model_type=None,
122
+ nchan=n_channels,
123
+ ) # diam_mean=30.0,
124
+ except AssertionError as e:
125
+ if use_gpu:
126
+ print(
127
+ f"[WARNING] Could not load Cellpose model with GPU ({e}). Retrying with CPU..."
128
+ )
129
+ device = torch.device("cpu")
130
+ model = CellposeModel(
131
+ gpu=False,
132
+ device=device,
133
+ pretrained_model=path + model_name,
134
+ model_type=None,
135
+ nchan=n_channels,
136
+ )
137
+ else:
138
+ raise e
123
139
  if scale is None:
124
140
  scale_model = model.diam_mean / model.diam_labels
125
141
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b3
3
+ Version: 1.5.0b4
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -177,6 +177,7 @@ celldetective/utils/plots/__init__.py
177
177
  celldetective/utils/plots/regression.py
178
178
  celldetective/utils/stardist_utils/__init__.py
179
179
  tests/__init__.py
180
+ tests/test_cellpose_fallback.py
180
181
  tests/test_events.py
181
182
  tests/test_filters.py
182
183
  tests/test_io.py
@@ -190,5 +191,6 @@ tests/test_tracking.py
190
191
  tests/test_utils.py
191
192
  tests/gui/__init__.py
192
193
  tests/gui/test_enhancements.py
194
+ tests/gui/test_measure_annotator_bugfix.py
193
195
  tests/gui/test_new_project.py
194
196
  tests/gui/test_project.py
@@ -0,0 +1,130 @@
1
+ import pytest
2
+ import os
3
+ import pandas as pd
4
+ import numpy as np
5
+ import logging
6
+ from PyQt5 import QtCore
7
+ from celldetective.gui.InitWindow import AppInitWindow
8
+ from celldetective.gui.measure_annotator import MeasureAnnotator
9
+ from celldetective import get_software_location
10
+ from unittest.mock import patch
11
+ import shutil
12
+ import tifffile
13
+
14
+ software_location = get_software_location()
15
+
16
+
17
+ @pytest.fixture(autouse=True)
18
+ def disable_logging():
19
+ """Disable all logging to avoid Windows OSError with pytest capture."""
20
+ logger = logging.getLogger()
21
+ try:
22
+ logging.disable(logging.CRITICAL)
23
+ yield
24
+ finally:
25
+ logging.disable(logging.NOTSET)
26
+
27
+
28
+ @pytest.fixture
29
+ def app(qtbot):
30
+ test_app = AppInitWindow(software_location=software_location)
31
+ qtbot.addWidget(test_app)
32
+ return test_app
33
+
34
+
35
+ def create_dummy_movie(exp_dir, well="W1", pos="100", prefix="sample", frames=5):
36
+ movie_dir = os.path.join(exp_dir, well, pos, "movie")
37
+ os.makedirs(movie_dir, exist_ok=True)
38
+ # Use a single multi-page TIF as expected by locate_stack
39
+ movie_path = os.path.join(movie_dir, f"{prefix}.tif")
40
+ img = np.zeros((frames, 100, 100), dtype=np.uint16)
41
+ tifffile.imwrite(movie_path, img)
42
+
43
+
44
+ def test_measure_annotator_colors_writable(app, qtbot, tmp_path):
45
+ """
46
+ Test that self.colors in MeasureAnnotator contains writable arrays.
47
+ This verifies the fix for 'ValueError: assignment destination is read-only'.
48
+ """
49
+ exp_dir = str(tmp_path / "ExperimentColors")
50
+ os.makedirs(os.path.join(exp_dir, "W1", "100", "output", "tables"), exist_ok=True)
51
+ os.makedirs(os.path.join(exp_dir, "configs"), exist_ok=True)
52
+
53
+ with open(os.path.join(exp_dir, "config.ini"), "w") as f:
54
+ f.write(
55
+ "[MovieSettings]\nmovie_prefix = sample\nlen_movie = 10\nshape_x = 100\nshape_y = 100\npxtoum = 1.0\nframetomin = 1.0\n"
56
+ )
57
+ f.write(
58
+ "[Labels]\nconcentrations = 0\ncell_types = dummy\nantibodies = none\npharmaceutical_agents = none\n[Channels]\nChannel1 = 0\n"
59
+ )
60
+
61
+ create_dummy_movie(exp_dir, well="W1", pos="100", prefix="sample", frames=10)
62
+
63
+ # DataFrame with tracks
64
+ df = pd.DataFrame(
65
+ {
66
+ "TRACK_ID": [1, 1],
67
+ "FRAME": [0, 1],
68
+ "group_experimental": ["A", "A"],
69
+ "area": [100.0, 110.0],
70
+ "POSITION_X": [10, 12],
71
+ "POSITION_Y": [10, 12],
72
+ "status": [0, 0], # Ensure status column exists
73
+ }
74
+ )
75
+ # The 'group_color' column is usually generated inside MeasureAnnotator,
76
+ # but let's see if we need to let it generate it.
77
+ # MeasureAnnotator calls 'color_from_state', then assigns 'group_color'.
78
+
79
+ traj_path = os.path.join(
80
+ exp_dir, "W1", "100", "output", "tables", "trajectories_effectors.csv"
81
+ )
82
+ df.to_csv(traj_path, index=False)
83
+
84
+ app.experiment_path_selection.setText(exp_dir)
85
+ qtbot.mouseClick(app.validate_button, QtCore.Qt.LeftButton)
86
+ qtbot.waitUntil(lambda: hasattr(app, "control_panel"), timeout=30000)
87
+
88
+ cp = app.control_panel
89
+ p0 = cp.ProcessPopulations[0]
90
+
91
+ qtbot.waitUntil(lambda: cp.well_list.count() > 0, timeout=30000)
92
+
93
+ with patch.object(cp.well_list, "getSelectedIndices", return_value=[0]):
94
+ with patch.object(cp.position_list, "getSelectedIndices", return_value=[0]):
95
+
96
+ cp.update_position_options()
97
+ qtbot.wait(500)
98
+
99
+ qtbot.mouseClick(p0.check_measurements_btn, QtCore.Qt.LeftButton)
100
+
101
+ try:
102
+ qtbot.waitUntil(lambda: hasattr(p0, "measure_annotator"), timeout=15000)
103
+ except Exception:
104
+ print("DEBUG: measure_annotator not found on p0.")
105
+ raise
106
+
107
+ annotator = p0.measure_annotator
108
+ qtbot.wait(1000)
109
+ assert annotator is not None
110
+
111
+ # Verify that self.colors arrays are writable
112
+ # extract_scatter_from_trajectories should have been called during init
113
+ assert hasattr(annotator, "colors")
114
+ assert len(annotator.colors) > 0
115
+
116
+ # Check the first frame's colors
117
+ colors_frame_0 = annotator.colors[0]
118
+
119
+ # Check flags
120
+ assert colors_frame_0.flags[
121
+ "WRITEABLE"
122
+ ], "self.colors arrays must be writable"
123
+
124
+ # Try to modify (should not raise ValueError)
125
+ try:
126
+ colors_frame_0[0] = "lime"
127
+ except ValueError as e:
128
+ pytest.fail(f"Could not modify colors array: {e}")
129
+
130
+ annotator.close()
@@ -0,0 +1,101 @@
1
+ import unittest
2
+ from unittest.mock import MagicMock, patch
3
+ import sys
4
+
5
+ # Do not import torch here to avoid WinError 1114 if environment is broken.
6
+ # We will mock it in setUp.
7
+
8
+
9
+ class TestCellposeFallback(unittest.TestCase):
10
+
11
+ def setUp(self):
12
+ # Create a mock for torch
13
+ self.mock_torch = MagicMock()
14
+ self.mock_torch.device = MagicMock(return_value="cpu")
15
+ self.mock_torch.cuda = MagicMock()
16
+ self.mock_torch.cuda.is_available.return_value = (
17
+ False # Default to CPU environment simulation
18
+ )
19
+
20
+ # Patch modules so that 'import torch' and 'import cellpose' work with our mocks
21
+ # We need to patch 'torch' in sys.modules BEFORE importing code that uses it.
22
+ self.modules_patcher = patch.dict(
23
+ sys.modules,
24
+ {
25
+ "torch": self.mock_torch,
26
+ "cellpose": MagicMock(),
27
+ "cellpose.models": MagicMock(),
28
+ },
29
+ )
30
+ self.modules_patcher.start()
31
+
32
+ # Define a mock CellposeModel that we can control
33
+ self.MockCellposeModel = MagicMock()
34
+ sys.modules["cellpose.models"].CellposeModel = self.MockCellposeModel
35
+
36
+ def tearDown(self):
37
+ self.modules_patcher.stop()
38
+
39
+ def test_gpu_fallback_on_assertion_error(self):
40
+ """
41
+ Test that _prep_cellpose_model falls back to CPU if GPU init fails with AssertionError.
42
+ """
43
+ # Lazy import inside the test method/patch context
44
+ from celldetective.utils.cellpose_utils import _prep_cellpose_model
45
+
46
+ # Side effect for CellposeModel constructor
47
+ def side_effect(gpu=False, **kwargs):
48
+ if gpu:
49
+ raise AssertionError("Torch not compiled with CUDA enabled")
50
+
51
+ # Return a mock model object
52
+ model = MagicMock()
53
+ model.diam_mean = 30.0
54
+ model.diam_labels = 30.0
55
+ return model
56
+
57
+ self.MockCellposeModel.side_effect = side_effect
58
+
59
+ # Call the function with use_gpu=True
60
+ # We expect it to try with gpu=True, fail, print warning, and retry with gpu=False
61
+ model, scale = _prep_cellpose_model(
62
+ model_name="fake_model", path="fake_path/", use_gpu=True, n_channels=2
63
+ )
64
+
65
+ # Check call history
66
+ self.assertEqual(self.MockCellposeModel.call_count, 2)
67
+
68
+ args1, kwargs1 = self.MockCellposeModel.call_args_list[0]
69
+ self.assertTrue(kwargs1.get("gpu"), "First call should try gpu=True")
70
+
71
+ args2, kwargs2 = self.MockCellposeModel.call_args_list[1]
72
+ self.assertFalse(kwargs2.get("gpu"), "Second call should retry with gpu=False")
73
+
74
+ self.assertIsNotNone(model)
75
+
76
+ def test_gpu_success(self):
77
+ """
78
+ Test that _prep_cellpose_model works normally if GPU init succeeds.
79
+ """
80
+ from celldetective.utils.cellpose_utils import _prep_cellpose_model
81
+
82
+ # Side effect for success
83
+ def side_effect(gpu=False, **kwargs):
84
+ model = MagicMock()
85
+ model.diam_mean = 30.0
86
+ model.diam_labels = 30.0
87
+ return model
88
+
89
+ self.MockCellposeModel.side_effect = side_effect
90
+
91
+ model, scale = _prep_cellpose_model(
92
+ model_name="fake_model", path="fake_path/", use_gpu=True, n_channels=2
93
+ )
94
+
95
+ self.assertEqual(self.MockCellposeModel.call_count, 1)
96
+ args, kwargs = self.MockCellposeModel.call_args
97
+ self.assertTrue(kwargs.get("gpu"))
98
+
99
+
100
+ if __name__ == "__main__":
101
+ unittest.main()
@@ -1 +0,0 @@
1
- __version__ = "1.5.0b3"
File without changes