spacr 0.9.1__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 (377) hide show
  1. {spacr-0.9.1 → spacr-0.9.3}/LICENSE +1 -1
  2. {spacr-0.9.1 → spacr-0.9.3}/MANIFEST.in +2 -8
  3. spacr-0.9.3/PKG-INFO +207 -0
  4. spacr-0.9.3/README.rst +125 -0
  5. {spacr-0.9.1 → spacr-0.9.3}/setup.py +1 -1
  6. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_annotate.py +4 -0
  7. {spacr-0.9.1 → spacr-0.9.3}/spacr/gui_core.py +2 -2
  8. {spacr-0.9.1 → spacr-0.9.3}/spacr/gui_elements.py +79 -10
  9. {spacr-0.9.1 → spacr-0.9.3}/spacr/gui_utils.py +44 -2
  10. {spacr-0.9.1 → spacr-0.9.3}/spacr/measure.py +166 -23
  11. {spacr-0.9.1 → 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.1 → spacr-0.9.3}/spacr/settings.py +9 -3
  14. {spacr-0.9.1 → spacr-0.9.3}/spacr/utils.py +10 -1
  15. spacr-0.9.3/spacr.egg-info/PKG-INFO +207 -0
  16. {spacr-0.9.1 → spacr-0.9.3}/spacr.egg-info/SOURCES.txt +2 -5
  17. spacr-0.9.1/PKG-INFO +0 -144
  18. spacr-0.9.1/README.rst +0 -62
  19. spacr-0.9.1/spacr/resources/icons/dna_matrix.mp4 +0 -0
  20. spacr-0.9.1/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  21. spacr-0.9.1/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  22. spacr-0.9.1/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  23. spacr-0.9.1/spacr.egg-info/PKG-INFO +0 -144
  24. {spacr-0.9.1 → spacr-0.9.3}/deploy_docs.sh +0 -0
  25. {spacr-0.9.1 → spacr-0.9.3}/docs/.doctrees/environment.pickle +0 -0
  26. {spacr-0.9.1 → spacr-0.9.3}/docs/_images/logo_spacr.png +0 -0
  27. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/SetupDict.html +0 -0
  28. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/BasePredictor.html +0 -0
  29. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/BaseTrainer.html +0 -0
  30. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/Baseline/Predictor.html +0 -0
  31. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/Baseline/Trainer.html +0 -0
  32. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/Baseline/utils.html +0 -0
  33. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/MEDIAR/EnsemblePredictor.html +0 -0
  34. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/MEDIAR/Predictor.html +0 -0
  35. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/MEDIAR/Trainer.html +0 -0
  36. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/MEDIAR/utils.html +0 -0
  37. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/core/utils.html +0 -0
  38. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/evaluate.html +0 -0
  39. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/generate_mapping.html +0 -0
  40. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/index.html +0 -0
  41. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/main.html +0 -0
  42. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/predict.html +0 -0
  43. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_annotate.html +0 -0
  44. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_classify.html +0 -0
  45. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_make_masks.html +0 -0
  46. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_mask.html +0 -0
  47. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_measure.html +0 -0
  48. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_sequencing.html +0 -0
  49. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/app_umap.html +0 -0
  50. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/chat_bot.html +0 -0
  51. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/core.html +0 -0
  52. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/deep_spacr.html +0 -0
  53. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/gui.html +0 -0
  54. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/gui_core.html +0 -0
  55. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/gui_elements.html +0 -0
  56. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/gui_utils.html +0 -0
  57. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/io.html +0 -0
  58. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/logger.html +0 -0
  59. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/measure.html +0 -0
  60. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/mediar.html +0 -0
  61. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/ml.html +0 -0
  62. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/plot.html +0 -0
  63. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/sequencing.html +0 -0
  64. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/settings.html +0 -0
  65. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/sim.html +0 -0
  66. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/sp_stats.html +0 -0
  67. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/spacr_cellpose.html +0 -0
  68. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/submodules.html +0 -0
  69. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/timelapse.html +0 -0
  70. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/toxo.html +0 -0
  71. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/utils.html +0 -0
  72. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/spacr/version.html +0 -0
  73. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/CellAware.html +0 -0
  74. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/LoadImage.html +0 -0
  75. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/custom/NormalizeImage.html +0 -0
  76. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/datasetter.html +0 -0
  77. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/transforms.html +0 -0
  78. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/data_utils/utils.html +0 -0
  79. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/measures.html +0 -0
  80. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/models/MEDIARFormer.html +0 -0
  81. {spacr-0.9.1 → spacr-0.9.3}/docs/_modules/train_tools/utils.html +0 -0
  82. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/SetupDict/index.rst.txt +0 -0
  83. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/BasePredictor/index.rst.txt +0 -0
  84. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/BaseTrainer/index.rst.txt +0 -0
  85. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/Baseline/Predictor/index.rst.txt +0 -0
  86. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/Baseline/Trainer/index.rst.txt +0 -0
  87. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/Baseline/index.rst.txt +0 -0
  88. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/Baseline/utils/index.rst.txt +0 -0
  89. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/EnsemblePredictor/index.rst.txt +0 -0
  90. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/Predictor/index.rst.txt +0 -0
  91. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/Trainer/index.rst.txt +0 -0
  92. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/index.rst.txt +0 -0
  93. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/MEDIAR/utils/index.rst.txt +0 -0
  94. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/index.rst.txt +0 -0
  95. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/core/utils/index.rst.txt +0 -0
  96. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/evaluate/index.rst.txt +0 -0
  97. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/generate_mapping/index.rst.txt +0 -0
  98. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/index.rst.txt +0 -0
  99. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/main/index.rst.txt +0 -0
  100. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/predict/index.rst.txt +0 -0
  101. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_annotate/index.rst.txt +0 -0
  102. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_classify/index.rst.txt +0 -0
  103. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_make_masks/index.rst.txt +0 -0
  104. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_mask/index.rst.txt +0 -0
  105. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_measure/index.rst.txt +0 -0
  106. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_sequencing/index.rst.txt +0 -0
  107. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/app_umap/index.rst.txt +0 -0
  108. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/chat_bot/index.rst.txt +0 -0
  109. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/core/index.rst.txt +0 -0
  110. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/deep_spacr/index.rst.txt +0 -0
  111. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/gui/index.rst.txt +0 -0
  112. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/gui_core/index.rst.txt +0 -0
  113. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/gui_elements/index.rst.txt +0 -0
  114. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/gui_utils/index.rst.txt +0 -0
  115. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/index.rst.txt +0 -0
  116. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/io/index.rst.txt +0 -0
  117. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/logger/index.rst.txt +0 -0
  118. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/measure/index.rst.txt +0 -0
  119. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/mediar/index.rst.txt +0 -0
  120. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/ml/index.rst.txt +0 -0
  121. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/openai/index.rst.txt +0 -0
  122. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/plot/index.rst.txt +0 -0
  123. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/sequencing/index.rst.txt +0 -0
  124. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/settings/index.rst.txt +0 -0
  125. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/sim/index.rst.txt +0 -0
  126. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/sp_stats/index.rst.txt +0 -0
  127. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/spacr_cellpose/index.rst.txt +0 -0
  128. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/submodules/index.rst.txt +0 -0
  129. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/timelapse/index.rst.txt +0 -0
  130. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/toxo/index.rst.txt +0 -0
  131. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/utils/index.rst.txt +0 -0
  132. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/spacr/version/index.rst.txt +0 -0
  133. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/CellAware/index.rst.txt +0 -0
  134. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/LoadImage/index.rst.txt +0 -0
  135. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/NormalizeImage/index.rst.txt +0 -0
  136. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/custom/index.rst.txt +0 -0
  137. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/datasetter/index.rst.txt +0 -0
  138. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/index.rst.txt +0 -0
  139. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/transforms/index.rst.txt +0 -0
  140. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/data_utils/utils/index.rst.txt +0 -0
  141. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/index.rst.txt +0 -0
  142. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/measures/index.rst.txt +0 -0
  143. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/models/MEDIARFormer/index.rst.txt +0 -0
  144. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/models/index.rst.txt +0 -0
  145. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/api/train_tools/utils/index.rst.txt +0 -0
  146. {spacr-0.9.1 → spacr-0.9.3}/docs/_sources/index.rst.txt +0 -0
  147. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/basic.css +0 -0
  148. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/badge_only.css +0 -0
  149. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  150. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  151. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  152. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  153. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.eot +0 -0
  154. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.svg +0 -0
  155. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  156. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.woff +0 -0
  157. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  158. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold-italic.woff +0 -0
  159. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  160. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold.woff +0 -0
  161. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-bold.woff2 +0 -0
  162. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal-italic.woff +0 -0
  163. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  164. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal.woff +0 -0
  165. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/fonts/lato-normal.woff2 +0 -0
  166. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/css/theme.css +0 -0
  167. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/doctools.js +0 -0
  168. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/documentation_options.js +0 -0
  169. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/file.png +0 -0
  170. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.eot +0 -0
  171. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.ttf +0 -0
  172. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.woff +0 -0
  173. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bold.woff2 +0 -0
  174. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.eot +0 -0
  175. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.ttf +0 -0
  176. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.woff +0 -0
  177. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-bolditalic.woff2 +0 -0
  178. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.eot +0 -0
  179. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.ttf +0 -0
  180. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.woff +0 -0
  181. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-italic.woff2 +0 -0
  182. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.eot +0 -0
  183. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.ttf +0 -0
  184. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.woff +0 -0
  185. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/Lato/lato-regular.woff2 +0 -0
  186. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +0 -0
  187. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +0 -0
  188. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +0 -0
  189. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +0 -0
  190. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +0 -0
  191. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +0 -0
  192. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +0 -0
  193. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +0 -0
  194. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/graphviz.css +0 -0
  195. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/js/badge_only.js +0 -0
  196. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/js/theme.js +0 -0
  197. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/js/versions.js +0 -0
  198. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/language_data.js +0 -0
  199. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/logo_spacr.png +0 -0
  200. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/minus.png +0 -0
  201. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/plus.png +0 -0
  202. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/pygments.css +0 -0
  203. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/searchtools.js +0 -0
  204. {spacr-0.9.1 → spacr-0.9.3}/docs/_static/sphinx_highlight.js +0 -0
  205. {spacr-0.9.1 → spacr-0.9.3}/docs/api/SetupDict/index.html +0 -0
  206. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/BasePredictor/index.html +0 -0
  207. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/BaseTrainer/index.html +0 -0
  208. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/Baseline/Predictor/index.html +0 -0
  209. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/Baseline/Trainer/index.html +0 -0
  210. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/Baseline/index.html +0 -0
  211. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/Baseline/utils/index.html +0 -0
  212. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/MEDIAR/EnsemblePredictor/index.html +0 -0
  213. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/MEDIAR/Predictor/index.html +0 -0
  214. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/MEDIAR/Trainer/index.html +0 -0
  215. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/MEDIAR/index.html +0 -0
  216. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/MEDIAR/utils/index.html +0 -0
  217. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/index.html +0 -0
  218. {spacr-0.9.1 → spacr-0.9.3}/docs/api/core/utils/index.html +0 -0
  219. {spacr-0.9.1 → spacr-0.9.3}/docs/api/evaluate/index.html +0 -0
  220. {spacr-0.9.1 → spacr-0.9.3}/docs/api/generate_mapping/index.html +0 -0
  221. {spacr-0.9.1 → spacr-0.9.3}/docs/api/index.html +0 -0
  222. {spacr-0.9.1 → spacr-0.9.3}/docs/api/main/index.html +0 -0
  223. {spacr-0.9.1 → spacr-0.9.3}/docs/api/predict/index.html +0 -0
  224. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_annotate/index.html +0 -0
  225. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_classify/index.html +0 -0
  226. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_make_masks/index.html +0 -0
  227. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_mask/index.html +0 -0
  228. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_measure/index.html +0 -0
  229. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_sequencing/index.html +0 -0
  230. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/app_umap/index.html +0 -0
  231. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/chat_bot/index.html +0 -0
  232. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/core/index.html +0 -0
  233. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/deep_spacr/index.html +0 -0
  234. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/gui/index.html +0 -0
  235. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/gui_core/index.html +0 -0
  236. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/gui_elements/index.html +0 -0
  237. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/gui_utils/index.html +0 -0
  238. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/index.html +0 -0
  239. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/io/index.html +0 -0
  240. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/logger/index.html +0 -0
  241. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/measure/index.html +0 -0
  242. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/mediar/index.html +0 -0
  243. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/ml/index.html +0 -0
  244. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/openai/index.html +0 -0
  245. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/plot/index.html +0 -0
  246. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/sequencing/index.html +0 -0
  247. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/settings/index.html +0 -0
  248. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/sim/index.html +0 -0
  249. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/sp_stats/index.html +0 -0
  250. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/spacr_cellpose/index.html +0 -0
  251. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/submodules/index.html +0 -0
  252. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/timelapse/index.html +0 -0
  253. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/toxo/index.html +0 -0
  254. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/utils/index.html +0 -0
  255. {spacr-0.9.1 → spacr-0.9.3}/docs/api/spacr/version/index.html +0 -0
  256. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/CellAware/index.html +0 -0
  257. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/LoadImage/index.html +0 -0
  258. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/NormalizeImage/index.html +0 -0
  259. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/custom/index.html +0 -0
  260. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/datasetter/index.html +0 -0
  261. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/index.html +0 -0
  262. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/transforms/index.html +0 -0
  263. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/data_utils/utils/index.html +0 -0
  264. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/index.html +0 -0
  265. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/measures/index.html +0 -0
  266. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/models/MEDIARFormer/index.html +0 -0
  267. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/models/index.html +0 -0
  268. {spacr-0.9.1 → spacr-0.9.3}/docs/api/train_tools/utils/index.html +0 -0
  269. {spacr-0.9.1 → spacr-0.9.3}/docs/genindex.html +0 -0
  270. {spacr-0.9.1 → spacr-0.9.3}/docs/index.html +0 -0
  271. {spacr-0.9.1 → spacr-0.9.3}/docs/objects.inv +0 -0
  272. {spacr-0.9.1 → spacr-0.9.3}/docs/py-modindex.html +0 -0
  273. {spacr-0.9.1 → spacr-0.9.3}/docs/search.html +0 -0
  274. {spacr-0.9.1 → spacr-0.9.3}/docs/searchindex.js +0 -0
  275. {spacr-0.9.1 → spacr-0.9.3}/docs/source/_static/custom.css +0 -0
  276. {spacr-0.9.1 → spacr-0.9.3}/docs/source/_static/logo_spacr.png +0 -0
  277. {spacr-0.9.1 → spacr-0.9.3}/docs/source/conf.py +0 -0
  278. {spacr-0.9.1 → spacr-0.9.3}/docs/source/index.rst +0 -0
  279. {spacr-0.9.1 → spacr-0.9.3}/environment.yaml +0 -0
  280. {spacr-0.9.1 → spacr-0.9.3}/fonts/OpenSans-Regular.ttf +0 -0
  281. {spacr-0.9.1 → spacr-0.9.3}/requirements.txt +0 -0
  282. {spacr-0.9.1 → spacr-0.9.3}/rtd_trigger.txt +0 -0
  283. {spacr-0.9.1 → spacr-0.9.3}/setup.cfg +0 -0
  284. {spacr-0.9.1 → spacr-0.9.3}/setup_docs.sh +0 -0
  285. {spacr-0.9.1 → spacr-0.9.3}/spacr/__init__.py +0 -0
  286. {spacr-0.9.1 → spacr-0.9.3}/spacr/__main__.py +0 -0
  287. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_classify.py +0 -0
  288. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_make_masks.py +0 -0
  289. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_mask.py +0 -0
  290. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_measure.py +0 -0
  291. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_sequencing.py +0 -0
  292. {spacr-0.9.1 → spacr-0.9.3}/spacr/app_umap.py +0 -0
  293. {spacr-0.9.1 → spacr-0.9.3}/spacr/chat_bot.py +0 -0
  294. {spacr-0.9.1 → spacr-0.9.3}/spacr/core.py +0 -0
  295. {spacr-0.9.1 → spacr-0.9.3}/spacr/deep_spacr.py +0 -0
  296. {spacr-0.9.1 → spacr-0.9.3}/spacr/gui.py +0 -0
  297. {spacr-0.9.1 → spacr-0.9.3}/spacr/io.py +0 -0
  298. {spacr-0.9.1 → spacr-0.9.3}/spacr/logger.py +0 -0
  299. {spacr-0.9.1 → spacr-0.9.3}/spacr/ml.py +0 -0
  300. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/data/lopit.csv +0 -0
  301. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  302. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/OFL.txt +0 -0
  303. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  304. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  305. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/README.txt +0 -0
  306. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  307. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  308. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  309. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  310. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  311. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  312. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  313. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  314. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  315. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  316. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  317. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  318. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  319. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  320. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  321. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  322. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  323. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  324. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  325. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  326. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  327. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  328. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  329. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  330. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  331. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  332. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  333. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  334. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  335. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  336. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  337. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  338. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  339. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  340. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  341. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  342. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/abort.png +0 -0
  343. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/annotate.png +0 -0
  344. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/cellpose_all.png +0 -0
  345. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/cellpose_masks.png +0 -0
  346. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/classify.png +0 -0
  347. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/convert.png +0 -0
  348. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/default.png +0 -0
  349. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/download.png +0 -0
  350. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/logo.pdf +0 -0
  351. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/logo_spacr.png +0 -0
  352. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/logo_spacr_1.png +0 -0
  353. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/make_masks.png +0 -0
  354. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/map_barcodes.png +0 -0
  355. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/mask.png +0 -0
  356. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/measure.png +0 -0
  357. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/ml_analyze.png +0 -0
  358. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/plaque.png +0 -0
  359. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/recruitment.png +0 -0
  360. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/regression.png +0 -0
  361. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/run.png +0 -0
  362. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/sequencing.png +0 -0
  363. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/settings.png +0 -0
  364. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/train_cellpose.png +0 -0
  365. {spacr-0.9.1 → spacr-0.9.3}/spacr/resources/icons/umap.png +0 -0
  366. {spacr-0.9.1 → spacr-0.9.3}/spacr/sequencing.py +0 -0
  367. {spacr-0.9.1 → spacr-0.9.3}/spacr/sim.py +0 -0
  368. {spacr-0.9.1 → spacr-0.9.3}/spacr/sp_stats.py +0 -0
  369. {spacr-0.9.1 → spacr-0.9.3}/spacr/spacr_cellpose.py +0 -0
  370. {spacr-0.9.1 → spacr-0.9.3}/spacr/submodules.py +0 -0
  371. {spacr-0.9.1 → spacr-0.9.3}/spacr/timelapse.py +0 -0
  372. {spacr-0.9.1 → spacr-0.9.3}/spacr/toxo.py +0 -0
  373. {spacr-0.9.1 → spacr-0.9.3}/spacr/version.py +0 -0
  374. {spacr-0.9.1 → spacr-0.9.3}/spacr.egg-info/dependency_links.txt +0 -0
  375. {spacr-0.9.1 → spacr-0.9.3}/spacr.egg-info/entry_points.txt +0 -0
  376. {spacr-0.9.1 → spacr-0.9.3}/spacr.egg-info/requires.txt +0 -0
  377. {spacr-0.9.1 → 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
spacr-0.9.3/PKG-INFO ADDED
@@ -0,0 +1,207 @@
1
+ Metadata-Version: 2.1
2
+ Name: spacr
3
+ Version: 0.9.3
4
+ Summary: Spatial phenotype analysis of crisp screens (SpaCr)
5
+ Home-page: https://github.com/EinarOlafsson/spacr
6
+ Author: Einar Birnir Olafsson
7
+ Author-email: olafsson@med.umich.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: License :: OSI Approved :: MIT License
10
+ Classifier: Operating System :: OS Independent
11
+ Description-Content-Type: text/x-rst
12
+ License-File: LICENSE
13
+ Requires-Dist: numpy<2.0,>=1.26.4
14
+ Requires-Dist: pandas<3.0,>=2.2.1
15
+ Requires-Dist: scipy<2.0,>=1.12.0
16
+ Requires-Dist: cellpose<4.0,>=3.0.6
17
+ Requires-Dist: scikit-image<1.0,>=0.22.0
18
+ Requires-Dist: scikit-learn<2.0,>=1.4.1
19
+ Requires-Dist: scikit-posthocs<0.20,>=0.10.0
20
+ Requires-Dist: mahotas<2.0,>=1.4.13
21
+ Requires-Dist: btrack<1.0,>=0.6.5
22
+ Requires-Dist: trackpy<1.0,>=0.6.2
23
+ Requires-Dist: statsmodels<1.0,>=0.14.1
24
+ Requires-Dist: shap<1.0,>=0.45.0
25
+ Requires-Dist: torch<3.0,>=2.0
26
+ Requires-Dist: torchvision<1.0,>=0.1
27
+ Requires-Dist: torch-geometric<3.0,>=2.5
28
+ Requires-Dist: torchcam<1.0,>=0.4.0
29
+ Requires-Dist: transformers<5.0,>=4.45.2
30
+ Requires-Dist: segmentation_models_pytorch>=0.3.3
31
+ Requires-Dist: monai>=1.3.0
32
+ Requires-Dist: captum<1.0,>=0.7.0
33
+ Requires-Dist: seaborn<1.0,>=0.13.2
34
+ Requires-Dist: matplotlib<4.0,>=3.8.3
35
+ Requires-Dist: matplotlib_venn<2.0,>=1.1
36
+ Requires-Dist: adjustText<2.0,>=1.2.0
37
+ Requires-Dist: bottleneck<2.0,>=1.3.6
38
+ Requires-Dist: numexpr<3.0,>=2.8.4
39
+ Requires-Dist: opencv-python-headless<5.0,>=4.9.0.80
40
+ Requires-Dist: pillow<11.0,>=10.2.0
41
+ Requires-Dist: tifffile>=2023.4.12
42
+ Requires-Dist: nd2reader<4.0,>=3.3.0
43
+ Requires-Dist: czifile
44
+ Requires-Dist: pylibCZIrw<6.0,>=5.0.0
45
+ Requires-Dist: aicspylibczi
46
+ Requires-Dist: readlif
47
+ Requires-Dist: imageio<3.0,>=2.34.0
48
+ Requires-Dist: pingouin<1.0,>=0.5.5
49
+ Requires-Dist: umap-learn<1.0,>=0.5.6
50
+ Requires-Dist: ttkthemes<4.0,>=3.2.2
51
+ Requires-Dist: xgboost<3.0,>=2.0.3
52
+ Requires-Dist: PyWavelets<2.0,>=1.6.0
53
+ Requires-Dist: ttf_opensans>=2020.10.30
54
+ Requires-Dist: customtkinter<6.0,>=5.2.2
55
+ Requires-Dist: biopython<2.0,>=1.80
56
+ Requires-Dist: lxml<6.0,>=5.1.0
57
+ Requires-Dist: psutil<6.0,>=5.9.8
58
+ Requires-Dist: gputil<2.0,>=1.4.0
59
+ Requires-Dist: gpustat<2.0,>=1.1.1
60
+ Requires-Dist: pyautogui<1.0,>=0.9.54
61
+ Requires-Dist: tables<4.0,>=3.8.0
62
+ Requires-Dist: rapidfuzz<4.0,>=3.9
63
+ Requires-Dist: keyring<16.0,>=15.1
64
+ Requires-Dist: screeninfo<1.0,>=0.8.1
65
+ Requires-Dist: fastremap>=1.14.1
66
+ Requires-Dist: pytz>=2023.3.post1
67
+ Requires-Dist: tqdm>=4.65.0
68
+ Requires-Dist: wandb>=0.16.2
69
+ Requires-Dist: openai<2.0,>=1.50.2
70
+ Requires-Dist: gdown
71
+ Requires-Dist: IPython<9.0,>=8.18.1
72
+ Requires-Dist: ipykernel
73
+ Requires-Dist: ipywidgets<9.0,>=8.1.2
74
+ Requires-Dist: brokenaxes<1.0,>=0.6.2
75
+ Requires-Dist: huggingface-hub<0.25,>=0.24.0
76
+ Provides-Extra: dev
77
+ Requires-Dist: pytest<3.11,>=3.9; extra == "dev"
78
+ Provides-Extra: headless
79
+ Requires-Dist: opencv-python-headless; extra == "headless"
80
+ Provides-Extra: full
81
+ Requires-Dist: opencv-python; extra == "full"
82
+
83
+ .. |Docs| image:: https://github.com/EinarOlafsson/spacr/actions/workflows/pages/pages-build-deployment/badge.svg
84
+ :target: https://einarolafsson.github.io/spacr/index.html
85
+ .. |PyPI version| image:: https://badge.fury.io/py/spacr.svg
86
+ :target: https://badge.fury.io/py/spacr
87
+ .. |Python version| image:: https://img.shields.io/pypi/pyversions/spacr
88
+ :target: https://pypistats.org/packages/spacr
89
+ .. |Licence: MIT| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
90
+ :target: https://github.com/EinarOlafsson/spacr/blob/main/LICENSE
91
+ .. |repo size| image:: https://img.shields.io/github/repo-size/EinarOlafsson/spacr
92
+ :target: https://github.com/EinarOlafsson/spacr/
93
+
94
+ .. _docs: https://einarolafsson.github.io/spacr/index.html
95
+
96
+ Badges
97
+ ------
98
+ |Docs| |PyPI version| |Python version| |Licence: MIT| |repo size|
99
+
100
+ SpaCr
101
+ =====
102
+
103
+ **Spatial phenotype analysis of CRISPR-Cas9 screens (SpaCr).**
104
+
105
+ The spatial organization of organelles and proteins within cells constitutes a key level of functional regulation. In the context of infectious disease, the spatial relationships between host cell structures and intracellular pathogens are critical to understanding host clearance mechanisms and how pathogens evade them. SpaCr is a Python-based software package for generating single-cell image data for deep-learning sub-cellular/cellular phenotypic classification from pooled genetic CRISPR-Cas9 screens. SpaCr provides a flexible toolset to extract single-cell images and measurements from high-content cell painting experiments, train deep-learning models to classify cellular/subcellular phenotypes, simulate, and analyze pooled CRISPR-Cas9 imaging screens.
106
+
107
+ Features
108
+ --------
109
+
110
+ - **Generate Masks:** Generate cellpose masks of cell, nuclei, and pathogen objects.
111
+ - **Object Measurements:** Measurements for each object including scikit-image regionprops, intensity percentiles, shannon-entropy, Pearson’s and Manders’ correlations, homogeneity, and radial distribution. Measurements are saved to a SQL database in object-level tables.
112
+ - **Crop Images:** Save objects (cells, nuclei, pathogen, cytoplasm) as images. Object image paths are saved in a SQL database.
113
+ - **Train CNNs or Transformers:** Train Torch models to classify single object images.
114
+ - **Manual Annotation:** Supports manual annotation of single-cell images and segmentation to refine training datasets for training CNNs/Transformers or cellpose, respectively.
115
+ - **Finetune Cellpose Models:** Adjust pre-existing Cellpose models to your specific dataset for improved performance.
116
+ - **Timelapse Data Support:** Track objects in timelapse image data.
117
+ - **Simulations:** Simulate spatial phenotype screens.
118
+ - **Sequencing:** Map FASTQ reads to barcode and gRNA barcode metadata.
119
+ - **Misc:** Analyze Ca oscillation, recruitment, infection rate, plaque size/count.
120
+
121
+ .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v3.png
122
+ :alt: SpaCr workflow
123
+ :align: center
124
+
125
+
126
+ **Overview and data organization of spaCR.**
127
+
128
+ **a.** Schematic workflow of the spaCR pipeline for pooled image-based CRISPR screens. Microscopy images (TIFF, LIF, CZI, NDI) and sequencing reads (FASTQ) are used as inputs (black). The main modules (teal) are: (1) Mask: generates object masks for cells, nuclei, pathogens, and cytoplasm; (2) Measure: extracts object-level features and crops object images, storing quantitative data in an SQL database; (3) Classify—applies machine learning (ML, e.g., XGBoost) or deep learning (DL, e.g., PyTorch) models to classify objects, summarizing results as well-level classification scores; (4) Map Barcodes: extracts and maps row, column, and gRNA barcodes from sequencing data to corresponding wells; (5) Regression: estimates gRNA effect sizes and gene scores via multiple linear regression using well-level summary statistics.
129
+ **b.** Downstream submodules available for extended analyses at each stage.
130
+ **c.** Output folder structure for each module, including locations for raw and processed images, masks, object-level measurements, datasets, and results.
131
+ **d.** List of all spaCR package modules.
132
+
133
+ Installation
134
+ ------------
135
+
136
+ **Linux recommended.**
137
+ If using Windows, switch to Linux—it's free, open-source, and better.
138
+
139
+ **macOS prerequisites (before install):**
140
+
141
+ ::
142
+
143
+ brew install libomp
144
+ brew install hdf5
145
+
146
+ **Linux GUI requirement:**
147
+ SpaCr GUI requires Tkinter.
148
+
149
+ ::
150
+
151
+ sudo apt-get install python3-tk
152
+
153
+ **Installation:**
154
+
155
+ ::
156
+
157
+ pip install spacr
158
+
159
+ **Run SpaCr GUI:**
160
+
161
+ ::
162
+
163
+ spacr
164
+
165
+ Data Availability
166
+ -----------------
167
+
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
+
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
+
174
+
175
+ Example Notebooks
176
+ -----------------
177
+
178
+ The following example Jupyter notebooks illustrate common workflows using spaCR.
179
+
180
+ - `Generate masks <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/1_spacr_generate_masks.ipynb>`_
181
+ *Generate cell, nuclei, and pathogen segmentation masks from microscopy images using Cellpose.*
182
+
183
+ - `Capture single cell images and measurements <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
184
+ *Extract object-level measurements and crop single-cell images for downstream analysis.*
185
+
186
+ - `Machine learning based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3a_spacr_machine_learning.ipynb>`_
187
+ *Train traditional machine learning models (e.g., XGBoost) to classify cell phenotypes based on extracted features.*
188
+
189
+ - `Computer vision based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3b_spacr_computer_vision.ipynb>`_
190
+ *Train and evaluate deep learning models (PyTorch CNNs/Transformers) on cropped object images.*
191
+
192
+ - `Map sequencing barcodes <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/4_spacr_map_barecodes.ipynb>`_
193
+ *Map sequencing reads to row, column, and gRNA barcodes for CRISPR screen genotype-phenotype mapping.*
194
+
195
+ - `Finetune cellpose models <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/5_spacr_train_cellpose.ipynb>`_
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
+
spacr-0.9.3/README.rst ADDED
@@ -0,0 +1,125 @@
1
+ .. |Docs| image:: https://github.com/EinarOlafsson/spacr/actions/workflows/pages/pages-build-deployment/badge.svg
2
+ :target: https://einarolafsson.github.io/spacr/index.html
3
+ .. |PyPI version| image:: https://badge.fury.io/py/spacr.svg
4
+ :target: https://badge.fury.io/py/spacr
5
+ .. |Python version| image:: https://img.shields.io/pypi/pyversions/spacr
6
+ :target: https://pypistats.org/packages/spacr
7
+ .. |Licence: MIT| image:: https://img.shields.io/github/license/EinarOlafsson/spacr
8
+ :target: https://github.com/EinarOlafsson/spacr/blob/main/LICENSE
9
+ .. |repo size| image:: https://img.shields.io/github/repo-size/EinarOlafsson/spacr
10
+ :target: https://github.com/EinarOlafsson/spacr/
11
+
12
+ .. _docs: https://einarolafsson.github.io/spacr/index.html
13
+
14
+ Badges
15
+ ------
16
+ |Docs| |PyPI version| |Python version| |Licence: MIT| |repo size|
17
+
18
+ SpaCr
19
+ =====
20
+
21
+ **Spatial phenotype analysis of CRISPR-Cas9 screens (SpaCr).**
22
+
23
+ The spatial organization of organelles and proteins within cells constitutes a key level of functional regulation. In the context of infectious disease, the spatial relationships between host cell structures and intracellular pathogens are critical to understanding host clearance mechanisms and how pathogens evade them. SpaCr is a Python-based software package for generating single-cell image data for deep-learning sub-cellular/cellular phenotypic classification from pooled genetic CRISPR-Cas9 screens. SpaCr provides a flexible toolset to extract single-cell images and measurements from high-content cell painting experiments, train deep-learning models to classify cellular/subcellular phenotypes, simulate, and analyze pooled CRISPR-Cas9 imaging screens.
24
+
25
+ Features
26
+ --------
27
+
28
+ - **Generate Masks:** Generate cellpose masks of cell, nuclei, and pathogen objects.
29
+ - **Object Measurements:** Measurements for each object including scikit-image regionprops, intensity percentiles, shannon-entropy, Pearson’s and Manders’ correlations, homogeneity, and radial distribution. Measurements are saved to a SQL database in object-level tables.
30
+ - **Crop Images:** Save objects (cells, nuclei, pathogen, cytoplasm) as images. Object image paths are saved in a SQL database.
31
+ - **Train CNNs or Transformers:** Train Torch models to classify single object images.
32
+ - **Manual Annotation:** Supports manual annotation of single-cell images and segmentation to refine training datasets for training CNNs/Transformers or cellpose, respectively.
33
+ - **Finetune Cellpose Models:** Adjust pre-existing Cellpose models to your specific dataset for improved performance.
34
+ - **Timelapse Data Support:** Track objects in timelapse image data.
35
+ - **Simulations:** Simulate spatial phenotype screens.
36
+ - **Sequencing:** Map FASTQ reads to barcode and gRNA barcode metadata.
37
+ - **Misc:** Analyze Ca oscillation, recruitment, infection rate, plaque size/count.
38
+
39
+ .. image:: https://github.com/EinarOlafsson/spacr/raw/main/spacr/resources/icons/flow_chart_v3.png
40
+ :alt: SpaCr workflow
41
+ :align: center
42
+
43
+
44
+ **Overview and data organization of spaCR.**
45
+
46
+ **a.** Schematic workflow of the spaCR pipeline for pooled image-based CRISPR screens. Microscopy images (TIFF, LIF, CZI, NDI) and sequencing reads (FASTQ) are used as inputs (black). The main modules (teal) are: (1) Mask: generates object masks for cells, nuclei, pathogens, and cytoplasm; (2) Measure: extracts object-level features and crops object images, storing quantitative data in an SQL database; (3) Classify—applies machine learning (ML, e.g., XGBoost) or deep learning (DL, e.g., PyTorch) models to classify objects, summarizing results as well-level classification scores; (4) Map Barcodes: extracts and maps row, column, and gRNA barcodes from sequencing data to corresponding wells; (5) Regression: estimates gRNA effect sizes and gene scores via multiple linear regression using well-level summary statistics.
47
+ **b.** Downstream submodules available for extended analyses at each stage.
48
+ **c.** Output folder structure for each module, including locations for raw and processed images, masks, object-level measurements, datasets, and results.
49
+ **d.** List of all spaCR package modules.
50
+
51
+ Installation
52
+ ------------
53
+
54
+ **Linux recommended.**
55
+ If using Windows, switch to Linux—it's free, open-source, and better.
56
+
57
+ **macOS prerequisites (before install):**
58
+
59
+ ::
60
+
61
+ brew install libomp
62
+ brew install hdf5
63
+
64
+ **Linux GUI requirement:**
65
+ SpaCr GUI requires Tkinter.
66
+
67
+ ::
68
+
69
+ sudo apt-get install python3-tk
70
+
71
+ **Installation:**
72
+
73
+ ::
74
+
75
+ pip install spacr
76
+
77
+ **Run SpaCr GUI:**
78
+
79
+ ::
80
+
81
+ spacr
82
+
83
+ Data Availability
84
+ -----------------
85
+
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
+
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
+
92
+
93
+ Example Notebooks
94
+ -----------------
95
+
96
+ The following example Jupyter notebooks illustrate common workflows using spaCR.
97
+
98
+ - `Generate masks <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/1_spacr_generate_masks.ipynb>`_
99
+ *Generate cell, nuclei, and pathogen segmentation masks from microscopy images using Cellpose.*
100
+
101
+ - `Capture single cell images and measurements <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/2_spacr_generate_mesurments_crop_images.ipynb>`_
102
+ *Extract object-level measurements and crop single-cell images for downstream analysis.*
103
+
104
+ - `Machine learning based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3a_spacr_machine_learning.ipynb>`_
105
+ *Train traditional machine learning models (e.g., XGBoost) to classify cell phenotypes based on extracted features.*
106
+
107
+ - `Computer vision based object classification <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/3b_spacr_computer_vision.ipynb>`_
108
+ *Train and evaluate deep learning models (PyTorch CNNs/Transformers) on cropped object images.*
109
+
110
+ - `Map sequencing barcodes <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/4_spacr_map_barecodes.ipynb>`_
111
+ *Map sequencing reads to row, column, and gRNA barcodes for CRISPR screen genotype-phenotype mapping.*
112
+
113
+ - `Finetune cellpose models <https://github.com/EinarOlafsson/spacr/blob/main/Notebooks/5_spacr_train_cellpose.ipynb>`_
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.1"
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')