junifer 0.0.8.dev253__tar.gz → 0.0.8.dev257__tar.gz
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-0.0.8.dev253/junifer.egg-info → junifer-0.0.8.dev257}/PKG-INFO +1 -1
- junifer-0.0.8.dev257/docs/changes/newsfragments/514.bugfix +1 -0
- junifer-0.0.8.dev257/docs/changes/newsfragments/514.bugfix.1 +1 -0
- junifer-0.0.8.dev257/docs/changes/newsfragments/514.enh +1 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/_version.py +3 -3
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/_afni_reho.py +6 -0
- junifer-0.0.8.dev257/junifer/markers/reho/_junifer_reho.py +272 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/reho_base.py +61 -2
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/reho_maps.py +4 -2
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/reho_parcels.py +4 -2
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/reho_spheres.py +4 -2
- junifer-0.0.8.dev257/junifer/markers/reho/tests/test_junifer_reho.py +178 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/tests/test_reho_maps.py +14 -9
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/tests/test_reho_parcels.py +10 -9
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/tests/test_reho_spheres.py +1 -1
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257/junifer.egg-info}/PKG-INFO +1 -1
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/SOURCES.txt +4 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/scm_file_list.json +4 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/scm_version.json +2 -2
- junifer-0.0.8.dev253/junifer/markers/reho/_junifer_reho.py +0 -284
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.dockerignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/dataset-request.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/documention-request.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/ISSUE_TEMPLATE/marker-request.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/dependabot.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/pull_request_template.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/check-stale.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/ci.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/docker-publish.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/docs-preview.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/docs.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/lint.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.github/workflows/publish.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.gitignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.gitmodules +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.pre-commit-config.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/.python-version +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/AUTHORS.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/Dockerfile +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/Dockerfile-ci +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/LICENSE.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/README.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/codecov.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/conda-env.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/Makefile +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/_static/css/custom.css +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/_static/css/version_selector.css +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/_static/js/custom.js +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/_templates/versions.html +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/api.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/cli.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/configs.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/data.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/datagrabbers.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/datareaders.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/markers.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/nilearn.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/onthefly.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/pipeline.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/preprocessing.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/stats.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/storage.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/testing.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/api/utils.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/builtin.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/contributors.inc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/.gitignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/239.enh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/364.doc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/364.enh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/364.feature +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/474.misc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/482.bugfix +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/492.bugfix +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/499.enh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/502.bugfix +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/503.enh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/510.bugfix +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.bugfix +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.bugfix.1 +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.change +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.enh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.enh.1 +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.feature +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.misc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/511.misc.1 +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/513.doc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/changes/newsfragments/513.misc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/conf.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/contribution.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/confounds_format.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/coordinates.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/data_dump_asset.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/data_registries.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/data_types.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/datagrabber.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/dependencies.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/extension.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/logging.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/maps.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/marker.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/masks.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/parcellations.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/plugins.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/extending/preprocessor.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/faq.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/help.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/images/junifer_logo.png +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/installation.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/links.inc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/maintaining.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/poly.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/poly_files/patches/version_banner.html +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/poly_files/patches/versions.html +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/poly_files/templates/index.html +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/starting.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/data.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/datagrabber.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/datareader.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/marker.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/pipeline.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/preprocess.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/understanding/storage.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/codeless.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/configuring.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/dumping.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/masks.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/queueing.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/using/running.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/docs/whats_new.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/README.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/norun_hcpfc_pearson.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/norun_ukbvm_gmd.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/run_compute_parcel_mean.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/run_datagrabber_bids_datalad.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/run_ets_rss_marker.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/run_junifer_julearn.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/run_run_gmd_mean.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/yamls/gmd_mean.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/yamls/gmd_mean_htcondor.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/yamls/partly_cloudy_agg_mean_tian.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/examples/yamls/ukb_gmd_mean.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/ignore_words.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/decorators.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/functions.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/gnu_parallel_local_adapter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/htcondor_adapter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/queue_context_adapter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/queue_context/tests/test_htcondor_adapter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/afni/3dAFNItoNIFTI +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/afni/3dRSFC +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/afni/3dReHo +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/afni/afni +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/afni/run_afni_docker.sh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/ants/ResampleImage +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/ants/antsApplyTransforms +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/ants/antsApplyTransformsToPoints +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/ants/run_ants_docker.sh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/freesurfer/mri_binarize +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/freesurfer/mri_mc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/freesurfer/mri_pretess +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/freesurfer/mris_convert +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/freesurfer/run_freesurfer_docker.sh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/fsl/applywarp +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/fsl/flirt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/fsl/img2imgcoord +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/fsl/run_fsl_docker.sh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/fsl/std2imgcoord +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/run_conda.bash +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/run_conda.zsh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/run_venv.bash +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/res/run_venv.zsh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/tests/test_decorators.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/api/tests/test_functions.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/cli.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/parser.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/tests/data/gmd_mean.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/tests/data/gmd_mean_htcondor.yaml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/tests/test_cli.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/tests/test_cli_utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/cli/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/camcan_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/ixi_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/tests/test_camcan_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/tests/test_ucla.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/ucla.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/datagrabbers/ukb_vbm.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/juseless/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/configs/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/conftest.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/_dispatch.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/_ants_coordinates_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/_coordinates.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/_fsl_coordinates_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/tests/test_coordinates.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/coordinates/tests/test_coordinates_names.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/_ants_maps_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/_fsl_maps_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/maps/tests/test_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/_ants_mask_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/_fsl_mask_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/_masks.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/masks/tests/test_masks.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/_ants_parcellation_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/_fsl_parcellation_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/_parcellations.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/parcellations/tests/test_parcellations.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/pipeline_data_registry_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/template_spaces.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/tests/test_data_utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/tests/test_dispatch.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/tests/test_template_spaces.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/data/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/_types.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/id1000.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/piop1.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/piop2.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/tests/test_id1000.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/tests/test_piop1.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/aomic/tests/test_piop2.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/datalad_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/dmcc13_benchmark.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/datalad_hcp1200.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/hcp1200.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/hcp1200/tests/test_hcp1200.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/multiple.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/pattern.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/pattern_datalad.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/pattern_validation_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_datalad_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_dmcc13_benchmark.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_multiple.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_pattern.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_pattern_datalad.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datagrabber/tests/test_pattern_validation_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datareader/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datareader/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datareader/default.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datareader/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/datareader/tests/test_default_reader.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.codecov.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.codespellignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/dependabot.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/workflows/build.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/workflows/code-style.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/workflows/doc.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/workflows/publish.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.github/workflows/pytest.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/.gitignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/LICENSE +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/README.md +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/_version.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/asymmetry.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/brainprint.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/cli/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/cli/help_text.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/cli/parser.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/cli/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/commands/sys_info.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/surfaces.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/utils/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/utils/_config.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/brainprint/utils/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/Makefile +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/api/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/conf.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/index.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/links.inc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/make.bat +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/doc/references.bib +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/pyproject.toml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/BrainPrint/setup.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.coveragerc +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.gitattributes +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.gitignore +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.travis.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.vscode/launch.json +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/.vscode/settings.json +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/LICENSE.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/MANIFEST.in +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/Makefile +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/README.rst +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/azure-pipelines.yml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/_h5io.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/_version.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/chunked_array.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/chunked_list.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/tests/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/tests/test_chunked_array.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/tests/test_chunked_list.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/h5io/tests/test_io.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/setup.cfg +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/setup.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/h5io/versioneer.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/junifer_connectivity_measure.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/junifer_nifti_spheres_masker.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/external/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/brainprint.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/complexity_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/hurst_exponent.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/multiscale_entropy_auc.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/perm_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/range_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/range_entropy_auc.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/sample_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_complexity_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_hurst_exponent.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_perm_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_range_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_range_entropy_auc.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_sample_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/tests/test_weighted_perm_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/complexity/weighted_perm_entropy.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/ets_rss.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/_afni_falff.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/_junifer_falff.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/falff_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/falff_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/falff_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/falff_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/tests/test_falff_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/tests/test_falff_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/falff/tests/test_falff_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/functional_connectivity_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/functional_connectivity_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/functional_connectivity_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/functional_connectivity_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/maps_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/parcel_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/reho/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/sphere_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/temporal_snr_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/temporal_snr_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/temporal_snr_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/temporal_snr_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_brainprint.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_ets_rss.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_maps_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_marker_utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_markers_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_parcel_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/tests/test_sphere_aggregation.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/markers/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/_brainprint.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/read_transform.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/onthefly/tests/test_read_transform.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/_data_object_dumper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/marker_collection.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/pipeline_component_registry.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/pipeline_step_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_data_object_dumper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_marker_collection.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_pipeline_component_registry.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_pipeline_step_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_update_meta_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/tests/test_workdir_manager.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/update_meta_mixin.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/pipeline/workdir_manager.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/_temporal_filter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/_temporal_slicer.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/confounds/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/confounds/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/confounds/fmriprep_confound_remover.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/confounds/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/_afni_smoothing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/_fsl_smoothing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/_nilearn_smoothing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/smoothing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/smoothing/tests/test_smoothing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/tests/test_preprocess_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/tests/test_temporal_filter.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/tests/test_temporal_slicer.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/_ants_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/_fsl_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/space_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/preprocess/warping/tests/test_space_warper.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/stats.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/hdf5.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/pandas_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/sqlite.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/tests/test_hdf5.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/tests/test_pandas_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/tests/test_sqlite.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/tests/test_storage_base.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/tests/test_utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/storage/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/datagrabbers.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/registry.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_adhdtesting_datagrabber.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_partlycloudytesting_datagrabber.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_spmauditory_datagrabber.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_testing_registry.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/tests/test_testing_utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/testing/utils.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/tests/test_main.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/tests/test_stats.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/typing/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/typing/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/typing/_typing.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/typing/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/__init__.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/__init__.pyi +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/_config.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/_yaml.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/fs.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/helpers.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/logging.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/py.typed +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/singleton.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/tests/test_config.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/tests/test_fs.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/tests/test_helpers.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer/utils/tests/test_logging.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/dependency_links.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/entry_points.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/requires.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/junifer.egg-info/top_level.txt +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/justfile +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/pyproject.toml +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/scripts/start.sh +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/setup.cfg +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/setup.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_aomic1000_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_aomicpiop1_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_aomicpiop2_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_bids_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_bids_example_dataset_sessions.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_dmcc13_benchmark_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tools/create_hcp1200_example_dataset.py +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/tox.ini +0 -0
- {junifer-0.0.8.dev253 → junifer-0.0.8.dev257}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: junifer
|
|
3
|
-
Version: 0.0.8.
|
|
3
|
+
Version: 0.0.8.dev257
|
|
4
4
|
Summary: JUelich NeuroImaging FEature extractoR
|
|
5
5
|
Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
|
|
6
6
|
Maintainer-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Fix ReHo computation with ``using="junifer"`` including neighbours outside the mask, checking the wrong centre voxel for ``nneigh=125``, setting voxels outside the mask to 1 instead of 0, skipping voxels at the edges of the volume and setting fully tied neighbourhoods to 1 instead of 0, so that it matches AFNI's ``3dReHo`` by `Fede Raimondo`_
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Use the ``masks`` parameter of :class:`.ReHoMaps`, :class:`.ReHoParcels` and :class:`.ReHoSpheres` to restrict the ReHo computation for both ``using="junifer"`` and ``using="afni"``, instead of an MNI152 brain mask resampled to the input data (wrong for native space) only for ``using="junifer"``. Without ``masks``, both use the voxels with non-zero time series, so that both implementations give the same results by `Fede Raimondo`_
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Vectorize ReHo computation with ``using="junifer"``, making it about 5 times faster by `Fede Raimondo`_
|
|
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
|
|
|
18
18
|
commit_id: str | None
|
|
19
19
|
__commit_id__: str | None
|
|
20
20
|
|
|
21
|
-
__version__ = version = '0.0.8.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 0, 8, '
|
|
21
|
+
__version__ = version = '0.0.8.dev257'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 0, 8, 'dev257')
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
24
|
+
__commit_id__ = commit_id = 'g19ea0a56d'
|
|
@@ -55,6 +55,7 @@ class AFNIReHo(metaclass=Singleton):
|
|
|
55
55
|
self,
|
|
56
56
|
input_path: Path,
|
|
57
57
|
nneigh: int = 27,
|
|
58
|
+
mask_path: Path | None = None,
|
|
58
59
|
neigh_rad: float | None = None,
|
|
59
60
|
neigh_x: float | None = None,
|
|
60
61
|
neigh_y: float | None = None,
|
|
@@ -78,6 +79,9 @@ class AFNIReHo(metaclass=Singleton):
|
|
|
78
79
|
* 27 : for face-, edge-, and node-wise neighbors
|
|
79
80
|
|
|
80
81
|
(default 27).
|
|
82
|
+
mask_path : pathlib.Path or None, optional
|
|
83
|
+
Path to the mask to restrict the computation to, passed to
|
|
84
|
+
``3dReHo`` as ``-mask``. If None, no mask is used (default None).
|
|
81
85
|
neigh_rad : positive float, optional
|
|
82
86
|
The radius of a desired neighbourhood (default None).
|
|
83
87
|
neigh_x : positive float, optional
|
|
@@ -143,6 +147,8 @@ class AFNIReHo(metaclass=Singleton):
|
|
|
143
147
|
f"-prefix {reho_out_path_prefix.resolve()}",
|
|
144
148
|
f"-inset {input_path.resolve()}",
|
|
145
149
|
]
|
|
150
|
+
if mask_path is not None:
|
|
151
|
+
reho_cmd.append(f"-mask {mask_path.resolve()}")
|
|
146
152
|
# Check ellipsoidal / cuboidal volume arguments
|
|
147
153
|
if neigh_rad:
|
|
148
154
|
reho_cmd.append(f"-neigh_RAD {neigh_rad}")
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
"""Provide class for computing regional homogeneity (ReHo) using junifer."""
|
|
2
|
+
|
|
3
|
+
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
|
4
|
+
# License: AGPL
|
|
5
|
+
|
|
6
|
+
from functools import lru_cache
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import (
|
|
9
|
+
TYPE_CHECKING,
|
|
10
|
+
ClassVar,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
import nibabel as nib
|
|
14
|
+
import numpy as np
|
|
15
|
+
import scipy as sp
|
|
16
|
+
from nilearn import image as nimg
|
|
17
|
+
|
|
18
|
+
from ...pipeline import WorkDirManager
|
|
19
|
+
from ...typing import Dependencies
|
|
20
|
+
from ...utils import raise_error
|
|
21
|
+
from ...utils.singleton import Singleton
|
|
22
|
+
from ..base import logger
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if TYPE_CHECKING:
|
|
26
|
+
from nibabel.nifti1 import Nifti1Image
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
__all__ = ["JuniferReHo"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class JuniferReHo(metaclass=Singleton):
|
|
33
|
+
"""Class for computing ReHo using junifer.
|
|
34
|
+
|
|
35
|
+
It's designed as a singleton with caching for efficient computation.
|
|
36
|
+
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
_DEPENDENCIES: ClassVar[Dependencies] = {"numpy", "nilearn", "scipy"}
|
|
40
|
+
|
|
41
|
+
def __del__(self) -> None:
|
|
42
|
+
"""Terminate the class."""
|
|
43
|
+
# Clear the computation cache
|
|
44
|
+
logger.debug("Clearing cache for ReHo computation via junifer")
|
|
45
|
+
self.compute.cache_clear()
|
|
46
|
+
|
|
47
|
+
@lru_cache(maxsize=None, typed=True)
|
|
48
|
+
def compute(
|
|
49
|
+
self,
|
|
50
|
+
input_path: Path,
|
|
51
|
+
nneigh: int = 27,
|
|
52
|
+
mask_path: Path | None = None,
|
|
53
|
+
) -> tuple["Nifti1Image", Path]:
|
|
54
|
+
"""Compute ReHo map.
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
input_path : pathlib.Path
|
|
59
|
+
Path to the input data.
|
|
60
|
+
nneigh : {7, 19, 27, 125}, optional
|
|
61
|
+
Number of voxels in the neighbourhood, inclusive. Can be:
|
|
62
|
+
|
|
63
|
+
* 7 : for facewise neighbours only
|
|
64
|
+
* 19 : for face- and edge-wise neighbours
|
|
65
|
+
* 27 : for face-, edge-, and node-wise neighbors
|
|
66
|
+
* 125 : for 5x5 cuboidal volume
|
|
67
|
+
|
|
68
|
+
(default 27).
|
|
69
|
+
mask_path : pathlib.Path or None, optional
|
|
70
|
+
Path to the mask to restrict the computation to. Voxels outside
|
|
71
|
+
the mask are excluded from every neighbourhood and set to 0 in
|
|
72
|
+
the output. If None, voxels with non-zero time series are used,
|
|
73
|
+
same as AFNI's ``3dReHo`` without ``-mask`` (default None).
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
Niimg-like object
|
|
78
|
+
The ReHo map as NIfTI.
|
|
79
|
+
pathlib.Path
|
|
80
|
+
The path to the ReHo map as NIfTI.
|
|
81
|
+
|
|
82
|
+
Raises
|
|
83
|
+
------
|
|
84
|
+
ValueError
|
|
85
|
+
If ``nneigh`` is invalid.
|
|
86
|
+
|
|
87
|
+
"""
|
|
88
|
+
valid_nneigh = (7, 19, 27, 125)
|
|
89
|
+
if nneigh not in valid_nneigh:
|
|
90
|
+
raise_error(
|
|
91
|
+
f"Invalid value for `nneigh`, should be one of: {valid_nneigh}"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
logger.debug("Creating cache for ReHo computation via junifer")
|
|
95
|
+
|
|
96
|
+
# Get scan data
|
|
97
|
+
niimg = nib.load(input_path)
|
|
98
|
+
niimg_data = niimg.get_fdata(caching="unchanged")
|
|
99
|
+
# Get scan dimensions
|
|
100
|
+
n_x, n_y, n_z, n_t = niimg_data.shape
|
|
101
|
+
|
|
102
|
+
# Get mask as bool array
|
|
103
|
+
if mask_path is not None:
|
|
104
|
+
logical_mask = np.squeeze(nib.load(mask_path).get_fdata()) != 0
|
|
105
|
+
else:
|
|
106
|
+
# Same as AFNI's 3dReHo without -mask
|
|
107
|
+
logical_mask = np.sum(np.abs(niimg_data), axis=-1) > 1e-6
|
|
108
|
+
|
|
109
|
+
# Get rank of every voxel across time series and tied rank correction
|
|
110
|
+
# for every voxel
|
|
111
|
+
ranks_niimg_data, tied_rank_corrections = _rank_with_ties(niimg_data)
|
|
112
|
+
del niimg_data
|
|
113
|
+
|
|
114
|
+
# Create mask cluster and set start and end indices
|
|
115
|
+
if nneigh in (7, 19, 27):
|
|
116
|
+
mask_cluster = np.ones((3, 3, 3))
|
|
117
|
+
|
|
118
|
+
if nneigh == 7:
|
|
119
|
+
mask_cluster[0, 0, 0] = 0
|
|
120
|
+
mask_cluster[0, 1, 0] = 0
|
|
121
|
+
mask_cluster[0, 2, 0] = 0
|
|
122
|
+
mask_cluster[0, 0, 1] = 0
|
|
123
|
+
mask_cluster[0, 2, 1] = 0
|
|
124
|
+
mask_cluster[0, 0, 2] = 0
|
|
125
|
+
mask_cluster[0, 1, 2] = 0
|
|
126
|
+
mask_cluster[0, 2, 2] = 0
|
|
127
|
+
mask_cluster[1, 0, 0] = 0
|
|
128
|
+
mask_cluster[1, 2, 0] = 0
|
|
129
|
+
mask_cluster[1, 0, 2] = 0
|
|
130
|
+
mask_cluster[1, 2, 2] = 0
|
|
131
|
+
mask_cluster[2, 0, 0] = 0
|
|
132
|
+
mask_cluster[2, 1, 0] = 0
|
|
133
|
+
mask_cluster[2, 2, 0] = 0
|
|
134
|
+
mask_cluster[2, 0, 1] = 0
|
|
135
|
+
mask_cluster[2, 2, 1] = 0
|
|
136
|
+
mask_cluster[2, 0, 2] = 0
|
|
137
|
+
mask_cluster[2, 1, 2] = 0
|
|
138
|
+
mask_cluster[2, 2, 2] = 0
|
|
139
|
+
|
|
140
|
+
elif nneigh == 19:
|
|
141
|
+
mask_cluster[0, 0, 0] = 0
|
|
142
|
+
mask_cluster[0, 2, 0] = 0
|
|
143
|
+
mask_cluster[2, 0, 0] = 0
|
|
144
|
+
mask_cluster[2, 2, 0] = 0
|
|
145
|
+
mask_cluster[0, 0, 2] = 0
|
|
146
|
+
mask_cluster[0, 2, 2] = 0
|
|
147
|
+
mask_cluster[2, 0, 2] = 0
|
|
148
|
+
mask_cluster[2, 2, 2] = 0
|
|
149
|
+
|
|
150
|
+
elif nneigh == 125:
|
|
151
|
+
mask_cluster = np.ones((5, 5, 5))
|
|
152
|
+
|
|
153
|
+
# Exclude voxels outside the mask from every neighbourhood
|
|
154
|
+
ranks_niimg_data[~logical_mask] = 0
|
|
155
|
+
tied_rank_corrections[~logical_mask] = 0
|
|
156
|
+
# Sum over the neighbourhood of every voxel: number of voxels in the
|
|
157
|
+
# mask, ranks per timepoint and tied rank corrections; at the edges
|
|
158
|
+
# of the volume, only the neighbours within it are used
|
|
159
|
+
n_neighbours = sp.ndimage.correlate(
|
|
160
|
+
logical_mask.astype(np.float64),
|
|
161
|
+
mask_cluster,
|
|
162
|
+
mode="constant",
|
|
163
|
+
)
|
|
164
|
+
neighbourhood_rank_sums = sp.ndimage.correlate(
|
|
165
|
+
ranks_niimg_data,
|
|
166
|
+
mask_cluster[..., np.newaxis],
|
|
167
|
+
mode="constant",
|
|
168
|
+
)
|
|
169
|
+
del ranks_niimg_data
|
|
170
|
+
neighbourhood_tied_rank_corrections = sp.ndimage.correlate(
|
|
171
|
+
tied_rank_corrections,
|
|
172
|
+
mask_cluster,
|
|
173
|
+
mode="constant",
|
|
174
|
+
)
|
|
175
|
+
# Calculate Kendall's coefficient of concordance (KCC)
|
|
176
|
+
np.square(neighbourhood_rank_sums, out=neighbourhood_rank_sums)
|
|
177
|
+
numerator = (12 * np.sum(neighbourhood_rank_sums, axis=-1)) - (
|
|
178
|
+
3 * n_neighbours**2 * n_t * (n_t + 1) ** 2
|
|
179
|
+
)
|
|
180
|
+
del neighbourhood_rank_sums
|
|
181
|
+
denominator = (n_neighbours**2 * n_t * (n_t**2 - 1)) - (
|
|
182
|
+
n_neighbours * neighbourhood_tied_rank_corrections
|
|
183
|
+
)
|
|
184
|
+
# If all the time series in the neighbourhood are fully tied, the
|
|
185
|
+
# denominator is 0 and KCC is set to 0, same as AFNI's 3dReHo
|
|
186
|
+
with np.errstate(divide="ignore", invalid="ignore"):
|
|
187
|
+
kcc = np.where(denominator == 0, 0.0, numerator / denominator)
|
|
188
|
+
|
|
189
|
+
# Initialize 3D array to store reho map; voxels outside the mask stay
|
|
190
|
+
# at 0, same as AFNI's 3dReHo
|
|
191
|
+
reho_map = np.zeros((n_x, n_y, n_z), dtype=np.float32)
|
|
192
|
+
reho_map[logical_mask] = kcc[logical_mask]
|
|
193
|
+
|
|
194
|
+
# Create new image like target image
|
|
195
|
+
output_data = nimg.new_img_like(
|
|
196
|
+
ref_niimg=niimg,
|
|
197
|
+
data=reho_map,
|
|
198
|
+
copy_header=False,
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
# Create element-scoped tempdir so that the ReHo map is
|
|
202
|
+
# available later as nibabel stores file path reference for
|
|
203
|
+
# loading on computation
|
|
204
|
+
element_tempdir = WorkDirManager().get_element_tempdir(
|
|
205
|
+
prefix="junifer_reho"
|
|
206
|
+
)
|
|
207
|
+
output_path = element_tempdir / "output.nii.gz"
|
|
208
|
+
# Save computed data to file
|
|
209
|
+
nib.save(output_data, output_path)
|
|
210
|
+
|
|
211
|
+
return output_data, output_path # type: ignore
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def _rank_with_ties(data: np.ndarray) -> tuple[np.ndarray, np.ndarray]:
|
|
215
|
+
"""Rank data along the last axis and compute tied rank corrections.
|
|
216
|
+
|
|
217
|
+
Equivalent to ``scipy.stats.rankdata(data, axis=-1)`` (tied values get
|
|
218
|
+
their average rank and NaN propagates to the whole time series), but
|
|
219
|
+
sorting only once.
|
|
220
|
+
|
|
221
|
+
Parameters
|
|
222
|
+
----------
|
|
223
|
+
data : numpy.ndarray
|
|
224
|
+
The data to rank along the last axis.
|
|
225
|
+
|
|
226
|
+
Returns
|
|
227
|
+
-------
|
|
228
|
+
numpy.ndarray
|
|
229
|
+
The ranks of ``data`` along the last axis.
|
|
230
|
+
numpy.ndarray
|
|
231
|
+
The tied rank correction, the sum of ``t^3 - t`` over the groups of
|
|
232
|
+
``t`` tied values, for every element along the last axis.
|
|
233
|
+
|
|
234
|
+
"""
|
|
235
|
+
n = data.shape[-1]
|
|
236
|
+
sort_idx = np.argsort(data, axis=-1, kind="stable")
|
|
237
|
+
sorted_data = np.take_along_axis(data, sort_idx, axis=-1)
|
|
238
|
+
positions = np.arange(1, n + 1)
|
|
239
|
+
# Mark the first and last sample of every tie group in sorted order
|
|
240
|
+
is_first = np.ones(data.shape, dtype=bool)
|
|
241
|
+
is_first[..., 1:] = sorted_data[..., 1:] != sorted_data[..., :-1]
|
|
242
|
+
del sorted_data
|
|
243
|
+
is_last = np.ones(data.shape, dtype=bool)
|
|
244
|
+
is_last[..., :-1] = is_first[..., 1:]
|
|
245
|
+
# Min and max rank of the tie group of every sample in sorted order
|
|
246
|
+
min_ranks = np.maximum.accumulate(
|
|
247
|
+
np.where(is_first, positions, 0), axis=-1
|
|
248
|
+
)
|
|
249
|
+
del is_first
|
|
250
|
+
max_ranks = np.flip(
|
|
251
|
+
np.minimum.accumulate(
|
|
252
|
+
np.flip(np.where(is_last, positions, n + 1), axis=-1), axis=-1
|
|
253
|
+
),
|
|
254
|
+
axis=-1,
|
|
255
|
+
)
|
|
256
|
+
del is_last
|
|
257
|
+
# Every sample belongs to a tie group of size t = max - min + 1, and
|
|
258
|
+
# summing t^2 - 1 over the samples is the same as summing t^3 - t over
|
|
259
|
+
# the tie groups
|
|
260
|
+
tie_sizes = max_ranks - min_ranks + 1
|
|
261
|
+
tied_rank_corrections = np.sum(tie_sizes**2 - 1, axis=-1).astype(
|
|
262
|
+
np.float64
|
|
263
|
+
)
|
|
264
|
+
del tie_sizes
|
|
265
|
+
# Tied values get their average rank; put back in the original order
|
|
266
|
+
ranks = np.empty(data.shape, dtype=np.float64)
|
|
267
|
+
np.put_along_axis(ranks, sort_idx, (min_ranks + max_ranks) / 2, axis=-1)
|
|
268
|
+
# Propagate NaN to the whole time series, same as scipy.stats.rankdata
|
|
269
|
+
has_nan = np.isnan(data).any(axis=-1)
|
|
270
|
+
ranks[has_nan] = np.nan
|
|
271
|
+
tied_rank_corrections[has_nan] = np.nan
|
|
272
|
+
return ranks, tied_rank_corrections
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
|
4
4
|
# License: AGPL
|
|
5
5
|
|
|
6
|
+
import hashlib
|
|
6
7
|
from enum import Enum
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from typing import (
|
|
@@ -12,9 +13,13 @@ from typing import (
|
|
|
12
13
|
ClassVar,
|
|
13
14
|
)
|
|
14
15
|
|
|
16
|
+
import nibabel as nib
|
|
17
|
+
import numpy as np
|
|
15
18
|
from pydantic import BeforeValidator
|
|
16
19
|
|
|
20
|
+
from ...data import get_data
|
|
17
21
|
from ...datagrabber import DataType
|
|
22
|
+
from ...pipeline import WorkDirManager
|
|
18
23
|
from ...storage import StorageType
|
|
19
24
|
from ...typing import ConditionalDependencies, MarkerInOutMappings
|
|
20
25
|
from ...utils import ensure_list_or_none
|
|
@@ -98,8 +103,10 @@ class ReHoBase(BaseMarker):
|
|
|
98
103
|
The parameters to pass to the aggregation function.
|
|
99
104
|
See :func:`.get_aggfunc_by_name` for options (default None).
|
|
100
105
|
masks : str, dict, list of them or None, optional
|
|
101
|
-
The specification of the masks to apply
|
|
102
|
-
|
|
106
|
+
The specification of the masks to apply. The ReHo computation is
|
|
107
|
+
restricted to the voxels in the mask, and the mask is also applied
|
|
108
|
+
to regions before extracting signals. Check
|
|
109
|
+
:ref:`Using Masks <using_masks>` for more details.
|
|
103
110
|
If None, will not apply any mask (default None).
|
|
104
111
|
name : str or None, optional
|
|
105
112
|
The name of the marker.
|
|
@@ -136,6 +143,7 @@ class ReHoBase(BaseMarker):
|
|
|
136
143
|
def _compute(
|
|
137
144
|
self,
|
|
138
145
|
input_data: dict[str, Any],
|
|
146
|
+
extra_input: dict[str, Any] | None = None,
|
|
139
147
|
**reho_params: Any,
|
|
140
148
|
) -> tuple["Nifti1Image", Path]:
|
|
141
149
|
"""Compute voxel-wise ReHo.
|
|
@@ -151,6 +159,9 @@ class ReHoBase(BaseMarker):
|
|
|
151
159
|
----------
|
|
152
160
|
input_data : dict
|
|
153
161
|
The BOLD data as dictionary.
|
|
162
|
+
extra_input : dict, optional
|
|
163
|
+
The other fields in the pipeline data object. Used to compute
|
|
164
|
+
the mask in the space of ``input_data`` (default None).
|
|
154
165
|
**reho_params : dict
|
|
155
166
|
Extra keyword arguments for ReHo.
|
|
156
167
|
|
|
@@ -178,9 +189,22 @@ class ReHoBase(BaseMarker):
|
|
|
178
189
|
estimator = AFNIReHo()
|
|
179
190
|
elif self.using == "junifer":
|
|
180
191
|
estimator = JuniferReHo()
|
|
192
|
+
# Get mask in the space of the input data
|
|
193
|
+
mask_path = None
|
|
194
|
+
if self.masks is not None:
|
|
195
|
+
logger.debug(f"Masking with {self.masks}")
|
|
196
|
+
mask_path = _save_mask(
|
|
197
|
+
get_data(
|
|
198
|
+
kind="mask",
|
|
199
|
+
names=self.masks,
|
|
200
|
+
target_data=input_data,
|
|
201
|
+
extra_input=extra_input,
|
|
202
|
+
)
|
|
203
|
+
)
|
|
181
204
|
# Compute reho
|
|
182
205
|
reho_map, reho_map_path = estimator.compute( # type: ignore
|
|
183
206
|
input_path=input_data["path"],
|
|
207
|
+
mask_path=mask_path,
|
|
184
208
|
**reho_params,
|
|
185
209
|
)
|
|
186
210
|
|
|
@@ -193,3 +217,38 @@ class ReHoBase(BaseMarker):
|
|
|
193
217
|
return reho_map, input_data["path"]
|
|
194
218
|
|
|
195
219
|
return reho_map, reho_map_path
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _save_mask(mask_img: "Nifti1Image") -> Path:
|
|
223
|
+
"""Save mask to the working directory, named by its content.
|
|
224
|
+
|
|
225
|
+
The same mask always gets the same path, so that the cached ReHo
|
|
226
|
+
computation can be reused by markers using the same mask.
|
|
227
|
+
|
|
228
|
+
Parameters
|
|
229
|
+
----------
|
|
230
|
+
mask_img : Niimg-like object
|
|
231
|
+
The mask to save.
|
|
232
|
+
|
|
233
|
+
Returns
|
|
234
|
+
-------
|
|
235
|
+
pathlib.Path
|
|
236
|
+
The path to the saved mask.
|
|
237
|
+
|
|
238
|
+
"""
|
|
239
|
+
mask_data = np.squeeze(np.asarray(mask_img.dataobj)) != 0
|
|
240
|
+
digest = hashlib.sha256()
|
|
241
|
+
digest.update(str(mask_data.shape).encode())
|
|
242
|
+
digest.update(np.packbits(mask_data).tobytes())
|
|
243
|
+
digest.update(mask_img.affine.tobytes())
|
|
244
|
+
mask_path = (
|
|
245
|
+
WorkDirManager().workdir / f"reho_mask_{digest.hexdigest()[:16]}.nii"
|
|
246
|
+
)
|
|
247
|
+
if not mask_path.exists():
|
|
248
|
+
nib.save(
|
|
249
|
+
nib.Nifti1Image(
|
|
250
|
+
mask_data.astype(np.uint8), mask_img.affine, mask_img.header
|
|
251
|
+
),
|
|
252
|
+
mask_path,
|
|
253
|
+
)
|
|
254
|
+
return mask_path
|
|
@@ -116,10 +116,12 @@ class ReHoMaps(ReHoBase):
|
|
|
116
116
|
# transformation to native space.
|
|
117
117
|
if self.reho_params is not None:
|
|
118
118
|
reho_map, reho_file_path = self._compute(
|
|
119
|
-
input_data=input, **self.reho_params
|
|
119
|
+
input_data=input, extra_input=extra_input, **self.reho_params
|
|
120
120
|
)
|
|
121
121
|
else:
|
|
122
|
-
reho_map, reho_file_path = self._compute(
|
|
122
|
+
reho_map, reho_file_path = self._compute(
|
|
123
|
+
input_data=input, extra_input=extra_input
|
|
124
|
+
)
|
|
123
125
|
|
|
124
126
|
# Perform aggregation on reho map
|
|
125
127
|
aggregation_input = dict(input.items())
|
|
@@ -125,10 +125,12 @@ class ReHoParcels(ReHoBase):
|
|
|
125
125
|
# transformation to native space.
|
|
126
126
|
if self.reho_params is not None:
|
|
127
127
|
reho_map, reho_file_path = self._compute(
|
|
128
|
-
input_data=input, **self.reho_params
|
|
128
|
+
input_data=input, extra_input=extra_input, **self.reho_params
|
|
129
129
|
)
|
|
130
130
|
else:
|
|
131
|
-
reho_map, reho_file_path = self._compute(
|
|
131
|
+
reho_map, reho_file_path = self._compute(
|
|
132
|
+
input_data=input, extra_input=extra_input
|
|
133
|
+
)
|
|
132
134
|
|
|
133
135
|
# Perform aggregation on reho map
|
|
134
136
|
aggregation_input = dict(input.items())
|
|
@@ -134,10 +134,12 @@ class ReHoSpheres(ReHoBase):
|
|
|
134
134
|
# transformation to native space.
|
|
135
135
|
if self.reho_params is not None:
|
|
136
136
|
reho_map, reho_file_path = self._compute(
|
|
137
|
-
input_data=input, **self.reho_params
|
|
137
|
+
input_data=input, extra_input=extra_input, **self.reho_params
|
|
138
138
|
)
|
|
139
139
|
else:
|
|
140
|
-
reho_map, reho_file_path = self._compute(
|
|
140
|
+
reho_map, reho_file_path = self._compute(
|
|
141
|
+
input_data=input, extra_input=extra_input
|
|
142
|
+
)
|
|
141
143
|
|
|
142
144
|
# Perform aggregation on reho map
|
|
143
145
|
aggregation_input = dict(input.items())
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
"""Provide tests for ReHo computation using junifer."""
|
|
2
|
+
|
|
3
|
+
# Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
|
|
4
|
+
# License: AGPL
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
import nibabel as nib
|
|
9
|
+
import numpy as np
|
|
10
|
+
import pytest
|
|
11
|
+
import scipy as sp
|
|
12
|
+
from numpy.testing import assert_allclose, assert_array_equal
|
|
13
|
+
|
|
14
|
+
from junifer.markers.reho._afni_reho import AFNIReHo
|
|
15
|
+
from junifer.markers.reho._junifer_reho import JuniferReHo, _rank_with_ties
|
|
16
|
+
from junifer.pipeline import WorkDirManager
|
|
17
|
+
from junifer.pipeline.utils import _check_afni
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _tied_rank_corrections(ranks: np.ndarray) -> np.ndarray:
|
|
21
|
+
"""Compute tied rank corrections one time series at a time."""
|
|
22
|
+
out = np.zeros(ranks.shape[:-1])
|
|
23
|
+
for idx in np.ndindex(ranks.shape[:-1]):
|
|
24
|
+
_, tie_count = np.unique(ranks[idx], return_counts=True)
|
|
25
|
+
out[idx] = np.sum(tie_count**3 - tie_count)
|
|
26
|
+
return out
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@pytest.mark.parametrize(
|
|
30
|
+
"shape, scale",
|
|
31
|
+
[
|
|
32
|
+
((4, 3, 2, 50), 3), # many ties
|
|
33
|
+
((3, 3, 3, 30), 100), # few ties
|
|
34
|
+
((2, 2, 2, 10), 0), # all values tied
|
|
35
|
+
],
|
|
36
|
+
)
|
|
37
|
+
def test_rank_with_ties(shape: tuple[int, ...], scale: float) -> None:
|
|
38
|
+
"""Test ranking with ties against scipy.
|
|
39
|
+
|
|
40
|
+
Parameters
|
|
41
|
+
----------
|
|
42
|
+
shape : tuple of int
|
|
43
|
+
The shape of the data.
|
|
44
|
+
scale : float
|
|
45
|
+
The scale of the data before rounding.
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
data = np.round(np.random.default_rng(0).normal(size=shape) * scale)
|
|
49
|
+
ranks, tied_rank_corrections = _rank_with_ties(data)
|
|
50
|
+
expected_ranks = sp.stats.rankdata(data, axis=-1)
|
|
51
|
+
assert_array_equal(ranks, expected_ranks)
|
|
52
|
+
assert_array_equal(
|
|
53
|
+
tied_rank_corrections, _tied_rank_corrections(expected_ranks)
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_rank_with_ties_nan() -> None:
|
|
58
|
+
"""Test NaN propagates to the whole time series."""
|
|
59
|
+
data = np.array([[1.0, np.nan, 2.0], [1.0, 3.0, 2.0]])
|
|
60
|
+
ranks, tied_rank_corrections = _rank_with_ties(data)
|
|
61
|
+
assert np.isnan(ranks[0]).all()
|
|
62
|
+
assert np.isnan(tied_rank_corrections[0])
|
|
63
|
+
assert_array_equal(ranks[1], [1, 3, 2])
|
|
64
|
+
assert tied_rank_corrections[1] == 0
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _save(data: np.ndarray, path: Path) -> Path:
|
|
68
|
+
"""Save data as NIfTI."""
|
|
69
|
+
nib.save(nib.Nifti1Image(data, np.eye(4)), path)
|
|
70
|
+
return path
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_JuniferReHo_nan(tmp_path: Path) -> None:
|
|
74
|
+
"""Test NaN time series do not give valid ReHo values.
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
tmp_path : pathlib.Path
|
|
79
|
+
The path to the test directory.
|
|
80
|
+
|
|
81
|
+
"""
|
|
82
|
+
WorkDirManager().workdir = tmp_path
|
|
83
|
+
data = np.random.default_rng(0).normal(size=(7, 7, 7, 20))
|
|
84
|
+
data[3, 3, 3, 5] = np.nan
|
|
85
|
+
bold_path = _save(data.astype(np.float32), tmp_path / "bold_nan.nii")
|
|
86
|
+
mask_path = _save(np.ones((7, 7, 7), dtype=np.uint8), tmp_path / "m.nii")
|
|
87
|
+
|
|
88
|
+
# With a mask including the NaN voxel, every neighbourhood with it is NaN
|
|
89
|
+
reho = JuniferReHo().compute(bold_path, mask_path=mask_path)[0]
|
|
90
|
+
reho = reho.get_fdata()
|
|
91
|
+
assert np.isnan(reho[2:5, 2:5, 2:5]).all()
|
|
92
|
+
reho[2:5, 2:5, 2:5] = 0
|
|
93
|
+
assert np.isfinite(reho).all()
|
|
94
|
+
|
|
95
|
+
# Without mask, the NaN voxel is excluded as AFNI's 3dReHo does
|
|
96
|
+
reho = JuniferReHo().compute(bold_path)[0].get_fdata()
|
|
97
|
+
assert np.isfinite(reho).all()
|
|
98
|
+
assert reho[3, 3, 3] == 0
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_JuniferReHo_mask(tmp_path: Path) -> None:
|
|
102
|
+
"""Test ReHo is restricted to the mask.
|
|
103
|
+
|
|
104
|
+
Parameters
|
|
105
|
+
----------
|
|
106
|
+
tmp_path : pathlib.Path
|
|
107
|
+
The path to the test directory.
|
|
108
|
+
|
|
109
|
+
"""
|
|
110
|
+
WorkDirManager().workdir = tmp_path
|
|
111
|
+
data = np.random.default_rng(0).normal(size=(7, 7, 7, 20))
|
|
112
|
+
bold_path = _save(data.astype(np.float32), tmp_path / "bold.nii")
|
|
113
|
+
mask = np.ones((7, 7, 7), dtype=np.uint8)
|
|
114
|
+
mask[:3] = 0
|
|
115
|
+
mask_path = _save(mask, tmp_path / "mask.nii")
|
|
116
|
+
|
|
117
|
+
masked = JuniferReHo().compute(bold_path, mask_path=mask_path)[0]
|
|
118
|
+
masked = masked.get_fdata()
|
|
119
|
+
unmasked = JuniferReHo().compute(bold_path)[0].get_fdata()
|
|
120
|
+
# Outside the mask is 0
|
|
121
|
+
assert (masked[:3] == 0).all()
|
|
122
|
+
# Next to the mask boundary, neighbours outside the mask are excluded
|
|
123
|
+
assert not np.allclose(masked[3, 1:-1, 1:-1], unmasked[3, 1:-1, 1:-1])
|
|
124
|
+
# Far from the mask boundary, nothing changes
|
|
125
|
+
assert_array_equal(masked[4:-1, 1:-1, 1:-1], unmasked[4:-1, 1:-1, 1:-1])
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@pytest.mark.external
|
|
129
|
+
@pytest.mark.skipif(
|
|
130
|
+
_check_afni() is False, reason="requires AFNI to be in PATH"
|
|
131
|
+
)
|
|
132
|
+
@pytest.mark.parametrize("nneigh", [7, 19, 27])
|
|
133
|
+
@pytest.mark.parametrize("use_mask", [False, True])
|
|
134
|
+
def test_JuniferReHo_vs_AFNI(
|
|
135
|
+
tmp_path: Path, nneigh: int, use_mask: bool
|
|
136
|
+
) -> None:
|
|
137
|
+
"""Test junifer and AFNI give the same ReHo map.
|
|
138
|
+
|
|
139
|
+
The data covers the edges of the volume, fully tied neighbourhoods (the
|
|
140
|
+
denominator of KCC is 0), voxels with all-zero time series and ties.
|
|
141
|
+
|
|
142
|
+
Parameters
|
|
143
|
+
----------
|
|
144
|
+
tmp_path : pathlib.Path
|
|
145
|
+
The path to the test directory.
|
|
146
|
+
nneigh : int
|
|
147
|
+
The number of voxels in the neighbourhood.
|
|
148
|
+
use_mask : bool
|
|
149
|
+
Whether to use a mask.
|
|
150
|
+
|
|
151
|
+
"""
|
|
152
|
+
WorkDirManager().workdir = tmp_path
|
|
153
|
+
data = np.round(
|
|
154
|
+
np.random.default_rng(0).normal(size=(9, 8, 7, 25)) * 3
|
|
155
|
+
).astype(np.float32)
|
|
156
|
+
# Constant time series: fully tied neighbourhoods
|
|
157
|
+
data[:4, :4, :4] = 5
|
|
158
|
+
# All-zero time series: outside AFNI's implicit mask
|
|
159
|
+
data[6:, 5:, 4:] = 0
|
|
160
|
+
bold_path = _save(data, tmp_path / "bold.nii")
|
|
161
|
+
mask_path = None
|
|
162
|
+
if use_mask:
|
|
163
|
+
mask = np.ones(data.shape[:3], dtype=np.uint8)
|
|
164
|
+
mask[:, :, 0] = 0
|
|
165
|
+
mask[4, 4, 3] = 0
|
|
166
|
+
mask_path = _save(mask, tmp_path / "mask.nii")
|
|
167
|
+
|
|
168
|
+
junifer_reho = JuniferReHo().compute(
|
|
169
|
+
bold_path, nneigh=nneigh, mask_path=mask_path
|
|
170
|
+
)[0]
|
|
171
|
+
afni_reho = AFNIReHo().compute(
|
|
172
|
+
bold_path, nneigh=nneigh, mask_path=mask_path
|
|
173
|
+
)[0]
|
|
174
|
+
assert_allclose(
|
|
175
|
+
junifer_reho.get_fdata(),
|
|
176
|
+
np.squeeze(afni_reho.get_fdata()),
|
|
177
|
+
atol=1e-6,
|
|
178
|
+
)
|