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