spacr 0.3.30__tar.gz → 0.3.32__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.30/spacr.egg-info → spacr-0.3.32}/PKG-INFO +1 -1
  2. {spacr-0.3.30 → spacr-0.3.32}/setup.py +1 -1
  3. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_annotate.py +20 -4
  4. {spacr-0.3.30 → spacr-0.3.32}/spacr/gui_elements.py +72 -49
  5. {spacr-0.3.30 → spacr-0.3.32}/spacr/gui_utils.py +21 -44
  6. {spacr-0.3.30 → spacr-0.3.32}/spacr/plot.py +0 -2
  7. {spacr-0.3.30 → spacr-0.3.32}/spacr/settings.py +1 -0
  8. {spacr-0.3.30 → spacr-0.3.32/spacr.egg-info}/PKG-INFO +1 -1
  9. {spacr-0.3.30 → spacr-0.3.32}/.readthedocs.yaml +0 -0
  10. {spacr-0.3.30 → spacr-0.3.32}/LICENSE +0 -0
  11. {spacr-0.3.30 → spacr-0.3.32}/MANIFEST.in +0 -0
  12. {spacr-0.3.30 → spacr-0.3.32}/README.rst +0 -0
  13. {spacr-0.3.30 → spacr-0.3.32}/deploy_docs.sh +0 -0
  14. {spacr-0.3.30 → spacr-0.3.32}/docs/requirements.txt +0 -0
  15. {spacr-0.3.30 → spacr-0.3.32}/docs/source/Makefile +0 -0
  16. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/doctrees/environment.pickle +0 -0
  17. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/index.html +0 -0
  18. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_annotate.html +0 -0
  19. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_classify.html +0 -0
  20. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_make_masks.html +0 -0
  21. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_mask.html +0 -0
  22. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_measure.html +0 -0
  23. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_sequencing.html +0 -0
  24. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/app_umap.html +0 -0
  25. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/core.html +0 -0
  26. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/deep_spacr.html +0 -0
  27. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/graph_learning.html +0 -0
  28. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/gui.html +0 -0
  29. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/gui_core.html +0 -0
  30. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/gui_elements.html +0 -0
  31. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/gui_utils.html +0 -0
  32. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/io.html +0 -0
  33. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/logger.html +0 -0
  34. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/measure.html +0 -0
  35. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/plot.html +0 -0
  36. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/sequencing.html +0 -0
  37. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/settings.html +0 -0
  38. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/sim.html +0 -0
  39. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/timelapse.html +0 -0
  40. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_modules/spacr/utils.html +0 -0
  41. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_sources/index.rst.txt +0 -0
  42. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_sources/modules.rst.txt +0 -0
  43. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_sources/spacr.rst.txt +0 -0
  44. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  45. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/basic.css +0 -0
  46. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/badge_only.css +0 -0
  47. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  48. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  49. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  50. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  51. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  52. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  53. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  54. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  55. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  56. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  57. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  58. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  59. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  60. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  61. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  62. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  63. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  64. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/css/theme.css +0 -0
  65. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/doctools.js +0 -0
  66. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/documentation_options.js +0 -0
  67. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/file.png +0 -0
  68. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/jquery.js +0 -0
  69. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/js/badge_only.js +0 -0
  70. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  71. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/js/html5shiv.min.js +0 -0
  72. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/js/theme.js +0 -0
  73. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/language_data.js +0 -0
  74. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/minus.png +0 -0
  75. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/plus.png +0 -0
  76. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/pygments.css +0 -0
  77. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/searchtools.js +0 -0
  78. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
  79. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/genindex.html +0 -0
  80. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/index.html +0 -0
  81. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/modules.html +0 -0
  82. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/objects.inv +0 -0
  83. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/py-modindex.html +0 -0
  84. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/search.html +0 -0
  85. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/searchindex.js +0 -0
  86. {spacr-0.3.30 → spacr-0.3.32}/docs/source/_build/html/spacr.html +0 -0
  87. {spacr-0.3.30 → spacr-0.3.32}/docs/source/conf.py +0 -0
  88. {spacr-0.3.30 → spacr-0.3.32}/docs/source/index.rst +0 -0
  89. {spacr-0.3.30 → spacr-0.3.32}/docs/source/make.bat +0 -0
  90. {spacr-0.3.30 → spacr-0.3.32}/docs/source/modules.rst +0 -0
  91. {spacr-0.3.30 → spacr-0.3.32}/docs/source/spacr.rst +0 -0
  92. {spacr-0.3.30 → spacr-0.3.32}/environment.yaml +0 -0
  93. {spacr-0.3.30 → spacr-0.3.32}/fonts/OpenSans-Regular.ttf +0 -0
  94. {spacr-0.3.30 → spacr-0.3.32}/notebooks/cv_scoring_nb.ipynb +0 -0
  95. {spacr-0.3.30 → spacr-0.3.32}/notebooks/deep_learning_spacr.ipynb +0 -0
  96. {spacr-0.3.30 → spacr-0.3.32}/notebooks/machine_learning_spacr_nb.ipynb +0 -0
  97. {spacr-0.3.30 → spacr-0.3.32}/notebooks/spacr_0.1_all_settings_git.ipynb +0 -0
  98. {spacr-0.3.30 → spacr-0.3.32}/notebooks/spacr_0.1_minimal.ipynb +0 -0
  99. {spacr-0.3.30 → spacr-0.3.32}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
  100. {spacr-0.3.30 → spacr-0.3.32}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
  101. {spacr-0.3.30 → spacr-0.3.32}/path/settings/preprocess_generate_masks_settings.csv +0 -0
  102. {spacr-0.3.30 → spacr-0.3.32}/requirements.txt +0 -0
  103. {spacr-0.3.30 → spacr-0.3.32}/settings/measure_crop_settings.csv +0 -0
  104. {spacr-0.3.30 → spacr-0.3.32}/setup.cfg +0 -0
  105. {spacr-0.3.30 → spacr-0.3.32}/setup_docs.sh +0 -0
  106. {spacr-0.3.30 → spacr-0.3.32}/source/conf.py +0 -0
  107. {spacr-0.3.30 → spacr-0.3.32}/source/index.rst +0 -0
  108. {spacr-0.3.30 → spacr-0.3.32}/source/modules.rst +0 -0
  109. {spacr-0.3.30 → spacr-0.3.32}/source/setup.rst +0 -0
  110. {spacr-0.3.30 → spacr-0.3.32}/source/spacr.rst +0 -0
  111. {spacr-0.3.30 → spacr-0.3.32}/spacr/__init__.py +0 -0
  112. {spacr-0.3.30 → spacr-0.3.32}/spacr/__main__.py +0 -0
  113. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_classify.py +0 -0
  114. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_make_masks.py +0 -0
  115. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_mask.py +0 -0
  116. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_measure.py +0 -0
  117. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_sequencing.py +0 -0
  118. {spacr-0.3.30 → spacr-0.3.32}/spacr/app_umap.py +0 -0
  119. {spacr-0.3.30 → spacr-0.3.32}/spacr/cellpose.py +0 -0
  120. {spacr-0.3.30 → spacr-0.3.32}/spacr/core.py +0 -0
  121. {spacr-0.3.30 → spacr-0.3.32}/spacr/deep_spacr.py +0 -0
  122. {spacr-0.3.30 → spacr-0.3.32}/spacr/gui.py +0 -0
  123. {spacr-0.3.30 → spacr-0.3.32}/spacr/gui_core.py +0 -0
  124. {spacr-0.3.30 → spacr-0.3.32}/spacr/io.py +0 -0
  125. {spacr-0.3.30 → spacr-0.3.32}/spacr/logger.py +0 -0
  126. {spacr-0.3.30 → spacr-0.3.32}/spacr/measure.py +0 -0
  127. {spacr-0.3.30 → spacr-0.3.32}/spacr/mediar.py +0 -0
  128. {spacr-0.3.30 → spacr-0.3.32}/spacr/ml.py +0 -0
  129. {spacr-0.3.30 → spacr-0.3.32}/spacr/openai.py +0 -0
  130. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/.gitignore +0 -0
  131. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/LICENSE +0 -0
  132. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/README.md +0 -0
  133. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/SetupDict.py +0 -0
  134. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/baseline.json +0 -0
  135. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
  136. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
  137. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
  138. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
  139. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
  140. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
  141. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
  142. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
  143. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
  144. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
  145. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
  146. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
  147. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
  148. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
  149. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
  150. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
  151. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
  152. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
  153. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
  154. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/__init__.py +0 -0
  155. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/core/utils.py +0 -0
  156. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/evaluate.py +0 -0
  157. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
  158. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  159. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  160. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  161. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  162. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  163. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  164. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/main.py +0 -0
  165. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/predict.py +0 -0
  166. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/requirements.txt +0 -0
  167. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
  168. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
  169. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
  170. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
  171. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
  172. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
  173. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  174. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
  175. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
  176. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
  177. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
  178. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
  179. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
  180. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
  181. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/data/lopit.csv +0 -0
  182. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  183. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/OFL.txt +0 -0
  184. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  185. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  186. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/README.txt +0 -0
  187. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  188. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  189. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  190. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  191. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  192. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  193. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  194. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  195. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  196. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  197. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  198. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  199. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  200. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  201. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  202. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  203. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  204. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  205. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  206. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  207. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  208. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  209. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  210. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  211. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  212. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  213. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  214. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  215. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  216. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  217. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  218. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  219. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  220. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  221. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  222. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  223. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/abort.png +0 -0
  224. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/annotate.png +0 -0
  225. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/cellpose_all.png +0 -0
  226. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/cellpose_masks.png +0 -0
  227. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/classify.png +0 -0
  228. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/convert.png +0 -0
  229. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/default.png +0 -0
  230. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/dna_matrix.mp4 +0 -0
  231. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/download.png +0 -0
  232. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/logo.pdf +0 -0
  233. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/logo_spacr.png +0 -0
  234. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/logo_spacr_1.png +0 -0
  235. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/make_masks.png +0 -0
  236. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/map_barcodes.png +0 -0
  237. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/mask.png +0 -0
  238. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/measure.png +0 -0
  239. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/ml_analyze.png +0 -0
  240. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/plaque.png +0 -0
  241. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/recruitment.png +0 -0
  242. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/regression.png +0 -0
  243. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/run.png +0 -0
  244. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/sequencing.png +0 -0
  245. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/settings.png +0 -0
  246. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/train_cellpose.png +0 -0
  247. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/icons/umap.png +0 -0
  248. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  249. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  250. {spacr-0.3.30 → spacr-0.3.32}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  251. {spacr-0.3.30 → spacr-0.3.32}/spacr/sequencing.py +0 -0
  252. {spacr-0.3.30 → spacr-0.3.32}/spacr/sim.py +0 -0
  253. {spacr-0.3.30 → spacr-0.3.32}/spacr/submodules.py +0 -0
  254. {spacr-0.3.30 → spacr-0.3.32}/spacr/timelapse.py +0 -0
  255. {spacr-0.3.30 → spacr-0.3.32}/spacr/toxo.py +0 -0
  256. {spacr-0.3.30 → spacr-0.3.32}/spacr/utils.py +0 -0
  257. {spacr-0.3.30 → spacr-0.3.32}/spacr/version.py +0 -0
  258. {spacr-0.3.30 → spacr-0.3.32}/spacr.egg-info/SOURCES.txt +0 -0
  259. {spacr-0.3.30 → spacr-0.3.32}/spacr.egg-info/dependency_links.txt +0 -0
  260. {spacr-0.3.30 → spacr-0.3.32}/spacr.egg-info/entry_points.txt +0 -0
  261. {spacr-0.3.30 → spacr-0.3.32}/spacr.egg-info/requires.txt +0 -0
  262. {spacr-0.3.30 → spacr-0.3.32}/spacr.egg-info/top_level.txt +0 -0
  263. {spacr-0.3.30 → spacr-0.3.32}/tests/test_annotate_app.py +0 -0
  264. {spacr-0.3.30 → spacr-0.3.32}/tests/test_core.py +0 -0
  265. {spacr-0.3.30 → spacr-0.3.32}/tests/test_gui_classify_app.py +0 -0
  266. {spacr-0.3.30 → spacr-0.3.32}/tests/test_gui_mask_app.py +0 -0
  267. {spacr-0.3.30 → spacr-0.3.32}/tests/test_gui_measure_app.py +0 -0
  268. {spacr-0.3.30 → spacr-0.3.32}/tests/test_gui_sim_app.py +0 -0
  269. {spacr-0.3.30 → spacr-0.3.32}/tests/test_gui_utils.py +0 -0
  270. {spacr-0.3.30 → spacr-0.3.32}/tests/test_io.py +0 -0
  271. {spacr-0.3.30 → spacr-0.3.32}/tests/test_mask_app.py +0 -0
  272. {spacr-0.3.30 → spacr-0.3.32}/tests/test_measure.py +0 -0
  273. {spacr-0.3.30 → spacr-0.3.32}/tests/test_plot.py +0 -0
  274. {spacr-0.3.30 → spacr-0.3.32}/tests/test_sim.py +0 -0
  275. {spacr-0.3.30 → spacr-0.3.32}/tests/test_timelapse.py +0 -0
  276. {spacr-0.3.30 → spacr-0.3.32}/tests/test_train.py +0 -0
  277. {spacr-0.3.30 → spacr-0.3.32}/tests/test_umap.py +0 -0
  278. {spacr-0.3.30 → spacr-0.3.32}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.30
3
+ Version: 0.3.32
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.30",
70
+ version="0.3.32",
71
71
  author="Einar Birnir Olafsson",
72
72
  author_email="olafsson@med.umich.com",
73
73
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -3,8 +3,25 @@ from tkinter import ttk
3
3
  from .gui import MainApp
4
4
  from .gui_elements import set_dark_style, spacrButton
5
5
 
6
+ def convert_to_number(value):
7
+
8
+ """
9
+ Converts a string value to an integer if possible, otherwise converts to a float.
10
+ Args:
11
+ value (str): The string representation of the number.
12
+ Returns:
13
+ int or float: The converted number.
14
+ """
15
+ try:
16
+ return int(value)
17
+ except ValueError:
18
+ try:
19
+ return float(value)
20
+ except ValueError:
21
+ raise ValueError(f"Unable to convert '{value}' to an integer or float.")
22
+
6
23
  def initiate_annotation_app(parent_frame):
7
- from .gui_utils import generate_annotate_fields, annotate_app
24
+ from .gui_utils import generate_annotate_fields, annotate_app, convert_to_number
8
25
  # Set up the settings window
9
26
  settings_window = tk.Toplevel(parent_frame)
10
27
  settings_window.title("Annotation Settings")
@@ -18,9 +35,9 @@ def initiate_annotation_app(parent_frame):
18
35
  settings = {key: data['entry'].get() for key, data in vars_dict.items()}
19
36
  settings['channels'] = settings['channels'].split(',')
20
37
  settings['img_size'] = list(map(int, settings['img_size'].split(','))) # Convert string to list of integers
21
- settings['percentiles'] = list(map(int, settings['percentiles'].split(','))) # Convert string to list of integers
38
+ settings['percentiles'] = list(map(convert_to_number, settings['percentiles'].split(','))) if settings['percentiles'] else [2, 98]
22
39
  settings['normalize'] = settings['normalize'].lower() == 'true'
23
-
40
+ settings['normalize_channels'] = settings['normalize_channels'].split(',')
24
41
  try:
25
42
  settings['measurement'] = settings['measurement'].split(',') if settings['measurement'] else None
26
43
  settings['threshold'] = None if settings['threshold'].lower() == 'none' else int(settings['threshold'])
@@ -38,7 +55,6 @@ def initiate_annotation_app(parent_frame):
38
55
  settings[key] = None
39
56
 
40
57
  settings_window.destroy()
41
-
42
58
  annotate_app(parent_frame, settings)
43
59
 
44
60
  start_button = spacrButton(settings_window, text="annotate", command=start_annotation_app, show_text=False)
@@ -20,6 +20,47 @@ from tkinter import ttk, scrolledtext
20
20
 
21
21
  fig = None
22
22
 
23
+ def create_menu_bar(root):
24
+ from .gui import initiate_root
25
+ gui_apps = {
26
+ "Mask": lambda: initiate_root(root, settings_type='mask'),
27
+ "Measure": lambda: initiate_root(root, settings_type='measure'),
28
+ "Annotate": lambda: initiate_root(root, settings_type='annotate'),
29
+ "Make Masks": lambda: initiate_root(root, settings_type='make_masks'),
30
+ "Classify": lambda: initiate_root(root, settings_type='classify'),
31
+ "Umap": lambda: initiate_root(root, settings_type='umap'),
32
+ "Train Cellpose": lambda: initiate_root(root, settings_type='train_cellpose'),
33
+ "ML Analyze": lambda: initiate_root(root, settings_type='ml_analyze'),
34
+ "Cellpose Masks": lambda: initiate_root(root, settings_type='cellpose_masks'),
35
+ "Cellpose All": lambda: initiate_root(root, settings_type='cellpose_all'),
36
+ "Map Barcodes": lambda: initiate_root(root, settings_type='map_barcodes'),
37
+ "Regression": lambda: initiate_root(root, settings_type='regression'),
38
+ "Activation": lambda: initiate_root(root, settings_type='activation'),
39
+ "Recruitment": lambda: initiate_root(root, settings_type='recruitment')
40
+ }
41
+
42
+ # Create the menu bar
43
+ menu_bar = tk.Menu(root, bg="#008080", fg="white")
44
+
45
+ # Create a "SpaCr Applications" menu
46
+ app_menu = tk.Menu(menu_bar, tearoff=0, bg="#008080", fg="white")
47
+ menu_bar.add_cascade(label="SpaCr Applications", menu=app_menu)
48
+
49
+ # Add options to the "SpaCr Applications" menu
50
+ for app_name, app_func in gui_apps.items():
51
+ app_menu.add_command(
52
+ label=app_name,
53
+ command=app_func
54
+ )
55
+
56
+ # Add a separator and an exit option
57
+ app_menu.add_separator()
58
+ app_menu.add_command(label="Help", command=lambda: webbrowser.open("https://spacr.readthedocs.io/en/latest/?badge=latest"))
59
+ app_menu.add_command(label="Exit", command=root.quit)
60
+
61
+ # Configure the menu for the root window
62
+ root.config(menu=menu_bar)
63
+
23
64
  def set_element_size():
24
65
 
25
66
  screen_width, screen_height = pyautogui.size()
@@ -2122,7 +2163,7 @@ class ModifyMaskApp:
2122
2163
  self.update_display()
2123
2164
 
2124
2165
  class AnnotateApp:
2125
- def __init__(self, root, db_path, src, image_type=None, channels=None, image_size=200, annotation_column='annotate', normalize=False, percentiles=(1, 99), measurement=None, threshold=None):
2166
+ def __init__(self, root, db_path, src, image_type=None, channels=None, image_size=200, annotation_column='annotate', normalize=False, percentiles=(1, 99), measurement=None, threshold=None, normalize_channels=None):
2126
2167
  self.root = root
2127
2168
  self.db_path = db_path
2128
2169
  self.src = src
@@ -2148,7 +2189,8 @@ class AnnotateApp:
2148
2189
  self.update_queue = Queue()
2149
2190
  self.measurement = measurement
2150
2191
  self.threshold = threshold
2151
-
2192
+ self.normalize_channels = normalize_channels
2193
+ print('self.normalize_channels',self.normalize_channels)
2152
2194
  style_out = set_dark_style(ttk.Style())
2153
2195
  self.font_loader = style_out['font_loader']
2154
2196
  self.font_size = style_out['font_size']
@@ -2157,7 +2199,6 @@ class AnnotateApp:
2157
2199
  self.active_color = style_out['active_color']
2158
2200
  self.inactive_color = style_out['inactive_color']
2159
2201
 
2160
-
2161
2202
  if self.font_loader:
2162
2203
  self.font_style = self.font_loader.get_font(size=self.font_size)
2163
2204
  else:
@@ -2356,14 +2397,26 @@ class AnnotateApp:
2356
2397
  def load_single_image(self, path_annotation_tuple):
2357
2398
  path, annotation = path_annotation_tuple
2358
2399
  img = Image.open(path)
2359
- img = self.normalize_image(img, self.normalize, self.percentiles)
2400
+ img = self.normalize_image(img, self.normalize, self.percentiles, self.normalize_channels)
2360
2401
  img = img.convert('RGB')
2361
2402
  img = self.filter_channels(img)
2362
2403
  img = img.resize(self.image_size)
2363
2404
  return img, annotation
2364
-
2405
+
2365
2406
  @staticmethod
2366
- def normalize_image(img, normalize=False, percentiles=(1, 99)):
2407
+ def normalize_image(img, normalize=False, percentiles=(1, 99), normalize_channels=None):
2408
+ """
2409
+ Normalize an image based on specific channels (R, G, B).
2410
+
2411
+ Args:
2412
+ img (PIL.Image or np.array): Input image.
2413
+ normalize (bool): Whether to normalize the image or not.
2414
+ percentiles (tuple): Percentiles to use for intensity rescaling.
2415
+ normalize_channels (list): List of channels to normalize. E.g., ['r', 'g', 'b'], ['r'], ['g'], etc.
2416
+
2417
+ Returns:
2418
+ PIL.Image: Normalized image.
2419
+ """
2367
2420
  img_array = np.array(img)
2368
2421
 
2369
2422
  if normalize:
@@ -2371,13 +2424,23 @@ class AnnotateApp:
2371
2424
  p2, p98 = np.percentile(img_array, percentiles)
2372
2425
  img_array = rescale_intensity(img_array, in_range=(p2, p98), out_range=(0, 255))
2373
2426
  else: # Color image or multi-channel image
2374
- for channel in range(img_array.shape[2]):
2375
- p2, p98 = np.percentile(img_array[:, :, channel], percentiles)
2376
- img_array[:, :, channel] = rescale_intensity(img_array[:, :, channel], in_range=(p2, p98), out_range=(0, 255))
2427
+ # Create a map for the color channels
2428
+ channel_map = {'r': 0, 'g': 1, 'b': 2}
2429
+
2430
+ # If normalize_channels is not specified, normalize all channels
2431
+ if normalize_channels is None:
2432
+ normalize_channels = ['r', 'g', 'b']
2433
+
2434
+ for channel_name in normalize_channels:
2435
+ if channel_name in channel_map:
2436
+ channel_idx = channel_map[channel_name]
2437
+ p2, p98 = np.percentile(img_array[:, :, channel_idx], percentiles)
2438
+ img_array[:, :, channel_idx] = rescale_intensity(img_array[:, :, channel_idx], in_range=(p2, p98), out_range=(0, 255))
2377
2439
 
2378
2440
  img_array = np.clip(img_array, 0, 255).astype('uint8')
2379
2441
 
2380
2442
  return Image.fromarray(img_array)
2443
+
2381
2444
 
2382
2445
  def add_colored_border(self, img, border_width, border_color):
2383
2446
  top_border = Image.new('RGB', (img.width, border_width), color=border_color)
@@ -2505,46 +2568,6 @@ class AnnotateApp:
2505
2568
  else:
2506
2569
  print('Waiting for pending updates to finish before quitting')
2507
2570
 
2508
- def create_menu_bar(root):
2509
- from .gui import initiate_root
2510
- gui_apps = {
2511
- "Mask": lambda: initiate_root(root, settings_type='mask'),
2512
- "Measure": lambda: initiate_root(root, settings_type='measure'),
2513
- "Annotate": lambda: initiate_root(root, settings_type='annotate'),
2514
- "Make Masks": lambda: initiate_root(root, settings_type='make_masks'),
2515
- "Classify": lambda: initiate_root(root, settings_type='classify'),
2516
- "Umap": lambda: initiate_root(root, settings_type='umap'),
2517
- "Train Cellpose": lambda: initiate_root(root, settings_type='train_cellpose'),
2518
- "ML Analyze": lambda: initiate_root(root, settings_type='ml_analyze'),
2519
- "Cellpose Masks": lambda: initiate_root(root, settings_type='cellpose_masks'),
2520
- "Cellpose All": lambda: initiate_root(root, settings_type='cellpose_all'),
2521
- "Map Barcodes": lambda: initiate_root(root, settings_type='map_barcodes'),
2522
- "Regression": lambda: initiate_root(root, settings_type='regression'),
2523
- "Recruitment": lambda: initiate_root(root, settings_type='recruitment')
2524
- }
2525
-
2526
- # Create the menu bar
2527
- menu_bar = tk.Menu(root, bg="#008080", fg="white")
2528
-
2529
- # Create a "SpaCr Applications" menu
2530
- app_menu = tk.Menu(menu_bar, tearoff=0, bg="#008080", fg="white")
2531
- menu_bar.add_cascade(label="SpaCr Applications", menu=app_menu)
2532
-
2533
- # Add options to the "SpaCr Applications" menu
2534
- for app_name, app_func in gui_apps.items():
2535
- app_menu.add_command(
2536
- label=app_name,
2537
- command=app_func
2538
- )
2539
-
2540
- # Add a separator and an exit option
2541
- app_menu.add_separator()
2542
- app_menu.add_command(label="Help", command=lambda: webbrowser.open("https://spacr.readthedocs.io/en/latest/?badge=latest"))
2543
- app_menu.add_command(label="Exit", command=root.quit)
2544
-
2545
- # Configure the menu for the root window
2546
- root.config(menu=menu_bar)
2547
-
2548
2571
  def standardize_figure(fig):
2549
2572
  from .gui_elements import set_dark_style
2550
2573
  from matplotlib.font_manager import FontProperties
@@ -253,7 +253,7 @@ def annotate(settings):
253
253
 
254
254
  root = tk.Tk()
255
255
  root.geometry(settings['geom'])
256
- app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
256
+ app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'], normalize_channels=settings['normalize_channels'])
257
257
  next_button = tk.Button(root, text="Next", command=app.next_page)
258
258
  next_button.grid(row=app.grid_rows, column=app.grid_cols - 1)
259
259
  back_button = tk.Button(root, text="Back", command=app.previous_page)
@@ -284,7 +284,6 @@ def generate_annotate_fields(frame):
284
284
  # Arrange input fields and labels
285
285
  for row, (name, data) in enumerate(vars_dict.items()):
286
286
  tk.Label(frame, text=f"{name.replace('_', ' ').capitalize()}:", bg=style_out['bg_color'], fg=style_out['fg_color'], font=font_loader.get_font(size=font_size)).grid(row=row, column=0)
287
- #ttk.Label(frame, text=f"{name.replace('_', ' ').capitalize()}:", background="black", foreground="white").grid(row=row, column=0)
288
287
  if isinstance(data['value'], list):
289
288
  # Convert lists to comma-separated strings
290
289
  data['entry'].insert(0, ','.join(map(str, data['value'])))
@@ -300,6 +299,7 @@ def run_annotate_app(vars_dict, parent_frame):
300
299
  settings['img_size'] = list(map(int, settings['img_size'].split(','))) # Convert string to list of integers
301
300
  settings['percentiles'] = list(map(int, settings['percentiles'].split(','))) # Convert string to list of integers
302
301
  settings['normalize'] = settings['normalize'].lower() == 'true'
302
+ settings['normalize_channels'] = settings['channels'].split(',')
303
303
  settings['rows'] = int(settings['rows'])
304
304
  settings['columns'] = int(settings['columns'])
305
305
  settings['measurement'] = settings['measurement'].split(',')
@@ -341,46 +341,6 @@ def load_next_app(root):
341
341
  new_root.title("SpaCr Application")
342
342
  next_app_func(new_root, *next_app_args)
343
343
 
344
- def annotate_with_image_refs(settings, root, shutdown_callback):
345
- #from .gui_utils import proceed_with_app
346
- from .gui import gui_app
347
- from .settings import set_annotate_default_settings
348
-
349
- settings = set_annotate_default_settings(settings)
350
- src = settings['src']
351
-
352
- db = os.path.join(src, 'measurements/measurements.db')
353
- conn = sqlite3.connect(db)
354
- c = conn.cursor()
355
- c.execute('PRAGMA table_info(png_list)')
356
- cols = c.fetchall()
357
- if settings['annotation_column'] not in [col[1] for col in cols]:
358
- c.execute(f"ALTER TABLE png_list ADD COLUMN {settings['annotation_column']} integer")
359
- conn.commit()
360
- conn.close()
361
-
362
- app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], grid_rows=settings['rows'], grid_cols=settings['columns'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
363
-
364
- # Set the canvas background to black
365
- root.configure(bg='black')
366
-
367
- next_button = tk.Button(root, text="Next", command=app.next_page, background='black', foreground='white')
368
- next_button.grid(row=app.grid_rows, column=app.grid_cols - 1)
369
- back_button = tk.Button(root, text="Back", command=app.previous_page, background='black', foreground='white')
370
- back_button.grid(row=app.grid_rows, column=app.grid_cols - 2)
371
- exit_button = tk.Button(root, text="Exit", command=lambda: [app.shutdown(), shutdown_callback()], background='black', foreground='white')
372
- exit_button.grid(row=app.grid_rows, column=app.grid_cols - 3)
373
-
374
- #app.load_images()
375
-
376
- # Store the shutdown function and next app details in the root
377
- root.current_app_exit_func = lambda: [app.shutdown(), shutdown_callback()]
378
- root.next_app_func = proceed_with_app
379
- root.next_app_args = ("Main App", gui_app)
380
-
381
- # Call load_images after setting up the root window
382
- app.load_images()
383
-
384
344
  def annotate_with_image_refs(settings, root, shutdown_callback):
385
345
  from .settings import set_annotate_default_settings
386
346
 
@@ -401,7 +361,7 @@ def annotate_with_image_refs(settings, root, shutdown_callback):
401
361
  screen_height = root.winfo_screenheight()
402
362
  root.geometry(f"{screen_width}x{screen_height}")
403
363
 
404
- app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'])
364
+ app = AnnotateApp(root, db, src, image_type=settings['image_type'], channels=settings['channels'], image_size=settings['img_size'], annotation_column=settings['annotation_column'], normalize=settings['normalize'], percentiles=settings['percentiles'], measurement=settings['measurement'], threshold=settings['threshold'], normalize_channels=settings['normalize_channels'])
405
365
 
406
366
  # Set the canvas background to black
407
367
  root.configure(bg='black')
@@ -1065,4 +1025,21 @@ def get_screen_dimensions():
1065
1025
  monitor = get_monitors()[0] # Get the primary monitor
1066
1026
  screen_width = monitor.width
1067
1027
  screen_height = monitor.height
1068
- return screen_width, screen_height
1028
+ return screen_width, screen_height
1029
+
1030
+ def convert_to_number(value):
1031
+
1032
+ """
1033
+ Converts a string value to an integer if possible, otherwise converts to a float.
1034
+ Args:
1035
+ value (str): The string representation of the number.
1036
+ Returns:
1037
+ int or float: The converted number.
1038
+ """
1039
+ try:
1040
+ return int(value)
1041
+ except ValueError:
1042
+ try:
1043
+ return float(value)
1044
+ except ValueError:
1045
+ raise ValueError(f"Unable to convert '{value}' to an integer or float.")
@@ -1020,8 +1020,6 @@ def _plot_recruitment_v2(df, df_type, channel_of_interest, columns=[], figuresiz
1020
1020
  None
1021
1021
  """
1022
1022
 
1023
- from .plot import spacrGraph
1024
-
1025
1023
  color_list = [(55/255, 155/255, 155/255),
1026
1024
  (155/255, 55/255, 155/255),
1027
1025
  (55/255, 155/255, 255/255),
@@ -1315,6 +1315,7 @@ def set_annotate_default_settings(settings):
1315
1315
  settings.setdefault('img_size', 200)
1316
1316
  settings.setdefault('annotation_column', 'test')
1317
1317
  settings.setdefault('normalize', 'False')
1318
+ settings.setdefault('normalize_channels', "r,g,b")
1318
1319
  settings.setdefault('percentiles', [2, 98])
1319
1320
  settings.setdefault('measurement', '')#'cytoplasm_channel_3_mean_intensity,pathogen_channel_3_mean_intensity')
1320
1321
  settings.setdefault('threshold', '')#'2')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.30
3
+ Version: 0.3.32
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes