junifer 0.0.2.dev138__tar.gz → 0.0.2.dev140__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 (275) hide show
  1. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/PKG-INFO +1 -1
  2. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/changes/latest.inc +3 -0
  3. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/using/index.rst +15 -1
  4. junifer-0.0.2.dev140/docs/using/masks.rst +68 -0
  5. junifer-0.0.2.dev140/junifer/_version.py +4 -0
  6. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/masks.py +102 -30
  7. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/tests/test_masks.py +166 -8
  8. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/id1000.py +33 -1
  9. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/piop1.py +14 -0
  10. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/piop2.py +35 -1
  11. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/tests/test_id1000.py +6 -0
  12. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/tests/test_piop1.py +6 -0
  13. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/tests/test_piop2.py +6 -1
  14. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/ets_rss.py +8 -8
  15. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/falff_parcels.py +7 -7
  16. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/falff_spheres.py +8 -8
  17. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +8 -8
  18. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +7 -7
  19. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +8 -8
  20. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/functional_connectivity_base.py +7 -7
  21. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/functional_connectivity_parcels.py +7 -7
  22. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/functional_connectivity_spheres.py +8 -8
  23. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_base.py +4 -2
  24. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/parcel_aggregation.py +11 -9
  25. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/reho_parcels.py +8 -8
  26. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/reho_spheres.py +8 -8
  27. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/sphere_aggregation.py +11 -9
  28. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_collection.py +8 -6
  29. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_marker_utils.py +2 -1
  30. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_parcel_aggregation.py +2 -2
  31. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_sphere_aggregation.py +1 -1
  32. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/utils.py +10 -10
  33. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/base.py +11 -1
  34. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/confounds/fmriprep_confound_remover.py +31 -24
  35. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +59 -3
  36. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/PKG-INFO +1 -1
  37. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/SOURCES.txt +1 -0
  38. junifer-0.0.2.dev140/tools/create_aomic1000_example_dataset.py +101 -0
  39. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tools/create_aomicpiop1_example_dataset.py +16 -16
  40. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tools/create_aomicpiop2_example_dataset.py +16 -16
  41. junifer-0.0.2.dev138/junifer/_version.py +0 -4
  42. junifer-0.0.2.dev138/tools/create_aomic1000_example_dataset.py +0 -75
  43. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  44. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  45. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/dataset-request.yml +0 -0
  46. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/documention-request.yml +0 -0
  47. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  48. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/ISSUE_TEMPLATE/marker-request.yml +0 -0
  49. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/pull_request_template.md +0 -0
  50. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/ci-docs.yml +0 -0
  51. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/ci.yml +0 -0
  52. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/docs-preview.yml +0 -0
  53. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/docs.yml +0 -0
  54. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/lint.yml +0 -0
  55. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.github/workflows/pypi.yml +0 -0
  56. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/.gitignore +0 -0
  57. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/AUTHORS.rst +0 -0
  58. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/LICENSE.md +0 -0
  59. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/README.md +0 -0
  60. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/codecov.yml +0 -0
  61. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/conda-env.yml +0 -0
  62. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/Makefile +0 -0
  63. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/_static/css/custom.css +0 -0
  64. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/_static/js/custom.js +0 -0
  65. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/_templates/versions.html +0 -0
  66. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/api.rst +0 -0
  67. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/configs.rst +0 -0
  68. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/data.rst +0 -0
  69. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/datagrabbers.rst +0 -0
  70. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/datareaders.rst +0 -0
  71. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/index.rst +0 -0
  72. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/markers.rst +0 -0
  73. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/pipeline.rst +0 -0
  74. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/preprocessing.rst +0 -0
  75. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/stats.rst +0 -0
  76. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/storage.rst +0 -0
  77. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/testing.rst +0 -0
  78. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/api/utils.rst +0 -0
  79. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/builtin.rst +0 -0
  80. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/changes/0.0.1.inc +0 -0
  81. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/changes/contributors.inc +0 -0
  82. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/conf.py +0 -0
  83. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/contribution.rst +0 -0
  84. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/extending/datagrabber.rst +0 -0
  85. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/extending/extension.rst +0 -0
  86. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/extending/index.rst +0 -0
  87. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/extending/marker.rst +0 -0
  88. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/faq.rst +0 -0
  89. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/images/junifer_logo.png +0 -0
  90. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/images/pipeline/pipeline.001.png +0 -0
  91. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/images/pipeline/pipeline.002.png +0 -0
  92. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/index.rst +0 -0
  93. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/installation.rst +0 -0
  94. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/links.inc +0 -0
  95. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/maintaining.rst +0 -0
  96. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/redirect.html +0 -0
  97. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/sphinxext/gh_substitutions.py +0 -0
  98. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/data.rst +0 -0
  99. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/datagrabber.rst +0 -0
  100. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/datareader.rst +0 -0
  101. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/index.rst +0 -0
  102. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/marker.rst +0 -0
  103. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/pipeline.rst +0 -0
  104. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/preprocess.rst +0 -0
  105. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/understanding/storage.rst +0 -0
  106. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/using/codeless.rst +0 -0
  107. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/using/queueing.rst +0 -0
  108. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/using/running.rst +0 -0
  109. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/docs/whats_new.rst +0 -0
  110. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/README.rst +0 -0
  111. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/norun_hcpfc_pearson.py +0 -0
  112. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/norun_ukbvm_gmd.py +0 -0
  113. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/run_compute_parcel_mean.py +0 -0
  114. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/run_datagrabber_bids_datalad.py +0 -0
  115. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/run_ets_rss_marker.py +0 -0
  116. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/run_junifer_julearn.py +0 -0
  117. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/run_run_gmd_mean.py +0 -0
  118. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/yamls/gmd_mean.yaml +0 -0
  119. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/yamls/gmd_mean_htcondor.yaml +0 -0
  120. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/examples/yamls/ukb_gmd_mean.yaml +0 -0
  121. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/ignore_words.txt +0 -0
  122. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/__init__.py +0 -0
  123. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/__init__.py +0 -0
  124. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/cli.py +0 -0
  125. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/decorators.py +0 -0
  126. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/functions.py +0 -0
  127. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/parser.py +0 -0
  128. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/afni/3dAFNItoNIFTI +0 -0
  129. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/afni/3dRSFC +0 -0
  130. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/afni/3dReHo +0 -0
  131. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/afni/afni +0 -0
  132. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/afni/run_afni_docker.sh +0 -0
  133. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/res/run_conda.sh +0 -0
  134. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/data/gmd_mean.yaml +0 -0
  135. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/data/gmd_mean_htcondor.yaml +0 -0
  136. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/test_api_utils.py +0 -0
  137. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/test_cli.py +0 -0
  138. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/test_functions.py +0 -0
  139. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/tests/test_parser.py +0 -0
  140. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/api/utils.py +0 -0
  141. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/__init__.py +0 -0
  142. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/__init__.py +0 -0
  143. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/__init__.py +0 -0
  144. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +0 -0
  145. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/camcan_vbm.py +0 -0
  146. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/ixi_vbm.py +0 -0
  147. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py +0 -0
  148. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/tests/test_camcan_vbm.py +0 -0
  149. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -0
  150. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/tests/test_ucla.py +0 -0
  151. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py +0 -0
  152. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/ucla.py +0 -0
  153. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/juseless/datagrabbers/ukb_vbm.py +0 -0
  154. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/configs/tests/test_juseless.py +0 -0
  155. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/CogAC_VOIs.txt +0 -0
  156. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/CogAR_VOIs.txt +0 -0
  157. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/DMNBuckner_VOIs.txt +0 -0
  158. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Dosenbach2010_MNI_VOIs.txt +0 -0
  159. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Empathy_VOIs.txt +0 -0
  160. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Motor_VOIs.txt +0 -0
  161. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/MultiTask_VOIs.txt +0 -0
  162. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/PhysioStress_VOIs.txt +0 -0
  163. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Power2011_MNI_VOIs.txt +0 -0
  164. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Rew_VOIs.txt +0 -0
  165. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/Somatosensory_VOIs.txt +0 -0
  166. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/ToM_VOIs.txt +0 -0
  167. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/VigAtt_VOIs.txt +0 -0
  168. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/WM_VOIs.txt +0 -0
  169. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/eMDN_VOIs.txt +0 -0
  170. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/eSAD_VOIs.txt +0 -0
  171. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/VOIs/meta/extDMN_VOIs.txt +0 -0
  172. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/__init__.py +0 -0
  173. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/coordinates.py +0 -0
  174. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/masks/vickery-patil/CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean.nii.gz +0 -0
  175. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/masks/vickery-patil/CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean_3mm.nii.gz +0 -0
  176. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/masks/vickery-patil/GMprob0.2_cortex_3mm_NA_rm.nii.gz +0 -0
  177. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/parcellations.py +0 -0
  178. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/tests/test_coordinates.py +0 -0
  179. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/tests/test_data_utils.py +0 -0
  180. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/tests/test_parcellations.py +0 -0
  181. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/data/utils.py +0 -0
  182. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/__init__.py +0 -0
  183. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/aomic/__init__.py +0 -0
  184. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/base.py +0 -0
  185. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/datalad_base.py +0 -0
  186. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/hcp.py +0 -0
  187. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/multiple.py +0 -0
  188. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/pattern.py +0 -0
  189. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/pattern_datalad.py +0 -0
  190. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_base.py +0 -0
  191. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_datagrabber_utils.py +0 -0
  192. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_datalad_base.py +0 -0
  193. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_hcp.py +0 -0
  194. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_multiple.py +0 -0
  195. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_pattern.py +0 -0
  196. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/tests/test_pattern_datalad.py +0 -0
  197. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datagrabber/utils.py +0 -0
  198. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datareader/__init__.py +0 -0
  199. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datareader/default.py +0 -0
  200. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/datareader/tests/test_default_reader.py +0 -0
  201. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/external/__init__.py +0 -0
  202. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/external/nilearn/__init__.py +0 -0
  203. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/external/nilearn/junifer_nifti_spheres_masker.py +0 -0
  204. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +0 -0
  205. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/__init__.py +0 -0
  206. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/base.py +0 -0
  207. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/collection.py +0 -0
  208. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/__init__.py +0 -0
  209. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/falff_base.py +0 -0
  210. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/falff_estimator.py +0 -0
  211. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/tests/test_falff_estimator.py +0 -0
  212. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/tests/test_falff_parcels.py +0 -0
  213. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/falff/tests/test_falff_spheres.py +0 -0
  214. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/__init__.py +0 -0
  215. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +0 -0
  216. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +0 -0
  217. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +0 -0
  218. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +0 -0
  219. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +0 -0
  220. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/__init__.py +0 -0
  221. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/reho_base.py +0 -0
  222. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/reho_estimator.py +0 -0
  223. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/tests/test_reho_estimator.py +0 -0
  224. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/tests/test_reho_parcels.py +0 -0
  225. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/reho/tests/test_reho_spheres.py +0 -0
  226. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_ets_rss.py +0 -0
  227. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/markers/tests/test_markers_base.py +0 -0
  228. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/__init__.py +0 -0
  229. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/pipeline_step_mixin.py +0 -0
  230. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/registry.py +0 -0
  231. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/tests/test_pipeline_step_mixin.py +0 -0
  232. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/tests/test_registry.py +0 -0
  233. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/tests/test_update_meta_mixin.py +0 -0
  234. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/update_meta_mixin.py +0 -0
  235. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/pipeline/utils.py +0 -0
  236. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/__init__.py +0 -0
  237. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/confounds/__init__.py +0 -0
  238. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/preprocess/tests/test_preprocess_base.py +0 -0
  239. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/stats.py +0 -0
  240. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/__init__.py +0 -0
  241. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/base.py +0 -0
  242. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/pandas_base.py +0 -0
  243. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/sqlite.py +0 -0
  244. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/tests/test_pandas_base.py +0 -0
  245. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/tests/test_sqlite.py +0 -0
  246. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/tests/test_storage_base.py +0 -0
  247. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/tests/test_utils.py +0 -0
  248. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/storage/utils.py +0 -0
  249. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/__init__.py +0 -0
  250. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv +0 -0
  251. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/datagrabbers.py +0 -0
  252. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/registry.py +0 -0
  253. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +0 -0
  254. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/tests/test_partlycloudytesting_datagrabber.py +0 -0
  255. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/tests/test_spmauditory_datagrabber.py +0 -0
  256. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/tests/test_testing_registry.py +0 -0
  257. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/testing/utils.py +0 -0
  258. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/tests/test_main.py +0 -0
  259. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/tests/test_stats.py +0 -0
  260. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/utils/__init__.py +0 -0
  261. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/utils/fs.py +0 -0
  262. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/utils/logging.py +0 -0
  263. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/utils/tests/test_fs.py +0 -0
  264. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer/utils/tests/test_logging.py +0 -0
  265. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/dependency_links.txt +0 -0
  266. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/entry_points.txt +0 -0
  267. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/requires.txt +0 -0
  268. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/junifer.egg-info/top_level.txt +0 -0
  269. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/pyproject.toml +0 -0
  270. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/setup.cfg +0 -0
  271. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/setup.py +0 -0
  272. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tools/create_bids_example_dataset.py +0 -0
  273. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tools/create_bids_example_dataset_sessions.py +0 -0
  274. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tools/create_hcp1200_example_dataset.py +0 -0
  275. {junifer-0.0.2.dev138 → junifer-0.0.2.dev140}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: junifer
3
- Version: 0.0.2.dev138
3
+ Version: 0.0.2.dev140
4
4
  Summary: JUelich NeuroImaging FEature extractoR
5
5
  Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  Maintainer-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
@@ -40,6 +40,9 @@ Enhancements
40
40
  - Add support for nilearn computed masks (``compute_epi_mask``, ``compute_brain_mask``, ``compute_background_mask``,
41
41
  ``fetch_icbm152_brain_gm_mask``) (:gh:`175` by `Fede Raimondo`_).
42
42
 
43
+ - Add fMRIPrep brain masks to the datagrabber patterns for all datagrabbers in the aomic sub-package
44
+ (:gh:`177` by `Leonard Sasse`_).
45
+
43
46
  Bugs
44
47
  ~~~~
45
48
 
@@ -15,4 +15,18 @@ the results. Finally, we will show how to use the ``queue`` command to interact
15
15
 
16
16
  codeless
17
17
  running
18
- queueing
18
+ queueing
19
+
20
+
21
+ .. _using_components:
22
+
23
+ Using junifer common components
24
+ -------------------------------
25
+
26
+ The following sections explains common components of junifer that can be used across many steps of the pipeline.
27
+
28
+ .. toctree::
29
+ :maxdepth: 2
30
+ :caption: Contents:
31
+
32
+ masks
@@ -0,0 +1,68 @@
1
+ .. include:: ../links.inc
2
+
3
+ .. _using_masks:
4
+
5
+ Masks
6
+ =====
7
+
8
+ Masks are essentially boolean arrays that are used to constrain the extraction of features to voxels that are
9
+ meaningful. For example, in an fMRI imaging study, a mask can be used to constrain the extraction of features to
10
+ voxels that contain a certain ratio of gray matter to white matter / cerebrospinal fluid, ensuring that the features
11
+ are not extracted from voxels that contain mostly white matter or cerebrospinal fluid, which could add noise to the
12
+ BOLD signal.
13
+
14
+ Junifer provides a number of built-in masks, which can be listed using the :func:`junifer.data.masks.list_masks`. Some
15
+ masks are images, while other masks can be computed using :ref:`nilearn` functions.
16
+
17
+ For markers and steps that accept ``masks`` as an argument, the mask can be specified as a string, which will be the
18
+ name of a built-in mask, or as a dictionary in which the **only** key is the built-in mask name and the value is a
19
+ dictionary of keyword arguments to pass to the mask function.
20
+
21
+ For example, the following is a valid mask specification that specified the ``GM_prob0.2`` mask.
22
+
23
+ .. code-block:: yaml
24
+
25
+ masks: GM_prob0.2
26
+
27
+ The following is a valid mask specification that specifies the ``compute_brain_mask`` mask (function from nilearn),
28
+ with a threshold of 0.5.
29
+
30
+ .. code-block:: yaml
31
+
32
+ masks:
33
+ compute_brain_mask:
34
+ threshold: 0.5
35
+
36
+ Furthermore, junifer allows you to combine several masks using :func:`nilearn.masking.intersect_masks`. This is done by
37
+ specifying a list of masks, where each mask is a string or dictionary as described above. For example, the following
38
+ is a valid mask specification that specifies the intersection of the ``GM_prob0.2`` and ``compute_brain_mask`` masks.
39
+
40
+ .. code-block:: yaml
41
+
42
+ masks:
43
+ - GM_prob0.2
44
+ - compute_brain_mask:
45
+ threshold: 0.5
46
+
47
+ We can also specify the arguments of :func:`nilearn.masking.intersect_masks` (``threshold`` and ``connected``). The
48
+ following example combines the same masks as the previous one, but computing the full intersection.
49
+
50
+
51
+ .. code-block:: yaml
52
+
53
+ masks:
54
+ - GM_prob0.2
55
+ - compute_brain_mask:
56
+ threshold: 0.5
57
+ - threshold: 1 # intersection
58
+
59
+ Alternatively, we can also compute the union, even if the voxels do not form a connected component:
60
+
61
+ .. code-block:: yaml
62
+
63
+ masks:
64
+ - GM_prob0.2
65
+ - compute_brain_mask:
66
+ threshold: 0.5
67
+ - threshold: 0 # union
68
+ - connected: False # keep disconnected components
@@ -0,0 +1,4 @@
1
+ # file generated by setuptools_scm
2
+ # don't change, don't track in version control
3
+ __version__ = version = '0.0.2.dev140'
4
+ __version_tuple__ = version_tuple = (0, 0, 2, 'dev140')
@@ -23,6 +23,7 @@ from nilearn.masking import (
23
23
  compute_background_mask,
24
24
  compute_brain_mask,
25
25
  compute_epi_mask,
26
+ intersect_masks,
26
27
  )
27
28
 
28
29
  from ..utils.logging import logger, raise_error
@@ -36,7 +37,10 @@ if TYPE_CHECKING:
36
37
  _masks_path = Path(__file__).parent / "masks"
37
38
 
38
39
 
39
- def _fetch_icbm152_brain_gm_mask(target_img: "Nifti1Image", **kwargs):
40
+ def _fetch_icbm152_brain_gm_mask(
41
+ target_img: "Nifti1Image",
42
+ **kwargs,
43
+ ):
40
44
  """Fetch ICBM152 brain mask and resample.
41
45
 
42
46
  Parameters
@@ -65,6 +69,9 @@ data.
65
69
 
66
70
  The built-in masks are files that are shipped with the package in the
67
71
  data/masks directory. The user can also register their own masks.
72
+
73
+ Callable masks should be functions that take at least one parameter:
74
+ * `target_img`: the image to which the mask will be applied.
68
75
  """
69
76
  _available_masks: Dict[str, Dict[str, Any]] = {
70
77
  "GM_prob0.2": {"family": "Vickery-Patil"},
@@ -146,19 +153,23 @@ def list_masks() -> List[str]:
146
153
 
147
154
 
148
155
  def get_mask(
149
- mask: Union[str, Dict],
156
+ masks: Union[str, Dict, List[Union[Dict, str]]],
150
157
  target_data: Dict[str, Any],
158
+ extra_input: Optional[Dict[str, Any]] = None,
151
159
  ) -> "Nifti1Image":
152
160
  """Get mask, tailored for the target image.
153
161
 
154
162
  Parameters
155
163
  ----------
156
- masks : str or dict
164
+ masks : str, dict or list of dict or str
157
165
  The name of the mask, or the name of a callable mask and the parameters
158
- of the mask.
166
+ of the mask as a dictionary. Several masks can be passed as a list.
159
167
  target_data : dict
160
168
  The corresponding item of the data object to which the mask will be
161
169
  applied.
170
+ extra_input : dict, optional
171
+ The other fields in the data object. Useful for accessing other data
172
+ kinds that needs to be used in the computation of masks (default None).
162
173
 
163
174
  Returns
164
175
  -------
@@ -167,37 +178,98 @@ def get_mask(
167
178
  """
168
179
  # Get the min of the voxels sizes and use it as the resolution
169
180
  target_img = target_data["data"]
181
+ inherited_mask_item = target_data.get("mask_item", None)
170
182
  resolution = np.min(target_img.header.get_zooms()[:3])
171
183
 
172
- if isinstance(mask, dict):
173
- if len(mask) != 1:
174
- raise_error(
175
- "The mask dictionary must have only one key, "
176
- "the name of the mask."
177
- )
178
- mask_name = list(mask.keys())[0]
179
- mask_params = mask[mask_name]
180
- else:
181
- mask_name = mask
182
- mask_params = None
184
+ if not isinstance(masks, list):
185
+ masks = [masks]
183
186
 
184
- mask_object, _ = load_mask(
185
- mask_name, path_only=False, resolution=resolution
186
- )
187
- if callable(mask_object):
188
- if mask_params is None:
189
- mask_params = {}
190
- mask_img = mask_object(target_img, **mask_params)
191
- else: # Mask is a Nifti1Image
192
- if mask_params is not None:
193
- raise_error("Cannot pass callable params to a non-callable mask.")
194
- mask_img = resample_to_img(
195
- mask_object,
196
- target_img,
197
- interpolation="nearest",
198
- copy=True,
187
+ # Check that dicts have only one key
188
+ invalid_elements = [
189
+ x for x in masks if isinstance(x, dict) and len(x) != 1
190
+ ]
191
+ if len(invalid_elements) > 0:
192
+ raise_error(
193
+ "Each of the masks dictionary must have only one key, "
194
+ "the name of the mask. The following dictionaries are invalid: "
195
+ f"{invalid_elements}"
199
196
  )
200
197
 
198
+ # Check params for the intersection function
199
+ intersect_params = {}
200
+ true_masks = []
201
+ for t_mask in masks:
202
+ if isinstance(t_mask, dict):
203
+ if "threshold" in t_mask:
204
+ intersect_params["threshold"] = t_mask["threshold"]
205
+ continue
206
+ elif "connected" in t_mask:
207
+ intersect_params["connected"] = t_mask["connected"]
208
+ continue
209
+ # All the other elements are masks
210
+ true_masks.append(t_mask)
211
+
212
+ if len(true_masks) == 0:
213
+ raise_error("No mask was passed. At least one mask is required.")
214
+ # Get all the masks
215
+ all_masks = []
216
+ for t_mask in true_masks:
217
+ if isinstance(t_mask, dict):
218
+ mask_name = list(t_mask.keys())[0]
219
+ mask_params = t_mask[mask_name]
220
+ else:
221
+ mask_name = t_mask
222
+ mask_params = None
223
+
224
+ if mask_name == "inherit":
225
+ if extra_input is None:
226
+ raise_error(
227
+ "Cannot inherit mask from another data item "
228
+ "because no extra data was passed."
229
+ )
230
+ if inherited_mask_item is None:
231
+ raise_error(
232
+ "Cannot inherit mask from another data item "
233
+ "because no mask item was specified "
234
+ "(missing `mask_item` key in the data object)."
235
+ )
236
+ if inherited_mask_item not in extra_input:
237
+ raise_error(
238
+ "Cannot inherit mask from another data item "
239
+ f"because the item ({inherited_mask_item}) does not exist."
240
+ )
241
+ mask_img = extra_input[inherited_mask_item]["data"]
242
+ else:
243
+ mask_object, _ = load_mask(
244
+ mask_name, path_only=False, resolution=resolution
245
+ )
246
+ if callable(mask_object):
247
+ if mask_params is None:
248
+ mask_params = {}
249
+ mask_img = mask_object(target_img, **mask_params)
250
+ else: # Mask is a Nifti1Image
251
+ if mask_params is not None:
252
+ raise_error(
253
+ "Cannot pass callable params to a non-callable mask."
254
+ )
255
+ mask_img = resample_to_img(
256
+ mask_object,
257
+ target_img,
258
+ interpolation="nearest",
259
+ copy=True,
260
+ )
261
+ all_masks.append(mask_img)
262
+ if len(all_masks) > 1:
263
+ mask_img = intersect_masks(all_masks, **intersect_params)
264
+ else:
265
+ if len(intersect_params) > 0:
266
+ # Yes, I'm this strict!
267
+ raise_error(
268
+ "Cannot pass parameters to the intersection function "
269
+ "when there is only one mask."
270
+ )
271
+ mask_img = all_masks[0]
272
+
201
273
  return mask_img
202
274
 
203
275
 
@@ -6,8 +6,9 @@
6
6
  # License: AGPL
7
7
 
8
8
  from pathlib import Path
9
- from typing import Callable, Dict, Union
9
+ from typing import Callable, Dict, List, Union
10
10
 
11
+ import numpy as np
11
12
  import pytest
12
13
  from nilearn.datasets import fetch_icbm152_brain_gm_mask
13
14
  from nilearn.image import resample_to_img
@@ -15,6 +16,7 @@ from nilearn.masking import (
15
16
  compute_background_mask,
16
17
  compute_brain_mask,
17
18
  compute_epi_mask,
19
+ intersect_masks,
18
20
  )
19
21
  from numpy.testing import assert_array_almost_equal, assert_array_equal
20
22
 
@@ -56,7 +58,9 @@ def test_register_mask_already_registered() -> None:
56
58
  name="testmask",
57
59
  mask_path="testmask.nii.gz",
58
60
  )
59
- assert load_mask("testmask", path_only=True)[1].name == "testmask.nii.gz"
61
+ out = load_mask("testmask", path_only=True)
62
+ assert out[1] is not None
63
+ assert out[1].name == "testmask.nii.gz"
60
64
 
61
65
  # Try registering again
62
66
  with pytest.raises(ValueError, match=r"already registered."):
@@ -70,7 +74,9 @@ def test_register_mask_already_registered() -> None:
70
74
  overwrite=True,
71
75
  )
72
76
 
73
- assert load_mask("testmask", path_only=True)[1].name == "testmask2.nii.gz"
77
+ out = load_mask("testmask", path_only=True)
78
+ assert out[1] is not None
79
+ assert out[1].name == "testmask2.nii.gz"
74
80
 
75
81
 
76
82
  @pytest.mark.parametrize(
@@ -110,6 +116,7 @@ def test_register_mask(
110
116
  # Load registered mask
111
117
  _, fname = load_mask(name=name, path_only=True)
112
118
  # Check values for registered mask
119
+ assert fname is not None
113
120
  assert fname.name == f"{name}.nii.gz"
114
121
 
115
122
 
@@ -146,6 +153,7 @@ def test_vickery_patil() -> None:
146
153
  mask.header["pixdim"][1:4], [1.5, 1.5, 1.5] # type: ignore
147
154
  )
148
155
 
156
+ assert fname is not None
149
157
  assert fname.name == "CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean.nii.gz"
150
158
 
151
159
  mask, fname = load_mask("GM_prob0.2", resolution=3)
@@ -153,6 +161,7 @@ def test_vickery_patil() -> None:
153
161
  mask.header["pixdim"][1:4], [3.0, 3.0, 3.0] # type: ignore
154
162
  )
155
163
 
164
+ assert fname is not None
156
165
  assert (
157
166
  fname.name == "CAT12_IXI555_MNI152_TMP_GS_GMprob0.2_clean_3mm.nii.gz"
158
167
  )
@@ -162,6 +171,7 @@ def test_vickery_patil() -> None:
162
171
  mask.header["pixdim"][1:4], [3.0, 3.0, 3.0] # type: ignore
163
172
  )
164
173
 
174
+ assert fname is not None
165
175
  assert fname.name == "GMprob0.2_cortex_3mm_NA_rm.nii.gz"
166
176
 
167
177
  with pytest.raises(ValueError, match=r"find a Vickery-Patil mask "):
@@ -176,7 +186,7 @@ def test_get_mask() -> None:
176
186
  input = reader.fit_transform(input)
177
187
  vbm_gm = input["VBM_GM"]
178
188
  vbm_gm_img = vbm_gm["data"]
179
- mask = get_mask(mask="GM_prob0.2", target_data=vbm_gm)
189
+ mask = get_mask(masks="GM_prob0.2", target_data=vbm_gm)
180
190
 
181
191
  assert mask.shape == vbm_gm_img.shape
182
192
  assert_array_equal(mask.affine, vbm_gm_img.affine)
@@ -204,7 +214,7 @@ def test_mask_callable() -> None:
204
214
  input = reader.fit_transform(input)
205
215
  vbm_gm = input["VBM_GM"]
206
216
  vbm_gm_img = vbm_gm["data"]
207
- mask = get_mask(mask="identity", target_data=vbm_gm)
217
+ mask = get_mask(masks="identity", target_data=vbm_gm)
208
218
 
209
219
  assert_array_equal(mask.get_fdata(), vbm_gm_img.get_fdata())
210
220
 
@@ -218,11 +228,48 @@ def test_get_mask_errors() -> None:
218
228
  input = dg["sub-01"]
219
229
  input = reader.fit_transform(input)
220
230
  vbm_gm = input["VBM_GM"]
231
+ # Test wrong masks definitions (more than one key per dict)
221
232
  with pytest.raises(ValueError, match=r"only one key"):
222
- get_mask(mask={"GM_prob0.2": {}, "Other": {}}, target_data=vbm_gm)
233
+ get_mask(masks={"GM_prob0.2": {}, "Other": {}}, target_data=vbm_gm)
223
234
 
235
+ # Test wrong masks definitions (pass paramaeters to non-callable mask)
224
236
  with pytest.raises(ValueError, match=r"callable params"):
225
- get_mask(mask={"GM_prob0.2": {"param": 1}}, target_data=vbm_gm)
237
+ get_mask(masks={"GM_prob0.2": {"param": 1}}, target_data=vbm_gm)
238
+
239
+ # Pass only parametesr to the intersection function
240
+ with pytest.raises(
241
+ ValueError, match=r" At least one mask is required."
242
+ ):
243
+ get_mask(masks={"threshold": 1}, target_data=vbm_gm)
244
+
245
+ # Pass parameters to the intersection function when only one mask
246
+ with pytest.raises(
247
+ ValueError, match=r"parameters to the intersection"
248
+ ):
249
+ get_mask(
250
+ masks=["GM_prob0.2", {"threshold": 1}], target_data=vbm_gm
251
+ )
252
+
253
+ # Test "inherited" masks errors
254
+
255
+ # 1) No extra_data parameter
256
+ with pytest.raises(ValueError, match=r"no extra data was passed"):
257
+ get_mask(masks="inherit", target_data=vbm_gm)
258
+
259
+ extra_input = {"VBM_MASK": {}}
260
+
261
+ # 2) No mask_item key in target_data
262
+ with pytest.raises(ValueError, match=r"no mask item was specified"):
263
+ get_mask(
264
+ masks="inherit", target_data=vbm_gm, extra_input=extra_input
265
+ )
266
+
267
+ # 3) mask_item not in extra data
268
+ with pytest.raises(ValueError, match=r"does not exist"):
269
+ vbm_gm["mask_item"] = "wrong"
270
+ get_mask(
271
+ masks="inherit", target_data=vbm_gm, extra_input=extra_input
272
+ )
226
273
 
227
274
 
228
275
  @pytest.mark.parametrize(
@@ -271,7 +318,7 @@ def test_nilearn_compute_masks(
271
318
  else:
272
319
  mask_spec = {mask_name: params}
273
320
 
274
- mask = get_mask(mask=mask_spec, target_data=bold)
321
+ mask = get_mask(masks=mask_spec, target_data=bold)
275
322
 
276
323
  assert_array_equal(mask.affine, bold_img.affine)
277
324
 
@@ -287,3 +334,114 @@ def test_nilearn_compute_masks(
287
334
  copy=True,
288
335
  )
289
336
  assert_array_equal(mask.get_fdata(), ni_mask.get_fdata())
337
+
338
+
339
+ def test_get_mask_inherit() -> None:
340
+ """Test using the inherit mask functionality."""
341
+ reader = DefaultDataReader()
342
+ with SPMAuditoryTestingDatagrabber() as dg:
343
+ input = dg["sub001"]
344
+ input = reader.fit_transform(input)
345
+ # Compute brain mask using nilearn
346
+ gm_mask = compute_brain_mask(input["BOLD"]["data"], threshold=0.2)
347
+
348
+ # Get mask using the compute_brain_mask function
349
+ mask1 = get_mask(
350
+ masks={"compute_brain_mask": {"threshold": 0.2}},
351
+ target_data=input["BOLD"],
352
+ )
353
+
354
+ # Now get the mask using the inherit functionality, passing the
355
+ # computed mask as extra data
356
+ extra_input = {"BOLD_MASK": {"data": gm_mask}}
357
+ input["BOLD"]["mask_item"] = "BOLD_MASK"
358
+ mask2 = get_mask(
359
+ masks="inherit", target_data=input["BOLD"], extra_input=extra_input
360
+ )
361
+
362
+ # Both masks should be equal
363
+ assert_array_equal(mask1.get_fdata(), mask2.get_fdata())
364
+
365
+
366
+ @pytest.mark.parametrize(
367
+ "masks,params",
368
+ [
369
+ (["GM_prob0.2", "compute_brain_mask"], {}),
370
+ (
371
+ ["GM_prob0.2", "compute_brain_mask"],
372
+ {"threshold": 0.2},
373
+ ),
374
+ (
375
+ [
376
+ "GM_prob0.2",
377
+ "compute_brain_mask",
378
+ "fetch_icbm152_brain_gm_mask",
379
+ ],
380
+ {"threshold": 1, "connected": True},
381
+ ),
382
+ ],
383
+ )
384
+ def test_get_mask_multiple(
385
+ masks: Union[str, Dict, List[Union[Dict, str]]], params: Dict
386
+ ) -> None:
387
+ """Test getting multiple masks.
388
+
389
+ Parameters
390
+ ----------
391
+ masks : str, dict, list of str or dict
392
+ Masks to get, junifer style.
393
+ params : dict
394
+ Parameters to pass to the intersect_masks function.
395
+ """
396
+ reader = DefaultDataReader()
397
+ with SPMAuditoryTestingDatagrabber() as dg:
398
+ input = dg["sub001"]
399
+ input = reader.fit_transform(input)
400
+ if not isinstance(masks, list):
401
+ junifer_masks = [masks]
402
+ else:
403
+ junifer_masks = masks.copy()
404
+ if len(params) > 0:
405
+ # Convert params to junifer style (one dict per param)
406
+ junifer_params = [{k: params[k]} for k in params.keys()]
407
+ junifer_masks.extend(junifer_params)
408
+ target_img = input["BOLD"]["data"]
409
+ resolution = np.min(target_img.header.get_zooms()[:3])
410
+
411
+ computed = get_mask(masks=junifer_masks, target_data=input["BOLD"])
412
+
413
+ masks_names = [
414
+ list(x.keys())[0] if isinstance(x, dict) else x for x in masks
415
+ ]
416
+
417
+ mask_funcs = [
418
+ x
419
+ for x in masks_names
420
+ if _available_masks[x]["family"] == "Callable"
421
+ ]
422
+ mask_files = [
423
+ x
424
+ for x in masks_names
425
+ if _available_masks[x]["family"] != "Callable"
426
+ ]
427
+
428
+ mask_imgs = [
429
+ load_mask(t_mask, path_only=False, resolution=resolution)[0]
430
+ for t_mask in mask_files
431
+ ]
432
+
433
+ for t_func in mask_funcs:
434
+ mask_imgs.append(_available_masks[t_func]["func"](target_img))
435
+
436
+ mask_imgs = [
437
+ resample_to_img(
438
+ t_mask,
439
+ target_img,
440
+ interpolation="nearest",
441
+ copy=True,
442
+ )
443
+ for t_mask in mask_imgs
444
+ ]
445
+
446
+ expected = intersect_masks(mask_imgs, **params)
447
+ assert_array_equal(computed.get_fdata(), expected.get_fdata())
@@ -7,7 +7,7 @@
7
7
  # License: AGPL
8
8
 
9
9
  from pathlib import Path
10
- from typing import Union
10
+ from typing import Union, Dict
11
11
 
12
12
  from junifer.datagrabber import PatternDataladDataGrabber
13
13
 
@@ -34,7 +34,9 @@ class DataladAOMICID1000(PatternDataladDataGrabber):
34
34
  types = [
35
35
  "BOLD",
36
36
  "BOLD_confounds",
37
+ "BOLD_mask",
37
38
  "T1w",
39
+ "T1w_mask",
38
40
  "probseg_CSF",
39
41
  "probseg_GM",
40
42
  "probseg_WM",
@@ -52,11 +54,22 @@ class DataladAOMICID1000(PatternDataladDataGrabber):
52
54
  "sub-{subject}_task-moviewatching_"
53
55
  "desc-confounds_regressors.tsv"
54
56
  ),
57
+ "BOLD_mask": (
58
+ "derivatives/fmriprep/sub-{subject}/func/"
59
+ "sub-{subject}_task-moviewatching_"
60
+ "space-MNI152NLin2009cAsym_"
61
+ "desc-brain_mask.nii.gz"
62
+ ),
55
63
  "T1w": (
56
64
  "derivatives/fmriprep/sub-{subject}/anat/"
57
65
  "sub-{subject}_space-MNI152NLin2009cAsym_"
58
66
  "desc-preproc_T1w.nii.gz"
59
67
  ),
68
+ "T1w_mask": (
69
+ "derivatives/fmriprep/sub-{subject}/anat/"
70
+ "sub-{subject}_space-MNI152NLin2009cAsym_"
71
+ "desc-brain_mask.nii.gz"
72
+ ),
60
73
  "probseg_CSF": (
61
74
  "derivatives/fmriprep/sub-{subject}/anat/"
62
75
  "sub-{subject}_space-MNI152NLin2009cAsym_label-"
@@ -88,3 +101,22 @@ class DataladAOMICID1000(PatternDataladDataGrabber):
88
101
  replacements=replacements,
89
102
  confounds_format="fmriprep",
90
103
  )
104
+
105
+ def get_item(self, subject: str) -> Dict:
106
+ """Index one element in the dataset.
107
+
108
+ Parameters
109
+ ----------
110
+ subject : str
111
+ The subject ID.
112
+
113
+ Returns
114
+ -------
115
+ out : dict
116
+ Dictionary of paths for each type of data required for the
117
+ specified element.
118
+ """
119
+ out = super().get_item(subject=subject)
120
+ out["BOLD"]["mask_item"] = "BOLD_mask"
121
+ out["T1w"]["mask_item"] = "T1w_mask"
122
+ return out
@@ -41,7 +41,9 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber):
41
41
  types = [
42
42
  "BOLD",
43
43
  "BOLD_confounds",
44
+ "BOLD_mask",
44
45
  "T1w",
46
+ "T1w_mask",
45
47
  "probseg_CSF",
46
48
  "probseg_GM",
47
49
  "probseg_WM",
@@ -83,11 +85,21 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber):
83
85
  "sub-{subject}_task-{task}_"
84
86
  "desc-confounds_regressors.tsv"
85
87
  ),
88
+ "BOLD_mask": (
89
+ "derivatives/fmriprep/sub-{subject}/func/"
90
+ "sub-{subject}_task-{task}_"
91
+ "space-MNI152NLin2009cAsym_desc-brain_mask.nii.gz"
92
+ ),
86
93
  "T1w": (
87
94
  "derivatives/fmriprep/sub-{subject}/anat/"
88
95
  "sub-{subject}_space-MNI152NLin2009cAsym_"
89
96
  "desc-preproc_T1w.nii.gz"
90
97
  ),
98
+ "T1w_mask": (
99
+ "derivatives/fmriprep/sub-{subject}/anat/"
100
+ "sub-{subject}_space-MNI152NLin2009cAsym_"
101
+ "desc-brain_mask.nii.gz"
102
+ ),
91
103
  "probseg_CSF": (
92
104
  "derivatives/fmriprep/sub-{subject}/anat/"
93
105
  "sub-{subject}_space-MNI152NLin2009cAsym_label-"
@@ -149,6 +161,8 @@ class DataladAOMICPIOP1(PatternDataladDataGrabber):
149
161
  new_task = f"{task}_acq-{acq}"
150
162
 
151
163
  out = super().get_item(subject=subject, task=new_task)
164
+ out["BOLD"]["mask_item"] = "BOLD_mask"
165
+ out["T1w"]["mask_item"] = "T1w_mask"
152
166
  return out
153
167
 
154
168
  def get_elements(self) -> List: