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
@@ -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,23 +27,24 @@ class RangeEntropy(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 range entropy calculation function. For more
41
- information, check out ``junifer.markers.utils._range_entropy``.
42
- If None, value is set to {"m": 2, "tol": 0.5, "delay": 1}
43
- (default None).
44
- name : str, optional
45
- 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 range entropy calculation function.
42
+ See ``junifer.markers.utils._range_entropy`` for more information.
43
+ If None, value is set to ``{"m": 2, "tol": 0.5, "delay": 1}``
46
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).
47
48
 
48
49
  Warnings
49
50
  --------
@@ -54,26 +55,12 @@ class RangeEntropy(ComplexityBase):
54
55
 
55
56
  """
56
57
 
57
- def __init__(
58
- self,
59
- parcellation: Union[str, list[str]],
60
- agg_method: str = "mean",
61
- agg_method_params: Optional[dict] = None,
62
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
- params: Optional[dict] = None,
64
- name: Optional[str] = None,
65
- ) -> None:
66
- super().__init__(
67
- parcellation=parcellation,
68
- agg_method=agg_method,
69
- agg_method_params=agg_method_params,
70
- masks=masks,
71
- name=name,
72
- )
73
- 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:
74
63
  self.params = {"m": 2, "tol": 0.5, "delay": 1}
75
- else:
76
- self.params = params
77
64
 
78
65
  def compute_complexity(
79
66
  self,
@@ -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,23 +27,24 @@ class RangeEntropyAUC(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 range entropy calculation function. For more
41
- information, check out ``junifer.markers.utils._range_entropy``.
42
- If None, value is set to {"m": 2, "delay": 1, "n_r": 10}
43
- (default None).
44
- name : str, optional
45
- 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 range entropy calculation function.
42
+ See ``junifer.markers.utils._range_entropy`` for more information.
43
+ If None, value is set to ``{"m": 2, "delay": 1, "n_r": 10}``
46
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).
47
48
 
48
49
  Warnings
49
50
  --------
@@ -54,26 +55,12 @@ class RangeEntropyAUC(ComplexityBase):
54
55
 
55
56
  """
56
57
 
57
- def __init__(
58
- self,
59
- parcellation: Union[str, list[str]],
60
- agg_method: str = "mean",
61
- agg_method_params: Optional[dict] = None,
62
- masks: Union[str, dict, list[Union[dict, str]], None] = None,
63
- params: Optional[dict] = None,
64
- name: Optional[str] = None,
65
- ) -> None:
66
- super().__init__(
67
- parcellation=parcellation,
68
- agg_method=agg_method,
69
- agg_method_params=agg_method_params,
70
- masks=masks,
71
- name=name,
72
- )
73
- 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:
74
63
  self.params = {"m": 2, "delay": 1, "n_r": 10}
75
- else:
76
- self.params = params
77
64
 
78
65
  def compute_complexity(
79
66
  self,
@@ -138,7 +125,11 @@ class RangeEntropyAUC(ComplexityBase):
138
125
  range_ent_vec[idx_r] = range_en_auc_roi_tmp[0]
139
126
  idx_r = idx_r + 1
140
127
 
141
- range_en_auc_roi[idx_roi] = np.trapz(range_ent_vec)
128
+ range_en_auc_roi[idx_roi] = (
129
+ np.trapezoid(range_ent_vec)
130
+ if int(np.__version__[0]) > 1
131
+ else np.trapz(range_ent_vec)
132
+ )
142
133
 
143
134
  range_en_auc_roi = range_en_auc_roi / n_r
144
135
 
@@ -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 SampleEntropy(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 sample entropy calculation function.
41
- For more information, check out
42
- ``junifer.markers.utils._sample_entropy``.
43
- If None, value is set to
44
- {"m": 2, "delay": 1, "tol": 0.5} (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 sample entropy calculation function.
42
+ See ``junifer.markers.utils._sample_entropy`` for more information.
43
+ If None, value is set to ``{"m": 2, "delay": 1, "tol": 0.5}``
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 SampleEntropy(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, "tol": 0.5}
76
- else:
77
- self.params = params
78
64
 
79
65
  def compute_complexity(
80
66
  self,
@@ -0,0 +1,48 @@
1
+ """Provide test for registering the complexity markers."""
2
+
3
+ # Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
4
+ # License: AGPL
5
+
6
+ import subprocess
7
+ import sys
8
+ from pathlib import Path
9
+
10
+ import pytest
11
+
12
+
13
+ pytest.importorskip("neurokit2")
14
+
15
+
16
+ def test_complexity_markers_with(tmp_path: Path) -> None:
17
+ """Test the complexity markers are registered with ``with:``.
18
+
19
+ It runs in a new Python process, so the markers are not registered by
20
+ other tests.
21
+
22
+ Parameters
23
+ ----------
24
+ tmp_path : pathlib.Path
25
+ The path to the test directory.
26
+
27
+ """
28
+ names = [
29
+ "HurstExponent",
30
+ "MultiscaleEntropyAUC",
31
+ "PermEntropy",
32
+ "RangeEntropy",
33
+ "RangeEntropyAUC",
34
+ "SampleEntropy",
35
+ "WeightedPermEntropy",
36
+ ]
37
+ yaml_path = tmp_path / "config.yaml"
38
+ script = (
39
+ "from junifer.api.functions import parse_yaml\n"
40
+ "from junifer.pipeline import PipelineComponentRegistry\n"
41
+ "registry = PipelineComponentRegistry()\n"
42
+ f"assert 'HurstExponent' not in registry.step_components('marker')\n"
43
+ f"parse_yaml({str(yaml_path)!r})\n"
44
+ f"for name in {names!r}:\n"
45
+ " registry.get_class('marker', name)\n"
46
+ )
47
+ yaml_path.write_text("with: junifer.markers.complexity\n")
48
+ subprocess.run([sys.executable, "-c", script], check=True)
@@ -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 HurstExponent
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 HurstExponent 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 = HurstExponent(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 HurstExponent compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = HurstExponent(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 HurstExponent storage_type."""
48
67
  assert "vector" == HurstExponent(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 HurstExponent 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 = HurstExponent(parcellation=PARCELLATION)
72
- # Create storage
73
- storage = SQLiteFeatureStorage(
74
- uri=tmp_path / "test_hurst_exponent.sqlite"
75
- )
76
- # Compute the marker and store
77
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = HurstExponent(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(uri=tmp_path / "test_hurst_exponent.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 MultiscaleEntropyAUC
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 MultiscaleEntropyAUC 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 = MultiscaleEntropyAUC(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 MultiscaleEntropyAUC compute().
50
+
51
+ Parameters
52
+ ----------
53
+ element_data : dict
54
+ The element data.
55
+
56
+ """
57
+ # Initialize the marker
58
+ marker = MultiscaleEntropyAUC(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 MultiscaleEntropyAUC storage_type."""
47
67
  assert "vector" == MultiscaleEntropyAUC(
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 MultiscaleEntropyAUC 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 = MultiscaleEntropyAUC(parcellation=PARCELLATION)
71
- # Create storage
72
- storage = SQLiteFeatureStorage(
73
- uri=tmp_path / "test_multiscale_entropy_auc.sqlite"
74
- )
75
- # Compute the marker and store
76
- marker.fit_transform(input=element_data, storage=storage)
83
+ # Initialize the marker
84
+ marker = MultiscaleEntropyAUC(parcellation=PARCELLATION)
85
+ # Create storage
86
+ storage = HDF5FeatureStorage(
87
+ uri=tmp_path / "test_multiscale_entropy_auc.hdf5"
88
+ )
89
+ # Compute the marker and store
90
+ marker.fit_transform(input=element_data, storage=storage)