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
@@ -11,66 +11,78 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
+
15
+ from junifer.datagrabber import DataType
14
16
  from junifer.datareader import DefaultDataReader
15
17
  from junifer.markers.complexity import PermEntropy
16
- from junifer.pipeline.utils import _check_ants
17
- from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.storage import HDF5FeatureStorage
18
19
  from junifer.testing.datagrabbers import (
19
- SPMAuditoryTestingDataGrabber,
20
+ PartlyCloudyTestingDataGrabber,
20
21
  )
21
22
 
22
23
 
24
+ pytestmark = pytest.mark.external
25
+
26
+
23
27
  # Set parcellation
24
- PARCELLATION = "Schaefer100x17"
28
+ PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
25
29
 
26
30
 
27
- @pytest.mark.skipif(
28
- _check_ants() is False, reason="requires ANTs to be in PATH"
29
- )
30
- def test_compute() -> None:
31
- """Test PermEntropy compute()."""
32
- with SPMAuditoryTestingDataGrabber() as dg:
31
+ @pytest.fixture(scope="module")
32
+ def element_data() -> dict:
33
+ """Load the data element once for all tests in the module.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ The element data.
39
+
40
+ """
41
+ with PartlyCloudyTestingDataGrabber() as dg:
33
42
  # Fetch element
34
- element = dg["sub001"]
43
+ element = dg["sub-01"]
35
44
  # Fetch element data
36
- element_data = DefaultDataReader().fit_transform(element)
37
- # Initialize the marker
38
- marker = PermEntropy(parcellation=PARCELLATION)
39
- # Compute the marker
40
- feature_map = marker.fit_transform(element_data)
41
- # Assert the dimension of timeseries
42
- assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
45
+ return DefaultDataReader().fit_transform(element)
46
+
47
+
48
+ def test_compute(element_data: dict) -> None:
49
+ """Test PermEntropy compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = PermEntropy(parcellation=PARCELLATION)
59
+ # Compute the marker
60
+ feature_map = marker.fit_transform(element_data)
61
+ # Assert the dimension of timeseries
62
+ assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
43
63
 
44
64
 
45
65
  def test_storage_type() -> None:
46
66
  """Test PermEntropy storage_type."""
47
67
  assert "vector" == PermEntropy(parcellation=PARCELLATION).storage_type(
48
- input_type="BOLD", output_feature="complexity"
68
+ input_type=DataType.BOLD, output_feature="complexity"
49
69
  )
50
70
 
51
71
 
52
- @pytest.mark.skipif(
53
- _check_ants() is False, reason="requires ANTs to be in PATH"
54
- )
55
- def test_store(tmp_path: Path) -> None:
72
+ def test_store(element_data: dict, tmp_path: Path) -> None:
56
73
  """Test PermEntropy store().
57
74
 
58
75
  Parameters
59
76
  ----------
77
+ element_data : dict
78
+ The element data.
60
79
  tmp_path : pathlib.Path
61
80
  The path to the test directory.
62
81
 
63
82
  """
64
- with SPMAuditoryTestingDataGrabber() as dg:
65
- # Fetch element
66
- element = dg["sub001"]
67
- # Fetch element data
68
- element_data = DefaultDataReader().fit_transform(element)
69
- # Initialize the marker
70
- marker = PermEntropy(parcellation=PARCELLATION)
71
- # Create storage
72
- storage = SQLiteFeatureStorage(
73
- uri=tmp_path / "test_perm_entropy.sqlite"
74
- )
75
- # Compute the marker and store
76
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = PermEntropy(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_perm_entropy.hdf5")
87
+ # Compute the marker and store
88
+ marker.fit_transform(input=element_data, storage=storage)
@@ -12,66 +12,77 @@ import pytest
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
14
 
15
+ from junifer.datagrabber import DataType
15
16
  from junifer.datareader import DefaultDataReader
16
17
  from junifer.markers.complexity import RangeEntropy
17
- from junifer.pipeline.utils import _check_ants
18
- from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.storage import HDF5FeatureStorage
19
19
  from junifer.testing.datagrabbers import (
20
- SPMAuditoryTestingDataGrabber,
20
+ PartlyCloudyTestingDataGrabber,
21
21
  )
22
22
 
23
23
 
24
+ pytestmark = pytest.mark.external
25
+
26
+
24
27
  # Set parcellation
25
- PARCELLATION = "Schaefer100x17"
28
+ PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
26
29
 
27
30
 
28
- @pytest.mark.skipif(
29
- _check_ants() is False, reason="requires ANTs to be in PATH"
30
- )
31
- def test_compute() -> None:
32
- """Test RangeEntropy compute()."""
33
- with SPMAuditoryTestingDataGrabber() as dg:
31
+ @pytest.fixture(scope="module")
32
+ def element_data() -> dict:
33
+ """Load the data element once for all tests in the module.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ The element data.
39
+
40
+ """
41
+ with PartlyCloudyTestingDataGrabber() as dg:
34
42
  # Fetch element
35
- element = dg["sub001"]
43
+ element = dg["sub-01"]
36
44
  # Fetch element data
37
- element_data = DefaultDataReader().fit_transform(element)
38
- # Initialize the marker
39
- marker = RangeEntropy(parcellation=PARCELLATION)
40
- # Compute the marker
41
- feature_map = marker.fit_transform(element_data)
42
- # Assert the dimension of timeseries
43
- assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
45
+ return DefaultDataReader().fit_transform(element)
46
+
47
+
48
+ def test_compute(element_data: dict) -> None:
49
+ """Test RangeEntropy compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = RangeEntropy(parcellation=PARCELLATION)
59
+ # Compute the marker
60
+ feature_map = marker.fit_transform(element_data)
61
+ # Assert the dimension of timeseries
62
+ assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
44
63
 
45
64
 
46
65
  def test_storage_type() -> None:
47
66
  """Test RangeEntropy storage_type."""
48
67
  assert "vector" == RangeEntropy(parcellation=PARCELLATION).storage_type(
49
- input_type="BOLD", output_feature="complexity"
68
+ input_type=DataType.BOLD, output_feature="complexity"
50
69
  )
51
70
 
52
71
 
53
- @pytest.mark.skipif(
54
- _check_ants() is False, reason="requires ANTs to be in PATH"
55
- )
56
- def test_store(tmp_path: Path) -> None:
72
+ def test_store(element_data: dict, tmp_path: Path) -> None:
57
73
  """Test RangeEntropy store().
58
74
 
59
75
  Parameters
60
76
  ----------
77
+ element_data : dict
78
+ The element data.
61
79
  tmp_path : pathlib.Path
62
80
  The path to the test directory.
63
81
 
64
82
  """
65
- with SPMAuditoryTestingDataGrabber() as dg:
66
- # Fetch element
67
- element = dg["sub001"]
68
- # Fetch element data
69
- element_data = DefaultDataReader().fit_transform(element)
70
- # Initialize the marker
71
- marker = RangeEntropy(parcellation=PARCELLATION)
72
- # Create storage
73
- storage = SQLiteFeatureStorage(
74
- uri=tmp_path / "test_range_entropy.sqlite"
75
- )
76
- # Compute the marker and store
77
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = RangeEntropy(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_range_entropy.hdf5")
87
+ # Compute the marker and store
88
+ marker.fit_transform(input=element_data, storage=storage)
@@ -12,66 +12,77 @@ import pytest
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
14
 
15
+ from junifer.datagrabber import DataType
15
16
  from junifer.datareader import DefaultDataReader
16
17
  from junifer.markers.complexity import RangeEntropyAUC
17
- from junifer.pipeline.utils import _check_ants
18
- from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.storage import HDF5FeatureStorage
19
19
  from junifer.testing.datagrabbers import (
20
- SPMAuditoryTestingDataGrabber,
20
+ PartlyCloudyTestingDataGrabber,
21
21
  )
22
22
 
23
23
 
24
+ pytestmark = pytest.mark.external
25
+
26
+
24
27
  # Set parcellation
25
- PARCELLATION = "Schaefer100x17"
28
+ PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
26
29
 
27
30
 
28
- @pytest.mark.skipif(
29
- _check_ants() is False, reason="requires ANTs to be in PATH"
30
- )
31
- def test_compute() -> None:
32
- """Test RangeEntropyAUC compute()."""
33
- with SPMAuditoryTestingDataGrabber() as dg:
31
+ @pytest.fixture(scope="module")
32
+ def element_data() -> dict:
33
+ """Load the data element once for all tests in the module.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ The element data.
39
+
40
+ """
41
+ with PartlyCloudyTestingDataGrabber() as dg:
34
42
  # Fetch element
35
- element = dg["sub001"]
43
+ element = dg["sub-01"]
36
44
  # Fetch element data
37
- element_data = DefaultDataReader().fit_transform(element)
38
- # Initialize the marker
39
- marker = RangeEntropyAUC(parcellation=PARCELLATION)
40
- # Compute the marker
41
- feature_map = marker.fit_transform(element_data)
42
- # Assert the dimension of timeseries
43
- assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
45
+ return DefaultDataReader().fit_transform(element)
46
+
47
+
48
+ def test_compute(element_data: dict) -> None:
49
+ """Test RangeEntropyAUC compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = RangeEntropyAUC(parcellation=PARCELLATION)
59
+ # Compute the marker
60
+ feature_map = marker.fit_transform(element_data)
61
+ # Assert the dimension of timeseries
62
+ assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
44
63
 
45
64
 
46
65
  def test_storage_type() -> None:
47
66
  """Test RangeEntropyAUC storage_type."""
48
67
  assert "vector" == RangeEntropyAUC(parcellation=PARCELLATION).storage_type(
49
- input_type="BOLD", output_feature="complexity"
68
+ input_type=DataType.BOLD, output_feature="complexity"
50
69
  )
51
70
 
52
71
 
53
- @pytest.mark.skipif(
54
- _check_ants() is False, reason="requires ANTs to be in PATH"
55
- )
56
- def test_store(tmp_path: Path) -> None:
72
+ def test_store(element_data: dict, tmp_path: Path) -> None:
57
73
  """Test RangeEntropyAUC store().
58
74
 
59
75
  Parameters
60
76
  ----------
77
+ element_data : dict
78
+ The element data.
61
79
  tmp_path : pathlib.Path
62
80
  The path to the test directory.
63
81
 
64
82
  """
65
- with SPMAuditoryTestingDataGrabber() as dg:
66
- # Fetch element
67
- element = dg["sub001"]
68
- # Fetch element data
69
- element_data = DefaultDataReader().fit_transform(element)
70
- # Initialize the marker
71
- marker = RangeEntropyAUC(parcellation=PARCELLATION)
72
- # Create storage
73
- storage = SQLiteFeatureStorage(
74
- uri=tmp_path / "test_range_entropy_auc.sqlite"
75
- )
76
- # Compute the marker and store
77
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = RangeEntropyAUC(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_range_entropy_auc.hdf5")
87
+ # Compute the marker and store
88
+ marker.fit_transform(input=element_data, storage=storage)
@@ -11,66 +11,78 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
+
15
+ from junifer.datagrabber import DataType
14
16
  from junifer.datareader import DefaultDataReader
15
17
  from junifer.markers.complexity import SampleEntropy
16
- from junifer.pipeline.utils import _check_ants
17
- from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.storage import HDF5FeatureStorage
18
19
  from junifer.testing.datagrabbers import (
19
- SPMAuditoryTestingDataGrabber,
20
+ PartlyCloudyTestingDataGrabber,
20
21
  )
21
22
 
22
23
 
24
+ pytestmark = pytest.mark.external
25
+
26
+
23
27
  # Set parcellation
24
- PARCELLATION = "Schaefer100x17"
28
+ PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
25
29
 
26
30
 
27
- @pytest.mark.skipif(
28
- _check_ants() is False, reason="requires ANTs to be in PATH"
29
- )
30
- def test_compute() -> None:
31
- """Test SampleEntropy compute()."""
32
- with SPMAuditoryTestingDataGrabber() as dg:
31
+ @pytest.fixture(scope="module")
32
+ def element_data() -> dict:
33
+ """Load the data element once for all tests in the module.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ The element data.
39
+
40
+ """
41
+ with PartlyCloudyTestingDataGrabber() as dg:
33
42
  # Fetch element
34
- element = dg["sub001"]
43
+ element = dg["sub-01"]
35
44
  # Fetch element data
36
- element_data = DefaultDataReader().fit_transform(element)
37
- # Initialize the marker
38
- marker = SampleEntropy(parcellation=PARCELLATION)
39
- # Compute the marker
40
- feature_map = marker.fit_transform(element_data)
41
- # Assert the dimension of timeseries
42
- assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
45
+ return DefaultDataReader().fit_transform(element)
46
+
47
+
48
+ def test_compute(element_data: dict) -> None:
49
+ """Test SampleEntropy compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = SampleEntropy(parcellation=PARCELLATION)
59
+ # Compute the marker
60
+ feature_map = marker.fit_transform(element_data)
61
+ # Assert the dimension of timeseries
62
+ assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
43
63
 
44
64
 
45
65
  def test_storage_type() -> None:
46
66
  """Test SampleEntropy storage_type."""
47
67
  assert "vector" == SampleEntropy(parcellation=PARCELLATION).storage_type(
48
- input_type="BOLD", output_feature="complexity"
68
+ input_type=DataType.BOLD, output_feature="complexity"
49
69
  )
50
70
 
51
71
 
52
- @pytest.mark.skipif(
53
- _check_ants() is False, reason="requires ANTs to be in PATH"
54
- )
55
- def test_store(tmp_path: Path) -> None:
72
+ def test_store(element_data: dict, tmp_path: Path) -> None:
56
73
  """Test SampleEntropy store().
57
74
 
58
75
  Parameters
59
76
  ----------
77
+ element_data : dict
78
+ The element data.
60
79
  tmp_path : pathlib.Path
61
80
  The path to the test directory.
62
81
 
63
82
  """
64
- with SPMAuditoryTestingDataGrabber() as dg:
65
- # Fetch element
66
- element = dg["sub001"]
67
- # Fetch element data
68
- element_data = DefaultDataReader().fit_transform(element)
69
- # Initialize the marker
70
- marker = SampleEntropy(parcellation=PARCELLATION)
71
- # Create storage
72
- storage = SQLiteFeatureStorage(
73
- uri=tmp_path / "test_sample_entropy.sqlite"
74
- )
75
- # Compute the marker and store
76
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = SampleEntropy(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_sample_entropy.hdf5")
87
+ # Compute the marker and store
88
+ marker.fit_transform(input=element_data, storage=storage)
@@ -11,66 +11,80 @@ import pytest
11
11
 
12
12
  pytest.importorskip("neurokit2")
13
13
 
14
+
15
+ from junifer.datagrabber import DataType
14
16
  from junifer.datareader import DefaultDataReader
15
17
  from junifer.markers.complexity import WeightedPermEntropy
16
- from junifer.pipeline.utils import _check_ants
17
- from junifer.storage import SQLiteFeatureStorage
18
+ from junifer.storage import HDF5FeatureStorage
18
19
  from junifer.testing.datagrabbers import (
19
- SPMAuditoryTestingDataGrabber,
20
+ PartlyCloudyTestingDataGrabber,
20
21
  )
21
22
 
22
23
 
24
+ pytestmark = pytest.mark.external
25
+
26
+
23
27
  # Set parcellation
24
- PARCELLATION = "Schaefer100x17"
28
+ PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
25
29
 
26
30
 
27
- @pytest.mark.skipif(
28
- _check_ants() is False, reason="requires ANTs to be in PATH"
29
- )
30
- def test_compute() -> None:
31
- """Test WeightedPermEntropy compute()."""
32
- with SPMAuditoryTestingDataGrabber() as dg:
31
+ @pytest.fixture(scope="module")
32
+ def element_data() -> dict:
33
+ """Load the data element once for all tests in the module.
34
+
35
+ Returns
36
+ -------
37
+ dict
38
+ The element data.
39
+
40
+ """
41
+ with PartlyCloudyTestingDataGrabber() as dg:
33
42
  # Fetch element
34
- element = dg["sub001"]
43
+ element = dg["sub-01"]
35
44
  # Fetch element data
36
- element_data = DefaultDataReader().fit_transform(element)
37
- # Initialize the marker
38
- marker = WeightedPermEntropy(parcellation=PARCELLATION)
39
- # Compute the marker
40
- feature_map = marker.fit_transform(element_data)
41
- # Assert the dimension of timeseries
42
- assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
45
+ return DefaultDataReader().fit_transform(element)
46
+
47
+
48
+ def test_compute(element_data: dict) -> None:
49
+ """Test WeightedPermEntropy compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = WeightedPermEntropy(parcellation=PARCELLATION)
59
+ # Compute the marker
60
+ feature_map = marker.fit_transform(element_data)
61
+ # Assert the dimension of timeseries
62
+ assert feature_map["BOLD"]["complexity"]["data"].ndim == 2
43
63
 
44
64
 
45
65
  def test_storage_type() -> None:
46
66
  """Test WeightedPermEntropy storage_type."""
47
67
  assert "vector" == WeightedPermEntropy(
48
68
  parcellation=PARCELLATION
49
- ).storage_type(input_type="BOLD", output_feature="complexity")
69
+ ).storage_type(input_type=DataType.BOLD, output_feature="complexity")
50
70
 
51
71
 
52
- @pytest.mark.skipif(
53
- _check_ants() is False, reason="requires ANTs to be in PATH"
54
- )
55
- def test_store(tmp_path: Path) -> None:
72
+ def test_store(element_data: dict, tmp_path: Path) -> None:
56
73
  """Test WeightedPermEntropy store().
57
74
 
58
75
  Parameters
59
76
  ----------
77
+ element_data : dict
78
+ The element data.
60
79
  tmp_path : pathlib.Path
61
80
  The path to the test directory.
62
81
 
63
82
  """
64
- with SPMAuditoryTestingDataGrabber() as dg:
65
- # Fetch element
66
- element = dg["sub001"]
67
- # Fetch element data
68
- element_data = DefaultDataReader().fit_transform(element)
69
- # Initialize the marker
70
- marker = WeightedPermEntropy(parcellation=PARCELLATION)
71
- # Create storage
72
- storage = SQLiteFeatureStorage(
73
- uri=tmp_path / "test_weighted_perm_entropy.sqlite"
74
- )
75
- # Compute the marker and store
76
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = WeightedPermEntropy(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(
87
+ uri=tmp_path / "test_weighted_perm_entropy.hdf5"
88
+ )
89
+ # Compute the marker and store
90
+ marker.fit_transform(input=element_data, storage=storage)
@@ -2,15 +2,15 @@
2
2
 
3
3
  # Authors: Amir Omidvarnia <a.omidvarnia@fz-juelich.de>
4
4
  # Leonard Sasse <l.sasse@fz-juelich.de>
5
+ # Synchon Mandal <s.mandal@fz-juelich.de>
5
6
  # License: AGPL
6
7
 
7
- from typing import Optional, Union
8
-
9
8
  import neurokit2 as nk
10
9
  import numpy as np
11
10
 
12
11
  from ...api.decorators import register_marker
13
- from ...utils import logger, warn_with_log
12
+ from ...utils import warn_with_log
13
+ from ..base import logger
14
14
  from .complexity_base import ComplexityBase
15
15
 
16
16
 
@@ -27,24 +27,24 @@ class WeightedPermEntropy(ComplexityBase):
27
27
  The name(s) of the parcellation(s) to use.
28
28
  See :func:`.list_data` for options.
29
29
  agg_method : str, optional
30
- The method to perform aggregation using. Check valid options in
31
- :func:`junifer.stats.get_aggfunc_by_name` (default "mean").
32
- agg_method_params : dict, optional
33
- Parameters to pass to the aggregation function. Check valid options in
34
- :func:`junifer.stats.get_aggfunc_by_name` (default None).
35
- masks : str, dict or list of dict or str, optional
30
+ The aggregation function to use.
31
+ See :func:`.get_aggfunc_by_name` for options
32
+ (default "mean").
33
+ agg_method_params : dict or None, optional
34
+ The parameters to pass to the aggregation function.
35
+ See :func:`.get_aggfunc_by_name` for options (default None).
36
+ masks : str, dict, list of them or None, optional
36
37
  The specification of the masks to apply to regions before extracting
37
38
  signals. Check :ref:`Using Masks <using_masks>` for more details.
38
39
  If None, will not apply any mask (default None).
39
- params : dict, optional
40
- Parameters to pass to the weighted permutation entropy calculation
41
- function.
42
- For more information, check out
43
- ``junifer.markers.utils._weighted_perm_entropy``. If None, value
44
- is set to {"m": 2, "delay": 1} (default None).
45
- name : str, optional
46
- The name of the marker. If None, it will use the class name
40
+ params : dict or None, optional
41
+ The parameters to pass to the weighted permutation entropy calculation
42
+ function. See ``junifer.markers.utils._weighted_perm_entropy`` for more
43
+ information. If None, value is set to ``{"m": 2, "delay": 1}``
47
44
  (default None).
45
+ name : str or None, optional
46
+ The name of the marker.
47
+ If None, will use the class name (default None).
48
48
 
49
49
  Warnings
50
50
  --------
@@ -55,26 +55,12 @@ class WeightedPermEntropy(ComplexityBase):
55
55
 
56
56
  """
57
57
 
58
- def __init__(
59
- self,
60
- parcellation: Union[str, list[str]],
61
- agg_method: str = "mean",
62
- agg_method_params: Optional[dict] = None,
63
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
64
- params: Optional[dict] = None,
65
- name: Optional[str] = None,
66
- ) -> None:
67
- super().__init__(
68
- parcellation=parcellation,
69
- agg_method=agg_method,
70
- agg_method_params=agg_method_params,
71
- masks=masks,
72
- name=name,
73
- )
74
- if params is None:
58
+ params: dict | None = None
59
+
60
+ def validate_marker_params(self) -> None:
61
+ """Run extra logical validation for marker."""
62
+ if self.params is None:
75
63
  self.params = {"m": 4, "delay": 1}
76
- else:
77
- self.params = params
78
64
 
79
65
  def compute_complexity(
80
66
  self,