junifer 0.0.7.dev111__tar.gz → 0.0.7.dev121__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.7.dev111 → junifer-0.0.7.dev121}/PKG-INFO +1 -1
- junifer-0.0.7.dev121/docs/changes/newsfragments/452.doc +1 -0
- junifer-0.0.7.dev121/docs/changes/newsfragments/452.feature +1 -0
- junifer-0.0.7.dev121/docs/extending/data_dump_asset.rst +46 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/index.rst +1 -0
- junifer-0.0.7.dev121/docs/using/configuring.rst +65 -0
- junifer-0.0.7.dev121/docs/using/dumping.rst +18 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/index.rst +2 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/_version.py +2 -2
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/decorators.py +53 -1
- junifer-0.0.7.dev121/junifer/api/tests/test_decorators.py +78 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/__init__.pyi +10 -0
- junifer-0.0.7.dev121/junifer/pipeline/_data_object_dumper.py +347 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/marker_collection.py +41 -3
- junifer-0.0.7.dev121/junifer/pipeline/tests/test_data_object_dumper.py +225 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/__init__.pyi +2 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/_typing.py +2 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/PKG-INFO +1 -1
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/SOURCES.txt +7 -0
- junifer-0.0.7.dev111/junifer/api/tests/test_decorators.py +0 -32
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.dockerignore +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/dataset-request.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/documention-request.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/marker-request.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/dependabot.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/pull_request_template.md +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/ci-docs.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/ci.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docker-ci-publish.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docker-docs-publish.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docs-preview.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docs.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/lint.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/publish.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.gitignore +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.gitmodules +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.pre-commit-config.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/AUTHORS.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/Dockerfile-ci +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/Dockerfile-docs +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/LICENSE.md +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/README.md +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/codecov.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/conda-env.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/Makefile +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_static/css/custom.css +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_static/js/custom.js +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_templates/versions.html +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/api.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/cli.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/configs.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/data.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/datagrabbers.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/datareaders.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/index.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/markers.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/nilearn.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/onthefly.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/pipeline.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/preprocessing.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/stats.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/storage.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/testing.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/utils.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/builtin.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/contributors.inc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/.gitignore +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/333.enh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/429.change +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/429.enh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/432.feature +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/441.misc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/443.feature +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/444.bugfix +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/450.doc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/450.feature +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/451.doc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/451.feature +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/conf.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/contribution.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/coordinates.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/data_registries.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/data_types.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/datagrabber.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/dependencies.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/extension.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/marker.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/masks.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/parcellations.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/plugins.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/preprocessor.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/faq.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/help.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/images/junifer_logo.png +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/index.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/installation.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/links.inc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/maintaining.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/redirect.html +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/starting.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/data.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/datagrabber.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/datareader.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/index.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/marker.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/pipeline.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/preprocess.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/storage.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/codeless.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/masks.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/queueing.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/running.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/whats_new.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/README.rst +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/norun_hcpfc_pearson.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/norun_ukbvm_gmd.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_compute_parcel_mean.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_datagrabber_bids_datalad.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_ets_rss_marker.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_junifer_julearn.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_run_gmd_mean.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/gmd_mean.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/gmd_mean_htcondor.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/partly_cloudy_agg_mean_tian.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/ukb_gmd_mean.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/ignore_words.txt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/functions.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/gnu_parallel_local_adapter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/htcondor_adapter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/queue_context_adapter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/tests/test_htcondor_adapter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dAFNItoNIFTI +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dRSFC +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dReHo +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/afni +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/run_afni_docker.sh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/ResampleImage +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/antsApplyTransforms +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/antsApplyTransformsToPoints +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/run_ants_docker.sh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_binarize +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_mc +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_pretess +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mris_convert +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/run_freesurfer_docker.sh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/applywarp +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/flirt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/img2imgcoord +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/run_fsl_docker.sh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/std2imgcoord +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_conda.bash +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_conda.zsh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_venv.bash +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_venv.zsh +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/tests/test_functions.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/cli.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/parser.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/gmd_mean.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/gmd_mean_htcondor.yaml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_cli.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_cli_utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_parser.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/camcan_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ixi_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_camcan_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ucla.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ucla.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ukb_vbm.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/conftest.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/_dispatch.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_ants_coordinates_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_coordinates.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_fsl_coordinates_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/tests/test_coordinates.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_ants_mask_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_fsl_mask_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_masks.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/tests/test_masks.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_ants_parcellation_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_fsl_parcellation_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_parcellations.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/tests/test_parcellations.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/pipeline_data_registry_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/template_spaces.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_data_utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_dispatch.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_template_spaces.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/id1000.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/piop1.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/piop2.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_id1000.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_piop1.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_piop2.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/datalad_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/dmcc13_benchmark.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/datalad_hcp1200.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/hcp1200.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/tests/test_hcp1200.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/multiple.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern_datalad.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern_validation_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_datalad_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_dmcc13_benchmark.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_multiple.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern_datalad.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern_validation_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/default.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/tests/test_default_reader.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/_version.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/asymmetry.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/brainprint.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/surfaces.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/_config.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/_h5io.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/_version.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/chunked_array.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/chunked_list.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/junifer_connectivity_measure.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/junifer_nifti_spheres_masker.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/brainprint.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/complexity_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/hurst_exponent.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/multiscale_entropy_auc.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/perm_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/range_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/range_entropy_auc.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/sample_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_complexity_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_hurst_exponent.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_perm_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_range_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_range_entropy_auc.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_sample_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_weighted_perm_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/weighted_perm_entropy.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/ets_rss.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/_afni_falff.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/_junifer_falff.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/tests/test_falff_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/tests/test_falff_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/parcel_aggregation.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/_afni_reho.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/_junifer_reho.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/tests/test_reho_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/tests/test_reho_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/sphere_aggregation.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_brainprint.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_ets_rss.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_marker_utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_markers_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_parcel_aggregation.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_sphere_aggregation.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/_brainprint.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/read_transform.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/tests/test_read_transform.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/pipeline_component_registry.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/pipeline_step_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_marker_collection.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_pipeline_component_registry.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_pipeline_step_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_update_meta_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_workdir_manager.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/update_meta_mixin.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/workdir_manager.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/_temporal_filter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/_temporal_slicer.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/fmriprep_confound_remover.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_afni_smoothing.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_fsl_smoothing.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_nilearn_smoothing.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/smoothing.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/tests/test_smoothing.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_preprocess_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_temporal_filter.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_temporal_slicer.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/_ants_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/_fsl_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/space_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/tests/test_space_warper.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/stats.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/hdf5.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/pandas_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/sqlite.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_hdf5.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_pandas_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_sqlite.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_storage_base.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/datagrabbers.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/registry.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_partlycloudytesting_datagrabber.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_spmauditory_datagrabber.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_testing_registry.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/utils.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/tests/test_main.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/tests/test_stats.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/__init__.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/__init__.pyi +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/_config.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/_yaml.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/fs.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/helpers.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/logging.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/py.typed +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/singleton.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_config.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_fs.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_helpers.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_logging.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/dependency_links.txt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/entry_points.txt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/requires.txt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/top_level.txt +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/pyproject.toml +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/setup.cfg +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/setup.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomic1000_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomicpiop1_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomicpiop2_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_bids_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_bids_example_dataset_sessions.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_dmcc13_benchmark_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_hcp1200_example_dataset.py +0 -0
- {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tox.ini +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: junifer
|
3
|
-
Version: 0.0.7.
|
3
|
+
Version: 0.0.7.dev121
|
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
|
+
Add documentation on :class:`.ConfigManager`, dumping data object and extending data dump assets by `Synchon Mandal`_
|
@@ -0,0 +1 @@
|
|
1
|
+
Allow pipeline data object to be dumped by introducing :class:`.DataObjectDumper` and available dumping / loading assets to be extended by introducing :func:`.register_data_dump_asset` decorator by `Synchon Mandal`_
|
@@ -0,0 +1,46 @@
|
|
1
|
+
.. include:: ../links.inc
|
2
|
+
|
3
|
+
.. _adding_data_dump_assets:
|
4
|
+
|
5
|
+
Adding Data Dump Assets
|
6
|
+
=======================
|
7
|
+
|
8
|
+
``junifer`` supports dumping ``nibabel.Nifti1Image`` and ``pandas.DataFrame`` which should cover most fMRI use cases. But, in case you work with other modalities like EEG, you can register your own data dump asset.
|
9
|
+
|
10
|
+
How to add a data dump asset
|
11
|
+
----------------------------
|
12
|
+
|
13
|
+
This example shows how to create a data dump asset for ``mne.io.Raw``.
|
14
|
+
|
15
|
+
#. Check :ref:`extending junifer <extending_extension>` on how to create a
|
16
|
+
*junifer extension* if you have not done so.
|
17
|
+
#. Create the data registry in the *extension script* like so:
|
18
|
+
|
19
|
+
.. code-block:: python
|
20
|
+
|
21
|
+
from pathlib import Path
|
22
|
+
|
23
|
+
from junifer.api.decorators import register_data_dump_asset
|
24
|
+
from junifer.pipeline import BaseDataDumpAsset
|
25
|
+
|
26
|
+
import mne
|
27
|
+
|
28
|
+
@register_data_dump_asset([mne.io.Raw], [".fif", ".fif.gz"])
|
29
|
+
class RawAsset(BaseDataDumpAsset):
|
30
|
+
"""Class for ``mne.io.Raw`` dumper."""
|
31
|
+
|
32
|
+
def dump(self) -> None:
|
33
|
+
self.data.save(self.path_without_ext.with_suffix(".raw.fif.gz"))
|
34
|
+
|
35
|
+
@classmethod
|
36
|
+
def load(cls: "RawAsset", path: Path) -> mne.io.Raw:
|
37
|
+
return mne.io.Raw(path)
|
38
|
+
|
39
|
+
* :func:`.register_data_dump_asset` registers a class. The first argument is
|
40
|
+
a list of types that the class is responsible for saving and the second
|
41
|
+
argument is a list of file extensions that the class is responsible for
|
42
|
+
loading.
|
43
|
+
* Inheriting from ``junifer.pipeline.BaseDumpAsset`` takes care of the class
|
44
|
+
acting as a data dump asset.
|
45
|
+
* Method ``junifer.pipeline.BaseDumpAsset.dump`` and class method
|
46
|
+
``junifer.pipeline.BaseDumpAsset.load`` need to be implemented.
|
@@ -0,0 +1,65 @@
|
|
1
|
+
.. include:: ../links.inc
|
2
|
+
|
3
|
+
.. _configuring:
|
4
|
+
|
5
|
+
Configuring Pipeline Behaviour
|
6
|
+
==============================
|
7
|
+
|
8
|
+
It is also possible to configure some internal :ref:`pipeline <pipeline>` behaviour via :obj:`.ConfigManager`.
|
9
|
+
It can be done either via the command-line interface (CLI) or the application programming
|
10
|
+
interface (API).
|
11
|
+
|
12
|
+
To use via the CLI, one would do:
|
13
|
+
|
14
|
+
.. code-block:: bash
|
15
|
+
|
16
|
+
<CONFIG-KEY>=<CONFIG-VAL> junifer run ...
|
17
|
+
|
18
|
+
and via the API like so:
|
19
|
+
|
20
|
+
.. code-block:: python
|
21
|
+
|
22
|
+
from junifer.utils import config
|
23
|
+
|
24
|
+
# Add config
|
25
|
+
config.set(key="<config-key>", val=<config-val>)
|
26
|
+
|
27
|
+
# do feature extraction
|
28
|
+
...
|
29
|
+
|
30
|
+
# Remove config
|
31
|
+
config.delete("<config-key>")
|
32
|
+
|
33
|
+
.. _available_configurations:
|
34
|
+
|
35
|
+
Available Configurations
|
36
|
+
------------------------
|
37
|
+
|
38
|
+
.. list-table::
|
39
|
+
:widths: auto
|
40
|
+
:header-rows: 1
|
41
|
+
|
42
|
+
* - CLI Key
|
43
|
+
- API Key
|
44
|
+
- Value
|
45
|
+
- Description
|
46
|
+
* - ``JUNIFER_DATA_LOCATION``
|
47
|
+
- ``data.location``
|
48
|
+
- str
|
49
|
+
- Alternative location for ``junifer-data``
|
50
|
+
* - ``JUNIFER_DATAGRABBER_SKIPIDCHECK``
|
51
|
+
- ``datagrabber.skipidcheck``
|
52
|
+
- bool
|
53
|
+
- Skip DataLad-based DataGrabber's ID check
|
54
|
+
* - ``JUNIFER_DATAGRABBER_SKIPDIRTYCHECK``
|
55
|
+
- ``datagrabber.skipdirtycheck``
|
56
|
+
- bool
|
57
|
+
- Skip Git "dirty" check for a DataLad dataset clone of a DataGrabber
|
58
|
+
* - ``JUNIFER_PREPROCESSING_DUMP_LOCATION``
|
59
|
+
- ``preprocessing.dump.location``
|
60
|
+
- str
|
61
|
+
- Dump location of pre-processed data for debugging purposes
|
62
|
+
* - ``JUNIFER_PREPROCESSING_DUMP_GRANULARITY``
|
63
|
+
- ``preprocessing.dump.granularity``
|
64
|
+
- "full" or "final"
|
65
|
+
- Dump all pre-processing steps or just the final pre-processed data
|
@@ -0,0 +1,18 @@
|
|
1
|
+
.. include:: ../links.inc
|
2
|
+
|
3
|
+
.. _dumping:
|
4
|
+
|
5
|
+
Dumping Pipeline Data
|
6
|
+
=====================
|
7
|
+
|
8
|
+
It is usually not required to check the :ref:`data object <data_object>` but
|
9
|
+
for debugging purposes one can do that. Since, there is no direct way to interact
|
10
|
+
with it, ``junifer`` provides a way to dump the object before, in between and / or after
|
11
|
+
pre-processing. It is controlled by the ``JUNIFER_PREPROCESSING_DUMP_LOCATION`` and
|
12
|
+
``JUNIFER_PREPROCESSING_DUMP_GRANULARITY`` :ref:`configuration options <available_configurations>`.
|
13
|
+
|
14
|
+
``junifer`` dumps the ``"data"`` attribute of the data object as proper files in their respective formats,
|
15
|
+
for example, ``nibabel.Nifti1Image`` gets dumped as a ``.nii.gz`` file. As of now, ``junifer`` can dump
|
16
|
+
``nibabel.Nifti1Image`` and ``pandas.DataFrame`` (confound files) file formats. In case you
|
17
|
+
:ref:`add custom data types <adding_data_types>` which support different file formats, you can create and
|
18
|
+
register a :ref:`custom dumper <adding_data_dump_assets>`.
|
@@ -17,5 +17,5 @@ __version__: str
|
|
17
17
|
__version_tuple__: VERSION_TUPLE
|
18
18
|
version_tuple: VERSION_TUPLE
|
19
19
|
|
20
|
-
__version__ = version = '0.0.7.
|
21
|
-
__version_tuple__ = version_tuple = (0, 0, 7, '
|
20
|
+
__version__ = version = '0.0.7.dev121'
|
21
|
+
__version_tuple__ = version_tuple = (0, 0, 7, 'dev121')
|
@@ -6,8 +6,13 @@
|
|
6
6
|
# License: AGPL
|
7
7
|
|
8
8
|
from ..data import DataDispatcher
|
9
|
-
from ..pipeline import
|
9
|
+
from ..pipeline import (
|
10
|
+
AssetDumperDispatcher,
|
11
|
+
AssetLoaderDispatcher,
|
12
|
+
PipelineComponentRegistry,
|
13
|
+
)
|
10
14
|
from ..typing import (
|
15
|
+
DataDumpAssetLike,
|
11
16
|
DataGrabberLike,
|
12
17
|
DataRegistryLike,
|
13
18
|
MarkerLike,
|
@@ -17,6 +22,7 @@ from ..typing import (
|
|
17
22
|
|
18
23
|
|
19
24
|
__all__ = [
|
25
|
+
"register_data_dump_asset",
|
20
26
|
"register_data_registry",
|
21
27
|
"register_datagrabber",
|
22
28
|
"register_datareader",
|
@@ -184,3 +190,49 @@ def register_data_registry(name: str) -> DataRegistryLike:
|
|
184
190
|
return klass
|
185
191
|
|
186
192
|
return decorator
|
193
|
+
|
194
|
+
|
195
|
+
def register_data_dump_asset(
|
196
|
+
types: list[type], exts: list[str]
|
197
|
+
) -> DataDumpAssetLike:
|
198
|
+
"""Asset registration decorator.
|
199
|
+
|
200
|
+
Registers the data dump asset for ``types`` with ``exts``.
|
201
|
+
|
202
|
+
Parameters
|
203
|
+
----------
|
204
|
+
types : list of class
|
205
|
+
The classes to dump.
|
206
|
+
exts : list of str
|
207
|
+
The extensions to load.
|
208
|
+
|
209
|
+
Returns
|
210
|
+
-------
|
211
|
+
class
|
212
|
+
The unmodified input class.
|
213
|
+
|
214
|
+
"""
|
215
|
+
|
216
|
+
def decorator(klass: DataDumpAssetLike) -> DataDumpAssetLike:
|
217
|
+
"""Actual decorator.
|
218
|
+
|
219
|
+
Parameters
|
220
|
+
----------
|
221
|
+
klass : class
|
222
|
+
The class of the data dump asset to register.
|
223
|
+
|
224
|
+
Returns
|
225
|
+
-------
|
226
|
+
class
|
227
|
+
The unmodified input class.
|
228
|
+
|
229
|
+
"""
|
230
|
+
# Add asset dumper
|
231
|
+
for t in types:
|
232
|
+
AssetDumperDispatcher()[t] = klass
|
233
|
+
# Add asset loader
|
234
|
+
for e in exts:
|
235
|
+
AssetLoaderDispatcher()[e] = klass
|
236
|
+
return klass
|
237
|
+
|
238
|
+
return decorator
|
@@ -0,0 +1,78 @@
|
|
1
|
+
"""Provide tests for public decorators."""
|
2
|
+
|
3
|
+
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
4
|
+
# License: AGPL
|
5
|
+
|
6
|
+
import pickle
|
7
|
+
|
8
|
+
from junifer.api.decorators import (
|
9
|
+
register_data_dump_asset,
|
10
|
+
register_data_registry,
|
11
|
+
)
|
12
|
+
from junifer.data import BasePipelineDataRegistry, DataDispatcher
|
13
|
+
from junifer.pipeline import (
|
14
|
+
AssetDumperDispatcher,
|
15
|
+
AssetLoaderDispatcher,
|
16
|
+
BaseDataDumpAsset,
|
17
|
+
)
|
18
|
+
|
19
|
+
|
20
|
+
def test_register_data_registry() -> None:
|
21
|
+
"""Test data registry registration."""
|
22
|
+
|
23
|
+
@register_data_registry("dumb")
|
24
|
+
class DumDum(BasePipelineDataRegistry):
|
25
|
+
def __init__(self):
|
26
|
+
super().__init__()
|
27
|
+
|
28
|
+
def register(self):
|
29
|
+
pass
|
30
|
+
|
31
|
+
def deregister(self):
|
32
|
+
pass
|
33
|
+
|
34
|
+
def load(self):
|
35
|
+
pass
|
36
|
+
|
37
|
+
def get(self):
|
38
|
+
pass
|
39
|
+
|
40
|
+
assert "dumb" in DataDispatcher()
|
41
|
+
_ = DataDispatcher().pop("dumb")
|
42
|
+
assert "dumb" not in DataDispatcher()
|
43
|
+
|
44
|
+
|
45
|
+
def test_register_data_dump_asset() -> None:
|
46
|
+
"""Test data dump asset registration."""
|
47
|
+
|
48
|
+
class Int(int): ...
|
49
|
+
|
50
|
+
class Float(float): ...
|
51
|
+
|
52
|
+
@register_data_dump_asset([Int, Float], [".int", ".float"])
|
53
|
+
class DumAsset(BaseDataDumpAsset):
|
54
|
+
def dump(self):
|
55
|
+
suffix = ""
|
56
|
+
if isinstance(self.data, Int):
|
57
|
+
suffix = ".int"
|
58
|
+
else:
|
59
|
+
suffix = ".float"
|
60
|
+
pickle.dump(self.data, self.path_without_ext.with_suffix(suffix))
|
61
|
+
|
62
|
+
@classmethod
|
63
|
+
def load(cls, path):
|
64
|
+
return pickle.load(path)
|
65
|
+
|
66
|
+
assert Int in AssetDumperDispatcher()
|
67
|
+
assert Float in AssetDumperDispatcher()
|
68
|
+
_ = AssetDumperDispatcher().pop(Int)
|
69
|
+
_ = AssetDumperDispatcher().pop(Float)
|
70
|
+
assert Int not in AssetDumperDispatcher()
|
71
|
+
assert Float not in AssetDumperDispatcher()
|
72
|
+
|
73
|
+
assert ".int" in AssetLoaderDispatcher()
|
74
|
+
assert ".float" in AssetLoaderDispatcher()
|
75
|
+
_ = AssetLoaderDispatcher().pop(".int")
|
76
|
+
_ = AssetLoaderDispatcher().pop(".float")
|
77
|
+
assert ".int" not in AssetLoaderDispatcher()
|
78
|
+
assert ".float" not in AssetLoaderDispatcher()
|
@@ -1,4 +1,8 @@
|
|
1
1
|
__all__ = [
|
2
|
+
"AssetDumperDispatcher",
|
3
|
+
"AssetLoaderDispatcher",
|
4
|
+
"BaseDataDumpAsset",
|
5
|
+
"DataObjectDumper",
|
2
6
|
"PipelineComponentRegistry",
|
3
7
|
"PipelineStepMixin",
|
4
8
|
"UpdateMetaMixin",
|
@@ -6,6 +10,12 @@ __all__ = [
|
|
6
10
|
"MarkerCollection",
|
7
11
|
]
|
8
12
|
|
13
|
+
from ._data_object_dumper import (
|
14
|
+
AssetDumperDispatcher,
|
15
|
+
AssetLoaderDispatcher,
|
16
|
+
BaseDataDumpAsset,
|
17
|
+
DataObjectDumper,
|
18
|
+
)
|
9
19
|
from .pipeline_component_registry import PipelineComponentRegistry
|
10
20
|
from .pipeline_step_mixin import PipelineStepMixin
|
11
21
|
from .update_meta_mixin import UpdateMetaMixin
|
@@ -0,0 +1,347 @@
|
|
1
|
+
"""Provide pipeline data object dumper and data dump asset classes."""
|
2
|
+
|
3
|
+
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
4
|
+
# License: AGPL
|
5
|
+
|
6
|
+
from abc import ABC, abstractmethod
|
7
|
+
from collections.abc import Iterator, MutableMapping
|
8
|
+
from copy import deepcopy
|
9
|
+
from pathlib import Path
|
10
|
+
from typing import Any
|
11
|
+
|
12
|
+
import nibabel
|
13
|
+
import pandas
|
14
|
+
|
15
|
+
from ..utils import raise_error, yaml
|
16
|
+
|
17
|
+
|
18
|
+
__all__ = [
|
19
|
+
"AssetDumperDispatcher",
|
20
|
+
"AssetLoaderDispatcher",
|
21
|
+
"BaseDataDumpAsset",
|
22
|
+
"DataObjectDumper",
|
23
|
+
]
|
24
|
+
|
25
|
+
|
26
|
+
class BaseDataDumpAsset(ABC):
|
27
|
+
"""Abstract base class for a data dump asset.
|
28
|
+
|
29
|
+
Parameters
|
30
|
+
----------
|
31
|
+
data : Any
|
32
|
+
Data to save.
|
33
|
+
path_without_ext : pathlib.Path
|
34
|
+
Path to the asset without extension.
|
35
|
+
The subclass should add the extension when saving.
|
36
|
+
|
37
|
+
"""
|
38
|
+
|
39
|
+
def __init__(self, data: Any, path_without_ext: Path) -> None:
|
40
|
+
"""Initialize the class."""
|
41
|
+
self.data = data
|
42
|
+
self.path_without_ext = path_without_ext
|
43
|
+
|
44
|
+
@abstractmethod
|
45
|
+
def dump(self) -> None:
|
46
|
+
"""Dump asset."""
|
47
|
+
raise_error(
|
48
|
+
msg="Concrete classes need to implement dump().",
|
49
|
+
klass=NotImplementedError,
|
50
|
+
)
|
51
|
+
|
52
|
+
@classmethod
|
53
|
+
@abstractmethod
|
54
|
+
def load(cls: type["BaseDataDumpAsset"], path: Path) -> Any:
|
55
|
+
"""Load asset from path."""
|
56
|
+
raise_error(
|
57
|
+
msg="Concrete classes need to implement load().",
|
58
|
+
klass=NotImplementedError,
|
59
|
+
)
|
60
|
+
|
61
|
+
|
62
|
+
class Nifti1ImageAsset(BaseDataDumpAsset):
|
63
|
+
"""Class for ``nibabel.Nifti1Image`` dumper."""
|
64
|
+
|
65
|
+
def dump(self) -> None:
|
66
|
+
nibabel.save(self.data, self.path_without_ext.with_suffix(".nii.gz"))
|
67
|
+
|
68
|
+
@classmethod
|
69
|
+
def load(cls: "Nifti1ImageAsset", path: Path) -> nibabel.Nifti1Image:
|
70
|
+
return nibabel.load(path)
|
71
|
+
|
72
|
+
|
73
|
+
class PandasDataFrameAsset(BaseDataDumpAsset):
|
74
|
+
"""Class for ``pandas.DataFrame`` dumper."""
|
75
|
+
|
76
|
+
def dump(self) -> None:
|
77
|
+
self.data.to_csv(self.path_without_ext.with_suffix(".csv"))
|
78
|
+
|
79
|
+
@classmethod
|
80
|
+
def load(cls: "PandasDataFrameAsset", path: Path) -> pandas.DataFrame:
|
81
|
+
return pandas.read_csv(path, index_col=0)
|
82
|
+
|
83
|
+
|
84
|
+
class AssetDumperDispatcher(MutableMapping):
|
85
|
+
"""Class for helping dynamic asset dumper dispatch."""
|
86
|
+
|
87
|
+
_instance = None
|
88
|
+
|
89
|
+
def __new__(cls):
|
90
|
+
# Make class singleton
|
91
|
+
if cls._instance is None:
|
92
|
+
cls._instance = super().__new__(cls)
|
93
|
+
# Set dumpers
|
94
|
+
cls._dumpers: dict[type, type[BaseDataDumpAsset]] = {}
|
95
|
+
cls._builtin: dict[type, type[BaseDataDumpAsset]] = {}
|
96
|
+
cls._external: dict[type, type[BaseDataDumpAsset]] = {}
|
97
|
+
cls._builtin.update(
|
98
|
+
{
|
99
|
+
nibabel.Nifti1Image: Nifti1ImageAsset,
|
100
|
+
pandas.DataFrame: PandasDataFrameAsset,
|
101
|
+
}
|
102
|
+
)
|
103
|
+
cls._dumpers.update(cls._builtin)
|
104
|
+
return cls._instance
|
105
|
+
|
106
|
+
def __getitem__(self, key: type) -> type[BaseDataDumpAsset]:
|
107
|
+
return self._dumpers[key]
|
108
|
+
|
109
|
+
def __iter__(self) -> Iterator[type]:
|
110
|
+
return iter(self._dumpers)
|
111
|
+
|
112
|
+
def __len__(self) -> int:
|
113
|
+
return len(self._dumpers)
|
114
|
+
|
115
|
+
def __delitem__(self, key: type) -> None:
|
116
|
+
# Internal check
|
117
|
+
if key in self._builtin:
|
118
|
+
raise_error(f"Cannot delete in-built key: {key}")
|
119
|
+
# Non-existing key
|
120
|
+
if key not in self._external:
|
121
|
+
raise_error(klass=KeyError, msg=str(key))
|
122
|
+
# Update external
|
123
|
+
_ = self._external.pop(key)
|
124
|
+
# Update global
|
125
|
+
_ = self._dumpers.pop(key)
|
126
|
+
|
127
|
+
def __setitem__(self, key: type, value: type[BaseDataDumpAsset]) -> None:
|
128
|
+
# Internal check
|
129
|
+
if key in self._builtin:
|
130
|
+
raise_error(f"Cannot set value for in-built key: {key}")
|
131
|
+
# Value type check
|
132
|
+
if not issubclass(value, BaseDataDumpAsset):
|
133
|
+
raise_error(f"Invalid value type: {type(value)}")
|
134
|
+
# Update external
|
135
|
+
self._external[key] = value
|
136
|
+
# Update global
|
137
|
+
self._dumpers[key] = value
|
138
|
+
|
139
|
+
def popitem():
|
140
|
+
"""Not implemented."""
|
141
|
+
pass
|
142
|
+
|
143
|
+
def clear(self):
|
144
|
+
"""Not implemented."""
|
145
|
+
pass
|
146
|
+
|
147
|
+
def setdefault(self, key: type, value=None):
|
148
|
+
"""Not implemented."""
|
149
|
+
pass
|
150
|
+
|
151
|
+
|
152
|
+
class AssetLoaderDispatcher(MutableMapping):
|
153
|
+
"""Class for helping dynamic asset loader dispatch."""
|
154
|
+
|
155
|
+
_instance = None
|
156
|
+
|
157
|
+
def __new__(cls):
|
158
|
+
# Make class singleton
|
159
|
+
if cls._instance is None:
|
160
|
+
cls._instance = super().__new__(cls)
|
161
|
+
# Set loaders
|
162
|
+
cls._loaders: dict[str, type[BaseDataDumpAsset]] = {}
|
163
|
+
cls._builtin: dict[str, type[BaseDataDumpAsset]] = {}
|
164
|
+
cls._external: dict[str, type[BaseDataDumpAsset]] = {}
|
165
|
+
cls._builtin.update(
|
166
|
+
{
|
167
|
+
".nii.gz": Nifti1ImageAsset,
|
168
|
+
".nii": Nifti1ImageAsset,
|
169
|
+
".csv": PandasDataFrameAsset,
|
170
|
+
}
|
171
|
+
)
|
172
|
+
cls._loaders.update(cls._builtin)
|
173
|
+
return cls._instance
|
174
|
+
|
175
|
+
def __getitem__(self, key: str) -> type[BaseDataDumpAsset]:
|
176
|
+
return self._loaders[key]
|
177
|
+
|
178
|
+
def __iter__(self) -> Iterator[str]:
|
179
|
+
return iter(self._loaders)
|
180
|
+
|
181
|
+
def __len__(self) -> int:
|
182
|
+
return len(self._loaders)
|
183
|
+
|
184
|
+
def __delitem__(self, key: str) -> None:
|
185
|
+
# Internal check
|
186
|
+
if key in self._builtin:
|
187
|
+
raise_error(f"Cannot delete in-built key: {key}")
|
188
|
+
# Non-existing key
|
189
|
+
if key not in self._external:
|
190
|
+
raise_error(klass=KeyError, msg=key)
|
191
|
+
# Update external
|
192
|
+
_ = self._external.pop(key)
|
193
|
+
# Update global
|
194
|
+
_ = self._loaders.pop(key)
|
195
|
+
|
196
|
+
def __setitem__(self, key: str, value: type[BaseDataDumpAsset]) -> None:
|
197
|
+
# Internal check
|
198
|
+
if key in self._builtin:
|
199
|
+
raise_error(f"Cannot set value for in-built key: {key}")
|
200
|
+
# Value type check
|
201
|
+
if not issubclass(value, BaseDataDumpAsset):
|
202
|
+
raise_error(f"Invalid value type: {type(value)}")
|
203
|
+
# Update external
|
204
|
+
self._external[key] = value
|
205
|
+
# Update global
|
206
|
+
self._loaders[key] = value
|
207
|
+
|
208
|
+
def popitem():
|
209
|
+
"""Not implemented."""
|
210
|
+
pass
|
211
|
+
|
212
|
+
def clear(self):
|
213
|
+
"""Not implemented."""
|
214
|
+
pass
|
215
|
+
|
216
|
+
def setdefault(self, key: str, value=None):
|
217
|
+
"""Not implemented."""
|
218
|
+
pass
|
219
|
+
|
220
|
+
|
221
|
+
class DataObjectDumper:
|
222
|
+
"""Class for pipeline data object dumping."""
|
223
|
+
|
224
|
+
_instance = None
|
225
|
+
|
226
|
+
def __new__(cls):
|
227
|
+
"""Overridden to make the class singleton."""
|
228
|
+
# Make class singleton
|
229
|
+
if cls._instance is None:
|
230
|
+
cls._instance = super().__new__(cls)
|
231
|
+
return cls._instance
|
232
|
+
|
233
|
+
def dump(self, data: dict, path: Path, step: str) -> None:
|
234
|
+
"""Dump data object at path.
|
235
|
+
|
236
|
+
Parameters
|
237
|
+
----------
|
238
|
+
data : dict
|
239
|
+
The data object state to dump.
|
240
|
+
path : pathlib.Path
|
241
|
+
The path to dump the data object.
|
242
|
+
step : str
|
243
|
+
The step name. Also sets the dump directory.
|
244
|
+
|
245
|
+
"""
|
246
|
+
# Make a deep copy of data
|
247
|
+
data_copy = deepcopy(data)
|
248
|
+
# Initialize list for storing assets to save
|
249
|
+
assets = []
|
250
|
+
|
251
|
+
dump_file_root = path / step
|
252
|
+
|
253
|
+
for k, v in data_copy.items():
|
254
|
+
# Conditional for Warp type; kept separate for low cognitive load
|
255
|
+
if isinstance(v, list):
|
256
|
+
for idx, _ in enumerate(v):
|
257
|
+
data_copy[k][idx]["path"] = str(data_copy[k][idx]["path"])
|
258
|
+
continue
|
259
|
+
|
260
|
+
# Transform Path to str
|
261
|
+
data_copy[k]["path"] = str(data_copy[k]["path"])
|
262
|
+
# Pop out first level assets; some data types might not have
|
263
|
+
if "data" in v:
|
264
|
+
dumper = AssetDumperDispatcher()[type(v["data"])]
|
265
|
+
assets.append(
|
266
|
+
dumper(
|
267
|
+
data=v.pop("data"),
|
268
|
+
path_without_ext=dump_file_root / k,
|
269
|
+
)
|
270
|
+
)
|
271
|
+
for kk, vv in v.items():
|
272
|
+
if isinstance(vv, dict) and kk != "meta":
|
273
|
+
# Transform Path to str
|
274
|
+
data_copy[k][kk]["path"] = str(data_copy[k][kk]["path"])
|
275
|
+
# Pop out second level assets
|
276
|
+
if "data" in vv:
|
277
|
+
dumper = AssetDumperDispatcher()[type(vv["data"])]
|
278
|
+
assets.append(
|
279
|
+
dumper(
|
280
|
+
data=vv.pop("data"),
|
281
|
+
path_without_ext=dump_file_root / f"{k}_{kk}",
|
282
|
+
)
|
283
|
+
)
|
284
|
+
|
285
|
+
# Save yaml
|
286
|
+
dump_file_path = dump_file_root / "data.yaml"
|
287
|
+
dump_file_path.parent.mkdir(parents=True, exist_ok=True)
|
288
|
+
yaml.dump(data_copy, stream=dump_file_path)
|
289
|
+
|
290
|
+
# Save assets
|
291
|
+
for x in assets:
|
292
|
+
x.dump()
|
293
|
+
|
294
|
+
def load(self, path: Path) -> dict:
|
295
|
+
"""Load data object from path.
|
296
|
+
|
297
|
+
Parameters
|
298
|
+
----------
|
299
|
+
path : pathlib.Path
|
300
|
+
The path to the dumped data object.
|
301
|
+
|
302
|
+
Returns
|
303
|
+
-------
|
304
|
+
dict
|
305
|
+
The restored data object dump.
|
306
|
+
|
307
|
+
"""
|
308
|
+
data = yaml.load(path)
|
309
|
+
# Load assets; stem => path mapping
|
310
|
+
assets = {
|
311
|
+
child.stem.split(".")[0]: child
|
312
|
+
for child in path.parent.iterdir()
|
313
|
+
if "".join(child.suffixes) in AssetLoaderDispatcher()
|
314
|
+
}
|
315
|
+
|
316
|
+
for k, v in data.items():
|
317
|
+
# Conditional for Warp type; kept separate for low cognitive load
|
318
|
+
if isinstance(v, list):
|
319
|
+
for idx, _ in enumerate(v):
|
320
|
+
data[k][idx]["path"] = Path(data[k][idx]["path"])
|
321
|
+
continue
|
322
|
+
|
323
|
+
# Transform str to Path
|
324
|
+
data[k]["path"] = Path(data[k]["path"])
|
325
|
+
# Insert first level assets if matching asset is found
|
326
|
+
if k in assets:
|
327
|
+
# Get path
|
328
|
+
p = assets[k]
|
329
|
+
data[k]["path"] = p
|
330
|
+
# Get correct loader using extension
|
331
|
+
loader = AssetLoaderDispatcher()["".join(p.suffixes)]
|
332
|
+
data[k]["data"] = loader.load(p)
|
333
|
+
for kk, vv in v.items():
|
334
|
+
if isinstance(vv, dict) and kk != "meta":
|
335
|
+
# Transform str to Path
|
336
|
+
data[k][kk]["path"] = Path(data[k][kk]["path"])
|
337
|
+
# Insert second level assets
|
338
|
+
key = f"{k}_{kk}"
|
339
|
+
if key in assets:
|
340
|
+
# Get path
|
341
|
+
pp = assets[key]
|
342
|
+
data[k][kk]["path"] = pp
|
343
|
+
# Get correct loader using extension
|
344
|
+
loader = AssetLoaderDispatcher()["".join(pp.suffixes)]
|
345
|
+
data[k][kk]["data"] = loader.load(pp)
|
346
|
+
|
347
|
+
return data
|