pyAFQ 2.0__tar.gz → 2.1__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.
- {pyafq-2.0 → pyafq-2.1}/AFQ/api/bundle_dict.py +12 -12
- {pyafq-2.0 → pyafq-2.1}/AFQ/api/group.py +39 -11
- {pyafq-2.0 → pyafq-2.1}/AFQ/api/participant.py +7 -2
- {pyafq-2.0 → pyafq-2.1}/AFQ/api/utils.py +24 -8
- {pyafq-2.0 → pyafq-2.1}/AFQ/data/fetch.py +12 -5
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/QBallTP.py +2 -2
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/csd.py +13 -13
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/criteria.py +15 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/recognize.py +11 -9
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/data.py +17 -15
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/decorators.py +3 -1
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/mapping.py +13 -7
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/segmentation.py +32 -21
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/tractography.py +2 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/utils.py +0 -15
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/viz.py +50 -21
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_api.py +1 -1
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_csd.py +4 -4
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_tractography.py +4 -3
- {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/gputractography.py +16 -12
- {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/tractography.py +7 -2
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/bin.py +4 -5
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/docs.py +27 -0
- pyafq-2.1/AFQ/utils/docstring_parser.py +123 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/path.py +12 -9
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/streamlines.py +2 -1
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/volume.py +2 -1
- {pyafq-2.0 → pyafq-2.1}/AFQ/version.py +2 -2
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/utils.py +4 -0
- {pyafq-2.0 → pyafq-2.1}/CHANGES.rst +49 -0
- {pyafq-2.0/pyAFQ.egg-info → pyafq-2.1}/PKG-INFO +6 -4
- {pyafq-2.0 → pyafq-2.1}/bin/pyAFQ +1 -1
- {pyafq-2.0 → pyafq-2.1}/docs/Makefile +18 -3
- pyafq-2.1/docs/source/_static/custom.css +114 -0
- pyafq-2.1/docs/source/_static/logo.png +0 -0
- pyafq-2.1/docs/source/_templates/footer.html +11 -0
- pyafq-2.1/docs/source/bib.rst +6 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/conf.py +9 -4
- pyafq-2.1/docs/source/developing/contributing.rst +15 -0
- pyafq-2.1/docs/source/developing/definitions.rst +61 -0
- {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/index.rst +2 -1
- pyafq-2.1/docs/source/explanations/bundle_orientation.rst +56 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/index.rst +6 -2
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/modeling.rst +1 -5
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/tractography.rst +1 -9
- pyafq-2.1/docs/source/explanations/tractometry_pipeline.rst +41 -0
- pyafq-2.1/docs/source/guides_index.rst +10 -0
- pyafq-2.1/docs/source/howto/cleaning_params.rst +35 -0
- {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/converter.rst +2 -1
- {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/data.rst +2 -1
- {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/docker.rst +4 -1
- {pyafq-2.0 → pyafq-2.1}/docs/source/howto/getting_help.rst +9 -8
- {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/image.rst +1 -1
- pyafq-2.1/docs/source/howto/index.rst +28 -0
- pyafq-2.1/docs/source/howto/installation_guide.rst +132 -0
- pyafq-2.1/docs/source/howto/rerun.rst +62 -0
- pyafq-2.1/docs/source/howto/segmentation_params.rst +33 -0
- pyafq-2.1/docs/source/howto/singularity.rst +27 -0
- pyafq-2.1/docs/source/howto/tractography_params.rst +34 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/index.rst +54 -19
- {pyafq-2.0 → pyafq-2.1}/docs/source/reference/bundledict.rst +34 -32
- pyafq-2.1/docs/source/reference/fibertracts.rst +341 -0
- pyafq-2.1/docs/source/reference/index.rst +15 -0
- pyafq-2.1/docs/source/reference/kwargs.rst +158 -0
- pyafq-2.1/docs/source/reference/mapping.rst +31 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/reference/methods.rst +43 -3
- pyafq-2.1/docs/source/reference/tissue_properties.rst +190 -0
- pyafq-2.1/docs/source/references.bib +528 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/add_custom_bundle.py +4 -3
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/baby_afq.py +4 -4
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_stages_of_tractometry.py +25 -7
- pyafq-2.1/examples/howto_examples/run_pyAFQ_with_GPU.py +48 -0
- pyafq-2.0/examples/tutorial_examples/plot_001_afq_api.py → pyafq-2.1/examples/tutorial_examples/plot_001_group_afq_api.py +5 -4
- pyafq-2.1/examples/tutorial_examples/plot_002_participant_afq_api.py +215 -0
- pyafq-2.1/examples/tutorial_examples/plot_003_rerun.py +145 -0
- pyafq-2.1/examples/tutorial_examples/plot_004_export.py +168 -0
- pyafq-2.0/examples/tutorial_examples/plot_003_viz.py → pyafq-2.1/examples/tutorial_examples/plot_005_viz.py +57 -7
- pyafq-2.0/examples/tutorial_examples/plot_002_bids_layout.py → pyafq-2.1/examples/tutorial_examples/plot_006_bids_layout.py +1 -1
- pyafq-2.1/examples/tutorial_examples/plot_007_rois.py +176 -0
- {pyafq-2.0 → pyafq-2.1}/gpu_docker/Dockerfile +2 -1
- {pyafq-2.0 → pyafq-2.1}/gpu_docker/cuda_track_template.def +1 -0
- {pyafq-2.0 → pyafq-2.1/pyAFQ.egg-info}/PKG-INFO +6 -4
- {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/SOURCES.txt +33 -20
- {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/requires.txt +3 -2
- {pyafq-2.0 → pyafq-2.1}/setup.cfg +2 -2
- pyafq-2.0/docs/source/_static/custom.css +0 -70
- pyafq-2.0/docs/source/_static/logo.png +0 -0
- pyafq-2.0/docs/source/explanations/bundle_orientation.rst +0 -52
- pyafq-2.0/docs/source/explanations/tractometry_pipeline.rst +0 -31
- pyafq-2.0/docs/source/howto/contributing.rst +0 -12
- pyafq-2.0/docs/source/howto/developing/definitions.rst +0 -46
- pyafq-2.0/docs/source/howto/index.rst +0 -17
- pyafq-2.0/docs/source/howto/installation_guide.rst +0 -99
- pyafq-2.0/docs/source/howto/usage/index.rst +0 -15
- pyafq-2.0/docs/source/howto/usage/kwargs.rst +0 -238
- pyafq-2.0/docs/source/howto/usage/methods.rst +0 -350
- pyafq-2.0/docs/source/howto/usage/singularity.rst +0 -16
- pyafq-2.0/docs/source/reference/index.rst +0 -13
- pyafq-2.0/docs/source/reference/kwargs.rst +0 -268
- pyafq-2.0/docs/source/reference/mapping.rst +0 -28
- {pyafq-2.0 → pyafq-2.1}/.github/CITATION.cff +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/CONTRIBUTING.md +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/docbuild.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/docker_pyafq.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_anisotropic_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_basic_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_custom_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_pft_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_reco80_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_reco_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.github/workflows/test.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.gitignore +0 -0
- {pyafq-2.0 → pyafq-2.1}/.mailmap +0 -0
- {pyafq-2.0 → pyafq-2.1}/.maintenance/update_changes.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/.maintenance/update_zenodo.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/.pep8speaks.yml +0 -0
- {pyafq-2.0 → pyafq-2.1}/.zenodo.json +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/_fixes.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/api/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/data/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/data/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/image.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/mapping.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/dki.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/dti.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/models/fwdti.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/cleaning.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/curvature.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/other_bundles.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/preprocess.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/roi.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_other_bundles.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_rois.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_utils.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/registration.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_bundle_dict.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_data.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_definitions.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_dki.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_dti.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_fixes.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_registration.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_viz.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/conversion.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/models.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/stats.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/testing.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_streamlines.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/altair.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/fury_backend.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/plot.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/AFQ/viz/plotly_backend.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/CITATION +0 -0
- {pyafq-2.0 → pyafq-2.1}/LICENSE +0 -0
- {pyafq-2.0 → pyafq-2.1}/MANIFEST.in +0 -0
- {pyafq-2.0 → pyafq-2.1}/Makefile +0 -0
- {pyafq-2.0 → pyafq-2.1}/README.md +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/_progressbars.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/_templates/layout.html +0 -0
- {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/releasing.rst +0 -0
- {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/tasks.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/down_left_arrow.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/down_right_arrow.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/greencheck.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_modeling2.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_profiling.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_recognition.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_tractography.png +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/howto/cite.rst +0 -0
- {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/scalars.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/reference/viz_backend.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/source/tutorials/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/docs/upload-gh-pages.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/README.rst +0 -0
- /pyafq-2.0/examples/howto_examples/plot_acoustic_radiations.py → /pyafq-2.1/examples/howto_examples/acoustic_radiations.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cerebellar_peduncles.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cloudknot_example.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
- /pyafq-2.0/examples/howto_examples/plot_optic_radiations.py → /pyafq-2.1/examples/howto_examples/optic_radiations.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_afq_callosal.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_recobundles.py +0 -0
- /pyafq-2.0/examples/howto_examples/plot_afq_fwdti.py → /pyafq-2.1/examples/howto_examples/run_afq_fwdti.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/vof_example.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/examples/tutorial_examples/README.rst +0 -0
- {pyafq-2.0 → pyafq-2.1}/gpu_docker/cuda_build.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/gpu_docker/docker-build.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/gpu_docker/docker-push.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyafq_docker/Dockerfile +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-2.0 → pyafq-2.1}/pyproject.toml +0 -0
- {pyafq-2.0 → pyafq-2.1}/setup.py +0 -0
- {pyafq-2.0 → pyafq-2.1}/tox.ini +0 -0
|
@@ -451,7 +451,7 @@ def baby_bd():
|
|
|
451
451
|
'mahal': {'distance_threshold': 4}},
|
|
452
452
|
'Forceps Minor': {'cross_midline': True,
|
|
453
453
|
'include': [templates['FA_R'],
|
|
454
|
-
templates['mid-
|
|
454
|
+
templates['mid-sagittal'],
|
|
455
455
|
templates['FA_L']],
|
|
456
456
|
'exclude': [],
|
|
457
457
|
'space': 'template',
|
|
@@ -459,7 +459,7 @@ def baby_bd():
|
|
|
459
459
|
'mahal': {'distance_threshold': 4}},
|
|
460
460
|
'Forceps Major': {'cross_midline': True,
|
|
461
461
|
'include': [templates['FP_R'],
|
|
462
|
-
templates['mid-
|
|
462
|
+
templates['mid-sagittal'],
|
|
463
463
|
templates['FP_L']],
|
|
464
464
|
'exclude': [],
|
|
465
465
|
'space': 'template',
|
|
@@ -722,8 +722,10 @@ class BundleDict(MutableMapping):
|
|
|
722
722
|
If there are bundles in bundle_info with the 'space' attribute
|
|
723
723
|
set to 'subject', their images (all ROIs and probability maps)
|
|
724
724
|
will be resampled to the affine and shape of this image.
|
|
725
|
+
If None, resamples to DWI. Be careful if you use this,
|
|
726
|
+
that this is the correct choice.
|
|
725
727
|
If False, no resampling will be done.
|
|
726
|
-
Default:
|
|
728
|
+
Default: False
|
|
727
729
|
|
|
728
730
|
keep_in_memory : bool, optional
|
|
729
731
|
Whether, once loaded, all ROIs and probability maps will stay
|
|
@@ -1017,9 +1019,9 @@ class BundleDict(MutableMapping):
|
|
|
1017
1019
|
new_affine : array
|
|
1018
1020
|
Affine of space transformed into.
|
|
1019
1021
|
base_fname : str, optional
|
|
1020
|
-
Base file path to
|
|
1022
|
+
Base file path to construct file path from. Additional BIDS
|
|
1021
1023
|
descriptors will be added to this file path. If None,
|
|
1022
|
-
|
|
1024
|
+
no file paths returned.
|
|
1023
1025
|
to_space : str, optional
|
|
1024
1026
|
Name for space for exported ROIs. Only used if base_fname
|
|
1025
1027
|
is not None.
|
|
@@ -1033,8 +1035,8 @@ class BundleDict(MutableMapping):
|
|
|
1033
1035
|
-------
|
|
1034
1036
|
If base_fname is None, a dictionary where keys are
|
|
1035
1037
|
the roi type and values are the transformed ROIs.
|
|
1036
|
-
Otherwise, a list of file names
|
|
1037
|
-
|
|
1038
|
+
Otherwise, a list of file names and a list of transformed ROIs
|
|
1039
|
+
are returned.
|
|
1038
1040
|
"""
|
|
1039
1041
|
if self.is_bundle_in_template(bundle_name):
|
|
1040
1042
|
transformed_rois = self.apply_to_rois(
|
|
@@ -1055,6 +1057,7 @@ class BundleDict(MutableMapping):
|
|
|
1055
1057
|
|
|
1056
1058
|
if base_fname is not None:
|
|
1057
1059
|
fnames = []
|
|
1060
|
+
list_of_rois_to_save = []
|
|
1058
1061
|
for roi_type, rois in transformed_rois.items():
|
|
1059
1062
|
if roi_type == "prob_map":
|
|
1060
1063
|
suffix = "probseg"
|
|
@@ -1079,12 +1082,9 @@ class BundleDict(MutableMapping):
|
|
|
1079
1082
|
f"{desc}"
|
|
1080
1083
|
f"_{suffix}.nii.gz",
|
|
1081
1084
|
"ROIs")
|
|
1082
|
-
nib.save(
|
|
1083
|
-
nib.Nifti1Image(
|
|
1084
|
-
roi.get_fdata().astype(np.float32),
|
|
1085
|
-
roi.affine), fname)
|
|
1086
1085
|
fnames.append(fname)
|
|
1087
|
-
|
|
1086
|
+
list_of_rois_to_save.append(roi)
|
|
1087
|
+
return list_of_rois_to_save, fnames
|
|
1088
1088
|
else:
|
|
1089
1089
|
return transformed_rois
|
|
1090
1090
|
|
|
@@ -127,7 +127,7 @@ class GroupAFQ(object):
|
|
|
127
127
|
|
|
128
128
|
Examples
|
|
129
129
|
--------
|
|
130
|
-
api.GroupAFQ(my_path,
|
|
130
|
+
api.GroupAFQ(my_path, csd_sh_order_max=4)
|
|
131
131
|
api.GroupAFQ(
|
|
132
132
|
my_path,
|
|
133
133
|
reg_template_spec="mni_t2", reg_subject_spec="b0")
|
|
@@ -208,8 +208,9 @@ class GroupAFQ(object):
|
|
|
208
208
|
|
|
209
209
|
pl_desc_file = op.join(self.afq_path, 'dataset_description.json')
|
|
210
210
|
|
|
211
|
-
|
|
212
|
-
|
|
211
|
+
if not op.exists(pl_desc_file):
|
|
212
|
+
with open(pl_desc_file, 'w') as outfile:
|
|
213
|
+
json.dump(pipeline_description, outfile)
|
|
213
214
|
|
|
214
215
|
self.subjects = bids_layout.get(return_type='id', target='subject')
|
|
215
216
|
if not len(self.subjects):
|
|
@@ -410,7 +411,12 @@ class GroupAFQ(object):
|
|
|
410
411
|
self.afq_path, "tract_profiles.csv"))
|
|
411
412
|
os.makedirs(op.dirname(out_file), exist_ok=True)
|
|
412
413
|
_df = clean_pandas_df(_df)
|
|
413
|
-
|
|
414
|
+
try:
|
|
415
|
+
_df.to_csv(out_file, index=False)
|
|
416
|
+
except:
|
|
417
|
+
logger.warning((
|
|
418
|
+
"Unable to update combined tract profile. "
|
|
419
|
+
"This is likely due to file permissions."))
|
|
414
420
|
return _df
|
|
415
421
|
|
|
416
422
|
def get_streamlines_json(self):
|
|
@@ -502,6 +508,8 @@ class GroupAFQ(object):
|
|
|
502
508
|
None if called without arguments.
|
|
503
509
|
"""
|
|
504
510
|
section = check_attribute(attr_name)
|
|
511
|
+
if section == False:
|
|
512
|
+
return None
|
|
505
513
|
|
|
506
514
|
# iterate over subjects / sessions,
|
|
507
515
|
# decide if they need to be calculated or not
|
|
@@ -554,6 +562,9 @@ class GroupAFQ(object):
|
|
|
554
562
|
Name of the output to export up to. Default: "help"
|
|
555
563
|
"""
|
|
556
564
|
section = check_attribute(attr_name)
|
|
565
|
+
if section == False:
|
|
566
|
+
return None
|
|
567
|
+
|
|
557
568
|
wf_dict = self.wf_dict[
|
|
558
569
|
self.valid_sub_list[0]][self.valid_ses_list[0]]
|
|
559
570
|
if section is not None:
|
|
@@ -772,7 +783,13 @@ class GroupAFQ(object):
|
|
|
772
783
|
self.afq_path,
|
|
773
784
|
(f"bundle-{bundle_name}_view-{view}"
|
|
774
785
|
f"_idx-{curr_file_num}_montage.png")))
|
|
775
|
-
|
|
786
|
+
try:
|
|
787
|
+
curr_img.save(save_path)
|
|
788
|
+
except:
|
|
789
|
+
if op.exists(save_path):
|
|
790
|
+
logger.info("Montage file already exists, skipping.")
|
|
791
|
+
else:
|
|
792
|
+
logger.warning("Unable to save montage file, skipping.")
|
|
776
793
|
all_fnames.append(save_path)
|
|
777
794
|
|
|
778
795
|
this_img_trimmed = {}
|
|
@@ -865,12 +882,23 @@ class GroupAFQ(object):
|
|
|
865
882
|
sls_mni,
|
|
866
883
|
reg_template,
|
|
867
884
|
Space.VOX)
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
885
|
+
|
|
886
|
+
save_path = op.abspath(op.join(
|
|
887
|
+
self.afq_path,
|
|
888
|
+
f"bundle-{bundle_name}_subjects-all_MNI.trk"))
|
|
889
|
+
try:
|
|
890
|
+
save_tractogram(
|
|
891
|
+
moved_sft,
|
|
892
|
+
save_path,
|
|
893
|
+
bbox_valid_check=False)
|
|
894
|
+
except:
|
|
895
|
+
if op.exists(save_path):
|
|
896
|
+
logger.info(("Combined bundles file "
|
|
897
|
+
"already exists, skipping."))
|
|
898
|
+
else:
|
|
899
|
+
logger.warning((
|
|
900
|
+
"Unable to save combined "
|
|
901
|
+
"bundles file, skipping."))
|
|
874
902
|
|
|
875
903
|
def upload_to_s3(self, s3fs, remote_path):
|
|
876
904
|
""" Upload entire AFQ derivatives folder to S3"""
|
|
@@ -56,7 +56,7 @@ class ParticipantAFQ(object):
|
|
|
56
56
|
--------
|
|
57
57
|
api.ParticipantAFQ(
|
|
58
58
|
dwi_data_file, bval_file, bvec_file, output_dir,
|
|
59
|
-
|
|
59
|
+
csd_sh_order_max=4)
|
|
60
60
|
api.ParticipantAFQ(
|
|
61
61
|
dwi_data_file, bval_file, bvec_file, output_dir,
|
|
62
62
|
reg_template_spec="mni_t2", reg_subject_spec="b0")
|
|
@@ -149,6 +149,8 @@ class ParticipantAFQ(object):
|
|
|
149
149
|
The specific output, or None if called without arguments.
|
|
150
150
|
"""
|
|
151
151
|
section = check_attribute(attr_name)
|
|
152
|
+
if section == False:
|
|
153
|
+
return None
|
|
152
154
|
|
|
153
155
|
if section is None:
|
|
154
156
|
return self.wf_dict[attr_name]
|
|
@@ -156,7 +158,7 @@ class ParticipantAFQ(object):
|
|
|
156
158
|
|
|
157
159
|
def export_up_to(self, attr_name="help"):
|
|
158
160
|
f"""
|
|
159
|
-
Export all derivatives
|
|
161
|
+
Export all derivatives up to, but not including, the specified output.
|
|
160
162
|
To print a list of available outputs,
|
|
161
163
|
call export_up_to without arguments.
|
|
162
164
|
{valid_exports_string}
|
|
@@ -167,6 +169,9 @@ class ParticipantAFQ(object):
|
|
|
167
169
|
Name of the output to export up to. Default: "help"
|
|
168
170
|
"""
|
|
169
171
|
section = check_attribute(attr_name)
|
|
172
|
+
if section == False:
|
|
173
|
+
return None
|
|
174
|
+
|
|
170
175
|
wf_dict = self.wf_dict
|
|
171
176
|
if section is not None:
|
|
172
177
|
wf_dict = wf_dict[section]
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
from importlib import import_module
|
|
3
3
|
from AFQ.viz.utils import viz_import_msg_error
|
|
4
|
+
from AFQ.utils.docstring_parser import parse_numpy_docstring
|
|
4
5
|
import pimms
|
|
5
|
-
from funcargparse import FuncArgParser
|
|
6
6
|
import logging
|
|
7
7
|
import warnings
|
|
8
8
|
|
|
@@ -23,18 +23,31 @@ set_sft_logger_level(logging.CRITICAL)
|
|
|
23
23
|
|
|
24
24
|
task_modules = ["data", "mapping", "segmentation", "tractography", "viz"]
|
|
25
25
|
|
|
26
|
-
methods_descriptors = {
|
|
27
|
-
|
|
26
|
+
methods_descriptors = {
|
|
27
|
+
"dwi_data_file": "Path to DWI data file",
|
|
28
|
+
"bval_file": "Path to bval file",
|
|
29
|
+
"bvec_file": "Path to bvec file",
|
|
30
|
+
"output_dir": "Path to output directory",
|
|
31
|
+
"best_scalar": "Go-to scalar for visualizations",
|
|
32
|
+
"base_fname": "Base file name for outputs",
|
|
33
|
+
}
|
|
34
|
+
methods_sections = {
|
|
35
|
+
"dwi_data_file": "data",
|
|
36
|
+
"bval_file": "data",
|
|
37
|
+
"bvec_file": "data",
|
|
38
|
+
"output_dir": "data",
|
|
39
|
+
"best_scalar": "tractography",
|
|
40
|
+
"base_fname": "data",
|
|
41
|
+
}
|
|
28
42
|
kwargs_descriptors = {}
|
|
29
43
|
for task_module in task_modules:
|
|
30
44
|
kwargs_descriptors[task_module] = {}
|
|
31
45
|
for calc_obj in import_module(
|
|
32
46
|
f"AFQ.tasks.{task_module}").__dict__.values():
|
|
33
47
|
if isinstance(calc_obj, pimms.calculation.Calc):
|
|
34
|
-
|
|
35
|
-
docstr_parser.setup_args(calc_obj.function)
|
|
48
|
+
docstr_parsed = parse_numpy_docstring(calc_obj.function)
|
|
36
49
|
if len(calc_obj.efferents) > 1:
|
|
37
|
-
eff_descs =
|
|
50
|
+
eff_descs = docstr_parsed["description"].split(",")
|
|
38
51
|
if len(eff_descs) != len(calc_obj.efferents):
|
|
39
52
|
raise NotImplementedError((
|
|
40
53
|
"If calc method has mutliple outputs, "
|
|
@@ -56,10 +69,10 @@ for task_module in task_modules:
|
|
|
56
69
|
else:
|
|
57
70
|
methods_descriptors[
|
|
58
71
|
calc_obj.efferents[0]] =\
|
|
59
|
-
|
|
72
|
+
docstr_parsed["description"]
|
|
60
73
|
methods_sections[calc_obj.efferents[0]] =\
|
|
61
74
|
task_module
|
|
62
|
-
for arg, info in
|
|
75
|
+
for arg, info in docstr_parsed["arguments"].items():
|
|
63
76
|
if "help" in info:
|
|
64
77
|
default = info["default"] if "default" in info else None
|
|
65
78
|
kwargs_descriptors[task_module][arg] = dict(
|
|
@@ -97,6 +110,9 @@ valid_exports_string = (
|
|
|
97
110
|
def check_attribute(attr_name):
|
|
98
111
|
if attr_name == "help":
|
|
99
112
|
print(valid_exports_string)
|
|
113
|
+
return False
|
|
114
|
+
|
|
115
|
+
if attr_name[:-5] in task_modules:
|
|
100
116
|
return None
|
|
101
117
|
|
|
102
118
|
if attr_name in methods_sections:
|
|
@@ -238,7 +238,7 @@ pediatric_fnames = [
|
|
|
238
238
|
"VOF_box_L.nii.gz", "VOF_box_R.nii.gz",
|
|
239
239
|
"UNCNeo-withCerebellum-for-babyAFQ.nii.gz",
|
|
240
240
|
"UNCNeo_JHU_tracts_prob-for-babyAFQ.nii.gz",
|
|
241
|
-
"mid-
|
|
241
|
+
"mid-sagittal.nii.gz",
|
|
242
242
|
"OR_rightV1.nii.gz",
|
|
243
243
|
"OR_rightThal.nii.gz",
|
|
244
244
|
"OR_right_roi3.nii.gz",
|
|
@@ -308,7 +308,7 @@ pediatric_remote_fnames = [
|
|
|
308
308
|
"24880739", "24880742", "24880754", "24880757", "24880760", "24880763",
|
|
309
309
|
"24880769", "24880772", "24880775", "24880778", "24880781", "24880787",
|
|
310
310
|
"24880790", "24880793", "24880796", "24880802", "24880805", "24880808",
|
|
311
|
-
"24880616", "24880613", "
|
|
311
|
+
"24880616", "24880613", "54869903",
|
|
312
312
|
"42120480",
|
|
313
313
|
"42120483",
|
|
314
314
|
"42120486",
|
|
@@ -405,6 +405,8 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
|
|
|
405
405
|
nibabel image class instance that contains the binary ROI resampled into
|
|
406
406
|
the requested space.
|
|
407
407
|
"""
|
|
408
|
+
logger = logging.getLogger('AFQ')
|
|
409
|
+
|
|
408
410
|
if isinstance(roi, str):
|
|
409
411
|
roi = nib.load(roi)
|
|
410
412
|
|
|
@@ -414,7 +416,11 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
|
|
|
414
416
|
if isinstance(resample_to, str):
|
|
415
417
|
resample_to = nib.load(resample_to)
|
|
416
418
|
|
|
417
|
-
if resample_to is False
|
|
419
|
+
if resample_to is False:
|
|
420
|
+
return roi
|
|
421
|
+
|
|
422
|
+
if np.allclose(resample_to.affine, roi.affine):
|
|
423
|
+
logger.info("Resampling skipped as affines already match.")
|
|
418
424
|
return roi
|
|
419
425
|
|
|
420
426
|
as_array = resample(
|
|
@@ -1049,8 +1055,9 @@ def to_bids_description(path, fname='dataset_description.json',
|
|
|
1049
1055
|
"""Dumps a dict into a bids description at the given location"""
|
|
1050
1056
|
kwargs.update({"BIDSVersion": BIDSVersion})
|
|
1051
1057
|
desc_file = op.join(path, fname)
|
|
1052
|
-
|
|
1053
|
-
|
|
1058
|
+
if not op.exists(desc_file):
|
|
1059
|
+
with open(desc_file, 'w') as outfile:
|
|
1060
|
+
json.dump(kwargs, outfile)
|
|
1054
1061
|
|
|
1055
1062
|
|
|
1056
1063
|
def organize_cfin_data(path=None):
|
|
@@ -7,7 +7,7 @@ from dipy.reconst.shm import anisotropic_power, sh_to_sf_matrix
|
|
|
7
7
|
__all__ = ["extract_odf", "anisotropic_index", "anisotropic_power"]
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def extract_odf(odf, sphere=default_sphere,
|
|
10
|
+
def extract_odf(odf, sphere=default_sphere, sh_order_max=8):
|
|
11
11
|
"""
|
|
12
12
|
Calculates spherical harmonics coefficients and
|
|
13
13
|
isotropic and anisotropic diffusion components
|
|
@@ -18,7 +18,7 @@ def extract_odf(odf, sphere=default_sphere, sh_order=8):
|
|
|
18
18
|
ISO = odf_norm.min(axis=-1)
|
|
19
19
|
|
|
20
20
|
_, invB = sh_to_sf_matrix(
|
|
21
|
-
sphere,
|
|
21
|
+
sphere, sh_order_max=sh_order_max, basis_type=None, return_inv=True)
|
|
22
22
|
shm = blas.dgemm(
|
|
23
23
|
alpha=1.,
|
|
24
24
|
a=odf.reshape(-1, invB.shape[0]), b=invB).reshape(
|
|
@@ -23,19 +23,19 @@ class CsdNanResponseError(Exception):
|
|
|
23
23
|
pass
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
def _model(gtab, data, response=None,
|
|
26
|
+
def _model(gtab, data, response=None, sh_order_max=None, csd_fa_thr=0.7):
|
|
27
27
|
"""
|
|
28
28
|
Helper function that defines a CSD model.
|
|
29
29
|
"""
|
|
30
|
-
if
|
|
30
|
+
if sh_order_max is None:
|
|
31
31
|
ndata = np.sum(~gtab.b0s_mask)
|
|
32
32
|
# See dipy.reconst.shm.calculate_max_order
|
|
33
33
|
L1 = (-3 + np.sqrt(1 + 8 * ndata)) / 2.0
|
|
34
|
-
|
|
35
|
-
if np.mod(
|
|
36
|
-
|
|
37
|
-
if
|
|
38
|
-
|
|
34
|
+
sh_order_max = int(L1)
|
|
35
|
+
if np.mod(sh_order_max, 2) != 0:
|
|
36
|
+
sh_order_max = sh_order_max - 1
|
|
37
|
+
if sh_order_max > 8:
|
|
38
|
+
sh_order_max = 8
|
|
39
39
|
|
|
40
40
|
my_model = csd.ConstrainedSphericalDeconvModel
|
|
41
41
|
if response is None:
|
|
@@ -55,21 +55,21 @@ def _model(gtab, data, response=None, sh_order=None, csd_fa_thr=0.7):
|
|
|
55
55
|
if np.all(np.isnan(response[0])):
|
|
56
56
|
raise CsdNanResponseError
|
|
57
57
|
|
|
58
|
-
csdmodel = my_model(gtab, response,
|
|
58
|
+
csdmodel = my_model(gtab, response, sh_order_max=sh_order_max)
|
|
59
59
|
return csdmodel
|
|
60
60
|
|
|
61
61
|
|
|
62
|
-
def _fit(gtab, data, mask, response=None,
|
|
62
|
+
def _fit(gtab, data, mask, response=None, sh_order_max=None,
|
|
63
63
|
lambda_=1, tau=0.1, csd_fa_thr=0.7):
|
|
64
64
|
"""
|
|
65
65
|
Helper function that does the core of fitting a model to data.
|
|
66
66
|
"""
|
|
67
|
-
return _model(gtab, data, response,
|
|
67
|
+
return _model(gtab, data, response, sh_order_max, csd_fa_thr).fit(
|
|
68
68
|
data, mask=mask)
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
|
|
72
|
-
b0_threshold=50,
|
|
72
|
+
b0_threshold=50, sh_order_max=None, lambda_=1, tau=0.1, out_dir=None):
|
|
73
73
|
"""
|
|
74
74
|
Fit the CSD model and save file with SH coefficients.
|
|
75
75
|
|
|
@@ -94,7 +94,7 @@ def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
|
|
|
94
94
|
b0_threshold : float,optional.
|
|
95
95
|
The value of diffusion-weighting under which we consider it to be
|
|
96
96
|
equivalent to 0. Default:50
|
|
97
|
-
|
|
97
|
+
sh_order_max : int, optional.
|
|
98
98
|
default: infer the number of parameters from the number of data
|
|
99
99
|
volumes, but no larger than 8.
|
|
100
100
|
lambda_ : float, optional.
|
|
@@ -126,7 +126,7 @@ def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
|
|
|
126
126
|
b0_threshold=b0_threshold,
|
|
127
127
|
mask=mask)
|
|
128
128
|
|
|
129
|
-
csdfit = _fit(gtab, data, mask, response=response,
|
|
129
|
+
csdfit = _fit(gtab, data, mask, response=response, sh_order_max=sh_order_max,
|
|
130
130
|
lambda_=lambda_, tau=tau)
|
|
131
131
|
|
|
132
132
|
if out_dir is None:
|
|
@@ -334,6 +334,21 @@ def run_bundle_rec_plan(
|
|
|
334
334
|
mapping,
|
|
335
335
|
img.affine,
|
|
336
336
|
apply_to_recobundles=True))
|
|
337
|
+
|
|
338
|
+
def check_space(roi):
|
|
339
|
+
if not np.allclose(img.affine, roi.affine):
|
|
340
|
+
logger.warning(
|
|
341
|
+
"Resampling set to False in case where affines "
|
|
342
|
+
"do not match. This is likely due to subject space ROIs"
|
|
343
|
+
" not being in the right space. This found for bundle "
|
|
344
|
+
f"{bundle_name}")
|
|
345
|
+
|
|
346
|
+
apply_to_roi_dict(
|
|
347
|
+
bundle_def,
|
|
348
|
+
check_space,
|
|
349
|
+
dry_run=True,
|
|
350
|
+
apply_to_prob_map=True)
|
|
351
|
+
|
|
337
352
|
apply_to_roi_dict(
|
|
338
353
|
bundle_def,
|
|
339
354
|
lambda roi_img: nib.Nifti1Image(
|
|
@@ -122,16 +122,18 @@ def recognize(
|
|
|
122
122
|
References
|
|
123
123
|
----------
|
|
124
124
|
.. [Hua2008] Hua K, Zhang J, Wakana S, Jiang H, Li X, et al. (2008)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
Tract probability maps in stereotaxic spaces: analyses of white
|
|
126
|
+
matter anatomy and tract-specific quantification. Neuroimage 39:
|
|
127
|
+
336-347
|
|
128
|
+
|
|
128
129
|
.. [Yeatman2012] Yeatman, Jason D., Robert F. Dougherty, Nathaniel J.
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
130
|
+
Myall, Brian A. Wandell, and Heidi M. Feldman. 2012. "Tract Profiles
|
|
131
|
+
of White Matter Properties: Automating Fiber-Tract Quantification"
|
|
132
|
+
PloS One 7 (11): e49790.
|
|
133
|
+
|
|
134
|
+
.. [Garyfallidis2018] Garyfallidis et al. Recognition of white matter
|
|
135
|
+
bundles using local and global streamline-based registration and
|
|
136
|
+
clustering, Neuroimage, 2017.
|
|
135
137
|
"""
|
|
136
138
|
if rng is None:
|
|
137
139
|
rng = np.random.RandomState()
|
|
@@ -86,7 +86,7 @@ def get_data_gtab(dwi_data_file, bval_file, bvec_file, min_bval=None,
|
|
|
86
86
|
bvals = bvals[valid_b]
|
|
87
87
|
bvecs = bvecs[valid_b]
|
|
88
88
|
gtab = dpg.gradient_table(
|
|
89
|
-
bvals, bvecs,
|
|
89
|
+
bvals=bvals, bvecs=bvecs,
|
|
90
90
|
b0_threshold=b0_threshold)
|
|
91
91
|
img = nib.Nifti1Image(data, img.affine)
|
|
92
92
|
return data, gtab, img, img.affine
|
|
@@ -293,7 +293,7 @@ def msdki_msk(msdki_tf):
|
|
|
293
293
|
subfolder="models")
|
|
294
294
|
@as_img
|
|
295
295
|
def csd_params(dwi, brain_mask, gtab, data,
|
|
296
|
-
csd_response=None,
|
|
296
|
+
csd_response=None, csd_sh_order_max=None,
|
|
297
297
|
csd_lambda_=1, csd_tau=0.1,
|
|
298
298
|
csd_fa_thr=0.7):
|
|
299
299
|
"""
|
|
@@ -309,7 +309,7 @@ def csd_params(dwi, brain_mask, gtab, data,
|
|
|
309
309
|
(i.e. S0). If not provided, auto_response will be used to calculate
|
|
310
310
|
these values.
|
|
311
311
|
Default: None
|
|
312
|
-
|
|
312
|
+
csd_sh_order_max : int or None, optional.
|
|
313
313
|
default: infer the number of parameters from the number of data
|
|
314
314
|
volumes, but no larger than 8.
|
|
315
315
|
Default: None
|
|
@@ -340,7 +340,7 @@ def csd_params(dwi, brain_mask, gtab, data,
|
|
|
340
340
|
csdf = csd_fit_model(
|
|
341
341
|
gtab, data,
|
|
342
342
|
mask=mask,
|
|
343
|
-
response=csd_response,
|
|
343
|
+
response=csd_response, sh_order_max=csd_sh_order_max,
|
|
344
344
|
lambda_=csd_lambda_, tau=csd_tau,
|
|
345
345
|
csd_fa_thr=csd_fa_thr)
|
|
346
346
|
except CsdNanResponseError as e:
|
|
@@ -349,7 +349,7 @@ def csd_params(dwi, brain_mask, gtab, data,
|
|
|
349
349
|
f'{dwi}.') from e
|
|
350
350
|
|
|
351
351
|
meta = dict(
|
|
352
|
-
SphericalHarmonicDegree=
|
|
352
|
+
SphericalHarmonicDegree=csd_sh_order_max,
|
|
353
353
|
ResponseFunctionTensor=csd_response,
|
|
354
354
|
lambda_=csd_lambda_,
|
|
355
355
|
tau=csd_tau,
|
|
@@ -579,7 +579,7 @@ def rumba_f_wm(rumba_fit):
|
|
|
579
579
|
@pimms.calc("opdt_params", "opdt_gfa")
|
|
580
580
|
def opdt_params(base_fname, data, gtab,
|
|
581
581
|
dwi_affine, brain_mask,
|
|
582
|
-
|
|
582
|
+
opdt_sh_order_max=8):
|
|
583
583
|
"""
|
|
584
584
|
full path to a nifti file containing
|
|
585
585
|
parameters for the Orientation Probability Density Transform
|
|
@@ -592,7 +592,7 @@ def opdt_params(base_fname, data, gtab,
|
|
|
592
592
|
Spherical harmonics order for OPDT model. Must be even.
|
|
593
593
|
Default: 8
|
|
594
594
|
"""
|
|
595
|
-
opdt_model = shm.OpdtModel(gtab,
|
|
595
|
+
opdt_model = shm.OpdtModel(gtab, opdt_sh_order_max)
|
|
596
596
|
opdt_fit = opdt_model.fit(data, mask=brain_mask)
|
|
597
597
|
|
|
598
598
|
params_suffix = "_model-OPDT_param-fod_dwimap.nii.gz"
|
|
@@ -602,7 +602,7 @@ def opdt_params(base_fname, data, gtab,
|
|
|
602
602
|
get_fname(base_fname,
|
|
603
603
|
f"{drop_extension(params_suffix)}.json",
|
|
604
604
|
"models"),
|
|
605
|
-
dict(
|
|
605
|
+
dict(sh_order_max=opdt_sh_order_max)
|
|
606
606
|
)
|
|
607
607
|
|
|
608
608
|
GFA_suffix = "_model-OPDT_param-GFA_dwimap.nii.gz"
|
|
@@ -610,7 +610,7 @@ def opdt_params(base_fname, data, gtab,
|
|
|
610
610
|
nib.save(nib.Nifti1Image(opdt_fit.gfa, dwi_affine), GFA_fname)
|
|
611
611
|
write_json(
|
|
612
612
|
get_fname(base_fname, f"{drop_extension(GFA_suffix)}.json", "models"),
|
|
613
|
-
dict(
|
|
613
|
+
dict(sh_order_max=opdt_sh_order_max)
|
|
614
614
|
)
|
|
615
615
|
|
|
616
616
|
return params_fname, GFA_fname
|
|
@@ -647,7 +647,7 @@ def opdt_ai(opdt_params):
|
|
|
647
647
|
@pimms.calc("csa_params", "csa_gfa")
|
|
648
648
|
def csa_params(base_fname, data, gtab,
|
|
649
649
|
dwi_affine, brain_mask,
|
|
650
|
-
|
|
650
|
+
csa_sh_order_max=8):
|
|
651
651
|
"""
|
|
652
652
|
full path to a nifti file containing
|
|
653
653
|
parameters for the Constant Solid Angle
|
|
@@ -660,7 +660,7 @@ def csa_params(base_fname, data, gtab,
|
|
|
660
660
|
Spherical harmonics order for CSA model. Must be even.
|
|
661
661
|
Default: 8
|
|
662
662
|
"""
|
|
663
|
-
csa_model = shm.CsaOdfModel(gtab,
|
|
663
|
+
csa_model = shm.CsaOdfModel(gtab, csa_sh_order_max)
|
|
664
664
|
csa_fit = csa_model.fit(data, mask=brain_mask)
|
|
665
665
|
|
|
666
666
|
params_suffix = "_model-csa_param-fod_dwimap.nii.gz"
|
|
@@ -670,7 +670,7 @@ def csa_params(base_fname, data, gtab,
|
|
|
670
670
|
get_fname(base_fname,
|
|
671
671
|
f"{drop_extension(params_suffix)}.json",
|
|
672
672
|
"models"),
|
|
673
|
-
dict(
|
|
673
|
+
dict(sh_order_max=csa_sh_order_max)
|
|
674
674
|
)
|
|
675
675
|
|
|
676
676
|
GFA_suffix = "_model-csa_param-gfa_dwimap.nii.gz"
|
|
@@ -681,7 +681,7 @@ def csa_params(base_fname, data, gtab,
|
|
|
681
681
|
base_fname,
|
|
682
682
|
f"{drop_extension(GFA_suffix)}.json",
|
|
683
683
|
"models"),
|
|
684
|
-
dict(
|
|
684
|
+
dict(sh_order_max=csa_sh_order_max)
|
|
685
685
|
)
|
|
686
686
|
|
|
687
687
|
return params_fname, GFA_fname
|
|
@@ -1081,8 +1081,7 @@ def brain_mask(b0, brain_mask_definition=None):
|
|
|
1081
1081
|
|
|
1082
1082
|
|
|
1083
1083
|
@pimms.calc("bundle_dict", "reg_template", "tmpl_name")
|
|
1084
|
-
def get_bundle_dict(
|
|
1085
|
-
brain_mask, b0,
|
|
1084
|
+
def get_bundle_dict(brain_mask, b0,
|
|
1086
1085
|
bundle_info=None, reg_template_spec="mni_T1",
|
|
1087
1086
|
reg_template_space_name="mni"):
|
|
1088
1087
|
"""
|
|
@@ -1157,6 +1156,9 @@ def get_bundle_dict(segmentation_params,
|
|
|
1157
1156
|
bundle_info,
|
|
1158
1157
|
resample_to=reg_template)
|
|
1159
1158
|
|
|
1159
|
+
if bundle_dict.resample_subject_to is None:
|
|
1160
|
+
bundle_dict.resample_subject_to = b0
|
|
1161
|
+
|
|
1160
1162
|
return bundle_dict, reg_template, reg_template_space_name
|
|
1161
1163
|
|
|
1162
1164
|
|
|
@@ -143,9 +143,11 @@ def as_file(suffix, include_track=False, include_seg=False, subfolder=None):
|
|
|
143
143
|
this_file = this_file + ".trk"
|
|
144
144
|
|
|
145
145
|
if not op.exists(this_file):
|
|
146
|
+
logger.info(f"Calculating {suffix}")
|
|
147
|
+
|
|
146
148
|
gen, meta = func(*args[:og_arg_count], **kwargs)
|
|
147
149
|
|
|
148
|
-
logger.info(f"Saving {this_file}")
|
|
150
|
+
logger.info(f"{suffix} completed. Saving to {this_file}")
|
|
149
151
|
if isinstance(gen, nib.Nifti1Image):
|
|
150
152
|
nib.save(gen, this_file)
|
|
151
153
|
elif isinstance(gen, StatefulTractogram):
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import nibabel as nib
|
|
2
|
+
import numpy as np
|
|
2
3
|
import os.path as op
|
|
3
4
|
import logging
|
|
4
5
|
|
|
@@ -84,16 +85,21 @@ def export_rois(base_fname, output_dir, dwi_data_file, data_imap, mapping):
|
|
|
84
85
|
to_space = space_from_fname(dwi_data_file)
|
|
85
86
|
for bundle_name in bundle_dict:
|
|
86
87
|
roi_files[bundle_name] = []
|
|
87
|
-
for roi_fname in bundle_dict.transform_rois(
|
|
88
|
+
for roi, roi_fname in zip(*bundle_dict.transform_rois(
|
|
88
89
|
bundle_name, mapping, data_imap["dwi_affine"],
|
|
89
90
|
base_fname=base_roi_fname,
|
|
90
|
-
to_space=to_space):
|
|
91
|
-
logger.info(f"Saving {roi_fname}")
|
|
91
|
+
to_space=to_space)):
|
|
92
92
|
roi_files[bundle_name].append(roi_fname)
|
|
93
|
-
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
if not op.exists(roi_fname):
|
|
94
|
+
logger.info(f"Saving {roi_fname}")
|
|
95
|
+
nib.save(
|
|
96
|
+
nib.Nifti1Image(
|
|
97
|
+
roi.get_fdata().astype(np.float32),
|
|
98
|
+
roi.affine), roi_fname)
|
|
99
|
+
meta = {
|
|
100
|
+
"Bundle Definition": bundle_dict.get_b_info(bundle_name)}
|
|
101
|
+
meta_fname = f'{drop_extension(roi_fname)}.json'
|
|
102
|
+
write_json(meta_fname, meta)
|
|
97
103
|
return {'rois': roi_files}
|
|
98
104
|
|
|
99
105
|
|