spacr 0.4.12__tar.gz → 0.4.15__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 (267) hide show
  1. {spacr-0.4.12/spacr.egg-info → spacr-0.4.15}/PKG-INFO +1 -1
  2. {spacr-0.4.12 → spacr-0.4.15}/setup.py +1 -1
  3. {spacr-0.4.12 → spacr-0.4.15}/spacr/core.py +4 -1
  4. {spacr-0.4.12 → spacr-0.4.15}/spacr/gui_core.py +19 -41
  5. {spacr-0.4.12 → spacr-0.4.15}/spacr/gui_utils.py +11 -9
  6. {spacr-0.4.12 → spacr-0.4.15}/spacr/io.py +14 -7
  7. {spacr-0.4.12 → spacr-0.4.15}/spacr/measure.py +11 -12
  8. {spacr-0.4.12 → spacr-0.4.15}/spacr/settings.py +105 -46
  9. {spacr-0.4.12 → spacr-0.4.15}/spacr/submodules.py +1 -1
  10. {spacr-0.4.12 → spacr-0.4.15}/spacr/utils.py +91 -10
  11. {spacr-0.4.12 → spacr-0.4.15/spacr.egg-info}/PKG-INFO +1 -1
  12. {spacr-0.4.12 → spacr-0.4.15}/.readthedocs.yaml +0 -0
  13. {spacr-0.4.12 → spacr-0.4.15}/LICENSE +0 -0
  14. {spacr-0.4.12 → spacr-0.4.15}/MANIFEST.in +0 -0
  15. {spacr-0.4.12 → spacr-0.4.15}/README.rst +0 -0
  16. {spacr-0.4.12 → spacr-0.4.15}/deploy_docs.sh +0 -0
  17. {spacr-0.4.12 → spacr-0.4.15}/docs/requirements.txt +0 -0
  18. {spacr-0.4.12 → spacr-0.4.15}/docs/source/Makefile +0 -0
  19. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/doctrees/environment.pickle +0 -0
  20. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_sources/index.rst.txt +0 -0
  21. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  22. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/basic.css +0 -0
  23. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/badge_only.css +0 -0
  24. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  25. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  26. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  27. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  28. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  29. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  30. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  31. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  32. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  33. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  34. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  35. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  36. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  37. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  38. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  39. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  40. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  41. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/css/theme.css +0 -0
  42. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/doctools.js +0 -0
  43. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/documentation_options.js +0 -0
  44. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/file.png +0 -0
  45. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bold.eot +0 -0
  46. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bold.ttf +0 -0
  47. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bold.woff +0 -0
  48. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bold.woff2 +0 -0
  49. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  50. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  51. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  52. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  53. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-italic.eot +0 -0
  54. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-italic.ttf +0 -0
  55. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-italic.woff +0 -0
  56. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-italic.woff2 +0 -0
  57. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-regular.eot +0 -0
  58. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-regular.ttf +0 -0
  59. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-regular.woff +0 -0
  60. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/Lato/lato-regular.woff2 +0 -0
  61. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  62. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  63. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  64. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  65. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  66. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  67. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  68. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  69. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/jquery.js +0 -0
  70. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/js/badge_only.js +0 -0
  71. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/js/theme.js +0 -0
  72. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/js/versions.js +0 -0
  73. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/language_data.js +0 -0
  74. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/minus.png +0 -0
  75. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/plus.png +0 -0
  76. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/pygments.css +0 -0
  77. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/searchtools.js +0 -0
  78. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
  79. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/genindex.html +0 -0
  80. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/index.html +0 -0
  81. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/objects.inv +0 -0
  82. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/search.html +0 -0
  83. {spacr-0.4.12 → spacr-0.4.15}/docs/source/_build/html/searchindex.js +0 -0
  84. {spacr-0.4.12 → spacr-0.4.15}/docs/source/conf.py +0 -0
  85. {spacr-0.4.12 → spacr-0.4.15}/docs/source/index.rst +0 -0
  86. {spacr-0.4.12 → spacr-0.4.15}/docs/source/make.bat +0 -0
  87. {spacr-0.4.12 → spacr-0.4.15}/environment.yaml +0 -0
  88. {spacr-0.4.12 → spacr-0.4.15}/fonts/OpenSans-Regular.ttf +0 -0
  89. {spacr-0.4.12 → spacr-0.4.15}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
  90. {spacr-0.4.12 → spacr-0.4.15}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
  91. {spacr-0.4.12 → spacr-0.4.15}/path/settings/preprocess_generate_masks_settings.csv +0 -0
  92. {spacr-0.4.12 → spacr-0.4.15}/requirements.txt +0 -0
  93. {spacr-0.4.12 → spacr-0.4.15}/settings/measure_crop_settings.csv +0 -0
  94. {spacr-0.4.12 → spacr-0.4.15}/setup.cfg +0 -0
  95. {spacr-0.4.12 → spacr-0.4.15}/setup_docs.sh +0 -0
  96. {spacr-0.4.12 → spacr-0.4.15}/source/conf.py +0 -0
  97. {spacr-0.4.12 → spacr-0.4.15}/source/index.rst +0 -0
  98. {spacr-0.4.12 → spacr-0.4.15}/source/modules.rst +0 -0
  99. {spacr-0.4.12 → spacr-0.4.15}/source/setup.rst +0 -0
  100. {spacr-0.4.12 → spacr-0.4.15}/source/spacr.rst +0 -0
  101. {spacr-0.4.12 → spacr-0.4.15}/spacr/__init__.py +0 -0
  102. {spacr-0.4.12 → spacr-0.4.15}/spacr/__main__.py +0 -0
  103. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_annotate.py +0 -0
  104. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_classify.py +0 -0
  105. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_make_masks.py +0 -0
  106. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_mask.py +0 -0
  107. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_measure.py +0 -0
  108. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_sequencing.py +0 -0
  109. {spacr-0.4.12 → spacr-0.4.15}/spacr/app_umap.py +0 -0
  110. {spacr-0.4.12 → spacr-0.4.15}/spacr/cellpose.py +0 -0
  111. {spacr-0.4.12 → spacr-0.4.15}/spacr/chat_bot.py +0 -0
  112. {spacr-0.4.12 → spacr-0.4.15}/spacr/deep_spacr.py +0 -0
  113. {spacr-0.4.12 → spacr-0.4.15}/spacr/gui.py +0 -0
  114. {spacr-0.4.12 → spacr-0.4.15}/spacr/gui_elements.py +0 -0
  115. {spacr-0.4.12 → spacr-0.4.15}/spacr/logger.py +0 -0
  116. {spacr-0.4.12 → spacr-0.4.15}/spacr/mediar.py +0 -0
  117. {spacr-0.4.12 → spacr-0.4.15}/spacr/ml.py +0 -0
  118. {spacr-0.4.12 → spacr-0.4.15}/spacr/openai.py +0 -0
  119. {spacr-0.4.12 → spacr-0.4.15}/spacr/plot.py +0 -0
  120. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/.gitignore +0 -0
  121. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/LICENSE +0 -0
  122. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/README.md +0 -0
  123. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/SetupDict.py +0 -0
  124. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/baseline.json +0 -0
  125. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
  126. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
  127. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
  128. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
  129. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
  130. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
  131. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
  132. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
  133. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
  134. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
  135. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
  136. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
  137. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
  138. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
  139. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
  140. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
  141. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
  142. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
  143. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
  144. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/__init__.py +0 -0
  145. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/core/utils.py +0 -0
  146. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/evaluate.py +0 -0
  147. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
  148. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  149. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  150. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  151. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  152. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  153. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  154. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/main.py +0 -0
  155. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/predict.py +0 -0
  156. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/requirements.txt +0 -0
  157. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
  158. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
  159. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
  160. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
  161. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
  162. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
  163. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  164. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
  165. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
  166. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
  167. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
  168. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
  169. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
  170. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
  171. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/data/lopit.csv +0 -0
  172. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  173. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/OFL.txt +0 -0
  174. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  175. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  176. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/README.txt +0 -0
  177. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  178. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  179. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  180. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  181. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  182. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  183. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  184. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  185. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  186. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  187. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  188. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  189. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  190. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  191. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  192. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  193. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  194. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  195. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  196. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  197. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  198. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  199. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  200. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  201. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  202. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  203. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  204. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  205. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  206. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  207. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  208. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  209. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  210. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  211. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  212. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  213. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/abort.png +0 -0
  214. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/annotate.png +0 -0
  215. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/cellpose_all.png +0 -0
  216. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/cellpose_masks.png +0 -0
  217. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/classify.png +0 -0
  218. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/convert.png +0 -0
  219. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/default.png +0 -0
  220. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/dna_matrix.mp4 +0 -0
  221. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/download.png +0 -0
  222. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/logo.pdf +0 -0
  223. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/logo_spacr.png +0 -0
  224. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/logo_spacr_1.png +0 -0
  225. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/make_masks.png +0 -0
  226. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/map_barcodes.png +0 -0
  227. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/mask.png +0 -0
  228. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/measure.png +0 -0
  229. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/ml_analyze.png +0 -0
  230. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/plaque.png +0 -0
  231. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/recruitment.png +0 -0
  232. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/regression.png +0 -0
  233. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/run.png +0 -0
  234. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/sequencing.png +0 -0
  235. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/settings.png +0 -0
  236. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/train_cellpose.png +0 -0
  237. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/icons/umap.png +0 -0
  238. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  239. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  240. {spacr-0.4.12 → spacr-0.4.15}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  241. {spacr-0.4.12 → spacr-0.4.15}/spacr/sequencing.py +0 -0
  242. {spacr-0.4.12 → spacr-0.4.15}/spacr/sim.py +0 -0
  243. {spacr-0.4.12 → spacr-0.4.15}/spacr/sp_stats.py +0 -0
  244. {spacr-0.4.12 → spacr-0.4.15}/spacr/timelapse.py +0 -0
  245. {spacr-0.4.12 → spacr-0.4.15}/spacr/toxo.py +0 -0
  246. {spacr-0.4.12 → spacr-0.4.15}/spacr/version.py +0 -0
  247. {spacr-0.4.12 → spacr-0.4.15}/spacr.egg-info/SOURCES.txt +0 -0
  248. {spacr-0.4.12 → spacr-0.4.15}/spacr.egg-info/dependency_links.txt +0 -0
  249. {spacr-0.4.12 → spacr-0.4.15}/spacr.egg-info/entry_points.txt +0 -0
  250. {spacr-0.4.12 → spacr-0.4.15}/spacr.egg-info/requires.txt +0 -0
  251. {spacr-0.4.12 → spacr-0.4.15}/spacr.egg-info/top_level.txt +0 -0
  252. {spacr-0.4.12 → spacr-0.4.15}/tests/test_annotate_app.py +0 -0
  253. {spacr-0.4.12 → spacr-0.4.15}/tests/test_core.py +0 -0
  254. {spacr-0.4.12 → spacr-0.4.15}/tests/test_gui_classify_app.py +0 -0
  255. {spacr-0.4.12 → spacr-0.4.15}/tests/test_gui_mask_app.py +0 -0
  256. {spacr-0.4.12 → spacr-0.4.15}/tests/test_gui_measure_app.py +0 -0
  257. {spacr-0.4.12 → spacr-0.4.15}/tests/test_gui_sim_app.py +0 -0
  258. {spacr-0.4.12 → spacr-0.4.15}/tests/test_gui_utils.py +0 -0
  259. {spacr-0.4.12 → spacr-0.4.15}/tests/test_io.py +0 -0
  260. {spacr-0.4.12 → spacr-0.4.15}/tests/test_mask_app.py +0 -0
  261. {spacr-0.4.12 → spacr-0.4.15}/tests/test_measure.py +0 -0
  262. {spacr-0.4.12 → spacr-0.4.15}/tests/test_plot.py +0 -0
  263. {spacr-0.4.12 → spacr-0.4.15}/tests/test_sim.py +0 -0
  264. {spacr-0.4.12 → spacr-0.4.15}/tests/test_timelapse.py +0 -0
  265. {spacr-0.4.12 → spacr-0.4.15}/tests/test_train.py +0 -0
  266. {spacr-0.4.12 → spacr-0.4.15}/tests/test_umap.py +0 -0
  267. {spacr-0.4.12 → spacr-0.4.15}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.4.12
3
+ Version: 0.4.15
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
@@ -70,7 +70,7 @@ dependencies = [
70
70
 
71
71
  setup(
72
72
  name="spacr",
73
- version="0.4.12",
73
+ version="0.4.15",
74
74
  author="Einar Birnir Olafsson",
75
75
  author_email="olafsson@med.umich.com",
76
76
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -11,7 +11,7 @@ def preprocess_generate_masks(settings):
11
11
 
12
12
  from .io import preprocess_img_data, _load_and_concatenate_arrays
13
13
  from .plot import plot_image_mask_overlay, plot_arrays
14
- from .utils import _pivot_counts_table, check_mask_folder, adjust_cell_masks, print_progress, save_settings, delete_intermedeate_files
14
+ from .utils import _pivot_counts_table, check_mask_folder, adjust_cell_masks, print_progress, save_settings, delete_intermedeate_files, format_path_for_system, normalize_src_path
15
15
  from .settings import set_default_settings_preprocess_generate_masks
16
16
 
17
17
 
@@ -23,6 +23,8 @@ def preprocess_generate_masks(settings):
23
23
  ValueError(f'src is a required parameter')
24
24
  return
25
25
 
26
+ settings['src'] = normalize_src_path(settings['src'])
27
+
26
28
  if isinstance(settings['src'], str):
27
29
  settings['src'] = [settings['src']]
28
30
 
@@ -30,6 +32,7 @@ def preprocess_generate_masks(settings):
30
32
  source_folders = settings['src']
31
33
  for source_folder in source_folders:
32
34
  print(f'Processing folder: {source_folder}')
35
+ source_folder = format_path_for_system(source_folder)
33
36
  settings['src'] = source_folder
34
37
  src = source_folder
35
38
  settings = set_default_settings_preprocess_generate_masks(settings)
@@ -170,49 +170,22 @@ def display_figure(fig):
170
170
  #flash_feedback("right")
171
171
  show_next_figure()
172
172
 
173
- def zoom_v1(event):
174
- nonlocal scale_factor
175
-
176
- zoom_speed = 0.1 # Adjust the zoom speed for smoother experience
177
-
178
- # Determine the zoom direction based on the scroll event
179
- if event.num == 4 or event.delta > 0: # Scroll up (zoom in)
180
- scale_factor /= (1 + zoom_speed) # Divide to zoom in
181
- elif event.num == 5 or event.delta < 0: # Scroll down (zoom out)
182
- scale_factor *= (1 + zoom_speed) # Multiply to zoom out
183
-
184
- # Adjust the axes limits based on the new scale factor
185
- for ax in canvas.figure.get_axes():
186
- xlim = ax.get_xlim()
187
- ylim = ax.get_ylim()
188
-
189
- x_center = (xlim[1] + xlim[0]) / 2
190
- y_center = (ylim[1] + ylim[0]) / 2
191
-
192
- x_range = (xlim[1] - xlim[0]) * scale_factor
193
- y_range = (ylim[1] - ylim[0]) * scale_factor
194
-
195
- # Set the new limits
196
- ax.set_xlim([x_center - x_range / 2, x_center + x_range / 2])
197
- ax.set_ylim([y_center - y_range / 2, y_center + y_range / 2])
198
-
199
- # Redraw the figure efficiently
200
- canvas.draw_idle()
201
-
202
173
  def zoom_test(event):
203
174
  if event.num == 4: # Scroll up
204
175
  print("zoom in")
205
176
  elif event.num == 5: # Scroll down
206
177
  print("zoom out")
207
-
208
- def zoom_2(event):
209
- zoom_speed = 0.1 # Change this to control how fast you zoom
178
+
179
+ def zoom_v1(event):
180
+ # Fixed zoom factors (adjust these if you want faster or slower zoom)
181
+ zoom_in_factor = 0.9 # When zooming in, ranges shrink by 10%
182
+ zoom_out_factor = 1.1 # When zooming out, ranges increase by 10%
210
183
 
211
184
  # Determine the zoom direction based on the scroll event
212
185
  if event.num == 4 or (hasattr(event, 'delta') and event.delta > 0): # Scroll up = zoom in
213
- factor = 1 - zoom_speed
186
+ factor = zoom_in_factor
214
187
  elif event.num == 5 or (hasattr(event, 'delta') and event.delta < 0): # Scroll down = zoom out
215
- factor = 1 + zoom_speed
188
+ factor = zoom_out_factor
216
189
  else:
217
190
  return # No recognized scroll direction
218
191
 
@@ -247,23 +220,28 @@ def display_figure(fig):
247
220
  return # No recognized scroll direction
248
221
 
249
222
  for ax in canvas.figure.get_axes():
223
+ # Get the current mouse position in pixel coordinates
224
+ mouse_x, mouse_y = event.x, event.y
225
+
226
+ # Convert pixel coordinates to data coordinates
227
+ inv = ax.transData.inverted()
228
+ data_x, data_y = inv.transform((mouse_x, mouse_y))
229
+
230
+ # Get the current axis limits
250
231
  xlim = ax.get_xlim()
251
232
  ylim = ax.get_ylim()
252
233
 
253
- x_center = (xlim[1] + xlim[0]) / 2
254
- y_center = (ylim[1] + ylim[0]) / 2
255
-
234
+ # Calculate the zooming range around the cursor position
256
235
  x_range = (xlim[1] - xlim[0]) * factor
257
236
  y_range = (ylim[1] - ylim[0]) * factor
258
237
 
259
- # Set the new limits
260
- ax.set_xlim([x_center - x_range / 2, x_center + x_range / 2])
261
- ax.set_ylim([y_center - y_range / 2, y_center + y_range / 2])
238
+ # Adjust the limits while keeping the mouse position fixed
239
+ ax.set_xlim([data_x - (data_x - xlim[0]) * factor, data_x + (xlim[1] - data_x) * factor])
240
+ ax.set_ylim([data_y - (data_y - ylim[0]) * factor, data_y + (ylim[1] - data_y) * factor])
262
241
 
263
242
  # Redraw the figure efficiently
264
243
  canvas.draw_idle()
265
244
 
266
-
267
245
  # Bind events for hover, click interactions, and zoom
268
246
  canvas_widget.bind("<Motion>", on_hover)
269
247
  canvas_widget.bind("<Leave>", on_leave)
@@ -106,7 +106,6 @@ def parse_list(value):
106
106
  except (ValueError, SyntaxError) as e:
107
107
  raise ValueError(f"Invalid format for list: {value}. Error: {e}")
108
108
 
109
- # Usage example in your create_input_field function
110
109
  def create_input_field(frame, label_text, row, var_type='entry', options=None, default_value=None):
111
110
  """
112
111
  Create an input field in the specified frame.
@@ -365,13 +364,16 @@ def convert_settings_dict_for_gui(settings):
365
364
  from torchvision import models as torch_models
366
365
  torchvision_models = [name for name, obj in torch_models.__dict__.items() if callable(obj)]
367
366
  chans = ['0', '1', '2', '3', '4', '5', '6', '7', '8', None]
367
+ chan_list = ['[0,1,2,3,4,5,6,7,8]','[0,1,2,3,4,5,6,7]','[0,1,2,3,4,5,6]','[0,1,2,3,4,5]','[0,1,2,3,4]','[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]', '[0,0]']
368
368
  chans_v2 = [0, 1, 2, 3, None]
369
+ chans_v3 = list(range(0, 21, 1)) + [None]
370
+ chans_v4 = [0, 1, 2, 3, None]
369
371
  variables = {}
370
372
  special_cases = {
371
373
  'metadata_type': ('combo', ['cellvoyager', 'cq1', 'nikon', 'zeis', 'custom'], 'cellvoyager'),
372
- 'channels': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]', '[0,0]'], '[0,1,2,3]'),
374
+ 'channels': ('combo', chan_list, '[0,1,2,3]'),
373
375
  'train_channels': ('combo', ["['r','g','b']", "['r','g']", "['r','b']", "['g','b']", "['r']", "['g']", "['b']"], "['r','g','b']"),
374
- 'channel_dims': ('combo', ['[0,1,2,3]', '[0,1,2]', '[0,1]', '[0]'], '[0,1,2,3]'),
376
+ 'channel_dims': ('combo', chan_list, '[0,1,2,3]'),
375
377
  'dataset_mode': ('combo', ['annotation', 'metadata', 'recruitment'], 'metadata'),
376
378
  'cov_type': ('combo', ['HC0', 'HC1', 'HC2', 'HC3', None], None),
377
379
  'cell_mask_dim': ('combo', chans, None),
@@ -380,12 +382,12 @@ def convert_settings_dict_for_gui(settings):
380
382
  'nucleus_chann_dim': ('combo', chans, None),
381
383
  'pathogen_mask_dim': ('combo', chans, None),
382
384
  'pathogen_chann_dim': ('combo', chans, None),
383
- 'crop_mode': ('combo', [['cell'], ['nucleus'], ['pathogen'], ['cell', 'nucleus'], ['cell', 'pathogen'], ['nucleus', 'pathogen'], ['cell', 'nucleus', 'pathogen']], ['cell']),
384
- 'magnification': ('combo', [20, 40, 60], 20),
385
- 'nucleus_channel': ('combo', chans_v2, None),
386
- 'cell_channel': ('combo', chans_v2, None),
387
- 'channel_of_interest': ('combo', chans_v2, None),
388
- 'pathogen_channel': ('combo', chans_v2, None),
385
+ 'crop_mode': ('combo', ["['cell']", "['nucleus']", "['pathogen']", "['cell', 'nucleus']", "['cell', 'pathogen']", "['nucleus', 'pathogen']", "['cell', 'nucleus', 'pathogen']"], "['cell']"),
386
+ #'magnification': ('combo', [20, 40, 60], 20),
387
+ 'nucleus_channel': ('combo', chans_v3, None),
388
+ 'cell_channel': ('combo', chans_v3, None),
389
+ 'channel_of_interest': ('combo', chans_v3, None),
390
+ 'pathogen_channel': ('combo', chans_v3, None),
389
391
  'timelapse_mode': ('combo', ['trackpy', 'btrack'], 'trackpy'),
390
392
  'train_mode': ('combo', ['erm', 'irm'], 'erm'),
391
393
  'clustering': ('combo', ['dbscan', 'kmean'], 'dbscan'),
@@ -891,11 +891,16 @@ def _merge_channels(src, plot=False):
891
891
  from .utils import print_progress
892
892
 
893
893
  stack_dir = os.path.join(src, 'stack')
894
- allowed_names = ['01', '02', '03', '04', '00', '1', '2', '3', '4', '0']
894
+ #allowed_names = ['01', '02', '03', '04', '00', '1', '2', '3', '4', '0']
895
+
896
+ string_list = [str(i) for i in range(101)]+[f"{i:02d}" for i in range(10)]
897
+ allowed_names = sorted(string_list, key=lambda x: int(x))
895
898
 
896
899
  # List directories that match the allowed names
897
900
  chan_dirs = [d for d in os.listdir(src) if os.path.isdir(os.path.join(src, d)) and d in allowed_names]
898
901
  chan_dirs.sort()
902
+
903
+ num_matching_folders = len(chan_dirs)
899
904
 
900
905
  print(f'List of folders in src: {chan_dirs}. Single channel folders.')
901
906
 
@@ -925,7 +930,7 @@ def _merge_channels(src, plot=False):
925
930
  if plot:
926
931
  plot_arrays(os.path.join(src, 'stack'))
927
932
 
928
- return
933
+ return num_matching_folders
929
934
 
930
935
  def _mip_all(src, include_first_chan=True):
931
936
 
@@ -1584,10 +1589,6 @@ def preprocess_img_data(settings):
1584
1589
  else:
1585
1590
  print(f'Could not find any {valid_ext} files in {src} only found {extension_counts[0]}')
1586
1591
 
1587
-
1588
-
1589
-
1590
-
1591
1592
  if os.path.exists(os.path.join(src,'stack')):
1592
1593
  print('Found existing stack folder.')
1593
1594
  if os.path.exists(os.path.join(src,'channel_stack')):
@@ -1644,7 +1645,13 @@ def preprocess_img_data(settings):
1644
1645
  print(f"all images: {all_imgs}, full batch: {full_batches}, last batch: {last_batch_size}")
1645
1646
  raise ValueError("Last batch of size 1 detected. Adjust the batch size.")
1646
1647
 
1647
- _merge_channels(src, plot=False)
1648
+ nr_channel_folders = _merge_channels(src, plot=False)
1649
+
1650
+ if len(settings['channels']) != nr_channel_folders:
1651
+ print(f"Number of channels does not match number of channel folders. channels: {settings['channels']} channel folders: {nr_channel_folders}")
1652
+ new_channels = list(range(nr_channel_folders))
1653
+ print(f"Setting channels to {new_channels}")
1654
+ settings['channels'] = new_channels
1648
1655
 
1649
1656
  if timelapse:
1650
1657
  _create_movies_from_npy_per_channel(stack_path, fps=2)
@@ -945,20 +945,25 @@ def measure_crop(settings):
945
945
 
946
946
  from .io import _save_settings_to_db
947
947
  from .timelapse import _timelapse_masks_to_gif
948
- from .utils import measure_test_mode, print_progress, delete_intermedeate_files, save_settings
948
+ from .utils import measure_test_mode, print_progress, delete_intermedeate_files, save_settings, format_path_for_system, normalize_src_path
949
949
  from .settings import get_measure_crop_settings
950
950
 
951
951
  if not isinstance(settings['src'], (str, list)):
952
952
  ValueError(f'src must be a string or a list of strings')
953
953
  return
954
954
 
955
+ settings['src'] = normalize_src_path(settings['src'])
956
+
955
957
  if isinstance(settings['src'], str):
956
958
  settings['src'] = [settings['src']]
957
959
 
958
960
  if isinstance(settings['src'], list):
959
961
  source_folders = settings['src']
962
+
960
963
  for source_folder in source_folders:
961
964
  print(f'Processing folder: {source_folder}')
965
+
966
+ source_folder = format_path_for_system(source_folder)
962
967
  settings['src'] = source_folder
963
968
  src = source_folder
964
969
 
@@ -966,15 +971,12 @@ def measure_crop(settings):
966
971
  settings = measure_test_mode(settings)
967
972
 
968
973
  src_fldr = settings['src']
974
+
969
975
  if not os.path.basename(src_fldr).endswith('merged'):
970
976
  print(f"WARNING: Source folder, settings: src: {src_fldr} should end with '/merged'")
971
977
  src_fldr = os.path.join(src_fldr, 'merged')
978
+ settings['src'] = src_fldr
972
979
  print(f"Changed source folder to: {src_fldr}")
973
-
974
- #if settings['save_measurements']:
975
- #source_folder = os.path.dirname(settings['src'])
976
- #os.makedirs(source_folder+'/measurements', exist_ok=True)
977
- #_create_database(source_folder+'/measurements/measurements.db')
978
980
 
979
981
  if settings['cell_mask_dim'] is None:
980
982
  settings['uninfected'] = True
@@ -995,12 +997,9 @@ def measure_crop(settings):
995
997
  print(f'Warning reserving 6 CPU cores for other processes, setting n_jobs to {spacr_cores}')
996
998
  settings['n_jobs'] = spacr_cores
997
999
 
998
- #dirname = os.path.dirname(settings['src'])
999
- #settings_df = pd.DataFrame(list(settings.items()), columns=['Key', 'Value'])
1000
- #settings_csv = os.path.join(dirname,'settings','measure_crop_settings.csv')
1001
- #os.makedirs(os.path.join(dirname,'settings'), exist_ok=True)
1002
- #settings_df.to_csv(settings_csv, index=False)
1003
- save_settings(settings, name='measure_crop_settings', show=True)
1000
+ settings_save = settings.copy()
1001
+ settings_save['src'] = os.path.dirname(settings['src'])
1002
+ save_settings(settings_save, name='measure_crop_settings', show=True)
1004
1003
 
1005
1004
  if settings['timelapse_objects'] == 'nucleus':
1006
1005
  if not settings['cell_mask_dim'] is None:
@@ -86,7 +86,7 @@ def set_default_settings_preprocess_generate_masks(settings={}):
86
86
  settings.setdefault('fps', 2)
87
87
  settings.setdefault('timelapse_displacement', None)
88
88
  settings.setdefault('timelapse_memory', 3)
89
- settings.setdefault('timelapse_frame_limits', None)
89
+ settings.setdefault('timelapse_frame_limits', [5,60])
90
90
  settings.setdefault('timelapse_remove_transient', False)
91
91
  settings.setdefault('timelapse_mode', 'trackpy')
92
92
  settings.setdefault('timelapse_objects', None)
@@ -256,7 +256,13 @@ def get_measure_crop_settings(settings={}):
256
256
  settings.setdefault('homogeneity', True)
257
257
  settings.setdefault('homogeneity_distances', [8,16,32])
258
258
 
259
- # Cropping settings
259
+ # Cropping settings # Cropping settings
260
+ settings.setdefault('save_arrays', False)
261
+ settings.setdefault('save_png',True)
262
+ settings.setdefault('use_bounding_box',False)
263
+ settings.setdefault('png_size',[224,224])
264
+ settings.setdefault('png_dims',[0,1,2])
265
+ settings.setdefault('normalize',False) # Cropping settings
260
266
  settings.setdefault('save_arrays', False)
261
267
  settings.setdefault('save_png',True)
262
268
  settings.setdefault('use_bounding_box',False)
@@ -277,9 +283,79 @@ def get_measure_crop_settings(settings={}):
277
283
  settings.setdefault('n_jobs', os.cpu_count()-2)
278
284
 
279
285
  # Object settings
280
- settings.setdefault('cell_mask_dim',None)
281
- settings.setdefault('nucleus_mask_dim',None)
282
- settings.setdefault('pathogen_mask_dim',None)
286
+ settings.setdefault('cell_mask_dim',4)
287
+ settings.setdefault('nucleus_mask_dim',5)
288
+ settings.setdefault('pathogen_mask_dim',6)
289
+ settings.setdefault('cytoplasm',False)
290
+ settings.setdefault('uninfected',True)
291
+ settings.setdefault('cell_min_size',0)
292
+ settings.setdefault('nucleus_min_size',0)
293
+ settings.setdefault('pathogen_min_size',0)
294
+ settings.setdefault('cytoplasm_min_size',0)
295
+ settings.setdefault('merge_edge_pathogen_cells', True)
296
+
297
+ if settings['test_mode']:
298
+ settings['verbose'] = True
299
+ settings['plot'] = True
300
+ test_imgs = settings['test_nr']
301
+ print(f'Test mode enabled with {test_imgs} images, plotting set to True')
302
+
303
+ return settings
304
+ settings.setdefault('normalize_by','png')
305
+ settings.setdefault('crop_mode',['cell'])
306
+ settings.setdefault('dialate_pngs', False)
307
+ settings.setdefault('dialate_png_ratios', [0.2])
308
+
309
+ # Timelapsed settings
310
+ settings.setdefault('timelapse', False)
311
+ settings.setdefault('timelapse_objects', 'cell')
312
+
313
+ # Operational settings
314
+ settings.setdefault('plot',False)
315
+ settings.setdefault('n_jobs', os.cpu_count()-2)
316
+
317
+ # Object settings
318
+ settings.setdefault('cell_mask_dim',4)
319
+ settings.setdefault('nucleus_mask_dim',5)
320
+ settings.setdefault('pathogen_mask_dim',6)
321
+ settings.setdefault('cytoplasm',False)
322
+ settings.setdefault('uninfected',True)
323
+ settings.setdefault('cell_min_size',0)
324
+ settings.setdefault('nucleus_min_size',0)
325
+ settings.setdefault('pathogen_min_size',0)
326
+ settings.setdefault('cytoplasm_min_size',0)
327
+ settings.setdefault('merge_edge_pathogen_cells', True)
328
+
329
+ if settings['test_mode']:
330
+ settings['verbose'] = True
331
+ settings['plot'] = True
332
+ test_imgs = settings['test_nr']
333
+ print(f'Test mode enabled with {test_imgs} images, plotting set to True')
334
+
335
+ return settings
336
+ settings.setdefault('save_arrays', False)
337
+ settings.setdefault('save_png',True)
338
+ settings.setdefault('use_bounding_box',False)
339
+ settings.setdefault('png_size',[224,224])
340
+ settings.setdefault('png_dims',[0,1,2])
341
+ settings.setdefault('normalize',False)
342
+ settings.setdefault('normalize_by','png')
343
+ settings.setdefault('crop_mode',['cell'])
344
+ settings.setdefault('dialate_pngs', False)
345
+ settings.setdefault('dialate_png_ratios', [0.2])
346
+
347
+ # Timelapsed settings
348
+ settings.setdefault('timelapse', False)
349
+ settings.setdefault('timelapse_objects', 'cell')
350
+
351
+ # Operational settings
352
+ settings.setdefault('plot',False)
353
+ settings.setdefault('n_jobs', os.cpu_count()-2)
354
+
355
+ # Object settings
356
+ settings.setdefault('cell_mask_dim',4)
357
+ settings.setdefault('nucleus_mask_dim',5)
358
+ settings.setdefault('pathogen_mask_dim',6)
283
359
  settings.setdefault('cytoplasm',False)
284
360
  settings.setdefault('uninfected',True)
285
361
  settings.setdefault('cell_min_size',0)
@@ -473,7 +549,7 @@ def get_train_test_model_settings(settings):
473
549
  return settings
474
550
 
475
551
  def get_analyze_recruitment_default_settings(settings):
476
- settings.setdefault('src','path')
552
+ settings.setdefault('src', 'path')
477
553
  settings.setdefault('target','protein')
478
554
  settings.setdefault('cell_types',['HeLa'])
479
555
  settings.setdefault('cell_plate_metadata',None)
@@ -672,6 +748,7 @@ expected_types = {
672
748
  "timelapse_displacement": int,
673
749
  "timelapse_memory": int,
674
750
  "timelapse_frame_limits": (list, type(None)), # This can be a list of lists
751
+ #"timelapse_frame_limits": (list, type(None)), # This can be a list of lists
675
752
  "timelapse_remove_transient": bool,
676
753
  "timelapse_mode": str,
677
754
  "timelapse_objects": list,
@@ -944,13 +1021,13 @@ expected_types = {
944
1021
  }
945
1022
 
946
1023
  categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset","model_path","grna_csv","row_csv","column_csv", "metadata_files", "score_data","count_data"],
947
- "General": ["metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims", "apply_model_to_dataset", "generate_training_dataset", "train_DL_model", "segmentation_mode", "delete_intermediate"],
1024
+ "General": ["cell_mask_dim", "cytoplasm", "cell_chann_dim", "cell_channel", "nucleus_chann_dim", "nucleus_channel", "nucleus_mask_dim", "pathogen_mask_dim", "pathogen_chann_dim", "pathogen_channel", "test_mode", "plot", "metadata_type", "custom_regex", "experiment", "channels", "magnification", "channel_dims", "apply_model_to_dataset", "generate_training_dataset", "train_DL_model", "segmentation_mode", "delete_intermediate", "uninfected", ],
948
1025
  "Cellpose":["fill_in","from_scratch", "n_epochs", "width_height", "model_name", "custom_model", "resample", "rescale", "CP_prob", "flow_threshold", "percentiles", "invert", "diameter", "grayscale", "Signal_to_noise", "resize", "target_height", "target_width"],
949
- "Cell": ["cell_diamiter","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"],
950
- "Nucleus": ["nucleus_diamiter","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"],
951
- "Pathogen": ["pathogen_diamiter","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", ],
1026
+ "Cell": ["cell_diamiter","cell_intensity_range", "cell_size_range", "cell_background", "cell_Signal_to_noise", "cell_CP_prob", "cell_FT", "remove_background_cell", "cell_min_size", "cytoplasm_min_size", "adjust_cells", "cells", "cell_loc"],
1027
+ "Nucleus": ["nucleus_diamiter","nucleus_intensity_range", "nucleus_size_range", "nucleus_background", "nucleus_Signal_to_noise", "nucleus_CP_prob", "nucleus_FT", "remove_background_nucleus", "nucleus_min_size", "nucleus_loc"],
1028
+ "Pathogen": ["pathogen_diamiter","pathogen_intensity_range", "pathogen_size_range", "pathogen_background", "pathogen_Signal_to_noise", "pathogen_CP_prob", "pathogen_FT", "pathogen_model", "remove_background_pathogen", "pathogen_min_size", "pathogens", "pathogen_loc", "pathogen_types", "pathogen_plate_metadata", ],
952
1029
  "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"],
953
- "Object Image": ["save_png", "dialate_pngs", "dialate_png_ratios", "png_size", "png_dims", "save_arrays", "normalize_by", "crop_mode", "normalize", "use_bounding_box"],
1030
+ "Object Image": ["save_png", "dialate_pngs", "dialate_png_ratios", "png_size", "png_dims", "save_arrays", "normalize_by", "crop_mode", "use_bounding_box"],
954
1031
  "Sequencing": ["outlier_detection","offset_start","chunk_size","single_direction", "signal_direction","mode","comp_level","comp_type","save_h5","expected_end","offset","target_sequence","regex", "highlight"],
955
1032
  "Generate Dataset":["save_to_db","file_metadata","class_metadata", "annotation_column","annotated_classes", "dataset_mode", "metadata_type_by","custom_measurement", "sample", "size"],
956
1033
  "Hyperparamiters (Training)": ["png_type", "score_threshold","file_type", "train_channels", "epochs", "loss_type", "optimizer_type","image_size","val_split","learning_rate","weight_decay","dropout_rate", "init_weights", "train", "classes", "augment", "amsgrad","use_checkpoint","gradient_accumulation","gradient_accumulation_steps","intermedeate_save","pin_memory"],
@@ -959,11 +1036,10 @@ categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset
959
1036
  "Hyperparamiters (Regression)":["cross_validation","prune_features","reg_lambda","reg_alpha","cov_type", "class_1_threshold", "plate", "other", "fraction_threshold", "alpha", "random_row_column_effects", "regression_type", "min_cell_count", "agg_type", "transform", "dependent_variable"],
960
1037
  "Hyperparamiters (Activation)":["cam_type", "overlay", "correlation", "target_layer", "normalize_input"],
961
1038
  "Annotation": ["filter_column", "filter_value","volcano", "toxo", "controls", "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"],
962
- "Plot": ["plot", "split_axis_lims", "x_lim","log_x","log_y", "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"],
963
- "Test": ["test_mode", "test_images", "random_test", "test_nr", "test", "test_split"],
1039
+ "Plot": ["split_axis_lims", "x_lim","log_x","log_y", "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"],
964
1040
  "Timelapse": ["timelapse", "fps", "timelapse_displacement", "timelapse_memory", "timelapse_frame_limits", "timelapse_remove_transient", "timelapse_mode", "timelapse_objects", "compartments"],
965
- "Advanced": ["target_unique_count","threshold_multiplier", "threshold_method", "min_n","shuffle", "target_intensity_min", "cells_per_well", "nuclei_limit", "pathogen_limit", "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"],
966
- "Miscellaneous": ["all_to_mip", "pick_slice", "skip_mode", "upscale", "upscale_factor"]
1041
+ "Advanced": ["merge_edge_pathogen_cells", "test_images", "random_test", "test_nr", "test", "test_split", "normalize", "target_unique_count","threshold_multiplier", "threshold_method", "min_n","shuffle", "target_intensity_min", "cells_per_well", "nuclei_limit", "pathogen_limit", "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"],
1042
+ "Beta": ["all_to_mip", "pick_slice", "skip_mode", "upscale", "upscale_factor"]
967
1043
  }
968
1044
 
969
1045
 
@@ -984,22 +1060,28 @@ def check_settings(vars_dict, expected_types, q=None):
984
1060
  q.put(f"Key {key} not found in expected types.")
985
1061
  continue
986
1062
 
987
- value = var.get()
988
- if value == 'None':
1063
+ value = var.get()
1064
+ if value in ['None', '']:
989
1065
  value = None
990
1066
 
991
1067
  expected_type = expected_types.get(key, str)
992
1068
 
993
1069
  try:
994
- if key in ["cell_plate_metadata", "timelapse_frame_limits", "png_size", "pathogen_loc", "treatment_loc", "pathogen_plate_metadata", "treatment_plate_metadata", "barcode_coordinates", "class_metadata"]:
995
- parsed_value = ast.literal_eval(value) if value else None
1070
+ #if key in ["cell_plate_metadata", "timelapse_frame_limits", "png_size", "pathogen_loc", "treatment_loc", "pathogen_plate_metadata", "treatment_plate_metadata", "barcode_coordinates", "class_metadata"]:
1071
+ if key in ["cell_plate_metadata", "timelapse_frame_limits", "png_size", "png_dims", "pathogen_plate_metadata", "treatment_plate_metadata", "class_metadata", "crop_mode"]:
1072
+
1073
+ if value is None:
1074
+ parsed_value = None
1075
+ else:
1076
+ parsed_value = ast.literal_eval(value) if isinstance(value, str) and value.strip() else None
1077
+
1078
+ #parsed_value = ast.literal_eval(value) if value else None
1079
+
996
1080
  if isinstance(parsed_value, list):
997
1081
  if all(isinstance(i, list) for i in parsed_value) or all(not isinstance(i, list) for i in parsed_value):
998
1082
  settings[key] = parsed_value
999
1083
  else:
1000
1084
  raise ValueError("Invalid format: Mixed list and list of lists")
1001
- #elif parsed_value == None:
1002
- # settings[key] = None
1003
1085
  else:
1004
1086
  raise ValueError("Invalid format for list or list of lists")
1005
1087
 
@@ -1180,30 +1262,7 @@ def generate_fields(variables, scrollable_frame):
1180
1262
  "n_epochs": "(int) - Number of epochs for training the Cellpose model.",
1181
1263
  "n_jobs": "(int) - The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
1182
1264
  "n_neighbors": "(int) - Number of neighbors for UMAP.",
1183
- "n_repeats": "(int) - Number of repeats for cross-validation.",
1184
- "normalize": "(list) - The percentiles to use for normalizing the images. This will be used to determine the range of intensities to normalize images to. If None, no normalization is done.",
1185
- "normalize_by": "(str) - Whether to normalize the images by field of view (fov) or by PNG image (png).",
1186
- "normalize_plots": "(bool) - Whether to normalize the plots.",
1187
- "nr_imgs": "(int) - The number of images to plot.",
1188
- "nucleus_CP_prob": "(float) - The cellpose probability threshold for the nucleus channel. This will be used to segment the nucleus.",
1189
- "nucleus_FT": "(float) - The flow threshold for nucleus objects. This will be used in nucleus segmentation.",
1190
- "nucleus_background": "(float) - The background intensity for the nucleus channel. This will be used to remove background noise.",
1191
- "nucleus_chann_dim": "(int) - Dimension of the channel to use for nucleus segmentation.",
1192
- "nucleus_channel": "(int) - The channel to use for the nucleus. If None, the nucleus will not be segmented.",
1193
- "nucleus_intensity_range": "(list) - Intensity range for nucleus segmentation.",
1194
- "nucleus_loc": "(str) - Location of the nucleus in the images.",
1195
- "nucleus_mask_dim": "(int) - The dimension of the array the nucleus mask is saved in.",
1196
- "nucleus_min_size": "(int) - The minimum size of nucleus objects in pixels^2.",
1197
- "nucleus_Signal_to_noise": "(float) - The signal-to-noise ratio for the nucleus channel. This will be used to determine the range of intensities to normalize images to for nucleus segmentation.",
1198
- "nucleus_size_range": "(list) - Size range for nucleus segmentation.",
1199
- "optimizer_type": "(str) - Type of optimizer to use.",
1200
- "other": "(dict) - Additional parameters for the regression analysis.",
1201
- "pathogen_CP_prob": "(float) - The cellpose probability threshold for the pathogen channel. This will be used to segment the pathogen.",
1202
- "pathogen_FT": "(float) - The flow threshold for pathogen objects. This will be used in pathogen segmentation.",
1203
- "pathogen_background": "(float) - The background intensity for the pathogen channel. This will be used to remove background noise.",
1204
- "pathogen_chann_dim": "(int) - Dimension of the channel to use for pathogen segmentation.",
1205
- "pathogen_channel": "(int) - The channel to use for the pathogen. If None, the pathogen will not be segmented.",
1206
- "pathogen_intensity_range": "(str) - Metadata for the pathogen plate.",
1265
+ "n_repeats": "(int) - Number of repeats for the pathogen plate.",
1207
1266
  "pathogen_Signal_to_noise": "(float) - The signal-to-noise ratio for the pathogen channel. This will be used to determine the range of intensities to normalize images to for pathogen segmentation.",
1208
1267
  "pathogen_size_range": "(list) - Size range for pathogen segmentation.",
1209
1268
  "pathogen_types": "(list) - Types of pathogens to include in the analysis.",
@@ -1222,7 +1281,7 @@ def generate_fields(variables, scrollable_frame):
1222
1281
  "plot_nr": "(int) - Number of plots to generate.",
1223
1282
  "plot_outlines": "(bool) - Whether to plot outlines of segmented objects.",
1224
1283
  "png_dims": "(list) - The dimensions of the PNG images to save. This will determine the dimensions of the saved images. Maximum of 3 dimensions e.g. [1,2,3].",
1225
- "png_size": "(int) - The size of the PNG images to save. This will determine the size of the saved images.",
1284
+ "png_size": "(list) - The size of the PNG images to save. This will determine the size of the saved images.",
1226
1285
  "positive_control": "(str) - Identifier for the positive control.",
1227
1286
  "preprocess": "(bool) - Whether to preprocess the images before segmentation. This includes background removal and normalization. Set to False only if this step has already been done.",
1228
1287
  "radial_dist": "(list) - Radial distances for measuring features.",
@@ -21,7 +21,7 @@ from sklearn.metrics import mean_absolute_error
21
21
  import matplotlib.pyplot as plt
22
22
  from natsort import natsorted
23
23
 
24
- def analyze_recruitment(settings={}):
24
+ def analyze_recruitment(settings):
25
25
  """
26
26
  Analyze recruitment data by grouping the DataFrame by well coordinates and plotting controls and recruitment data.
27
27