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,17 +7,39 @@
7
7
  # Synchon Mandal <s.mandal@fz-juelich.de>
8
8
  # License: AGPL
9
9
 
10
- from itertools import product
11
- from pathlib import Path
12
- from typing import Union
10
+ from typing import Annotated, ClassVar, Literal
11
+
12
+ from pydantic import AnyUrl, BeforeValidator
13
13
 
14
14
  from ...api.decorators import register_datagrabber
15
- 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
16
19
  from ..pattern_datalad import PatternDataladDataGrabber
20
+ from ._types import AOMICSpace, AOMICTask
17
21
 
18
22
 
19
23
  __all__ = ["DataladAOMICPIOP2"]
20
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
+
36
+ _tasks = Literal[
37
+ AOMICTask.RestingState,
38
+ AOMICTask.StopSignal,
39
+ AOMICTask.EmoMatching,
40
+ AOMICTask.WorkingMemory,
41
+ ]
42
+
21
43
 
22
44
  @register_datagrabber
23
45
  class DataladAOMICPIOP2(PatternDataladDataGrabber):
@@ -25,273 +47,218 @@ class DataladAOMICPIOP2(PatternDataladDataGrabber):
25
47
 
26
48
  Parameters
27
49
  ----------
28
- datadir : str or Path or None, optional
29
- The directory where the datalad dataset will be cloned. If None,
30
- the datalad dataset will be cloned into a temporary directory
31
- (default None).
32
- types: {"BOLD", "T1w", "VBM_CSF", "VBM_GM", "VBM_WM", "DWI", \
33
- "FreeSurfer"} or list of the options, optional
34
- AOMIC data types. If None, all available data types are selected.
35
- (default None).
50
+ types : {"BOLD", "T1w", "VBM_CSF", "VBM_GM", "VBM_WM", "DWI", \
51
+ "FreeSurfer", "Warp"} or list of the options, optional
52
+ The data type(s) to grab.
53
+ datadir : pathlib.Path, optional
54
+ That path where the datalad dataset will be cloned.
55
+ If not specified, the datalad dataset will be cloned into a temporary
56
+ directory.
36
57
  tasks : {"restingstate", "stopsignal", "workingmemory", "emomatching"} or \
37
58
  list of the options, optional
38
- AOMIC PIOP2 task sessions. If None, all available task sessions are
39
- selected (default None).
59
+ AOMIC PIOP2 task sessions.
60
+ By default, all available task sessions are selected.
40
61
  space : {"native", "MNI152NLin2009cAsym"}, optional
41
- The space to use for the data (default "MNI152NLin2009cAsym").
42
-
43
- Raises
44
- ------
45
- ValueError
46
- If invalid value is passed for:
47
- * ``tasks``
48
- * ``space``
62
+ AOMIC space (default ``AOMICSpace.MNI152NLin2009cAsym``).
49
63
 
50
64
  """
51
65
 
52
- def __init__(
53
- self,
54
- datadir: Union[str, Path, None] = None,
55
- types: Union[str, list[str], None] = None,
56
- tasks: Union[str, list[str], None] = None,
57
- space: str = "MNI152NLin2009cAsym",
58
- ) -> None:
59
- valid_spaces = ["native", "MNI152NLin2009cAsym"]
60
- if space not in ["native", "MNI152NLin2009cAsym"]:
61
- raise_error(
62
- f"Invalid space {space}. Must be one of {valid_spaces}"
63
- )
64
- # Declare all tasks
65
- all_tasks = [
66
- "restingstate",
67
- "stopsignal",
68
- "workingmemory",
69
- "emomatching",
70
- ]
71
- # Set default tasks
72
- if tasks is None:
73
- tasks = all_tasks
74
- else:
75
- # Convert single task into list
76
- if isinstance(tasks, str):
77
- tasks = [tasks]
78
- # Verify valid tasks
79
- for t in tasks:
80
- if t not in all_tasks:
81
- raise_error(
82
- f"{t} is not a valid task in the AOMIC PIOP2 dataset!"
83
- )
84
- self.tasks = tasks
85
- # Descriptor for space in `anat`
86
- sp_anat_desc = (
87
- "" if space == "native" else "space-MNI152NLin2009cAsym_"
88
- )
89
- # Descriptor for space in `func`
90
- sp_func_desc = (
91
- "space-T1w_" if space == "native" else "space-MNI152NLin2009cAsym_"
92
- )
93
- # The patterns
94
- patterns = {
95
- "BOLD": {
66
+ uri: AnyUrl = AnyUrl("https://github.com/OpenNeuroDatasets/ds002790")
67
+ types: Annotated[_types | list[_types], BeforeValidator(ensure_list)] = [ # noqa: RUF012
68
+ DataType.BOLD,
69
+ DataType.T1w,
70
+ DataType.VBM_CSF,
71
+ DataType.VBM_GM,
72
+ DataType.VBM_WM,
73
+ DataType.DWI,
74
+ DataType.FreeSurfer,
75
+ DataType.Warp,
76
+ ]
77
+ tasks: Annotated[_tasks | list[_tasks], BeforeValidator(ensure_list)] = [ # noqa: RUF012
78
+ AOMICTask.RestingState,
79
+ AOMICTask.StopSignal,
80
+ AOMICTask.EmoMatching,
81
+ AOMICTask.WorkingMemory,
82
+ ]
83
+ space: AOMICSpace = AOMICSpace.MNI152NLin2009cAsym
84
+ patterns: DataGrabberPatterns = { # noqa: RUF012
85
+ "BOLD": {
86
+ "pattern": (
87
+ "derivatives/fmriprep/{subject}/func/"
88
+ "{subject}_task-{task}_acq-seq_"
89
+ "{sp_func_desc}"
90
+ "desc-preproc_bold.nii.gz"
91
+ ),
92
+ "mask": {
96
93
  "pattern": (
97
94
  "derivatives/fmriprep/{subject}/func/"
98
- "{subject}_task-{task}_"
99
- f"{sp_func_desc}"
100
- "desc-preproc_bold.nii.gz"
95
+ "{subject}_task-{task}_acq-seq_"
96
+ "{sp_func_desc}"
97
+ "desc-brain_mask.nii.gz"
101
98
  ),
102
- "space": space,
103
- "mask": {
104
- "pattern": (
105
- "derivatives/fmriprep/{subject}/func/"
106
- "{subject}_task-{task}_"
107
- f"{sp_func_desc}"
108
- "desc-brain_mask.nii.gz"
109
- ),
110
- "space": space,
111
- },
112
- "confounds": {
113
- "pattern": (
114
- "derivatives/fmriprep/{subject}/func/"
115
- "{subject}_task-{task}_"
116
- "desc-confounds_regressors.tsv"
117
- ),
118
- "format": "fmriprep",
119
- },
120
- "reference": {
121
- "pattern": (
122
- "derivatives/fmriprep/{subject}/func/"
123
- "{subject}_task-{task}_"
124
- f"{sp_func_desc}"
125
- "boldref.nii.gz"
126
- ),
127
- },
128
99
  },
129
- "T1w": {
100
+ "confounds": {
130
101
  "pattern": (
131
- "derivatives/fmriprep/{subject}/anat/"
132
- "{subject}_"
133
- f"{sp_anat_desc}"
134
- "desc-preproc_T1w.nii.gz"
102
+ "derivatives/fmriprep/{subject}/func/"
103
+ "{subject}_task-{task}_acq-seq_"
104
+ "desc-confounds_regressors.tsv"
135
105
  ),
136
- "space": space,
137
- "mask": {
138
- "pattern": (
139
- "derivatives/fmriprep/{subject}/anat/"
140
- "{subject}_"
141
- f"{sp_anat_desc}"
142
- "desc-brain_mask.nii.gz"
143
- ),
144
- "space": space,
145
- },
106
+ "format": "fmriprep",
146
107
  },
147
- "VBM_CSF": {
108
+ "reference": {
148
109
  "pattern": (
149
- "derivatives/fmriprep/{subject}/anat/"
150
- "{subject}_"
151
- f"{sp_anat_desc}"
152
- "label-CSF_probseg.nii.gz"
110
+ "derivatives/fmriprep/{subject}/func/"
111
+ "{subject}_task-{task}_acq-seq_"
112
+ "{sp_func_desc}"
113
+ "boldref.nii.gz"
153
114
  ),
154
- "space": space,
155
115
  },
156
- "VBM_GM": {
116
+ },
117
+ "T1w": {
118
+ "pattern": (
119
+ "derivatives/fmriprep/{subject}/anat/"
120
+ "{subject}_"
121
+ "{sp_anat_desc}"
122
+ "desc-preproc_T1w.nii.gz"
123
+ ),
124
+ "mask": {
157
125
  "pattern": (
158
126
  "derivatives/fmriprep/{subject}/anat/"
159
127
  "{subject}_"
160
- f"{sp_anat_desc}"
161
- "label-GM_probseg.nii.gz"
128
+ "{sp_anat_desc}"
129
+ "desc-brain_mask.nii.gz"
162
130
  ),
163
- "space": space,
164
131
  },
165
- "VBM_WM": {
132
+ },
133
+ "VBM_CSF": {
134
+ "pattern": (
135
+ "derivatives/fmriprep/{subject}/anat/"
136
+ "{subject}_"
137
+ "{sp_anat_desc}"
138
+ "label-CSF_probseg.nii.gz"
139
+ ),
140
+ },
141
+ "VBM_GM": {
142
+ "pattern": (
143
+ "derivatives/fmriprep/{subject}/anat/"
144
+ "{subject}_"
145
+ "{sp_anat_desc}"
146
+ "label-GM_probseg.nii.gz"
147
+ ),
148
+ },
149
+ "VBM_WM": {
150
+ "pattern": (
151
+ "derivatives/fmriprep/{subject}/anat/"
152
+ "{subject}_"
153
+ "{sp_anat_desc}"
154
+ "label-WM_probseg.nii.gz"
155
+ ),
156
+ },
157
+ "DWI": {
158
+ "pattern": (
159
+ "derivatives/dwipreproc/{subject}/dwi/"
160
+ "{subject}_desc-preproc_dwi.nii.gz"
161
+ ),
162
+ },
163
+ "FreeSurfer": {
164
+ "pattern": "derivatives/freesurfer/[!f]{subject}/mri/T1.mg[z]",
165
+ "aseg": {
166
+ "pattern": (
167
+ "derivatives/freesurfer/[!f]{subject}/mri/aseg.mg[z]"
168
+ )
169
+ },
170
+ "norm": {
171
+ "pattern": (
172
+ "derivatives/freesurfer/[!f]{subject}/mri/norm.mg[z]"
173
+ )
174
+ },
175
+ "lh_white": {
176
+ "pattern": (
177
+ "derivatives/freesurfer/[!f]{subject}/surf/lh.whit[e]"
178
+ )
179
+ },
180
+ "rh_white": {
181
+ "pattern": (
182
+ "derivatives/freesurfer/[!f]{subject}/surf/rh.whit[e]"
183
+ )
184
+ },
185
+ "lh_pial": {
186
+ "pattern": (
187
+ "derivatives/freesurfer/[!f]{subject}/surf/lh.pia[l]"
188
+ )
189
+ },
190
+ "rh_pial": {
191
+ "pattern": (
192
+ "derivatives/freesurfer/[!f]{subject}/surf/rh.pia[l]"
193
+ )
194
+ },
195
+ },
196
+ "Warp": [
197
+ {
166
198
  "pattern": (
167
199
  "derivatives/fmriprep/{subject}/anat/"
168
- "{subject}_"
169
- f"{sp_anat_desc}"
170
- "label-WM_probseg.nii.gz"
200
+ "{subject}_from-MNI152NLin2009cAsym_to-T1w_"
201
+ "mode-image_xfm.h5"
171
202
  ),
172
- "space": space,
203
+ "src": "MNI152NLin2009cAsym",
204
+ "dst": "native",
205
+ "warper": "ants",
173
206
  },
174
- "DWI": {
207
+ {
175
208
  "pattern": (
176
- "derivatives/dwipreproc/{subject}/dwi/"
177
- "{subject}_desc-preproc_dwi.nii.gz"
209
+ "derivatives/fmriprep/{subject}/anat/"
210
+ "{subject}_from-T1w_to-MNI152NLin2009cAsym_"
211
+ "mode-image_xfm.h5"
178
212
  ),
213
+ "src": "native",
214
+ "dst": "MNI152NLin2009cAsym",
215
+ "warper": "ants",
179
216
  },
180
- "FreeSurfer": {
181
- "pattern": "derivatives/freesurfer/[!f]{subject}/mri/T1.mg[z]",
182
- "aseg": {
183
- "pattern": (
184
- "derivatives/freesurfer/[!f]{subject}/mri/aseg.mg[z]"
185
- )
186
- },
187
- "norm": {
188
- "pattern": (
189
- "derivatives/freesurfer/[!f]{subject}/mri/norm.mg[z]"
190
- )
191
- },
192
- "lh_white": {
193
- "pattern": (
194
- "derivatives/freesurfer/[!f]{subject}/surf/lh.whit[e]"
195
- )
196
- },
197
- "rh_white": {
198
- "pattern": (
199
- "derivatives/freesurfer/[!f]{subject}/surf/rh.whit[e]"
200
- )
201
- },
202
- "lh_pial": {
203
- "pattern": (
204
- "derivatives/freesurfer/[!f]{subject}/surf/lh.pia[l]"
205
- )
206
- },
207
- "rh_pial": {
208
- "pattern": (
209
- "derivatives/freesurfer/[!f]{subject}/surf/rh.pia[l]"
210
- )
211
- },
212
- },
213
- "Warp": [
214
- {
215
- "pattern": (
216
- "derivatives/fmriprep/{subject}/anat/"
217
- "{subject}_from-MNI152NLin2009cAsym_to-T1w_"
218
- "mode-image_xfm.h5"
219
- ),
220
- "src": "MNI152NLin2009cAsym",
221
- "dst": "native",
222
- "warper": "ants",
223
- },
224
- {
225
- "pattern": (
226
- "derivatives/fmriprep/{subject}/anat/"
227
- "{subject}_from-T1w_to-MNI152NLin2009cAsym_"
228
- "mode-image_xfm.h5"
229
- ),
230
- "src": "native",
231
- "dst": "MNI152NLin2009cAsym",
232
- "warper": "ants",
233
- },
234
- ],
235
- }
217
+ ],
218
+ }
219
+ replacements: list[str] = ["subject", "task"] # noqa: RUF012
220
+ # Only grab the specified tasks
221
+ _REPLACEMENT_FIELDS: ClassVar[dict[str, str]] = {"task": "tasks"}
222
+ confounds_format: ConfoundsFormat = ConfoundsFormat.FMRIPrep
236
223
 
237
- if space == "native":
238
- patterns["BOLD"]["prewarp_space"] = "MNI152NLin2009cAsym"
239
- else:
240
- patterns["BOLD"]["prewarp_space"] = "native"
241
-
242
- # Use native T1w assets
243
- self.space = space
244
-
245
- # Set default types
246
- if types is None:
247
- types = list(patterns.keys())
248
- # Convert single type into list
249
- else:
250
- if not isinstance(types, list):
251
- types = [types]
252
- # The replacements
253
- replacements = ["subject", "task"]
254
- uri = "https://github.com/OpenNeuroDatasets/ds002790"
255
- super().__init__(
256
- types=types,
257
- datadir=datadir,
258
- uri=uri,
259
- patterns=patterns,
260
- replacements=replacements,
261
- confounds_format="fmriprep",
224
+ def validate_datagrabber_params(self) -> None:
225
+ """Run extra logical validation for datagrabber."""
226
+ # Descriptor for space in `anat`
227
+ sp_anat_desc = (
228
+ "" if self.space == "native" else "space-MNI152NLin2009cAsym_"
262
229
  )
263
-
264
- def get_elements(self) -> list:
265
- """Implement fetching list of elements in the dataset.
266
-
267
- Returns
268
- -------
269
- list
270
- The list of elements that can be grabbed in the dataset after
271
- imposing constraints based on specified tasks.
272
-
273
- """
274
- subjects = [f"sub-{x:04d}" for x in range(1, 227)]
275
- elems = []
276
- for subject, task in product(subjects, self.tasks):
277
- elems.append((subject, task))
278
- return elems
279
-
280
- def get_item(self, subject: str, task: str) -> dict:
281
- """Index one element in the dataset.
282
-
283
- Parameters
284
- ----------
285
- subject : str
286
- The subject ID.
287
- task : {"restingstate", "stopsignal", "workingmemory"}
288
- The task to get.
289
-
290
- Returns
291
- -------
292
- out : dict
293
- Dictionary of paths for each type of data required for the
294
- specified element.
295
-
296
- """
297
- return super().get_item(subject=subject, task=f"{task}_acq-seq")
230
+ # Descriptor for space in `func`
231
+ sp_func_desc = (
232
+ "space-T1w_"
233
+ if self.space == "native"
234
+ else "space-MNI152NLin2009cAsym_"
235
+ )
236
+ self.patterns["BOLD"]["pattern"] = self.patterns["BOLD"][
237
+ "pattern"
238
+ ].replace("{sp_func_desc}", sp_func_desc)
239
+ self.patterns["BOLD"]["mask"]["pattern"] = self.patterns["BOLD"][
240
+ "mask"
241
+ ]["pattern"].replace("{sp_func_desc}", sp_func_desc)
242
+ self.patterns["BOLD"]["reference"]["pattern"] = self.patterns["BOLD"][
243
+ "reference"
244
+ ]["pattern"].replace("{sp_func_desc}", sp_func_desc)
245
+ self.patterns["T1w"]["pattern"] = self.patterns["T1w"][
246
+ "pattern"
247
+ ].replace("{sp_anat_desc}", sp_anat_desc)
248
+ self.patterns["T1w"]["mask"]["pattern"] = self.patterns["T1w"]["mask"][
249
+ "pattern"
250
+ ].replace("{sp_anat_desc}", sp_anat_desc)
251
+ for t in ["VBM_CSF", "VBM_GM", "VBM_WM"]:
252
+ self.patterns[t]["pattern"] = self.patterns[t]["pattern"].replace(
253
+ "{sp_anat_desc}", sp_anat_desc
254
+ )
255
+ for t in ["BOLD", "T1w"]:
256
+ self.patterns[t]["space"] = self.space
257
+ self.patterns[t]["mask"]["space"] = self.space
258
+ for t in ["VBM_CSF", "VBM_GM", "VBM_WM"]:
259
+ self.patterns[t]["space"] = self.space
260
+ if self.space == "native":
261
+ self.patterns["BOLD"]["prewarp_space"] = "MNI152NLin2009cAsym"
262
+ else:
263
+ self.patterns["BOLD"]["prewarp_space"] = "native"
264
+ super().validate_datagrabber_params()