junifer 0.0.7.dev332__py3-none-any.whl → 0.0.8__py3-none-any.whl

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 (293) hide show
  1. junifer/_version.py +9 -19
  2. junifer/api/__init__.pyi +17 -2
  3. junifer/api/functions.py +222 -39
  4. junifer/api/queue_context/__init__.pyi +11 -3
  5. junifer/api/queue_context/gnu_parallel_local_adapter.py +81 -120
  6. junifer/api/queue_context/htcondor_adapter.py +118 -181
  7. junifer/api/queue_context/queue_context_adapter.py +51 -7
  8. junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +10 -35
  9. junifer/api/queue_context/tests/test_htcondor_adapter.py +13 -50
  10. junifer/api/res/fsl/run_fsl_docker.sh +4 -0
  11. junifer/api/tests/test_functions.py +863 -36
  12. junifer/cli/__init__.py +1 -7
  13. junifer/cli/cli.py +41 -22
  14. junifer/cli/parser.py +23 -147
  15. junifer/cli/tests/data/gmd_mean.yaml +6 -6
  16. junifer/cli/tests/data/gmd_mean_htcondor.yaml +6 -5
  17. junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +1 -0
  18. junifer/cli/tests/test_cli.py +120 -4
  19. junifer/cli/tests/test_cli_utils.py +23 -6
  20. junifer/cli/utils.py +14 -9
  21. junifer/configs/__init__.py +5 -0
  22. junifer/configs/__init__.pyi +0 -0
  23. junifer/configs/juseless/datagrabbers/__init__.pyi +4 -2
  24. junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +18 -24
  25. junifer/configs/juseless/datagrabbers/camcan_vbm.py +20 -27
  26. junifer/configs/juseless/datagrabbers/ixi_vbm.py +44 -52
  27. junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -7
  28. junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -19
  29. junifer/configs/juseless/datagrabbers/ucla.py +111 -104
  30. junifer/configs/juseless/datagrabbers/ukb_vbm.py +19 -25
  31. junifer/configs/py.typed +0 -0
  32. junifer/conftest.py +63 -24
  33. junifer/data/_dispatch.py +9 -19
  34. junifer/data/coordinates/_ants_coordinates_warper.py +4 -1
  35. junifer/data/coordinates/_coordinates.py +51 -6
  36. junifer/data/coordinates/_fsl_coordinates_warper.py +4 -1
  37. junifer/data/coordinates/tests/test_coordinates.py +15 -3
  38. junifer/data/coordinates/tests/test_coordinates_names.py +37 -0
  39. junifer/data/maps/_ants_maps_warper.py +18 -12
  40. junifer/data/maps/_fsl_maps_warper.py +7 -3
  41. junifer/data/maps/_maps.py +12 -8
  42. junifer/data/maps/tests/test_maps.py +13 -21
  43. junifer/data/masks/_ants_mask_warper.py +18 -12
  44. junifer/data/masks/_fsl_mask_warper.py +7 -3
  45. junifer/data/masks/_masks.py +15 -12
  46. junifer/data/masks/tests/test_masks.py +20 -17
  47. junifer/data/parcellations/_ants_parcellation_warper.py +18 -12
  48. junifer/data/parcellations/_fsl_parcellation_warper.py +7 -5
  49. junifer/data/parcellations/_parcellations.py +125 -91
  50. junifer/data/parcellations/tests/test_parcellations.py +122 -1
  51. junifer/data/template_spaces.py +117 -50
  52. junifer/data/tests/test_template_spaces.py +10 -7
  53. junifer/data/utils.py +10 -8
  54. junifer/datagrabber/__init__.pyi +38 -5
  55. junifer/datagrabber/aomic/__init__.pyi +8 -1
  56. junifer/datagrabber/aomic/_types.py +22 -0
  57. junifer/datagrabber/aomic/id1000.py +193 -183
  58. junifer/datagrabber/aomic/piop1.py +215 -259
  59. junifer/datagrabber/aomic/piop2.py +211 -244
  60. junifer/datagrabber/aomic/tests/test_id1000.py +70 -53
  61. junifer/datagrabber/aomic/tests/test_piop1.py +98 -102
  62. junifer/datagrabber/aomic/tests/test_piop2.py +88 -85
  63. junifer/datagrabber/base.py +253 -79
  64. junifer/datagrabber/datalad_base.py +127 -76
  65. junifer/datagrabber/dmcc13_benchmark.py +204 -289
  66. junifer/datagrabber/hcp1200/__init__.pyi +7 -2
  67. junifer/datagrabber/hcp1200/datalad_hcp1200.py +61 -40
  68. junifer/datagrabber/hcp1200/hcp1200.py +151 -164
  69. junifer/datagrabber/hcp1200/tests/test_hcp1200.py +116 -128
  70. junifer/datagrabber/multiple.py +183 -63
  71. junifer/datagrabber/pattern.py +358 -227
  72. junifer/datagrabber/pattern_datalad.py +84 -124
  73. junifer/datagrabber/pattern_validation_mixin.py +22 -50
  74. junifer/datagrabber/tests/test_base.py +17 -4
  75. junifer/datagrabber/tests/test_datalad_base.py +20 -27
  76. junifer/datagrabber/tests/test_dmcc13_benchmark.py +110 -122
  77. junifer/datagrabber/tests/test_multiple.py +293 -31
  78. junifer/datagrabber/tests/test_pattern.py +577 -18
  79. junifer/datagrabber/tests/test_pattern_datalad.py +177 -107
  80. junifer/datagrabber/tests/test_pattern_validation_mixin.py +9 -51
  81. junifer/datareader/default.py +8 -5
  82. junifer/datareader/tests/test_default_reader.py +1 -1
  83. junifer/external/BrainPrint/.codecov.yml +2 -0
  84. junifer/external/BrainPrint/.codespellignore +2 -0
  85. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +45 -0
  86. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +12 -0
  87. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +24 -0
  88. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +28 -0
  89. junifer/external/BrainPrint/.github/dependabot.yml +6 -0
  90. junifer/external/BrainPrint/.github/workflows/build.yml +53 -0
  91. junifer/external/BrainPrint/.github/workflows/code-style.yml +44 -0
  92. junifer/external/BrainPrint/.github/workflows/doc.yml +65 -0
  93. junifer/external/BrainPrint/.github/workflows/publish.yml +31 -0
  94. junifer/external/BrainPrint/.github/workflows/pytest.yml +54 -0
  95. junifer/external/BrainPrint/.gitignore +123 -0
  96. junifer/external/BrainPrint/LICENSE +21 -0
  97. junifer/external/BrainPrint/README.md +108 -0
  98. junifer/external/BrainPrint/brainprint/cli/__init__.py +11 -0
  99. junifer/external/BrainPrint/brainprint/cli/help_text.py +169 -0
  100. junifer/external/BrainPrint/brainprint/cli/parser.py +150 -0
  101. junifer/external/BrainPrint/brainprint/cli/utils.py +14 -0
  102. junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
  103. junifer/external/BrainPrint/brainprint/commands/sys_info.py +18 -0
  104. junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
  105. junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +33 -0
  106. junifer/external/BrainPrint/doc/Makefile +20 -0
  107. junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
  108. junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +10 -0
  109. junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +8 -0
  110. junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +6 -0
  111. junifer/external/BrainPrint/doc/api/index.rst +11 -0
  112. junifer/external/BrainPrint/doc/conf.py +272 -0
  113. junifer/external/BrainPrint/doc/index.rst +140 -0
  114. junifer/external/BrainPrint/doc/links.inc +36 -0
  115. junifer/external/BrainPrint/doc/make.bat +35 -0
  116. junifer/external/BrainPrint/doc/references.bib +23 -0
  117. junifer/external/BrainPrint/pyproject.toml +170 -0
  118. junifer/external/BrainPrint/setup.py +3 -0
  119. junifer/external/__init__.py +5 -0
  120. junifer/external/__init__.pyi +0 -0
  121. junifer/external/nilearn/junifer_connectivity_measure.py +95 -39
  122. junifer/external/nilearn/junifer_nifti_spheres_masker.py +226 -67
  123. junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +39 -27
  124. junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +231 -21
  125. junifer/external/py.typed +0 -0
  126. junifer/markers/__init__.pyi +6 -3
  127. junifer/markers/base.py +126 -76
  128. junifer/markers/brainprint.py +30 -39
  129. junifer/markers/complexity/__init__.py +20 -3
  130. junifer/markers/complexity/complexity_base.py +40 -41
  131. junifer/markers/complexity/hurst_exponent.py +22 -35
  132. junifer/markers/complexity/multiscale_entropy_auc.py +53 -41
  133. junifer/markers/complexity/perm_entropy.py +22 -36
  134. junifer/markers/complexity/range_entropy.py +22 -35
  135. junifer/markers/complexity/range_entropy_auc.py +27 -36
  136. junifer/markers/complexity/sample_entropy.py +22 -36
  137. junifer/markers/complexity/tests/test_complexity_registry.py +48 -0
  138. junifer/markers/complexity/tests/test_hurst_exponent.py +47 -36
  139. junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +50 -36
  140. junifer/markers/complexity/tests/test_perm_entropy.py +48 -36
  141. junifer/markers/complexity/tests/test_range_entropy.py +47 -36
  142. junifer/markers/complexity/tests/test_range_entropy_auc.py +47 -36
  143. junifer/markers/complexity/tests/test_sample_entropy.py +48 -36
  144. junifer/markers/complexity/tests/test_weighted_perm_entropy.py +50 -36
  145. junifer/markers/complexity/weighted_perm_entropy.py +22 -36
  146. junifer/markers/ets_rss.py +35 -31
  147. junifer/markers/falff/__init__.pyi +7 -1
  148. junifer/markers/falff/_afni_falff.py +22 -9
  149. junifer/markers/falff/_junifer_falff.py +47 -31
  150. junifer/markers/falff/falff_base.py +80 -60
  151. junifer/markers/falff/falff_maps.py +17 -41
  152. junifer/markers/falff/falff_parcels.py +26 -51
  153. junifer/markers/falff/falff_spheres.py +34 -61
  154. junifer/markers/falff/tests/test_falff_maps.py +20 -23
  155. junifer/markers/falff/tests/test_falff_mask.py +99 -0
  156. junifer/markers/falff/tests/test_falff_parcels.py +14 -10
  157. junifer/markers/falff/tests/test_falff_spheres.py +14 -10
  158. junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +32 -34
  159. junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +12 -25
  160. junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +19 -34
  161. junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +24 -44
  162. junifer/markers/functional_connectivity/functional_connectivity_base.py +50 -40
  163. junifer/markers/functional_connectivity/functional_connectivity_maps.py +12 -25
  164. junifer/markers/functional_connectivity/functional_connectivity_parcels.py +19 -34
  165. junifer/markers/functional_connectivity/functional_connectivity_spheres.py +24 -45
  166. junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +21 -22
  167. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +8 -7
  168. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +8 -4
  169. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +8 -4
  170. junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +8 -7
  171. junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +9 -5
  172. junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +8 -12
  173. junifer/markers/maps_aggregation.py +77 -55
  174. junifer/markers/parcel_aggregation.py +91 -70
  175. junifer/markers/reho/__init__.pyi +7 -1
  176. junifer/markers/reho/_afni_reho.py +23 -14
  177. junifer/markers/reho/_junifer_reho.py +112 -123
  178. junifer/markers/reho/reho_base.py +115 -37
  179. junifer/markers/reho/reho_maps.py +18 -32
  180. junifer/markers/reho/reho_parcels.py +26 -41
  181. junifer/markers/reho/reho_spheres.py +33 -54
  182. junifer/markers/reho/tests/test_junifer_reho.py +178 -0
  183. junifer/markers/reho/tests/test_reho_maps.py +27 -25
  184. junifer/markers/reho/tests/test_reho_parcels.py +28 -22
  185. junifer/markers/reho/tests/test_reho_spheres.py +16 -12
  186. junifer/markers/sphere_aggregation.py +88 -72
  187. junifer/markers/temporal_snr/temporal_snr_base.py +32 -30
  188. junifer/markers/temporal_snr/temporal_snr_maps.py +9 -18
  189. junifer/markers/temporal_snr/temporal_snr_parcels.py +19 -27
  190. junifer/markers/temporal_snr/temporal_snr_spheres.py +27 -41
  191. junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +2 -2
  192. junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +17 -22
  193. junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +11 -3
  194. junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +9 -9
  195. junifer/markers/tests/test_brainprint.py +10 -9
  196. junifer/markers/tests/test_ets_rss.py +7 -3
  197. junifer/markers/tests/test_lost_regions.py +279 -0
  198. junifer/markers/tests/test_maps_aggregation.py +67 -114
  199. junifer/markers/tests/test_marker_utils.py +40 -1
  200. junifer/markers/tests/test_markers_base.py +275 -6
  201. junifer/markers/tests/test_parcel_aggregation.py +91 -53
  202. junifer/markers/tests/test_sphere_aggregation.py +53 -47
  203. junifer/markers/utils.py +267 -5
  204. junifer/onthefly/__init__.py +2 -3
  205. junifer/onthefly/__init__.pyi +4 -0
  206. junifer/onthefly/_brainprint.py +3 -5
  207. junifer/onthefly/py.typed +0 -0
  208. junifer/onthefly/read_transform.py +11 -9
  209. junifer/onthefly/tests/test_read_transform.py +7 -7
  210. junifer/pipeline/__init__.pyi +4 -2
  211. junifer/pipeline/marker_collection.py +14 -10
  212. junifer/pipeline/pipeline_component_registry.py +25 -6
  213. junifer/pipeline/pipeline_step_mixin.py +5 -12
  214. junifer/pipeline/tests/test_data_object_dumper.py +10 -10
  215. junifer/pipeline/tests/test_marker_collection.py +145 -168
  216. junifer/pipeline/tests/test_pipeline_component_registry.py +52 -8
  217. junifer/pipeline/tests/test_pipeline_step_mixin.py +12 -26
  218. junifer/pipeline/tests/test_update_meta_mixin.py +4 -5
  219. junifer/pipeline/tests/test_workdir_manager.py +39 -0
  220. junifer/pipeline/update_meta_mixin.py +13 -10
  221. junifer/pipeline/utils.py +22 -17
  222. junifer/pipeline/workdir_manager.py +41 -32
  223. junifer/preprocess/__init__.pyi +9 -4
  224. junifer/preprocess/_temporal_filter.py +34 -33
  225. junifer/preprocess/_temporal_slicer.py +17 -30
  226. junifer/preprocess/base.py +99 -55
  227. junifer/preprocess/confounds/__init__.pyi +10 -2
  228. junifer/preprocess/confounds/fmriprep_confound_remover.py +87 -109
  229. junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +64 -45
  230. junifer/preprocess/smoothing/__init__.pyi +2 -2
  231. junifer/preprocess/smoothing/_afni_smoothing.py +8 -7
  232. junifer/preprocess/smoothing/_fsl_smoothing.py +6 -4
  233. junifer/preprocess/smoothing/_nilearn_smoothing.py +7 -5
  234. junifer/preprocess/smoothing/smoothing.py +59 -40
  235. junifer/preprocess/smoothing/tests/test_smoothing.py +28 -8
  236. junifer/preprocess/tests/test_preprocess_base.py +17 -9
  237. junifer/preprocess/tests/test_temporal_filter.py +37 -16
  238. junifer/preprocess/tests/test_temporal_slicer.py +12 -12
  239. junifer/preprocess/warping/__init__.pyi +2 -2
  240. junifer/preprocess/warping/_ants_warper.py +56 -40
  241. junifer/preprocess/warping/_fsl_warper.py +49 -36
  242. junifer/preprocess/warping/_utils.py +106 -0
  243. junifer/preprocess/warping/space_warper.py +99 -98
  244. junifer/preprocess/warping/tests/test_space_warper.py +46 -41
  245. junifer/preprocess/warping/tests/test_warping_utils.py +163 -0
  246. junifer/stats.py +46 -34
  247. junifer/storage/__init__.pyi +8 -4
  248. junifer/storage/base.py +129 -64
  249. junifer/storage/hdf5.py +307 -199
  250. junifer/storage/pandas_base.py +46 -24
  251. junifer/storage/sqlite.py +99 -62
  252. junifer/storage/tests/data/collected_h5io_fork.hdf5 +0 -0
  253. junifer/storage/tests/test_hdf5.py +147 -12
  254. junifer/storage/tests/test_repeated_storage.py +293 -0
  255. junifer/storage/tests/test_sqlite.py +9 -20
  256. junifer/storage/tests/test_storage_base.py +18 -21
  257. junifer/storage/tests/test_utils.py +83 -22
  258. junifer/storage/utils.py +58 -38
  259. junifer/testing/__init__.pyi +2 -2
  260. junifer/testing/datagrabbers.py +480 -44
  261. junifer/testing/registry.py +12 -0
  262. junifer/testing/tests/test_adhdtesting_datagrabber.py +24 -0
  263. junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +5 -0
  264. junifer/testing/tests/test_partlycloudytesting_datagrabber.py +52 -0
  265. junifer/testing/tests/test_spmauditory_datagrabber.py +16 -0
  266. junifer/testing/tests/test_testing_registry.py +31 -0
  267. junifer/testing/tests/test_testing_utils.py +35 -0
  268. junifer/testing/tests/test_uclacnpvbmtesting_datagrabber.py +81 -0
  269. junifer/testing/utils.py +33 -1
  270. junifer/tests/test_stats.py +1 -5
  271. junifer/typing/__init__.pyi +2 -0
  272. junifer/typing/_typing.py +34 -19
  273. junifer/typing/py.typed +0 -0
  274. junifer/utils/__init__.pyi +10 -1
  275. junifer/utils/_config.py +1 -2
  276. junifer/utils/helpers.py +68 -2
  277. junifer/utils/logging.py +31 -7
  278. junifer/utils/tests/test_helpers.py +36 -1
  279. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/METADATA +43 -35
  280. junifer-0.0.8.dist-info/RECORD +402 -0
  281. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/WHEEL +1 -1
  282. junifer/cli/tests/test_parser.py +0 -280
  283. junifer/external/h5io/h5io/__init__.py +0 -15
  284. junifer/external/h5io/h5io/_h5io.py +0 -767
  285. junifer/external/h5io/h5io/_version.py +0 -1
  286. junifer/external/h5io/h5io/chunked_array.py +0 -94
  287. junifer/external/h5io/h5io/chunked_list.py +0 -65
  288. junifer/markers/complexity/__init__.pyi +0 -17
  289. junifer-0.0.7.dev332.dist-info/RECORD +0 -353
  290. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/entry_points.txt +0 -0
  291. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/AUTHORS.rst +0 -0
  292. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/LICENSE.md +0 -0
  293. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/top_level.txt +0 -0
@@ -7,16 +7,32 @@
7
7
  # Synchon Mandal <s.mandal@fz-juelich.de>
8
8
  # License: AGPL
9
9
 
10
- from pathlib import Path
11
- from typing import Union
10
+ from typing import Annotated, Literal
11
+
12
+ from pydantic import AnyUrl, BeforeValidator
12
13
 
13
14
  from ...api.decorators import register_datagrabber
14
- from ...utils import raise_error
15
+ from ...typing import DataGrabberPatterns
16
+ from ...utils import ensure_list
17
+ from ..base import DataType
18
+ from ..pattern import ConfoundsFormat
15
19
  from ..pattern_datalad import PatternDataladDataGrabber
20
+ from ._types import AOMICSpace
16
21
 
17
22
 
18
23
  __all__ = ["DataladAOMICID1000"]
19
24
 
25
+ _types = Literal[
26
+ DataType.BOLD,
27
+ DataType.T1w,
28
+ DataType.VBM_CSF,
29
+ DataType.VBM_GM,
30
+ DataType.VBM_WM,
31
+ DataType.DWI,
32
+ DataType.FreeSurfer,
33
+ DataType.Warp,
34
+ ]
35
+
20
36
 
21
37
  @register_datagrabber
22
38
  class DataladAOMICID1000(PatternDataladDataGrabber):
@@ -24,212 +40,206 @@ class DataladAOMICID1000(PatternDataladDataGrabber):
24
40
 
25
41
  Parameters
26
42
  ----------
27
- datadir : str or Path or None, optional
28
- The directory where the datalad dataset will be cloned. If None,
29
- the datalad dataset will be cloned into a temporary directory
30
- (default None).
31
- types: {"BOLD", "T1w", "VBM_CSF", "VBM_GM", "VBM_WM", "DWI", \
32
- "FreeSurfer"} or list of the options, optional
33
- AOMIC data types. If None, all available data types are selected.
34
- (default None).
43
+ types : {"BOLD", "T1w", "VBM_CSF", "VBM_GM", "VBM_WM", "DWI", \
44
+ "FreeSurfer", "Warp"} or list of the options, optional
45
+ The data type(s) to grab.
46
+ datadir : pathlib.Path, optional
47
+ That path where the datalad dataset will be cloned.
48
+ If not specified, the datalad dataset will be cloned into a temporary
49
+ directory.
35
50
  space : {"native", "MNI152NLin2009cAsym"}, optional
36
- The space to use for the data (default "MNI152NLin2009cAsym").
37
-
38
- Raises
39
- ------
40
- ValueError
41
- If invalid value is passed for:
42
- * ``space``
51
+ AOMIC space (default ``AOMICSpace.MNI152NLin2009cAsym``).
43
52
 
44
53
  """
45
54
 
46
- def __init__(
47
- self,
48
- datadir: Union[str, Path, None] = None,
49
- types: Union[str, list[str], None] = None,
50
- space: str = "MNI152NLin2009cAsym",
51
- ) -> None:
52
- valid_spaces = ["native", "MNI152NLin2009cAsym"]
53
- if space not in ["native", "MNI152NLin2009cAsym"]:
54
- raise_error(
55
- f"Invalid space {space}. Must be one of {valid_spaces}"
56
- )
57
-
58
- # Descriptor for space in `anat`
59
- sp_anat_desc = (
60
- "" if space == "native" else "space-MNI152NLin2009cAsym_"
61
- )
62
- # Descriptor for space in `func`
63
- sp_func_desc = (
64
- "space-T1w_" if space == "native" else "space-MNI152NLin2009cAsym_"
65
- )
66
- # The patterns
67
- patterns = {
68
- "BOLD": {
55
+ uri: AnyUrl = AnyUrl("https://github.com/OpenNeuroDatasets/ds003097.git")
56
+ types: Annotated[_types | list[_types], BeforeValidator(ensure_list)] = [ # noqa: RUF012
57
+ DataType.BOLD,
58
+ DataType.T1w,
59
+ DataType.VBM_CSF,
60
+ DataType.VBM_GM,
61
+ DataType.VBM_WM,
62
+ DataType.DWI,
63
+ DataType.FreeSurfer,
64
+ DataType.Warp,
65
+ ]
66
+ space: AOMICSpace = AOMICSpace.MNI152NLin2009cAsym
67
+ patterns: DataGrabberPatterns = { # noqa: RUF012
68
+ "BOLD": {
69
+ "pattern": (
70
+ "derivatives/fmriprep/{subject}/func/"
71
+ "{subject}_task-moviewatching_"
72
+ "{sp_func_desc}"
73
+ "desc-preproc_bold.nii.gz"
74
+ ),
75
+ "mask": {
69
76
  "pattern": (
70
77
  "derivatives/fmriprep/{subject}/func/"
71
78
  "{subject}_task-moviewatching_"
72
- f"{sp_func_desc}"
73
- "desc-preproc_bold.nii.gz"
79
+ "{sp_func_desc}"
80
+ "desc-brain_mask.nii.gz"
74
81
  ),
75
- "space": space,
76
- "mask": {
77
- "pattern": (
78
- "derivatives/fmriprep/{subject}/func/"
79
- "{subject}_task-moviewatching_"
80
- f"{sp_func_desc}"
81
- "desc-brain_mask.nii.gz"
82
- ),
83
- "space": space,
84
- },
85
- "confounds": {
86
- "pattern": (
87
- "derivatives/fmriprep/{subject}/func/"
88
- "{subject}_task-moviewatching_"
89
- "desc-confounds_regressors.tsv"
90
- ),
91
- "format": "fmriprep",
92
- },
93
- "reference": {
94
- "pattern": (
95
- "derivatives/fmriprep/{subject}/func/"
96
- "{subject}_task-moviewatching_"
97
- f"{sp_func_desc}"
98
- "boldref.nii.gz"
99
- ),
100
- },
101
82
  },
102
- "T1w": {
83
+ "confounds": {
103
84
  "pattern": (
104
- "derivatives/fmriprep/{subject}/anat/"
105
- "{subject}_"
106
- f"{sp_anat_desc}"
107
- "desc-preproc_T1w.nii.gz"
85
+ "derivatives/fmriprep/{subject}/func/"
86
+ "{subject}_task-moviewatching_"
87
+ "desc-confounds_regressors.tsv"
108
88
  ),
109
- "space": space,
110
- "mask": {
111
- "pattern": (
112
- "derivatives/fmriprep/{subject}/anat/"
113
- "{subject}_"
114
- f"{sp_anat_desc}"
115
- "desc-brain_mask.nii.gz"
116
- ),
117
- "space": space,
118
- },
89
+ "format": "fmriprep",
119
90
  },
120
- "VBM_CSF": {
91
+ "reference": {
121
92
  "pattern": (
122
- "derivatives/fmriprep/{subject}/anat/"
123
- "{subject}_"
124
- f"{sp_anat_desc}"
125
- "label-CSF_probseg.nii.gz"
93
+ "derivatives/fmriprep/{subject}/func/"
94
+ "{subject}_task-moviewatching_"
95
+ "{sp_func_desc}"
96
+ "boldref.nii.gz"
126
97
  ),
127
- "space": space,
128
98
  },
129
- "VBM_GM": {
99
+ },
100
+ "T1w": {
101
+ "pattern": (
102
+ "derivatives/fmriprep/{subject}/anat/"
103
+ "{subject}_"
104
+ "{sp_anat_desc}"
105
+ "desc-preproc_T1w.nii.gz"
106
+ ),
107
+ "mask": {
130
108
  "pattern": (
131
109
  "derivatives/fmriprep/{subject}/anat/"
132
110
  "{subject}_"
133
- f"{sp_anat_desc}"
134
- "label-GM_probseg.nii.gz"
111
+ "{sp_anat_desc}"
112
+ "desc-brain_mask.nii.gz"
135
113
  ),
136
- "space": space,
137
114
  },
138
- "VBM_WM": {
115
+ },
116
+ "VBM_CSF": {
117
+ "pattern": (
118
+ "derivatives/fmriprep/{subject}/anat/"
119
+ "{subject}_"
120
+ "{sp_anat_desc}"
121
+ "label-CSF_probseg.nii.gz"
122
+ ),
123
+ },
124
+ "VBM_GM": {
125
+ "pattern": (
126
+ "derivatives/fmriprep/{subject}/anat/"
127
+ "{subject}_"
128
+ "{sp_anat_desc}"
129
+ "label-GM_probseg.nii.gz"
130
+ ),
131
+ },
132
+ "VBM_WM": {
133
+ "pattern": (
134
+ "derivatives/fmriprep/{subject}/anat/"
135
+ "{subject}_"
136
+ "{sp_anat_desc}"
137
+ "label-WM_probseg.nii.gz"
138
+ ),
139
+ },
140
+ "DWI": {
141
+ "pattern": (
142
+ "derivatives/dwipreproc/{subject}/dwi/"
143
+ "{subject}_desc-preproc_dwi.nii.gz"
144
+ ),
145
+ },
146
+ "FreeSurfer": {
147
+ "pattern": "derivatives/freesurfer/[!f]{subject}/mri/T1.mg[z]",
148
+ "aseg": {
149
+ "pattern": (
150
+ "derivatives/freesurfer/[!f]{subject}/mri/aseg.mg[z]"
151
+ )
152
+ },
153
+ "norm": {
154
+ "pattern": (
155
+ "derivatives/freesurfer/[!f]{subject}/mri/norm.mg[z]"
156
+ )
157
+ },
158
+ "lh_white": {
159
+ "pattern": (
160
+ "derivatives/freesurfer/[!f]{subject}/surf/lh.whit[e]"
161
+ )
162
+ },
163
+ "rh_white": {
164
+ "pattern": (
165
+ "derivatives/freesurfer/[!f]{subject}/surf/rh.whit[e]"
166
+ )
167
+ },
168
+ "lh_pial": {
169
+ "pattern": (
170
+ "derivatives/freesurfer/[!f]{subject}/surf/lh.pia[l]"
171
+ )
172
+ },
173
+ "rh_pial": {
174
+ "pattern": (
175
+ "derivatives/freesurfer/[!f]{subject}/surf/rh.pia[l]"
176
+ )
177
+ },
178
+ },
179
+ "Warp": [
180
+ {
139
181
  "pattern": (
140
182
  "derivatives/fmriprep/{subject}/anat/"
141
- "{subject}_"
142
- f"{sp_anat_desc}"
143
- "label-WM_probseg.nii.gz"
183
+ "{subject}_from-MNI152NLin2009cAsym_to-T1w_"
184
+ "mode-image_xfm.h5"
144
185
  ),
145
- "space": space,
186
+ "src": "MNI152NLin2009cAsym",
187
+ "dst": "native",
188
+ "warper": "ants",
146
189
  },
147
- "DWI": {
190
+ {
148
191
  "pattern": (
149
- "derivatives/dwipreproc/{subject}/dwi/"
150
- "{subject}_desc-preproc_dwi.nii.gz"
192
+ "derivatives/fmriprep/{subject}/anat/"
193
+ "{subject}_from-T1w_to-MNI152NLin2009cAsym_"
194
+ "mode-image_xfm.h5"
151
195
  ),
196
+ "src": "native",
197
+ "dst": "MNI152NLin2009cAsym",
198
+ "warper": "ants",
152
199
  },
153
- "FreeSurfer": {
154
- "pattern": "derivatives/freesurfer/[!f]{subject}/mri/T1.mg[z]",
155
- "aseg": {
156
- "pattern": (
157
- "derivatives/freesurfer/[!f]{subject}/mri/aseg.mg[z]"
158
- )
159
- },
160
- "norm": {
161
- "pattern": (
162
- "derivatives/freesurfer/[!f]{subject}/mri/norm.mg[z]"
163
- )
164
- },
165
- "lh_white": {
166
- "pattern": (
167
- "derivatives/freesurfer/[!f]{subject}/surf/lh.whit[e]"
168
- )
169
- },
170
- "rh_white": {
171
- "pattern": (
172
- "derivatives/freesurfer/[!f]{subject}/surf/rh.whit[e]"
173
- )
174
- },
175
- "lh_pial": {
176
- "pattern": (
177
- "derivatives/freesurfer/[!f]{subject}/surf/lh.pia[l]"
178
- )
179
- },
180
- "rh_pial": {
181
- "pattern": (
182
- "derivatives/freesurfer/[!f]{subject}/surf/rh.pia[l]"
183
- )
184
- },
185
- },
186
- "Warp": [
187
- {
188
- "pattern": (
189
- "derivatives/fmriprep/{subject}/anat/"
190
- "{subject}_from-MNI152NLin2009cAsym_to-T1w_"
191
- "mode-image_xfm.h5"
192
- ),
193
- "src": "MNI152NLin2009cAsym",
194
- "dst": "native",
195
- "warper": "ants",
196
- },
197
- {
198
- "pattern": (
199
- "derivatives/fmriprep/{subject}/anat/"
200
- "{subject}_from-T1w_to-MNI152NLin2009cAsym_"
201
- "mode-image_xfm.h5"
202
- ),
203
- "src": "native",
204
- "dst": "MNI152NLin2009cAsym",
205
- "warper": "ants",
206
- },
207
- ],
208
- }
209
- if space == "native":
210
- patterns["BOLD"]["prewarp_space"] = "MNI152NLin2009cAsym"
200
+ ],
201
+ }
202
+ replacements: list[str] = ["subject"] # noqa: RUF012
203
+ confounds_format: ConfoundsFormat = ConfoundsFormat.FMRIPrep
211
204
 
212
- else:
213
- patterns["BOLD"]["prewarp_space"] = "native"
214
-
215
- # Use native T1w assets
216
- self.space = space
217
-
218
- # Set default types
219
- if types is None:
220
- types = list(patterns.keys())
221
- # Convert single type into list
222
- else:
223
- if not isinstance(types, list):
224
- types = [types]
225
- # The replacements
226
- replacements = ["subject"]
227
- uri = "https://github.com/OpenNeuroDatasets/ds003097.git"
228
- super().__init__(
229
- types=types,
230
- datadir=datadir,
231
- uri=uri,
232
- patterns=patterns,
233
- replacements=replacements,
234
- confounds_format="fmriprep",
205
+ def validate_datagrabber_params(self) -> None:
206
+ """Run extra logical validation for datagrabber."""
207
+ # Descriptor for space in `anat`
208
+ sp_anat_desc = (
209
+ "" if self.space == "native" else "space-MNI152NLin2009cAsym_"
235
210
  )
211
+ # Descriptor for space in `func`
212
+ sp_func_desc = (
213
+ "space-T1w_"
214
+ if self.space == "native"
215
+ else "space-MNI152NLin2009cAsym_"
216
+ )
217
+ self.patterns["BOLD"]["pattern"] = self.patterns["BOLD"][
218
+ "pattern"
219
+ ].replace("{sp_func_desc}", sp_func_desc)
220
+ self.patterns["BOLD"]["mask"]["pattern"] = self.patterns["BOLD"][
221
+ "mask"
222
+ ]["pattern"].replace("{sp_func_desc}", sp_func_desc)
223
+ self.patterns["BOLD"]["reference"]["pattern"] = self.patterns["BOLD"][
224
+ "reference"
225
+ ]["pattern"].replace("{sp_func_desc}", sp_func_desc)
226
+ self.patterns["T1w"]["pattern"] = self.patterns["T1w"][
227
+ "pattern"
228
+ ].replace("{sp_anat_desc}", sp_anat_desc)
229
+ self.patterns["T1w"]["mask"]["pattern"] = self.patterns["T1w"]["mask"][
230
+ "pattern"
231
+ ].replace("{sp_anat_desc}", sp_anat_desc)
232
+ for t in ["VBM_CSF", "VBM_GM", "VBM_WM"]:
233
+ self.patterns[t]["pattern"] = self.patterns[t]["pattern"].replace(
234
+ "{sp_anat_desc}", sp_anat_desc
235
+ )
236
+ for t in ["BOLD", "T1w"]:
237
+ self.patterns[t]["space"] = self.space
238
+ self.patterns[t]["mask"]["space"] = self.space
239
+ for t in ["VBM_CSF", "VBM_GM", "VBM_WM"]:
240
+ self.patterns[t]["space"] = self.space
241
+ if self.space == "native":
242
+ self.patterns["BOLD"]["prewarp_space"] = "MNI152NLin2009cAsym"
243
+ else:
244
+ self.patterns["BOLD"]["prewarp_space"] = "native"
245
+ super().validate_datagrabber_params()