spacr 0.3.42__tar.gz → 0.3.45__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 (278) hide show
  1. {spacr-0.3.42/spacr.egg-info → spacr-0.3.45}/PKG-INFO +1 -1
  2. {spacr-0.3.42 → spacr-0.3.45}/setup.py +1 -1
  3. {spacr-0.3.42 → spacr-0.3.45}/spacr/cellpose.py +63 -73
  4. {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_core.py +5 -5
  5. {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_utils.py +1 -1
  6. {spacr-0.3.42 → spacr-0.3.45}/spacr/io.py +76 -63
  7. {spacr-0.3.42 → spacr-0.3.45}/spacr/ml.py +4 -3
  8. {spacr-0.3.42 → spacr-0.3.45}/spacr/plot.py +265 -11
  9. {spacr-0.3.42 → spacr-0.3.45}/spacr/settings.py +29 -8
  10. {spacr-0.3.42 → spacr-0.3.45}/spacr/submodules.py +214 -10
  11. {spacr-0.3.42 → spacr-0.3.45}/spacr/toxo.py +5 -116
  12. {spacr-0.3.42 → spacr-0.3.45}/spacr/utils.py +103 -6
  13. {spacr-0.3.42 → spacr-0.3.45/spacr.egg-info}/PKG-INFO +1 -1
  14. {spacr-0.3.42 → spacr-0.3.45}/.readthedocs.yaml +0 -0
  15. {spacr-0.3.42 → spacr-0.3.45}/LICENSE +0 -0
  16. {spacr-0.3.42 → spacr-0.3.45}/MANIFEST.in +0 -0
  17. {spacr-0.3.42 → spacr-0.3.45}/README.rst +0 -0
  18. {spacr-0.3.42 → spacr-0.3.45}/deploy_docs.sh +0 -0
  19. {spacr-0.3.42 → spacr-0.3.45}/docs/requirements.txt +0 -0
  20. {spacr-0.3.42 → spacr-0.3.45}/docs/source/Makefile +0 -0
  21. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/doctrees/environment.pickle +0 -0
  22. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/index.html +0 -0
  23. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_annotate.html +0 -0
  24. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_classify.html +0 -0
  25. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_make_masks.html +0 -0
  26. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_mask.html +0 -0
  27. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_measure.html +0 -0
  28. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_sequencing.html +0 -0
  29. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/app_umap.html +0 -0
  30. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/core.html +0 -0
  31. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/deep_spacr.html +0 -0
  32. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/graph_learning.html +0 -0
  33. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui.html +0 -0
  34. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_core.html +0 -0
  35. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_elements.html +0 -0
  36. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/gui_utils.html +0 -0
  37. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/io.html +0 -0
  38. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/logger.html +0 -0
  39. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/measure.html +0 -0
  40. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/plot.html +0 -0
  41. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/sequencing.html +0 -0
  42. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/settings.html +0 -0
  43. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/sim.html +0 -0
  44. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/timelapse.html +0 -0
  45. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_modules/spacr/utils.html +0 -0
  46. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/index.rst.txt +0 -0
  47. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/modules.rst.txt +0 -0
  48. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_sources/spacr.rst.txt +0 -0
  49. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  50. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/basic.css +0 -0
  51. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/badge_only.css +0 -0
  52. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  53. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  54. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  55. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  56. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  57. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  58. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  59. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  60. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  61. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  62. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  63. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  64. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  65. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  66. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  67. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  68. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  69. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/css/theme.css +0 -0
  70. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/doctools.js +0 -0
  71. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/documentation_options.js +0 -0
  72. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/file.png +0 -0
  73. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/jquery.js +0 -0
  74. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/badge_only.js +0 -0
  75. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  76. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/html5shiv.min.js +0 -0
  77. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/js/theme.js +0 -0
  78. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/language_data.js +0 -0
  79. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/minus.png +0 -0
  80. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/plus.png +0 -0
  81. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/pygments.css +0 -0
  82. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/searchtools.js +0 -0
  83. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
  84. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/genindex.html +0 -0
  85. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/index.html +0 -0
  86. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/modules.html +0 -0
  87. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/objects.inv +0 -0
  88. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/py-modindex.html +0 -0
  89. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/search.html +0 -0
  90. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/searchindex.js +0 -0
  91. {spacr-0.3.42 → spacr-0.3.45}/docs/source/_build/html/spacr.html +0 -0
  92. {spacr-0.3.42 → spacr-0.3.45}/docs/source/conf.py +0 -0
  93. {spacr-0.3.42 → spacr-0.3.45}/docs/source/index.rst +0 -0
  94. {spacr-0.3.42 → spacr-0.3.45}/docs/source/make.bat +0 -0
  95. {spacr-0.3.42 → spacr-0.3.45}/docs/source/modules.rst +0 -0
  96. {spacr-0.3.42 → spacr-0.3.45}/docs/source/spacr.rst +0 -0
  97. {spacr-0.3.42 → spacr-0.3.45}/environment.yaml +0 -0
  98. {spacr-0.3.42 → spacr-0.3.45}/fonts/OpenSans-Regular.ttf +0 -0
  99. {spacr-0.3.42 → spacr-0.3.45}/notebooks/cv_scoring_nb.ipynb +0 -0
  100. {spacr-0.3.42 → spacr-0.3.45}/notebooks/deep_learning_spacr.ipynb +0 -0
  101. {spacr-0.3.42 → spacr-0.3.45}/notebooks/machine_learning_spacr_nb.ipynb +0 -0
  102. {spacr-0.3.42 → spacr-0.3.45}/notebooks/spacr_0.1_all_settings_git.ipynb +0 -0
  103. {spacr-0.3.42 → spacr-0.3.45}/notebooks/spacr_0.1_minimal.ipynb +0 -0
  104. {spacr-0.3.42 → spacr-0.3.45}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
  105. {spacr-0.3.42 → spacr-0.3.45}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
  106. {spacr-0.3.42 → spacr-0.3.45}/path/settings/preprocess_generate_masks_settings.csv +0 -0
  107. {spacr-0.3.42 → spacr-0.3.45}/requirements.txt +0 -0
  108. {spacr-0.3.42 → spacr-0.3.45}/settings/measure_crop_settings.csv +0 -0
  109. {spacr-0.3.42 → spacr-0.3.45}/setup.cfg +0 -0
  110. {spacr-0.3.42 → spacr-0.3.45}/setup_docs.sh +0 -0
  111. {spacr-0.3.42 → spacr-0.3.45}/source/conf.py +0 -0
  112. {spacr-0.3.42 → spacr-0.3.45}/source/index.rst +0 -0
  113. {spacr-0.3.42 → spacr-0.3.45}/source/modules.rst +0 -0
  114. {spacr-0.3.42 → spacr-0.3.45}/source/setup.rst +0 -0
  115. {spacr-0.3.42 → spacr-0.3.45}/source/spacr.rst +0 -0
  116. {spacr-0.3.42 → spacr-0.3.45}/spacr/__init__.py +0 -0
  117. {spacr-0.3.42 → spacr-0.3.45}/spacr/__main__.py +0 -0
  118. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_annotate.py +0 -0
  119. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_classify.py +0 -0
  120. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_make_masks.py +0 -0
  121. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_mask.py +0 -0
  122. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_measure.py +0 -0
  123. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_sequencing.py +0 -0
  124. {spacr-0.3.42 → spacr-0.3.45}/spacr/app_umap.py +0 -0
  125. {spacr-0.3.42 → spacr-0.3.45}/spacr/core.py +0 -0
  126. {spacr-0.3.42 → spacr-0.3.45}/spacr/deep_spacr.py +0 -0
  127. {spacr-0.3.42 → spacr-0.3.45}/spacr/gui.py +0 -0
  128. {spacr-0.3.42 → spacr-0.3.45}/spacr/gui_elements.py +0 -0
  129. {spacr-0.3.42 → spacr-0.3.45}/spacr/logger.py +0 -0
  130. {spacr-0.3.42 → spacr-0.3.45}/spacr/measure.py +0 -0
  131. {spacr-0.3.42 → spacr-0.3.45}/spacr/mediar.py +0 -0
  132. {spacr-0.3.42 → spacr-0.3.45}/spacr/openai.py +0 -0
  133. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/.gitignore +0 -0
  134. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/LICENSE +0 -0
  135. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/README.md +0 -0
  136. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/SetupDict.py +0 -0
  137. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/baseline.json +0 -0
  138. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
  139. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
  140. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
  141. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
  142. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
  143. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
  144. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
  145. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
  146. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
  147. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
  148. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
  149. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
  150. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
  151. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
  152. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
  153. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
  154. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
  155. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
  156. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
  157. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/__init__.py +0 -0
  158. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/core/utils.py +0 -0
  159. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/evaluate.py +0 -0
  160. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
  161. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  162. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  163. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  164. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  165. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  166. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  167. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/main.py +0 -0
  168. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/predict.py +0 -0
  169. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/requirements.txt +0 -0
  170. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
  171. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
  172. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
  173. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
  174. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
  175. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
  176. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  177. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
  178. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
  179. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
  180. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
  181. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
  182. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
  183. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
  184. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/data/lopit.csv +0 -0
  185. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  186. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OFL.txt +0 -0
  187. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  188. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  189. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/README.txt +0 -0
  190. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  191. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  192. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  193. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  194. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  195. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  196. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  197. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  198. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  199. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  200. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  201. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  202. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  203. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  204. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  205. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  206. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  207. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  208. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  209. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  210. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  211. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  212. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  213. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  214. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  215. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  216. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  217. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  218. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  219. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  220. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  221. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  222. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  223. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  224. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  225. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  226. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/abort.png +0 -0
  227. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/annotate.png +0 -0
  228. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/cellpose_all.png +0 -0
  229. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/cellpose_masks.png +0 -0
  230. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/classify.png +0 -0
  231. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/convert.png +0 -0
  232. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/default.png +0 -0
  233. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/dna_matrix.mp4 +0 -0
  234. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/download.png +0 -0
  235. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo.pdf +0 -0
  236. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo_spacr.png +0 -0
  237. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/logo_spacr_1.png +0 -0
  238. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/make_masks.png +0 -0
  239. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/map_barcodes.png +0 -0
  240. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/mask.png +0 -0
  241. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/measure.png +0 -0
  242. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/ml_analyze.png +0 -0
  243. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/plaque.png +0 -0
  244. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/recruitment.png +0 -0
  245. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/regression.png +0 -0
  246. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/run.png +0 -0
  247. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/sequencing.png +0 -0
  248. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/settings.png +0 -0
  249. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/train_cellpose.png +0 -0
  250. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/icons/umap.png +0 -0
  251. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  252. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  253. {spacr-0.3.42 → spacr-0.3.45}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  254. {spacr-0.3.42 → spacr-0.3.45}/spacr/sequencing.py +0 -0
  255. {spacr-0.3.42 → spacr-0.3.45}/spacr/sim.py +0 -0
  256. {spacr-0.3.42 → spacr-0.3.45}/spacr/timelapse.py +0 -0
  257. {spacr-0.3.42 → spacr-0.3.45}/spacr/version.py +0 -0
  258. {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/SOURCES.txt +0 -0
  259. {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/dependency_links.txt +0 -0
  260. {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/entry_points.txt +0 -0
  261. {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/requires.txt +0 -0
  262. {spacr-0.3.42 → spacr-0.3.45}/spacr.egg-info/top_level.txt +0 -0
  263. {spacr-0.3.42 → spacr-0.3.45}/tests/test_annotate_app.py +0 -0
  264. {spacr-0.3.42 → spacr-0.3.45}/tests/test_core.py +0 -0
  265. {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_classify_app.py +0 -0
  266. {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_mask_app.py +0 -0
  267. {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_measure_app.py +0 -0
  268. {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_sim_app.py +0 -0
  269. {spacr-0.3.42 → spacr-0.3.45}/tests/test_gui_utils.py +0 -0
  270. {spacr-0.3.42 → spacr-0.3.45}/tests/test_io.py +0 -0
  271. {spacr-0.3.42 → spacr-0.3.45}/tests/test_mask_app.py +0 -0
  272. {spacr-0.3.42 → spacr-0.3.45}/tests/test_measure.py +0 -0
  273. {spacr-0.3.42 → spacr-0.3.45}/tests/test_plot.py +0 -0
  274. {spacr-0.3.42 → spacr-0.3.45}/tests/test_sim.py +0 -0
  275. {spacr-0.3.42 → spacr-0.3.45}/tests/test_timelapse.py +0 -0
  276. {spacr-0.3.42 → spacr-0.3.45}/tests/test_train.py +0 -0
  277. {spacr-0.3.42 → spacr-0.3.45}/tests/test_umap.py +0 -0
  278. {spacr-0.3.42 → spacr-0.3.45}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.42
3
+ Version: 0.3.45
4
4
  Summary: Spatial phenotype analysis of crisp screens (SpaCr)
5
5
  Home-page: https://github.com/EinarOlafsson/spacr
6
6
  Author: Einar Birnir Olafsson
@@ -67,7 +67,7 @@ dependencies = [
67
67
 
68
68
  setup(
69
69
  name="spacr",
70
- version="0.3.42",
70
+ version="0.3.45",
71
71
  author="Einar Birnir Olafsson",
72
72
  author_email="olafsson@med.umich.com",
73
73
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -5,50 +5,23 @@ from cellpose import models as cp_models
5
5
  from IPython.display import display
6
6
  from multiprocessing import Pool
7
7
  from skimage.transform import resize as resizescikit
8
+ from scipy.ndimage import binary_fill_holes
8
9
 
9
10
  def identify_masks_finetune(settings):
10
11
 
11
12
  from .plot import print_mask_and_flows
12
- from .utils import resize_images_and_labels, print_progress
13
+ from .utils import resize_images_and_labels, print_progress, save_settings, fill_holes_in_mask
13
14
  from .io import _load_normalized_images_and_labels, _load_images_and_labels
14
15
  from .settings import get_identify_masks_finetune_default_settings
15
16
 
16
17
  settings = get_identify_masks_finetune_default_settings(settings)
17
- src=settings['src']
18
- dst=settings['dst']
19
- model_name=settings['model_name']
20
- custom_model=settings['custom_model']
21
- channels = settings['channels']
22
- background = settings['background']
23
- remove_background=settings['remove_background']
24
- Signal_to_noise = settings['Signal_to_noise']
25
- CP_prob = settings['CP_prob']
26
- diameter=settings['diameter']
27
- batch_size=settings['batch_size']
28
- flow_threshold=settings['flow_threshold']
29
- save=settings['save']
30
- verbose=settings['verbose']
31
-
32
- # static settings
33
- normalize = settings['normalize']
34
- percentiles = settings['percentiles']
35
- circular = settings['circular']
36
- invert = settings['invert']
37
- resize = settings['resize']
38
-
39
- if resize:
40
- target_height = settings['target_height']
41
- target_width = settings['target_width']
42
-
43
- rescale = settings['rescale']
44
- resample = settings['resample']
45
- grayscale = settings['grayscale']
46
-
18
+ save_settings(settings, name='generate_cellpose_masks', show=True)
19
+ dst = os.path.join(settings['src'], 'masks')
47
20
  os.makedirs(dst, exist_ok=True)
48
21
 
49
- if not custom_model is None:
50
- if not os.path.exists(custom_model):
51
- print(f'Custom model not found: {custom_model}')
22
+ if not settings['custom_model'] is None:
23
+ if not os.path.exists(settings['custom_model']):
24
+ print(f"Custom model not found: {settings['custom_model']}")
52
25
  return
53
26
 
54
27
  if not torch.cuda.is_available():
@@ -56,43 +29,60 @@ def identify_masks_finetune(settings):
56
29
 
57
30
  device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
58
31
 
59
- if custom_model == None:
60
- model = cp_models.CellposeModel(gpu=True, model_type=model_name, device=device)
61
- print(f'Loaded model: {model_name}')
32
+ if settings['custom_model'] == None:
33
+ model = cp_models.CellposeModel(gpu=True, model_type=settings['model_name'], device=device)
34
+ print(f"Loaded model: {settings['model_name']}")
62
35
  else:
63
- model = cp_models.CellposeModel(gpu=torch.cuda.is_available(), model_type=None, pretrained_model=custom_model, diam_mean=diameter, device=device)
36
+ model = cp_models.CellposeModel(gpu=torch.cuda.is_available(), model_type=None, pretrained_model=settings['custom_model'], diam_mean=settings['diameter'], device=device)
64
37
  print("Pretrained Model Loaded:", model.pretrained_model)
65
38
 
66
- chans = [2, 1] if model_name == 'cyto2' else [0,0] if model_name == 'nucleus' else [1,0] if model_name == 'cyto' else [2, 0]
39
+ chans = [2, 1] if settings['model_name'] == 'cyto2' else [0,0] if settings['model_name'] == 'nucleus' else [1,0] if settings['model_name'] == 'cyto' else [2, 0]
67
40
 
68
- if grayscale:
41
+ if settings['grayscale']:
69
42
  chans=[0, 0]
70
43
 
71
- print(f'Using channels: {chans} for model of type {model_name}')
44
+ print(f"Using channels: {chans} for model of type {settings['model_name']}")
72
45
 
73
- if verbose == True:
74
- print(f'Cellpose settings: Model: {model_name}, channels: {channels}, cellpose_chans: {chans}, diameter:{diameter}, flow_threshold:{flow_threshold}, cellprob_threshold:{CP_prob}')
46
+ if settings['verbose'] == True:
47
+ print(f"Cellpose settings: Model: {settings['model_name']}, channels: {settings['channels']}, cellpose_chans: {chans}, diameter:{settings['diameter']}, flow_threshold:{settings['flow_threshold']}, cellprob_threshold:{settings['CP_prob']}")
75
48
 
76
- all_image_files = [os.path.join(src, f) for f in os.listdir(src) if f.endswith('.tif')]
77
- mask_files = set(os.listdir(os.path.join(src, 'masks')))
78
- all_image_files = [f for f in all_image_files if os.path.basename(f) not in mask_files]
49
+ image_files = [os.path.join(settings['src'], f) for f in os.listdir(settings['src']) if f.endswith('.tif')]
50
+ mask_files = set(os.listdir(os.path.join(settings['src'], 'masks')))
51
+ all_image_files = [f for f in image_files if os.path.basename(f) not in mask_files]
79
52
  random.shuffle(all_image_files)
53
+
54
+ print(f"Found {len(image_files)} Images with {len(mask_files)} masks. Generating masks for {len(all_image_files)} images")
55
+
56
+ if len(all_image_files) == 0:
57
+ print(f"Either no images were found in {settings['src']} or all images have masks in {settings['dst']}")
58
+ return
59
+
80
60
 
81
61
  time_ls = []
82
- for i in range(0, len(all_image_files), batch_size):
62
+ for i in range(0, len(all_image_files), settings['batch_size']):
83
63
  gc.collect()
84
- image_files = all_image_files[i:i+batch_size]
64
+ image_files = all_image_files[i:i+settings['batch_size']]
85
65
 
86
- if normalize:
87
- images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files=image_files, label_files=None, channels=channels, percentiles=percentiles, circular=circular, invert=invert, visualize=verbose, remove_background=remove_background, background=background, Signal_to_noise=Signal_to_noise, target_height=target_height, target_width=target_width)
66
+ if settings['normalize']:
67
+ images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files=image_files,
68
+ label_files=None,
69
+ channels=settings['channels'],
70
+ percentiles=settings['percentiles'],
71
+ invert=settings['invert'],
72
+ visualize=settings['verbose'],
73
+ remove_background=settings['remove_background'],
74
+ background=settings['background'],
75
+ Signal_to_noise=settings['Signal_to_noise'],
76
+ target_height=settings['target_height'],
77
+ target_width=settings['target_width'])
78
+
88
79
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
89
- #orig_dims = [(image.shape[0], image.shape[1]) for image in images]
90
80
  else:
91
- images, _, image_names, _ = _load_images_and_labels(image_files=image_files, label_files=None, circular=circular, invert=invert)
81
+ images, _, image_names, _ = _load_images_and_labels(image_files=image_files, label_files=None, invert=settings['invert'])
92
82
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
93
83
  orig_dims = [(image.shape[0], image.shape[1]) for image in images]
94
- if resize:
95
- images, _ = resize_images_and_labels(images, None, target_height, target_width, True)
84
+ if settings['resize']:
85
+ images, _ = resize_images_and_labels(images, None, settings['target_height'], settings['target_width'], True)
96
86
 
97
87
  for file_index, stack in enumerate(images):
98
88
  start = time.time()
@@ -100,11 +90,11 @@ def identify_masks_finetune(settings):
100
90
  normalize=False,
101
91
  channels=chans,
102
92
  channel_axis=3,
103
- diameter=diameter,
104
- flow_threshold=flow_threshold,
105
- cellprob_threshold=CP_prob,
106
- rescale=rescale,
107
- resample=resample,
93
+ diameter=settings['diameter'],
94
+ flow_threshold=settings['flow_threshold'],
95
+ cellprob_threshold=settings['CP_prob'],
96
+ rescale=settings['rescale'],
97
+ resample=settings['resample'],
108
98
  progress=True)
109
99
 
110
100
  if len(output) == 4:
@@ -113,8 +103,11 @@ def identify_masks_finetune(settings):
113
103
  mask, flows, _ = output
114
104
  else:
115
105
  raise ValueError("Unexpected number of return values from model.eval()")
106
+
107
+ if settings['fill_in']:
108
+ mask = fill_holes_in_mask(mask).astype(mask.dtype)
116
109
 
117
- if resize:
110
+ if settings['resize']:
118
111
  dims = orig_dims[file_index]
119
112
  mask = resizescikit(mask, dims, order=0, preserve_range=True, anti_aliasing=False).astype(mask.dtype)
120
113
 
@@ -123,15 +116,13 @@ def identify_masks_finetune(settings):
123
116
  time_ls.append(duration)
124
117
  files_processed = len(images)
125
118
  files_to_process = file_index+1
126
- print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls)
127
- print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls, batch_size=None, operation_type="")
128
-
119
+ print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls, batch_size=None, operation_type="generate cellpose masks")
129
120
 
130
- if verbose:
131
- if resize:
121
+ if settings['verbose']:
122
+ if settings['resize']:
132
123
  stack = resizescikit(stack, dims, preserve_range=True, anti_aliasing=False).astype(stack.dtype)
133
- print_mask_and_flows(stack, mask, flows, overlay=True)
134
- if save:
124
+ print_mask_and_flows(stack, mask, flows)
125
+ if settings['save']:
135
126
  os.makedirs(dst, exist_ok=True)
136
127
  output_filename = os.path.join(dst, image_names[file_index])
137
128
  cv2.imwrite(output_filename, mask)
@@ -139,7 +130,7 @@ def identify_masks_finetune(settings):
139
130
  gc.collect()
140
131
  return
141
132
 
142
- def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellprob_threshold, flow_threshold, grayscale, save, normalize, channels, percentiles, circular, invert, plot, resize, target_height, target_width, remove_background, background, Signal_to_noise, verbose):
133
+ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellprob_threshold, flow_threshold, grayscale, save, normalize, channels, percentiles, invert, plot, resize, target_height, target_width, remove_background, background, Signal_to_noise, verbose):
143
134
 
144
135
  from .io import _load_images_and_labels, _load_normalized_images_and_labels
145
136
  from .utils import resize_images_and_labels, resizescikit, print_progress
@@ -164,11 +155,11 @@ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellp
164
155
  image_files = all_image_files[i:i+batch_size]
165
156
 
166
157
  if normalize:
167
- images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files, None, channels, percentiles, circular, invert, plot, remove_background, background, Signal_to_noise, target_height, target_width)
158
+ images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files, None, channels, percentiles, invert, plot, remove_background, background, Signal_to_noise, target_height, target_width)
168
159
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
169
160
  orig_dims = [(image.shape[0], image.shape[1]) for image in images]
170
161
  else:
171
- images, _, image_names, _ = _load_images_and_labels(image_files, None, circular, invert)
162
+ images, _, image_names, _ = _load_images_and_labels(image_files, None, invert)
172
163
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
173
164
  orig_dims = [(image.shape[0], image.shape[1]) for image in images]
174
165
  if resize:
@@ -209,12 +200,11 @@ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellp
209
200
  if plot:
210
201
  if resize:
211
202
  stack = resizescikit(stack, dims, preserve_range=True, anti_aliasing=False).astype(stack.dtype)
212
- print_mask_and_flows(stack, mask, flows, overlay=True)
203
+ print_mask_and_flows(stack, mask, flows)
213
204
  if save:
214
205
  output_filename = os.path.join(dst, image_names[file_index])
215
206
  cv2.imwrite(output_filename, mask)
216
207
 
217
-
218
208
  def check_cellpose_models(settings):
219
209
 
220
210
  from .settings import get_check_cellpose_models_default_settings
@@ -233,7 +223,7 @@ def check_cellpose_models(settings):
233
223
 
234
224
  model = cp_models.CellposeModel(gpu=True, model_type=model_name, device=device)
235
225
  print(f'Using {model_name}')
236
- generate_masks_from_imgs(src, model, model_name, settings['batch_size'], settings['diameter'], settings['CP_prob'], settings['flow_threshold'], settings['grayscale'], settings['save'], settings['normalize'], settings['channels'], settings['percentiles'], settings['circular'], settings['invert'], settings['plot'], settings['resize'], settings['target_height'], settings['target_width'], settings['remove_background'], settings['background'], settings['Signal_to_noise'], settings['verbose'])
226
+ generate_masks_from_imgs(src, model, model_name, settings['batch_size'], settings['diameter'], settings['CP_prob'], settings['flow_threshold'], settings['grayscale'], settings['save'], settings['normalize'], settings['channels'], settings['percentiles'], settings['invert'], settings['plot'], settings['resize'], settings['target_height'], settings['target_width'], settings['remove_background'], settings['background'], settings['Signal_to_noise'], settings['verbose'])
237
227
 
238
228
  return
239
229
 
@@ -384,8 +384,8 @@ def import_settings(settings_type='mask'):
384
384
  from .gui_utils import convert_settings_dict_for_gui, hide_all_settings
385
385
  from .settings import generate_fields, set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model
386
386
  from .settings import set_default_generate_barecode_mapping, set_default_umap_image_settings, get_analyze_recruitment_default_settings
387
- from .settings import get_default_generate_activation_map_settings
388
- #activation
387
+ from .settings import get_default_generate_activation_map_settings, get_analyze_plaque_settings
388
+
389
389
  def read_settings_from_csv(csv_file_path):
390
390
  settings = {}
391
391
  with open(csv_file_path, newline='') as csvfile:
@@ -428,7 +428,7 @@ def import_settings(settings_type='mask'):
428
428
  elif settings_type == 'activation':
429
429
  settings = get_default_generate_activation_map_settings(settings={})
430
430
  elif settings_type == 'analyze_plaques':
431
- settings = {}
431
+ settings = get_analyze_plaque_settings(settings={})
432
432
  elif settings_type == 'convert':
433
433
  settings = {}
434
434
  else:
@@ -443,7 +443,7 @@ def setup_settings_panel(vertical_container, settings_type='mask'):
443
443
  global vars_dict, scrollable_frame
444
444
  from .settings import get_identify_masks_finetune_default_settings, set_default_analyze_screen, set_default_settings_preprocess_generate_masks
445
445
  from .settings import get_measure_crop_settings, deep_spacr_defaults, set_default_generate_barecode_mapping, set_default_umap_image_settings
446
- from .settings import get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings
446
+ from .settings import get_map_barcodes_default_settings, get_analyze_recruitment_default_settings, get_check_cellpose_models_default_settings, get_analyze_plaque_settings
447
447
  from .settings import generate_fields, get_perform_regression_default_settings, get_train_cellpose_default_settings, get_default_generate_activation_map_settings
448
448
  from .gui_utils import convert_settings_dict_for_gui
449
449
  from .gui_elements import set_element_size
@@ -490,7 +490,7 @@ def setup_settings_panel(vertical_container, settings_type='mask'):
490
490
  elif settings_type == 'activation':
491
491
  settings = get_default_generate_activation_map_settings(settings={})
492
492
  elif settings_type == 'analyze_plaques':
493
- settings = {'src':'path to images'}
493
+ settings = get_analyze_plaque_settings(settings={})
494
494
  elif settings_type == 'convert':
495
495
  settings = {'src':'path to images'}
496
496
  else:
@@ -380,7 +380,7 @@ def convert_settings_dict_for_gui(settings):
380
380
  variables = {}
381
381
  special_cases = {
382
382
  'metadata_type': ('combo', ['cellvoyager', 'cq1', 'nikon', 'zeis', 'custom'], 'cellvoyager'),
383
- 'channels': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]'], '[0,1,2,3]'),
383
+ 'channels': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]', '[0,0]'], '[0,1,2,3]'),
384
384
  'train_channels': ('combo', ["['r','g','b']", "['r','g']", "['r','b']", "['g','b']", "['r']", "['g']", "['b']"], "['r','g','b']"),
385
385
  'channel_dims': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]'], '[0,1,2,3]'),
386
386
  'dataset_mode': ('combo', ['annotation', 'metadata', 'recruitment'], 'metadata'),
@@ -129,7 +129,7 @@ def process_non_tif_non_2D_images(folder):
129
129
  except Exception as e:
130
130
  print(f"Error processing {filename}: {str(e)}")
131
131
 
132
- def _load_images_and_labels(image_files, label_files, circular=False, invert=False):
132
+ def _load_images_and_labels(image_files, label_files, invert=False):
133
133
 
134
134
  from .utils import invert_image, apply_mask
135
135
 
@@ -151,8 +151,6 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
151
151
  image = cellpose.io.imread(img_file)
152
152
  if invert:
153
153
  image = invert_image(image)
154
- if circular:
155
- image = apply_mask(image, output_value=0)
156
154
  label = cellpose.io.imread(lbl_file)
157
155
  if image.max() > 1:
158
156
  image = image / image.max()
@@ -163,16 +161,12 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
163
161
  image = cellpose.io.imread(img_file)
164
162
  if invert:
165
163
  image = invert_image(image)
166
- if circular:
167
- image = apply_mask(image, output_value=0)
168
164
  if image.max() > 1:
169
165
  image = image / image.max()
170
166
  images.append(image)
171
167
  elif not image_files is None:
172
168
  for lbl_file in label_files:
173
169
  label = cellpose.io.imread(lbl_file)
174
- if circular:
175
- label = apply_mask(label, output_value=0)
176
170
  labels.append(label)
177
171
 
178
172
  if not image_files is None:
@@ -191,107 +185,127 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
191
185
  print(f'image shape: {images[0].shape}, image type: images[0].shape mask shape: {labels[0].shape}, image type: labels[0].shape')
192
186
  return images, labels, image_names, label_names
193
187
 
194
- def _load_normalized_images_and_labels_v1(image_files, label_files, channels=None, percentiles=None, circular=False, invert=False, visualize=False, remove_background=False, background=0, Signal_to_noise=10):
188
+ def _load_normalized_images_and_labels(image_files, label_files, channels=None, percentiles=None,
189
+ invert=False, visualize=False, remove_background=False,
190
+ background=0, Signal_to_noise=10, target_height=None, target_width=None):
195
191
 
196
- from .plot import normalize_and_visualize
192
+ from .plot import normalize_and_visualize, plot_resize
197
193
  from .utils import invert_image, apply_mask
194
+ from skimage.transform import resize as resizescikit
195
+
196
+ # Ensure percentiles are valid
197
+ if isinstance(percentiles, list) and len(percentiles) == 2:
198
+ try:
199
+ percentiles = [int(percentiles[0]), int(percentiles[1])]
200
+ except ValueError:
201
+ percentiles = None
202
+ else:
203
+ percentiles = None
198
204
 
199
- signal_thresholds = background*Signal_to_noise
205
+ signal_thresholds = float(background) * float(Signal_to_noise)
200
206
  lower_percentile = 2
201
207
 
202
- images = []
203
- labels = []
204
-
208
+ images, labels, orig_dims = [], [], []
205
209
  num_channels = 4
206
210
  percentiles_1 = [[] for _ in range(num_channels)]
207
211
  percentiles_99 = [[] for _ in range(num_channels)]
208
212
 
209
213
  image_names = [os.path.basename(f) for f in image_files]
210
-
214
+ image_dir = os.path.dirname(image_files[0])
215
+
211
216
  if label_files is not None:
212
217
  label_names = [os.path.basename(f) for f in label_files]
213
218
  label_dir = os.path.dirname(label_files[0])
219
+ else:
220
+ label_names, label_dir = [], None
214
221
 
215
- # Load images and check percentiles
216
- for i,img_file in enumerate(image_files):
222
+ # Load, normalize, and resize images
223
+ for i, img_file in enumerate(image_files):
217
224
  image = cellpose.io.imread(img_file)
225
+ orig_dims.append((image.shape[0], image.shape[1]))
226
+
218
227
  if invert:
219
228
  image = invert_image(image)
220
- if circular:
221
- image = apply_mask(image, output_value=0)
222
229
 
223
- # If specific channels are specified, select them
230
+ # Select specific channels if needed
224
231
  if channels is not None and image.ndim == 3:
225
232
  image = image[..., channels]
226
233
 
227
234
  if remove_background:
228
- image[image < background] = 0
229
-
235
+ image = np.where(image < background, 0, image)
236
+
230
237
  if image.ndim < 3:
231
238
  image = np.expand_dims(image, axis=-1)
232
-
233
- images.append(image)
239
+
240
+ # Calculate percentiles if not provided
234
241
  if percentiles is None:
235
242
  for c in range(image.shape[-1]):
236
243
  p1 = np.percentile(image[..., c], lower_percentile)
237
244
  percentiles_1[c].append(p1)
245
+
246
+ # Ensure `signal_thresholds` and `p` are floats for comparison
238
247
  for percentile in [98, 99, 99.9, 99.99, 99.999]:
239
248
  p = np.percentile(image[..., c], percentile)
240
- if p > signal_thresholds:
249
+ if float(p) > signal_thresholds:
241
250
  percentiles_99[c].append(p)
242
251
  break
243
-
244
- if not percentiles is None:
245
- normalized_images = []
246
- for image in images:
247
- normalized_image = np.zeros_like(image, dtype=np.float32)
248
- for c in range(image.shape[-1]):
249
- low_p = np.percentile(image[..., c], percentiles[0])
250
- high_p = np.percentile(image[..., c], percentiles[1])
251
- normalized_image[..., c] = rescale_intensity(image[..., c], in_range=(low_p, high_p), out_range=(0, 1))
252
- normalized_images.append(normalized_image)
253
- if visualize:
254
- normalize_and_visualize(image, normalized_image, title=f"Channel {c+1} Normalized")
255
-
252
+
253
+ # Resize image if required
254
+ if target_height and target_width:
255
+ image_shape = (target_height, target_width) if image.ndim == 2 else (target_height, target_width, image.shape[-1])
256
+ image = resizescikit(image, image_shape, preserve_range=True, anti_aliasing=True).astype(image.dtype)
257
+
258
+ images.append(image)
259
+
260
+ # Calculate average percentiles if needed
256
261
  if percentiles is None:
257
- # Calculate average percentiles for normalization
258
262
  avg_p1 = [np.mean(p) for p in percentiles_1]
259
- avg_p99 = [np.mean(p) if len(p) > 0 else np.mean(percentiles_1[i]) for i, p in enumerate(percentiles_99)]
263
+ avg_p99 = [np.mean(p) if p else avg_p1[i] for i, p in enumerate(percentiles_99)]
260
264
 
261
265
  print(f'Average 1st percentiles: {avg_p1}, Average 99th percentiles: {avg_p99}')
262
266
 
263
- normalized_images = []
264
- for image in images:
265
- normalized_image = np.zeros_like(image, dtype=np.float32)
266
- for c in range(image.shape[-1]):
267
- normalized_image[..., c] = rescale_intensity(image[..., c], in_range=(avg_p1[c], avg_p99[c]), out_range=(0, 1))
268
- normalized_images.append(normalized_image)
269
- if visualize:
270
- normalize_and_visualize(image, normalized_image, title=f"Channel {c+1} Normalized")
271
-
272
- if not image_files is None:
273
- image_dir = os.path.dirname(image_files[0])
267
+ normalized_images = [
268
+ np.stack([rescale_intensity(img[..., c], in_range=(avg_p1[c], avg_p99[c]), out_range=(0, 1))
269
+ for c in range(img.shape[-1])], axis=-1) for img in images
270
+ ]
274
271
 
275
272
  else:
276
- image_dir = None
277
-
273
+ normalized_images = [
274
+ np.stack([rescale_intensity(img[..., c],
275
+ in_range=(np.percentile(img[..., c], percentiles[0]),
276
+ np.percentile(img[..., c], percentiles[1])),
277
+ out_range=(0, 1)) for c in range(img.shape[-1])], axis=-1)
278
+ for img in images
279
+ ]
280
+
281
+ # Load and resize labels if provided
278
282
  if label_files is not None:
279
- for lbl_file in label_files:
280
- labels.append(cellpose.io.imread(lbl_file))
281
- else:
282
- label_names = []
283
- label_dir = None
283
+ labels = [resizescikit(cellpose.io.imread(lbl_file),
284
+ (target_height, target_width) if target_height and target_width else orig_dims[i],
285
+ order=0, preserve_range=True, anti_aliasing=False).astype(np.uint8)
286
+ for i, lbl_file in enumerate(label_files)]
284
287
 
285
288
  print(f'Loaded and normalized {len(normalized_images)} images and {len(labels)} labels from {image_dir} and {label_dir}')
286
-
287
- return normalized_images, labels, image_names, label_names
288
289
 
289
- def _load_normalized_images_and_labels(image_files, label_files, channels=None, percentiles=None, circular=False, invert=False, visualize=False, remove_background=False, background=0, Signal_to_noise=10, target_height=None, target_width=None):
290
+ if visualize and images and labels:
291
+ plot_resize(images, normalized_images, labels, labels)
292
+
293
+ return normalized_images, labels, image_names, label_names, orig_dims
294
+
295
+ def _load_normalized_images_and_labels_v1(image_files, label_files, channels=None, percentiles=None, invert=False, visualize=False, remove_background=False, background=0, Signal_to_noise=10, target_height=None, target_width=None):
290
296
 
291
297
  from .plot import normalize_and_visualize, plot_resize
292
298
  from .utils import invert_image, apply_mask
293
299
  from skimage.transform import resize as resizescikit
294
300
 
301
+ if isinstance(percentiles, list):
302
+ if len(percentiles) !=2:
303
+ percentiles = None
304
+ if not percentiles[0] is int:
305
+ percentiles = None
306
+ if not percentiles[1] is int:
307
+ percentiles = None
308
+
295
309
  signal_thresholds = background * Signal_to_noise
296
310
  lower_percentile = 2
297
311
 
@@ -316,8 +330,6 @@ def _load_normalized_images_and_labels(image_files, label_files, channels=None,
316
330
  orig_dims.append((image.shape[0], image.shape[1]))
317
331
  if invert:
318
332
  image = invert_image(image)
319
- if circular:
320
- image = apply_mask(image, output_value=0)
321
333
 
322
334
  # If specific channels are specified, select them
323
335
  if channels is not None and image.ndim == 3:
@@ -2123,7 +2135,8 @@ def _load_and_concatenate_arrays(src, channels, cell_chann_dim, nucleus_chann_di
2123
2135
  # For each of the other folders, load the array and add it to 'stack_ls'
2124
2136
  for folder in folder_paths[1:]:
2125
2137
  array_path = os.path.join(folder, filename)
2126
- array = np.load(array_path)
2138
+ #array = np.load(array_path)
2139
+ array = np.load(array_path, allow_pickle=True)
2127
2140
  if array.ndim == 2:
2128
2141
  array = np.expand_dims(array, axis=-1) # Add an extra dimension if the array is 2D
2129
2142
  stack_ls.append(array)
@@ -450,13 +450,14 @@ def perform_regression(settings):
450
450
  else:
451
451
  return df
452
452
 
453
-
454
-
455
453
  settings = get_perform_regression_default_settings(settings)
456
454
  count_data_df, score_data_df = _perform_regression_read_data(settings)
457
455
  results_path, results_path_gene, results_path_grna, hits_path, res_folder, csv_path = _perform_regression_set_paths(settings)
458
456
  save_settings(settings, name='regression', show=True)
459
457
 
458
+ count_source = os.path.dirname(settings['count_data'][0])
459
+ volcano_path = os.path.join(count_source, 'volcano_plot.pdf')
460
+
460
461
  if isinstance(settings['filter_value'], list):
461
462
  filter_value = settings['filter_value']
462
463
  else:
@@ -548,7 +549,7 @@ def perform_regression(settings):
548
549
  base_dir = os.path.dirname(os.path.abspath(__file__))
549
550
  metadata_path = os.path.join(base_dir, 'resources', 'data', 'lopit.csv')
550
551
 
551
- custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', point_size=200, figsize=20, threshold=reg_threshold, split_axis_lims=settings['split_axis_lims'])
552
+ custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', point_size=200, figsize=20, threshold=reg_threshold, split_axis_lims=settings['split_axis_lims'], save_path=volcano_path)
552
553
  #custom_volcano_plot(data_path_gene, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
553
554
  #custom_volcano_plot(data_path_grna, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
554
555