spacr 0.3.38__tar.gz → 0.3.42__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. {spacr-0.3.38/spacr.egg-info → spacr-0.3.42}/PKG-INFO +1 -1
  2. {spacr-0.3.38 → spacr-0.3.42}/setup.py +1 -1
  3. {spacr-0.3.38 → spacr-0.3.42}/spacr/core.py +1 -1
  4. {spacr-0.3.38 → spacr-0.3.42}/spacr/io.py +20 -13
  5. {spacr-0.3.38 → spacr-0.3.42}/spacr/measure.py +4 -4
  6. {spacr-0.3.38 → spacr-0.3.42}/spacr/ml.py +53 -44
  7. {spacr-0.3.38 → spacr-0.3.42}/spacr/plot.py +421 -37
  8. {spacr-0.3.38 → spacr-0.3.42}/spacr/settings.py +18 -13
  9. {spacr-0.3.38 → spacr-0.3.42}/spacr/toxo.py +223 -16
  10. {spacr-0.3.38 → spacr-0.3.42}/spacr/utils.py +7 -5
  11. {spacr-0.3.38 → spacr-0.3.42/spacr.egg-info}/PKG-INFO +1 -1
  12. {spacr-0.3.38 → spacr-0.3.42}/.readthedocs.yaml +0 -0
  13. {spacr-0.3.38 → spacr-0.3.42}/LICENSE +0 -0
  14. {spacr-0.3.38 → spacr-0.3.42}/MANIFEST.in +0 -0
  15. {spacr-0.3.38 → spacr-0.3.42}/README.rst +0 -0
  16. {spacr-0.3.38 → spacr-0.3.42}/deploy_docs.sh +0 -0
  17. {spacr-0.3.38 → spacr-0.3.42}/docs/requirements.txt +0 -0
  18. {spacr-0.3.38 → spacr-0.3.42}/docs/source/Makefile +0 -0
  19. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/doctrees/environment.pickle +0 -0
  20. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/index.html +0 -0
  21. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_annotate.html +0 -0
  22. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_classify.html +0 -0
  23. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_make_masks.html +0 -0
  24. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_mask.html +0 -0
  25. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_measure.html +0 -0
  26. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_sequencing.html +0 -0
  27. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/app_umap.html +0 -0
  28. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/core.html +0 -0
  29. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/deep_spacr.html +0 -0
  30. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/graph_learning.html +0 -0
  31. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/gui.html +0 -0
  32. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/gui_core.html +0 -0
  33. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/gui_elements.html +0 -0
  34. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/gui_utils.html +0 -0
  35. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/io.html +0 -0
  36. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/logger.html +0 -0
  37. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/measure.html +0 -0
  38. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/plot.html +0 -0
  39. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/sequencing.html +0 -0
  40. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/settings.html +0 -0
  41. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/sim.html +0 -0
  42. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/timelapse.html +0 -0
  43. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_modules/spacr/utils.html +0 -0
  44. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_sources/index.rst.txt +0 -0
  45. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_sources/modules.rst.txt +0 -0
  46. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_sources/spacr.rst.txt +0 -0
  47. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/_sphinx_javascript_frameworks_compat.js +0 -0
  48. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/basic.css +0 -0
  49. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/badge_only.css +0 -0
  50. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +0 -0
  51. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +0 -0
  52. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +0 -0
  53. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +0 -0
  54. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.eot +0 -0
  55. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.svg +0 -0
  56. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.ttf +0 -0
  57. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff +0 -0
  58. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +0 -0
  59. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff +0 -0
  60. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-bold-italic.woff2 +0 -0
  61. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-bold.woff +0 -0
  62. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-bold.woff2 +0 -0
  63. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff +0 -0
  64. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-normal-italic.woff2 +0 -0
  65. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-normal.woff +0 -0
  66. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/fonts/lato-normal.woff2 +0 -0
  67. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/css/theme.css +0 -0
  68. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/doctools.js +0 -0
  69. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/documentation_options.js +0 -0
  70. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/file.png +0 -0
  71. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/jquery.js +0 -0
  72. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/js/badge_only.js +0 -0
  73. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/js/html5shiv-printshiv.min.js +0 -0
  74. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/js/html5shiv.min.js +0 -0
  75. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/js/theme.js +0 -0
  76. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/language_data.js +0 -0
  77. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/minus.png +0 -0
  78. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/plus.png +0 -0
  79. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/pygments.css +0 -0
  80. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/searchtools.js +0 -0
  81. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/_static/sphinx_highlight.js +0 -0
  82. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/genindex.html +0 -0
  83. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/index.html +0 -0
  84. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/modules.html +0 -0
  85. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/objects.inv +0 -0
  86. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/py-modindex.html +0 -0
  87. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/search.html +0 -0
  88. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/searchindex.js +0 -0
  89. {spacr-0.3.38 → spacr-0.3.42}/docs/source/_build/html/spacr.html +0 -0
  90. {spacr-0.3.38 → spacr-0.3.42}/docs/source/conf.py +0 -0
  91. {spacr-0.3.38 → spacr-0.3.42}/docs/source/index.rst +0 -0
  92. {spacr-0.3.38 → spacr-0.3.42}/docs/source/make.bat +0 -0
  93. {spacr-0.3.38 → spacr-0.3.42}/docs/source/modules.rst +0 -0
  94. {spacr-0.3.38 → spacr-0.3.42}/docs/source/spacr.rst +0 -0
  95. {spacr-0.3.38 → spacr-0.3.42}/environment.yaml +0 -0
  96. {spacr-0.3.38 → spacr-0.3.42}/fonts/OpenSans-Regular.ttf +0 -0
  97. {spacr-0.3.38 → spacr-0.3.42}/notebooks/cv_scoring_nb.ipynb +0 -0
  98. {spacr-0.3.38 → spacr-0.3.42}/notebooks/deep_learning_spacr.ipynb +0 -0
  99. {spacr-0.3.38 → spacr-0.3.42}/notebooks/machine_learning_spacr_nb.ipynb +0 -0
  100. {spacr-0.3.38 → spacr-0.3.42}/notebooks/spacr_0.1_all_settings_git.ipynb +0 -0
  101. {spacr-0.3.38 → spacr-0.3.42}/notebooks/spacr_0.1_minimal.ipynb +0 -0
  102. {spacr-0.3.38 → spacr-0.3.42}/path/home/carruthers/datasets/plate1/measurements/measurements.db +0 -0
  103. {spacr-0.3.38 → spacr-0.3.42}/path/home/carruthers/datasets/plate1/settings/measure_crop_settings.csv +0 -0
  104. {spacr-0.3.38 → spacr-0.3.42}/path/settings/preprocess_generate_masks_settings.csv +0 -0
  105. {spacr-0.3.38 → spacr-0.3.42}/requirements.txt +0 -0
  106. {spacr-0.3.38 → spacr-0.3.42}/settings/measure_crop_settings.csv +0 -0
  107. {spacr-0.3.38 → spacr-0.3.42}/setup.cfg +0 -0
  108. {spacr-0.3.38 → spacr-0.3.42}/setup_docs.sh +0 -0
  109. {spacr-0.3.38 → spacr-0.3.42}/source/conf.py +0 -0
  110. {spacr-0.3.38 → spacr-0.3.42}/source/index.rst +0 -0
  111. {spacr-0.3.38 → spacr-0.3.42}/source/modules.rst +0 -0
  112. {spacr-0.3.38 → spacr-0.3.42}/source/setup.rst +0 -0
  113. {spacr-0.3.38 → spacr-0.3.42}/source/spacr.rst +0 -0
  114. {spacr-0.3.38 → spacr-0.3.42}/spacr/__init__.py +0 -0
  115. {spacr-0.3.38 → spacr-0.3.42}/spacr/__main__.py +0 -0
  116. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_annotate.py +0 -0
  117. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_classify.py +0 -0
  118. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_make_masks.py +0 -0
  119. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_mask.py +0 -0
  120. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_measure.py +0 -0
  121. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_sequencing.py +0 -0
  122. {spacr-0.3.38 → spacr-0.3.42}/spacr/app_umap.py +0 -0
  123. {spacr-0.3.38 → spacr-0.3.42}/spacr/cellpose.py +0 -0
  124. {spacr-0.3.38 → spacr-0.3.42}/spacr/deep_spacr.py +0 -0
  125. {spacr-0.3.38 → spacr-0.3.42}/spacr/gui.py +0 -0
  126. {spacr-0.3.38 → spacr-0.3.42}/spacr/gui_core.py +0 -0
  127. {spacr-0.3.38 → spacr-0.3.42}/spacr/gui_elements.py +0 -0
  128. {spacr-0.3.38 → spacr-0.3.42}/spacr/gui_utils.py +0 -0
  129. {spacr-0.3.38 → spacr-0.3.42}/spacr/logger.py +0 -0
  130. {spacr-0.3.38 → spacr-0.3.42}/spacr/mediar.py +0 -0
  131. {spacr-0.3.38 → spacr-0.3.42}/spacr/openai.py +0 -0
  132. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/.gitignore +0 -0
  133. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/LICENSE +0 -0
  134. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/README.md +0 -0
  135. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/SetupDict.py +0 -0
  136. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/baseline.json +0 -0
  137. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/mediar_example.json +0 -0
  138. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/pred/pred_mediar.json +0 -0
  139. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step1_pretraining/phase1.json +0 -0
  140. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step1_pretraining/phase2.json +0 -0
  141. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning1.json +0 -0
  142. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step2_finetuning/finetuning2.json +0 -0
  143. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step3_prediction/base_prediction.json +0 -0
  144. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/config/step3_prediction/ensemble_tta.json +0 -0
  145. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/BasePredictor.py +0 -0
  146. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/BaseTrainer.py +0 -0
  147. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/Baseline/Predictor.py +0 -0
  148. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/Baseline/Trainer.py +0 -0
  149. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/Baseline/__init__.py +0 -0
  150. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/Baseline/utils.py +0 -0
  151. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/MEDIAR/EnsemblePredictor.py +0 -0
  152. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/MEDIAR/Predictor.py +0 -0
  153. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/MEDIAR/Trainer.py +0 -0
  154. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/MEDIAR/__init__.py +0 -0
  155. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/MEDIAR/utils.py +0 -0
  156. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/__init__.py +0 -0
  157. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/core/utils.py +0 -0
  158. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/evaluate.py +0 -0
  159. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/generate_mapping.py +0 -0
  160. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/examples/img1.tiff +0 -0
  161. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/examples/img2.tif +0 -0
  162. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/failure_cases.png +0 -0
  163. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/mediar_framework.png +0 -0
  164. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/mediar_model.PNG +0 -0
  165. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/image/mediar_results.png +0 -0
  166. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/main.py +0 -0
  167. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/predict.py +0 -0
  168. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/requirements.txt +0 -0
  169. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/__init__.py +0 -0
  170. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/__init__.py +0 -0
  171. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/custom/CellAware.py +0 -0
  172. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/custom/LoadImage.py +0 -0
  173. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/custom/NormalizeImage.py +0 -0
  174. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/custom/__init__.py +0 -0
  175. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/custom/modalities.pkl +0 -0
  176. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/datasetter.py +0 -0
  177. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/transforms.py +0 -0
  178. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/data_utils/utils.py +0 -0
  179. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/measures.py +0 -0
  180. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/models/MEDIARFormer.py +0 -0
  181. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/models/__init__.py +0 -0
  182. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/MEDIAR/train_tools/utils.py +0 -0
  183. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/data/lopit.csv +0 -0
  184. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/data/toxoplasma_metadata.csv +0 -0
  185. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/OFL.txt +0 -0
  186. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/OpenSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  187. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/OpenSans-VariableFont_wdth,wght.ttf +0 -0
  188. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/README.txt +0 -0
  189. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-Bold.ttf +0 -0
  190. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-BoldItalic.ttf +0 -0
  191. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-ExtraBold.ttf +0 -0
  192. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-ExtraBoldItalic.ttf +0 -0
  193. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-Italic.ttf +0 -0
  194. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-Light.ttf +0 -0
  195. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-LightItalic.ttf +0 -0
  196. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-Medium.ttf +0 -0
  197. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-MediumItalic.ttf +0 -0
  198. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-Regular.ttf +0 -0
  199. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-SemiBold.ttf +0 -0
  200. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans-SemiBoldItalic.ttf +0 -0
  201. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Bold.ttf +0 -0
  202. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-BoldItalic.ttf +0 -0
  203. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBold.ttf +0 -0
  204. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-ExtraBoldItalic.ttf +0 -0
  205. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Italic.ttf +0 -0
  206. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Light.ttf +0 -0
  207. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-LightItalic.ttf +0 -0
  208. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Medium.ttf +0 -0
  209. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-MediumItalic.ttf +0 -0
  210. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-Regular.ttf +0 -0
  211. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBold.ttf +0 -0
  212. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_Condensed-SemiBoldItalic.ttf +0 -0
  213. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Bold.ttf +0 -0
  214. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-BoldItalic.ttf +0 -0
  215. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBold.ttf +0 -0
  216. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-ExtraBoldItalic.ttf +0 -0
  217. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Italic.ttf +0 -0
  218. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Light.ttf +0 -0
  219. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-LightItalic.ttf +0 -0
  220. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Medium.ttf +0 -0
  221. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-MediumItalic.ttf +0 -0
  222. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-Regular.ttf +0 -0
  223. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBold.ttf +0 -0
  224. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/font/open_sans/static/OpenSans_SemiCondensed-SemiBoldItalic.ttf +0 -0
  225. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/abort.png +0 -0
  226. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/annotate.png +0 -0
  227. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/cellpose_all.png +0 -0
  228. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/cellpose_masks.png +0 -0
  229. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/classify.png +0 -0
  230. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/convert.png +0 -0
  231. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/default.png +0 -0
  232. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/dna_matrix.mp4 +0 -0
  233. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/download.png +0 -0
  234. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/logo.pdf +0 -0
  235. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/logo_spacr.png +0 -0
  236. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/logo_spacr_1.png +0 -0
  237. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/make_masks.png +0 -0
  238. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/map_barcodes.png +0 -0
  239. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/mask.png +0 -0
  240. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/measure.png +0 -0
  241. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/ml_analyze.png +0 -0
  242. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/plaque.png +0 -0
  243. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/recruitment.png +0 -0
  244. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/regression.png +0 -0
  245. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/run.png +0 -0
  246. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/sequencing.png +0 -0
  247. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/settings.png +0 -0
  248. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/train_cellpose.png +0 -0
  249. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/icons/umap.png +0 -0
  250. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/images/plate1_E01_T0001F001L01A01Z01C02.tif +0 -0
  251. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/images/plate1_E01_T0001F001L01A02Z01C01.tif +0 -0
  252. {spacr-0.3.38 → spacr-0.3.42}/spacr/resources/images/plate1_E01_T0001F001L01A03Z01C03.tif +0 -0
  253. {spacr-0.3.38 → spacr-0.3.42}/spacr/sequencing.py +0 -0
  254. {spacr-0.3.38 → spacr-0.3.42}/spacr/sim.py +0 -0
  255. {spacr-0.3.38 → spacr-0.3.42}/spacr/submodules.py +0 -0
  256. {spacr-0.3.38 → spacr-0.3.42}/spacr/timelapse.py +0 -0
  257. {spacr-0.3.38 → spacr-0.3.42}/spacr/version.py +0 -0
  258. {spacr-0.3.38 → spacr-0.3.42}/spacr.egg-info/SOURCES.txt +0 -0
  259. {spacr-0.3.38 → spacr-0.3.42}/spacr.egg-info/dependency_links.txt +0 -0
  260. {spacr-0.3.38 → spacr-0.3.42}/spacr.egg-info/entry_points.txt +0 -0
  261. {spacr-0.3.38 → spacr-0.3.42}/spacr.egg-info/requires.txt +0 -0
  262. {spacr-0.3.38 → spacr-0.3.42}/spacr.egg-info/top_level.txt +0 -0
  263. {spacr-0.3.38 → spacr-0.3.42}/tests/test_annotate_app.py +0 -0
  264. {spacr-0.3.38 → spacr-0.3.42}/tests/test_core.py +0 -0
  265. {spacr-0.3.38 → spacr-0.3.42}/tests/test_gui_classify_app.py +0 -0
  266. {spacr-0.3.38 → spacr-0.3.42}/tests/test_gui_mask_app.py +0 -0
  267. {spacr-0.3.38 → spacr-0.3.42}/tests/test_gui_measure_app.py +0 -0
  268. {spacr-0.3.38 → spacr-0.3.42}/tests/test_gui_sim_app.py +0 -0
  269. {spacr-0.3.38 → spacr-0.3.42}/tests/test_gui_utils.py +0 -0
  270. {spacr-0.3.38 → spacr-0.3.42}/tests/test_io.py +0 -0
  271. {spacr-0.3.38 → spacr-0.3.42}/tests/test_mask_app.py +0 -0
  272. {spacr-0.3.38 → spacr-0.3.42}/tests/test_measure.py +0 -0
  273. {spacr-0.3.38 → spacr-0.3.42}/tests/test_plot.py +0 -0
  274. {spacr-0.3.38 → spacr-0.3.42}/tests/test_sim.py +0 -0
  275. {spacr-0.3.38 → spacr-0.3.42}/tests/test_timelapse.py +0 -0
  276. {spacr-0.3.38 → spacr-0.3.42}/tests/test_train.py +0 -0
  277. {spacr-0.3.38 → spacr-0.3.42}/tests/test_umap.py +0 -0
  278. {spacr-0.3.38 → spacr-0.3.42}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: spacr
3
- Version: 0.3.38
3
+ Version: 0.3.42
4
4
  Summary: Spatial phenotype analysis of crisp screens (SpaCr)
5
5
  Home-page: https://github.com/EinarOlafsson/spacr
6
6
  Author: Einar Birnir Olafsson
@@ -67,7 +67,7 @@ dependencies = [
67
67
 
68
68
  setup(
69
69
  name="spacr",
70
- version="0.3.38",
70
+ version="0.3.42",
71
71
  author="Einar Birnir Olafsson",
72
72
  author_email="olafsson@med.umich.com",
73
73
  description="Spatial phenotype analysis of crisp screens (SpaCr)",
@@ -143,7 +143,7 @@ def preprocess_generate_masks(src, settings={}):
143
143
  start = time.time()
144
144
  if i+1 <= settings['examples_to_plot']:
145
145
  file_path = os.path.join(merged_src, file)
146
- plot_image_mask_overlay(file_path, settings['channels'], settings['cell_channel'], settings['nucleus_channel'], settings['pathogen_channel'], figuresize=10, normalize=True, thickness=3, save_pdf=True)
146
+ plot_image_mask_overlay(file_path, settings['channels'], settings['cell_channel'], settings['nucleus_channel'], settings['pathogen_channel'], figuresize=10, percentiles=(1,99), thickness=3, save_pdf=True)
147
147
  stop = time.time()
148
148
  duration = stop-start
149
149
  time_ls.append(duration)
@@ -1686,11 +1686,16 @@ def preprocess_img_data(settings):
1686
1686
  print(f'Found {extension_counts[most_common_extension]} {most_common_extension} files')
1687
1687
  else:
1688
1688
  print(f'Could not find any {valid_ext} files in {src} only found {extension_counts[0]}')
1689
- if os.path.exists(src+'/stack'):
1689
+
1690
+
1691
+
1692
+
1693
+
1694
+ if os.path.exists(os.path.join(src,'stack')):
1690
1695
  print('Found existing stack folder.')
1691
- if os.path.exists(src+'/channel_stack'):
1696
+ if os.path.exists(os.path.join(src,'channel_stack')):
1692
1697
  print('Found existing channel_stack folder.')
1693
- if os.path.exists(src+'/norm_channel_stack'):
1698
+ if os.path.exists(os.path.join(src,'norm_channel_stack')):
1694
1699
  print('Found existing norm_channel_stack folder. Skipping preprocessing')
1695
1700
  return settings, src
1696
1701
 
@@ -1713,12 +1718,13 @@ def preprocess_img_data(settings):
1713
1718
 
1714
1719
  src = _run_test_mode(settings['src'], regex, timelapse, test_images, random_test)
1715
1720
  settings['src'] = src
1716
-
1721
+
1722
+ stack_path = os.path.join(src, 'stack')
1717
1723
  if img_format == None:
1718
- if not os.path.exists(src+'/stack'):
1724
+ if not os.path.exists(stack_path):
1719
1725
  _merge_channels(src, plot=False)
1720
-
1721
- if not os.path.exists(src+'/stack'):
1726
+
1727
+ if not os.path.exists(stack_path):
1722
1728
  try:
1723
1729
  if not img_format == None:
1724
1730
  if timelapse:
@@ -1727,7 +1733,7 @@ def preprocess_img_data(settings):
1727
1733
  _rename_and_organize_image_files(src, regex, batch_size, pick_slice, skip_mode, metadata_type, img_format)
1728
1734
 
1729
1735
  #Make sure no batches will be of only one image
1730
- all_imgs = len(src+'/stack')
1736
+ all_imgs = len(stack_path)
1731
1737
  full_batches = all_imgs // batch_size
1732
1738
  last_batch_size = all_imgs % batch_size
1733
1739
 
@@ -1738,26 +1744,27 @@ def preprocess_img_data(settings):
1738
1744
  raise ValueError("Only one batch of size 1 detected. Adjust the batch size.")
1739
1745
  # If the last batch is of size 1, merge it with the second last batch
1740
1746
  elif full_batches > 0:
1747
+ print(f"all images: {all_imgs}, full batch: {full_batches}, last batch: {last_batch_size}")
1741
1748
  raise ValueError("Last batch of size 1 detected. Adjust the batch size.")
1742
1749
 
1743
1750
  _merge_channels(src, plot=False)
1744
1751
 
1745
1752
  if timelapse:
1746
- _create_movies_from_npy_per_channel(src+'/stack', fps=2)
1753
+ _create_movies_from_npy_per_channel(stack_path, fps=2)
1747
1754
 
1748
1755
  if plot:
1749
1756
  print(f'plotting {nr} images from {src}/stack')
1750
- plot_arrays(src+'/stack', figuresize, cmap, nr=nr, normalize=normalize)
1757
+ plot_arrays(stack_path, figuresize, cmap, nr=nr, normalize=normalize)
1751
1758
 
1752
1759
  if all_to_mip:
1753
- _mip_all(src+'/stack')
1760
+ _mip_all(stack_path)
1754
1761
  if plot:
1755
1762
  print(f'plotting {nr} images from {src}/stack')
1756
- plot_arrays(src+'/stack', figuresize, cmap, nr=nr, normalize=normalize)
1763
+ plot_arrays(stack_path, figuresize, cmap, nr=nr, normalize=normalize)
1757
1764
  except Exception as e:
1758
1765
  print(f"Error: {e}")
1759
1766
 
1760
- concatenate_and_normalize(src=src+'/stack',
1767
+ concatenate_and_normalize(src=stack_path,
1761
1768
  channels=mask_channels,
1762
1769
  save_dtype=np.float32,
1763
1770
  settings=settings)
@@ -710,7 +710,7 @@ def _measure_crop_core(index, time_ls, file, settings):
710
710
  else:
711
711
  cell_mask = np.zeros_like(data[:, :, 0])
712
712
  settings['cytoplasm'] = False
713
- settings['include_uninfected'] = True
713
+ settings['uninfected'] = True
714
714
 
715
715
  if settings['nucleus_mask_dim'] is not None:
716
716
  nucleus_mask = data[:, :, settings['nucleus_mask_dim']].astype(data_type)
@@ -762,7 +762,7 @@ def _measure_crop_core(index, time_ls, file, settings):
762
762
  cytoplasm_mask = _filter_object(cytoplasm_mask, settings['cytoplasm_min_size'])
763
763
 
764
764
  if settings['cell_mask_dim'] is not None:
765
- cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask = _exclude_objects(cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask, include_uninfected=settings['include_uninfected'])
765
+ cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask = _exclude_objects(cell_mask, nucleus_mask, pathogen_mask, cytoplasm_mask, uninfected=settings['uninfected'])
766
766
 
767
767
  # Update data with the new masks
768
768
  if settings['cell_mask_dim'] is not None:
@@ -979,9 +979,9 @@ def measure_crop(settings):
979
979
  #_create_database(source_folder+'/measurements/measurements.db')
980
980
 
981
981
  if settings['cell_mask_dim'] is None:
982
- settings['include_uninfected'] = True
982
+ settings['uninfected'] = True
983
983
  if settings['pathogen_mask_dim'] is None:
984
- settings['include_uninfected'] = True
984
+ settings['uninfected'] = True
985
985
  if settings['cell_mask_dim'] is not None and settings['pathogen_min_size'] is not None:
986
986
  settings['cytoplasm'] = True
987
987
  elif settings['cell_mask_dim'] is not None and settings['nucleus_min_size'] is not None:
@@ -134,7 +134,7 @@ def scale_variables(X, y):
134
134
 
135
135
  return X_scaled, y_scaled
136
136
 
137
- def process_model_coefficients(model, regression_type, X, y, highlight):
137
+ def process_model_coefficients(model, regression_type, X, y, nc, pc, controls):
138
138
  """Return DataFrame of model coefficients and p-values."""
139
139
  if regression_type in ['ols', 'gls', 'wls', 'rlm', 'glm', 'mixed', 'quantile', 'logit', 'probit', 'poisson']:
140
140
  coefs = model.params
@@ -169,8 +169,8 @@ def process_model_coefficients(model, regression_type, X, y, highlight):
169
169
  coef_df['p_value'] = np.nan # Placeholder since sklearn doesn't provide p-values
170
170
 
171
171
  coef_df['-log10(p_value)'] = -np.log10(coef_df['p_value'])
172
- coef_df['highlight'] = coef_df['feature'].apply(lambda x: highlight in x)
173
-
172
+ coef_df['grna'] = coef_df['feature'].str.extract(r'\[(.*?)\]')[0]
173
+ coef_df['condition'] = coef_df.apply(lambda row: 'nc' if nc in row['feature'] else 'pc' if pc in row['feature'] else ('control' if row['grna'] in controls else 'other'),axis=1)
174
174
  return coef_df[~coef_df['feature'].str.contains('row|column')]
175
175
 
176
176
  def prepare_formula(dependent_variable, random_row_column_effects=False):
@@ -284,15 +284,13 @@ def check_and_clean_data(df, dependent_variable):
284
284
  df_cleaned['row'] = df['row']
285
285
  df_cleaned['column'] = df['column']
286
286
 
287
- #display(df_cleaned)
288
-
289
287
  # Create a new column 'gene_fraction' that sums the fractions by gene within the same well
290
288
  df_cleaned['gene_fraction'] = df_cleaned.groupby(['prc', 'gene'])['fraction'].transform('sum')
291
289
 
292
290
  print("Data is ready for model fitting.")
293
291
  return df_cleaned
294
292
 
295
- def regression(df, csv_path, dependent_variable='predictions', regression_type=None, alpha=1.0, random_row_column_effects=False, highlight='220950', dst=None, cov_type=None):
293
+ def regression(df, csv_path, dependent_variable='predictions', regression_type=None, alpha=1.0, random_row_column_effects=False, nc='233460', pc='220950', controls=[''], dst=None, cov_type=None, plot=False):
296
294
  from .plot import volcano_plot, plot_histogram
297
295
 
298
296
  # Generate the volcano filename
@@ -312,9 +310,7 @@ def regression(df, csv_path, dependent_variable='predictions', regression_type=N
312
310
  if regression_type is None:
313
311
  regression_type = 'ols' if is_normal else 'glm'
314
312
 
315
- #display('before check_and_clean_data:',df)
316
313
  df = check_and_clean_data(df, dependent_variable)
317
- #display('after check_and_clean_data:',df)
318
314
 
319
315
  # Handle mixed effects if row/column effect is treated as random
320
316
  if random_row_column_effects:
@@ -340,10 +336,10 @@ def regression(df, csv_path, dependent_variable='predictions', regression_type=N
340
336
  model = regression_model(X, y, regression_type=regression_type, groups=groups, alpha=alpha, cov_type=cov_type)
341
337
 
342
338
  # Process the model coefficients
343
- coef_df = process_model_coefficients(model, regression_type, X, y, highlight)
344
-
345
- # Plot the volcano plot
346
- volcano_plot(coef_df, volcano_path)
339
+ coef_df = process_model_coefficients(model, regression_type, X, y, nc, pc, controls)
340
+
341
+ if plot:
342
+ volcano_plot(coef_df, volcano_path)
347
343
 
348
344
  return model, coef_df
349
345
 
@@ -453,26 +449,28 @@ def perform_regression(settings):
453
449
  return df, n_gene
454
450
  else:
455
451
  return df
452
+
453
+
456
454
 
457
455
  settings = get_perform_regression_default_settings(settings)
458
456
  count_data_df, score_data_df = _perform_regression_read_data(settings)
459
457
  results_path, results_path_gene, results_path_grna, hits_path, res_folder, csv_path = _perform_regression_set_paths(settings)
460
458
  save_settings(settings, name='regression', show=True)
459
+
460
+ if isinstance(settings['filter_value'], list):
461
+ filter_value = settings['filter_value']
462
+ else:
463
+ filter_value = []
464
+ if isinstance(settings['filter_column'], str):
465
+ filter_column = settings['filter_column']
461
466
 
462
- score_data_df = clean_controls(score_data_df, settings['pc'], settings['nc'], settings['other'])
467
+ score_data_df = clean_controls(score_data_df, settings['filter_value'], settings['filter_column'])
463
468
  print(f"Dependent variable after clean_controls: {len(score_data_df)}")
464
469
 
465
470
  dependent_df, dependent_variable = process_scores(score_data_df, settings['dependent_variable'], settings['plate'], settings['min_cell_count'], settings['agg_type'], settings['transform'])
466
471
  print(f"Dependent variable after process_scores: {len(dependent_df)}")
467
472
 
468
- filter_value = [settings['nc'], settings['pc']]
469
-
470
- if settings['other'] is not None:
471
- if isinstance(settings['other'], str):
472
- settings['other'] = [settings['other']]
473
- filter_value.extend(settings['other'])
474
-
475
- independent_df = process_reads(count_data_df, settings['fraction_threshold'], settings['plate'], filter_column=settings['location_column'], filter_value=filter_value)
473
+ independent_df = process_reads(count_data_df, settings['fraction_threshold'], settings['plate'], filter_column=filter_column, filter_value=filter_value)
476
474
  independent_df, n_grna, n_gene = _count_variable_instances(independent_df, column_1='grna', column_2='gene')
477
475
 
478
476
  print(f"Independent variable after process_reads: {len(independent_df)}")
@@ -487,19 +485,30 @@ def perform_regression(settings):
487
485
  if settings['transform'] is None:
488
486
  _ = plot_plates(score_data_df, variable=dependent_variable, grouping='mean', min_max='allq', cmap='viridis', min_count=settings['min_cell_count'], dst = res_folder)
489
487
 
490
- model, coef_df = regression(merged_df, csv_path, dependent_variable, settings['regression_type'], settings['alpha'], settings['random_row_column_effects'], highlight=settings['highlight'], dst=res_folder, cov_type=settings['cov_type'])
488
+ model, coef_df = regression(merged_df, csv_path, dependent_variable, settings['regression_type'], settings['alpha'], settings['random_row_column_effects'], nc=settings['negative_control'], pc=settings['positive_control'], controls=settings['controls'], dst=res_folder, cov_type=settings['cov_type'])
491
489
 
492
490
  coef_df['grna'] = coef_df['feature'].apply(lambda x: re.search(r'grna\[(.*?)\]', x).group(1) if 'grna' in x else None)
493
491
  coef_df['gene'] = coef_df['feature'].apply(lambda x: re.search(r'gene\[(.*?)\]', x).group(1) if 'gene' in x else None)
494
492
  coef_df = coef_df.merge(n_grna, how='left', on='grna')
495
493
  coef_df = coef_df.merge(n_gene, how='left', on='gene')
496
- display(coef_df)
497
494
 
498
495
  gene_coef_df = coef_df[coef_df['n_gene'] != None]
499
496
  grna_coef_df = coef_df[coef_df['n_grna'] != None]
500
497
  gene_coef_df = gene_coef_df.dropna(subset=['n_gene'])
501
498
  grna_coef_df = grna_coef_df.dropna(subset=['n_grna'])
502
499
 
500
+ if settings['controls'] is not None:
501
+ control_coef_df = grna_coef_df[grna_coef_df['grna'].isin(settings['controls'])]
502
+ mean_coef = control_coef_df['coefficient'].mean()
503
+
504
+ if settings['threshold_method'] in ['var','variance']:
505
+ coef_mes = control_coef_df['coefficient'].var()
506
+ elif settings['threshold_method'] in ['std', 'standard_deveation']:
507
+ coef_mes = control_coef_df['coefficient'].std()
508
+ else:
509
+ raise ValueError(f"Unsupported threshold method {settings['threshold_method']}. Supported methods: ['var','variance','std','standard_deveation']")
510
+ reg_threshold = mean_coef + (settings['threshold_multiplier'] * coef_mes)
511
+
503
512
  coef_df.to_csv(results_path, index=False)
504
513
  gene_coef_df.to_csv(results_path_gene, index=False)
505
514
  grna_coef_df.to_csv(results_path_grna, index=False)
@@ -509,7 +518,10 @@ def perform_regression(settings):
509
518
 
510
519
  else:
511
520
  significant = coef_df[coef_df['p_value']<= 0.05]
512
- #significant = significant[significant['coefficient'] > 0.1]
521
+ if settings['controls'] is not None:
522
+ significant_high = significant[significant['coefficient'] >= reg_threshold]
523
+ significant_low = significant[significant['coefficient'] <= reg_threshold]
524
+ significant = pd.concat([significant_high, significant_low])
513
525
  significant.sort_values(by='coefficient', ascending=False, inplace=True)
514
526
  significant = significant[~significant['feature'].str.contains('row|column')]
515
527
 
@@ -530,22 +542,24 @@ def perform_regression(settings):
530
542
  grna_merged_df = merge_regression_res_with_metadata(results_path_grna, metadata_file, name=filename)
531
543
 
532
544
  if settings['toxo']:
533
-
534
545
  data_path = merged_df
535
546
  data_path_gene = gene_merged_df
536
547
  data_path_grna = grna_merged_df
537
548
  base_dir = os.path.dirname(os.path.abspath(__file__))
538
549
  metadata_path = os.path.join(base_dir, 'resources', 'data', 'lopit.csv')
539
-
540
- custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', string_list=[settings['highlight']], point_size=50, figsize=20)
541
- custom_volcano_plot(data_path_gene, metadata_path, metadata_column='tagm_location', string_list=[settings['highlight']], point_size=50, figsize=20)
542
- custom_volcano_plot(data_path_grna, metadata_path, metadata_column='tagm_location', string_list=[settings['highlight']], point_size=50, figsize=20)
543
550
 
544
- if len(significant) > 2:
545
- metadata_path = os.path.join(base_dir, 'resources', 'data', 'toxoplasma_metadata.csv')
546
- go_term_enrichment_by_column(significant, metadata_path)
551
+ custom_volcano_plot(data_path, metadata_path, metadata_column='tagm_location', point_size=200, figsize=20, threshold=reg_threshold, split_axis_lims=settings['split_axis_lims'])
552
+ #custom_volcano_plot(data_path_gene, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
553
+ #custom_volcano_plot(data_path_grna, metadata_path, metadata_column='tagm_location', point_size=50, figsize=20, threshold=reg_threshold)
554
+
555
+ #if len(significant) > 2:
556
+ # metadata_path = os.path.join(base_dir, 'resources', 'data', 'toxoplasma_metadata.csv')
557
+ # go_term_enrichment_by_column(significant, metadata_path)
547
558
 
548
559
  print('Significant Genes')
560
+ grnas = significant['grna'].unique().tolist()
561
+ genes = significant['gene'].unique().tolist()
562
+ print(f"Found p<0.05 coedfficients for {len(grnas)} gRNAs and {len(genes)} genes")
549
563
  display(significant)
550
564
 
551
565
  output = {'results':coef_df,
@@ -586,7 +600,7 @@ def process_reads(csv_path, fraction_threshold, plate, filter_column=None, filte
586
600
  if isinstance(filter_value, str):
587
601
  filter_value = [filter_value]
588
602
 
589
- if isinstance(filter_column, list):
603
+ if isinstance(filter_column, list):
590
604
  for filter_col in filter_column:
591
605
  for value in filter_value:
592
606
  csv_df = csv_df[csv_df[filter_col] != value]
@@ -649,16 +663,12 @@ def check_normality(data, variable_name, verbose=False):
649
663
  print(f"Normal distribution: The data for {variable_name} is not normally distributed.")
650
664
  return False
651
665
 
652
- def clean_controls(df,pc,nc,other):
653
- if 'col' in df.columns:
654
- df['column'] = df['col']
655
- if nc != None:
656
- df = df[~df['column'].isin([nc])]
657
- if pc != None:
658
- df = df[~df['column'].isin([pc])]
659
- if other != None:
660
- df = df[~df['column'].isin([other])]
661
- print(f'Removed data from {nc, pc, other}')
666
+ def clean_controls(df,values, column):
667
+ if column in df.columns:
668
+ if isinstance(values, list):
669
+ for value in values:
670
+ df = df[~df[column].isin([value])]
671
+ print(f'Removed data from {value}')
662
672
  return df
663
673
 
664
674
  def process_scores(df, dependent_variable, plate, min_cell_count=25, agg_type='mean', transform=None, regression_type='ols'):
@@ -763,7 +773,6 @@ def generate_ml_scores(settings):
763
773
  raise ValueError("The 'png_list_df' DataFrame must contain 'prcfo' and 'test' columns.")
764
774
  annotated_df = png_list_df[['prcfo', settings['annotation_column']]].set_index('prcfo')
765
775
  df = annotated_df.merge(df, left_index=True, right_index=True)
766
- #display(df)
767
776
  unique_values = df[settings['annotation_column']].dropna().unique()
768
777
  if len(unique_values) == 1:
769
778
  unannotated_rows = df[df[settings['annotation_column']].isna()].index