spacr 0.9.2__tar.gz → 0.9.3__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 (375) hide show
  1. {spacr-0.9.2 → spacr-0.9.3}/LICENSE +1 -1
  2. {spacr-0.9.2 → spacr-0.9.3}/MANIFEST.in +2 -8
  3. {spacr-0.9.2/spacr.egg-info → spacr-0.9.3}/PKG-INFO +26 -12
  4. {spacr-0.9.2 → spacr-0.9.3}/README.rst +25 -11
  5. {spacr-0.9.2 → spacr-0.9.3}/setup.py +1 -1
  6. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_annotate.py +4 -0
  7. {spacr-0.9.2 → spacr-0.9.3}/spacr/gui_core.py +2 -2
  8. {spacr-0.9.2 → spacr-0.9.3}/spacr/gui_elements.py +79 -10
  9. {spacr-0.9.2 → spacr-0.9.3}/spacr/gui_utils.py +44 -2
  10. {spacr-0.9.2 → spacr-0.9.3}/spacr/measure.py +6 -75
  11. {spacr-0.9.2 → spacr-0.9.3}/spacr/plot.py +1 -1
  12. spacr-0.9.3/spacr/resources/icons/flow_chart_v3.png +0 -0
  13. {spacr-0.9.2 → spacr-0.9.3}/spacr/settings.py +5 -2
  14. {spacr-0.9.2 → spacr-0.9.3/spacr.egg-info}/PKG-INFO +26 -12
  15. {spacr-0.9.2 → spacr-0.9.3}/spacr.egg-info/SOURCES.txt +2 -6
  16. spacr-0.9.2/spacr/resources/icons/dna_matrix.mp4 +0 -0
  17. spacr-0.9.2/spacr/resources/icons/flow_chart_v2.png +0 -0
  18. spacr-0.9.2/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  19. spacr-0.9.2/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  20. spacr-0.9.2/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  21. {spacr-0.9.2 → spacr-0.9.3}/deploy_docs.sh +0 -0
  22. {spacr-0.9.2 → spacr-0.9.3}/docs/.doctrees/environment.pickle +0 -0
  23. {spacr-0.9.2 → spacr-0.9.3}/docs/_images/logo_spacr.png +0 -0
  24. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/SetupDict.html +0 -0
  25. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/BasePredictor.html +0 -0
  26. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/BaseTrainer.html +0 -0
  27. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/Baseline/Predictor.html +0 -0
  28. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/Baseline/Trainer.html +0 -0
  29. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/Baseline/utils.html +0 -0
  30. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/MEDIAR/EnsemblePredictor.html +0 -0
  31. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/MEDIAR/Predictor.html +0 -0
  32. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/MEDIAR/Trainer.html +0 -0
  33. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/MEDIAR/utils.html +0 -0
  34. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/core/utils.html +0 -0
  35. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/evaluate.html +0 -0
  36. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/generate_mapping.html +0 -0
  37. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/index.html +0 -0
  38. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/main.html +0 -0
  39. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/predict.html +0 -0
  40. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_annotate.html +0 -0
  41. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_classify.html +0 -0
  42. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_make_masks.html +0 -0
  43. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_mask.html +0 -0
  44. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_measure.html +0 -0
  45. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_sequencing.html +0 -0
  46. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/app_umap.html +0 -0
  47. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/chat_bot.html +0 -0
  48. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/core.html +0 -0
  49. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/deep_spacr.html +0 -0
  50. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/gui.html +0 -0
  51. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/gui_core.html +0 -0
  52. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/gui_elements.html +0 -0
  53. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/gui_utils.html +0 -0
  54. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/io.html +0 -0
  55. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/logger.html +0 -0
  56. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/measure.html +0 -0
  57. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/mediar.html +0 -0
  58. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/ml.html +0 -0
  59. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/plot.html +0 -0
  60. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/sequencing.html +0 -0
  61. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/settings.html +0 -0
  62. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/sim.html +0 -0
  63. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/sp_stats.html +0 -0
  64. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/spacr_cellpose.html +0 -0
  65. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/submodules.html +0 -0
  66. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/timelapse.html +0 -0
  67. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/toxo.html +0 -0
  68. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/utils.html +0 -0
  69. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/spacr/version.html +0 -0
  70. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/CellAware.html +0 -0
  71. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/LoadImage.html +0 -0
  72. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/NormalizeImage.html +0 -0
  73. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/datasetter.html +0 -0
  74. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/transforms.html +0 -0
  75. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/utils.html +0 -0
  76. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/measures.html +0 -0
  77. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/models/MEDIARFormer.html +0 -0
  78. {spacr-0.9.2 → spacr-0.9.3}/docs/_modules/train_tools/utils.html +0 -0
  79. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/SetupDict/index.rst.txt +0 -0
  80. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/BasePredictor/index.rst.txt +0 -0
  81. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/BaseTrainer/index.rst.txt +0 -0
  82. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/Baseline/Predictor/index.rst.txt +0 -0
  83. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/Baseline/Trainer/index.rst.txt +0 -0
  84. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/Baseline/index.rst.txt +0 -0
  85. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/Baseline/utils/index.rst.txt +0 -0
  86. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/EnsemblePredictor/index.rst.txt +0 -0
  87. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/Predictor/index.rst.txt +0 -0
  88. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/Trainer/index.rst.txt +0 -0
  89. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/index.rst.txt +0 -0
  90. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/utils/index.rst.txt +0 -0
  91. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/index.rst.txt +0 -0
  92. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/core/utils/index.rst.txt +0 -0
  93. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/evaluate/index.rst.txt +0 -0
  94. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/generate_mapping/index.rst.txt +0 -0
  95. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/index.rst.txt +0 -0
  96. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/main/index.rst.txt +0 -0
  97. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/predict/index.rst.txt +0 -0
  98. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_annotate/index.rst.txt +0 -0
  99. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_classify/index.rst.txt +0 -0
  100. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_make_masks/index.rst.txt +0 -0
  101. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_mask/index.rst.txt +0 -0
  102. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_measure/index.rst.txt +0 -0
  103. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_sequencing/index.rst.txt +0 -0
  104. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/app_umap/index.rst.txt +0 -0
  105. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/chat_bot/index.rst.txt +0 -0
  106. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/core/index.rst.txt +0 -0
  107. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/deep_spacr/index.rst.txt +0 -0
  108. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/gui/index.rst.txt +0 -0
  109. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/gui_core/index.rst.txt +0 -0
  110. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/gui_elements/index.rst.txt +0 -0
  111. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/gui_utils/index.rst.txt +0 -0
  112. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/index.rst.txt +0 -0
  113. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/io/index.rst.txt +0 -0
  114. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/logger/index.rst.txt +0 -0
  115. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/measure/index.rst.txt +0 -0
  116. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/mediar/index.rst.txt +0 -0
  117. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/ml/index.rst.txt +0 -0
  118. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/openai/index.rst.txt +0 -0
  119. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/plot/index.rst.txt +0 -0
  120. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/sequencing/index.rst.txt +0 -0
  121. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/settings/index.rst.txt +0 -0
  122. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/sim/index.rst.txt +0 -0
  123. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/sp_stats/index.rst.txt +0 -0
  124. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/spacr_cellpose/index.rst.txt +0 -0
  125. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/submodules/index.rst.txt +0 -0
  126. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/timelapse/index.rst.txt +0 -0
  127. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/toxo/index.rst.txt +0 -0
  128. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/utils/index.rst.txt +0 -0
  129. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/spacr/version/index.rst.txt +0 -0
  130. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/CellAware/index.rst.txt +0 -0
  131. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/LoadImage/index.rst.txt +0 -0
  132. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/NormalizeImage/index.rst.txt +0 -0
  133. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/index.rst.txt +0 -0
  134. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/datasetter/index.rst.txt +0 -0
  135. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/index.rst.txt +0 -0
  136. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/transforms/index.rst.txt +0 -0
  137. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/utils/index.rst.txt +0 -0
  138. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/index.rst.txt +0 -0
  139. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/measures/index.rst.txt +0 -0
  140. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/models/MEDIARFormer/index.rst.txt +0 -0
  141. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/models/index.rst.txt +0 -0
  142. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/api/train_tools/utils/index.rst.txt +0 -0
  143. {spacr-0.9.2 → spacr-0.9.3}/docs/_sources/index.rst.txt +0 -0
  144. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/basic.css +0 -0
  145. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/badge_only.css +0 -0
  146. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  147. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  148. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  149. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  150. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.eot +0 -0
  151. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.svg +0 -0
  152. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  153. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.woff +0 -0
  154. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  155. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold-italic.woff +0 -0
  156. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  157. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold.woff +0 -0
  158. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold.woff2 +0 -0
  159. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal-italic.woff +0 -0
  160. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  161. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal.woff +0 -0
  162. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal.woff2 +0 -0
  163. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/css/theme.css +0 -0
  164. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/doctools.js +0 -0
  165. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/documentation_options.js +0 -0
  166. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/file.png +0 -0
  167. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.eot +0 -0
  168. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.ttf +0 -0
  169. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.woff +0 -0
  170. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.woff2 +0 -0
  171. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  172. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  173. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  174. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  175. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.eot +0 -0
  176. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.ttf +0 -0
  177. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.woff +0 -0
  178. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.woff2 +0 -0
  179. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.eot +0 -0
  180. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.ttf +0 -0
  181. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.woff +0 -0
  182. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.woff2 +0 -0
  183. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  184. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  185. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  186. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  187. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  188. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  189. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  190. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  191. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/graphviz.css +0 -0
  192. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/js/badge_only.js +0 -0
  193. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/js/theme.js +0 -0
  194. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/js/versions.js +0 -0
  195. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/language_data.js +0 -0
  196. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/logo_spacr.png +0 -0
  197. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/minus.png +0 -0
  198. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/plus.png +0 -0
  199. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/pygments.css +0 -0
  200. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/searchtools.js +0 -0
  201. {spacr-0.9.2 → spacr-0.9.3}/docs/_static/sphinx_highlight.js +0 -0
  202. {spacr-0.9.2 → spacr-0.9.3}/docs/api/SetupDict/index.html +0 -0
  203. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/BasePredictor/index.html +0 -0
  204. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/BaseTrainer/index.html +0 -0
  205. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/Baseline/Predictor/index.html +0 -0
  206. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/Baseline/Trainer/index.html +0 -0
  207. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/Baseline/index.html +0 -0
  208. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/Baseline/utils/index.html +0 -0
  209. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/MEDIAR/EnsemblePredictor/index.html +0 -0
  210. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/MEDIAR/Predictor/index.html +0 -0
  211. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/MEDIAR/Trainer/index.html +0 -0
  212. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/MEDIAR/index.html +0 -0
  213. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/MEDIAR/utils/index.html +0 -0
  214. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/index.html +0 -0
  215. {spacr-0.9.2 → spacr-0.9.3}/docs/api/core/utils/index.html +0 -0
  216. {spacr-0.9.2 → spacr-0.9.3}/docs/api/evaluate/index.html +0 -0
  217. {spacr-0.9.2 → spacr-0.9.3}/docs/api/generate_mapping/index.html +0 -0
  218. {spacr-0.9.2 → spacr-0.9.3}/docs/api/index.html +0 -0
  219. {spacr-0.9.2 → spacr-0.9.3}/docs/api/main/index.html +0 -0
  220. {spacr-0.9.2 → spacr-0.9.3}/docs/api/predict/index.html +0 -0
  221. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_annotate/index.html +0 -0
  222. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_classify/index.html +0 -0
  223. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_make_masks/index.html +0 -0
  224. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_mask/index.html +0 -0
  225. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_measure/index.html +0 -0
  226. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_sequencing/index.html +0 -0
  227. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/app_umap/index.html +0 -0
  228. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/chat_bot/index.html +0 -0
  229. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/core/index.html +0 -0
  230. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/deep_spacr/index.html +0 -0
  231. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/gui/index.html +0 -0
  232. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/gui_core/index.html +0 -0
  233. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/gui_elements/index.html +0 -0
  234. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/gui_utils/index.html +0 -0
  235. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/index.html +0 -0
  236. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/io/index.html +0 -0
  237. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/logger/index.html +0 -0
  238. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/measure/index.html +0 -0
  239. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/mediar/index.html +0 -0
  240. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/ml/index.html +0 -0
  241. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/openai/index.html +0 -0
  242. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/plot/index.html +0 -0
  243. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/sequencing/index.html +0 -0
  244. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/settings/index.html +0 -0
  245. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/sim/index.html +0 -0
  246. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/sp_stats/index.html +0 -0
  247. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/spacr_cellpose/index.html +0 -0
  248. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/submodules/index.html +0 -0
  249. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/timelapse/index.html +0 -0
  250. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/toxo/index.html +0 -0
  251. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/utils/index.html +0 -0
  252. {spacr-0.9.2 → spacr-0.9.3}/docs/api/spacr/version/index.html +0 -0
  253. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/CellAware/index.html +0 -0
  254. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/LoadImage/index.html +0 -0
  255. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/NormalizeImage/index.html +0 -0
  256. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/index.html +0 -0
  257. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/datasetter/index.html +0 -0
  258. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/index.html +0 -0
  259. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/transforms/index.html +0 -0
  260. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/data_utils/utils/index.html +0 -0
  261. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/index.html +0 -0
  262. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/measures/index.html +0 -0
  263. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/models/MEDIARFormer/index.html +0 -0
  264. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/models/index.html +0 -0
  265. {spacr-0.9.2 → spacr-0.9.3}/docs/api/train_tools/utils/index.html +0 -0
  266. {spacr-0.9.2 → spacr-0.9.3}/docs/genindex.html +0 -0
  267. {spacr-0.9.2 → spacr-0.9.3}/docs/index.html +0 -0
  268. {spacr-0.9.2 → spacr-0.9.3}/docs/objects.inv +0 -0
  269. {spacr-0.9.2 → spacr-0.9.3}/docs/py-modindex.html +0 -0
  270. {spacr-0.9.2 → spacr-0.9.3}/docs/search.html +0 -0
  271. {spacr-0.9.2 → spacr-0.9.3}/docs/searchindex.js +0 -0
  272. {spacr-0.9.2 → spacr-0.9.3}/docs/source/_static/custom.css +0 -0
  273. {spacr-0.9.2 → spacr-0.9.3}/docs/source/_static/logo_spacr.png +0 -0
  274. {spacr-0.9.2 → spacr-0.9.3}/docs/source/conf.py +0 -0
  275. {spacr-0.9.2 → spacr-0.9.3}/docs/source/index.rst +0 -0
  276. {spacr-0.9.2 → spacr-0.9.3}/environment.yaml +0 -0
  277. {spacr-0.9.2 → spacr-0.9.3}/fonts/OpenSans-Regular.ttf +0 -0
  278. {spacr-0.9.2 → spacr-0.9.3}/requirements.txt +0 -0
  279. {spacr-0.9.2 → spacr-0.9.3}/rtd_trigger.txt +0 -0
  280. {spacr-0.9.2 → spacr-0.9.3}/setup.cfg +0 -0
  281. {spacr-0.9.2 → spacr-0.9.3}/setup_docs.sh +0 -0
  282. {spacr-0.9.2 → spacr-0.9.3}/spacr/__init__.py +0 -0
  283. {spacr-0.9.2 → spacr-0.9.3}/spacr/__main__.py +0 -0
  284. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_classify.py +0 -0
  285. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_make_masks.py +0 -0
  286. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_mask.py +0 -0
  287. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_measure.py +0 -0
  288. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_sequencing.py +0 -0
  289. {spacr-0.9.2 → spacr-0.9.3}/spacr/app_umap.py +0 -0
  290. {spacr-0.9.2 → spacr-0.9.3}/spacr/chat_bot.py +0 -0
  291. {spacr-0.9.2 → spacr-0.9.3}/spacr/core.py +0 -0
  292. {spacr-0.9.2 → spacr-0.9.3}/spacr/deep_spacr.py +0 -0
  293. {spacr-0.9.2 → spacr-0.9.3}/spacr/gui.py +0 -0
  294. {spacr-0.9.2 → spacr-0.9.3}/spacr/io.py +0 -0
  295. {spacr-0.9.2 → spacr-0.9.3}/spacr/logger.py +0 -0
  296. {spacr-0.9.2 → spacr-0.9.3}/spacr/ml.py +0 -0
  297. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/data/lopit.csv +0 -0
  298. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  299. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/OFL.txt +0 -0
  300. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  301. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  302. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/README.txt +0 -0
  303. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  304. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  305. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  306. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  307. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  308. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  309. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  310. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  311. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  312. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  313. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  314. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  315. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  316. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  317. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  318. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  319. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  320. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  321. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  322. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  323. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  324. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  325. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  326. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  327. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  328. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  329. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  330. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  331. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  332. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  333. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  334. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  335. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  336. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  337. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  338. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  339. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/abort.png +0 -0
  340. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/annotate.png +0 -0
  341. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/cellpose_all.png +0 -0
  342. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/cellpose_masks.png +0 -0
  343. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/classify.png +0 -0
  344. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/convert.png +0 -0
  345. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/default.png +0 -0
  346. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/download.png +0 -0
  347. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/logo.pdf +0 -0
  348. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/logo_spacr.png +0 -0
  349. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/logo_spacr_1.png +0 -0
  350. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/make_masks.png +0 -0
  351. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/map_barcodes.png +0 -0
  352. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/mask.png +0 -0
  353. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/measure.png +0 -0
  354. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/ml_analyze.png +0 -0
  355. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/plaque.png +0 -0
  356. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/recruitment.png +0 -0
  357. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/regression.png +0 -0
  358. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/run.png +0 -0
  359. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/sequencing.png +0 -0
  360. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/settings.png +0 -0
  361. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/train_cellpose.png +0 -0
  362. {spacr-0.9.2 → spacr-0.9.3}/spacr/resources/icons/umap.png +0 -0
  363. {spacr-0.9.2 → spacr-0.9.3}/spacr/sequencing.py +0 -0
  364. {spacr-0.9.2 → spacr-0.9.3}/spacr/sim.py +0 -0
  365. {spacr-0.9.2 → spacr-0.9.3}/spacr/sp_stats.py +0 -0
  366. {spacr-0.9.2 → spacr-0.9.3}/spacr/spacr_cellpose.py +0 -0
  367. {spacr-0.9.2 → spacr-0.9.3}/spacr/submodules.py +0 -0
  368. {spacr-0.9.2 → spacr-0.9.3}/spacr/timelapse.py +0 -0
  369. {spacr-0.9.2 → spacr-0.9.3}/spacr/toxo.py +0 -0
  370. {spacr-0.9.2 → spacr-0.9.3}/spacr/utils.py +0 -0
  371. {spacr-0.9.2 → spacr-0.9.3}/spacr/version.py +0 -0
  372. {spacr-0.9.2 → spacr-0.9.3}/spacr.egg-info/dependency_links.txt +0 -0
  373. {spacr-0.9.2 → spacr-0.9.3}/spacr.egg-info/entry_points.txt +0 -0
  374. {spacr-0.9.2 → spacr-0.9.3}/spacr.egg-info/requires.txt +0 -0
  375. {spacr-0.9.2 → spacr-0.9.3}/spacr.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) <year> Adam Veldhousen
3
+ Copyright (c) 2025 Adam Veldhousen
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,8 +1,6 @@
1
1
  recursive-include spacr/resources/models/cp *
2
2
  recursive-include spacr/resources/icons *
3
3
  recursive-include spacr/resources/font *
4
- recursive-include spacr/resources/MEDIAR *
5
- recursive-include spacr/resources/MEDIAR_weights *
6
4
 
7
5
  # Include essential files
8
6
  include *.py
@@ -31,14 +29,10 @@ global-exclude docs-env/
31
29
 
32
30
  # Exclude model files from distribution
33
31
  exclude spacr/resources/models/cp/*
34
- prune notebooks
35
- prune spacr/notebooks
32
+ prune Notebooks
33
+ prune spacr/Notebooks
36
34
  prune spacr/datasets
37
35
 
38
- # Exclude model files from distribution
39
- #exclude spacr/resources/models/cp/*
40
- #prune spacr/resources/models/cp
41
-
42
36
  # Exclude all notebooks (including old ones)
43
37
  prune notebooks
44
38
  prune spacr/notebooks
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.9.2
3
+ Version: 0.9.3
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
@@ -86,8 +86,8 @@ Requires-Dist: opencv-python; extra == "full"
86
86
  :target: https://badge.fury.io/py/spacr
87
87
  .. |Python version| image:: https://img.shields.io/pypi/pyversions/spacr
88
88
  :target: https://pypistats.org/packages/spacr
89
- .. |Licence: GPL v3| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
90
- :target: https://github.com/EinarOlafsson/spacr/blob/master/LICENSE
89
+ .. |Licence: MIT| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
90
+ :target: https://github.com/EinarOlafsson/spacr/blob/main/LICENSE
91
91
  .. |repo size| image:: https://img.shields.io/github/repo-size/EinarOlafsson/spacr
92
92
  :target: https://github.com/EinarOlafsson/spacr/
93
93
 
@@ -95,7 +95,7 @@ Requires-Dist: opencv-python; extra == "full"
95
95
 
96
96
  Badges
97
97
  ------
98
- |Docs| |PyPI version| |Python version| |Licence: GPL v3| |repo size|
98
+ |Docs| |PyPI version| |Python version| |Licence: MIT| |repo size|
99
99
 
100
100
  SpaCr
101
101
  =====
@@ -118,7 +118,7 @@ Features
118
118
  - **Sequencing:** Map FASTQ reads to barcode and gRNA barcode metadata.
119
119
  - **Misc:** Analyze Ca oscillation, recruitment, infection rate, plaque size/count.
120
120
 
121
- .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v2.png
121
+ .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v3.png
122
122
  :alt: SpaCr workflow
123
123
  :align: center
124
124
 
@@ -167,27 +167,41 @@ Data Availability
167
167
 
168
168
  - **Raw sequencing data** are available from NCBI BioProject `PRJNA1261935 <https://www.ncbi.nlm.nih.gov/bioproject/PRJNA1261935>`_ and SRA accessions: `SRR33531217 <https://www.ncbi.nlm.nih.gov/sra/SRR33531217>`_, `SRR33531218 <https://www.ncbi.nlm.nih.gov/sra/SRR33531218>`_, `SRR33531219 <https://www.ncbi.nlm.nih.gov/sra/SRR33531219>`_, `SRR33531220 <https://www.ncbi.nlm.nih.gov/sra/SRR33531220>`_
169
169
 
170
- - **Image data** is deposited at EBI BioStudies under accession: `S-BIAD2076 <https://www.ebi.ac.uk/biostudies/studies/S-BIAD2076>`_
170
+ - **Image data** is deposited at EBI BioStudies under accession:
171
+ `S-BIAD2076 <https://www.ebi.ac.uk/biostudies/studies/S-BIAD2076>`_
172
+ *(If the link redirects to the main BioStudies portal, copy and paste it directly into your browser.)*
173
+
171
174
 
172
175
  Example Notebooks
173
176
  -----------------
174
177
 
175
178
  The following example Jupyter notebooks illustrate common workflows using spaCR.
176
179
 
177
- - `1_spacr_generate_masks.ipynb <Notebooks/1_spacr_generate_masks.ipynb>`_
180
+ - `Generate masks <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/1_spacr_generate_masks.ipynb>`_
178
181
  *Generate cell, nuclei, and pathogen segmentation masks from microscopy images using Cellpose.*
179
182
 
180
- - `2_spacr_generate_mesurments_crop_images.ipynb <Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
183
+ - `Capture single cell images and measurements <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
181
184
  *Extract object-level measurements and crop single-cell images for downstream analysis.*
182
185
 
183
- - `3a_spacr_machine_learning.ipynb <Notebooks/3a_spacr_machine_learning.ipynb>`_
186
+ - `Machine learning based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3a_spacr_machine_learning.ipynb>`_
184
187
  *Train traditional machine learning models (e.g., XGBoost) to classify cell phenotypes based on extracted features.*
185
188
 
186
- - `3b_spacr_computer_vision.ipynb <Notebooks/3b_spacr_computer_vision.ipynb>`_
189
+ - `Computer vision based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3b_spacr_computer_vision.ipynb>`_
187
190
  *Train and evaluate deep learning models (PyTorch CNNs/Transformers) on cropped object images.*
188
191
 
189
- - `4_spacr_map_barecodes.ipynb <Notebooks/4_spacr_map_barecodes.ipynb>`_
192
+ - `Map sequencing barcodes <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/4_spacr_map_barecodes.ipynb>`_
190
193
  *Map sequencing reads to row, column, and gRNA barcodes for CRISPR screen genotype-phenotype mapping.*
191
194
 
192
- - `5_spacr_train_cellpose.ipynb <Notebooks/5_spacr_train_cellpose.ipynb>`_
195
+ - `Finetune cellpose models <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/5_spacr_train_cellpose.ipynb>`_
193
196
  *Finetune Cellpose models using your own annotated training data for improved segmentation accuracy.*
197
+
198
+ License
199
+ -------
200
+ spaCR is distributed under the terms of the MIT License.
201
+ See the `LICENSE <https://github.com/EinarOlafsson/spacr/blob/main/LICENSE>`_ file for details.
202
+
203
+ How to Cite
204
+ -----------
205
+ If you use spaCR in your research, please cite:
206
+ Olafsson EB, et al. SpaCr: Spatial phenotype analysis of CRISPR-Cas9 screens. *Manuscript in preparation*.
207
+
@@ -4,8 +4,8 @@
4
4
  :target: https://badge.fury.io/py/spacr
5
5
  .. |Python version| image:: https://img.shields.io/pypi/pyversions/spacr
6
6
  :target: https://pypistats.org/packages/spacr
7
- .. |Licence: GPL v3| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
8
- :target: https://github.com/EinarOlafsson/spacr/blob/master/LICENSE
7
+ .. |Licence: MIT| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
8
+ :target: https://github.com/EinarOlafsson/spacr/blob/main/LICENSE
9
9
  .. |repo size| image:: https://img.shields.io/github/repo-size/EinarOlafsson/spacr
10
10
  :target: https://github.com/EinarOlafsson/spacr/
11
11
 
@@ -13,7 +13,7 @@
13
13
 
14
14
  Badges
15
15
  ------
16
- |Docs| |PyPI version| |Python version| |Licence: GPL v3| |repo size|
16
+ |Docs| |PyPI version| |Python version| |Licence: MIT| |repo size|
17
17
 
18
18
  SpaCr
19
19
  =====
@@ -36,7 +36,7 @@ Features
36
36
  - **Sequencing:** Map FASTQ reads to barcode and gRNA barcode metadata.
37
37
  - **Misc:** Analyze Ca oscillation, recruitment, infection rate, plaque size/count.
38
38
 
39
- .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v2.png
39
+ .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v3.png
40
40
  :alt: SpaCr workflow
41
41
  :align: center
42
42
 
@@ -85,27 +85,41 @@ Data Availability
85
85
 
86
86
  - **Raw sequencing data** are available from NCBI BioProject `PRJNA1261935 <https://www.ncbi.nlm.nih.gov/bioproject/PRJNA1261935>`_ and SRA accessions: `SRR33531217 <https://www.ncbi.nlm.nih.gov/sra/SRR33531217>`_, `SRR33531218 <https://www.ncbi.nlm.nih.gov/sra/SRR33531218>`_, `SRR33531219 <https://www.ncbi.nlm.nih.gov/sra/SRR33531219>`_, `SRR33531220 <https://www.ncbi.nlm.nih.gov/sra/SRR33531220>`_
87
87
 
88
- - **Image data** is deposited at EBI BioStudies under accession: `S-BIAD2076 <https://www.ebi.ac.uk/biostudies/studies/S-BIAD2076>`_
88
+ - **Image data** is deposited at EBI BioStudies under accession:
89
+ `S-BIAD2076 <https://www.ebi.ac.uk/biostudies/studies/S-BIAD2076>`_
90
+ *(If the link redirects to the main BioStudies portal, copy and paste it directly into your browser.)*
91
+
89
92
 
90
93
  Example Notebooks
91
94
  -----------------
92
95
 
93
96
  The following example Jupyter notebooks illustrate common workflows using spaCR.
94
97
 
95
- - `1_spacr_generate_masks.ipynb <Notebooks/1_spacr_generate_masks.ipynb>`_
98
+ - `Generate masks <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/1_spacr_generate_masks.ipynb>`_
96
99
  *Generate cell, nuclei, and pathogen segmentation masks from microscopy images using Cellpose.*
97
100
 
98
- - `2_spacr_generate_mesurments_crop_images.ipynb <Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
101
+ - `Capture single cell images and measurements <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
99
102
  *Extract object-level measurements and crop single-cell images for downstream analysis.*
100
103
 
101
- - `3a_spacr_machine_learning.ipynb <Notebooks/3a_spacr_machine_learning.ipynb>`_
104
+ - `Machine learning based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3a_spacr_machine_learning.ipynb>`_
102
105
  *Train traditional machine learning models (e.g., XGBoost) to classify cell phenotypes based on extracted features.*
103
106
 
104
- - `3b_spacr_computer_vision.ipynb <Notebooks/3b_spacr_computer_vision.ipynb>`_
107
+ - `Computer vision based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3b_spacr_computer_vision.ipynb>`_
105
108
  *Train and evaluate deep learning models (PyTorch CNNs/Transformers) on cropped object images.*
106
109
 
107
- - `4_spacr_map_barecodes.ipynb <Notebooks/4_spacr_map_barecodes.ipynb>`_
110
+ - `Map sequencing barcodes <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/4_spacr_map_barecodes.ipynb>`_
108
111
  *Map sequencing reads to row, column, and gRNA barcodes for CRISPR screen genotype-phenotype mapping.*
109
112
 
110
- - `5_spacr_train_cellpose.ipynb <Notebooks/5_spacr_train_cellpose.ipynb>`_
113
+ - `Finetune cellpose models <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/5_spacr_train_cellpose.ipynb>`_
111
114
  *Finetune Cellpose models using your own annotated training data for improved segmentation accuracy.*
115
+
116
+ License
117
+ -------
118
+ spaCR is distributed under the terms of the MIT License.
119
+ See the `LICENSE <https://github.com/EinarOlafsson/spacr/blob/main/LICENSE>`_ file for details.
120
+
121
+ How to Cite
122
+ -----------
123
+ If you use spaCR in your research, please cite:
124
+ Olafsson EB, et al. SpaCr: Spatial phenotype analysis of CRISPR-Cas9 screens. *Manuscript in preparation*.
125
+
@@ -71,7 +71,7 @@ dependencies = [
71
71
  'huggingface-hub>=0.24.0,<0.25'
72
72
  ]
73
73
 
74
- VERSION = "0.9.2"
74
+ VERSION = "0.9.3"
75
75
 
76
76
  setup(
77
77
  name="spacr",
@@ -30,6 +30,10 @@ def initiate_annotation_app(parent_frame):
30
30
  settings['percentiles'] = list(map(convert_to_number, settings['percentiles'].split(','))) if settings['percentiles'] else [2, 98]
31
31
  settings['normalize'] = settings['normalize'].lower() == 'true'
32
32
  settings['normalize_channels'] = settings['normalize_channels'].split(',')
33
+ settings['outline'] = settings['outline'].split(',') if settings['outline'] else None
34
+ settings['outline_threshold_factor'] = float(settings['outline_threshold_factor']) if settings['outline_threshold_factor'] else 1.0
35
+ settings['outline_sigma'] = float(settings['outline_threshold_factor']) if settings['outline_threshold_factor'] else 1.0
36
+
33
37
  try:
34
38
  settings['measurement'] = settings['measurement'].split(',') if settings['measurement'] else None
35
39
  settings['threshold'] = None if settings['threshold'].lower() == 'none' else int(settings['threshold'])
@@ -361,8 +361,8 @@ def setup_plot_section(vertical_container, settings_type):
361
361
  if settings_type == 'map_barcodes':
362
362
  current_dir = os.path.dirname(__file__)
363
363
  resources_path = os.path.join(current_dir, 'resources', 'icons')
364
- gif_path = os.path.join(resources_path, 'dna_matrix.mp4')
365
- display_media_in_plot_frame(gif_path, plot_frame)
364
+ #gif_path = os.path.join(resources_path, 'dna_matrix.mp4')
365
+ #display_media_in_plot_frame(gif_path, plot_frame)
366
366
 
367
367
  canvas = FigureCanvasTkAgg(figure, master=plot_frame)
368
368
  canvas.get_tk_widget().configure(cursor='arrow', highlightthickness=0)
@@ -10,18 +10,23 @@ import numpy as np
10
10
  import pandas as pd
11
11
  from PIL import Image, ImageOps, ImageTk, ImageDraw, ImageFont, ImageEnhance
12
12
  from concurrent.futures import ThreadPoolExecutor
13
- from skimage.exposure import rescale_intensity
14
13
  from IPython.display import display, HTML
15
14
  import imageio.v2 as imageio
16
15
  from collections import deque
16
+ from skimage.filters import threshold_otsu
17
+ from skimage.exposure import rescale_intensity
17
18
  from skimage.draw import polygon, line
18
19
  from skimage.transform import resize
19
- from scipy.ndimage import binary_fill_holes, label
20
+ from skimage.morphology import dilation, disk
21
+ from skimage.segmentation import find_boundaries
22
+ from skimage.util import img_as_ubyte
23
+ from scipy.ndimage import binary_fill_holes, label, gaussian_filter
20
24
  from tkinter import ttk, scrolledtext
21
25
  from sklearn.model_selection import train_test_split
22
26
  from xgboost import XGBClassifier
23
27
  from sklearn.metrics import classification_report, confusion_matrix
24
28
 
29
+
25
30
  fig = None
26
31
 
27
32
  def restart_gui_app(root):
@@ -2209,7 +2214,7 @@ class ModifyMaskApp:
2209
2214
  self.update_display()
2210
2215
 
2211
2216
  class AnnotateApp:
2212
- 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):
2217
+ 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, outline=None, outline_threshold_factor=1, outline_sigma=1):
2213
2218
  self.root = root
2214
2219
  self.db_path = db_path
2215
2220
  self.src = src
@@ -2237,7 +2242,10 @@ class AnnotateApp:
2237
2242
  self.measurement = measurement
2238
2243
  self.threshold = threshold
2239
2244
  self.normalize_channels = normalize_channels
2240
- print('self.normalize_channels',self.normalize_channels)
2245
+ self.outline = outline #([s.strip().lower() for s in outline.split(',') if s.strip()]if isinstance(outline, str) and outline else None)
2246
+ self.outline_threshold_factor = outline_threshold_factor
2247
+ self.outline_sigma = outline_sigma
2248
+
2241
2249
  style_out = set_dark_style(ttk.Style())
2242
2250
  self.font_loader = style_out['font_loader']
2243
2251
  self.font_size = style_out['font_size']
@@ -2337,7 +2345,12 @@ class AnnotateApp:
2337
2345
  'percentiles': ','.join(map(str, self.percentiles)),
2338
2346
  'measurement': ','.join(self.measurement) if self.measurement else '',
2339
2347
  'threshold': str(self.threshold) if self.threshold is not None else '',
2340
- 'normalize_channels': ','.join(self.normalize_channels) if self.normalize_channels else ''
2348
+ 'normalize_channels': ','.join(self.normalize_channels) if self.normalize_channels else '',
2349
+ 'outline': ','.join(self.outline) if self.outline else '',
2350
+ 'outline_threshold_factor': str(self.outline_threshold_factor) if hasattr(self, 'outline_threshold_factor') else '1.0',
2351
+ 'outline_sigma': str(self.outline_sigma) if hasattr(self, 'outline_sigma') else '1.0',
2352
+ 'src': self.src,
2353
+ 'db_path': self.db_path,
2341
2354
  }
2342
2355
 
2343
2356
  for key, data in vars_dict.items():
@@ -2354,7 +2367,10 @@ class AnnotateApp:
2354
2367
  settings['percentiles'] = list(map(convert_to_number, settings['percentiles'].split(','))) if settings['percentiles'] else [1, 99]
2355
2368
  settings['normalize'] = settings['normalize'].lower() == 'true'
2356
2369
  settings['normalize_channels'] = settings['normalize_channels'].split(',') if settings['normalize_channels'] else None
2357
-
2370
+ settings['outline'] = settings['outline'].split(',') if settings['outline'] else None
2371
+ settings['outline_threshold_factor'] = float(settings['outline_threshold_factor'].replace(',', '.')) if settings['outline_threshold_factor'] else 1.0
2372
+ settings['outline_sigma'] = float(settings['outline_sigma'].replace(',', '.')) if settings['outline_sigma'] else 1.0
2373
+
2358
2374
  try:
2359
2375
  settings['measurement'] = settings['measurement'].split(',') if settings['measurement'] else None
2360
2376
  settings['threshold'] = None if settings['threshold'].lower() == 'none' else int(settings['threshold'])
@@ -2379,7 +2395,12 @@ class AnnotateApp:
2379
2395
  'percentiles': settings.get('percentiles'),
2380
2396
  'measurement': settings.get('measurement'),
2381
2397
  'threshold': settings.get('threshold'),
2382
- 'normalize_channels': settings.get('normalize_channels')
2398
+ 'normalize_channels': settings.get('normalize_channels'),
2399
+ 'outline': settings.get('outline'),
2400
+ 'outline_threshold_factor': settings.get('outline_threshold_factor'),
2401
+ 'outline_sigma': settings.get('outline_sigma'),
2402
+ 'src': self.src,
2403
+ 'db_path': self.db_path
2383
2404
  })
2384
2405
 
2385
2406
  settings_window.destroy()
@@ -2389,22 +2410,32 @@ class AnnotateApp:
2389
2410
 
2390
2411
  def update_settings(self, **kwargs):
2391
2412
  allowed_attributes = {
2392
- 'image_type', 'channels', 'image_size', 'annotation_column',
2393
- 'normalize', 'percentiles', 'measurement', 'threshold', 'normalize_channels'
2413
+ 'image_type', 'channels', 'image_size', 'annotation_column', 'src', 'db_path',
2414
+ 'normalize', 'percentiles', 'measurement', 'threshold', 'normalize_channels', 'outline', 'outline_threshold_factor', 'outline_sigma'
2394
2415
  }
2395
2416
 
2396
2417
  updated = False
2397
-
2418
+
2398
2419
  for attr, value in kwargs.items():
2399
2420
  if attr in allowed_attributes and value is not None:
2421
+ if attr == 'outline':
2422
+ if isinstance(value, str):
2423
+ value = [s.strip().lower() for s in value.split(',') if s.strip()]
2424
+ elif attr == 'outline_threshold_factor':
2425
+ value = float(value)
2426
+ elif attr == 'outline_sigma':
2427
+ value = float(value)
2400
2428
  setattr(self, attr, value)
2401
2429
  updated = True
2402
2430
 
2431
+
2403
2432
  if 'image_size' in kwargs:
2404
2433
  if isinstance(self.image_size, list):
2405
2434
  self.image_size = (int(self.image_size[0]), int(self.image_size[0]))
2406
2435
  elif isinstance(self.image_size, int):
2407
2436
  self.image_size = (self.image_size, self.image_size)
2437
+ elif isinstance(self.image_size, tuple) and len(self.image_size) == 2:
2438
+ self.image_size = tuple(map(int, self.image_size))
2408
2439
  else:
2409
2440
  raise ValueError("Invalid image size")
2410
2441
 
@@ -2599,9 +2630,47 @@ class AnnotateApp:
2599
2630
  img = self.normalize_image(img, self.normalize, self.percentiles, self.normalize_channels)
2600
2631
  img = img.convert('RGB')
2601
2632
  img = self.filter_channels(img)
2633
+
2634
+ if self.outline:
2635
+ img = self.outline_image(img, self.outline_sigma)
2636
+
2602
2637
  img = img.resize(self.image_size)
2603
2638
  return img, annotation
2604
2639
 
2640
+ def outline_image(self, img, edge_sigma=1, edge_thickness=1):
2641
+ """
2642
+ For each selected channel, compute a continuous outline from the intensity landscape
2643
+ using Otsu threshold scaled by a correction factor. Replace only that channel.
2644
+ """
2645
+ arr = np.asarray(img)
2646
+ if arr.ndim != 3 or arr.shape[2] != 3:
2647
+ return img # not RGB
2648
+
2649
+ out_img = arr.copy()
2650
+ channel_map = {'r': 0, 'g': 1, 'b': 2}
2651
+ factor = getattr(self, 'outline_threshold_factor', 1.0)
2652
+
2653
+ for ch in self.outline:
2654
+ if ch not in channel_map:
2655
+ continue
2656
+ idx = channel_map[ch]
2657
+ channel_data = arr[:, :, idx]
2658
+
2659
+ try:
2660
+ channel_data = gaussian_filter(channel_data, sigma=edge_sigma)
2661
+ otsu_thresh = threshold_otsu(channel_data)
2662
+ corrected_thresh = min(255, otsu_thresh * factor)
2663
+ fg_mask = channel_data > corrected_thresh
2664
+ except Exception:
2665
+ continue
2666
+
2667
+ edge = find_boundaries(fg_mask, mode='inner')
2668
+ thick_edge = dilation(edge, disk(edge_thickness))
2669
+
2670
+ out_img[:, :, idx] = (thick_edge * 255).astype(np.uint8)
2671
+
2672
+ return Image.fromarray(out_img)
2673
+
2605
2674
  @staticmethod
2606
2675
  def normalize_image(img, normalize=False, percentiles=(1, 99), normalize_channels=None):
2607
2676
  """
@@ -252,7 +252,7 @@ def annotate(settings):
252
252
  app.load_images()
253
253
  root.mainloop()
254
254
 
255
- def generate_annotate_fields(frame):
255
+ def generate_annotate_fields_v1(frame):
256
256
  from .settings import set_annotate_default_settings
257
257
  from .gui_elements import set_dark_style
258
258
 
@@ -281,6 +281,48 @@ def generate_annotate_fields(frame):
281
281
 
282
282
  return vars_dict
283
283
 
284
+ def generate_annotate_fields(frame):
285
+ from .settings import set_annotate_default_settings
286
+ from .gui_elements import set_dark_style
287
+
288
+ style_out = set_dark_style(ttk.Style())
289
+ font_loader = style_out['font_loader']
290
+ font_size = style_out['font_size'] - 2
291
+
292
+ vars_dict = {}
293
+ settings = set_annotate_default_settings(settings={})
294
+
295
+ for setting in settings:
296
+ vars_dict[setting] = {
297
+ 'entry': ttk.Entry(frame),
298
+ 'value': settings[setting]
299
+ }
300
+
301
+ # Arrange input fields and labels
302
+ for row, (name, data) in enumerate(vars_dict.items()):
303
+ tk.Label(
304
+ frame,
305
+ text=f"{name.replace('_', ' ').capitalize()}:",
306
+ bg=style_out['bg_color'],
307
+ fg=style_out['fg_color'],
308
+ font=font_loader.get_font(size=font_size)
309
+ ).grid(row=row, column=0)
310
+
311
+ value = data['value']
312
+ if isinstance(value, list):
313
+ string_value = ','.join(map(str, value))
314
+ elif isinstance(value, (int, float, bool)):
315
+ string_value = str(value)
316
+ elif value is None:
317
+ string_value = ''
318
+ else:
319
+ string_value = value
320
+
321
+ data['entry'].insert(0, string_value)
322
+ data['entry'].grid(row=row, column=1)
323
+
324
+ return vars_dict
325
+
284
326
  def run_annotate_app(vars_dict, parent_frame):
285
327
  settings = {key: data['entry'].get() for key, data in vars_dict.items()}
286
328
  settings['channels'] = settings['channels'].split(',')
@@ -349,7 +391,7 @@ def annotate_with_image_refs(settings, root, shutdown_callback):
349
391
  screen_height = root.winfo_screenheight()
350
392
  root.geometry(f"{screen_width}x{screen_height}")
351
393
 
352
- 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'])
394
+ 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'], outline=settings['outline'], outline_threshold_factor=settings['outline_threshold_factor'], outline_sigma=settings['outline_sigma'])
353
395
 
354
396
  # Set the canvas background to black
355
397
  root.configure(bg='black')
@@ -331,7 +331,7 @@ def _extended_regionprops_table(labels, image, intensity_props):
331
331
  df['frac_low10'] = frac_low10
332
332
  df['entropy_intensity'] = entropy_intensity
333
333
 
334
- percentiles = [5, 10, 25, 50, 75, 85, 95]
334
+ percentiles = [5, 10, 25, 75, 85, 95]
335
335
  for p in percentiles:
336
336
  df[f'percentile_{p}'] = [
337
337
  np.percentile(region.intensity_image[region.image], p)
@@ -339,78 +339,6 @@ def _extended_regionprops_table(labels, image, intensity_props):
339
339
  ]
340
340
  return df
341
341
 
342
- def _extended_regionprops_table_v2(labels, image, intensity_props):
343
- """
344
- Calculate extended region properties table, adding integrated intensity,
345
- skewness, kurtosis, std, and median intensity per region.
346
- """
347
- # regionprops_table gives you vectorized props, but not everything you want
348
- props = regionprops_table(labels, image, properties=intensity_props)
349
- df = pd.DataFrame(props)
350
-
351
- # Compute extra features region-by-region
352
- regions = regionprops(labels, intensity_image=image)
353
- integrated_intensity = []
354
- std_intensity = []
355
- median_intensity = []
356
- skew_intensity = []
357
- kurtosis_intensity = []
358
- for region in regions:
359
- intens = region.intensity_image[region.image]
360
- # Handle empty region edge-case (shouldn't happen)
361
- if intens.size == 0:
362
- integrated_intensity.append(np.nan)
363
- std_intensity.append(np.nan)
364
- median_intensity.append(np.nan)
365
- skew_intensity.append(np.nan)
366
- kurtosis_intensity.append(np.nan)
367
- else:
368
- integrated_intensity.append(np.sum(intens))
369
- std_intensity.append(np.std(intens))
370
- median_intensity.append(np.median(intens))
371
- # Only valid for >2 pixels
372
- skew_intensity.append(skew(intens) if intens.size > 2 else np.nan)
373
- kurtosis_intensity.append(kurtosis(intens) if intens.size > 3 else np.nan)
374
-
375
- df['integrated_intensity'] = integrated_intensity
376
- df['std_intensity'] = std_intensity
377
- df['median_intensity'] = median_intensity
378
- df['skew_intensity'] = skew_intensity
379
- df['kurtosis_intensity'] = kurtosis_intensity
380
-
381
- # You can add other features here if desired
382
-
383
- # Percentiles (your existing code—optional if you want to keep)
384
- percentiles = [5, 10, 25, 50, 75, 85, 95]
385
- for p in percentiles:
386
- df[f'percentile_{p}'] = [
387
- np.percentile(region.intensity_image[region.image], p)
388
- for region in regions
389
- ]
390
- return df
391
-
392
- def _extended_regionprops_table_v1(labels, image, intensity_props):
393
- """
394
- Calculate extended region properties table.
395
-
396
- Args:
397
- labels (ndarray): Labeled image.
398
- image (ndarray): Input image.
399
- intensity_props (list): List of intensity properties to calculate.
400
-
401
- Returns:
402
- DataFrame: Extended region properties table.
403
-
404
- """
405
- regions = regionprops(labels, image)
406
- props = regionprops_table(labels, image, properties=intensity_props)
407
- percentiles = [5, 10, 25, 50, 75, 85, 95]
408
- for p in percentiles:
409
- props[f'percentile_{p}'] = [
410
- np.percentile(region.intensity_image.flatten()[~np.isnan(region.intensity_image.flatten())], p)
411
- for region in regions]
412
- return pd.DataFrame(props)
413
-
414
342
  def _calculate_homogeneity(label, channel, distances=[2,4,8,16,32,64]):
415
343
  """
416
344
  Calculate the homogeneity values for each region in the label mask.
@@ -767,8 +695,11 @@ def _intensity_measurements(cell_mask, nucleus_mask, pathogen_mask, cytoplasm_ma
767
695
  df.append(mask_intensity_df)
768
696
 
769
697
  if isinstance(settings['distance_gaussian_sigma'], int):
770
- intensity_distance_df = _measure_intensity_distance(cell_mask, nucleus_mask, pathogen_mask, channel_arrays, settings)
771
- cell_dfs.append(intensity_distance_df)
698
+ if settings['distance_gaussian_sigma'] != 0:
699
+ if settings['cell_mask_dim'] != None:
700
+ if settings['nucleus_mask_dim'] != None or settings['pathogen_mask_dim'] != None:
701
+ intensity_distance_df = _measure_intensity_distance(cell_mask, nucleus_mask, pathogen_mask, channel_arrays, settings)
702
+ cell_dfs.append(intensity_distance_df)
772
703
 
773
704
  if radial_dist:
774
705
  if np.max(nucleus_mask) != 0:
@@ -1154,7 +1154,7 @@ def _plot_cropped_arrays(stack, filename, figuresize=10, cmap='inferno', thresho
1154
1154
  for channel in range(num_channels):
1155
1155
  plot_single_array(stack[:, :, channel], axs[channel], f'C. {channel}', plt.get_cmap(cmap))
1156
1156
  fig.tight_layout()
1157
- print(f'{filename}')
1157
+ #print(f'{filename}')
1158
1158
  return fig
1159
1159
 
1160
1160
  def _visualize_and_save_timelapse_stack_with_tracks(masks, tracks_df, save, src, name, plot, filenames, object_type, mode='btrack', interactive=False):
@@ -314,7 +314,7 @@ def get_measure_crop_settings(settings={}):
314
314
  settings.setdefault('cytoplasm_min_size',0)
315
315
  settings.setdefault('merge_edge_pathogen_cells', True)
316
316
 
317
- settings.setdefault('distance_gaussian_sigma', 1)
317
+ settings.setdefault('distance_gaussian_sigma', 10)
318
318
 
319
319
  if settings['test_mode']:
320
320
  settings['verbose'] = True
@@ -1003,7 +1003,7 @@ expected_types = {
1003
1003
  "nucleus_diamiter":int,
1004
1004
  "pathogen_diamiter":int,
1005
1005
  "consolidate":bool,
1006
- "distance_gaussian_sigma":int
1006
+ "distance_gaussian_sigma": (int, type(None))
1007
1007
  }
1008
1008
 
1009
1009
  categories = {"Paths":[ "src", "grna", "barcodes", "custom_model_path", "dataset","model_path","grna_csv","row_csv","column_csv", "metadata_files", "score_data","count_data"],
@@ -1467,6 +1467,9 @@ def set_annotate_default_settings(settings):
1467
1467
  settings.setdefault('annotation_column', 'test')
1468
1468
  settings.setdefault('normalize', 'False')
1469
1469
  settings.setdefault('normalize_channels', "r,g,b")
1470
+ settings.setdefault('outline', None)
1471
+ settings.setdefault('outline_threshold_factor', 1)
1472
+ settings.setdefault('outline_sigma', 1)
1470
1473
  settings.setdefault('percentiles', [2, 98])
1471
1474
  settings.setdefault('measurement', '') #'cytoplasm_channel_3_mean_intensity,pathogen_channel_3_mean_intensity')
1472
1475
  settings.setdefault('threshold', '') #'2')