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.
- junifer/_version.py +9 -19
- junifer/api/__init__.pyi +17 -2
- junifer/api/functions.py +222 -39
- junifer/api/queue_context/__init__.pyi +11 -3
- junifer/api/queue_context/gnu_parallel_local_adapter.py +81 -120
- junifer/api/queue_context/htcondor_adapter.py +118 -181
- junifer/api/queue_context/queue_context_adapter.py +51 -7
- junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +10 -35
- junifer/api/queue_context/tests/test_htcondor_adapter.py +13 -50
- junifer/api/res/fsl/run_fsl_docker.sh +4 -0
- junifer/api/tests/test_functions.py +863 -36
- junifer/cli/__init__.py +1 -7
- junifer/cli/cli.py +41 -22
- junifer/cli/parser.py +23 -147
- junifer/cli/tests/data/gmd_mean.yaml +6 -6
- junifer/cli/tests/data/gmd_mean_htcondor.yaml +6 -5
- junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +1 -0
- junifer/cli/tests/test_cli.py +120 -4
- junifer/cli/tests/test_cli_utils.py +23 -6
- junifer/cli/utils.py +14 -9
- junifer/configs/__init__.py +5 -0
- junifer/configs/__init__.pyi +0 -0
- junifer/configs/juseless/datagrabbers/__init__.pyi +4 -2
- junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +18 -24
- junifer/configs/juseless/datagrabbers/camcan_vbm.py +20 -27
- junifer/configs/juseless/datagrabbers/ixi_vbm.py +44 -52
- junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -7
- junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -19
- junifer/configs/juseless/datagrabbers/ucla.py +111 -104
- junifer/configs/juseless/datagrabbers/ukb_vbm.py +19 -25
- junifer/configs/py.typed +0 -0
- junifer/conftest.py +63 -24
- junifer/data/_dispatch.py +9 -19
- junifer/data/coordinates/_ants_coordinates_warper.py +4 -1
- junifer/data/coordinates/_coordinates.py +51 -6
- junifer/data/coordinates/_fsl_coordinates_warper.py +4 -1
- junifer/data/coordinates/tests/test_coordinates.py +15 -3
- junifer/data/coordinates/tests/test_coordinates_names.py +37 -0
- junifer/data/maps/_ants_maps_warper.py +18 -12
- junifer/data/maps/_fsl_maps_warper.py +7 -3
- junifer/data/maps/_maps.py +12 -8
- junifer/data/maps/tests/test_maps.py +13 -21
- junifer/data/masks/_ants_mask_warper.py +18 -12
- junifer/data/masks/_fsl_mask_warper.py +7 -3
- junifer/data/masks/_masks.py +15 -12
- junifer/data/masks/tests/test_masks.py +20 -17
- junifer/data/parcellations/_ants_parcellation_warper.py +18 -12
- junifer/data/parcellations/_fsl_parcellation_warper.py +7 -5
- junifer/data/parcellations/_parcellations.py +125 -91
- junifer/data/parcellations/tests/test_parcellations.py +122 -1
- junifer/data/template_spaces.py +117 -50
- junifer/data/tests/test_template_spaces.py +10 -7
- junifer/data/utils.py +10 -8
- junifer/datagrabber/__init__.pyi +38 -5
- junifer/datagrabber/aomic/__init__.pyi +8 -1
- junifer/datagrabber/aomic/_types.py +22 -0
- junifer/datagrabber/aomic/id1000.py +193 -183
- junifer/datagrabber/aomic/piop1.py +215 -259
- junifer/datagrabber/aomic/piop2.py +211 -244
- junifer/datagrabber/aomic/tests/test_id1000.py +70 -53
- junifer/datagrabber/aomic/tests/test_piop1.py +98 -102
- junifer/datagrabber/aomic/tests/test_piop2.py +88 -85
- junifer/datagrabber/base.py +253 -79
- junifer/datagrabber/datalad_base.py +127 -76
- junifer/datagrabber/dmcc13_benchmark.py +204 -289
- junifer/datagrabber/hcp1200/__init__.pyi +7 -2
- junifer/datagrabber/hcp1200/datalad_hcp1200.py +61 -40
- junifer/datagrabber/hcp1200/hcp1200.py +151 -164
- junifer/datagrabber/hcp1200/tests/test_hcp1200.py +116 -128
- junifer/datagrabber/multiple.py +183 -63
- junifer/datagrabber/pattern.py +358 -227
- junifer/datagrabber/pattern_datalad.py +84 -124
- junifer/datagrabber/pattern_validation_mixin.py +22 -50
- junifer/datagrabber/tests/test_base.py +17 -4
- junifer/datagrabber/tests/test_datalad_base.py +20 -27
- junifer/datagrabber/tests/test_dmcc13_benchmark.py +110 -122
- junifer/datagrabber/tests/test_multiple.py +293 -31
- junifer/datagrabber/tests/test_pattern.py +577 -18
- junifer/datagrabber/tests/test_pattern_datalad.py +177 -107
- junifer/datagrabber/tests/test_pattern_validation_mixin.py +9 -51
- junifer/datareader/default.py +8 -5
- junifer/datareader/tests/test_default_reader.py +1 -1
- junifer/external/BrainPrint/.codecov.yml +2 -0
- junifer/external/BrainPrint/.codespellignore +2 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +45 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +12 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +24 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +28 -0
- junifer/external/BrainPrint/.github/dependabot.yml +6 -0
- junifer/external/BrainPrint/.github/workflows/build.yml +53 -0
- junifer/external/BrainPrint/.github/workflows/code-style.yml +44 -0
- junifer/external/BrainPrint/.github/workflows/doc.yml +65 -0
- junifer/external/BrainPrint/.github/workflows/publish.yml +31 -0
- junifer/external/BrainPrint/.github/workflows/pytest.yml +54 -0
- junifer/external/BrainPrint/.gitignore +123 -0
- junifer/external/BrainPrint/LICENSE +21 -0
- junifer/external/BrainPrint/README.md +108 -0
- junifer/external/BrainPrint/brainprint/cli/__init__.py +11 -0
- junifer/external/BrainPrint/brainprint/cli/help_text.py +169 -0
- junifer/external/BrainPrint/brainprint/cli/parser.py +150 -0
- junifer/external/BrainPrint/brainprint/cli/utils.py +14 -0
- junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/commands/sys_info.py +18 -0
- junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +33 -0
- junifer/external/BrainPrint/doc/Makefile +20 -0
- junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +10 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +8 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +6 -0
- junifer/external/BrainPrint/doc/api/index.rst +11 -0
- junifer/external/BrainPrint/doc/conf.py +272 -0
- junifer/external/BrainPrint/doc/index.rst +140 -0
- junifer/external/BrainPrint/doc/links.inc +36 -0
- junifer/external/BrainPrint/doc/make.bat +35 -0
- junifer/external/BrainPrint/doc/references.bib +23 -0
- junifer/external/BrainPrint/pyproject.toml +170 -0
- junifer/external/BrainPrint/setup.py +3 -0
- junifer/external/__init__.py +5 -0
- junifer/external/__init__.pyi +0 -0
- junifer/external/nilearn/junifer_connectivity_measure.py +95 -39
- junifer/external/nilearn/junifer_nifti_spheres_masker.py +226 -67
- junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +39 -27
- junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +231 -21
- junifer/external/py.typed +0 -0
- junifer/markers/__init__.pyi +6 -3
- junifer/markers/base.py +126 -76
- junifer/markers/brainprint.py +30 -39
- junifer/markers/complexity/__init__.py +20 -3
- junifer/markers/complexity/complexity_base.py +40 -41
- junifer/markers/complexity/hurst_exponent.py +22 -35
- junifer/markers/complexity/multiscale_entropy_auc.py +53 -41
- junifer/markers/complexity/perm_entropy.py +22 -36
- junifer/markers/complexity/range_entropy.py +22 -35
- junifer/markers/complexity/range_entropy_auc.py +27 -36
- junifer/markers/complexity/sample_entropy.py +22 -36
- junifer/markers/complexity/tests/test_complexity_registry.py +48 -0
- junifer/markers/complexity/tests/test_hurst_exponent.py +47 -36
- junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +50 -36
- junifer/markers/complexity/tests/test_perm_entropy.py +48 -36
- junifer/markers/complexity/tests/test_range_entropy.py +47 -36
- junifer/markers/complexity/tests/test_range_entropy_auc.py +47 -36
- junifer/markers/complexity/tests/test_sample_entropy.py +48 -36
- junifer/markers/complexity/tests/test_weighted_perm_entropy.py +50 -36
- junifer/markers/complexity/weighted_perm_entropy.py +22 -36
- junifer/markers/ets_rss.py +35 -31
- junifer/markers/falff/__init__.pyi +7 -1
- junifer/markers/falff/_afni_falff.py +22 -9
- junifer/markers/falff/_junifer_falff.py +47 -31
- junifer/markers/falff/falff_base.py +80 -60
- junifer/markers/falff/falff_maps.py +17 -41
- junifer/markers/falff/falff_parcels.py +26 -51
- junifer/markers/falff/falff_spheres.py +34 -61
- junifer/markers/falff/tests/test_falff_maps.py +20 -23
- junifer/markers/falff/tests/test_falff_mask.py +99 -0
- junifer/markers/falff/tests/test_falff_parcels.py +14 -10
- junifer/markers/falff/tests/test_falff_spheres.py +14 -10
- junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +32 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +24 -44
- junifer/markers/functional_connectivity/functional_connectivity_base.py +50 -40
- junifer/markers/functional_connectivity/functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/functional_connectivity_spheres.py +24 -45
- junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +21 -22
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +8 -4
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +8 -4
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +9 -5
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +8 -12
- junifer/markers/maps_aggregation.py +77 -55
- junifer/markers/parcel_aggregation.py +91 -70
- junifer/markers/reho/__init__.pyi +7 -1
- junifer/markers/reho/_afni_reho.py +23 -14
- junifer/markers/reho/_junifer_reho.py +112 -123
- junifer/markers/reho/reho_base.py +115 -37
- junifer/markers/reho/reho_maps.py +18 -32
- junifer/markers/reho/reho_parcels.py +26 -41
- junifer/markers/reho/reho_spheres.py +33 -54
- junifer/markers/reho/tests/test_junifer_reho.py +178 -0
- junifer/markers/reho/tests/test_reho_maps.py +27 -25
- junifer/markers/reho/tests/test_reho_parcels.py +28 -22
- junifer/markers/reho/tests/test_reho_spheres.py +16 -12
- junifer/markers/sphere_aggregation.py +88 -72
- junifer/markers/temporal_snr/temporal_snr_base.py +32 -30
- junifer/markers/temporal_snr/temporal_snr_maps.py +9 -18
- junifer/markers/temporal_snr/temporal_snr_parcels.py +19 -27
- junifer/markers/temporal_snr/temporal_snr_spheres.py +27 -41
- junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +2 -2
- junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +17 -22
- junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +11 -3
- junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +9 -9
- junifer/markers/tests/test_brainprint.py +10 -9
- junifer/markers/tests/test_ets_rss.py +7 -3
- junifer/markers/tests/test_lost_regions.py +279 -0
- junifer/markers/tests/test_maps_aggregation.py +67 -114
- junifer/markers/tests/test_marker_utils.py +40 -1
- junifer/markers/tests/test_markers_base.py +275 -6
- junifer/markers/tests/test_parcel_aggregation.py +91 -53
- junifer/markers/tests/test_sphere_aggregation.py +53 -47
- junifer/markers/utils.py +267 -5
- junifer/onthefly/__init__.py +2 -3
- junifer/onthefly/__init__.pyi +4 -0
- junifer/onthefly/_brainprint.py +3 -5
- junifer/onthefly/py.typed +0 -0
- junifer/onthefly/read_transform.py +11 -9
- junifer/onthefly/tests/test_read_transform.py +7 -7
- junifer/pipeline/__init__.pyi +4 -2
- junifer/pipeline/marker_collection.py +14 -10
- junifer/pipeline/pipeline_component_registry.py +25 -6
- junifer/pipeline/pipeline_step_mixin.py +5 -12
- junifer/pipeline/tests/test_data_object_dumper.py +10 -10
- junifer/pipeline/tests/test_marker_collection.py +145 -168
- junifer/pipeline/tests/test_pipeline_component_registry.py +52 -8
- junifer/pipeline/tests/test_pipeline_step_mixin.py +12 -26
- junifer/pipeline/tests/test_update_meta_mixin.py +4 -5
- junifer/pipeline/tests/test_workdir_manager.py +39 -0
- junifer/pipeline/update_meta_mixin.py +13 -10
- junifer/pipeline/utils.py +22 -17
- junifer/pipeline/workdir_manager.py +41 -32
- junifer/preprocess/__init__.pyi +9 -4
- junifer/preprocess/_temporal_filter.py +34 -33
- junifer/preprocess/_temporal_slicer.py +17 -30
- junifer/preprocess/base.py +99 -55
- junifer/preprocess/confounds/__init__.pyi +10 -2
- junifer/preprocess/confounds/fmriprep_confound_remover.py +87 -109
- junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +64 -45
- junifer/preprocess/smoothing/__init__.pyi +2 -2
- junifer/preprocess/smoothing/_afni_smoothing.py +8 -7
- junifer/preprocess/smoothing/_fsl_smoothing.py +6 -4
- junifer/preprocess/smoothing/_nilearn_smoothing.py +7 -5
- junifer/preprocess/smoothing/smoothing.py +59 -40
- junifer/preprocess/smoothing/tests/test_smoothing.py +28 -8
- junifer/preprocess/tests/test_preprocess_base.py +17 -9
- junifer/preprocess/tests/test_temporal_filter.py +37 -16
- junifer/preprocess/tests/test_temporal_slicer.py +12 -12
- junifer/preprocess/warping/__init__.pyi +2 -2
- junifer/preprocess/warping/_ants_warper.py +56 -40
- junifer/preprocess/warping/_fsl_warper.py +49 -36
- junifer/preprocess/warping/_utils.py +106 -0
- junifer/preprocess/warping/space_warper.py +99 -98
- junifer/preprocess/warping/tests/test_space_warper.py +46 -41
- junifer/preprocess/warping/tests/test_warping_utils.py +163 -0
- junifer/stats.py +46 -34
- junifer/storage/__init__.pyi +8 -4
- junifer/storage/base.py +129 -64
- junifer/storage/hdf5.py +307 -199
- junifer/storage/pandas_base.py +46 -24
- junifer/storage/sqlite.py +99 -62
- junifer/storage/tests/data/collected_h5io_fork.hdf5 +0 -0
- junifer/storage/tests/test_hdf5.py +147 -12
- junifer/storage/tests/test_repeated_storage.py +293 -0
- junifer/storage/tests/test_sqlite.py +9 -20
- junifer/storage/tests/test_storage_base.py +18 -21
- junifer/storage/tests/test_utils.py +83 -22
- junifer/storage/utils.py +58 -38
- junifer/testing/__init__.pyi +2 -2
- junifer/testing/datagrabbers.py +480 -44
- junifer/testing/registry.py +12 -0
- junifer/testing/tests/test_adhdtesting_datagrabber.py +24 -0
- junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +5 -0
- junifer/testing/tests/test_partlycloudytesting_datagrabber.py +52 -0
- junifer/testing/tests/test_spmauditory_datagrabber.py +16 -0
- junifer/testing/tests/test_testing_registry.py +31 -0
- junifer/testing/tests/test_testing_utils.py +35 -0
- junifer/testing/tests/test_uclacnpvbmtesting_datagrabber.py +81 -0
- junifer/testing/utils.py +33 -1
- junifer/tests/test_stats.py +1 -5
- junifer/typing/__init__.pyi +2 -0
- junifer/typing/_typing.py +34 -19
- junifer/typing/py.typed +0 -0
- junifer/utils/__init__.pyi +10 -1
- junifer/utils/_config.py +1 -2
- junifer/utils/helpers.py +68 -2
- junifer/utils/logging.py +31 -7
- junifer/utils/tests/test_helpers.py +36 -1
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/METADATA +43 -35
- junifer-0.0.8.dist-info/RECORD +402 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/WHEEL +1 -1
- junifer/cli/tests/test_parser.py +0 -280
- junifer/external/h5io/h5io/__init__.py +0 -15
- junifer/external/h5io/h5io/_h5io.py +0 -767
- junifer/external/h5io/h5io/_version.py +0 -1
- junifer/external/h5io/h5io/chunked_array.py +0 -94
- junifer/external/h5io/h5io/chunked_list.py +0 -65
- junifer/markers/complexity/__init__.pyi +0 -17
- junifer-0.0.7.dev332.dist-info/RECORD +0 -353
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/AUTHORS.rst +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/LICENSE.md +0 -0
- {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
|
|
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
|
|
31
|
-
:func
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
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
|
|
31
|
-
:func
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
41
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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] =
|
|
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
|
|
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
|
|
31
|
-
:func
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
``
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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.
|
|
18
|
-
from junifer.storage import SQLiteFeatureStorage
|
|
18
|
+
from junifer.storage import HDF5FeatureStorage
|
|
19
19
|
from junifer.testing.datagrabbers import (
|
|
20
|
-
|
|
20
|
+
PartlyCloudyTestingDataGrabber,
|
|
21
21
|
)
|
|
22
22
|
|
|
23
23
|
|
|
24
|
+
pytestmark = pytest.mark.external
|
|
25
|
+
|
|
26
|
+
|
|
24
27
|
# Set parcellation
|
|
25
|
-
PARCELLATION = "
|
|
28
|
+
PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
|
|
26
29
|
|
|
27
30
|
|
|
28
|
-
@pytest.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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["
|
|
43
|
+
element = dg["sub-01"]
|
|
36
44
|
# Fetch element data
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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=
|
|
68
|
+
input_type=DataType.BOLD, output_feature="complexity"
|
|
50
69
|
)
|
|
51
70
|
|
|
52
71
|
|
|
53
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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.
|
|
17
|
-
from junifer.storage import SQLiteFeatureStorage
|
|
18
|
+
from junifer.storage import HDF5FeatureStorage
|
|
18
19
|
from junifer.testing.datagrabbers import (
|
|
19
|
-
|
|
20
|
+
PartlyCloudyTestingDataGrabber,
|
|
20
21
|
)
|
|
21
22
|
|
|
22
23
|
|
|
24
|
+
pytestmark = pytest.mark.external
|
|
25
|
+
|
|
26
|
+
|
|
23
27
|
# Set parcellation
|
|
24
|
-
PARCELLATION = "
|
|
28
|
+
PARCELLATION = "TianxS1x3TxMNInonlinear2009cAsym"
|
|
25
29
|
|
|
26
30
|
|
|
27
|
-
@pytest.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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["
|
|
43
|
+
element = dg["sub-01"]
|
|
35
44
|
# Fetch element data
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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=
|
|
69
|
+
).storage_type(input_type=DataType.BOLD, output_feature="complexity")
|
|
50
70
|
|
|
51
71
|
|
|
52
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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)
|