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