celldetective 1.5.0b0__tar.gz → 1.5.0b1__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 (195) hide show
  1. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/PKG-INFO +1 -1
  2. celldetective-1.5.0b1/celldetective/_version.py +1 -0
  3. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/InitWindow.py +3 -3
  4. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/workers.py +99 -0
  5. celldetective-1.5.0b1/celldetective/processes/downloader.py +137 -0
  6. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/downloaders.py +38 -0
  7. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/PKG-INFO +1 -1
  8. celldetective-1.5.0b0/celldetective/_version.py +0 -1
  9. celldetective-1.5.0b0/celldetective/processes/downloader.py +0 -111
  10. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/LICENSE +0 -0
  11. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/README.md +0 -0
  12. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/__init__.py +0 -0
  13. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/__main__.py +0 -0
  14. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/datasets/segmentation_annotations/blank +0 -0
  15. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/datasets/signal_annotations/blank +0 -0
  16. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/events.py +0 -0
  17. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/exceptions.py +0 -0
  18. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/extra_properties.py +0 -0
  19. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/filters.py +0 -0
  20. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/__init__.py +0 -0
  21. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/about.py +0 -0
  22. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/analyze_block.py +0 -0
  23. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/__init__.py +0 -0
  24. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/channel_norm_generator.py +0 -0
  25. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/components.py +0 -0
  26. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/feature_choice.py +0 -0
  27. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/figure_canvas.py +0 -0
  28. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/list_widget.py +0 -0
  29. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/styles.py +0 -0
  30. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base/utils.py +0 -0
  31. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/base_annotator.py +0 -0
  32. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/classifier_widget.py +0 -0
  33. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/configure_new_exp.py +0 -0
  34. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/control_panel.py +0 -0
  35. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/dynamic_progress.py +0 -0
  36. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/event_annotator.py +0 -0
  37. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/generic_signal_plot.py +0 -0
  38. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/gui_utils.py +0 -0
  39. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/DL-segmentation-strategy.json +0 -0
  40. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/Threshold-vs-DL.json +0 -0
  41. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/cell-populations.json +0 -0
  42. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/exp-structure.json +0 -0
  43. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/feature-btrack.json +0 -0
  44. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/neighborhood.json +0 -0
  45. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/prefilter-for-segmentation.json +0 -0
  46. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/preprocessing.json +0 -0
  47. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/propagate-classification.json +0 -0
  48. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/track-postprocessing.json +0 -0
  49. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/help/tracking.json +0 -0
  50. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/interactions_block.py +0 -0
  51. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/interactive_timeseries_viewer.py +0 -0
  52. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/json_readers.py +0 -0
  53. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/__init__.py +0 -0
  54. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/background_model_free_layout.py +0 -0
  55. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/channel_offset_layout.py +0 -0
  56. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/local_correction_layout.py +0 -0
  57. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/model_fit_layout.py +0 -0
  58. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/operation_layout.py +0 -0
  59. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/layouts/protocol_designer_layout.py +0 -0
  60. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/pair_event_annotator.py +0 -0
  61. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/plot_measurements.py +0 -0
  62. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/plot_signals_ui.py +0 -0
  63. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/preprocessing_block.py +0 -0
  64. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/process_block.py +0 -0
  65. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/seg_model_loader.py +0 -0
  66. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/__init__.py +0 -0
  67. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_cellpose_model_params.py +0 -0
  68. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_event_detection_model_params.py +0 -0
  69. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_segmentation_model_params.py +0 -0
  70. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_base.py +0 -0
  71. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_event_model_training.py +0 -0
  72. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_measurements.py +0 -0
  73. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_neighborhood.py +0 -0
  74. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_segmentation.py +0 -0
  75. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_segmentation_model_training.py +0 -0
  76. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_signal_annotator.py +0 -0
  77. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_settings_tracking.py +0 -0
  78. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/settings/_stardist_model_params.py +0 -0
  79. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/survival_ui.py +0 -0
  80. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/tableUI.py +0 -0
  81. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/__init__.py +0 -0
  82. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/_maths.py +0 -0
  83. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/_merge_groups.py +0 -0
  84. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/_merge_one_hot.py +0 -0
  85. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/_query_table.py +0 -0
  86. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/table_ops/_rename_col.py +0 -0
  87. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/thresholds_gui.py +0 -0
  88. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/__init__.py +0 -0
  89. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/base_viewer.py +0 -0
  90. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/channel_offset_viewer.py +0 -0
  91. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/contour_viewer.py +0 -0
  92. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/size_viewer.py +0 -0
  93. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/spot_detection_viewer.py +0 -0
  94. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/gui/viewers/threshold_viewer.py +0 -0
  95. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/logo-large.png +0 -0
  96. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/logo.png +0 -0
  97. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/signals_icon.png +0 -0
  98. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/splash-test.png +0 -0
  99. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/splash.png +0 -0
  100. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/splash0.png +0 -0
  101. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/survival2.png +0 -0
  102. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/vignette_signals2.png +0 -0
  103. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/icons/vignette_signals2.svg +0 -0
  104. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/links/zenodo.json +0 -0
  105. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/log_manager.py +0 -0
  106. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/measure.py +0 -0
  107. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/pair_signal_detection/blank +0 -0
  108. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/segmentation_effectors/blank +0 -0
  109. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/segmentation_generic/blank +0 -0
  110. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/segmentation_targets/blank +0 -0
  111. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/signal_detection/blank +0 -0
  112. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/tracking_configs/biased_motion.json +0 -0
  113. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/tracking_configs/mcf7.json +0 -0
  114. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/tracking_configs/no_z_motion.json +0 -0
  115. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/tracking_configs/ricm.json +0 -0
  116. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/models/tracking_configs/ricm2.json +0 -0
  117. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/napari/__init__.py +0 -0
  118. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/napari/utils.py +0 -0
  119. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/neighborhood.py +0 -0
  120. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/preprocessing.py +0 -0
  121. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/__init__.py +0 -0
  122. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/background_correction.py +0 -0
  123. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/compute_neighborhood.py +0 -0
  124. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/detect_events.py +0 -0
  125. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/measure_cells.py +0 -0
  126. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/segment_cells.py +0 -0
  127. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/track_cells.py +0 -0
  128. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/train_segmentation_model.py +0 -0
  129. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/train_signal_model.py +0 -0
  130. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/processes/unified_process.py +0 -0
  131. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/regionprops/__init__.py +0 -0
  132. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/regionprops/_regionprops.py +0 -0
  133. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/regionprops/props.json +0 -0
  134. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/relative_measurements.py +0 -0
  135. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/analyze_signals.py +0 -0
  136. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/measure_cells.py +0 -0
  137. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/measure_relative.py +0 -0
  138. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/segment_cells.py +0 -0
  139. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/segment_cells_thresholds.py +0 -0
  140. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/track_cells.py +0 -0
  141. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/train_segmentation_model.py +0 -0
  142. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/scripts/train_signal_model.py +0 -0
  143. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/segmentation.py +0 -0
  144. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/signals.py +0 -0
  145. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/tracking.py +0 -0
  146. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/__init__.py +0 -0
  147. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/cellpose_utils/__init__.py +0 -0
  148. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/color_mappings.py +0 -0
  149. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/data_cleaning.py +0 -0
  150. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/data_loaders.py +0 -0
  151. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/dataset_helpers.py +0 -0
  152. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/event_detection/__init__.py +0 -0
  153. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/experiment.py +0 -0
  154. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/image_augmenters.py +0 -0
  155. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/image_cleaning.py +0 -0
  156. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/image_loaders.py +0 -0
  157. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/image_transforms.py +0 -0
  158. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/io.py +0 -0
  159. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/mask_cleaning.py +0 -0
  160. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/mask_transforms.py +0 -0
  161. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/masks.py +0 -0
  162. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/maths.py +0 -0
  163. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/model_getters.py +0 -0
  164. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/model_loaders.py +0 -0
  165. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/normalization.py +0 -0
  166. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/parsing.py +0 -0
  167. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/plots/__init__.py +0 -0
  168. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/plots/regression.py +0 -0
  169. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/resources.py +0 -0
  170. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/stardist_utils/__init__.py +0 -0
  171. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/stats.py +0 -0
  172. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective/utils/types.py +0 -0
  173. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/SOURCES.txt +0 -0
  174. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/dependency_links.txt +0 -0
  175. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/entry_points.txt +0 -0
  176. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/not-zip-safe +0 -0
  177. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/requires.txt +0 -0
  178. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/celldetective.egg-info/top_level.txt +0 -0
  179. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/setup.cfg +0 -0
  180. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/setup.py +0 -0
  181. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/__init__.py +0 -0
  182. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/gui/__init__.py +0 -0
  183. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/gui/test_new_project.py +0 -0
  184. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/gui/test_project.py +0 -0
  185. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_events.py +0 -0
  186. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_filters.py +0 -0
  187. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_io.py +0 -0
  188. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_measure.py +0 -0
  189. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_neighborhood.py +0 -0
  190. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_notebooks.py +0 -0
  191. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_preprocessing.py +0 -0
  192. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_segmentation.py +0 -0
  193. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_signals.py +0 -0
  194. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_tracking.py +0 -0
  195. {celldetective-1.5.0b0 → celldetective-1.5.0b1}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b0
3
+ Version: 1.5.0b1
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.0b1"
@@ -256,7 +256,7 @@ class AppInitWindow(CelldetectiveMainWindow):
256
256
  DownloadProcess = self.bg_loader.DownloadProcess
257
257
  else:
258
258
  from celldetective.processes.downloader import DownloadProcess
259
- from celldetective.gui.workers import ProgressWindow
259
+ from celldetective.gui.workers import GenericProgressWindow
260
260
 
261
261
  self.target_dir = str(
262
262
  QFileDialog.getExistingDirectory(self, "Select Folder for Download")
@@ -268,12 +268,12 @@ class AppInitWindow(CelldetectiveMainWindow):
268
268
  self.output_dir = self.target_dir
269
269
  self.file = "demo_ricm"
270
270
  process_args = {"output_dir": self.output_dir, "file": self.file}
271
- self.job = ProgressWindow(
271
+ self.job = GenericProgressWindow(
272
272
  DownloadProcess,
273
273
  parent_window=self,
274
274
  title="Download",
275
- position_info=False,
276
275
  process_args=process_args,
276
+ label_text="Downloading demo_ricm...",
277
277
  )
278
278
  result = self.job.exec_()
279
279
  if result == QDialog.Accepted:
@@ -316,3 +316,102 @@ class RunnerSignal(QObject):
316
316
 
317
317
  finished = pyqtSignal()
318
318
  error = pyqtSignal(str)
319
+
320
+
321
+ class GenericProgressWindow(CelldetectiveDialog):
322
+
323
+ def __init__(
324
+ self,
325
+ process=None,
326
+ parent_window=None,
327
+ title="",
328
+ process_args=None,
329
+ label_text="Progress:",
330
+ ):
331
+
332
+ super().__init__()
333
+
334
+ self.setWindowTitle(f"{title}")
335
+ self.__process = process
336
+ self.parent_window = parent_window
337
+
338
+ self.__btn_stp = QPushButton("Cancel")
339
+ self.__label = QLabel("Idle")
340
+ self.progress_label = QLabel(label_text)
341
+
342
+ self.progress_bar = QProgressBar()
343
+ self.progress_bar.setValue(0)
344
+ self.progress_bar.setFormat("%p%")
345
+
346
+ self.__runner = Runner(
347
+ process=self.__process,
348
+ process_args=process_args,
349
+ )
350
+ logger.info("Runner initialized...")
351
+ self.pool = QThreadPool.globalInstance()
352
+
353
+ self.__btn_stp.clicked.connect(self.__stp_net)
354
+ self.__runner.signals.finished.connect(self.__on_finished)
355
+ self.__runner.signals.error.connect(self.__on_error)
356
+ self.__runner.signals.update_status.connect(self.__label.setText)
357
+
358
+ # Connect update_pos for generic progress (Runner maps generic list progress to update_pos)
359
+ self.__runner.signals.update_pos.connect(self.progress_bar.setValue)
360
+
361
+ self.__btn_stp.setDisabled(True)
362
+
363
+ self.layout = QVBoxLayout()
364
+ self.layout.addWidget(self.progress_label)
365
+ self.layout.addWidget(self.progress_bar)
366
+
367
+ self.btn_layout = QHBoxLayout()
368
+ self.btn_layout.addWidget(self.__btn_stp)
369
+ self.btn_layout.addWidget(self.__label)
370
+
371
+ self.layout.addLayout(self.btn_layout)
372
+
373
+ self.setLayout(self.layout)
374
+ self.setFixedSize(QSize(400, 150))
375
+ self.show()
376
+ self.raise_()
377
+ self.activateWindow()
378
+ logger.info("GenericProgressWindow initialized and shown.")
379
+ self.__run_net()
380
+ self.setModal(True)
381
+
382
+ def closeEvent(self, evnt):
383
+ evnt.ignore()
384
+ self.setWindowState(Qt.WindowMinimized)
385
+
386
+ def __run_net(self):
387
+ self.__btn_stp.setEnabled(True)
388
+ self.__label.setText("Running...")
389
+ self.pool.start(self.__runner)
390
+
391
+ def __stp_net(self):
392
+ self.__runner.close()
393
+ logger.info("\n Job cancelled... Abort.")
394
+ self.reject()
395
+
396
+ def __on_finished(self):
397
+ self.__btn_stp.setDisabled(True)
398
+ self.__label.setText("\nFinished!")
399
+ self.__runner.close()
400
+ self.accept()
401
+
402
+ def __on_error(self, message="Error"):
403
+ self.__btn_stp.setDisabled(True)
404
+ self.__label.setText("\nError")
405
+ self.__runner.close()
406
+
407
+ # Show error in a message box to ensure it's seen
408
+ from PyQt5.QtWidgets import QMessageBox
409
+
410
+ msg = QMessageBox()
411
+ msg.setIcon(QMessageBox.Critical)
412
+ msg.setText("Process failed")
413
+ msg.setInformativeText(str(message))
414
+ msg.setWindowTitle("Error")
415
+ msg.exec_()
416
+
417
+ self.reject()
@@ -0,0 +1,137 @@
1
+ import os
2
+ import ssl
3
+ from tqdm import tqdm
4
+ from multiprocessing import Process
5
+ from glob import glob
6
+ import shutil
7
+ from urllib.request import urlopen
8
+ import zipfile
9
+ import tempfile
10
+ import time
11
+ from pathlib import Path
12
+ import json
13
+
14
+
15
+ class DownloadProcess(Process):
16
+
17
+ def __init__(self, queue=None, process_args=None, *args, **kwargs):
18
+
19
+ super().__init__(*args, **kwargs)
20
+
21
+ if process_args is not None:
22
+ for key, value in process_args.items():
23
+ setattr(self, key, value)
24
+
25
+ self.queue = queue
26
+ self.progress = True
27
+
28
+ # Get celldetective package root
29
+ current_dir = os.path.dirname(os.path.realpath(__file__))
30
+ package_root = os.path.dirname(current_dir)
31
+ zenodo_json = os.path.join(package_root, "links", "zenodo.json")
32
+ # print(f"{zenodo_json=}")
33
+
34
+ with open(zenodo_json, "r") as f:
35
+ zenodo_json = json.load(f)
36
+ all_files = list(zenodo_json["files"]["entries"].keys())
37
+ all_files_short = [f.replace(".zip", "") for f in all_files]
38
+ zenodo_url = zenodo_json["links"]["files"].replace("api/", "")
39
+ full_links = ["/".join([zenodo_url, f]) for f in all_files]
40
+ index = all_files_short.index(self.file)
41
+
42
+ self.zip_url = full_links[index]
43
+ self.path_to_zip_file = os.sep.join([self.output_dir, "temp.zip"])
44
+
45
+ self.sum_done = 0
46
+ self.t0 = time.time()
47
+
48
+ def download_url_to_file(self, url, dst):
49
+ try:
50
+ file_size = None
51
+ ssl._create_default_https_context = ssl._create_unverified_context
52
+ u = urlopen(url)
53
+ meta = u.info()
54
+ if hasattr(meta, "getheaders"):
55
+ content_length = meta.getheaders("Content-Length")
56
+ else:
57
+ content_length = meta.get_all("Content-Length")
58
+ if content_length is not None and len(content_length) > 0:
59
+ file_size = int(content_length[0])
60
+ # We deliberately save it in a temp file and move it after
61
+ dst = os.path.expanduser(dst)
62
+ dst_dir = os.path.dirname(dst)
63
+ f = tempfile.NamedTemporaryFile(delete=False, dir=dst_dir)
64
+
65
+ try:
66
+ with tqdm(
67
+ total=file_size,
68
+ disable=not self.progress,
69
+ unit="B",
70
+ unit_scale=True,
71
+ unit_divisor=1024,
72
+ ) as pbar:
73
+ while True:
74
+ buffer = u.read(8192) # 8192
75
+ if len(buffer) == 0:
76
+ break
77
+ f.write(buffer)
78
+ pbar.update(len(buffer))
79
+ self.sum_done += len(buffer) / file_size * 100
80
+ mean_exec_per_step = (time.time() - self.t0) / (
81
+ self.sum_done * file_size / 100 + 1
82
+ )
83
+ pred_time = (
84
+ file_size - (self.sum_done * file_size / 100 + 1)
85
+ ) * mean_exec_per_step
86
+ self.queue.put([self.sum_done, pred_time])
87
+ f.close()
88
+ shutil.move(f.name, dst)
89
+ finally:
90
+ f.close()
91
+ if os.path.exists(f.name):
92
+ os.remove(f.name)
93
+ except Exception as e:
94
+ print("No internet connection: ", e)
95
+ return None
96
+
97
+ def run(self):
98
+
99
+ self.download_url_to_file(rf"{self.zip_url}", self.path_to_zip_file)
100
+ with zipfile.ZipFile(self.path_to_zip_file, "r") as zip_ref:
101
+ zip_ref.extractall(self.output_dir)
102
+
103
+ file_to_rename = glob(
104
+ os.sep.join(
105
+ [
106
+ self.output_dir,
107
+ self.file,
108
+ "*[!.json][!.png][!.h5][!.csv][!.npy][!.tif][!.ini]",
109
+ ]
110
+ )
111
+ )
112
+ if (
113
+ len(file_to_rename) > 0
114
+ and not file_to_rename[0].endswith(os.sep)
115
+ and not self.file.startswith("demo")
116
+ ):
117
+ os.rename(
118
+ file_to_rename[0], os.sep.join([self.output_dir, self.file, self.file])
119
+ )
120
+
121
+ os.remove(self.path_to_zip_file)
122
+ self.queue.put([100, 0])
123
+ time.sleep(0.5)
124
+
125
+ # Send end signal
126
+ self.queue.put("finished")
127
+ self.queue.close()
128
+
129
+ def end_process(self):
130
+
131
+ self.terminate()
132
+ self.queue.put("finished")
133
+
134
+ def abort_process(self):
135
+
136
+ self.terminate()
137
+ self.queue.put("error")
@@ -159,6 +159,44 @@ def download_url_to_file(url, dst, progress=True):
159
159
  def download_zenodo_file(file, output_dir):
160
160
 
161
161
  logger.info(f"{file=} {output_dir=}")
162
+
163
+ # GUI Check
164
+ try:
165
+ from PyQt5.QtWidgets import QApplication, QDialog
166
+
167
+ app = QApplication.instance()
168
+ use_gui = app is not None
169
+ except ImportError:
170
+ use_gui = False
171
+
172
+ if use_gui:
173
+ try:
174
+ from celldetective.gui.workers import GenericProgressWindow
175
+ from celldetective.processes.downloader import DownloadProcess
176
+
177
+ # Find parent window if possible, else None is fine for a dialog
178
+ parent = app.activeWindow()
179
+
180
+ process_args = {"output_dir": output_dir, "file": file}
181
+ job = GenericProgressWindow(
182
+ DownloadProcess,
183
+ parent_window=parent,
184
+ title="Download",
185
+ process_args=process_args,
186
+ label_text=f"Downloading {file}...",
187
+ )
188
+ result = job.exec_()
189
+ if result == QDialog.Accepted:
190
+ return # DownloadProcess handles the file operations
191
+ else:
192
+ logger.info("Download cancelled or failed.")
193
+ return
194
+
195
+ except Exception as e:
196
+ logger.error(f"Failed to use GUI downloader: {e}. Falling back to console.")
197
+ # Fallback to console implementation below if GUI fails
198
+
199
+ # Console Implementation
162
200
  zenodo_json = os.sep.join(
163
201
  [
164
202
  os.path.split(os.path.dirname(os.path.realpath(__file__)))[0],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celldetective
3
- Version: 1.5.0b0
3
+ Version: 1.5.0b1
4
4
  Summary: description
5
5
  Home-page: http://github.com/remyeltorro/celldetective
6
6
  Author: Rémy Torro
@@ -1 +0,0 @@
1
- __version__ = "1.5.0b"
@@ -1,111 +0,0 @@
1
- import os
2
- import ssl
3
- from tqdm import tqdm
4
- from multiprocessing import Process
5
- from glob import glob
6
- import shutil
7
- from urllib.request import urlopen
8
- import zipfile
9
- import tempfile
10
- import time
11
- from pathlib import Path
12
- import json
13
-
14
- class DownloadProcess(Process):
15
-
16
- def __init__(self, queue=None, process_args=None, *args, **kwargs):
17
-
18
- super().__init__(*args, **kwargs)
19
-
20
- if process_args is not None:
21
- for key, value in process_args.items():
22
- setattr(self, key, value)
23
-
24
- self.queue = queue
25
- self.progress = True
26
-
27
- file_path = Path(os.path.dirname(os.path.realpath(__file__)))
28
- zenodo_json = os.sep.join([str(file_path.parents[2]),"celldetective", "links", "zenodo.json"])
29
- print(f"{zenodo_json=}")
30
-
31
- with open(zenodo_json,"r") as f:
32
- zenodo_json = json.load(f)
33
- all_files = list(zenodo_json['files']['entries'].keys())
34
- all_files_short = [f.replace(".zip","") for f in all_files]
35
- zenodo_url = zenodo_json['links']['files'].replace('api/','')
36
- full_links = ["/".join([zenodo_url, f]) for f in all_files]
37
- index = all_files_short.index(self.file)
38
-
39
- self.zip_url = full_links[index]
40
- self.path_to_zip_file = os.sep.join([self.output_dir, 'temp.zip'])
41
-
42
- self.sum_done = 0
43
- self.t0 = time.time()
44
-
45
- def download_url_to_file(self, url, dst):
46
- try:
47
- file_size = None
48
- ssl._create_default_https_context = ssl._create_unverified_context
49
- u = urlopen(url)
50
- meta = u.info()
51
- if hasattr(meta, 'getheaders'):
52
- content_length = meta.getheaders("Content-Length")
53
- else:
54
- content_length = meta.get_all("Content-Length")
55
- if content_length is not None and len(content_length) > 0:
56
- file_size = int(content_length[0])
57
- # We deliberately save it in a temp file and move it after
58
- dst = os.path.expanduser(dst)
59
- dst_dir = os.path.dirname(dst)
60
- f = tempfile.NamedTemporaryFile(delete=False, dir=dst_dir)
61
-
62
- try:
63
- with tqdm(total=file_size, disable=not self.progress,
64
- unit='B', unit_scale=True, unit_divisor=1024) as pbar:
65
- while True:
66
- buffer = u.read(8192) #8192
67
- if len(buffer) == 0:
68
- break
69
- f.write(buffer)
70
- pbar.update(len(buffer))
71
- self.sum_done+=len(buffer) / file_size * 100
72
- mean_exec_per_step = (time.time() - self.t0) / (self.sum_done*file_size / 100 + 1)
73
- pred_time = (file_size - (self.sum_done*file_size / 100 + 1)) * mean_exec_per_step
74
- self.queue.put([self.sum_done, pred_time])
75
- f.close()
76
- shutil.move(f.name, dst)
77
- finally:
78
- f.close()
79
- if os.path.exists(f.name):
80
- os.remove(f.name)
81
- except Exception as e:
82
- print("No internet connection: ", e)
83
- return None
84
-
85
- def run(self):
86
-
87
- self.download_url_to_file(fr"{self.zip_url}",self.path_to_zip_file)
88
- with zipfile.ZipFile(self.path_to_zip_file, 'r') as zip_ref:
89
- zip_ref.extractall(self.output_dir)
90
-
91
- file_to_rename = glob(os.sep.join([self.output_dir,self.file,"*[!.json][!.png][!.h5][!.csv][!.npy][!.tif][!.ini]"]))
92
- if len(file_to_rename)>0 and not file_to_rename[0].endswith(os.sep) and not self.file.startswith('demo'):
93
- os.rename(file_to_rename[0], os.sep.join([self.output_dir,self.file,self.file]))
94
-
95
- os.remove(self.path_to_zip_file)
96
- self.queue.put([100,0])
97
- time.sleep(0.5)
98
-
99
- # Send end signal
100
- self.queue.put("finished")
101
- self.queue.close()
102
-
103
- def end_process(self):
104
-
105
- self.terminate()
106
- self.queue.put("finished")
107
-
108
- def abort_process(self):
109
-
110
- self.terminate()
111
- self.queue.put("error")
File without changes