spacr 0.2.68__tar.gz → 0.3.0__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 (180) hide show
  1. spacr-0.3.0/MANIFEST.in +5 -0
  2. {spacr-0.2.68/spacr.egg-info → spacr-0.3.0}/PKG-INFO +10 -2
  3. {spacr-0.2.68 → spacr-0.3.0}/setup.py +13 -4
  4. {spacr-0.2.68 → spacr-0.3.0}/spacr/__init__.py +2 -1
  5. {spacr-0.2.68 → spacr-0.3.0}/spacr/core.py +107 -12
  6. {spacr-0.2.68 → spacr-0.3.0}/spacr/gui.py +3 -2
  7. {spacr-0.2.68 → spacr-0.3.0}/spacr/gui_core.py +160 -109
  8. {spacr-0.2.68 → spacr-0.3.0}/spacr/gui_elements.py +190 -18
  9. {spacr-0.2.68 → spacr-0.3.0}/spacr/gui_utils.py +4 -1
  10. {spacr-0.2.68 → spacr-0.3.0}/spacr/io.py +1 -1
  11. {spacr-0.2.68 → spacr-0.3.0}/spacr/measure.py +4 -4
  12. spacr-0.3.0/spacr/mediar.py +366 -0
  13. {spacr-0.2.68 → spacr-0.3.0}/spacr/plot.py +4 -1
  14. spacr-0.3.0/spacr/resources/MEDIAR/.git +1 -0
  15. spacr-0.3.0/spacr/resources/MEDIAR/.gitignore +18 -0
  16. spacr-0.3.0/spacr/resources/MEDIAR/LICENSE +21 -0
  17. spacr-0.3.0/spacr/resources/MEDIAR/README.md +189 -0
  18. spacr-0.3.0/spacr/resources/MEDIAR/SetupDict.py +39 -0
  19. spacr-0.3.0/spacr/resources/MEDIAR/config/baseline.json +60 -0
  20. spacr-0.3.0/spacr/resources/MEDIAR/config/mediar_example.json +72 -0
  21. spacr-0.3.0/spacr/resources/MEDIAR/config/pred/pred_mediar.json +17 -0
  22. spacr-0.3.0/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +55 -0
  23. spacr-0.3.0/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +58 -0
  24. spacr-0.3.0/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +66 -0
  25. spacr-0.3.0/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +66 -0
  26. spacr-0.3.0/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +16 -0
  27. spacr-0.3.0/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +23 -0
  28. spacr-0.3.0/spacr/resources/MEDIAR/core/BasePredictor.py +120 -0
  29. spacr-0.3.0/spacr/resources/MEDIAR/core/BaseTrainer.py +240 -0
  30. spacr-0.3.0/spacr/resources/MEDIAR/core/Baseline/Predictor.py +59 -0
  31. spacr-0.3.0/spacr/resources/MEDIAR/core/Baseline/Trainer.py +113 -0
  32. spacr-0.3.0/spacr/resources/MEDIAR/core/Baseline/__init__.py +2 -0
  33. spacr-0.3.0/spacr/resources/MEDIAR/core/Baseline/utils.py +80 -0
  34. spacr-0.3.0/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +105 -0
  35. spacr-0.3.0/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +234 -0
  36. spacr-0.3.0/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +172 -0
  37. spacr-0.3.0/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +3 -0
  38. spacr-0.3.0/spacr/resources/MEDIAR/core/MEDIAR/utils.py +429 -0
  39. spacr-0.3.0/spacr/resources/MEDIAR/core/__init__.py +2 -0
  40. spacr-0.3.0/spacr/resources/MEDIAR/core/utils.py +40 -0
  41. spacr-0.3.0/spacr/resources/MEDIAR/evaluate.py +71 -0
  42. spacr-0.3.0/spacr/resources/MEDIAR/generate_mapping.py +121 -0
  43. spacr-0.3.0/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  44. spacr-0.3.0/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  45. spacr-0.3.0/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  46. spacr-0.3.0/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  47. spacr-0.3.0/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  48. spacr-0.3.0/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  49. spacr-0.3.0/spacr/resources/MEDIAR/main.py +125 -0
  50. spacr-0.3.0/spacr/resources/MEDIAR/predict.py +70 -0
  51. spacr-0.3.0/spacr/resources/MEDIAR/requirements.txt +14 -0
  52. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/__init__.py +3 -0
  53. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +1 -0
  54. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +88 -0
  55. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +161 -0
  56. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +77 -0
  57. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +3 -0
  58. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  59. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +208 -0
  60. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +148 -0
  61. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +84 -0
  62. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/measures.py +200 -0
  63. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +102 -0
  64. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/models/__init__.py +1 -0
  65. spacr-0.3.0/spacr/resources/MEDIAR/train_tools/utils.py +70 -0
  66. spacr-0.3.0/spacr/resources/MEDIAR_weights/.DS_Store +0 -0
  67. spacr-0.3.0/spacr/resources/icons/.DS_Store +0 -0
  68. spacr-0.3.0/spacr/resources/icons/plaque.png +0 -0
  69. spacr-0.3.0/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  70. spacr-0.3.0/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  71. spacr-0.3.0/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  72. {spacr-0.2.68 → spacr-0.3.0}/spacr/sequencing.py +234 -422
  73. {spacr-0.2.68 → spacr-0.3.0}/spacr/settings.py +16 -10
  74. {spacr-0.2.68 → spacr-0.3.0}/spacr/utils.py +14 -11
  75. {spacr-0.2.68 → spacr-0.3.0/spacr.egg-info}/PKG-INFO +10 -2
  76. {spacr-0.2.68 → spacr-0.3.0}/spacr.egg-info/SOURCES.txt +59 -1
  77. {spacr-0.2.68 → spacr-0.3.0}/spacr.egg-info/requires.txt +9 -1
  78. spacr-0.2.68/MANIFEST.in +0 -1
  79. spacr-0.2.68/spacr/resources/icons/spacr_logo_rotation.gif +0 -0
  80. {spacr-0.2.68 → spacr-0.3.0}/LICENSE +0 -0
  81. {spacr-0.2.68 → spacr-0.3.0}/README.rst +0 -0
  82. {spacr-0.2.68 → spacr-0.3.0}/setup.cfg +0 -0
  83. {spacr-0.2.68 → spacr-0.3.0}/spacr/__main__.py +0 -0
  84. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_annotate.py +0 -0
  85. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_classify.py +0 -0
  86. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_make_masks.py +0 -0
  87. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_mask.py +0 -0
  88. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_measure.py +0 -0
  89. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_sequencing.py +0 -0
  90. {spacr-0.2.68 → spacr-0.3.0}/spacr/app_umap.py +0 -0
  91. {spacr-0.2.68 → spacr-0.3.0}/spacr/deep_spacr.py +0 -0
  92. {spacr-0.2.68 → spacr-0.3.0}/spacr/logger.py +0 -0
  93. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/OFL.txt +0 -0
  94. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  95. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  96. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/README.txt +0 -0
  97. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  98. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  99. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  100. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  101. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  102. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  103. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  104. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  105. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  106. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  107. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  108. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  109. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  110. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  111. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  112. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  113. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  114. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  115. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  116. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  117. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  118. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  119. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  120. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  121. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  122. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  123. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  124. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  125. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  126. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  127. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  128. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  129. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  130. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  131. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  132. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  133. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/abort.png +0 -0
  134. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/annotate.png +0 -0
  135. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/cellpose_all.png +0 -0
  136. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/cellpose_masks.png +0 -0
  137. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/classify.png +0 -0
  138. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/default.png +0 -0
  139. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/download.png +0 -0
  140. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/logo.pdf +0 -0
  141. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/logo_spacr.png +0 -0
  142. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/logo_spacr_1.png +0 -0
  143. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/make_masks.png +0 -0
  144. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/map_barcodes.png +0 -0
  145. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/mask.png +0 -0
  146. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/measure.png +0 -0
  147. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/ml_analyze.png +0 -0
  148. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/recruitment.png +0 -0
  149. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/regression.png +0 -0
  150. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/run.png +0 -0
  151. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/sequencing.png +0 -0
  152. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/settings.png +0 -0
  153. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/train_cellpose.png +0 -0
  154. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/icons/umap.png +0 -0
  155. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model +0 -0
  156. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv +0 -0
  157. {spacr-0.2.68 → spacr-0.3.0}/spacr/resources/models/cp/toxo_pv_lumen.CP_model +0 -0
  158. {spacr-0.2.68 → spacr-0.3.0}/spacr/sim.py +0 -0
  159. {spacr-0.2.68 → spacr-0.3.0}/spacr/sim_app.py +0 -0
  160. {spacr-0.2.68 → spacr-0.3.0}/spacr/timelapse.py +0 -0
  161. {spacr-0.2.68 → spacr-0.3.0}/spacr/version.py +0 -0
  162. {spacr-0.2.68 → spacr-0.3.0}/spacr.egg-info/dependency_links.txt +0 -0
  163. {spacr-0.2.68 → spacr-0.3.0}/spacr.egg-info/entry_points.txt +0 -0
  164. {spacr-0.2.68 → spacr-0.3.0}/spacr.egg-info/top_level.txt +0 -0
  165. {spacr-0.2.68 → spacr-0.3.0}/tests/test_annotate_app.py +0 -0
  166. {spacr-0.2.68 → spacr-0.3.0}/tests/test_core.py +0 -0
  167. {spacr-0.2.68 → spacr-0.3.0}/tests/test_gui_classify_app.py +0 -0
  168. {spacr-0.2.68 → spacr-0.3.0}/tests/test_gui_mask_app.py +0 -0
  169. {spacr-0.2.68 → spacr-0.3.0}/tests/test_gui_measure_app.py +0 -0
  170. {spacr-0.2.68 → spacr-0.3.0}/tests/test_gui_sim_app.py +0 -0
  171. {spacr-0.2.68 → spacr-0.3.0}/tests/test_gui_utils.py +0 -0
  172. {spacr-0.2.68 → spacr-0.3.0}/tests/test_io.py +0 -0
  173. {spacr-0.2.68 → spacr-0.3.0}/tests/test_mask_app.py +0 -0
  174. {spacr-0.2.68 → spacr-0.3.0}/tests/test_measure.py +0 -0
  175. {spacr-0.2.68 → spacr-0.3.0}/tests/test_plot.py +0 -0
  176. {spacr-0.2.68 → spacr-0.3.0}/tests/test_sim.py +0 -0
  177. {spacr-0.2.68 → spacr-0.3.0}/tests/test_timelapse.py +0 -0
  178. {spacr-0.2.68 → spacr-0.3.0}/tests/test_train.py +0 -0
  179. {spacr-0.2.68 → spacr-0.3.0}/tests/test_umap.py +0 -0
  180. {spacr-0.2.68 → spacr-0.3.0}/tests/test_utils.py +0 -0
@@ -0,0 +1,5 @@
1
+ recursive-include spacr/resources/models/cp *
2
+ recursive-include spacr/resources/icons *
3
+ recursive-include spacr/resources/font *
4
+ recursive-include spacr/resources/MEDIAR *
5
+ recursive-include spacr/resources/MEDIAR_weights *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.2.68
3
+ Version: 0.3.0
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
@@ -47,9 +47,17 @@ Requires-Dist: gpustat<2.0,>=1.1.1
47
47
  Requires-Dist: pyautogui<1.0,>=0.9.54
48
48
  Requires-Dist: tables<4.0,>=3.8.0
49
49
  Requires-Dist: rapidfuzz<4.0,>=3.9
50
- Requires-Dist: importlib-metadata<4.0,>=3.6
51
50
  Requires-Dist: keyring<16.0,>=15.1
52
51
  Requires-Dist: screeninfo<1.0,>=0.8.1
52
+ Requires-Dist: ipykernel
53
+ Requires-Dist: gdown
54
+ Requires-Dist: fastremap>=1.14.1
55
+ Requires-Dist: monai>=1.3.0
56
+ Requires-Dist: pytz>=2023.3.post1
57
+ Requires-Dist: segmentation_models_pytorch>=0.3.3
58
+ Requires-Dist: tifffile>=2023.4.12
59
+ Requires-Dist: tqdm>=4.65.0
60
+ Requires-Dist: wandb>=0.16.2
53
61
  Requires-Dist: huggingface-hub<0.25,>=0.24.0
54
62
  Provides-Extra: dev
55
63
  Requires-Dist: pytest<3.11,>=3.9; extra == "dev"
@@ -44,15 +44,23 @@ dependencies = [
44
44
  'pyautogui>=0.9.54,<1.0',
45
45
  'tables>=3.8.0,<4.0',
46
46
  'rapidfuzz>=3.9, <4.0',
47
- 'importlib-metadata>=3.6, <4.0',
48
47
  'keyring>=15.1, <16.0',
49
48
  'screeninfo>=0.8.1,<1.0',
49
+ 'ipykernel',
50
+ 'gdown',
51
+ 'fastremap>=1.14.1',
52
+ 'monai>=1.3.0',
53
+ 'pytz>=2023.3.post1',
54
+ 'segmentation_models_pytorch>=0.3.3',
55
+ 'tifffile>=2023.4.12',
56
+ 'tqdm>=4.65.0',
57
+ 'wandb>=0.16.2',
50
58
  'huggingface-hub>=0.24.0,<0.25'
51
59
  ]
52
60
 
53
61
  setup(
54
62
  name="spacr",
55
- version="0.2.68",
63
+ version="0.3.0",
56
64
  author="Einar Birnir Olafsson",
57
65
  author_email="olafsson@med.umich.com",
58
66
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -60,7 +68,7 @@ setup(
60
68
  url="https://github.com/EinarOlafsson/spacr",
61
69
  packages=find_packages(exclude=["tests.*", "tests"]),
62
70
  include_package_data=True,
63
- package_data={'spacr': ['resources/models/cp/*', 'resources/icons/*', 'resources/font/**/*'],},
71
+ package_data={'spacr': ['resources/models/cp/*', 'resources/icons/*', 'resources/font/**/*', 'resources/MEDIAR/**/*', 'resources/MEDIAR_weights/*', 'resources/images/*'],},
64
72
  install_requires=dependencies,
65
73
  entry_points={
66
74
  'console_scripts': [
@@ -100,4 +108,5 @@ for dep in deps:
100
108
  try:
101
109
  subprocess.run(['pip', 'install', dep], check=True)
102
110
  except subprocess.CalledProcessError:
103
- pass
111
+ pass
112
+
@@ -23,9 +23,9 @@ from . import app_measure
23
23
  from . import app_classify
24
24
  from . import app_sequencing
25
25
  from . import app_umap
26
+ from . import mediar
26
27
  from . import logger
27
28
 
28
-
29
29
  __all__ = [
30
30
  "core",
31
31
  "io",
@@ -48,6 +48,7 @@ __all__ = [
48
48
  "app_classify",
49
49
  "app_sequencing",
50
50
  "app_umap",
51
+ "mediar",
51
52
  "logger"
52
53
  ]
53
54
 
@@ -50,8 +50,6 @@ import random
50
50
  from PIL import Image
51
51
  from torchvision.transforms import ToTensor
52
52
 
53
-
54
-
55
53
  def analyze_plaques(folder):
56
54
  summary_data = []
57
55
  details_data = []
@@ -1638,7 +1636,7 @@ def preprocess_generate_masks(src, settings={}):
1638
1636
 
1639
1637
  settings = set_default_settings_preprocess_generate_masks(src, settings)
1640
1638
  settings['src'] = src
1641
- save_settings(settings)
1639
+ save_settings(settings, name='gen_mask')
1642
1640
 
1643
1641
  if not settings['pathogen_channel'] is None:
1644
1642
  custom_model_ls = ['toxo_pv_lumen','toxo_cyto']
@@ -1674,7 +1672,10 @@ def preprocess_generate_masks(src, settings={}):
1674
1672
  time_ls=[]
1675
1673
  if check_mask_folder(src, 'cell_mask_stack'):
1676
1674
  start = time.time()
1677
- generate_cellpose_masks(mask_src, settings, 'cell')
1675
+ if settings['segmantation_model'] == 'cellpose':
1676
+ generate_cellpose_masks(mask_src, settings, 'cell')
1677
+ elif settings['segmantation_model'] == 'mediar':
1678
+ generate_mediar_masks(mask_src, settings, 'cell')
1678
1679
  stop = time.time()
1679
1680
  duration = (stop - start)
1680
1681
  time_ls.append(duration)
@@ -1685,7 +1686,10 @@ def preprocess_generate_masks(src, settings={}):
1685
1686
  time_ls=[]
1686
1687
  if check_mask_folder(src, 'nucleus_mask_stack'):
1687
1688
  start = time.time()
1688
- generate_cellpose_masks(mask_src, settings, 'nucleus')
1689
+ if settings['segmantation_model'] == 'cellpose':
1690
+ generate_cellpose_masks(mask_src, settings, 'nucleus')
1691
+ elif settings['segmantation_model'] == 'mediar':
1692
+ generate_mediar_masks(mask_src, settings, 'nucleus')
1689
1693
  stop = time.time()
1690
1694
  duration = (stop - start)
1691
1695
  time_ls.append(duration)
@@ -1696,7 +1700,10 @@ def preprocess_generate_masks(src, settings={}):
1696
1700
  time_ls=[]
1697
1701
  if check_mask_folder(src, 'pathogen_mask_stack'):
1698
1702
  start = time.time()
1699
- generate_cellpose_masks(mask_src, settings, 'pathogen')
1703
+ if settings['segmantation_model'] == 'cellpose':
1704
+ generate_cellpose_masks(mask_src, settings, 'pathogen')
1705
+ elif settings['segmantation_model'] == 'mediar':
1706
+ generate_mediar_masks(mask_src, settings, 'pathogen')
1700
1707
  stop = time.time()
1701
1708
  duration = (stop - start)
1702
1709
  time_ls.append(duration)
@@ -1898,7 +1905,7 @@ def all_elements_match(list1, list2):
1898
1905
  # Check if all elements in list1 are in list2
1899
1906
  return all(element in list2 for element in list1)
1900
1907
 
1901
- def prepare_batch_for_cellpose(batch):
1908
+ def prepare_batch_for_segmentation(batch):
1902
1909
  # Ensure the batch is of dtype float32
1903
1910
  if batch.dtype != np.float32:
1904
1911
  batch = batch.astype(np.float32)
@@ -2021,7 +2028,7 @@ def generate_cellpose_masks(src, settings, object_type):
2021
2028
  if batch.size == 0:
2022
2029
  continue
2023
2030
 
2024
- batch = prepare_batch_for_cellpose(batch)
2031
+ batch = prepare_batch_for_segmentation(batch)
2025
2032
 
2026
2033
  if timelapse:
2027
2034
  movie_path = os.path.join(os.path.dirname(src), 'movies')
@@ -2180,7 +2187,7 @@ def generate_masks_from_imgs(src, model, model_name, batch_size, diameter, cellp
2180
2187
  image_files = all_image_files[i:i+batch_size]
2181
2188
 
2182
2189
  if normalize:
2183
- images, _, image_names, _ = _load_normalized_images_and_labels(image_files, None, channels, percentiles, circular, invert, plot, remove_background, background, Signal_to_noise)
2190
+ images, _, image_names, _, orig_dims = _load_normalized_images_and_labels(image_files, None, channels, percentiles, circular, invert, plot, remove_background, background, Signal_to_noise, target_height, target_width)
2184
2191
  images = [np.squeeze(img) if img.shape[-1] == 1 else img for img in images]
2185
2192
  orig_dims = [(image.shape[0], image.shape[1]) for image in images]
2186
2193
  else:
@@ -2300,7 +2307,7 @@ def compare_cellpose_masks(src, verbose=False, processes=None, save=True):
2300
2307
  from .io import _read_mask
2301
2308
 
2302
2309
  dirs = [os.path.join(src, d) for d in os.listdir(src) if os.path.isdir(os.path.join(src, d)) and d != 'results']
2303
- dirs.sort() # Optional: sort directories if needed
2310
+ dirs.sort()
2304
2311
  conditions = [os.path.basename(d) for d in dirs]
2305
2312
 
2306
2313
  # Get common files in all directories
@@ -2316,7 +2323,7 @@ def compare_cellpose_masks(src, verbose=False, processes=None, save=True):
2316
2323
 
2317
2324
  # Filter out None results (from skipped files)
2318
2325
  results = [res for res in results if res is not None]
2319
- #print(results)
2326
+ print(results)
2320
2327
  if verbose:
2321
2328
  for result in results:
2322
2329
  filename = result['filename']
@@ -3102,4 +3109,92 @@ def reducer_hyperparameter_search(settings={}, reduction_params=None, dbscan_par
3102
3109
  else:
3103
3110
  plt.show()
3104
3111
 
3105
- return
3112
+ return
3113
+
3114
+ def generate_mediar_masks(src, settings, object_type):
3115
+ """
3116
+ Generates masks using the MEDIARPredictor.
3117
+
3118
+ :param src: Source folder containing images or npz files.
3119
+ :param settings: Dictionary of settings for generating masks.
3120
+ :param object_type: Type of object to detect (e.g., 'cell', 'nucleus', etc.).
3121
+ """
3122
+ from .mediar import MEDIARPredictor
3123
+ from .io import _create_database, _save_object_counts_to_database
3124
+ from .plot import plot_masks
3125
+ from .settings import set_default_settings_preprocess_generate_masks, _get_object_settings
3126
+
3127
+ # Clear CUDA cache and check if CUDA is available
3128
+ gc.collect()
3129
+ if not torch.cuda.is_available():
3130
+ print(f'Torch CUDA is not available, using CPU')
3131
+
3132
+ # Preprocess settings
3133
+ settings = set_default_settings_preprocess_generate_masks(src, settings)
3134
+
3135
+ if settings['verbose']:
3136
+ settings_df = pd.DataFrame(list(settings.items()), columns=['setting_key', 'setting_value'])
3137
+ settings_df['setting_value'] = settings_df['setting_value'].apply(str)
3138
+ display(settings_df)
3139
+
3140
+ figuresize = 10
3141
+ timelapse = settings['timelapse']
3142
+ batch_size = settings['batch_size']
3143
+
3144
+ # Get object settings and initialize MEDIARPredictor
3145
+ mediar_predictor = MEDIARPredictor(input_path=None, output_path=None, normalize=settings['normalize'], use_tta=False)
3146
+
3147
+ # Paths to input npz files
3148
+ paths = [os.path.join(src, file) for file in os.listdir(src) if file.endswith('.npz')]
3149
+
3150
+ # Initialize a database for saving measurements
3151
+ count_loc = os.path.join(os.path.dirname(src), 'measurements', 'measurements.db')
3152
+ os.makedirs(os.path.dirname(src) + '/measurements', exist_ok=True)
3153
+ _create_database(count_loc)
3154
+
3155
+ for file_index, path in enumerate(paths):
3156
+ name = os.path.basename(path)
3157
+ name, ext = os.path.splitext(name)
3158
+ output_folder = os.path.join(os.path.dirname(path), f'{object_type}_mask_stack')
3159
+ os.makedirs(output_folder, exist_ok=True)
3160
+
3161
+ with np.load(path) as data:
3162
+ stack = data['data']
3163
+ filenames = data['filenames']
3164
+
3165
+ for i, filename in enumerate(filenames):
3166
+ output_path = os.path.join(output_folder, filename)
3167
+ if os.path.exists(output_path):
3168
+ print(f"File {filename} already exists. Skipping...")
3169
+ continue
3170
+
3171
+ # Process each batch of images in the stack
3172
+ for i in range(0, stack.shape[0], batch_size):
3173
+ batch = stack[i: i + batch_size]
3174
+ batch_filenames = filenames[i: i + batch_size]
3175
+
3176
+ # Prepare batch for MEDIARPredictor (optional)
3177
+ batch = prepare_batch_for_segmentation(batch)
3178
+
3179
+ # Predict masks using MEDIARPredictor
3180
+ predicted_masks = mediar_predictor.predict_batch(batch)
3181
+
3182
+ # Save predicted masks
3183
+ for j, mask in enumerate(predicted_masks):
3184
+ output_filename = os.path.join(output_folder, batch_filenames[j])
3185
+ mask = mask.astype(np.uint16)
3186
+ np.save(output_filename, mask)
3187
+
3188
+ # Optional: Plot the masks
3189
+ if settings['plot']:
3190
+ for idx, mask in enumerate(predicted_masks):
3191
+ plot_masks(batch[idx], mask, cmap='inferno', figuresize=figuresize)
3192
+
3193
+ # Save object counts to database
3194
+ _save_object_counts_to_database(predicted_masks, object_type, batch_filenames, count_loc)
3195
+
3196
+ # Clear CUDA cache after each file
3197
+ gc.collect()
3198
+ torch.cuda.empty_cache()
3199
+
3200
+ print("Mask generation completed.")
@@ -32,7 +32,7 @@ class MainApp(tk.Tk):
32
32
  # Set the window size to the dimensions of the monitor where it is located
33
33
  self.geometry(f"{width}x{height}")
34
34
  self.title("SpaCr GUI Collection")
35
- self.configure(bg='#333333') # Set window background to dark gray
35
+ self.configure(bg='#333333')
36
36
 
37
37
  style = ttk.Style()
38
38
  self.color_settings = set_dark_style(style, parent_frame=self)
@@ -55,7 +55,8 @@ class MainApp(tk.Tk):
55
55
  "Cellpose All": (lambda frame: initiate_root(self, 'cellpose_all'), "Run Cellpose on all images."),
56
56
  "Map Barcodes": (lambda frame: initiate_root(self, 'map_barcodes'), "Map barcodes to data."),
57
57
  "Regression": (lambda frame: initiate_root(self, 'regression'), "Perform regression analysis."),
58
- "Recruitment": (lambda frame: initiate_root(self, 'recruitment'), "Analyze recruitment data.")
58
+ "Recruitment": (lambda frame: initiate_root(self, 'recruitment'), "Analyze recruitment data."),
59
+ "Plaque": (lambda frame: initiate_root(self, 'analyze_plaques'), "Analyze plaque data.")
59
60
  }
60
61
 
61
62
  self.selected_app = tk.StringVar()