spacr 0.3.41__tar.gz → 0.3.43__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.41/spacr.egg-info → spacr-0.3.43}/PKG-INFO +1 -1
  2. {spacr-0.3.41 → spacr-0.3.43}/setup.py +1 -1
  3. {spacr-0.3.41 → spacr-0.3.43}/spacr/cellpose.py +0 -2
  4. {spacr-0.3.41 → spacr-0.3.43}/spacr/gui_core.py +5 -5
  5. {spacr-0.3.41 → spacr-0.3.43}/spacr/gui_utils.py +1 -1
  6. {spacr-0.3.41 → spacr-0.3.43}/spacr/io.py +74 -51
  7. {spacr-0.3.41 → spacr-0.3.43}/spacr/measure.py +4 -4
  8. {spacr-0.3.41 → spacr-0.3.43}/spacr/ml.py +26 -26
  9. {spacr-0.3.41 → spacr-0.3.43}/spacr/plot.py +1 -1
  10. {spacr-0.3.41 → spacr-0.3.43}/spacr/settings.py +49 -15
  11. {spacr-0.3.41 → spacr-0.3.43}/spacr/submodules.py +161 -2
  12. {spacr-0.3.41 → spacr-0.3.43}/spacr/toxo.py +26 -5
  13. {spacr-0.3.41 → spacr-0.3.43}/spacr/utils.py +69 -4
  14. {spacr-0.3.41 → spacr-0.3.43/spacr.egg-info}/PKG-INFO +1 -1
  15. {spacr-0.3.41 → spacr-0.3.43}/.readthedocs.yaml +0 -0
  16. {spacr-0.3.41 → spacr-0.3.43}/LICENSE +0 -0
  17. {spacr-0.3.41 → spacr-0.3.43}/MANIFEST.in +0 -0
  18. {spacr-0.3.41 → spacr-0.3.43}/README.rst +0 -0
  19. {spacr-0.3.41 → spacr-0.3.43}/deploy_docs.sh +0 -0
  20. {spacr-0.3.41 → spacr-0.3.43}/docs/requirements.txt +0 -0
  21. {spacr-0.3.41 → spacr-0.3.43}/docs/source/Makefile +0 -0
  22. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/doctrees/environment.pickle +0 -0
  23. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/index.html +0 -0
  24. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_annotate.html +0 -0
  25. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_classify.html +0 -0
  26. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_make_masks.html +0 -0
  27. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_mask.html +0 -0
  28. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_measure.html +0 -0
  29. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_sequencing.html +0 -0
  30. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/app_umap.html +0 -0
  31. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/core.html +0 -0
  32. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/deep_spacr.html +0 -0
  33. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/graph_learning.html +0 -0
  34. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/gui.html +0 -0
  35. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/gui_core.html +0 -0
  36. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/gui_elements.html +0 -0
  37. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/gui_utils.html +0 -0
  38. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/io.html +0 -0
  39. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/logger.html +0 -0
  40. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/measure.html +0 -0
  41. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/plot.html +0 -0
  42. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/sequencing.html +0 -0
  43. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/settings.html +0 -0
  44. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/sim.html +0 -0
  45. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/timelapse.html +0 -0
  46. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_modules/spacr/utils.html +0 -0
  47. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_sources/index.rst.txt +0 -0
  48. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_sources/modules.rst.txt +0 -0
  49. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_sources/spacr.rst.txt +0 -0
  50. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  51. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/basic.css +0 -0
  52. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/badge_only.css +0 -0
  53. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  54. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  55. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  56. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  57. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  58. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  59. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  60. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  61. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  62. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  63. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  64. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  65. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  66. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  67. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  68. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  69. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  70. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/css/theme.css +0 -0
  71. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/doctools.js +0 -0
  72. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/documentation_options.js +0 -0
  73. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/file.png +0 -0
  74. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/jquery.js +0 -0
  75. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/js/badge_only.js +0 -0
  76. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  77. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/js/html5shiv.min.js +0 -0
  78. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/js/theme.js +0 -0
  79. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/language_data.js +0 -0
  80. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/minus.png +0 -0
  81. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/plus.png +0 -0
  82. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/pygments.css +0 -0
  83. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/searchtools.js +0 -0
  84. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
  85. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/genindex.html +0 -0
  86. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/index.html +0 -0
  87. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/modules.html +0 -0
  88. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/objects.inv +0 -0
  89. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/py-modindex.html +0 -0
  90. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/search.html +0 -0
  91. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/searchindex.js +0 -0
  92. {spacr-0.3.41 → spacr-0.3.43}/docs/source/_build/html/spacr.html +0 -0
  93. {spacr-0.3.41 → spacr-0.3.43}/docs/source/conf.py +0 -0
  94. {spacr-0.3.41 → spacr-0.3.43}/docs/source/index.rst +0 -0
  95. {spacr-0.3.41 → spacr-0.3.43}/docs/source/make.bat +0 -0
  96. {spacr-0.3.41 → spacr-0.3.43}/docs/source/modules.rst +0 -0
  97. {spacr-0.3.41 → spacr-0.3.43}/docs/source/spacr.rst +0 -0
  98. {spacr-0.3.41 → spacr-0.3.43}/environment.yaml +0 -0
  99. {spacr-0.3.41 → spacr-0.3.43}/fonts/OpenSans-Regular.ttf +0 -0
  100. {spacr-0.3.41 → spacr-0.3.43}/notebooks/cv_scoring_nb.ipynb +0 -0
  101. {spacr-0.3.41 → spacr-0.3.43}/notebooks/deep_learning_spacr.ipynb +0 -0
  102. {spacr-0.3.41 → spacr-0.3.43}/notebooks/machine_learning_spacr_nb.ipynb +0 -0
  103. {spacr-0.3.41 → spacr-0.3.43}/notebooks/spacr_0.1_all_settings_git.ipynb +0 -0
  104. {spacr-0.3.41 → spacr-0.3.43}/notebooks/spacr_0.1_minimal.ipynb +0 -0
  105. {spacr-0.3.41 → spacr-0.3.43}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
  106. {spacr-0.3.41 → spacr-0.3.43}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
  107. {spacr-0.3.41 → spacr-0.3.43}/path/settings/preprocess_generate_masks_settings.csv +0 -0
  108. {spacr-0.3.41 → spacr-0.3.43}/requirements.txt +0 -0
  109. {spacr-0.3.41 → spacr-0.3.43}/settings/measure_crop_settings.csv +0 -0
  110. {spacr-0.3.41 → spacr-0.3.43}/setup.cfg +0 -0
  111. {spacr-0.3.41 → spacr-0.3.43}/setup_docs.sh +0 -0
  112. {spacr-0.3.41 → spacr-0.3.43}/source/conf.py +0 -0
  113. {spacr-0.3.41 → spacr-0.3.43}/source/index.rst +0 -0
  114. {spacr-0.3.41 → spacr-0.3.43}/source/modules.rst +0 -0
  115. {spacr-0.3.41 → spacr-0.3.43}/source/setup.rst +0 -0
  116. {spacr-0.3.41 → spacr-0.3.43}/source/spacr.rst +0 -0
  117. {spacr-0.3.41 → spacr-0.3.43}/spacr/__init__.py +0 -0
  118. {spacr-0.3.41 → spacr-0.3.43}/spacr/__main__.py +0 -0
  119. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_annotate.py +0 -0
  120. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_classify.py +0 -0
  121. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_make_masks.py +0 -0
  122. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_mask.py +0 -0
  123. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_measure.py +0 -0
  124. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_sequencing.py +0 -0
  125. {spacr-0.3.41 → spacr-0.3.43}/spacr/app_umap.py +0 -0
  126. {spacr-0.3.41 → spacr-0.3.43}/spacr/core.py +0 -0
  127. {spacr-0.3.41 → spacr-0.3.43}/spacr/deep_spacr.py +0 -0
  128. {spacr-0.3.41 → spacr-0.3.43}/spacr/gui.py +0 -0
  129. {spacr-0.3.41 → spacr-0.3.43}/spacr/gui_elements.py +0 -0
  130. {spacr-0.3.41 → spacr-0.3.43}/spacr/logger.py +0 -0
  131. {spacr-0.3.41 → spacr-0.3.43}/spacr/mediar.py +0 -0
  132. {spacr-0.3.41 → spacr-0.3.43}/spacr/openai.py +0 -0
  133. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/.gitignore +0 -0
  134. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/LICENSE +0 -0
  135. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/README.md +0 -0
  136. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/SetupDict.py +0 -0
  137. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/baseline.json +0 -0
  138. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
  139. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
  140. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
  141. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
  142. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
  143. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
  144. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
  145. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
  146. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
  147. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
  148. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
  149. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
  150. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
  151. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
  152. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
  153. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
  154. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
  155. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
  156. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
  157. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/__init__.py +0 -0
  158. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/core/utils.py +0 -0
  159. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/evaluate.py +0 -0
  160. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
  161. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  162. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  163. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  164. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  165. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  166. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  167. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/main.py +0 -0
  168. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/predict.py +0 -0
  169. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/requirements.txt +0 -0
  170. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
  171. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
  172. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
  173. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
  174. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
  175. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
  176. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  177. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
  178. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
  179. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
  180. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
  181. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
  182. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
  183. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
  184. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/data/lopit.csv +0 -0
  185. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  186. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/OFL.txt +0 -0
  187. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  188. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  189. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/README.txt +0 -0
  190. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  191. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  192. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  193. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  194. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  195. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  196. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  197. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  198. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  199. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  200. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  201. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  202. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  203. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  204. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  205. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  206. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  207. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  208. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  209. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  210. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  211. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  212. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  213. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  214. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  215. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  216. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  217. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  218. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  219. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  220. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  221. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  222. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  223. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  224. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  225. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  226. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/abort.png +0 -0
  227. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/annotate.png +0 -0
  228. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/cellpose_all.png +0 -0
  229. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/cellpose_masks.png +0 -0
  230. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/classify.png +0 -0
  231. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/convert.png +0 -0
  232. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/default.png +0 -0
  233. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/dna_matrix.mp4 +0 -0
  234. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/download.png +0 -0
  235. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/logo.pdf +0 -0
  236. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/logo_spacr.png +0 -0
  237. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/logo_spacr_1.png +0 -0
  238. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/make_masks.png +0 -0
  239. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/map_barcodes.png +0 -0
  240. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/mask.png +0 -0
  241. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/measure.png +0 -0
  242. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/ml_analyze.png +0 -0
  243. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/plaque.png +0 -0
  244. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/recruitment.png +0 -0
  245. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/regression.png +0 -0
  246. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/run.png +0 -0
  247. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/sequencing.png +0 -0
  248. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/settings.png +0 -0
  249. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/train_cellpose.png +0 -0
  250. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/icons/umap.png +0 -0
  251. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  252. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  253. {spacr-0.3.41 → spacr-0.3.43}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  254. {spacr-0.3.41 → spacr-0.3.43}/spacr/sequencing.py +0 -0
  255. {spacr-0.3.41 → spacr-0.3.43}/spacr/sim.py +0 -0
  256. {spacr-0.3.41 → spacr-0.3.43}/spacr/timelapse.py +0 -0
  257. {spacr-0.3.41 → spacr-0.3.43}/spacr/version.py +0 -0
  258. {spacr-0.3.41 → spacr-0.3.43}/spacr.egg-info/SOURCES.txt +0 -0
  259. {spacr-0.3.41 → spacr-0.3.43}/spacr.egg-info/dependency_links.txt +0 -0
  260. {spacr-0.3.41 → spacr-0.3.43}/spacr.egg-info/entry_points.txt +0 -0
  261. {spacr-0.3.41 → spacr-0.3.43}/spacr.egg-info/requires.txt +0 -0
  262. {spacr-0.3.41 → spacr-0.3.43}/spacr.egg-info/top_level.txt +0 -0
  263. {spacr-0.3.41 → spacr-0.3.43}/tests/test_annotate_app.py +0 -0
  264. {spacr-0.3.41 → spacr-0.3.43}/tests/test_core.py +0 -0
  265. {spacr-0.3.41 → spacr-0.3.43}/tests/test_gui_classify_app.py +0 -0
  266. {spacr-0.3.41 → spacr-0.3.43}/tests/test_gui_mask_app.py +0 -0
  267. {spacr-0.3.41 → spacr-0.3.43}/tests/test_gui_measure_app.py +0 -0
  268. {spacr-0.3.41 → spacr-0.3.43}/tests/test_gui_sim_app.py +0 -0
  269. {spacr-0.3.41 → spacr-0.3.43}/tests/test_gui_utils.py +0 -0
  270. {spacr-0.3.41 → spacr-0.3.43}/tests/test_io.py +0 -0
  271. {spacr-0.3.41 → spacr-0.3.43}/tests/test_mask_app.py +0 -0
  272. {spacr-0.3.41 → spacr-0.3.43}/tests/test_measure.py +0 -0
  273. {spacr-0.3.41 → spacr-0.3.43}/tests/test_plot.py +0 -0
  274. {spacr-0.3.41 → spacr-0.3.43}/tests/test_sim.py +0 -0
  275. {spacr-0.3.41 → spacr-0.3.43}/tests/test_timelapse.py +0 -0
  276. {spacr-0.3.41 → spacr-0.3.43}/tests/test_train.py +0 -0
  277. {spacr-0.3.41 → spacr-0.3.43}/tests/test_umap.py +0 -0
  278. {spacr-0.3.41 → spacr-0.3.43}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.41
3
+ Version: 0.3.43
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.41",
70
+ version="0.3.43",
71
71
  author="Einar Birnir Olafsson",
72
72
  author_email="olafsson@med.umich.com",
73
73
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -86,7 +86,6 @@ def identify_masks_finetune(settings):
86
86
  if normalize:
87
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)
88
88
  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
89
  else:
91
90
  images, _, image_names, _ = _load_images_and_labels(image_files=image_files, label_files=None, circular=circular, invert=invert)
92
91
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
@@ -126,7 +125,6 @@ def identify_masks_finetune(settings):
126
125
  print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls)
127
126
  print_progress(files_processed, files_to_process, n_jobs=1, time_ls=time_ls, batch_size=None, operation_type="")
128
127
 
129
-
130
128
  if verbose:
131
129
  if resize:
132
130
  stack = resizescikit(stack, dims, preserve_range=True, anti_aliasing=False).astype(stack.dtype)
@@ -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'),
@@ -191,107 +191,130 @@ def _load_images_and_labels(image_files, label_files, circular=False, invert=Fal
191
191
  print(f'image shape: {images[0].shape}, image type: images[0].shape mask shape: {labels[0].shape}, image type: labels[0].shape')
192
192
  return images, labels, image_names, label_names
193
193
 
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):
194
+ def _load_normalized_images_and_labels(image_files, label_files, channels=None, percentiles=None,
195
+ circular=False, invert=False, visualize=False,
196
+ remove_background=False, background=0, Signal_to_noise=10,
197
+ target_height=None, target_width=None):
195
198
 
196
- from .plot import normalize_and_visualize
199
+ from .plot import normalize_and_visualize, plot_resize
197
200
  from .utils import invert_image, apply_mask
201
+ from skimage.transform import resize as resizescikit
202
+
203
+ # Ensure percentiles are valid
204
+ if isinstance(percentiles, list) and len(percentiles) == 2:
205
+ try:
206
+ percentiles = [int(percentiles[0]), int(percentiles[1])]
207
+ except ValueError:
208
+ percentiles = None
209
+ else:
210
+ percentiles = None
198
211
 
199
- signal_thresholds = background*Signal_to_noise
212
+ signal_thresholds = float(background) * float(Signal_to_noise)
200
213
  lower_percentile = 2
201
214
 
202
- images = []
203
- labels = []
204
-
215
+ images, labels, orig_dims = [], [], []
205
216
  num_channels = 4
206
217
  percentiles_1 = [[] for _ in range(num_channels)]
207
218
  percentiles_99 = [[] for _ in range(num_channels)]
208
219
 
209
220
  image_names = [os.path.basename(f) for f in image_files]
210
-
221
+ image_dir = os.path.dirname(image_files[0])
222
+
211
223
  if label_files is not None:
212
224
  label_names = [os.path.basename(f) for f in label_files]
213
225
  label_dir = os.path.dirname(label_files[0])
226
+ else:
227
+ label_names, label_dir = [], None
214
228
 
215
- # Load images and check percentiles
216
- for i,img_file in enumerate(image_files):
229
+ # Load, normalize, and resize images
230
+ for i, img_file in enumerate(image_files):
217
231
  image = cellpose.io.imread(img_file)
232
+ orig_dims.append((image.shape[0], image.shape[1]))
233
+
218
234
  if invert:
219
235
  image = invert_image(image)
220
236
  if circular:
221
237
  image = apply_mask(image, output_value=0)
222
238
 
223
- # If specific channels are specified, select them
239
+ # Select specific channels if needed
224
240
  if channels is not None and image.ndim == 3:
225
241
  image = image[..., channels]
226
242
 
227
243
  if remove_background:
228
- image[image < background] = 0
229
-
244
+ image = np.where(image < background, 0, image)
245
+
230
246
  if image.ndim < 3:
231
247
  image = np.expand_dims(image, axis=-1)
232
-
233
- images.append(image)
248
+
249
+ # Calculate percentiles if not provided
234
250
  if percentiles is None:
235
251
  for c in range(image.shape[-1]):
236
252
  p1 = np.percentile(image[..., c], lower_percentile)
237
253
  percentiles_1[c].append(p1)
254
+
255
+ # Ensure `signal_thresholds` and `p` are floats for comparison
238
256
  for percentile in [98, 99, 99.9, 99.99, 99.999]:
239
257
  p = np.percentile(image[..., c], percentile)
240
- if p > signal_thresholds:
258
+ if float(p) > signal_thresholds:
241
259
  percentiles_99[c].append(p)
242
260
  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
-
261
+
262
+ # Resize image if required
263
+ if target_height and target_width:
264
+ image_shape = (target_height, target_width) if image.ndim == 2 else (target_height, target_width, image.shape[-1])
265
+ image = resizescikit(image, image_shape, preserve_range=True, anti_aliasing=True).astype(image.dtype)
266
+
267
+ images.append(image)
268
+
269
+ # Calculate average percentiles if needed
256
270
  if percentiles is None:
257
- # Calculate average percentiles for normalization
258
271
  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)]
272
+ avg_p99 = [np.mean(p) if p else avg_p1[i] for i, p in enumerate(percentiles_99)]
260
273
 
261
274
  print(f'Average 1st percentiles: {avg_p1}, Average 99th percentiles: {avg_p99}')
262
275
 
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])
276
+ normalized_images = [
277
+ np.stack([rescale_intensity(img[..., c], in_range=(avg_p1[c], avg_p99[c]), out_range=(0, 1))
278
+ for c in range(img.shape[-1])], axis=-1) for img in images
279
+ ]
274
280
 
275
281
  else:
276
- image_dir = None
277
-
282
+ normalized_images = [
283
+ np.stack([rescale_intensity(img[..., c],
284
+ in_range=(np.percentile(img[..., c], percentiles[0]),
285
+ np.percentile(img[..., c], percentiles[1])),
286
+ out_range=(0, 1)) for c in range(img.shape[-1])], axis=-1)
287
+ for img in images
288
+ ]
289
+
290
+ # Load and resize labels if provided
278
291
  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
292
+ labels = [resizescikit(cellpose.io.imread(lbl_file),
293
+ (target_height, target_width) if target_height and target_width else orig_dims[i],
294
+ order=0, preserve_range=True, anti_aliasing=False).astype(np.uint8)
295
+ for i, lbl_file in enumerate(label_files)]
284
296
 
285
297
  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
298
 
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):
299
+ if visualize and images and labels:
300
+ plot_resize(images, normalized_images, labels, labels)
301
+
302
+ return normalized_images, labels, image_names, label_names, orig_dims
303
+
304
+ 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, target_height=None, target_width=None):
290
305
 
291
306
  from .plot import normalize_and_visualize, plot_resize
292
307
  from .utils import invert_image, apply_mask
293
308
  from skimage.transform import resize as resizescikit
294
309
 
310
+ if isinstance(percentiles, list):
311
+ if len(percentiles) !=2:
312
+ percentiles = None
313
+ if not percentiles[0] is int:
314
+ percentiles = None
315
+ if not percentiles[1] is int:
316
+ percentiles = None
317
+
295
318
  signal_thresholds = background * Signal_to_noise
296
319
  lower_percentile = 2
297
320
 
@@ -710,7 +710,7 @@ def _measure_crop_core(index, time_ls, file, settings):
710
710
  else:
711
711
  cell_mask = np.zeros_like(data[:, :, 0])
712
712
  settings['cytoplasm'] = False
713
- settings['include_uninfected'] = True
713
+ settings['uninfected'] = True
714
714
 
715
715
  if settings['nucleus_mask_dim'] is not None:
716
716
  nucleus_mask = data[:, :, settings['nucleus_mask_dim']].astype(data_type)
@@ -762,7 +762,7 @@ def _measure_crop_core(index, time_ls, file, settings):
762
762
  cytoplasm_mask = _filter_object(cytoplasm_mask, settings['cytoplasm_min_size'])
763
763
 
764
764
  if settings['cell_mask_dim'] is not None:
765
- cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask = _exclude_objects(cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask, include_uninfected=settings['include_uninfected'])
765
+ cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask = _exclude_objects(cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask, uninfected=settings['uninfected'])
766
766
 
767
767
  # Update data with the new masks
768
768
  if settings['cell_mask_dim'] is not None:
@@ -979,9 +979,9 @@ def measure_crop(settings):
979
979
  #_create_database(source_folder+'/measurements/measurements.db')
980
980
 
981
981
  if settings['cell_mask_dim'] is None:
982
- settings['include_uninfected'] = True
982
+ settings['uninfected'] = True
983
983
  if settings['pathogen_mask_dim'] is None:
984
- settings['include_uninfected'] = True
984
+ settings['uninfected'] = True
985
985
  if settings['cell_mask_dim'] is not None and settings['pathogen_min_size'] is not None:
986
986
  settings['cytoplasm'] = True
987
987
  elif settings['cell_mask_dim'] is not None and settings['nucleus_min_size'] is not None:
@@ -449,26 +449,28 @@ def perform_regression(settings):
449
449
  return df, n_gene
450
450
  else:
451
451
  return df
452
+
453
+
452
454
 
453
455
  settings = get_perform_regression_default_settings(settings)
454
456
  count_data_df, score_data_df = _perform_regression_read_data(settings)
455
457
  results_path, results_path_gene, results_path_grna, hits_path, res_folder, csv_path = _perform_regression_set_paths(settings)
456
458
  save_settings(settings, name='regression', show=True)
459
+
460
+ if isinstance(settings['filter_value'], list):
461
+ filter_value = settings['filter_value']
462
+ else:
463
+ filter_value = []
464
+ if isinstance(settings['filter_column'], str):
465
+ filter_column = settings['filter_column']
457
466
 
458
- score_data_df = clean_controls(score_data_df, settings['pc'], settings['nc'], settings['other'])
467
+ score_data_df = clean_controls(score_data_df, settings['filter_value'], settings['filter_column'])
459
468
  print(f"Dependent variable after clean_controls: {len(score_data_df)}")
460
469
 
461
470
  dependent_df, dependent_variable = process_scores(score_data_df, settings['dependent_variable'], settings['plate'], settings['min_cell_count'], settings['agg_type'], settings['transform'])
462
471
  print(f"Dependent variable after process_scores: {len(dependent_df)}")
463
472
 
464
- filter_value = [settings['nc'], settings['pc']]
465
-
466
- if settings['other'] is not None:
467
- if isinstance(settings['other'], str):
468
- settings['other'] = [settings['other']]
469
- filter_value.extend(settings['other'])
470
-
471
- independent_df = process_reads(count_data_df, settings['fraction_threshold'], settings['plate'], filter_column=settings['location_column'], filter_value=filter_value)
473
+ independent_df = process_reads(count_data_df, settings['fraction_threshold'], settings['plate'], filter_column=filter_column, filter_value=filter_value)
472
474
  independent_df, n_grna, n_gene = _count_variable_instances(independent_df, column_1='grna', column_2='gene')
473
475
 
474
476
  print(f"Independent variable after process_reads: {len(independent_df)}")
@@ -498,12 +500,14 @@ def perform_regression(settings):
498
500
  if settings['controls'] is not None:
499
501
  control_coef_df = grna_coef_df[grna_coef_df['grna'].isin(settings['controls'])]
500
502
  mean_coef = control_coef_df['coefficient'].mean()
501
- variance_coef = control_coef_df['coefficient'].var()
502
- std_coef = control_coef_df['coefficient'].std()
503
- reg_threshold = mean_coef + (3 * std_coef)
504
-
505
- print('coef_df')
506
- display(coef_df)
503
+
504
+ if settings['threshold_method'] in ['var','variance']:
505
+ coef_mes = control_coef_df['coefficient'].var()
506
+ elif settings['threshold_method'] in ['std', 'standard_deveation']:
507
+ coef_mes = control_coef_df['coefficient'].std()
508
+ else:
509
+ raise ValueError(f"Unsupported threshold method {settings['threshold_method']}. Supported methods: ['var','variance','std','standard_deveation']")
510
+ reg_threshold = mean_coef + (settings['threshold_multiplier'] * coef_mes)
507
511
 
508
512
  coef_df.to_csv(results_path, index=False)
509
513
  gene_coef_df.to_csv(results_path_gene, index=False)
@@ -596,7 +600,7 @@ def process_reads(csv_path, fraction_threshold, plate, filter_column=None, filte
596
600
  if isinstance(filter_value, str):
597
601
  filter_value = [filter_value]
598
602
 
599
- if isinstance(filter_column, list):
603
+ if isinstance(filter_column, list):
600
604
  for filter_col in filter_column:
601
605
  for value in filter_value:
602
606
  csv_df = csv_df[csv_df[filter_col] != value]
@@ -659,16 +663,12 @@ def check_normality(data, variable_name, verbose=False):
659
663
  print(f"Normal distribution: The data for {variable_name} is not normally distributed.")
660
664
  return False
661
665
 
662
- def clean_controls(df,pc,nc,other):
663
- if 'col' in df.columns:
664
- df['column'] = df['col']
665
- if nc != None:
666
- df = df[~df['column'].isin([nc])]
667
- if pc != None:
668
- df = df[~df['column'].isin([pc])]
669
- if other != None:
670
- df = df[~df['column'].isin([other])]
671
- print(f'Removed data from {nc, pc, other}')
666
+ def clean_controls(df,values, column):
667
+ if column in df.columns:
668
+ if isinstance(values, list):
669
+ for value in values:
670
+ df = df[~df[column].isin([value])]
671
+ print(f'Removed data from {value}')
672
672
  return df
673
673
 
674
674
  def process_scores(df, dependent_variable, plate, min_cell_count=25, agg_type='mean', transform=None, regression_type='ols'):
@@ -1521,7 +1521,7 @@ def plot_plates(df, variable, grouping, min_max, cmap, min_count=0, verbose=True
1521
1521
  return fig
1522
1522
 
1523
1523
  def print_mask_and_flows(stack, mask, flows, overlay=False):
1524
- fig, axs = plt.subplots(1, 3, figsize=(30, 10)) # Adjust subplot layout
1524
+ fig, axs = plt.subplots(1, 3, figsize=(12, 4)) # Adjust subplot layout
1525
1525
 
1526
1526
  if stack.shape[-1] == 1:
1527
1527
  stack = np.squeeze(stack)
@@ -261,7 +261,7 @@ def get_measure_crop_settings(settings={}):
261
261
  settings.setdefault('nucleus_mask_dim',None)
262
262
  settings.setdefault('pathogen_mask_dim',None)
263
263
  settings.setdefault('cytoplasm',False)
264
- settings.setdefault('include_uninfected',True)
264
+ settings.setdefault('uninfected',True)
265
265
  settings.setdefault('cell_min_size',0)
266
266
  settings.setdefault('nucleus_min_size',0)
267
267
  settings.setdefault('pathogen_min_size',0)
@@ -527,26 +527,31 @@ def set_generate_dataset_defaults(settings):
527
527
  return settings
528
528
 
529
529
  def get_perform_regression_default_settings(settings):
530
- settings.setdefault('highlight','239740')
531
- settings.setdefault('dependent_variable','predictions')
530
+ settings.setdefault('count_data','list of paths')
531
+ settings.setdefault('score_data','list of paths')
532
+ settings.setdefault('positive_control','239740')
533
+ settings.setdefault('negative_control','233460')
534
+ settings.setdefault('controls',['000000_1','000000_10','000000_11','000000_12','000000_13','000000_14','000000_15','000000_16','000000_17','000000_18','000000_19','000000_20','000000_21','000000_22','000000_23','000000_24','000000_25','000000_26','000000_27','000000_28','000000_29','000000_3','000000_30','000000_31','000000_32','000000_4','000000_5','000000_6','000000_8','000000_9'])
535
+ settings.setdefault('fraction_threshold',0.12)
536
+ settings.setdefault('dependent_variable','pred')
537
+ settings.setdefault('threshold_method','std')
538
+ settings.setdefault('threshold_multiplier',3)
532
539
  settings.setdefault('transform',None)
533
540
  settings.setdefault('agg_type','mean')
534
541
  settings.setdefault('min_cell_count',25)
535
542
  settings.setdefault('regression_type','ols')
536
543
  settings.setdefault('random_row_column_effects',False)
544
+ settings.setdefault('split_axis_lims','')
545
+ settings.setdefault('plate','')
546
+ settings.setdefault('cov_type',None)
537
547
  settings.setdefault('alpha',1)
538
- settings.setdefault('fraction_threshold',0.1)
539
- settings.setdefault('location_column','column')
540
- settings.setdefault('nc','c1')
541
- settings.setdefault('pc','c2')
542
- settings.setdefault('other','c3')
548
+ settings.setdefault('filter_value',['c1', 'c2', 'c3'])
549
+ settings.setdefault('filter_column','column')
543
550
  settings.setdefault('plate','plate1')
544
551
  settings.setdefault('class_1_threshold',None)
545
- settings.setdefault('cov_type',None)
546
552
  settings.setdefault('metadata_files',['/home/carruthers/Documents/TGME49_Summary.csv','/home/carruthers/Documents/TGGT1_Summary.csv'])
547
553
  settings.setdefault('toxo', True)
548
554
 
549
-
550
555
  if settings['regression_type'] == 'quantile':
551
556
  print(f"Using alpha as quantile for quantile regression, alpha: {settings['alpha']}")
552
557
  settings['agg_type'] = None
@@ -576,6 +581,7 @@ def get_check_cellpose_models_default_settings(settings):
576
581
  return settings
577
582
 
578
583
  def get_identify_masks_finetune_default_settings(settings):
584
+ settings.setdefault('src', 'path')
579
585
  settings.setdefault('model_name', 'cyto')
580
586
  settings.setdefault('custom_model', None)
581
587
  settings.setdefault('channels', [0,0])
@@ -664,7 +670,7 @@ expected_types = {
664
670
  "png_dims": list,
665
671
  "normalize_by": str,
666
672
  "save_measurements": bool,
667
- "include_uninfected": bool,
673
+ "uninfected": bool,
668
674
  "dialate_pngs": bool,
669
675
  "dialate_png_ratios": list,
670
676
  "n_jobs": int,
@@ -685,6 +691,7 @@ expected_types = {
685
691
  "filter_min_max": (list, type(None)),
686
692
  "channel_dims": list,
687
693
  "backgrounds": list,
694
+ "background": str,
688
695
  "outline_thickness": int,
689
696
  "outline_color": str,
690
697
  "overlay_chans": list,
@@ -893,7 +900,7 @@ expected_types = {
893
900
  categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset","model_path","grna_csv","row_csv","column_csv"],
894
901
  "General": ["metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims", "apply_model_to_dataset", "generate_training_dataset", "train_DL_model", "segmentation_mode"],
895
902
  "Cellpose":["from_scratch", "n_epochs", "width_height", "model_name", "custom_model", "resample", "rescale", "CP_prob", "flow_threshold", "percentiles", "circular", "invert", "diameter", "grayscale", "background", "Signal_to_noise", "resize", "target_height", "target_width"],
896
- "Cell": ["cell_intensity_range", "cell_size_range", "cell_chann_dim", "cell_channel", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cell_mask_dim", "cytoplasm", "cytoplasm_min_size", "include_uninfected", "merge_edge_pathogen_cells", "adjust_cells", "cells", "cell_loc"],
903
+ "Cell": ["cell_intensity_range", "cell_size_range", "cell_chann_dim", "cell_channel", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cell_mask_dim", "cytoplasm", "cytoplasm_min_size", "uninfected", "merge_edge_pathogen_cells", "adjust_cells", "cells", "cell_loc"],
897
904
  "Nucleus": ["nucleus_intensity_range", "nucleus_size_range", "nucleus_chann_dim", "nucleus_channel", "nucleus_background", "nucleus_Signal_to_noise", "nucleus_CP_prob", "nucleus_FT", "remove_background_nucleus", "nucleus_min_size", "nucleus_mask_dim", "nucleus_loc"],
898
905
  "Pathogen": ["pathogen_intensity_range", "pathogen_size_range", "pathogen_chann_dim", "pathogen_channel", "pathogen_background", "pathogen_Signal_to_noise", "pathogen_CP_prob", "pathogen_FT", "pathogen_model", "remove_background_pathogen", "pathogen_min_size", "pathogen_mask_dim", "pathogens", "pathogen_loc", "pathogen_types", "pathogen_plate_metadata", ],
899
906
  "Measurements": ["remove_image_canvas", "remove_highly_correlated", "homogeneity", "homogeneity_distances", "radial_dist", "calculate_correlation", "manders_thresholds", "save_measurements", "tables", "image_nr", "dot_size", "filter_by", "remove_highly_correlated_features", "remove_low_variance_features", "channel_of_interest"],
@@ -904,12 +911,12 @@ categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset
904
911
  "Hyperparamiters (Embedding)": ["visualize","n_neighbors","min_dist","metric","resnet_features","reduction_method","embedding_by_controls","col_to_compare","log_data"],
905
912
  "Hyperparamiters (Clustering)": ["eps","min_samples","analyze_clusters","clustering","remove_cluster_noise"],
906
913
  "Hyperparamiters (Regression)":["cov_type", "class_1_threshold", "plate", "other", "fraction_threshold", "alpha", "random_row_column_effects", "regression_type", "min_cell_count", "agg_type", "transform", "dependent_variable"],
907
- "Hyperparamiters (Activation)":["cam_type", "normalize", "overlay", "correlation", "target_layer", "normalize_input"],
914
+ "Hyperparamiters (Activation)":["cam_type", "overlay", "correlation", "target_layer", "normalize_input"],
908
915
  "Annotation": ["nc_loc", "pc_loc", "nc", "pc", "cell_plate_metadata","treatment_plate_metadata", "metadata_types", "cell_types", "target","positive_control","negative_control", "location_column", "treatment_loc", "channel_of_interest", "measurement", "treatments", "um_per_pixel", "nr_imgs", "exclude", "exclude_conditions", "mix", "pos", "neg"],
909
916
  "Plot": ["plot", "plot_control", "plot_nr", "examples_to_plot", "normalize_plots", "cmap", "figuresize", "plot_cluster_grids", "img_zoom", "row_limit", "color_by", "plot_images", "smooth_lines", "plot_points", "plot_outlines", "black_background", "plot_by_cluster", "heatmap_feature","grouping","min_max","cmap","save_figure"],
910
917
  "Test": ["test_mode", "test_images", "random_test", "test_nr", "test", "test_split"],
911
918
  "Timelapse": ["timelapse", "fps", "timelapse_displacement", "timelapse_memory", "timelapse_frame_limits", "timelapse_remove_transient", "timelapse_mode", "timelapse_objects", "compartments"],
912
- "Advanced": ["shuffle", "target_intensity_min", "cells_per_well", "nuclei_limit", "pathogen_limit", "uninfected", "backgrounds", "schedule", "test_size","exclude","n_repeats","top_features", "model_type_ml", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs"],
919
+ "Advanced": ["shuffle", "target_intensity_min", "cells_per_well", "nuclei_limit", "pathogen_limit", "uninfected", "background", "backgrounds", "schedule", "test_size","exclude","n_repeats","top_features", "model_type_ml", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs"],
913
920
  "Miscellaneous": ["all_to_mip", "pick_slice", "skip_mode", "upscale", "upscale_factor"]
914
921
  }
915
922
 
@@ -1083,7 +1090,7 @@ def generate_fields(variables, scrollable_frame):
1083
1090
  "nuclei_limit": "(int) - Whether to include multinucleated cells in the analysis.",
1084
1091
  "pathogen_limit": "(int) - Whether to include multi-infected cells in the analysis.",
1085
1092
  "uninfected": "(bool) - Whether to include non-infected cells in the analysis.",
1086
- "include_uninfected": "(bool) - Whether to include uninfected cells in the analysis.",
1093
+ "uninfected": "(bool) - Whether to include uninfected cells in the analysis.",
1087
1094
  "init_weights": "(bool) - Whether to initialize weights for the model.",
1088
1095
  "src": "(str) - Path to the folder containing the images.",
1089
1096
  "intermedeate_save": "(bool) - Whether to save intermediate results.",
@@ -1362,4 +1369,31 @@ def get_default_generate_activation_map_settings(settings):
1362
1369
  settings.setdefault('manders_thresholds', [15,50, 75])
1363
1370
  settings.setdefault('n_jobs', None)
1364
1371
 
1372
+ return settings
1373
+
1374
+ def get_analyze_plaque_settings(settings):
1375
+ settings.setdefault('src', 'path')
1376
+ settings.setdefault('masks', True)
1377
+ settings.setdefault('model_name', 'plaque')
1378
+ settings.setdefault('custom_model', None)
1379
+ settings.setdefault('channels', [0,0])
1380
+ settings.setdefault('background', 200)
1381
+ settings.setdefault('remove_background', False)
1382
+ settings.setdefault('Signal_to_noise', 10)
1383
+ settings.setdefault('CP_prob', 0)
1384
+ settings.setdefault('diameter', 30)
1385
+ settings.setdefault('batch_size', 50)
1386
+ settings.setdefault('flow_threshold', 0.4)
1387
+ settings.setdefault('save', True)
1388
+ settings.setdefault('verbose', True)
1389
+ settings.setdefault('normalize', True)
1390
+ settings.setdefault('percentiles', None)
1391
+ settings.setdefault('circular', False)
1392
+ settings.setdefault('invert', False)
1393
+ settings.setdefault('resize', True)
1394
+ settings.setdefault('target_height', 1120)
1395
+ settings.setdefault('target_width', 1120)
1396
+ settings.setdefault('rescale', False)
1397
+ settings.setdefault('resample', False)
1398
+ settings.setdefault('grayscale', True)
1365
1399
  return settings