pyAFQ 2.0__tar.gz → 2.0.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.0.1}/AFQ/api/bundle_dict.py +3 -1
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/participant.py +1 -1
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/utils.py +21 -8
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/fetch.py +7 -1
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/criteria.py +15 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/data.py +6 -4
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/segmentation.py +8 -2
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/tractography.py +2 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/viz.py +1 -1
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_api.py +1 -1
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/gputractography.py +7 -5
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/bin.py +4 -5
- pyafq-2.0.1/AFQ/utils/docstring_parser.py +123 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/path.py +12 -9
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/version.py +2 -2
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/utils.py +4 -0
- {pyafq-2.0 → pyafq-2.0.1}/CHANGES.rst +34 -0
- {pyafq-2.0/pyAFQ.egg-info → pyafq-2.0.1}/PKG-INFO +4 -4
- pyafq-2.0.1/docs/source/howto/usage/cleaning_params.rst +35 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/index.rst +3 -0
- pyafq-2.0.1/docs/source/howto/usage/segmentation_params.rst +33 -0
- pyafq-2.0.1/docs/source/howto/usage/tractography_params.rst +34 -0
- pyafq-2.0.1/docs/source/reference/kwargs.rst +158 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/methods.rst +43 -3
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/add_custom_bundle.py +4 -3
- pyafq-2.0.1/examples/howto_examples/run_pyAFQ_with_GPU.py +48 -0
- pyafq-2.0/examples/tutorial_examples/plot_001_afq_api.py → pyafq-2.0.1/examples/tutorial_examples/plot_001_group_afq_api.py +5 -4
- pyafq-2.0.1/examples/tutorial_examples/plot_002_participant_afq_api.py +215 -0
- pyafq-2.0.1/examples/tutorial_examples/plot_003_rerun.py +145 -0
- pyafq-2.0.1/examples/tutorial_examples/plot_004_export.py +172 -0
- pyafq-2.0/examples/tutorial_examples/plot_003_viz.py → pyafq-2.0.1/examples/tutorial_examples/plot_005_viz.py +57 -7
- {pyafq-2.0 → pyafq-2.0.1/pyAFQ.egg-info}/PKG-INFO +4 -4
- {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/SOURCES.txt +14 -6
- {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/requires.txt +1 -2
- {pyafq-2.0 → pyafq-2.0.1}/setup.cfg +1 -2
- pyafq-2.0/docs/source/reference/kwargs.rst +0 -268
- {pyafq-2.0 → pyafq-2.0.1}/.github/CITATION.cff +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/CONTRIBUTING.md +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docbuild.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docker_pyafq.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_anisotropic_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_basic_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_custom_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_pft_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_reco80_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_reco_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/test.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.gitignore +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.mailmap +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.maintenance/update_changes.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.maintenance/update_zenodo.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.pep8speaks.yml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/.zenodo.json +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/_fixes.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/group.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/image.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/mapping.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/QBallTP.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/csd.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/dki.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/dti.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/fwdti.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/cleaning.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/curvature.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/other_bundles.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/preprocess.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/recognize.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/roi.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_other_bundles.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_rois.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/registration.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/decorators.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/mapping.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-2.0 → pyafq-2.0.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.0.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.0.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.0.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.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_bundle_dict.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_csd.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_data.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_definitions.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_dki.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_dti.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_fixes.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_registration.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_tractography.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_viz.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/tractography.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/utils.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/conversion.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/docs.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/models.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/stats.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/streamlines.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/testing.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_streamlines.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/volume.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/__init__.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/altair.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/fury_backend.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/plot.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/plotly_backend.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/CITATION +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/LICENSE +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/MANIFEST.in +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/Makefile +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/README.md +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/bin/pyAFQ +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/Makefile +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_progressbars.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/custom.css +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/logo.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/_templates/layout.html +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/conf.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/down_left_arrow.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/down_right_arrow.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/greencheck.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_modeling2.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_profiling.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_recognition.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_tractography.png +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/bundle_orientation.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/modeling.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/tractography.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/tractometry_pipeline.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/cite.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/contributing.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/definitions.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/releasing.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/tasks.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/getting_help.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/installation_guide.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/converter.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/data.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/docker.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/image.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/kwargs.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/methods.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/scalars.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/singularity.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/bundledict.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/mapping.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/viz_backend.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/source/tutorials/index.rst +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/docs/upload-gh-pages.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/README.rst +0 -0
- /pyafq-2.0/examples/howto_examples/plot_acoustic_radiations.py → /pyafq-2.0.1/examples/howto_examples/acoustic_radiations.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/baby_afq.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cerebellar_peduncles.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cloudknot_example.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
- /pyafq-2.0/examples/howto_examples/plot_optic_radiations.py → /pyafq-2.0.1/examples/howto_examples/optic_radiations.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_afq_callosal.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_recobundles.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
- /pyafq-2.0/examples/howto_examples/plot_afq_fwdti.py → /pyafq-2.0.1/examples/howto_examples/run_afq_fwdti.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/vof_example.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/examples/tutorial_examples/README.rst +0 -0
- /pyafq-2.0/examples/tutorial_examples/plot_002_bids_layout.py → /pyafq-2.0.1/examples/tutorial_examples/plot_006_bids_layout.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/Dockerfile +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/cuda_build.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/cuda_track_template.def +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/docker-build.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/docker-push.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/Dockerfile +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/pyproject.toml +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/setup.py +0 -0
- {pyafq-2.0 → pyafq-2.0.1}/tox.ini +0 -0
|
@@ -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
|
|
@@ -156,7 +156,7 @@ class ParticipantAFQ(object):
|
|
|
156
156
|
|
|
157
157
|
def export_up_to(self, attr_name="help"):
|
|
158
158
|
f"""
|
|
159
|
-
Export all derivatives
|
|
159
|
+
Export all derivatives up to, but not including, the specified output.
|
|
160
160
|
To print a list of available outputs,
|
|
161
161
|
call export_up_to without arguments.
|
|
162
162
|
{valid_exports_string}
|
|
@@ -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(
|
|
@@ -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(
|
|
@@ -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(
|
|
@@ -86,8 +86,8 @@ 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,
|
|
90
|
-
b0_threshold=b0_threshold)
|
|
89
|
+
bvals = bvals, bvecs = bvecs,
|
|
90
|
+
b0_threshold = b0_threshold)
|
|
91
91
|
img = nib.Nifti1Image(data, img.affine)
|
|
92
92
|
return data, gtab, img, img.affine
|
|
93
93
|
|
|
@@ -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
|
|
|
@@ -80,6 +80,11 @@ def segment(data_imap, mapping_imap,
|
|
|
80
80
|
temp_tck, data_imap["dwi"], Space.VOX,
|
|
81
81
|
bbox_valid_check=False)
|
|
82
82
|
is_trx = False
|
|
83
|
+
if len(tg.streamlines) == 0:
|
|
84
|
+
raise ValueError(f"There are no streamlines in {streamlines}."
|
|
85
|
+
" This is likely due to errors in defining the "
|
|
86
|
+
" tractography parameters or the"
|
|
87
|
+
" seed/stop masks.")
|
|
83
88
|
|
|
84
89
|
indices_to_remove, _ = tg.remove_invalid_streamlines()
|
|
85
90
|
if len(indices_to_remove) > 0:
|
|
@@ -382,8 +387,9 @@ def get_scalar_dict(data_imap, mapping_imap, scalars=["dti_fa", "dti_md"]):
|
|
|
382
387
|
List of scalars to use.
|
|
383
388
|
Can be any of: "dti_fa", "dti_md", "dki_fa", "dki_md", "dki_awf",
|
|
384
389
|
"dki_mk". Can also be a scalar from AFQ.definitions.image.
|
|
385
|
-
|
|
386
|
-
for multi-shell data
|
|
390
|
+
Defaults for single shell data to ["dti_fa", "dti_md"],
|
|
391
|
+
and for multi-shell data to ["dki_fa", "dki_md"].
|
|
392
|
+
Default: ['dti_fa', 'dti_md']
|
|
387
393
|
"""
|
|
388
394
|
# Note: some scalars preprocessing done in plans, before this step
|
|
389
395
|
scalar_dict = {}
|
|
@@ -351,6 +351,8 @@ def gpu_tractography(data_imap, tracking_params, fodf, seed, stop,
|
|
|
351
351
|
if tracking_params["directions"] == "boot":
|
|
352
352
|
data = data_imap["data"]
|
|
353
353
|
else:
|
|
354
|
+
if isinstance(fodf, str):
|
|
355
|
+
fodf = nib.load(fodf)
|
|
354
356
|
data = fodf.get_fdata()
|
|
355
357
|
|
|
356
358
|
sphere = tracking_params["sphere"]
|
|
@@ -365,7 +365,7 @@ def init_viz_backend(viz_backend_spec="plotly_no_gif",
|
|
|
365
365
|
generating GIFs in a headless environment. Default: False
|
|
366
366
|
viz_backend_spec : str, optional
|
|
367
367
|
Which visualization backend to use.
|
|
368
|
-
See Visualization Backends page in documentation for details
|
|
368
|
+
See Visualization Backends page in documentation for details
|
|
369
369
|
https://tractometry.org/pyAFQ/usage/viz_backend.html
|
|
370
370
|
One of {"fury", "plotly", "plotly_no_gif"}.
|
|
371
371
|
Default: "plotly_no_gif"
|
|
@@ -32,7 +32,7 @@ import AFQ.utils.streamlines as aus
|
|
|
32
32
|
import AFQ.utils.bin as afb
|
|
33
33
|
from AFQ.definitions.mapping import SynMap, AffMap, SlrMap, IdentityMap
|
|
34
34
|
from AFQ.definitions.image import (RoiImage, PFTImage, ImageFile,
|
|
35
|
-
TemplateImage
|
|
35
|
+
TemplateImage)
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
def touch(fname, times=None):
|
|
@@ -141,10 +141,12 @@ def gpu_track(data, gtab, seed_img, stop_img,
|
|
|
141
141
|
step_size,
|
|
142
142
|
0.25, # relative peak threshold
|
|
143
143
|
radians(45), # min separation angle
|
|
144
|
-
|
|
144
|
+
np.ascontiguousarray(data).astype(np.float64),
|
|
145
|
+
H.astype(np.float64), R.astype(np.float64),
|
|
145
146
|
delta_b.astype(np.float64), delta_q.astype(np.float64),
|
|
146
|
-
b0s_mask.astype(np.int32),
|
|
147
|
-
|
|
147
|
+
b0s_mask.astype(np.int32),
|
|
148
|
+
np.ascontiguousarray(stop_data).astype(np.float64),
|
|
149
|
+
sampling_matrix.astype(np.float64),
|
|
148
150
|
sphere.vertices.astype(np.float64), sphere.edges.astype(np.int32),
|
|
149
151
|
ngpus=ngpus, rng_seed=0)
|
|
150
152
|
|
|
@@ -162,7 +164,7 @@ def gpu_track(data, gtab, seed_img, stop_img,
|
|
|
162
164
|
# Will resize by a factor of 2 if these are exceeded
|
|
163
165
|
sl_len_guess = 100
|
|
164
166
|
sl_per_seed_guess = 3
|
|
165
|
-
n_sls_guess = sl_per_seed_guess *
|
|
167
|
+
n_sls_guess = sl_per_seed_guess * seeds.shape[0]
|
|
166
168
|
|
|
167
169
|
# trx files use memory mapping
|
|
168
170
|
trx_file = TrxFile(
|
|
@@ -193,7 +195,7 @@ def gpu_track(data, gtab, seed_img, stop_img,
|
|
|
193
195
|
# TRX uses memmaps here
|
|
194
196
|
trx_file.streamlines._data[sls_data_idx:new_sls_data_idx] = sls._data
|
|
195
197
|
trx_file.streamlines._offsets[offsets_idx:
|
|
196
|
-
new_offsets_idx] =
|
|
198
|
+
new_offsets_idx] = sls_data_idx + sls._offsets
|
|
197
199
|
trx_file.streamlines._lengths[offsets_idx:new_offsets_idx] = sls._lengths
|
|
198
200
|
|
|
199
201
|
offsets_idx = new_offsets_idx
|
|
@@ -4,13 +4,13 @@ import platform
|
|
|
4
4
|
import os.path as op
|
|
5
5
|
|
|
6
6
|
from argparse import ArgumentParser
|
|
7
|
-
from funcargparse import FuncArgParser
|
|
8
7
|
|
|
9
8
|
from AFQ.definitions.image import * # interprets masks loaded from toml
|
|
10
9
|
from AFQ.definitions.mapping import * # interprets mappings loaded from toml
|
|
11
10
|
from AFQ.api.bundle_dict import * # interprets bundle_dicts loaded from toml
|
|
12
11
|
from AFQ.definitions.utils import Definition
|
|
13
12
|
from AFQ.api.utils import kwargs_descriptors
|
|
13
|
+
from AFQ.utils.docstring_parser import parse_numpy_docstring
|
|
14
14
|
|
|
15
15
|
import nibabel as nib # allows users to input nibabel objects
|
|
16
16
|
|
|
@@ -178,11 +178,10 @@ def func_dict_to_arg_dict(func_dict=None, logger=None):
|
|
|
178
178
|
|
|
179
179
|
arg_dict = {}
|
|
180
180
|
for name, func in func_dict.items():
|
|
181
|
-
|
|
182
|
-
docstr_parser.setup_args(func)
|
|
181
|
+
docstr_parsed = parse_numpy_docstring(func)
|
|
183
182
|
if name == "BIDS":
|
|
184
|
-
arg_dict["AFQ_desc"] =
|
|
185
|
-
for arg, info in
|
|
183
|
+
arg_dict["AFQ_desc"] = docstr_parsed["description"]
|
|
184
|
+
for arg, info in docstr_parsed["arguments"].items():
|
|
186
185
|
try:
|
|
187
186
|
section = name.upper() + "_PARAMS"
|
|
188
187
|
desc = info['help']
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import inspect
|
|
3
|
+
|
|
4
|
+
__all__ = ["parse_numpy_docstring"]
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def _white_space(text):
|
|
8
|
+
if text is None:
|
|
9
|
+
return None
|
|
10
|
+
else:
|
|
11
|
+
return re.sub(r'[\n\t\s]+', ' ', text).strip()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _split_parameter_blocks(docstring):
|
|
15
|
+
# First extract just the Parameters section
|
|
16
|
+
params_section = re.search(
|
|
17
|
+
r'Parameters\n-+\n(.*?)(?=\n\s*\n|\n-+\n|\Z)',
|
|
18
|
+
docstring,
|
|
19
|
+
re.DOTALL
|
|
20
|
+
)
|
|
21
|
+
if not params_section:
|
|
22
|
+
return []
|
|
23
|
+
|
|
24
|
+
params_text = params_section.group(1)
|
|
25
|
+
params_text = re.sub(r'\n-+$', '', params_text)
|
|
26
|
+
lines = params_text.split('\n')
|
|
27
|
+
|
|
28
|
+
# Find base indentation (minimum indent of parameter lines)
|
|
29
|
+
base_indent = float('inf')
|
|
30
|
+
for line in lines:
|
|
31
|
+
if re.match(r'\S', line):
|
|
32
|
+
indent = len(re.match(r'^\s*', line).group())
|
|
33
|
+
base_indent = min(base_indent, indent)
|
|
34
|
+
|
|
35
|
+
if base_indent == float('inf'):
|
|
36
|
+
return []
|
|
37
|
+
|
|
38
|
+
# Split into blocks
|
|
39
|
+
param_blocks = []
|
|
40
|
+
current_block = []
|
|
41
|
+
|
|
42
|
+
for line in lines:
|
|
43
|
+
line_indent = len(re.match(r'^\s*', line).group())
|
|
44
|
+
if line_indent == base_indent and re.match(r'\S', line):
|
|
45
|
+
if current_block:
|
|
46
|
+
param_blocks.append('\n'.join(current_block))
|
|
47
|
+
current_block = []
|
|
48
|
+
current_block.append(line)
|
|
49
|
+
|
|
50
|
+
if current_block:
|
|
51
|
+
param_blocks.append('\n'.join(current_block))
|
|
52
|
+
|
|
53
|
+
return param_blocks
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def parse_numpy_docstring(docstring):
|
|
57
|
+
"""
|
|
58
|
+
Parse a NumPy-style docstring into parameter information.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
dict: {
|
|
62
|
+
"description": str (first section of docstring),
|
|
63
|
+
"arguments": {
|
|
64
|
+
param_name: {
|
|
65
|
+
"help": str (description),
|
|
66
|
+
"metavar": str (type),
|
|
67
|
+
"default": any (default value)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
"""
|
|
72
|
+
if callable(docstring):
|
|
73
|
+
docstring = inspect.getdoc(docstring)
|
|
74
|
+
|
|
75
|
+
if not docstring:
|
|
76
|
+
return {"description": "", "arguments": {}}
|
|
77
|
+
|
|
78
|
+
# Find the description section
|
|
79
|
+
sections = re.split(r'\n\s*\n', docstring.strip())
|
|
80
|
+
description = sections[0].strip()
|
|
81
|
+
|
|
82
|
+
# Find the parameters section
|
|
83
|
+
param_blocks = _split_parameter_blocks(docstring)
|
|
84
|
+
params = {}
|
|
85
|
+
|
|
86
|
+
for block in param_blocks:
|
|
87
|
+
# Split into (param: value) and description
|
|
88
|
+
parts = block.split('\n', maxsplit=1)
|
|
89
|
+
if len(parts) == 0:
|
|
90
|
+
continue
|
|
91
|
+
|
|
92
|
+
# Parse the (param: value)
|
|
93
|
+
header_match = re.match(
|
|
94
|
+
r'(\w+)\s*:\s*([^,\n]+)(?:,\s*optional)?',
|
|
95
|
+
parts[0].strip()
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
if not header_match:
|
|
99
|
+
continue
|
|
100
|
+
|
|
101
|
+
name, type_info = header_match.groups()
|
|
102
|
+
desc = parts[1].strip() if len(parts) > 1 else ''
|
|
103
|
+
|
|
104
|
+
# Parse the description
|
|
105
|
+
default = None
|
|
106
|
+
default_match = re.search(r'[Dd]efault:\s*([^\n]+)', desc)
|
|
107
|
+
if default_match:
|
|
108
|
+
default = default_match.group(1).strip(" .")
|
|
109
|
+
try:
|
|
110
|
+
default = eval(default)
|
|
111
|
+
except:
|
|
112
|
+
default = _white_space(default)
|
|
113
|
+
|
|
114
|
+
params[name] = {
|
|
115
|
+
"help": _white_space(desc),
|
|
116
|
+
"metavar": _white_space(type_info),
|
|
117
|
+
"default": default
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
"description": _white_space(description),
|
|
122
|
+
"arguments": params
|
|
123
|
+
}
|
|
@@ -70,6 +70,9 @@ def apply_cmd_to_afq_derivs(
|
|
|
70
70
|
"dependent_on must be one of "
|
|
71
71
|
"None, 'track', 'recog', 'prof'."))
|
|
72
72
|
|
|
73
|
+
if cmd == "rm" or cmd == "cp":
|
|
74
|
+
cmd = cmd + " -r"
|
|
75
|
+
|
|
73
76
|
if not op.exists(derivs_dir):
|
|
74
77
|
return
|
|
75
78
|
|
|
@@ -92,23 +95,23 @@ def apply_cmd_to_afq_derivs(
|
|
|
92
95
|
os.system(f"{cmd} {full_path} {suffix}")
|
|
93
96
|
elif os.path.isdir(full_path):
|
|
94
97
|
if dependent_on is None:
|
|
95
|
-
os.system(f"{cmd}
|
|
98
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
96
99
|
else:
|
|
97
100
|
if filename == "ROIs" and "rec" in dependent_on_list:
|
|
98
|
-
os.system(f"{cmd}
|
|
101
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
99
102
|
if filename == "stats" and "rec" in dependent_on_list:
|
|
100
|
-
os.system(f"{cmd}
|
|
103
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
101
104
|
if filename == "tractography" and "trk" in dependent_on_list:
|
|
102
|
-
os.system(f"{cmd}
|
|
105
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
103
106
|
if filename == "models" and "dwi" in dependent_on_list:
|
|
104
|
-
os.system(f"{cmd}
|
|
107
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
105
108
|
if filename == "bundles" and "rec" in dependent_on_list:
|
|
106
|
-
os.system(f"{cmd}
|
|
109
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
107
110
|
if filename == "viz_bundles" and "rec" in dependent_on_list:
|
|
108
|
-
os.system(f"{cmd}
|
|
111
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
109
112
|
if filename == "viz_core_bundles" and \
|
|
110
113
|
"prof" in dependent_on_list:
|
|
111
|
-
os.system(f"{cmd}
|
|
114
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
112
115
|
if filename == "tract_profile_plots" and \
|
|
113
116
|
"prof" in dependent_on_list:
|
|
114
|
-
os.system(f"{cmd}
|
|
117
|
+
os.system(f"{cmd} {full_path} {suffix}")
|
|
@@ -261,6 +261,10 @@ class PanelFigure():
|
|
|
261
261
|
self.fig.canvas.draw()
|
|
262
262
|
for (y_coord, x_coord, subplot_label_pos, label_text, kwargs) in \
|
|
263
263
|
self.panel_label_queue:
|
|
264
|
+
if isinstance(x_coord, slice):
|
|
265
|
+
x_coord = x_coord.start
|
|
266
|
+
if isinstance(y_coord, slice):
|
|
267
|
+
y_coord = y_coord.start
|
|
264
268
|
x_fig_pos = x_coord / self.grid.ncols
|
|
265
269
|
y_fig_pos = 1.0 - (y_coord / self.grid.nrows)
|
|
266
270
|
self.fig.text(
|
|
@@ -1,3 +1,37 @@
|
|
|
1
|
+
2.0.1 (May 15, 2025)
|
|
2
|
+
====================
|
|
3
|
+
Minor Fixes to VOF, ROI dists, baby BD primary axis filtering, import_tract
|
|
4
|
+
with trx files. Increase in number of examples in docs.
|
|
5
|
+
* [DOC] update broken references (#90)
|
|
6
|
+
* Add track, segment, cleaning explanation (#87)
|
|
7
|
+
* [DOC] How to Export examples (#86)
|
|
8
|
+
* [DOC] Add GPU, clobber docs (#82)
|
|
9
|
+
* [DOC] ParticipantAFQ example (#83)
|
|
10
|
+
* Small docs/viz tool improvements (#62)
|
|
11
|
+
* [ENH] Make Subject Space ROIs Resample By Default (#72)
|
|
12
|
+
* Upgrade DIPY dependency. (#76)
|
|
13
|
+
* Remove funcargparser dependency, replace with extreme regex (#80)
|
|
14
|
+
* RF: Better error handling. (#68)
|
|
15
|
+
* update reference in example (#75)
|
|
16
|
+
* [FIX] recently added typo in pyAFQ GPU integration (#74)
|
|
17
|
+
* DOC: Adds an example of tract profile visualization with "glass brain". (#67)
|
|
18
|
+
* remove dependencies; clarify <3.13 for now (#66)
|
|
19
|
+
* Loosen skimage dependency pin to be larger than 0.14.2 (#61)
|
|
20
|
+
* [FIX] make import_tract work better with TRX files (#54)
|
|
21
|
+
* Remove numpy version restrictions (#53)
|
|
22
|
+
* Further tweaks to new file system (#50)
|
|
23
|
+
* [FIX] change helvetica-bold to helvetica in pyAFQ plotting library (#49)
|
|
24
|
+
* (#48)
|
|
25
|
+
* [ENH/FIX] Pyafq file outputs more folders, more BIDS (#43)
|
|
26
|
+
* [ENH] Include custom ODFs (#33)
|
|
27
|
+
* [ENH] update to numpy 2 (#46)
|
|
28
|
+
* [ENH] update to 3.12 (#45)
|
|
29
|
+
* [FIX] fix VOF (#29)
|
|
30
|
+
* [DOC] added singularity build and usage (#28)
|
|
31
|
+
* [ENH] Use Distance Transform for Include/Exclude Distance calculation; fix ROI dists (#25)
|
|
32
|
+
* DOC: Document the significance of ROIS order in BundleDict (#27)
|
|
33
|
+
* [FIX] update baby BD to new primary axis api (#26)
|
|
34
|
+
|
|
1
35
|
2.0 (February 25, 2025)
|
|
2
36
|
=======================
|
|
3
37
|
This is a major version release, which includes support for Python 3.12 and
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: pyAFQ
|
|
3
|
-
Version: 2.0
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: pyAFQ: Automated Fiber Quantification ... in Python
|
|
5
5
|
Home-page: https://tractometry.github.io/pyAFQ
|
|
6
6
|
Download-URL: https://github.com/tractometry/pyAFQ
|
|
@@ -21,7 +21,7 @@ Requires-Python: <3.13,>=3.10
|
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
23
|
Requires-Dist: scikit_image>=0.14.2
|
|
24
|
-
Requires-Dist: dipy<1.
|
|
24
|
+
Requires-Dist: dipy<1.12.0,>=1.11.0
|
|
25
25
|
Requires-Dist: pandas
|
|
26
26
|
Requires-Dist: pybids>=0.16.2
|
|
27
27
|
Requires-Dist: templateflow>=0.8
|
|
@@ -31,7 +31,6 @@ Requires-Dist: trx-python
|
|
|
31
31
|
Requires-Dist: ray
|
|
32
32
|
Requires-Dist: toml>=0.10.0
|
|
33
33
|
Requires-Dist: setuptools_scm[toml]<5.1.0,>=3.4.0
|
|
34
|
-
Requires-Dist: funcargparse>=0.2.0
|
|
35
34
|
Requires-Dist: plotly==5.12.0
|
|
36
35
|
Requires-Dist: kaleido==0.2.1
|
|
37
36
|
Requires-Dist: imageio>=2.0.0
|
|
@@ -104,6 +103,7 @@ Requires-Dist: s3bids>=0.1.7; extra == "all"
|
|
|
104
103
|
Requires-Dist: s3fs; extra == "all"
|
|
105
104
|
Requires-Dist: boto3>=1.14.0; extra == "all"
|
|
106
105
|
Dynamic: download-url
|
|
106
|
+
Dynamic: license-file
|
|
107
107
|
|
|
108
108
|
# pyAFQ
|
|
109
109
|
Automated Fiber Quantification ... in Python.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
==========================
|
|
2
|
+
Cleaning Parameters
|
|
3
|
+
==========================
|
|
4
|
+
|
|
5
|
+
This page documents the configuration options for controlling
|
|
6
|
+
bundle cleaning in pyAFQ. These parameters can be set in your
|
|
7
|
+
configuration file or passed as arguments when using the API.
|
|
8
|
+
Note that this goes inside of segmentation_params.
|
|
9
|
+
|
|
10
|
+
Example Usage
|
|
11
|
+
=============
|
|
12
|
+
|
|
13
|
+
.. code-block:: python
|
|
14
|
+
|
|
15
|
+
from AFQ.api.group import GroupAFQ
|
|
16
|
+
import AFQ.data.fetch as afd
|
|
17
|
+
import os.path as op
|
|
18
|
+
|
|
19
|
+
afd.organize_stanford_data()
|
|
20
|
+
|
|
21
|
+
myafq = GroupAFQ(
|
|
22
|
+
bids_path=op.join(afd.afq_home, 'stanford_hardi'),
|
|
23
|
+
preproc_pipeline='vistasoft',
|
|
24
|
+
segmentation_params=dict(
|
|
25
|
+
cleaning_params=dict(
|
|
26
|
+
distance_threshold=5,
|
|
27
|
+
length_threshold=5, # More lenient cleaning
|
|
28
|
+
))
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
Cleaning Parameter Reference
|
|
32
|
+
================================
|
|
33
|
+
|
|
34
|
+
.. autofunction:: AFQ.recognition.cleaning.clean_bundle
|
|
35
|
+
:noindex:
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
==========================
|
|
2
|
+
Segmentation Parameters
|
|
3
|
+
==========================
|
|
4
|
+
|
|
5
|
+
This page documents the configuration options for controlling
|
|
6
|
+
tractography in pyAFQ. These parameters can be set in your
|
|
7
|
+
configuration file or passed as arguments when using the API.
|
|
8
|
+
|
|
9
|
+
Example Usage
|
|
10
|
+
=============
|
|
11
|
+
|
|
12
|
+
.. code-block:: python
|
|
13
|
+
|
|
14
|
+
from AFQ.api.group import GroupAFQ
|
|
15
|
+
import AFQ.data.fetch as afd
|
|
16
|
+
import os.path as op
|
|
17
|
+
|
|
18
|
+
afd.organize_stanford_data()
|
|
19
|
+
|
|
20
|
+
myafq = GroupAFQ(
|
|
21
|
+
bids_path=op.join(afd.afq_home, 'stanford_hardi'),
|
|
22
|
+
preproc_pipeline='vistasoft',
|
|
23
|
+
segmentation_params=dict(
|
|
24
|
+
dist_to_waypoint=10,
|
|
25
|
+
dist_to_atlas=10)
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
Segmentation Parameter Reference
|
|
30
|
+
================================
|
|
31
|
+
|
|
32
|
+
.. autofunction:: AFQ.recognition.recognize.recognize
|
|
33
|
+
:noindex:
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
==========================
|
|
2
|
+
Tractography Parameters
|
|
3
|
+
==========================
|
|
4
|
+
|
|
5
|
+
This page documents the configuration options for controlling
|
|
6
|
+
tractography in pyAFQ. These parameters can be set in your configuration file
|
|
7
|
+
or passed as arguments when using the API.
|
|
8
|
+
|
|
9
|
+
Example Usage
|
|
10
|
+
=============
|
|
11
|
+
|
|
12
|
+
.. code-block:: python
|
|
13
|
+
|
|
14
|
+
from AFQ.api.group import GroupAFQ
|
|
15
|
+
import AFQ.data.fetch as afd
|
|
16
|
+
import os.path as op
|
|
17
|
+
|
|
18
|
+
afd.organize_stanford_data()
|
|
19
|
+
|
|
20
|
+
myafq = GroupAFQ(
|
|
21
|
+
bids_path=op.join(afd.afq_home, 'stanford_hardi'),
|
|
22
|
+
preproc_pipeline='vistasoft',
|
|
23
|
+
tracking_params=dict(
|
|
24
|
+
n_seeds=25000,
|
|
25
|
+
random_seeds=True,
|
|
26
|
+
rng_seed=2025,
|
|
27
|
+
trx=True)
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
Tractography Parameter Reference
|
|
31
|
+
================================
|
|
32
|
+
|
|
33
|
+
.. autofunction:: AFQ.tractography.tractography.track
|
|
34
|
+
:noindex:
|