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
|
@@ -4,14 +4,17 @@
|
|
|
4
4
|
# Kaustubh R. Patil <k.patil@fz-juelich.de>
|
|
5
5
|
# License: AGPL
|
|
6
6
|
|
|
7
|
-
from typing import Any, ClassVar
|
|
7
|
+
from typing import Annotated, Any, ClassVar
|
|
8
8
|
|
|
9
9
|
import pandas as pd
|
|
10
|
+
from pydantic import BeforeValidator
|
|
10
11
|
|
|
11
12
|
from ...api.decorators import register_marker
|
|
13
|
+
from ...datagrabber import DataType
|
|
14
|
+
from ...storage import StorageType
|
|
12
15
|
from ...typing import Dependencies, MarkerInOutMappings
|
|
13
|
-
from ...utils import
|
|
14
|
-
from ..base import BaseMarker
|
|
16
|
+
from ...utils import ensure_list_or_none, raise_error
|
|
17
|
+
from ..base import BaseMarker, logger
|
|
15
18
|
from ..parcel_aggregation import ParcelAggregation
|
|
16
19
|
from ..utils import _correlate_dataframes
|
|
17
20
|
|
|
@@ -30,60 +33,55 @@ class CrossParcellationFC(BaseMarker):
|
|
|
30
33
|
parcellation_two : str
|
|
31
34
|
The name of the second parcellation.
|
|
32
35
|
agg_method : str, optional
|
|
33
|
-
The
|
|
36
|
+
The aggregation function to use.
|
|
34
37
|
See :func:`.get_aggfunc_by_name` for options
|
|
35
38
|
(default "mean").
|
|
36
39
|
agg_method_params : dict, optional
|
|
37
|
-
|
|
40
|
+
The parameters to pass to the aggregation function.
|
|
38
41
|
See :func:`.get_aggfunc_by_name` for options
|
|
39
42
|
(default None).
|
|
40
43
|
corr_method : str, optional
|
|
41
44
|
Any method that can be passed to
|
|
42
45
|
:meth:`pandas.DataFrame.corr` (default "pearson").
|
|
43
|
-
masks : str, dict
|
|
46
|
+
masks : str, dict, list of them or None, optional
|
|
44
47
|
The specification of the masks to apply to regions before extracting
|
|
45
48
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
46
49
|
If None, will not apply any mask (default None).
|
|
47
|
-
name : str, optional
|
|
48
|
-
The name of the marker.
|
|
49
|
-
|
|
50
|
+
name : str or None, optional
|
|
51
|
+
The name of the marker.
|
|
52
|
+
If None, will use the class name (default None).
|
|
50
53
|
|
|
51
54
|
"""
|
|
52
55
|
|
|
53
56
|
_DEPENDENCIES: ClassVar[Dependencies] = {"nilearn"}
|
|
54
57
|
|
|
55
58
|
_MARKER_INOUT_MAPPINGS: ClassVar[MarkerInOutMappings] = {
|
|
56
|
-
|
|
57
|
-
"functional_connectivity":
|
|
59
|
+
DataType.BOLD: {
|
|
60
|
+
"functional_connectivity": StorageType.Matrix,
|
|
58
61
|
},
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
64
|
+
parcellation_one: str
|
|
65
|
+
parcellation_two: str
|
|
66
|
+
agg_method: str = "mean"
|
|
67
|
+
agg_method_params: dict | None = None
|
|
68
|
+
corr_method: str = "pearson"
|
|
69
|
+
masks: Annotated[
|
|
70
|
+
dict | str | list[dict | str] | None,
|
|
71
|
+
BeforeValidator(ensure_list_or_none),
|
|
72
|
+
] = None
|
|
73
|
+
|
|
74
|
+
def validate_marker_params(self) -> None:
|
|
75
|
+
"""Run extra logical validation for marker."""
|
|
76
|
+
if self.parcellation_one == self.parcellation_two:
|
|
72
77
|
raise_error(
|
|
73
78
|
"The two parcellations must be different.",
|
|
74
79
|
)
|
|
75
|
-
self.parcellation_one = parcellation_one
|
|
76
|
-
self.parcellation_two = parcellation_two
|
|
77
|
-
self.agg_method = agg_method
|
|
78
|
-
self.agg_method_params = agg_method_params
|
|
79
|
-
self.corr_method = corr_method
|
|
80
|
-
self.masks = masks
|
|
81
|
-
super().__init__(on=["BOLD"], name=name)
|
|
82
80
|
|
|
83
81
|
def compute(
|
|
84
82
|
self,
|
|
85
83
|
input: dict[str, Any],
|
|
86
|
-
extra_input:
|
|
84
|
+
extra_input: dict | None = None,
|
|
87
85
|
) -> dict:
|
|
88
86
|
"""Compute.
|
|
89
87
|
|
|
@@ -123,18 +121,18 @@ class CrossParcellationFC(BaseMarker):
|
|
|
123
121
|
)
|
|
124
122
|
# Perform aggregation using two parcellations
|
|
125
123
|
aggregation_parcellation_one = ParcelAggregation(
|
|
126
|
-
parcellation=self.parcellation_one,
|
|
124
|
+
parcellation=[self.parcellation_one],
|
|
127
125
|
method=self.agg_method,
|
|
128
126
|
method_params=self.agg_method_params,
|
|
129
127
|
masks=self.masks,
|
|
130
|
-
on=
|
|
128
|
+
on=DataType.BOLD,
|
|
131
129
|
).compute(input, extra_input=extra_input)
|
|
132
130
|
aggregation_parcellation_two = ParcelAggregation(
|
|
133
|
-
parcellation=self.parcellation_two,
|
|
131
|
+
parcellation=[self.parcellation_two],
|
|
134
132
|
method=self.agg_method,
|
|
135
133
|
method_params=self.agg_method_params,
|
|
136
134
|
masks=self.masks,
|
|
137
|
-
on=
|
|
135
|
+
on=DataType.BOLD,
|
|
138
136
|
).compute(input, extra_input=extra_input)
|
|
139
137
|
|
|
140
138
|
return {
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
|
4
4
|
# License: AGPL
|
|
5
5
|
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from ...api.decorators import register_marker
|
|
9
|
+
from ...datagrabber import DataType
|
|
9
10
|
from ..maps_aggregation import MapsAggregation
|
|
10
11
|
from ..utils import _ets
|
|
11
12
|
from .functional_connectivity_base import FunctionalConnectivityBase
|
|
@@ -24,23 +25,23 @@ class EdgeCentricFCMaps(FunctionalConnectivityBase):
|
|
|
24
25
|
The name of the map(s) to use.
|
|
25
26
|
See :func:`.list_data` for options.
|
|
26
27
|
conn_method : str, optional
|
|
27
|
-
The
|
|
28
|
+
The connectivity measure to use.
|
|
28
29
|
See :class:`.JuniferConnectivityMeasure` for options
|
|
29
30
|
(default "correlation").
|
|
30
|
-
conn_method_params : dict, optional
|
|
31
|
-
|
|
31
|
+
conn_method_params : dict or None, optional
|
|
32
|
+
The parameters to pass to :class:`.JuniferConnectivityMeasure`.
|
|
32
33
|
If None, ``{"empirical": True}`` will be used, which would mean
|
|
33
34
|
:class:`sklearn.covariance.EmpiricalCovariance` is used to compute
|
|
34
35
|
covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
|
|
35
36
|
desired, ``{"empirical": False}`` should be passed
|
|
36
37
|
(default None).
|
|
37
|
-
masks : str, dict
|
|
38
|
+
masks : str, dict, list of them or None, optional
|
|
38
39
|
The specification of the masks to apply to regions before extracting
|
|
39
40
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
40
41
|
If None, will not apply any mask (default None).
|
|
41
|
-
name : str, optional
|
|
42
|
-
The name of the marker.
|
|
43
|
-
|
|
42
|
+
name : str or None, optional
|
|
43
|
+
The name of the marker.
|
|
44
|
+
If None, will use the class name (default None).
|
|
44
45
|
|
|
45
46
|
References
|
|
46
47
|
----------
|
|
@@ -50,24 +51,10 @@ class EdgeCentricFCMaps(FunctionalConnectivityBase):
|
|
|
50
51
|
|
|
51
52
|
"""
|
|
52
53
|
|
|
53
|
-
|
|
54
|
-
self,
|
|
55
|
-
maps: str,
|
|
56
|
-
conn_method: str = "correlation",
|
|
57
|
-
conn_method_params: Optional[dict] = None,
|
|
58
|
-
masks: Union[str, dict, list[Union[dict, str]], None] = None,
|
|
59
|
-
name: Optional[str] = None,
|
|
60
|
-
) -> None:
|
|
61
|
-
self.maps = maps
|
|
62
|
-
super().__init__(
|
|
63
|
-
conn_method=conn_method,
|
|
64
|
-
conn_method_params=conn_method_params,
|
|
65
|
-
masks=masks,
|
|
66
|
-
name=name,
|
|
67
|
-
)
|
|
54
|
+
maps: str
|
|
68
55
|
|
|
69
56
|
def aggregate(
|
|
70
|
-
self, input: dict[str, Any], extra_input:
|
|
57
|
+
self, input: dict[str, Any], extra_input: dict | None = None
|
|
71
58
|
) -> dict:
|
|
72
59
|
"""Perform maps aggregation and ETS computation.
|
|
73
60
|
|
|
@@ -99,7 +86,7 @@ class EdgeCentricFCMaps(FunctionalConnectivityBase):
|
|
|
99
86
|
aggregation = MapsAggregation(
|
|
100
87
|
maps=self.maps,
|
|
101
88
|
masks=self.masks,
|
|
102
|
-
on=
|
|
89
|
+
on=DataType.BOLD,
|
|
103
90
|
).compute(input, extra_input=extra_input)
|
|
104
91
|
# Compute edgewise timeseries
|
|
105
92
|
ets, edge_names = _ets(
|
|
@@ -4,9 +4,13 @@
|
|
|
4
4
|
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
5
5
|
# License: AGPL
|
|
6
6
|
|
|
7
|
-
from typing import
|
|
7
|
+
from typing import Annotated, Any
|
|
8
|
+
|
|
9
|
+
from pydantic import BeforeValidator
|
|
8
10
|
|
|
9
11
|
from ...api.decorators import register_marker
|
|
12
|
+
from ...datagrabber import DataType
|
|
13
|
+
from ...utils import ensure_list
|
|
10
14
|
from ..parcel_aggregation import ParcelAggregation
|
|
11
15
|
from ..utils import _ets
|
|
12
16
|
from .functional_connectivity_base import FunctionalConnectivityBase
|
|
@@ -25,31 +29,30 @@ class EdgeCentricFCParcels(FunctionalConnectivityBase):
|
|
|
25
29
|
The name(s) of the parcellation(s) to use.
|
|
26
30
|
See :func:`.list_data` for options.
|
|
27
31
|
agg_method : str, optional
|
|
28
|
-
The
|
|
32
|
+
The aggregation function to use.
|
|
29
33
|
See :func:`.get_aggfunc_by_name` for options
|
|
30
34
|
(default "mean").
|
|
31
|
-
agg_method_params : dict, optional
|
|
32
|
-
|
|
33
|
-
See :func:`.get_aggfunc_by_name` for options
|
|
34
|
-
(default None).
|
|
35
|
+
agg_method_params : dict or None, optional
|
|
36
|
+
The parameters to pass to the aggregation function.
|
|
37
|
+
See :func:`.get_aggfunc_by_name` for options (default None).
|
|
35
38
|
conn_method : str, optional
|
|
36
|
-
The
|
|
39
|
+
The connectivity measure to use.
|
|
37
40
|
See :class:`.JuniferConnectivityMeasure` for options
|
|
38
41
|
(default "correlation").
|
|
39
|
-
conn_method_params : dict, optional
|
|
40
|
-
|
|
42
|
+
conn_method_params : dict or None, optional
|
|
43
|
+
The parameters to pass to :class:`.JuniferConnectivityMeasure`.
|
|
41
44
|
If None, ``{"empirical": True}`` will be used, which would mean
|
|
42
45
|
:class:`sklearn.covariance.EmpiricalCovariance` is used to compute
|
|
43
46
|
covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
|
|
44
47
|
desired, ``{"empirical": False}`` should be passed
|
|
45
48
|
(default None).
|
|
46
|
-
masks : str, dict
|
|
49
|
+
masks : str, dict, list of them or None, optional
|
|
47
50
|
The specification of the masks to apply to regions before extracting
|
|
48
51
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
49
52
|
If None, will not apply any mask (default None).
|
|
50
|
-
name : str, optional
|
|
51
|
-
The name of the marker.
|
|
52
|
-
|
|
53
|
+
name : str or None, optional
|
|
54
|
+
The name of the marker.
|
|
55
|
+
If None, will use the class name (default None).
|
|
53
56
|
|
|
54
57
|
References
|
|
55
58
|
----------
|
|
@@ -59,28 +62,10 @@ class EdgeCentricFCParcels(FunctionalConnectivityBase):
|
|
|
59
62
|
|
|
60
63
|
"""
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
self,
|
|
64
|
-
parcellation: Union[str, list[str]],
|
|
65
|
-
agg_method: str = "mean",
|
|
66
|
-
agg_method_params: Optional[dict] = None,
|
|
67
|
-
conn_method: str = "correlation",
|
|
68
|
-
conn_method_params: Optional[dict] = None,
|
|
69
|
-
masks: Union[str, dict, list[Union[dict, str]], None] = None,
|
|
70
|
-
name: Optional[str] = None,
|
|
71
|
-
) -> None:
|
|
72
|
-
self.parcellation = parcellation
|
|
73
|
-
super().__init__(
|
|
74
|
-
agg_method=agg_method,
|
|
75
|
-
agg_method_params=agg_method_params,
|
|
76
|
-
conn_method=conn_method,
|
|
77
|
-
conn_method_params=conn_method_params,
|
|
78
|
-
masks=masks,
|
|
79
|
-
name=name,
|
|
80
|
-
)
|
|
65
|
+
parcellation: Annotated[str | list[str], BeforeValidator(ensure_list)]
|
|
81
66
|
|
|
82
67
|
def aggregate(
|
|
83
|
-
self, input: dict[str, Any], extra_input:
|
|
68
|
+
self, input: dict[str, Any], extra_input: dict | None = None
|
|
84
69
|
) -> dict:
|
|
85
70
|
"""Perform parcel aggregation and ETS computation.
|
|
86
71
|
|
|
@@ -114,7 +99,7 @@ class EdgeCentricFCParcels(FunctionalConnectivityBase):
|
|
|
114
99
|
method=self.agg_method,
|
|
115
100
|
method_params=self.agg_method_params,
|
|
116
101
|
masks=self.masks,
|
|
117
|
-
on=
|
|
102
|
+
on=DataType.BOLD,
|
|
118
103
|
).compute(input, extra_input=extra_input)
|
|
119
104
|
# Compute edgewise timeseries
|
|
120
105
|
ets, edge_names = _ets(
|
|
@@ -4,11 +4,14 @@
|
|
|
4
4
|
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
5
5
|
# License: AGPL
|
|
6
6
|
|
|
7
|
-
from typing import Any,
|
|
7
|
+
from typing import Any, Literal
|
|
8
|
+
|
|
9
|
+
from pydantic import PositiveFloat
|
|
8
10
|
|
|
9
11
|
from ...api.decorators import register_marker
|
|
12
|
+
from ...datagrabber import DataType
|
|
10
13
|
from ..sphere_aggregation import SphereAggregation
|
|
11
|
-
from ..utils import _ets
|
|
14
|
+
from ..utils import _ets
|
|
12
15
|
from .functional_connectivity_base import FunctionalConnectivityBase
|
|
13
16
|
|
|
14
17
|
|
|
@@ -24,40 +27,39 @@ class EdgeCentricFCSpheres(FunctionalConnectivityBase):
|
|
|
24
27
|
coords : str
|
|
25
28
|
The name of the coordinates list to use.
|
|
26
29
|
See :func:`.list_data` for options.
|
|
27
|
-
radius : positive float, optional
|
|
28
|
-
The radius of the sphere
|
|
30
|
+
radius : ``zero`` or positive float or None, optional
|
|
31
|
+
The radius of the sphere in millimetres.
|
|
29
32
|
If None, the signal will be extracted from a single voxel.
|
|
30
33
|
See :class:`.JuniferNiftiSpheresMasker` for more information
|
|
31
34
|
(default None).
|
|
32
35
|
allow_overlap : bool, optional
|
|
33
|
-
Whether to allow overlapping spheres.
|
|
34
|
-
the spheres overlap (default False).
|
|
36
|
+
Whether to allow overlapping spheres.
|
|
37
|
+
If False, an error is raised if the spheres overlap (default False).
|
|
35
38
|
agg_method : str, optional
|
|
36
|
-
The
|
|
39
|
+
The aggregation function to use.
|
|
37
40
|
See :func:`.get_aggfunc_by_name` for options
|
|
38
41
|
(default "mean").
|
|
39
42
|
agg_method_params : dict, optional
|
|
40
|
-
|
|
41
|
-
See :func:`.get_aggfunc_by_name` for options
|
|
42
|
-
(default None).
|
|
43
|
+
The parameters to pass to the aggregation function.
|
|
44
|
+
See :func:`.get_aggfunc_by_name` for options (default None).
|
|
43
45
|
conn_method : str, optional
|
|
44
|
-
The
|
|
46
|
+
The connectivity measure to use.
|
|
45
47
|
See :class:`.JuniferConnectivityMeasure` for options
|
|
46
48
|
(default "correlation").
|
|
47
|
-
conn_method_params : dict, optional
|
|
48
|
-
|
|
49
|
+
conn_method_params : dict or None, optional
|
|
50
|
+
The parameters to pass to :class:`.JuniferConnectivityMeasure`.
|
|
49
51
|
If None, ``{"empirical": True}`` will be used, which would mean
|
|
50
52
|
:class:`sklearn.covariance.EmpiricalCovariance` is used to compute
|
|
51
53
|
covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
|
|
52
54
|
desired, ``{"empirical": False}`` should be passed
|
|
53
55
|
(default None).
|
|
54
|
-
masks : str, dict
|
|
56
|
+
masks : str, dict, list of them or None, optional
|
|
55
57
|
The specification of the masks to apply to regions before extracting
|
|
56
58
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
57
59
|
If None, will not apply any mask (default None).
|
|
58
|
-
name : str, optional
|
|
59
|
-
The name of the marker.
|
|
60
|
-
|
|
60
|
+
name : str or None, optional
|
|
61
|
+
The name of the marker.
|
|
62
|
+
If None, will use the class name (default None).
|
|
61
63
|
|
|
62
64
|
References
|
|
63
65
|
----------
|
|
@@ -67,34 +69,12 @@ class EdgeCentricFCSpheres(FunctionalConnectivityBase):
|
|
|
67
69
|
|
|
68
70
|
"""
|
|
69
71
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
radius: Optional[float] = None,
|
|
74
|
-
allow_overlap: bool = False,
|
|
75
|
-
agg_method: str = "mean",
|
|
76
|
-
agg_method_params: Optional[dict] = None,
|
|
77
|
-
conn_method: str = "correlation",
|
|
78
|
-
conn_method_params: Optional[dict] = None,
|
|
79
|
-
masks: Union[str, dict, list[Union[dict, str]], None] = None,
|
|
80
|
-
name: Optional[str] = None,
|
|
81
|
-
) -> None:
|
|
82
|
-
self.coords = coords
|
|
83
|
-
self.radius = radius
|
|
84
|
-
self.allow_overlap = allow_overlap
|
|
85
|
-
if radius is None or radius <= 0:
|
|
86
|
-
raise_error(f"radius should be > 0: provided {radius}")
|
|
87
|
-
super().__init__(
|
|
88
|
-
agg_method=agg_method,
|
|
89
|
-
agg_method_params=agg_method_params,
|
|
90
|
-
conn_method=conn_method,
|
|
91
|
-
conn_method_params=conn_method_params,
|
|
92
|
-
masks=masks,
|
|
93
|
-
name=name,
|
|
94
|
-
)
|
|
72
|
+
coords: str
|
|
73
|
+
radius: Literal[0] | PositiveFloat | None = None
|
|
74
|
+
allow_overlap: bool = False
|
|
95
75
|
|
|
96
76
|
def aggregate(
|
|
97
|
-
self, input: dict[str, Any], extra_input:
|
|
77
|
+
self, input: dict[str, Any], extra_input: dict | None = None
|
|
98
78
|
) -> dict:
|
|
99
79
|
"""Perform sphere aggregation and ETS computation.
|
|
100
80
|
|
|
@@ -130,7 +110,7 @@ class EdgeCentricFCSpheres(FunctionalConnectivityBase):
|
|
|
130
110
|
method=self.agg_method,
|
|
131
111
|
method_params=self.agg_method_params,
|
|
132
112
|
masks=self.masks,
|
|
133
|
-
on=
|
|
113
|
+
on=DataType.BOLD,
|
|
134
114
|
).compute(input, extra_input=extra_input)
|
|
135
115
|
# Compute edgewise timeseries
|
|
136
116
|
ets, edge_names = _ets(
|
|
@@ -4,14 +4,19 @@
|
|
|
4
4
|
# License: AGPL
|
|
5
5
|
|
|
6
6
|
from abc import abstractmethod
|
|
7
|
-
from typing import Any, ClassVar
|
|
7
|
+
from typing import Annotated, Any, ClassVar
|
|
8
8
|
|
|
9
|
+
import numpy as np
|
|
10
|
+
from pydantic import BeforeValidator
|
|
9
11
|
from sklearn.covariance import EmpiricalCovariance, LedoitWolf
|
|
10
12
|
|
|
13
|
+
from ...datagrabber import DataType
|
|
11
14
|
from ...external.nilearn import JuniferConnectivityMeasure
|
|
15
|
+
from ...storage import MatrixKind, StorageType
|
|
12
16
|
from ...typing import Dependencies, MarkerInOutMappings
|
|
13
|
-
from ...utils import raise_error
|
|
17
|
+
from ...utils import ensure_list_or_none, raise_error
|
|
14
18
|
from ..base import BaseMarker
|
|
19
|
+
from ..utils import _has_data
|
|
15
20
|
|
|
16
21
|
|
|
17
22
|
__all__ = ["FunctionalConnectivityBase"]
|
|
@@ -23,67 +28,63 @@ class FunctionalConnectivityBase(BaseMarker):
|
|
|
23
28
|
Parameters
|
|
24
29
|
----------
|
|
25
30
|
agg_method : str, optional
|
|
26
|
-
The
|
|
27
|
-
|
|
31
|
+
The aggregation function to use.
|
|
32
|
+
See :func:`.get_aggfunc_by_name` for options
|
|
28
33
|
(default "mean").
|
|
29
|
-
agg_method_params : dict, optional
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
(default None).
|
|
34
|
+
agg_method_params : dict or None, optional
|
|
35
|
+
The parameters to pass to the aggregation function.
|
|
36
|
+
See :func:`.get_aggfunc_by_name` for options (default None).
|
|
33
37
|
conn_method : str, optional
|
|
34
|
-
The
|
|
35
|
-
|
|
38
|
+
The connectivity measure to use.
|
|
39
|
+
See :class:`.JuniferConnectivityMeasure` for more information
|
|
36
40
|
(default "correlation").
|
|
37
|
-
conn_method_params : dict, optional
|
|
38
|
-
|
|
41
|
+
conn_method_params : dict or None, optional
|
|
42
|
+
The parameters to pass to :class:`.JuniferConnectivityMeasure`.
|
|
39
43
|
If None, ``{"empirical": True}`` will be used, which would mean
|
|
40
44
|
:class:`sklearn.covariance.EmpiricalCovariance` is used to compute
|
|
41
45
|
covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
|
|
42
46
|
desired, ``{"empirical": False}`` should be passed
|
|
43
47
|
(default None).
|
|
44
|
-
masks : str, dict
|
|
48
|
+
masks : str, dict, list of them or None, optional
|
|
45
49
|
The specification of the masks to apply to regions before extracting
|
|
46
50
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
47
51
|
If None, will not apply any mask (default None).
|
|
48
|
-
name : str, optional
|
|
49
|
-
The name of the marker.
|
|
50
|
-
(default None).
|
|
52
|
+
name : str or None, optional
|
|
53
|
+
The name of the marker.
|
|
54
|
+
If None, will use the class name (default None).
|
|
51
55
|
|
|
52
56
|
"""
|
|
53
57
|
|
|
54
58
|
_DEPENDENCIES: ClassVar[Dependencies] = {"nilearn", "scikit-learn"}
|
|
55
59
|
|
|
56
60
|
_MARKER_INOUT_MAPPINGS: ClassVar[MarkerInOutMappings] = {
|
|
57
|
-
|
|
58
|
-
"functional_connectivity":
|
|
61
|
+
DataType.BOLD: {
|
|
62
|
+
"functional_connectivity": StorageType.Matrix,
|
|
59
63
|
},
|
|
60
64
|
}
|
|
61
65
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
self.
|
|
74
|
-
self.conn_method_params = conn_method_params or {}
|
|
66
|
+
agg_method: str = "mean"
|
|
67
|
+
agg_method_params: dict | None = None
|
|
68
|
+
conn_method: str = "correlation"
|
|
69
|
+
conn_method_params: dict | None = None
|
|
70
|
+
masks: Annotated[
|
|
71
|
+
dict | str | list[dict | str] | None,
|
|
72
|
+
BeforeValidator(ensure_list_or_none),
|
|
73
|
+
] = None
|
|
74
|
+
|
|
75
|
+
def validate_marker_params(self) -> None:
|
|
76
|
+
"""Run extra logical validation for marker."""
|
|
77
|
+
self.conn_method_params = self.conn_method_params or {}
|
|
75
78
|
# Reverse of nilearn behavior
|
|
76
79
|
self.conn_method_params["empirical"] = self.conn_method_params.get(
|
|
77
80
|
"empirical", True
|
|
78
81
|
)
|
|
79
|
-
self.masks = masks
|
|
80
|
-
super().__init__(on="BOLD", name=name)
|
|
81
82
|
|
|
82
83
|
@abstractmethod
|
|
83
84
|
def aggregate(
|
|
84
85
|
self,
|
|
85
86
|
input: dict[str, Any],
|
|
86
|
-
extra_input:
|
|
87
|
+
extra_input: dict[str, Any] | None = None,
|
|
87
88
|
) -> dict[str, Any]:
|
|
88
89
|
"""Perform aggregation."""
|
|
89
90
|
raise_error(
|
|
@@ -94,7 +95,7 @@ class FunctionalConnectivityBase(BaseMarker):
|
|
|
94
95
|
def compute(
|
|
95
96
|
self,
|
|
96
97
|
input: dict[str, Any],
|
|
97
|
-
extra_input:
|
|
98
|
+
extra_input: dict | None = None,
|
|
98
99
|
) -> dict:
|
|
99
100
|
"""Compute.
|
|
100
101
|
|
|
@@ -121,7 +122,7 @@ class FunctionalConnectivityBase(BaseMarker):
|
|
|
121
122
|
- ``data`` : functional connectivity matrix as ``numpy.ndarray``
|
|
122
123
|
- ``row_names`` : ROI labels as list of str
|
|
123
124
|
- ``col_names`` : ROI labels as list of str
|
|
124
|
-
- ``matrix_kind`` :
|
|
125
|
+
- ``matrix_kind`` : :enum:`.MatrixKind`
|
|
125
126
|
|
|
126
127
|
"""
|
|
127
128
|
# Perform necessary aggregation
|
|
@@ -141,18 +142,27 @@ class FunctionalConnectivityBase(BaseMarker):
|
|
|
141
142
|
if k != "empirical"
|
|
142
143
|
},
|
|
143
144
|
)
|
|
145
|
+
# Compute on the columns with data (e.g. regions lost in
|
|
146
|
+
# resampling have none) and set the others to NaN
|
|
147
|
+
data = aggregation["aggregation"]["data"]
|
|
148
|
+
has_data = _has_data(data)
|
|
149
|
+
conn = np.full((data.shape[1], data.shape[1]), np.nan)
|
|
150
|
+
if has_data.any():
|
|
151
|
+
conn[np.ix_(has_data, has_data)] = connectivity.fit_transform(
|
|
152
|
+
[data[:, has_data]]
|
|
153
|
+
)[0]
|
|
144
154
|
# Create dictionary for output
|
|
145
155
|
labels = aggregation["aggregation"]["col_names"]
|
|
146
156
|
return {
|
|
147
157
|
"functional_connectivity": {
|
|
148
|
-
"data":
|
|
149
|
-
[aggregation["aggregation"]["data"]]
|
|
150
|
-
)[0],
|
|
158
|
+
"data": conn,
|
|
151
159
|
"row_names": labels,
|
|
152
160
|
"col_names": labels,
|
|
153
161
|
# xi correlation coefficient is not symmetric
|
|
154
162
|
"matrix_kind": (
|
|
155
|
-
|
|
163
|
+
MatrixKind.Full
|
|
164
|
+
if self.conn_method == "xi correlation"
|
|
165
|
+
else MatrixKind.LowerTriangle
|
|
156
166
|
),
|
|
157
167
|
},
|
|
158
168
|
}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
|
4
4
|
# License: AGPL
|
|
5
5
|
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any
|
|
7
7
|
|
|
8
8
|
from ...api.decorators import register_marker
|
|
9
|
+
from ...datagrabber import DataType
|
|
9
10
|
from ..maps_aggregation import MapsAggregation
|
|
10
11
|
from .functional_connectivity_base import FunctionalConnectivityBase
|
|
11
12
|
|
|
@@ -23,44 +24,30 @@ class FunctionalConnectivityMaps(FunctionalConnectivityBase):
|
|
|
23
24
|
The name of the map(s) to use.
|
|
24
25
|
See :func:`.list_data` for options.
|
|
25
26
|
conn_method : str, optional
|
|
26
|
-
The
|
|
27
|
+
The connectivity measure to use.
|
|
27
28
|
See :class:`.JuniferConnectivityMeasure` for options
|
|
28
29
|
(default "correlation").
|
|
29
|
-
conn_method_params : dict, optional
|
|
30
|
-
|
|
30
|
+
conn_method_params : dict or None, optional
|
|
31
|
+
The parameters to pass to :class:`.JuniferConnectivityMeasure`.
|
|
31
32
|
If None, ``{"empirical": True}`` will be used, which would mean
|
|
32
33
|
:class:`sklearn.covariance.EmpiricalCovariance` is used to compute
|
|
33
34
|
covariance. If usage of :class:`sklearn.covariance.LedoitWolf` is
|
|
34
35
|
desired, ``{"empirical": False}`` should be passed
|
|
35
36
|
(default None).
|
|
36
|
-
masks : str, dict
|
|
37
|
+
masks : str, dict, list of them or None, optional
|
|
37
38
|
The specification of the masks to apply to regions before extracting
|
|
38
39
|
signals. Check :ref:`Using Masks <using_masks>` for more details.
|
|
39
40
|
If None, will not apply any mask (default None).
|
|
40
|
-
name : str, optional
|
|
41
|
-
The name of the marker.
|
|
42
|
-
|
|
41
|
+
name : str or None, optional
|
|
42
|
+
The name of the marker.
|
|
43
|
+
If None, will use the class name (default None).
|
|
43
44
|
|
|
44
45
|
"""
|
|
45
46
|
|
|
46
|
-
|
|
47
|
-
self,
|
|
48
|
-
maps: str,
|
|
49
|
-
conn_method: str = "correlation",
|
|
50
|
-
conn_method_params: Optional[dict] = None,
|
|
51
|
-
masks: Union[str, dict, list[Union[dict, str]], None] = None,
|
|
52
|
-
name: Optional[str] = None,
|
|
53
|
-
) -> None:
|
|
54
|
-
self.maps = maps
|
|
55
|
-
super().__init__(
|
|
56
|
-
conn_method=conn_method,
|
|
57
|
-
conn_method_params=conn_method_params,
|
|
58
|
-
masks=masks,
|
|
59
|
-
name=name,
|
|
60
|
-
)
|
|
47
|
+
maps: str
|
|
61
48
|
|
|
62
49
|
def aggregate(
|
|
63
|
-
self, input: dict[str, Any], extra_input:
|
|
50
|
+
self, input: dict[str, Any], extra_input: dict | None = None
|
|
64
51
|
) -> dict:
|
|
65
52
|
"""Perform maps aggregation.
|
|
66
53
|
|
|
@@ -91,5 +78,5 @@ class FunctionalConnectivityMaps(FunctionalConnectivityBase):
|
|
|
91
78
|
return MapsAggregation(
|
|
92
79
|
maps=self.maps,
|
|
93
80
|
masks=self.masks,
|
|
94
|
-
on=
|
|
81
|
+
on=DataType.BOLD,
|
|
95
82
|
).compute(input=input, extra_input=extra_input)
|