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
@@ -5,16 +5,60 @@
5
5
  # Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  # License: AGPL
7
7
 
8
- from itertools import product
9
- from pathlib import Path
10
- from typing import Union
8
+ from enum import StrEnum
9
+ from typing import Annotated, ClassVar, Literal
10
+
11
+ from pydantic import BeforeValidator
11
12
 
12
13
  from ...api.decorators import register_datagrabber
13
- from ...utils import raise_error
14
+ from ...typing import DataGrabberPatterns
15
+ from ...utils import ensure_list, raise_error
16
+ from ..base import DataType
14
17
  from ..pattern import PatternDataGrabber
15
18
 
16
19
 
17
- __all__ = ["HCP1200"]
20
+ __all__ = ["HCP1200", "HCP1200PhaseEncoding", "HCP1200Task"]
21
+
22
+
23
+ class HCP1200Task(StrEnum):
24
+ """Accepted HCP1200 tasks."""
25
+
26
+ REST1 = "REST1"
27
+ REST2 = "REST2"
28
+ SOCIAL = "SOCIAL"
29
+ WM = "WM"
30
+ RELATIONAL = "RELATIONAL"
31
+ EMOTION = "EMOTION"
32
+ LANGUAGE = "LANGUAGE"
33
+ GAMBLING = "GAMBLING"
34
+ MOTOR = "MOTOR"
35
+
36
+
37
+ class HCP1200PhaseEncoding(StrEnum):
38
+ """Accepted HCP1200 phase encoding directions."""
39
+
40
+ LR = "LR"
41
+ RL = "RL"
42
+
43
+
44
+ _types = Literal[DataType.BOLD, DataType.T1w, DataType.Warp]
45
+
46
+ _tasks = Literal[
47
+ HCP1200Task.REST1,
48
+ HCP1200Task.REST2,
49
+ HCP1200Task.SOCIAL,
50
+ HCP1200Task.WM,
51
+ HCP1200Task.RELATIONAL,
52
+ HCP1200Task.EMOTION,
53
+ HCP1200Task.LANGUAGE,
54
+ HCP1200Task.GAMBLING,
55
+ HCP1200Task.MOTOR,
56
+ ]
57
+
58
+ _phase_encodings = Literal[
59
+ HCP1200PhaseEncoding.RL,
60
+ HCP1200PhaseEncoding.LR,
61
+ ]
18
62
 
19
63
 
20
64
  @register_datagrabber
@@ -23,181 +67,124 @@ class HCP1200(PatternDataGrabber):
23
67
 
24
68
  Parameters
25
69
  ----------
26
- datadir : str or Path, optional
27
- The directory where the data is / will be stored.
70
+ types : {"BOLD", "T1w", "Warp"} or list of the options, optional
71
+ The data type(s) to grab.
72
+ datadir : pathlib.Path
73
+ The path where the data is stored.
28
74
  tasks : {"REST1", "REST2", "SOCIAL", "WM", "RELATIONAL", "EMOTION", \
29
- "LANGUAGE", "GAMBLING", "MOTOR"} or list of the options or None \
30
- , optional
31
- HCP task sessions. If None, all available task sessions are selected
32
- (default None).
33
- phase_encodings : {"LR", "RL"} or list of the options or None, optional
34
- HCP phase encoding directions. If None, both will be used
35
- (default None).
75
+ "LANGUAGE", "GAMBLING", "MOTOR"} or list of the options, optional
76
+ HCP task sessions.
77
+ By default, all available task sessions are selected.
78
+ phase_encodings : {"LR", "RL"} or list of the options, optional
79
+ HCP phase encoding directions.
80
+ By default, all are used.
36
81
  ica_fix : bool, optional
37
82
  Whether to retrieve data that was processed with ICA+FIX.
38
- Only "REST1" and "REST2" tasks are available with ICA+FIX (default
39
- False).
40
-
41
- Raises
42
- ------
43
- ValueError
44
- If invalid value is passed for ``tasks`` or ``phase_encodings``.
83
+ Only ``HCP1200Task.REST1`` and ``HCP1200Task.REST2`` tasks
84
+ are available with ICA+FIX
85
+ (default False).
45
86
 
46
87
  """
47
88
 
48
- def __init__(
49
- self,
50
- datadir: Union[str, Path],
51
- tasks: Union[str, list[str], None] = None,
52
- phase_encodings: Union[str, list[str], None] = None,
53
- ica_fix: bool = False,
54
- ) -> None:
55
- # All tasks
56
- all_tasks = [
57
- "REST1",
58
- "REST2",
59
- "SOCIAL",
60
- "WM",
61
- "RELATIONAL",
62
- "EMOTION",
63
- "LANGUAGE",
64
- "GAMBLING",
65
- "MOTOR",
66
- ]
67
- # Set default tasks
68
- if tasks is None:
69
- self.tasks: list[str] = all_tasks
70
- # Convert single task into list
71
- else:
72
- if not isinstance(tasks, list):
73
- tasks = [tasks]
74
- # Check for invalid task(s)
75
- for task in tasks:
76
- if task not in all_tasks:
77
- raise_error(
78
- f"'{task}' is not a valid HCP-YA fMRI task input. "
79
- f"Valid task values can be any or all of {all_tasks}."
80
- )
81
- self.tasks: list[str] = tasks
82
-
83
- # All phase encodings
84
- all_phase_encodings = ["LR", "RL"]
85
- # Set phase encodings
86
- if phase_encodings is None:
87
- phase_encodings = all_phase_encodings
88
- # Convert single phase encoding into list
89
- if isinstance(phase_encodings, str):
90
- phase_encodings = [phase_encodings]
91
- # Check for invalid phase encoding(s)
92
- for pe in phase_encodings:
93
- if pe not in all_phase_encodings:
94
- raise_error(
95
- f"'{pe}' is not a valid HCP-YA phase encoding. "
96
- "Valid phase encoding can be any or all of "
97
- f"{all_phase_encodings}."
98
- )
99
- self.phase_encodings = phase_encodings
100
-
101
- if ica_fix:
89
+ types: Annotated[_types | list[_types], BeforeValidator(ensure_list)] = [ # noqa: RUF012
90
+ DataType.BOLD,
91
+ DataType.T1w,
92
+ DataType.Warp,
93
+ ]
94
+ tasks: Annotated[_tasks | list[_tasks], BeforeValidator(ensure_list)] = [ # noqa: RUF012
95
+ HCP1200Task.REST1,
96
+ HCP1200Task.REST2,
97
+ HCP1200Task.SOCIAL,
98
+ HCP1200Task.WM,
99
+ HCP1200Task.RELATIONAL,
100
+ HCP1200Task.EMOTION,
101
+ HCP1200Task.LANGUAGE,
102
+ HCP1200Task.GAMBLING,
103
+ HCP1200Task.MOTOR,
104
+ ]
105
+ phase_encodings: Annotated[
106
+ _phase_encodings | list[_phase_encodings],
107
+ BeforeValidator(ensure_list),
108
+ ] = [ # noqa: RUF012
109
+ HCP1200PhaseEncoding.RL,
110
+ HCP1200PhaseEncoding.LR,
111
+ ]
112
+ ica_fix: bool = False
113
+ patterns: DataGrabberPatterns = { # noqa: RUF012
114
+ "BOLD": {
115
+ "pattern": (
116
+ "{subject}/MNINonLinear/Results/"
117
+ "?fMRI_{task}_{phase_encoding}/"
118
+ "?fMRI_{task}_{phase_encoding}"
119
+ "{suffix}.nii.gz"
120
+ ),
121
+ "space": "MNI152NLin6Asym",
122
+ },
123
+ "T1w": {
124
+ "pattern": "{subject}/T1w/T1w_acpc_dc_restore.nii.gz",
125
+ "space": "native",
126
+ },
127
+ "Warp": [
128
+ {
129
+ "pattern": (
130
+ "{subject}/MNINonLinear/xfms/standard2acpc_dc.nii.gz"
131
+ ),
132
+ "src": "MNI152NLin6Asym",
133
+ "dst": "native",
134
+ "warper": "fsl",
135
+ },
136
+ {
137
+ "pattern": (
138
+ "{subject}/MNINonLinear/xfms/acpc_dc2standard.nii.gz"
139
+ ),
140
+ "src": "native",
141
+ "dst": "MNI152NLin6Asym",
142
+ "warper": "fsl",
143
+ },
144
+ ],
145
+ }
146
+ replacements: list[str] = ["subject", "task", "phase_encoding"] # noqa: RUF012
147
+ # Only grab the specified tasks and phase encodings
148
+ _REPLACEMENT_FIELDS: ClassVar[dict[str, str]] = {
149
+ "task": "tasks",
150
+ "phase_encoding": "phase_encodings",
151
+ }
152
+
153
+ def validate_datagrabber_params(self) -> None:
154
+ """Run extra logical validation for datagrabber."""
155
+ if self.ica_fix:
102
156
  if not all(task in ["REST1", "REST2"] for task in self.tasks):
103
157
  raise_error(
104
158
  "ICA+FIX is only available for 'REST1' and 'REST2' tasks."
105
159
  )
106
- suffix = "_hp2000_clean" if ica_fix else ""
160
+ suffix = "_hp2000_clean" if self.ica_fix else ""
161
+ self.patterns["BOLD"]["pattern"] = self.patterns["BOLD"][
162
+ "pattern"
163
+ ].replace("{suffix}", suffix)
164
+ super().validate_datagrabber_params()
107
165
 
108
- # The types of data
109
- types = ["BOLD", "T1w", "Warp"]
110
- # The patterns
111
- patterns = {
112
- "BOLD": {
113
- "pattern": (
114
- "{subject}/MNINonLinear/Results/"
115
- "{task}_{phase_encoding}/"
116
- "{task}_{phase_encoding}"
117
- f"{suffix}.nii.gz"
118
- ),
119
- "space": "MNI152NLin6Asym",
120
- },
121
- "T1w": {
122
- "pattern": "{subject}/T1w/T1w_acpc_dc_restore.nii.gz",
123
- "space": "native",
124
- },
125
- "Warp": [
126
- {
127
- "pattern": (
128
- "{subject}/MNINonLinear/xfms/standard2acpc_dc.nii.gz"
129
- ),
130
- "src": "MNI152NLin6Asym",
131
- "dst": "native",
132
- "warper": "fsl",
133
- },
134
- {
135
- "pattern": (
136
- "{subject}/MNINonLinear/xfms/acpc_dc2standard.nii.gz"
137
- ),
138
- "src": "native",
139
- "dst": "MNI152NLin6Asym",
140
- "warper": "fsl",
141
- },
142
- ],
143
- }
144
- # The replacements
145
- replacements = ["subject", "task", "phase_encoding"]
146
- super().__init__(
147
- types=types,
148
- datadir=datadir,
149
- patterns=patterns,
150
- replacements=replacements,
151
- )
152
-
153
- def get_item(self, subject: str, task: str, phase_encoding: str) -> dict:
154
- """Implement single element indexing in the database.
166
+ def _replace_patterns_glob(self, element: dict, pattern: str) -> str:
167
+ """Replace ``pattern`` with the ``element`` so it can be globbed.
168
+
169
+ The BOLD data of the resting-state tasks is in ``rfMRI_*`` and of the
170
+ other tasks in ``tfMRI_*``, so the path of an element is built
171
+ without searching the files, which are in sub-datasets in
172
+ :class:`.DataladHCP1200`.
155
173
 
156
174
  Parameters
157
175
  ----------
158
- subject : str
159
- The subject ID.
160
- task : {"REST1", "REST2", "SOCIAL", "WM", "RELATIONAL", "EMOTION", \
161
- "LANGUAGE", "GAMBLING", "MOTOR"}
162
- The task.
163
- phase_encoding : {"LR", "RL"}
164
- The phase encoding.
165
-
166
- Returns
167
- -------
168
- dict
169
- Dictionary of dictionaries for each type of data required for the
170
- specified element.
171
-
172
- """
173
- # Resting task
174
- if "REST" in task:
175
- new_task = f"rfMRI_{task}"
176
- else:
177
- new_task = f"tfMRI_{task}"
178
-
179
- return super().get_item(
180
- subject=subject, task=new_task, phase_encoding=phase_encoding
181
- )
182
-
183
- def get_elements(self) -> list:
184
- """Implement fetching list of elements in the dataset.
176
+ element : dict
177
+ The element to be used in the replacement.
178
+ pattern : str
179
+ The pattern to be replaced.
185
180
 
186
181
  Returns
187
182
  -------
188
- list
189
- The list of elements that can be grabbed in the dataset.
183
+ str
184
+ The pattern with the element replaced.
190
185
 
191
186
  """
192
- subjects = [
193
- x.name
194
- for x in self.datadir.iterdir()
195
- if x.is_dir() and not x.name.startswith(".")
196
- ]
197
- elems = []
198
- for subject, task, phase_encoding in product(
199
- subjects, self.tasks, self.phase_encodings
200
- ):
201
- elems.append((subject, task, phase_encoding))
202
-
203
- return elems
187
+ if "task" in element:
188
+ prefix = "rfMRI" if "REST" in element["task"] else "tfMRI"
189
+ pattern = pattern.replace("?fMRI_", f"{prefix}_")
190
+ return super()._replace_patterns_glob(element, pattern)