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
@@ -1,11 +1,16 @@
1
1
  """Provide class for temporal SNR using parcels."""
2
2
 
3
3
  # Authors: Leonard Sasse <l.sasse@fz-juelich.de>
4
+ # Synchon Mandal <s.mandal@fz-juelich.de>
4
5
  # License: AGPL
5
6
 
6
- from typing import Any, Optional, Union
7
+ from typing import Annotated, Any
8
+
9
+ from pydantic import BeforeValidator
7
10
 
8
11
  from ...api.decorators import register_marker
12
+ from ...datagrabber import DataType
13
+ from ...utils import ensure_list
9
14
  from ..parcel_aggregation import ParcelAggregation
10
15
  from .temporal_snr_base import TemporalSNRBase
11
16
 
@@ -23,39 +28,26 @@ class TemporalSNRParcels(TemporalSNRBase):
23
28
  The name(s) of the parcellation(s) to use.
24
29
  See :func:`.list_data` for options.
25
30
  agg_method : str, optional
26
- The method to perform aggregation using. Check valid options in
27
- :func:`.get_aggfunc_by_name` (default "mean").
28
- agg_method_params : dict, optional
29
- Parameters to pass to the aggregation function. Check valid options in
30
- :func:`.get_aggfunc_by_name` (default None).
31
- masks : str, dict or list of dict or str, optional
31
+ The aggregation function to use.
32
+ See :func:`.get_aggfunc_by_name` for options
33
+ (default "mean").
34
+ agg_method_params : dict or None, optional
35
+ The parameters to pass to the aggregation function.
36
+ See :func:`.get_aggfunc_by_name` for options (default None).
37
+ masks : str, dict, list of them or None, optional
32
38
  The specification of the masks to apply to regions before extracting
33
39
  signals. Check :ref:`Using Masks <using_masks>` for more details.
34
40
  If None, will not apply any mask (default None).
35
- name : str, optional
36
- The name of the marker. If None, will use the class name (default
37
- None).
41
+ name : str or None, optional
42
+ The name of the marker.
43
+ If None, will use the class name (default None).
38
44
 
39
45
  """
40
46
 
41
- def __init__(
42
- self,
43
- parcellation: Union[str, list[str]],
44
- agg_method: str = "mean",
45
- agg_method_params: Optional[dict] = None,
46
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
47
- name: Optional[str] = None,
48
- ) -> None:
49
- self.parcellation = parcellation
50
- super().__init__(
51
- agg_method=agg_method,
52
- agg_method_params=agg_method_params,
53
- masks=masks,
54
- name=name,
55
- )
47
+ parcellation: Annotated[str | list[str], BeforeValidator(ensure_list)]
56
48
 
57
49
  def aggregate(
58
- self, input: dict[str, Any], extra_input: Optional[dict] = None
50
+ self, input: dict[str, Any], extra_input: dict | None = None
59
51
  ) -> dict:
60
52
  """Perform parcel aggregation.
61
53
 
@@ -88,5 +80,5 @@ class TemporalSNRParcels(TemporalSNRBase):
88
80
  method=self.agg_method,
89
81
  method_params=self.agg_method_params,
90
82
  masks=self.masks,
91
- on="BOLD",
83
+ on=DataType.BOLD,
92
84
  ).compute(input=input, extra_input=extra_input)
@@ -1,13 +1,16 @@
1
1
  """Provide class for temporal SNR using spheres."""
2
2
 
3
3
  # Authors: Leonard Sasse <l.sasse@fz-juelich.de>
4
+ # Synchon Mandal <s.mandal@fz-juelich.de>
4
5
  # License: AGPL
5
6
 
6
- from typing import Any, Optional, Union
7
+ from typing import Any, Literal
8
+
9
+ from pydantic import PositiveFloat
7
10
 
8
11
  from ...api.decorators import register_marker
12
+ from ...datagrabber import DataType
9
13
  from ..sphere_aggregation import SphereAggregation
10
- from ..utils import raise_error
11
14
  from .temporal_snr_base import TemporalSNRBase
12
15
 
13
16
 
@@ -23,54 +26,37 @@ class TemporalSNRSpheres(TemporalSNRBase):
23
26
  coords : str
24
27
  The name of the coordinates list to use.
25
28
  See :func:`.list_data` for options.
26
- radius : float, optional
27
- The radius of the sphere in mm. If None, the signal will be extracted
28
- from a single voxel. See :class:`nilearn.maskers.NiftiSpheresMasker`
29
- for more information (default None).
29
+ radius : ``zero`` or positive float or None, optional
30
+ The radius of the sphere in millimeters.
31
+ If None, the signal will be extracted from a single voxel.
32
+ See :class:`.JuniferNiftiSpheresMasker` for more information
33
+ (default None).
30
34
  allow_overlap : bool, optional
31
- Whether to allow overlapping spheres. If False, an error is raised if
32
- the spheres overlap (default is False).
35
+ Whether to allow overlapping spheres.
36
+ If False, an error is raised if the spheres overlap (default is False).
33
37
  agg_method : str, optional
34
- The aggregation method to use.
35
- See :func:`.get_aggfunc_by_name` for more information
36
- (default None).
37
- agg_method_params : dict, optional
38
- The parameters to pass to the aggregation method (default None).
39
- masks : str, dict or list of dict or str, optional
38
+ The aggregation function to use.
39
+ See :func:`.get_aggfunc_by_name` for options
40
+ (default "mean").
41
+ agg_method_params : dict or None, optional
42
+ The parameters to pass to the aggregation function.
43
+ See :func:`.get_aggfunc_by_name` for options (default None).
44
+ masks : str, dict, list of them or None, optional
40
45
  The specification of the masks to apply to regions before extracting
41
46
  signals. Check :ref:`Using Masks <using_masks>` for more details.
42
47
  If None, will not apply any mask (default None).
43
- name : str, optional
44
- The name of the marker. By default, it will use
45
- KIND_FunctionalConnectivitySpheres where KIND is the kind of data it
46
- was applied to (default None).
48
+ name : str or None, optional
49
+ The name of the marker.
50
+ If None, will use the class name (default None).
47
51
 
48
52
  """
49
53
 
50
- def __init__(
51
- self,
52
- coords: str,
53
- radius: Optional[float] = None,
54
- allow_overlap: bool = False,
55
- agg_method: str = "mean",
56
- agg_method_params: Optional[dict] = None,
57
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
58
- name: Optional[str] = None,
59
- ) -> None:
60
- self.coords = coords
61
- self.radius = radius
62
- self.allow_overlap = allow_overlap
63
- if radius is None or radius <= 0:
64
- raise_error(f"radius should be > 0: provided {radius}")
65
- super().__init__(
66
- agg_method=agg_method,
67
- agg_method_params=agg_method_params,
68
- masks=masks,
69
- name=name,
70
- )
54
+ coords: str
55
+ radius: Literal[0] | PositiveFloat | None = None
56
+ allow_overlap: bool = False
71
57
 
72
58
  def aggregate(
73
- self, input: dict[str, Any], extra_input: Optional[dict] = None
59
+ self, input: dict[str, Any], extra_input: dict | None = None
74
60
  ) -> dict:
75
61
  """Perform sphere aggregation.
76
62
 
@@ -105,5 +91,5 @@ class TemporalSNRSpheres(TemporalSNRBase):
105
91
  method=self.agg_method,
106
92
  method_params=self.agg_method_params,
107
93
  masks=self.masks,
108
- on="BOLD",
94
+ on=DataType.BOLD,
109
95
  ).compute(input=input, extra_input=extra_input)
@@ -6,10 +6,10 @@
6
6
  import pytest
7
7
 
8
8
  # done to keep line length 79
9
- import junifer.markers.temporal_snr as tsnr
9
+ from junifer.markers.temporal_snr import temporal_snr_base as tsb
10
10
 
11
11
 
12
12
  def test_base_temporal_snr_marker_abstractness() -> None:
13
13
  """Test TemporalSNRBase is an abstract base class."""
14
14
  with pytest.raises(TypeError, match="abstract"):
15
- tsnr.temporal_snr_base.TemporalSNRBase()
15
+ tsb.TemporalSNRBase()
@@ -5,34 +5,33 @@
5
5
 
6
6
  from pathlib import Path
7
7
 
8
- from junifer.datagrabber import PatternDataladDataGrabber
8
+ import pytest
9
+
10
+ from junifer.datagrabber import DataType
9
11
  from junifer.datareader import DefaultDataReader
10
12
  from junifer.markers import TemporalSNRMaps
11
13
  from junifer.storage import HDF5FeatureStorage
14
+ from junifer.testing.datagrabbers import ADHDTestingDataGrabber
12
15
 
13
16
 
14
- def test_TemporalSNRMaps_computation(
15
- maps_datagrabber: PatternDataladDataGrabber,
16
- ) -> None:
17
- """Test TemporalSNRMaps fit-transform.
17
+ pytestmark = pytest.mark.external
18
18
 
19
- Parameters
20
- ----------
21
- maps_datagrabber : PatternDataladDataGrabber
22
- The testing PatternDataladDataGrabber, as fixture.
23
19
 
24
- """
25
- with maps_datagrabber as dg:
26
- element = dg[("sub-01", "sub-001", "rest", "1")]
20
+ def test_TemporalSNRMaps_computation() -> None:
21
+ """Test TemporalSNRMaps fit-transform."""
22
+ with ADHDTestingDataGrabber() as dg:
23
+ element = dg["sub-01"]
27
24
  element_data = DefaultDataReader().fit_transform(element)
28
25
  marker = TemporalSNRMaps(maps="Smith_rsn_10")
29
26
  # Check correct output
30
27
  assert "vector" == marker.storage_type(
31
- input_type="BOLD", output_feature="tsnr"
28
+ input_type=DataType.BOLD, output_feature="tsnr"
32
29
  )
33
-
34
30
  # Fit-transform the data
31
+ bold_img = element_data["BOLD"]["data"]
35
32
  tsnr_parcels = marker.fit_transform(element_data)
33
+ # The input is not changed
34
+ assert element_data["BOLD"]["data"] is bold_img
36
35
  tsnr_parcels_bold = tsnr_parcels["BOLD"]["tsnr"]
37
36
 
38
37
  assert "data" in tsnr_parcels_bold
@@ -41,25 +40,21 @@ def test_TemporalSNRMaps_computation(
41
40
  assert len(set(tsnr_parcels_bold["col_names"])) == 10
42
41
 
43
42
 
44
- def test_TemporalSNRMaps_storage(
45
- tmp_path: Path, maps_datagrabber: PatternDataladDataGrabber
46
- ) -> None:
43
+ def test_TemporalSNRMaps_storage(tmp_path: Path) -> None:
47
44
  """Test TemporalSNRMaps store.
48
45
 
49
46
  Parameters
50
47
  ----------
51
48
  tmp_path : pathlib.Path
52
49
  The path to the test directory.
53
- maps_datagrabber : PatternDataladDataGrabber
54
- The testing PatternDataladDataGrabber, as fixture.
55
50
 
56
51
  """
57
- with maps_datagrabber as dg:
58
- element = dg[("sub-01", "sub-001", "rest", "1")]
52
+ with ADHDTestingDataGrabber() as dg:
53
+ element = dg["sub-01"]
59
54
  element_data = DefaultDataReader().fit_transform(element)
60
55
  marker = TemporalSNRMaps(maps="Smith_rsn_10")
61
56
  # Store
62
- storage = HDF5FeatureStorage(tmp_path / "test_tsnr_maps.hdf5")
57
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_tsnr_maps.hdf5")
63
58
  marker.fit_transform(input=element_data, storage=storage)
64
59
  features = storage.list_features()
65
60
  assert any(
@@ -6,12 +6,18 @@
6
6
 
7
7
  from pathlib import Path
8
8
 
9
+ import pytest
10
+
11
+ from junifer.datagrabber import DataType
9
12
  from junifer.datareader import DefaultDataReader
10
13
  from junifer.markers.temporal_snr import TemporalSNRParcels
11
14
  from junifer.storage import HDF5FeatureStorage
12
15
  from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber
13
16
 
14
17
 
18
+ pytestmark = pytest.mark.external
19
+
20
+
15
21
  def test_TemporalSNRParcels_computation() -> None:
16
22
  """Test TemporalSNRParcels fit-transform."""
17
23
  with PartlyCloudyTestingDataGrabber() as dg:
@@ -21,11 +27,13 @@ def test_TemporalSNRParcels_computation() -> None:
21
27
  )
22
28
  # Check correct output
23
29
  assert "vector" == marker.storage_type(
24
- input_type="BOLD", output_feature="tsnr"
30
+ input_type=DataType.BOLD, output_feature="tsnr"
25
31
  )
26
-
27
32
  # Fit-transform the data
33
+ bold_img = element_data["BOLD"]["data"]
28
34
  tsnr_parcels = marker.fit_transform(element_data)
35
+ # The input is not changed
36
+ assert element_data["BOLD"]["data"] is bold_img
29
37
  tsnr_parcels_bold = tsnr_parcels["BOLD"]["tsnr"]
30
38
 
31
39
  assert "data" in tsnr_parcels_bold
@@ -49,7 +57,7 @@ def test_TemporalSNRParcels_storage(tmp_path: Path) -> None:
49
57
  parcellation="TianxS1x3TxMNInonlinear2009cAsym"
50
58
  )
51
59
  # Store
52
- storage = HDF5FeatureStorage(tmp_path / "test_tsnr_parcels.hdf5")
60
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_tsnr_parcels.hdf5")
53
61
  marker.fit_transform(input=element_data, storage=storage)
54
62
  features = storage.list_features()
55
63
  assert any(
@@ -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.temporal_snr import TemporalSNRSpheres
13
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
  def test_TemporalSNRSpheres_computation() -> None:
18
22
  """Test TemporalSNRSpheres fit-transform."""
19
23
  with SPMAuditoryTestingDataGrabber() as dg:
@@ -21,11 +25,13 @@ def test_TemporalSNRSpheres_computation() -> None:
21
25
  marker = TemporalSNRSpheres(coords="DMNBuckner", radius=5.0)
22
26
  # Check correct output
23
27
  assert "vector" == marker.storage_type(
24
- input_type="BOLD", output_feature="tsnr"
28
+ input_type=DataType.BOLD, output_feature="tsnr"
25
29
  )
26
-
27
30
  # Fit-transform the data
31
+ bold_img = element_data["BOLD"]["data"]
28
32
  tsnr_spheres = marker.fit_transform(element_data)
33
+ # The input is not changed
34
+ assert element_data["BOLD"]["data"] is bold_img
29
35
  tsnr_spheres_bold = tsnr_spheres["BOLD"]["tsnr"]
30
36
 
31
37
  assert "data" in tsnr_spheres_bold
@@ -47,16 +53,10 @@ def test_TemporalSNRSpheres_storage(tmp_path: Path) -> None:
47
53
  element_data = DefaultDataReader().fit_transform(dg["sub001"])
48
54
  marker = TemporalSNRSpheres(coords="DMNBuckner", radius=5.0)
49
55
  # Store
50
- storage = HDF5FeatureStorage(tmp_path / "test_tsnr_spheres.hdf5")
56
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_tsnr_spheres.hdf5")
51
57
  marker.fit_transform(input=element_data, storage=storage)
52
58
  features = storage.list_features()
53
59
  assert any(
54
60
  x["name"] == "BOLD_TemporalSNRSpheres_tsnr"
55
61
  for x in features.values()
56
62
  )
57
-
58
-
59
- def test_TemporalSNRSpheres_error() -> None:
60
- """Test TemporalSNRSpheres errors."""
61
- with pytest.raises(ValueError, match="radius should be > 0"):
62
- TemporalSNRSpheres(coords="DMNBuckner", radius=-0.1)
@@ -7,34 +7,35 @@ import socket
7
7
 
8
8
  import pytest
9
9
 
10
- from junifer.datagrabber import DataladAOMICID1000
10
+ from junifer.datagrabber import DataladAOMICID1000, DataType
11
11
  from junifer.datareader import DefaultDataReader
12
12
  from junifer.markers import BrainPrint
13
13
  from junifer.pipeline.utils import _check_freesurfer
14
+ from junifer.storage import StorageType
14
15
 
15
16
 
16
17
  @pytest.mark.parametrize(
17
18
  "feature, storage_type",
18
19
  [
19
- ("eigenvalues", "scalar_table"),
20
- ("areas", "vector"),
21
- ("volumes", "vector"),
22
- ("distances", "vector"),
20
+ ("eigenvalues", StorageType.ScalarTable),
21
+ ("areas", StorageType.Vector),
22
+ ("volumes", StorageType.Vector),
23
+ ("distances", StorageType.Vector),
23
24
  ],
24
25
  )
25
- def test_storage_type(feature: str, storage_type: str) -> None:
26
+ def test_storage_type(feature: str, storage_type: StorageType) -> None:
26
27
  """Test BrainPrint storage_type.
27
28
 
28
29
  Parameters
29
30
  ----------
30
31
  feature : str
31
32
  The parametrized feature name.
32
- storage_type : str
33
+ storage_type : StorageType
33
34
  The parametrized storage type.
34
35
 
35
36
  """
36
37
  assert storage_type == BrainPrint().storage_type(
37
- input_type="FreeSurfer", output_feature=feature
38
+ input_type=DataType.FreeSurfer, output_feature=feature
38
39
  )
39
40
 
40
41
 
@@ -47,7 +48,7 @@ def test_storage_type(feature: str, storage_type: str) -> None:
47
48
  )
48
49
  def test_compute() -> None:
49
50
  """Test BrainPrint compute()."""
50
- with DataladAOMICID1000(types="FreeSurfer") as dg:
51
+ with DataladAOMICID1000(types=[DataType.FreeSurfer]) as dg:
51
52
  # Fetch element
52
53
  element = dg["sub-0001"]
53
54
  # Fetch element data
@@ -8,15 +8,19 @@
8
8
 
9
9
  from pathlib import Path
10
10
 
11
+ import pytest
11
12
  from nilearn.maskers import NiftiLabelsMasker
12
13
 
13
14
  from junifer.data import ParcellationRegistry
14
15
  from junifer.datareader import DefaultDataReader
15
16
  from junifer.markers.ets_rss import RSSETSMarker
16
- from junifer.storage import SQLiteFeatureStorage
17
+ from junifer.storage import HDF5FeatureStorage
17
18
  from junifer.testing.datagrabbers import PartlyCloudyTestingDataGrabber
18
19
 
19
20
 
21
+ pytestmark = pytest.mark.external
22
+
23
+
20
24
  # Set parcellation
21
25
  PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
22
26
 
@@ -33,7 +37,7 @@ def test_compute() -> None:
33
37
  # Compare with nilearn
34
38
  # Load testing parcellation
35
39
  test_parcellation, _ = ParcellationRegistry().get(
36
- parcellations=[PARCELLATION],
40
+ parcellations=PARCELLATION,
37
41
  target_data=element_data["BOLD"],
38
42
  )
39
43
  # Extract timeseries
@@ -65,7 +69,7 @@ def test_store(tmp_path: Path) -> None:
65
69
  # Get element data
66
70
  element_data = DefaultDataReader().fit_transform(dg["sub-01"])
67
71
  # Create storage
68
- storage = SQLiteFeatureStorage(tmp_path / "test_rss_ets.sqlite")
72
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_rss_ets.hdf5")
69
73
  # Compute the RSSETSMarker and store
70
74
  _ = RSSETSMarker(parcellation=PARCELLATION).fit_transform(
71
75
  input=element_data, storage=storage