celldetective 1.5.0b5__tar.gz → 1.5.0b6__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 (200) hide show
  1. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/PKG-INFO +20 -7
  2. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/README.md +5 -3
  3. celldetective-1.5.0b6/celldetective/_version.py +1 -0
  4. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/base_viewer.py +8 -0
  5. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/cellpose_utils/__init__.py +15 -2
  6. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/downloaders.py +48 -14
  7. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/stardist_utils/__init__.py +8 -1
  8. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/PKG-INFO +20 -7
  9. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/SOURCES.txt +1 -0
  10. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/requires.txt +16 -3
  11. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/setup.py +5 -0
  12. celldetective-1.5.0b6/tests/test_partial_install.py +75 -0
  13. celldetective-1.5.0b5/celldetective/_version.py +0 -1
  14. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/LICENSE +0 -0
  15. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/__init__.py +0 -0
  16. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/__main__.py +0 -0
  17. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/datasets/segmentation_annotations/blank +0 -0
  18. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/datasets/signal_annotations/blank +0 -0
  19. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/events.py +0 -0
  20. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/exceptions.py +0 -0
  21. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/extra_properties.py +0 -0
  22. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/filters.py +0 -0
  23. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/InitWindow.py +0 -0
  24. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/__init__.py +0 -0
  25. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/about.py +0 -0
  26. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/analyze_block.py +0 -0
  27. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/__init__.py +0 -0
  28. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/channel_norm_generator.py +0 -0
  29. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/components.py +0 -0
  30. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/feature_choice.py +0 -0
  31. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/figure_canvas.py +0 -0
  32. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/list_widget.py +0 -0
  33. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/styles.py +0 -0
  34. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base/utils.py +0 -0
  35. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/base_annotator.py +0 -0
  36. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/classifier_widget.py +0 -0
  37. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/configure_new_exp.py +0 -0
  38. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/control_panel.py +0 -0
  39. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/dynamic_progress.py +0 -0
  40. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/event_annotator.py +0 -0
  41. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/generic_signal_plot.py +0 -0
  42. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/gui_utils.py +0 -0
  43. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  44. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  45. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/cell-populations.json +0 -0
  46. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/exp-structure.json +0 -0
  47. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/feature-btrack.json +0 -0
  48. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/neighborhood.json +0 -0
  49. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  50. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/preprocessing.json +0 -0
  51. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/propagate-classification.json +0 -0
  52. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/track-postprocessing.json +0 -0
  53. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/help/tracking.json +0 -0
  54. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/interactions_block.py +0 -0
  55. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
  56. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/json_readers.py +0 -0
  57. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/__init__.py +0 -0
  58. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
  59. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
  60. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/local_correction_layout.py +0 -0
  61. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/model_fit_layout.py +0 -0
  62. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/operation_layout.py +0 -0
  63. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
  64. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/measure_annotator.py +0 -0
  65. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/pair_event_annotator.py +0 -0
  66. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/plot_measurements.py +0 -0
  67. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/plot_signals_ui.py +0 -0
  68. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/preprocessing_block.py +0 -0
  69. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/process_block.py +0 -0
  70. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/seg_model_loader.py +0 -0
  71. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/__init__.py +0 -0
  72. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
  73. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
  74. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
  75. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_base.py +0 -0
  76. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
  77. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_measurements.py +0 -0
  78. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_neighborhood.py +0 -0
  79. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_segmentation.py +0 -0
  80. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
  81. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
  82. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_settings_tracking.py +0 -0
  83. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/settings/_stardist_model_params.py +0 -0
  84. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/survival_ui.py +0 -0
  85. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/tableUI.py +0 -0
  86. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/__init__.py +0 -0
  87. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/_maths.py +0 -0
  88. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/_merge_groups.py +0 -0
  89. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
  90. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/_query_table.py +0 -0
  91. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/table_ops/_rename_col.py +0 -0
  92. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/thresholds_gui.py +0 -0
  93. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/__init__.py +0 -0
  94. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
  95. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/contour_viewer.py +0 -0
  96. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/size_viewer.py +0 -0
  97. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/spot_detection_viewer.py +0 -0
  98. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/viewers/threshold_viewer.py +0 -0
  99. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/gui/workers.py +0 -0
  100. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/logo-large.png +0 -0
  101. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/logo.png +0 -0
  102. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/signals_icon.png +0 -0
  103. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/splash-test.png +0 -0
  104. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/splash.png +0 -0
  105. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/splash0.png +0 -0
  106. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/survival2.png +0 -0
  107. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/vignette_signals2.png +0 -0
  108. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/icons/vignette_signals2.svg +0 -0
  109. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/links/zenodo.json +0 -0
  110. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/log_manager.py +0 -0
  111. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/measure.py +0 -0
  112. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/pair_signal_detection/blank +0 -0
  113. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/segmentation_effectors/blank +0 -0
  114. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/segmentation_generic/blank +0 -0
  115. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/segmentation_targets/blank +0 -0
  116. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/signal_detection/blank +0 -0
  117. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  118. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/tracking_configs/mcf7.json +0 -0
  119. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  120. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/tracking_configs/ricm.json +0 -0
  121. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/models/tracking_configs/ricm2.json +0 -0
  122. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/napari/__init__.py +0 -0
  123. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/napari/utils.py +0 -0
  124. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/neighborhood.py +0 -0
  125. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/preprocessing.py +0 -0
  126. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/__init__.py +0 -0
  127. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/background_correction.py +0 -0
  128. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/compute_neighborhood.py +0 -0
  129. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/detect_events.py +0 -0
  130. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/downloader.py +0 -0
  131. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/load_table.py +0 -0
  132. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/measure_cells.py +0 -0
  133. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/segment_cells.py +0 -0
  134. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/track_cells.py +0 -0
  135. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/train_segmentation_model.py +0 -0
  136. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/train_signal_model.py +0 -0
  137. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/processes/unified_process.py +0 -0
  138. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/regionprops/__init__.py +0 -0
  139. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/regionprops/_regionprops.py +0 -0
  140. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/regionprops/props.json +0 -0
  141. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/relative_measurements.py +0 -0
  142. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/analyze_signals.py +0 -0
  143. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/measure_cells.py +0 -0
  144. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/measure_relative.py +0 -0
  145. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/segment_cells.py +0 -0
  146. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  147. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/track_cells.py +0 -0
  148. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/train_segmentation_model.py +0 -0
  149. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/scripts/train_signal_model.py +0 -0
  150. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/segmentation.py +0 -0
  151. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/signals.py +0 -0
  152. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/tracking.py +0 -0
  153. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/__init__.py +0 -0
  154. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/color_mappings.py +0 -0
  155. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/data_cleaning.py +0 -0
  156. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/data_loaders.py +0 -0
  157. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/dataset_helpers.py +0 -0
  158. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/event_detection/__init__.py +0 -0
  159. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/experiment.py +0 -0
  160. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/image_augmenters.py +0 -0
  161. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/image_cleaning.py +0 -0
  162. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/image_loaders.py +0 -0
  163. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/image_transforms.py +0 -0
  164. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/io.py +0 -0
  165. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/mask_cleaning.py +0 -0
  166. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/mask_transforms.py +0 -0
  167. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/masks.py +0 -0
  168. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/maths.py +0 -0
  169. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/model_getters.py +0 -0
  170. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/model_loaders.py +0 -0
  171. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/normalization.py +0 -0
  172. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/parsing.py +0 -0
  173. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/plots/__init__.py +0 -0
  174. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/plots/regression.py +0 -0
  175. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/resources.py +0 -0
  176. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/stats.py +0 -0
  177. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective/utils/types.py +0 -0
  178. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/dependency_links.txt +0 -0
  179. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/entry_points.txt +0 -0
  180. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/not-zip-safe +0 -0
  181. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/celldetective.egg-info/top_level.txt +0 -0
  182. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/setup.cfg +0 -0
  183. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/__init__.py +0 -0
  184. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/gui/__init__.py +0 -0
  185. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/gui/test_enhancements.py +0 -0
  186. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/gui/test_measure_annotator_bugfix.py +0 -0
  187. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/gui/test_new_project.py +0 -0
  188. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/gui/test_project.py +0 -0
  189. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_cellpose_fallback.py +0 -0
  190. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_events.py +0 -0
  191. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_filters.py +0 -0
  192. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_io.py +0 -0
  193. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_measure.py +0 -0
  194. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_neighborhood.py +0 -0
  195. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_notebooks.py +0 -0
  196. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_preprocessing.py +0 -0
  197. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_segmentation.py +0 -0
  198. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_signals.py +0 -0
  199. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_tracking.py +0 -0
  200. {celldetective-1.5.0b5 → celldetective-1.5.0b6}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b5
3
+ Version: 1.5.0b6
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -15,11 +15,8 @@ Requires-Dist: sphinx_rtd_theme
15
15
  Requires-Dist: sphinx
16
16
  Requires-Dist: jinja2
17
17
  Requires-Dist: ipykernel
18
- Requires-Dist: stardist
19
- Requires-Dist: cellpose<3
20
18
  Requires-Dist: scikit-learn
21
19
  Requires-Dist: btrack
22
- Requires-Dist: tensorflow~=2.15.0
23
20
  Requires-Dist: napari<0.6.0
24
21
  Requires-Dist: tqdm
25
22
  Requires-Dist: mahotas
@@ -48,6 +45,19 @@ Requires-Dist: prettyprint
48
45
  Requires-Dist: pandas
49
46
  Requires-Dist: matplotlib
50
47
  Requires-Dist: prettytable
48
+ Requires-Dist: scikit-image
49
+ Requires-Dist: natsort
50
+ Provides-Extra: tensorflow
51
+ Requires-Dist: tensorflow~=2.15.0; extra == "tensorflow"
52
+ Requires-Dist: stardist; extra == "tensorflow"
53
+ Provides-Extra: process
54
+ Requires-Dist: cellpose<3; extra == "process"
55
+ Requires-Dist: stardist; extra == "process"
56
+ Requires-Dist: tensorflow~=2.15.0; extra == "process"
57
+ Provides-Extra: all
58
+ Requires-Dist: cellpose<3; extra == "all"
59
+ Requires-Dist: stardist; extra == "all"
60
+ Requires-Dist: tensorflow~=2.15.0; extra == "all"
51
61
  Dynamic: author
52
62
  Dynamic: author-email
53
63
  Dynamic: description
@@ -55,6 +65,7 @@ Dynamic: description-content-type
55
65
  Dynamic: home-page
56
66
  Dynamic: license
57
67
  Dynamic: license-file
68
+ Dynamic: provides-extra
58
69
  Dynamic: requires-dist
59
70
  Dynamic: summary
60
71
 
@@ -148,10 +159,12 @@ To use the software, you must install python, *e.g.* through
148
159
 
149
160
  Celldetective requires a version of Python between 3.9 and 3.11 (included). If your Python version is older or more recent, consider using `conda` to create an environment as described below.
150
161
 
151
- With the proper Python version, Celldetective can be directly installed with `pip`:
162
+ With the proper Python version, Celldetective can be directly installed with `pip`.
163
+ **Important**: By default, `pip install celldetective` will **not** install deep-learning libraries (`tensorflow`, `cellpose`, `stardist`) to allow users to manage their own GPU environment (e.g. `torch`, `cuda`).
152
164
 
165
+ If you want the standard full installation (recommended for most users), use:
153
166
  ``` bash
154
- pip install celldetective
167
+ pip install celldetective[all]
155
168
  ```
156
169
 
157
170
  We recommend that you create an environment to use Celldetective, to protect your package versions and fix the Python version *e.g.*
@@ -160,7 +173,7 @@ with `conda`:
160
173
  ``` bash
161
174
  conda create -n celldetective python=3.11 pyqt
162
175
  conda activate celldetective
163
- pip install celldetective
176
+ pip install celldetective[all]
164
177
  ```
165
178
 
166
179
  Need an update? Simply type the following in the terminal (in your
@@ -88,10 +88,12 @@ To use the software, you must install python, *e.g.* through
88
88
 
89
89
  Celldetective requires a version of Python between 3.9 and 3.11 (included). If your Python version is older or more recent, consider using `conda` to create an environment as described below.
90
90
 
91
- With the proper Python version, Celldetective can be directly installed with `pip`:
91
+ With the proper Python version, Celldetective can be directly installed with `pip`.
92
+ **Important**: By default, `pip install celldetective` will **not** install deep-learning libraries (`tensorflow`, `cellpose`, `stardist`) to allow users to manage their own GPU environment (e.g. `torch`, `cuda`).
92
93
 
94
+ If you want the standard full installation (recommended for most users), use:
93
95
  ``` bash
94
- pip install celldetective
96
+ pip install celldetective[all]
95
97
  ```
96
98
 
97
99
  We recommend that you create an environment to use Celldetective, to protect your package versions and fix the Python version *e.g.*
@@ -100,7 +102,7 @@ with `conda`:
100
102
  ``` bash
101
103
  conda create -n celldetective python=3.11 pyqt
102
104
  conda activate celldetective
103
- pip install celldetective
105
+ pip install celldetective[all]
104
106
  ```
105
107
 
106
108
  Need an update? Simply type the following in the terminal (in your
@@ -0,0 +1 @@
1
+ __version__ = "1.5.0b6"
@@ -879,6 +879,14 @@ class StackVisualizer(CelldetectiveWidget):
879
879
  # Event handler for closing the widget
880
880
  if self.loader_thread:
881
881
  self.loader_thread.stop()
882
+ self.loader_thread = None
882
883
  if hasattr(self, "frame_cache") and isinstance(self.frame_cache, OrderedDict):
883
884
  self.frame_cache.clear()
884
885
  self.canvas.close()
886
+
887
+ def __del__(self):
888
+ try:
889
+ if hasattr(self, "loader_thread") and self.loader_thread:
890
+ self.loader_thread.stop()
891
+ except:
892
+ pass
@@ -104,14 +104,27 @@ def _prep_cellpose_model(
104
104
  `diam_labels` are attributes of the model.
105
105
  """
106
106
 
107
- import torch
107
+ try:
108
+ import torch
109
+ except ImportError as e:
110
+ raise RuntimeError(
111
+ "Torch is not installed. Please install it to use this feature.\n"
112
+ "You can install the full package with: pip install celldetective[process]\n"
113
+ ) from e
108
114
 
109
115
  if not use_gpu:
110
116
  device = torch.device("cpu")
111
117
  else:
112
118
  device = torch.device("cuda")
113
119
 
114
- from cellpose.models import CellposeModel
120
+ try:
121
+ from cellpose.models import CellposeModel
122
+ except ImportError as e:
123
+ raise RuntimeError(
124
+ "Cellpose is not installed. Please install it to use this feature.\n"
125
+ "You can install the full package with: pip install celldetective[process]\n"
126
+ "Or specifically: pip install celldetective[cellpose]"
127
+ ) from e
115
128
 
116
129
  try:
117
130
  model = CellposeModel(
@@ -77,18 +77,39 @@ def download_url_to_file(url, dst, progress=True):
77
77
  Default: True
78
78
 
79
79
  """
80
- file_size = None
81
80
  import ssl
81
+ import time
82
+ from urllib.error import HTTPError, URLError
82
83
 
84
+ file_size = None
83
85
  ssl._create_default_https_context = ssl._create_unverified_context
84
- u = urlopen(url)
85
- meta = u.info()
86
- if hasattr(meta, "getheaders"):
87
- content_length = meta.getheaders("Content-Length")
88
- else:
89
- content_length = meta.get_all("Content-Length")
90
- if content_length is not None and len(content_length) > 0:
91
- file_size = int(content_length[0])
86
+
87
+ # Retry configuration
88
+ max_retries = 5
89
+ retry_delay = 10 # Initial delay in seconds
90
+
91
+ for attempt in range(max_retries):
92
+ try:
93
+ u = urlopen(url)
94
+ meta = u.info()
95
+ if hasattr(meta, "getheaders"):
96
+ content_length = meta.getheaders("Content-Length")
97
+ else:
98
+ content_length = meta.get_all("Content-Length")
99
+ if content_length is not None and len(content_length) > 0:
100
+ file_size = int(content_length[0])
101
+ break # Success
102
+ except (HTTPError, URLError) as e:
103
+ if attempt < max_retries - 1:
104
+ logger.warning(
105
+ f"Download check failed: {e}. Retrying in {retry_delay}s..."
106
+ )
107
+ time.sleep(retry_delay)
108
+ retry_delay *= 2 # Exponential backoff
109
+ else:
110
+ logger.error(f"Download check failed after {max_retries} attempts: {e}")
111
+ raise e
112
+
92
113
  # We deliberately save it in a temp file and move it after
93
114
  dst = os.path.expanduser(dst)
94
115
  dst_dir = os.path.dirname(dst)
@@ -143,14 +164,27 @@ def download_url_to_file(url, dst, progress=True):
143
164
  unit_divisor=1024,
144
165
  ) as pbar:
145
166
  while True:
146
- buffer = u.read(8192) # 8192
147
- if len(buffer) == 0:
148
- break
149
- f.write(buffer)
150
- pbar.update(len(buffer))
167
+ try:
168
+ buffer = u.read(8192) # 8192
169
+ if len(buffer) == 0:
170
+ break
171
+ f.write(buffer)
172
+ pbar.update(len(buffer))
173
+ except (HTTPError, URLError) as e:
174
+ # Attempt rudimentary resume-like behavior or just fail?
175
+ # Simple retry of read is hard without Range headers on a stream.
176
+ # Best to just fail the whole download and rely on outer retry if we wrapped the whole thing.
177
+ # For now, let's just let it raise, but really we should wrap the whole download block.
178
+ raise e
151
179
 
152
180
  f.close()
153
181
  shutil.move(f.name, dst)
182
+ except Exception as e:
183
+ f.close()
184
+ remove_file_if_exists(f.name)
185
+ # If we failed during download reading (after open), we should probably retry the whole function from start
186
+ # but that requires significant refactoring. Given the error was 504 on open, the retry block above handles it.
187
+ raise e
154
188
  finally:
155
189
  f.close()
156
190
  remove_file_if_exists(f.name)
@@ -43,7 +43,14 @@ def _prep_stardist_model(
43
43
  - GPU support depends on the availability of compatible hardware and software setup.
44
44
  """
45
45
 
46
- from stardist.models import StarDist2D
46
+ try:
47
+ from stardist.models import StarDist2D
48
+ except ImportError as e:
49
+ raise RuntimeError(
50
+ "StarDist is not installed. Please install it to use this feature.\n"
51
+ "You can install the full package with: pip install celldetective[process]\n"
52
+ "Or specifically: pip install celldetective[stardist]"
53
+ ) from e
47
54
 
48
55
  model = StarDist2D(None, name=model_name, basedir=path)
49
56
  model.config.use_gpu = use_gpu
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b5
3
+ Version: 1.5.0b6
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -15,11 +15,8 @@ Requires-Dist: sphinx_rtd_theme
15
15
  Requires-Dist: sphinx
16
16
  Requires-Dist: jinja2
17
17
  Requires-Dist: ipykernel
18
- Requires-Dist: stardist
19
- Requires-Dist: cellpose<3
20
18
  Requires-Dist: scikit-learn
21
19
  Requires-Dist: btrack
22
- Requires-Dist: tensorflow~=2.15.0
23
20
  Requires-Dist: napari<0.6.0
24
21
  Requires-Dist: tqdm
25
22
  Requires-Dist: mahotas
@@ -48,6 +45,19 @@ Requires-Dist: prettyprint
48
45
  Requires-Dist: pandas
49
46
  Requires-Dist: matplotlib
50
47
  Requires-Dist: prettytable
48
+ Requires-Dist: scikit-image
49
+ Requires-Dist: natsort
50
+ Provides-Extra: tensorflow
51
+ Requires-Dist: tensorflow~=2.15.0; extra == "tensorflow"
52
+ Requires-Dist: stardist; extra == "tensorflow"
53
+ Provides-Extra: process
54
+ Requires-Dist: cellpose<3; extra == "process"
55
+ Requires-Dist: stardist; extra == "process"
56
+ Requires-Dist: tensorflow~=2.15.0; extra == "process"
57
+ Provides-Extra: all
58
+ Requires-Dist: cellpose<3; extra == "all"
59
+ Requires-Dist: stardist; extra == "all"
60
+ Requires-Dist: tensorflow~=2.15.0; extra == "all"
51
61
  Dynamic: author
52
62
  Dynamic: author-email
53
63
  Dynamic: description
@@ -55,6 +65,7 @@ Dynamic: description-content-type
55
65
  Dynamic: home-page
56
66
  Dynamic: license
57
67
  Dynamic: license-file
68
+ Dynamic: provides-extra
58
69
  Dynamic: requires-dist
59
70
  Dynamic: summary
60
71
 
@@ -148,10 +159,12 @@ To use the software, you must install python, *e.g.* through
148
159
 
149
160
  Celldetective requires a version of Python between 3.9 and 3.11 (included). If your Python version is older or more recent, consider using `conda` to create an environment as described below.
150
161
 
151
- With the proper Python version, Celldetective can be directly installed with `pip`:
162
+ With the proper Python version, Celldetective can be directly installed with `pip`.
163
+ **Important**: By default, `pip install celldetective` will **not** install deep-learning libraries (`tensorflow`, `cellpose`, `stardist`) to allow users to manage their own GPU environment (e.g. `torch`, `cuda`).
152
164
 
165
+ If you want the standard full installation (recommended for most users), use:
153
166
  ``` bash
154
- pip install celldetective
167
+ pip install celldetective[all]
155
168
  ```
156
169
 
157
170
  We recommend that you create an environment to use Celldetective, to protect your package versions and fix the Python version *e.g.*
@@ -160,7 +173,7 @@ with `conda`:
160
173
  ``` bash
161
174
  conda create -n celldetective python=3.11 pyqt
162
175
  conda activate celldetective
163
- pip install celldetective
176
+ pip install celldetective[all]
164
177
  ```
165
178
 
166
179
  Need an update? Simply type the following in the terminal (in your
@@ -184,6 +184,7 @@ tests/test_io.py
184
184
  tests/test_measure.py
185
185
  tests/test_neighborhood.py
186
186
  tests/test_notebooks.py
187
+ tests/test_partial_install.py
187
188
  tests/test_preprocessing.py
188
189
  tests/test_segmentation.py
189
190
  tests/test_signals.py
@@ -5,11 +5,8 @@ sphinx_rtd_theme
5
5
  sphinx
6
6
  jinja2
7
7
  ipykernel
8
- stardist
9
- cellpose<3
10
8
  scikit-learn
11
9
  btrack
12
- tensorflow~=2.15.0
13
10
  napari<0.6.0
14
11
  tqdm
15
12
  mahotas
@@ -38,3 +35,19 @@ prettyprint
38
35
  pandas
39
36
  matplotlib
40
37
  prettytable
38
+ scikit-image
39
+ natsort
40
+
41
+ [all]
42
+ cellpose<3
43
+ stardist
44
+ tensorflow~=2.15.0
45
+
46
+ [process]
47
+ cellpose<3
48
+ stardist
49
+ tensorflow~=2.15.0
50
+
51
+ [tensorflow]
52
+ tensorflow~=2.15.0
53
+ stardist
@@ -70,5 +70,10 @@ setup(
70
70
  "console_scripts": ["celldetective = celldetective.__main__:main"],
71
71
  },
72
72
  install_requires=requirements,
73
+ extras_require={
74
+ "tensorflow": ["tensorflow~=2.15.0", "stardist"],
75
+ "process": ["cellpose<3", "stardist", "tensorflow~=2.15.0"],
76
+ "all": ["cellpose<3", "stardist", "tensorflow~=2.15.0"],
77
+ },
73
78
  # dependency_links = links
74
79
  )
@@ -0,0 +1,75 @@
1
+ import unittest
2
+ from unittest.mock import MagicMock, patch
3
+ import sys
4
+ import importlib
5
+
6
+
7
+ class TestPartialValidation(unittest.TestCase):
8
+
9
+ def test_imports_without_extras(self):
10
+ """Test that main modules can be imported even if optional extras are missing."""
11
+ # This test assumes the environment MIGHT have them, so we must mock them as missing
12
+ # to ensure the code handles it.
13
+
14
+ with patch.dict(
15
+ sys.modules,
16
+ {
17
+ "tensorflow": None,
18
+ "torch": None,
19
+ "stardist": None,
20
+ "cellpose": None,
21
+ "cellpose.models": None,
22
+ "stardist.models": None,
23
+ },
24
+ ):
25
+ # Force reload of celldetective.segmentation to test its imports
26
+ try:
27
+ import celldetective.segmentation
28
+
29
+ importlib.reload(celldetective.segmentation)
30
+ except ImportError as e:
31
+ self.fail(
32
+ f"Could not import celldetective.segmentation without extras: {e}"
33
+ )
34
+ except Exception as e:
35
+ self.fail(f"Unexpected error importing celldetective.segmentation: {e}")
36
+
37
+ def test_graceful_failure_stardist(self):
38
+ """Test that calling stardist functions raises RuntimeError if missing."""
39
+ with patch.dict(sys.modules, {"stardist": None, "stardist.models": None}):
40
+ # We need to reload the util module to pick up the missing module
41
+ import celldetective.utils.stardist_utils
42
+
43
+ importlib.reload(celldetective.utils.stardist_utils)
44
+
45
+ from celldetective.utils.stardist_utils import _prep_stardist_model
46
+
47
+ with self.assertRaises(RuntimeError) as cm:
48
+ _prep_stardist_model("fake_model", "fake_path")
49
+
50
+ self.assertIn("StarDist is not installed", str(cm.exception))
51
+
52
+ def test_graceful_failure_cellpose(self):
53
+ """Test that calling cellpose functions raises RuntimeError if missing."""
54
+ with patch.dict(
55
+ sys.modules, {"cellpose": None, "cellpose.models": None, "torch": None}
56
+ ):
57
+ import celldetective.utils.cellpose_utils
58
+
59
+ importlib.reload(celldetective.utils.cellpose_utils)
60
+
61
+ from celldetective.utils.cellpose_utils import _prep_cellpose_model
62
+
63
+ with self.assertRaises(RuntimeError) as cm:
64
+ _prep_cellpose_model("fake_model", "fake_path")
65
+
66
+ # Message check might correspond to torch or cellpose depending on which import hits first
67
+ # Our code checks torch first.
68
+ self.assertTrue(
69
+ "Torch is not installed" in str(cm.exception)
70
+ or "Cellpose is not installed" in str(cm.exception)
71
+ )
72
+
73
+
74
+ if __name__ == "__main__":
75
+ unittest.main()
@@ -1 +0,0 @@
1
- __version__ = "1.5.0b5"
File without changes