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,9 +5,13 @@
5
5
  # Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  # License: AGPL
7
7
 
8
- from typing import Any, Optional, Union
8
+ from typing import Annotated, Any
9
+
10
+ from pydantic import BeforeValidator
9
11
 
10
12
  from ...api.decorators import register_marker
13
+ from ...datagrabber import DataType
14
+ from ...utils import ensure_list
11
15
  from ..parcel_aggregation import ParcelAggregation
12
16
  from .functional_connectivity_base import FunctionalConnectivityBase
13
17
 
@@ -25,56 +29,37 @@ class FunctionalConnectivityParcels(FunctionalConnectivityBase):
25
29
  The name(s) of the parcellation(s) to use.
26
30
  See :func:`.list_data` for options.
27
31
  agg_method : str, optional
28
- The method to perform aggregation using.
32
+ The aggregation function to use.
29
33
  See :func:`.get_aggfunc_by_name` for options
30
34
  (default "mean").
31
- agg_method_params : dict, optional
32
- Parameters to pass to the aggregation function.
33
- See :func:`.get_aggfunc_by_name` for options
34
- (default None).
35
+ agg_method_params : dict or None, optional
36
+ The parameters to pass to the aggregation function.
37
+ See :func:`.get_aggfunc_by_name` for options (default None).
35
38
  conn_method : str, optional
36
- The method to perform connectivity measure using.
39
+ The connectivity measure to use.
37
40
  See :class:`.JuniferConnectivityMeasure` for options
38
41
  (default "correlation").
39
- conn_method_params : dict, optional
40
- Parameters to pass to :class:`.JuniferConnectivityMeasure`.
42
+ conn_method_params : dict or None, optional
43
+ The parameters to pass to :class:`.JuniferConnectivityMeasure`.
41
44
  If None, ``{"empirical": True}`` will be used, which would mean
42
45
  :class:`sklearn.covariance.EmpiricalCovariance` is used to compute
43
46
  covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
44
47
  desired, ``{"empirical": False}`` should be passed
45
48
  (default None).
46
- masks : str, dict or list of dict or str, optional
49
+ masks : str, dict, list of them or None, optional
47
50
  The specification of the masks to apply to regions before extracting
48
51
  signals. Check :ref:`Using Masks <using_masks>` for more details.
49
52
  If None, will not apply any mask (default None).
50
- name : str, optional
51
- The name of the marker. If None, will use
52
- ``BOLD_FunctionalConnectivityParcels`` (default None).
53
+ name : str or None, optional
54
+ The name of the marker.
55
+ If None, will use the class name (default None).
53
56
 
54
57
  """
55
58
 
56
- def __init__(
57
- self,
58
- parcellation: Union[str, list[str]],
59
- agg_method: str = "mean",
60
- agg_method_params: Optional[dict] = None,
61
- conn_method: str = "correlation",
62
- conn_method_params: Optional[dict] = None,
63
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
64
- name: Optional[str] = None,
65
- ) -> None:
66
- self.parcellation = parcellation
67
- super().__init__(
68
- agg_method=agg_method,
69
- agg_method_params=agg_method_params,
70
- conn_method=conn_method,
71
- conn_method_params=conn_method_params,
72
- masks=masks,
73
- name=name,
74
- )
59
+ parcellation: Annotated[str | list[str], BeforeValidator(ensure_list)]
75
60
 
76
61
  def aggregate(
77
- self, input: dict[str, Any], extra_input: Optional[dict] = None
62
+ self, input: dict[str, Any], extra_input: dict | None = None
78
63
  ) -> dict:
79
64
  """Perform parcel aggregation.
80
65
 
@@ -107,5 +92,5 @@ class FunctionalConnectivityParcels(FunctionalConnectivityBase):
107
92
  method=self.agg_method,
108
93
  method_params=self.agg_method_params,
109
94
  masks=self.masks,
110
- on="BOLD",
95
+ on=DataType.BOLD,
111
96
  ).compute(input=input, extra_input=extra_input)
@@ -5,11 +5,13 @@
5
5
  # Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  # License: AGPL
7
7
 
8
- from typing import Any, Optional, Union
8
+ from typing import Any, Literal
9
+
10
+ from pydantic import PositiveFloat
9
11
 
10
12
  from ...api.decorators import register_marker
13
+ from ...datagrabber import DataType
11
14
  from ..sphere_aggregation import SphereAggregation
12
- from ..utils import raise_error
13
15
  from .functional_connectivity_base import FunctionalConnectivityBase
14
16
 
15
17
 
@@ -25,71 +27,48 @@ class FunctionalConnectivitySpheres(FunctionalConnectivityBase):
25
27
  coords : str
26
28
  The name of the coordinates list to use.
27
29
  See :func:`.list_data` for options.
28
- radius : positive float, optional
29
- The radius of the sphere around each coordinates in millimetres.
30
+ radius : ``zero`` or positive float or None, optional
31
+ The radius of the sphere in millimetres.
30
32
  If None, the signal will be extracted from a single voxel.
31
33
  See :class:`.JuniferNiftiSpheresMasker` for more information
32
34
  (default None).
33
35
  allow_overlap : bool, optional
34
- Whether to allow overlapping spheres. If False, an error is raised if
35
- the spheres overlap (default False).
36
+ Whether to allow overlapping spheres.
37
+ If False, an error is raised if the spheres overlap (default False).
36
38
  agg_method : str, optional
37
- The method to perform aggregation using.
39
+ The aggregation function to use.
38
40
  See :func:`.get_aggfunc_by_name` for options
39
41
  (default "mean").
40
- agg_method_params : dict, optional
41
- Parameters to pass to the aggregation function.
42
- See :func:`.get_aggfunc_by_name` for options
43
- (default None).
42
+ agg_method_params : dict or None, optional
43
+ The parameters to pass to the aggregation function.
44
+ See :func:`.get_aggfunc_by_name` for options (default None).
44
45
  conn_method : str, optional
45
- The method to perform connectivity measure using.
46
+ The connectivity measure to use.
46
47
  See :class:`.JuniferConnectivityMeasure` for options
47
48
  (default "correlation").
48
- conn_method_params : dict, optional
49
- Parameters to pass to :class:`.JuniferConnectivityMeasure`.
49
+ conn_method_params : dict or None, optional
50
+ The parameters to pass to :class:`.JuniferConnectivityMeasure`.
50
51
  If None, ``{"empirical": True}`` will be used, which would mean
51
52
  :class:`sklearn.covariance.EmpiricalCovariance` is used to compute
52
53
  covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
53
54
  desired, ``{"empirical": False}`` should be passed
54
55
  (default None).
55
- masks : str, dict or list of dict or str, optional
56
+ masks : str, dict, list of them or None, optional
56
57
  The specification of the masks to apply to regions before extracting
57
58
  signals. Check :ref:`Using Masks <using_masks>` for more details.
58
59
  If None, will not apply any mask (default None).
59
- name : str, optional
60
- The name of the marker. If None, will use
61
- ``BOLD_FunctionalConnectivitySpheres`` (default None).
60
+ name : str or None, optional
61
+ The name of the marker.
62
+ If None, will use the class name (default None).
62
63
 
63
64
  """
64
65
 
65
- def __init__(
66
- self,
67
- coords: str,
68
- radius: Optional[float] = None,
69
- allow_overlap: bool = False,
70
- agg_method: str = "mean",
71
- agg_method_params: Optional[dict] = None,
72
- conn_method: str = "correlation",
73
- conn_method_params: Optional[dict] = None,
74
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
75
- name: Optional[str] = None,
76
- ) -> None:
77
- self.coords = coords
78
- self.radius = radius
79
- self.allow_overlap = allow_overlap
80
- if radius is None or radius <= 0:
81
- raise_error(f"radius should be > 0: provided {radius}")
82
- super().__init__(
83
- agg_method=agg_method,
84
- agg_method_params=agg_method_params,
85
- conn_method=conn_method,
86
- conn_method_params=conn_method_params,
87
- masks=masks,
88
- name=name,
89
- )
66
+ coords: str
67
+ radius: Literal[0] | PositiveFloat | None = None
68
+ allow_overlap: bool = False
90
69
 
91
70
  def aggregate(
92
- self, input: dict[str, Any], extra_input: Optional[dict] = None
71
+ self, input: dict[str, Any], extra_input: dict | None = None
93
72
  ) -> dict:
94
73
  """Perform sphere aggregation.
95
74
 
@@ -124,5 +103,5 @@ class FunctionalConnectivitySpheres(FunctionalConnectivityBase):
124
103
  method=self.agg_method,
125
104
  method_params=self.agg_method_params,
126
105
  masks=self.masks,
127
- on="BOLD",
106
+ on=DataType.BOLD,
128
107
  ).compute(input=input, extra_input=extra_input)
@@ -9,16 +9,19 @@ from pathlib import Path
9
9
 
10
10
  import pytest
11
11
 
12
+ from junifer.datagrabber import DataType
12
13
  from junifer.datareader import DefaultDataReader
13
- from junifer.markers.functional_connectivity import CrossParcellationFC
14
+ from junifer.markers import CrossParcellationFC
14
15
  from junifer.pipeline import WorkDirManager
15
- from junifer.pipeline.utils import _check_ants
16
- from junifer.storage import SQLiteFeatureStorage
17
- from junifer.testing.datagrabbers import SPMAuditoryTestingDataGrabber
16
+ from junifer.storage import HDF5FeatureStorage
17
+ from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber
18
18
 
19
19
 
20
- parcellation_one = "Schaefer100x17"
21
- parcellation_two = "Schaefer200x17"
20
+ pytestmark = pytest.mark.external
21
+
22
+
23
+ parcellation_one = "Shen_2013_50"
24
+ parcellation_two = "Shen_2013_100"
22
25
 
23
26
 
24
27
  def test_init() -> None:
@@ -35,12 +38,11 @@ def test_storage_type() -> None:
35
38
  """Test CrossParcellationFC storage_type."""
36
39
  assert "matrix" == CrossParcellationFC(
37
40
  parcellation_one=parcellation_one, parcellation_two=parcellation_two
38
- ).storage_type(input_type="BOLD", output_feature="functional_connectivity")
41
+ ).storage_type(
42
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
43
+ )
39
44
 
40
45
 
41
- @pytest.mark.skipif(
42
- _check_ants() is False, reason="requires ANTs to be in PATH"
43
- )
44
46
  def test_compute(tmp_path: Path) -> None:
45
47
  """Test CrossParcellationFC compute().
46
48
 
@@ -50,8 +52,8 @@ def test_compute(tmp_path: Path) -> None:
50
52
  The path to the test directory.
51
53
 
52
54
  """
53
- with SPMAuditoryTestingDataGrabber() as dg:
54
- element_data = DefaultDataReader().fit_transform(dg["sub001"])
55
+ with PartlyCloudyTestingDataGrabber() as dg:
56
+ element_data = DefaultDataReader().fit_transform(dg["sub-01"])
55
57
  WorkDirManager().workdir = tmp_path
56
58
  crossparcellation = CrossParcellationFC(
57
59
  parcellation_one=parcellation_one,
@@ -61,14 +63,11 @@ def test_compute(tmp_path: Path) -> None:
61
63
  out = crossparcellation.compute(element_data["BOLD"])[
62
64
  "functional_connectivity"
63
65
  ]
64
- assert out["data"].shape == (200, 100)
65
- assert len(out["col_names"]) == 100
66
- assert len(out["row_names"]) == 200
66
+ assert out["data"].shape == (184, 93)
67
+ assert len(out["col_names"]) == 93
68
+ assert len(out["row_names"]) == 184
67
69
 
68
70
 
69
- @pytest.mark.skipif(
70
- _check_ants() is False, reason="requires ANTs to be in PATH"
71
- )
72
71
  def test_store(tmp_path: Path) -> None:
73
72
  """Test CrossParcellationFC store().
74
73
 
@@ -78,16 +77,16 @@ def test_store(tmp_path: Path) -> None:
78
77
  The path to the test directory.
79
78
 
80
79
  """
81
- with SPMAuditoryTestingDataGrabber() as dg:
82
- element_data = DefaultDataReader().fit_transform(dg["sub001"])
80
+ with PartlyCloudyTestingDataGrabber() as dg:
81
+ element_data = DefaultDataReader().fit_transform(dg["sub-01"])
83
82
  WorkDirManager().workdir = tmp_path
84
83
  crossparcellation = CrossParcellationFC(
85
84
  parcellation_one=parcellation_one,
86
85
  parcellation_two=parcellation_two,
87
86
  corr_method="spearman",
88
87
  )
89
- storage = SQLiteFeatureStorage(
90
- uri=tmp_path / "test_crossparcellation.sqlite", upsert="ignore"
88
+ storage = HDF5FeatureStorage(
89
+ uri=tmp_path / "test_crossparcellation.hdf5",
91
90
  )
92
91
  # Fit transform marker on data with storage
93
92
  crossparcellation.fit_transform(input=element_data, storage=storage)
@@ -7,10 +7,14 @@ from pathlib import Path
7
7
 
8
8
  import pytest
9
9
 
10
- from junifer.datagrabber import PatternDataladDataGrabber
10
+ from junifer.datagrabber import DataType
11
11
  from junifer.datareader import DefaultDataReader
12
12
  from junifer.markers import EdgeCentricFCMaps
13
13
  from junifer.storage import HDF5FeatureStorage
14
+ from junifer.testing.datagrabbers import ADHDTestingDataGrabber
15
+
16
+
17
+ pytestmark = pytest.mark.external
14
18
 
15
19
 
16
20
  @pytest.mark.parametrize(
@@ -22,7 +26,6 @@ from junifer.storage import HDF5FeatureStorage
22
26
  )
23
27
  def test_EdgeCentricFCMaps(
24
28
  tmp_path: Path,
25
- maps_datagrabber: PatternDataladDataGrabber,
26
29
  conn_method_params: dict[str, bool],
27
30
  ) -> None:
28
31
  """Test EdgeCentricFCMaps.
@@ -31,14 +34,12 @@ def test_EdgeCentricFCMaps(
31
34
  ----------
32
35
  tmp_path : pathlib.Path
33
36
  The path to the test directory.
34
- maps_datagrabber : PatternDataladDataGrabber
35
- The testing PatternDataladDataGrabber, as fixture.
36
37
  conn_method_params : dict
37
38
  The parametrized parameters to connectivity measure method.
38
39
 
39
40
  """
40
- with maps_datagrabber as dg:
41
- element = dg[("sub-01", "sub-001", "rest", "1")]
41
+ with ADHDTestingDataGrabber() as dg:
42
+ element = dg["sub-01"]
42
43
  element_data = DefaultDataReader().fit_transform(element)
43
44
  # Setup marker
44
45
  marker = EdgeCentricFCMaps(
@@ -48,7 +49,7 @@ def test_EdgeCentricFCMaps(
48
49
  )
49
50
  # Check correct output
50
51
  assert "matrix" == marker.storage_type(
51
- input_type="BOLD", output_feature="functional_connectivity"
52
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
52
53
  )
53
54
 
54
55
  # Fit-transform the data
@@ -8,12 +8,16 @@ from pathlib import Path
8
8
 
9
9
  import pytest
10
10
 
11
+ from junifer.datagrabber import DataType
11
12
  from junifer.datareader import DefaultDataReader
12
13
  from junifer.markers.functional_connectivity import EdgeCentricFCParcels
13
- from junifer.storage import SQLiteFeatureStorage
14
+ from junifer.storage import HDF5FeatureStorage
14
15
  from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber
15
16
 
16
17
 
18
+ pytestmark = pytest.mark.external
19
+
20
+
17
21
  @pytest.mark.parametrize(
18
22
  "conn_method_params",
19
23
  [
@@ -46,7 +50,7 @@ def test_EdgeCentricFCParcels(
46
50
  )
47
51
  # Check correct output
48
52
  assert "matrix" == marker.storage_type(
49
- input_type="BOLD", output_feature="functional_connectivity"
53
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
50
54
  )
51
55
 
52
56
  # Fit-transform the data
@@ -63,8 +67,8 @@ def test_EdgeCentricFCParcels(
63
67
  assert len(set(edge_fc_bold["col_names"])) == n_edges
64
68
 
65
69
  # Store
66
- storage = SQLiteFeatureStorage(
67
- uri=tmp_path / "test_edge_fc_parcels.sqlite", upsert="ignore"
70
+ storage = HDF5FeatureStorage(
71
+ uri=tmp_path / "test_edge_fc_parcels.hdf5",
68
72
  )
69
73
  marker.fit_transform(input=element_data, storage=storage)
70
74
  features = storage.list_features()
@@ -8,12 +8,16 @@ from pathlib import Path
8
8
 
9
9
  import pytest
10
10
 
11
+ from junifer.datagrabber import DataType
11
12
  from junifer.datareader import DefaultDataReader
12
13
  from junifer.markers.functional_connectivity import EdgeCentricFCSpheres
13
- from junifer.storage import SQLiteFeatureStorage
14
+ from junifer.storage import HDF5FeatureStorage
14
15
  from junifer.testing.datagrabbers import SPMAuditoryTestingDataGrabber
15
16
 
16
17
 
18
+ pytestmark = pytest.mark.external
19
+
20
+
17
21
  @pytest.mark.parametrize(
18
22
  "conn_method_params",
19
23
  [
@@ -47,7 +51,7 @@ def test_EdgeCentricFCSpheres(
47
51
  )
48
52
  # Check correct output
49
53
  assert "matrix" == marker.storage_type(
50
- input_type="BOLD", output_feature="functional_connectivity"
54
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
51
55
  )
52
56
 
53
57
  # Fit-transform the data
@@ -65,8 +69,8 @@ def test_EdgeCentricFCSpheres(
65
69
  assert len(set(edge_fc_bold["col_names"])) == n_edges
66
70
 
67
71
  # Store
68
- storage = SQLiteFeatureStorage(
69
- uri=tmp_path / "test_edge_fc_spheres.sqlite", upsert="ignore"
72
+ storage = HDF5FeatureStorage(
73
+ uri=tmp_path / "test_edge_fc_spheres.hdf5",
70
74
  )
71
75
  marker.fit_transform(input=element_data, storage=storage)
72
76
  features = storage.list_features()
@@ -13,10 +13,14 @@ from numpy.testing import assert_array_almost_equal
13
13
  from sklearn.covariance import EmpiricalCovariance, LedoitWolf
14
14
 
15
15
  from junifer.data import MapsRegistry
16
- from junifer.datagrabber import PatternDataladDataGrabber
16
+ from junifer.datagrabber import DataType
17
17
  from junifer.datareader import DefaultDataReader
18
18
  from junifer.markers import FunctionalConnectivityMaps
19
19
  from junifer.storage import HDF5FeatureStorage
20
+ from junifer.testing.datagrabbers import ADHDTestingDataGrabber
21
+
22
+
23
+ pytestmark = pytest.mark.external
20
24
 
21
25
 
22
26
  if TYPE_CHECKING:
@@ -32,7 +36,6 @@ if TYPE_CHECKING:
32
36
  )
33
37
  def test_FunctionalConnectivityMaps(
34
38
  tmp_path: Path,
35
- maps_datagrabber: PatternDataladDataGrabber,
36
39
  conn_method_params: dict[str, bool],
37
40
  cov_estimator: type["BaseEstimator"],
38
41
  ) -> None:
@@ -42,16 +45,14 @@ def test_FunctionalConnectivityMaps(
42
45
  ----------
43
46
  tmp_path : pathlib.Path
44
47
  The path to the test directory.
45
- maps_datagrabber : PatternDataladDataGrabber
46
- The testing PatternDataladDataGrabber, as fixture.
47
48
  conn_method_params : dict
48
49
  The parametrized parameters to connectivity measure method.
49
50
  cov_estimator : estimator object
50
51
  The parametrized covariance estimator.
51
52
 
52
53
  """
53
- with maps_datagrabber as dg:
54
- element = dg[("sub-01", "sub-001", "rest", "1")]
54
+ with ADHDTestingDataGrabber() as dg:
55
+ element = dg["sub-01"]
55
56
  element_data = DefaultDataReader().fit_transform(element)
56
57
  # Setup marker
57
58
  marker = FunctionalConnectivityMaps(
@@ -61,7 +62,7 @@ def test_FunctionalConnectivityMaps(
61
62
  )
62
63
  # Check correct output
63
64
  assert "matrix" == marker.storage_type(
64
- input_type="BOLD", output_feature="functional_connectivity"
65
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
65
66
  )
66
67
 
67
68
  # Fit-transform the data
@@ -15,14 +15,18 @@ from numpy.testing import assert_array_almost_equal
15
15
  from sklearn.covariance import EmpiricalCovariance, LedoitWolf
16
16
 
17
17
  from junifer.data import ParcellationRegistry
18
+ from junifer.datagrabber import DataType
18
19
  from junifer.datareader import DefaultDataReader
19
- from junifer.markers.functional_connectivity import (
20
+ from junifer.markers import (
20
21
  FunctionalConnectivityParcels,
21
22
  )
22
- from junifer.storage import SQLiteFeatureStorage
23
+ from junifer.storage import HDF5FeatureStorage
23
24
  from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber
24
25
 
25
26
 
27
+ pytestmark = pytest.mark.external
28
+
29
+
26
30
  if TYPE_CHECKING:
27
31
  from sklearn.base import BaseEstimator
28
32
 
@@ -62,7 +66,7 @@ def test_FunctionalConnectivityParcels(
62
66
  )
63
67
  # Check correct output
64
68
  assert "matrix" == marker.storage_type(
65
- input_type="BOLD", output_feature="functional_connectivity"
69
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
66
70
  )
67
71
 
68
72
  # Fit-transform the data
@@ -101,8 +105,8 @@ def test_FunctionalConnectivityParcels(
101
105
  )
102
106
 
103
107
  # Store
104
- storage = SQLiteFeatureStorage(
105
- uri=tmp_path / "test_fc_parcels.sqlite", upsert="ignore"
108
+ storage = HDF5FeatureStorage(
109
+ uri=tmp_path / "test_fc_parcels.hdf5",
106
110
  )
107
111
  marker.fit_transform(input=element_data, storage=storage)
108
112
  features = storage.list_features()
@@ -16,14 +16,18 @@ from numpy.testing import assert_array_almost_equal
16
16
  from sklearn.covariance import EmpiricalCovariance, LedoitWolf
17
17
 
18
18
  from junifer.data import CoordinatesRegistry
19
+ from junifer.datagrabber import DataType
19
20
  from junifer.datareader import DefaultDataReader
20
21
  from junifer.markers.functional_connectivity import (
21
22
  FunctionalConnectivitySpheres,
22
23
  )
23
- from junifer.storage import SQLiteFeatureStorage
24
+ from junifer.storage import HDF5FeatureStorage
24
25
  from junifer.testing.datagrabbers import SPMAuditoryTestingDataGrabber
25
26
 
26
27
 
28
+ pytestmark = pytest.mark.external
29
+
30
+
27
31
  if TYPE_CHECKING:
28
32
  from sklearn.base import BaseEstimator
29
33
 
@@ -64,7 +68,7 @@ def test_FunctionalConnectivitySpheres(
64
68
  )
65
69
  # Check correct output
66
70
  assert "matrix" == marker.storage_type(
67
- input_type="BOLD", output_feature="functional_connectivity"
71
+ input_type=DataType.BOLD, output_feature="functional_connectivity"
68
72
  )
69
73
 
70
74
  # Fit-transform the data
@@ -102,8 +106,8 @@ def test_FunctionalConnectivitySpheres(
102
106
  )
103
107
 
104
108
  # Store
105
- storage = SQLiteFeatureStorage(
106
- uri=tmp_path / "test_fc_spheres.sqlite", upsert="ignore"
109
+ storage = HDF5FeatureStorage(
110
+ uri=tmp_path / "test_fc_spheres.hdf5",
107
111
  )
108
112
  marker.fit_transform(input=element_data, storage=storage)
109
113
  features = storage.list_features()
@@ -112,11 +116,3 @@ def test_FunctionalConnectivitySpheres(
112
116
  == "BOLD_FunctionalConnectivitySpheres_functional_connectivity"
113
117
  for x in features.values()
114
118
  )
115
-
116
-
117
- def test_FunctionalConnectivitySpheres_error() -> None:
118
- """Test FunctionalConnectivitySpheres errors."""
119
- with pytest.raises(ValueError, match="radius should be > 0"):
120
- FunctionalConnectivitySpheres(
121
- coords="DMNBuckner", radius=-0.1, conn_method="correlation"
122
- )