pyAFQ 1.3.6__tar.gz → 2.0__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-1.3.6 → pyafq-2.0}/.github/workflows/docbuild.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_anisotropic_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_basic_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_custom_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_pft_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_reco80_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_reco_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_test.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/publish-to-test-pypi.yml +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/test.yml +2 -2
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/bundle_dict.py +104 -57
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/group.py +28 -16
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/utils.py +2 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/fetch.py +38 -20
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/utils.py +10 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/image.py +34 -16
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/mapping.py +30 -19
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/utils.py +2 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/criteria.py +36 -36
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/other_bundles.py +7 -5
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/recognize.py +9 -9
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/roi.py +16 -18
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_rois.py +43 -37
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_utils.py +6 -6
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/utils.py +23 -18
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/data.py +130 -71
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/decorators.py +3 -7
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/mapping.py +54 -24
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/segmentation.py +39 -26
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/tractography.py +92 -35
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/utils.py +38 -1
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/viz.py +29 -67
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_api.py +10 -16
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_definitions.py +12 -4
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/tractography.py +33 -16
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/path.py +31 -2
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/version.py +9 -4
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/plot.py +16 -2
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/utils.py +32 -17
- {pyafq-1.3.6 → pyafq-2.0}/CHANGES.rst +36 -1
- {pyafq-1.3.6 → pyafq-2.0}/PKG-INFO +15 -16
- {pyafq-1.3.6 → pyafq-2.0}/bin/pyAFQ +0 -10
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/conf.py +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/installation_guide.rst +21 -0
- pyafq-2.0/docs/source/howto/usage/singularity.rst +16 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_optic_radiations.py +1 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_002_bids_layout.py +6 -7
- {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/Dockerfile +10 -6
- {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/cuda_track_template.def +11 -8
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/PKG-INFO +15 -16
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/SOURCES.txt +1 -1
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/requires.txt +12 -13
- {pyafq-1.3.6 → pyafq-2.0}/setup.cfg +9 -12
- pyafq-1.3.6/AFQ/afq_bids_entities.json +0 -22
- {pyafq-1.3.6 → pyafq-2.0}/.github/CITATION.cff +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.github/CONTRIBUTING.md +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/docker_pyafq.yml +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.gitignore +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.mailmap +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.maintenance/update_changes.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.maintenance/update_zenodo.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.pep8speaks.yml +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/.zenodo.json +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/_fixes.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/participant.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/QBallTP.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/csd.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/dki.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/dti.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/fwdti.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/cleaning.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/curvature.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/preprocess.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_other_bundles.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/registration.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_bundle_dict.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_csd.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_data.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_dki.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_dti.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_fixes.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_registration.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_tractography.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_viz.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/gputractography.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/utils.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/bin.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/conversion.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/docs.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/models.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/stats.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/streamlines.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/testing.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_streamlines.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/volume.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/__init__.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/altair.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/fury_backend.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/plotly_backend.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/CITATION +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/LICENSE +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/MANIFEST.in +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/Makefile +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/README.md +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/Makefile +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_progressbars.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/custom.css +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/logo.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/_templates/layout.html +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/down_left_arrow.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/down_right_arrow.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/greencheck.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_modeling2.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_profiling.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_recognition.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_tractography.png +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/bundle_orientation.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/modeling.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/tractography.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/tractometry_pipeline.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/cite.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/contributing.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/definitions.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/releasing.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/tasks.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/getting_help.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/converter.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/data.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/docker.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/image.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/kwargs.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/methods.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/scalars.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/bundledict.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/kwargs.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/mapping.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/methods.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/viz_backend.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/source/tutorials/index.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/docs/upload-gh-pages.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/README.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/add_custom_bundle.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/baby_afq.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cerebellar_peduncles.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cloudknot_example.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_acoustic_radiations.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_afq_callosal.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_afq_fwdti.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_recobundles.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/vof_example.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/README.rst +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_001_afq_api.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_003_viz.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/cuda_build.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/docker-build.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/docker-push.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/Dockerfile +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/pyproject.toml +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/setup.py +0 -0
- {pyafq-1.3.6 → pyafq-2.0}/tox.ini +0 -0
|
@@ -13,7 +13,7 @@ jobs:
|
|
|
13
13
|
strategy:
|
|
14
14
|
max-parallel: 4
|
|
15
15
|
matrix:
|
|
16
|
-
python-version: ["3.
|
|
16
|
+
python-version: ["3.10", "3.11", "3.12"]
|
|
17
17
|
nibabel-pre: [true, false]
|
|
18
18
|
|
|
19
19
|
steps:
|
|
@@ -33,7 +33,7 @@ jobs:
|
|
|
33
33
|
pip install --pre nibabel
|
|
34
34
|
- name: Check Dependencies
|
|
35
35
|
run: |
|
|
36
|
-
|
|
36
|
+
python -m pip check
|
|
37
37
|
- name: Lint
|
|
38
38
|
run: |
|
|
39
39
|
flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
|
|
@@ -5,6 +5,7 @@ import AFQ.data.fetch as afd
|
|
|
5
5
|
import AFQ.utils.volume as auv
|
|
6
6
|
from AFQ.tasks.utils import get_fname, str_to_desc
|
|
7
7
|
from AFQ.definitions.utils import find_file
|
|
8
|
+
from AFQ.utils.path import space_from_fname
|
|
8
9
|
|
|
9
10
|
import numpy as np
|
|
10
11
|
import nibabel as nib
|
|
@@ -481,7 +482,7 @@ def baby_bd():
|
|
|
481
482
|
"exclude": [templates["SLF_roi1_L"]],
|
|
482
483
|
"start": templates["pARC_L_start"],
|
|
483
484
|
"end": templates["VOF_box_small_L"],
|
|
484
|
-
"primary_axis":
|
|
485
|
+
"primary_axis": 'I/S',
|
|
485
486
|
"primary_axis_percentage": 40,
|
|
486
487
|
"cross_midline": False,
|
|
487
488
|
"mahal": {"distance_threshold": 4}},
|
|
@@ -490,21 +491,21 @@ def baby_bd():
|
|
|
490
491
|
"exclude": [templates["SLF_roi1_R"]],
|
|
491
492
|
"start": templates["pARC_R_start"],
|
|
492
493
|
"end": templates["VOF_box_small_R"],
|
|
493
|
-
"primary_axis":
|
|
494
|
+
"primary_axis": 'I/S',
|
|
494
495
|
"primary_axis_percentage": 40,
|
|
495
496
|
"cross_midline": False,
|
|
496
497
|
"mahal": {"distance_threshold": 4}},
|
|
497
498
|
'Left Vertical Occipital': {
|
|
498
499
|
"start": templates["VOF_L_start"],
|
|
499
500
|
"end": templates["VOF_box_small_L"],
|
|
500
|
-
"primary_axis":
|
|
501
|
+
"primary_axis": 'I/S',
|
|
501
502
|
"primary_axis_percentage": 40,
|
|
502
503
|
"cross_midline": False,
|
|
503
504
|
"mahal": {"distance_threshold": 4}},
|
|
504
505
|
'Right Vertical Occipital': {
|
|
505
506
|
"start": templates["VOF_R_start"],
|
|
506
507
|
"end": templates["VOF_box_small_R"],
|
|
507
|
-
"primary_axis":
|
|
508
|
+
"primary_axis": 'I/S',
|
|
508
509
|
"primary_axis_percentage": 40,
|
|
509
510
|
"cross_midline": False,
|
|
510
511
|
"mahal": {"distance_threshold": 4}}},
|
|
@@ -764,6 +765,14 @@ class BundleDict(MutableMapping):
|
|
|
764
765
|
"cross_midline": False
|
|
765
766
|
}
|
|
766
767
|
})
|
|
768
|
+
|
|
769
|
+
Note
|
|
770
|
+
----
|
|
771
|
+
The order of include ROIs may affect your results. This is
|
|
772
|
+
because ROI order within the include list determines the orientation of the
|
|
773
|
+
streamlines (from the first to the last) and the clipping of streamlines
|
|
774
|
+
when `clip_edges` is used, because the streamlines are clipped to
|
|
775
|
+
between the first and last ROIs.
|
|
767
776
|
"""
|
|
768
777
|
|
|
769
778
|
def __init__(self,
|
|
@@ -938,62 +947,16 @@ class BundleDict(MutableMapping):
|
|
|
938
947
|
resample_subject_to=self.resample_subject_to,
|
|
939
948
|
keep_in_memory=self.keep_in_memory)
|
|
940
949
|
|
|
941
|
-
def apply_to_rois(self, b_name,
|
|
942
|
-
dry_run=False, apply_to_recobundles=False,
|
|
943
|
-
**kwargs):
|
|
950
|
+
def apply_to_rois(self, b_name, *args, **kwargs):
|
|
944
951
|
"""
|
|
945
|
-
|
|
946
|
-
and the prob_map in a given bundle.
|
|
952
|
+
See: AFQ.api.bundle_dict.apply_to_roi_dict
|
|
947
953
|
|
|
948
954
|
Parameters
|
|
949
955
|
----------
|
|
950
956
|
b_name : name
|
|
951
957
|
bundle name of bundle whose ROIs will be transformed.
|
|
952
|
-
func : function
|
|
953
|
-
function whose first argument must be a Nifti1Image and which
|
|
954
|
-
returns a Nifti1Image
|
|
955
|
-
dry_run : bool
|
|
956
|
-
Whether to actually apply changes returned by `func` to the ROIs.
|
|
957
|
-
If has_return is False, dry_run is not used.
|
|
958
|
-
apply_to_recobundles : bool, optional
|
|
959
|
-
Whether to apply the transformation to recobundles
|
|
960
|
-
TRKs as well.
|
|
961
|
-
Default: False
|
|
962
|
-
|
|
963
|
-
*args :
|
|
964
|
-
Additional arguments for func
|
|
965
|
-
**kwargs
|
|
966
|
-
Optional arguments for func
|
|
967
|
-
|
|
968
|
-
Returns
|
|
969
|
-
-------
|
|
970
|
-
A dictionary where keys are
|
|
971
|
-
the roi type and values are the transformed ROIs.
|
|
972
958
|
"""
|
|
973
|
-
|
|
974
|
-
for roi_type in [
|
|
975
|
-
"include", "exclude",
|
|
976
|
-
"start", "end", "prob_map"]:
|
|
977
|
-
if roi_type in self._dict[b_name]:
|
|
978
|
-
if roi_type in ["start", "end", "prob_map"]:
|
|
979
|
-
return_vals[roi_type] = func(
|
|
980
|
-
self._dict[b_name][roi_type], *args, **kwargs)
|
|
981
|
-
else:
|
|
982
|
-
changed_rois = []
|
|
983
|
-
for _roi in self._dict[b_name][roi_type]:
|
|
984
|
-
changed_rois.append(func(
|
|
985
|
-
_roi, *args, **kwargs))
|
|
986
|
-
return_vals[roi_type] = changed_rois
|
|
987
|
-
if apply_to_recobundles and "recobundles" in self._dict[b_name]:
|
|
988
|
-
return_vals["recobundles"] = {}
|
|
989
|
-
for sl_type in ["sl", "centroid"]:
|
|
990
|
-
return_vals["recobundles"][sl_type] = func(
|
|
991
|
-
self._dict[b_name]["recobundles"][sl_type],
|
|
992
|
-
*args, **kwargs)
|
|
993
|
-
if not dry_run:
|
|
994
|
-
for roi_type, roi in return_vals.items():
|
|
995
|
-
self._dict[b_name][roi_type] = roi
|
|
996
|
-
return return_vals
|
|
959
|
+
return apply_to_roi_dict(self._dict[b_name], *args, **kwargs)
|
|
997
960
|
|
|
998
961
|
def _cond_load_bundle(self, b_name, dry_run=False):
|
|
999
962
|
"""
|
|
@@ -1035,7 +998,8 @@ class BundleDict(MutableMapping):
|
|
|
1035
998
|
return roi_or_sl
|
|
1036
999
|
|
|
1037
1000
|
def transform_rois(self, bundle_name, mapping, new_affine,
|
|
1038
|
-
base_fname=None,
|
|
1001
|
+
base_fname=None, to_space="subject",
|
|
1002
|
+
apply_to_recobundles=False):
|
|
1039
1003
|
"""
|
|
1040
1004
|
Get the bundle definition with transformed ROIs
|
|
1041
1005
|
for a given bundle into a
|
|
@@ -1056,6 +1020,10 @@ class BundleDict(MutableMapping):
|
|
|
1056
1020
|
Base file path to save ROIs too. Additional BIDS
|
|
1057
1021
|
descriptors will be added to this file path. If None,
|
|
1058
1022
|
do not save the ROIs.
|
|
1023
|
+
to_space : str, optional
|
|
1024
|
+
Name for space for exported ROIs. Only used if base_fname
|
|
1025
|
+
is not None.
|
|
1026
|
+
Default: "subject"
|
|
1059
1027
|
apply_to_recobundles : bool, optional
|
|
1060
1028
|
Whether to apply the transformation to recobundles
|
|
1061
1029
|
TRKs as well.
|
|
@@ -1088,14 +1056,29 @@ class BundleDict(MutableMapping):
|
|
|
1088
1056
|
if base_fname is not None:
|
|
1089
1057
|
fnames = []
|
|
1090
1058
|
for roi_type, rois in transformed_rois.items():
|
|
1059
|
+
if roi_type == "prob_map":
|
|
1060
|
+
suffix = "probseg"
|
|
1061
|
+
roi_type_name = ""
|
|
1062
|
+
else:
|
|
1063
|
+
suffix = "mask"
|
|
1064
|
+
roi_type_name = roi_type.lower().replace(
|
|
1065
|
+
" ", "").replace(
|
|
1066
|
+
"_", "").replace(
|
|
1067
|
+
"-", "")
|
|
1068
|
+
roi_type_name = roi_type_name[0].upper() \
|
|
1069
|
+
+ roi_type_name[1:]
|
|
1091
1070
|
if not isinstance(rois, list):
|
|
1092
1071
|
rois = [rois]
|
|
1093
1072
|
for ii, roi in enumerate(rois):
|
|
1073
|
+
desc = f"{str_to_desc(bundle_name)}{roi_type_name}"
|
|
1074
|
+
if roi_type in ["include", "exclude"]:
|
|
1075
|
+
desc = f"{desc}{ii}"
|
|
1094
1076
|
fname = get_fname(
|
|
1095
1077
|
base_fname,
|
|
1096
|
-
"_space-
|
|
1097
|
-
f"{
|
|
1098
|
-
"
|
|
1078
|
+
f"_space-{to_space}_desc-"
|
|
1079
|
+
f"{desc}"
|
|
1080
|
+
f"_{suffix}.nii.gz",
|
|
1081
|
+
"ROIs")
|
|
1099
1082
|
nib.save(
|
|
1100
1083
|
nib.Nifti1Image(
|
|
1101
1084
|
roi.get_fdata().astype(np.float32),
|
|
@@ -1138,3 +1121,67 @@ class BundleDict(MutableMapping):
|
|
|
1138
1121
|
self.resample_to,
|
|
1139
1122
|
self.resample_subject_to,
|
|
1140
1123
|
self.keep_in_memory)
|
|
1124
|
+
|
|
1125
|
+
|
|
1126
|
+
def apply_to_roi_dict(dict_, func, *args,
|
|
1127
|
+
dry_run=False, apply_to_recobundles=False,
|
|
1128
|
+
apply_to_prob_map=True,
|
|
1129
|
+
**kwargs):
|
|
1130
|
+
"""
|
|
1131
|
+
Applies some transformation to all ROIs (include, exclude, end, start)
|
|
1132
|
+
and the prob_map in a given bundle.
|
|
1133
|
+
|
|
1134
|
+
Parameters
|
|
1135
|
+
----------
|
|
1136
|
+
dict_: dict
|
|
1137
|
+
dict describing the bundle using pyAFQ's format. An entry
|
|
1138
|
+
in a BundleDict.
|
|
1139
|
+
func : function
|
|
1140
|
+
function whose first argument must be a Nifti1Image and which
|
|
1141
|
+
returns a Nifti1Image
|
|
1142
|
+
dry_run : bool
|
|
1143
|
+
Whether to actually apply changes returned by `func` to the ROIs.
|
|
1144
|
+
If has_return is False, dry_run is not used.
|
|
1145
|
+
apply_to_recobundles : bool, optional
|
|
1146
|
+
Whether to apply the transformation to recobundles
|
|
1147
|
+
TRKs as well.
|
|
1148
|
+
Default: False
|
|
1149
|
+
apply_to_prob_map : bool, optional
|
|
1150
|
+
Whether to apply the transformation to the prob_map.
|
|
1151
|
+
Default: True
|
|
1152
|
+
|
|
1153
|
+
*args :
|
|
1154
|
+
Additional arguments for func
|
|
1155
|
+
**kwargs
|
|
1156
|
+
Optional arguments for func
|
|
1157
|
+
|
|
1158
|
+
Returns
|
|
1159
|
+
-------
|
|
1160
|
+
A dictionary where keys are
|
|
1161
|
+
the roi type and values are the transformed ROIs.
|
|
1162
|
+
"""
|
|
1163
|
+
return_vals = {}
|
|
1164
|
+
roi_types = ["include", "exclude", "start", "end"]
|
|
1165
|
+
if apply_to_prob_map:
|
|
1166
|
+
roi_types.append("prob_map")
|
|
1167
|
+
for roi_type in roi_types:
|
|
1168
|
+
if roi_type in dict_:
|
|
1169
|
+
if roi_type in ["start", "end", "prob_map"]:
|
|
1170
|
+
return_vals[roi_type] = func(
|
|
1171
|
+
dict_[roi_type], *args, **kwargs)
|
|
1172
|
+
else:
|
|
1173
|
+
changed_rois = []
|
|
1174
|
+
for _roi in dict_[roi_type]:
|
|
1175
|
+
changed_rois.append(func(
|
|
1176
|
+
_roi, *args, **kwargs))
|
|
1177
|
+
return_vals[roi_type] = changed_rois
|
|
1178
|
+
if apply_to_recobundles and "recobundles" in dict_:
|
|
1179
|
+
return_vals["recobundles"] = {}
|
|
1180
|
+
for sl_type in ["sl", "centroid"]:
|
|
1181
|
+
return_vals["recobundles"][sl_type] = func(
|
|
1182
|
+
dict_["recobundles"][sl_type],
|
|
1183
|
+
*args, **kwargs)
|
|
1184
|
+
if not dry_run:
|
|
1185
|
+
for roi_type, roi in return_vals.items():
|
|
1186
|
+
dict_[roi_type] = roi
|
|
1187
|
+
return return_vals
|
|
@@ -14,6 +14,7 @@ from AFQ.api.utils import (
|
|
|
14
14
|
export_all_helper, valid_exports_string)
|
|
15
15
|
import AFQ.utils.streamlines as aus
|
|
16
16
|
from AFQ.viz.utils import get_eye
|
|
17
|
+
from AFQ.data.utils import aws_import_msg_error
|
|
17
18
|
|
|
18
19
|
from dipy.utils.parallel import paramap
|
|
19
20
|
from dipy.io.stateful_tractogram import StatefulTractogram, Space
|
|
@@ -30,11 +31,9 @@ import os
|
|
|
30
31
|
import os.path as op
|
|
31
32
|
from tqdm import tqdm
|
|
32
33
|
import json
|
|
33
|
-
import s3fs
|
|
34
34
|
from time import time
|
|
35
35
|
import nibabel as nib
|
|
36
36
|
from PIL import Image
|
|
37
|
-
from s3bids.utils import S3BIDSStudy
|
|
38
37
|
import glob
|
|
39
38
|
|
|
40
39
|
from bids.layout import BIDSLayout, BIDSLayoutIndexer
|
|
@@ -45,7 +44,7 @@ except ImportError:
|
|
|
45
44
|
using_afqb = False
|
|
46
45
|
|
|
47
46
|
|
|
48
|
-
__all__ = ["GroupAFQ"
|
|
47
|
+
__all__ = ["GroupAFQ"]
|
|
49
48
|
|
|
50
49
|
|
|
51
50
|
logger = logging.getLogger('AFQ')
|
|
@@ -59,11 +58,6 @@ def clean_pandas_df(df):
|
|
|
59
58
|
return df
|
|
60
59
|
|
|
61
60
|
|
|
62
|
-
def get_afq_bids_entities_fname():
|
|
63
|
-
return op.dirname(op.dirname(op.abspath(
|
|
64
|
-
aus.__file__))) + "/afq_bids_entities.json"
|
|
65
|
-
|
|
66
|
-
|
|
67
61
|
class _ParticipantAFQInputs:
|
|
68
62
|
def __init__(
|
|
69
63
|
self, dwi_data_file, bval_file, bvec_file, results_dir,
|
|
@@ -120,7 +114,7 @@ class GroupAFQ(object):
|
|
|
120
114
|
Set "n_jobs" to -1 to automatically parallelize as
|
|
121
115
|
the number of cpus. Here is an example for how to do
|
|
122
116
|
multiprocessing with 4 cpus:
|
|
123
|
-
{"n_jobs": 4, "engine": "
|
|
117
|
+
{"n_jobs": 4, "engine": "ray"}
|
|
124
118
|
Default: {"engine": "serial"}
|
|
125
119
|
bids_layout_kwargs: dict, optional
|
|
126
120
|
Additional arguments to give to BIDSLayout from pybids.
|
|
@@ -278,6 +272,8 @@ class GroupAFQ(object):
|
|
|
278
272
|
if session is not None:
|
|
279
273
|
results_dir = op.join(results_dir, 'ses-' + session)
|
|
280
274
|
|
|
275
|
+
results_dir = op.join(results_dir, "dwi")
|
|
276
|
+
|
|
281
277
|
dwi_bids_filters = {
|
|
282
278
|
"subject": subject,
|
|
283
279
|
"session": session,
|
|
@@ -328,16 +324,19 @@ class GroupAFQ(object):
|
|
|
328
324
|
this_kwargs["scalars"].remove(scalar)
|
|
329
325
|
elif key == "import_tract":
|
|
330
326
|
if isinstance(this_kwargs["import_tract"], dict):
|
|
327
|
+
extension = this_kwargs["import_tract"].pop(
|
|
328
|
+
"extension",
|
|
329
|
+
['.trk',
|
|
330
|
+
'.tck',
|
|
331
|
+
'.trx',
|
|
332
|
+
'.vtk',
|
|
333
|
+
'.fib',
|
|
334
|
+
'.dpy'])
|
|
331
335
|
it_res = \
|
|
332
336
|
bids_layout.get(
|
|
333
337
|
subject=subject,
|
|
334
338
|
session=session,
|
|
335
|
-
extension=
|
|
336
|
-
'.trk',
|
|
337
|
-
'.tck',
|
|
338
|
-
'.vtk',
|
|
339
|
-
'.fib',
|
|
340
|
-
'.dpy'],
|
|
339
|
+
extension=extension,
|
|
341
340
|
return_type='filename',
|
|
342
341
|
**this_kwargs["import_tract"])
|
|
343
342
|
if len(it_res) < 1:
|
|
@@ -875,6 +874,10 @@ class GroupAFQ(object):
|
|
|
875
874
|
|
|
876
875
|
def upload_to_s3(self, s3fs, remote_path):
|
|
877
876
|
""" Upload entire AFQ derivatives folder to S3"""
|
|
877
|
+
try:
|
|
878
|
+
import s3fs
|
|
879
|
+
except (ImportError, ModuleNotFoundError):
|
|
880
|
+
aws_import_msg_error("s3fs")
|
|
878
881
|
s3fs.put(self.afq_path, remote_path, recursive=True)
|
|
879
882
|
if op.exists(self.afqb_path):
|
|
880
883
|
s3fs.put(self.afqb_path, remote_path, recursive=True)
|
|
@@ -897,6 +900,9 @@ class GroupAFQ(object):
|
|
|
897
900
|
ex_density_init = nib.load(densities[
|
|
898
901
|
self.valid_sub_list[0]][
|
|
899
902
|
self.valid_ses_list[0]]) # for shape and header
|
|
903
|
+
tmpl_name = self.export("tmpl_name", collapse=False)[
|
|
904
|
+
self.valid_sub_list[0]][
|
|
905
|
+
self.valid_ses_list[0]]
|
|
900
906
|
|
|
901
907
|
group_density = np.zeros_like(ex_density_init.get_fdata())
|
|
902
908
|
self.logger.info("Generating Group Density...")
|
|
@@ -917,7 +923,7 @@ class GroupAFQ(object):
|
|
|
917
923
|
|
|
918
924
|
out_fname = op.abspath(op.join(
|
|
919
925
|
self.afq_path,
|
|
920
|
-
f"desc-density_subjects-all_space-
|
|
926
|
+
f"desc-density_subjects-all_space-{tmpl_name}_dwimap.nii.gz"))
|
|
921
927
|
nib.save(group_density, out_fname)
|
|
922
928
|
return out_fname
|
|
923
929
|
|
|
@@ -1165,6 +1171,12 @@ def download_and_combine_afq_profiles(bucket,
|
|
|
1165
1171
|
-------
|
|
1166
1172
|
Ouput CSV's pandas dataframe.
|
|
1167
1173
|
"""
|
|
1174
|
+
try:
|
|
1175
|
+
from s3bids.utils import S3BIDSStudy
|
|
1176
|
+
import s3fs
|
|
1177
|
+
except (ImportError, ModuleNotFoundError):
|
|
1178
|
+
aws_import_msg_error("s3bids and s3fs")
|
|
1179
|
+
|
|
1168
1180
|
if "subjects" not in kwargs:
|
|
1169
1181
|
kwargs["subjects"] = "all"
|
|
1170
1182
|
if "anon" not in kwargs:
|
|
@@ -126,6 +126,8 @@ def export_all_helper(api_afq_object, xforms, indiv, viz):
|
|
|
126
126
|
api_afq_object.export("sl_counts")
|
|
127
127
|
api_afq_object.export("median_bundle_lengths")
|
|
128
128
|
api_afq_object.export("profiles")
|
|
129
|
+
api_afq_object.export("seed_thresh")
|
|
130
|
+
api_afq_object.export("stop_thresh")
|
|
129
131
|
|
|
130
132
|
if viz:
|
|
131
133
|
try:
|
|
@@ -7,6 +7,7 @@ from dipy.io.streamline import (
|
|
|
7
7
|
from dipy.data.fetcher import _make_fetcher
|
|
8
8
|
import dipy.data as dpd
|
|
9
9
|
from AFQ.utils.path import drop_extension, apply_cmd_to_afq_derivs
|
|
10
|
+
from AFQ.data.utils import aws_import_msg_error
|
|
10
11
|
|
|
11
12
|
import os
|
|
12
13
|
import os.path as op
|
|
@@ -22,9 +23,6 @@ from tqdm import tqdm
|
|
|
22
23
|
|
|
23
24
|
import warnings
|
|
24
25
|
import nibabel as nib
|
|
25
|
-
import boto3
|
|
26
|
-
from botocore import UNSIGNED
|
|
27
|
-
from botocore.client import Config
|
|
28
26
|
|
|
29
27
|
|
|
30
28
|
# capture templateflow resource warning and log
|
|
@@ -97,11 +95,13 @@ def _fetcher_to_template(fetcher, as_img=False, resample_to=False):
|
|
|
97
95
|
if as_img:
|
|
98
96
|
img = nib.load(img)
|
|
99
97
|
if resample_to:
|
|
100
|
-
img = nib.Nifti1Image(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
img = nib.Nifti1Image(
|
|
99
|
+
resample(
|
|
100
|
+
img.get_fdata(),
|
|
101
|
+
resample_to,
|
|
102
|
+
moving_affine=img.affine,
|
|
103
|
+
static_affine=resample_to.affine).get_fdata(),
|
|
104
|
+
resample_to.affine)
|
|
105
105
|
template_dict[drop_extension(f)] = img
|
|
106
106
|
return template_dict
|
|
107
107
|
|
|
@@ -420,8 +420,8 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
|
|
|
420
420
|
as_array = resample(
|
|
421
421
|
roi.get_fdata(),
|
|
422
422
|
resample_to,
|
|
423
|
-
roi.affine,
|
|
424
|
-
resample_to.affine).get_fdata()
|
|
423
|
+
moving_affine=roi.affine,
|
|
424
|
+
static_affine=resample_to.affine).get_fdata()
|
|
425
425
|
if threshold:
|
|
426
426
|
as_array = (as_array > threshold).astype(int)
|
|
427
427
|
|
|
@@ -1144,16 +1144,15 @@ def organize_stanford_data(path=None, clear_previous_afq=None):
|
|
|
1144
1144
|
derivatives_path = op.join(bids_path, 'derivatives')
|
|
1145
1145
|
dmriprep_folder = op.join(derivatives_path, 'vistasoft')
|
|
1146
1146
|
freesurfer_folder = op.join(derivatives_path, 'freesurfer')
|
|
1147
|
+
afq_folder = op.join(derivatives_path, 'afq')
|
|
1147
1148
|
|
|
1148
|
-
if clear_previous_afq is not None and op.exists(
|
|
1149
|
-
afq_folder = op.join(derivatives_path, 'afq')
|
|
1149
|
+
if clear_previous_afq is not None and op.exists(afq_folder):
|
|
1150
1150
|
if clear_previous_afq == "all":
|
|
1151
|
-
|
|
1152
|
-
shutil.rmtree(afq_folder)
|
|
1151
|
+
shutil.rmtree(afq_folder)
|
|
1153
1152
|
else:
|
|
1154
1153
|
apply_cmd_to_afq_derivs(
|
|
1155
|
-
op.join(afq_folder, "sub-01/ses-01"),
|
|
1156
|
-
op.join(afq_folder, "sub-01/ses-01/sub-01_ses-01"),
|
|
1154
|
+
op.join(afq_folder, "sub-01/ses-01/dwi/"),
|
|
1155
|
+
op.join(afq_folder, "sub-01/ses-01/dwi/sub-01_ses-01"),
|
|
1157
1156
|
dependent_on=clear_previous_afq)
|
|
1158
1157
|
|
|
1159
1158
|
if not op.exists(derivatives_path):
|
|
@@ -1351,8 +1350,8 @@ def read_aal_atlas(resample_to=None):
|
|
|
1351
1350
|
oo.append(resample(
|
|
1352
1351
|
data[..., ii],
|
|
1353
1352
|
resample_to,
|
|
1354
|
-
out_dict['atlas'].affine,
|
|
1355
|
-
resample_to.affine).get_fdata())
|
|
1353
|
+
moving_affine=out_dict['atlas'].affine,
|
|
1354
|
+
static_affine=resample_to.affine).get_fdata())
|
|
1356
1355
|
out_dict['atlas'] = nib.Nifti1Image(np.stack(oo, -1),
|
|
1357
1356
|
resample_to.affine)
|
|
1358
1357
|
return out_dict
|
|
@@ -1386,8 +1385,8 @@ def _apply_mask(template_img, resolution=1):
|
|
|
1386
1385
|
resample(
|
|
1387
1386
|
mask_data,
|
|
1388
1387
|
template_data,
|
|
1389
|
-
mask_img.affine,
|
|
1390
|
-
template_img.affine).get_fdata(),
|
|
1388
|
+
moving_affine=mask_img.affine,
|
|
1389
|
+
static_affine=template_img.affine).get_fdata(),
|
|
1391
1390
|
template_img.affine)
|
|
1392
1391
|
mask_data = mask_img.get_fdata()
|
|
1393
1392
|
|
|
@@ -1552,6 +1551,11 @@ def fetch_hcp(subjects,
|
|
|
1552
1551
|
a format for organizing and describing outputs of neuroimaging
|
|
1553
1552
|
experiments. Scientific Data, 3::160044. DOI: 10.1038/sdata.2016.44.
|
|
1554
1553
|
"""
|
|
1554
|
+
try:
|
|
1555
|
+
import boto3
|
|
1556
|
+
except (ImportError, ModuleNotFoundError):
|
|
1557
|
+
aws_import_msg_error("boto3")
|
|
1558
|
+
|
|
1555
1559
|
if profile_name:
|
|
1556
1560
|
boto3.setup_default_session(profile_name=profile_name)
|
|
1557
1561
|
elif aws_access_key_id is not None and aws_secret_access_key is not None:
|
|
@@ -1656,6 +1660,13 @@ def fetch_hbn_preproc(subjects, path=None):
|
|
|
1656
1660
|
Scientific Data. 2022;9(1):1-27.
|
|
1657
1661
|
|
|
1658
1662
|
"""
|
|
1663
|
+
try:
|
|
1664
|
+
import boto3
|
|
1665
|
+
from botocore import UNSIGNED
|
|
1666
|
+
from botocore.client import Config
|
|
1667
|
+
except (ImportError, ModuleNotFoundError):
|
|
1668
|
+
aws_import_msg_error("boto3")
|
|
1669
|
+
|
|
1659
1670
|
# Anonymous access:
|
|
1660
1671
|
client = boto3.client('s3', config=Config(signature_version=UNSIGNED))
|
|
1661
1672
|
|
|
@@ -1751,6 +1762,13 @@ def fetch_hbn_afq(subjects, path=None):
|
|
|
1751
1762
|
Scientific Data. 2022;9(1):1-27.
|
|
1752
1763
|
|
|
1753
1764
|
"""
|
|
1765
|
+
try:
|
|
1766
|
+
import boto3
|
|
1767
|
+
from botocore import UNSIGNED
|
|
1768
|
+
from botocore.client import Config
|
|
1769
|
+
except (ImportError, ModuleNotFoundError):
|
|
1770
|
+
aws_import_msg_error("boto3")
|
|
1771
|
+
|
|
1754
1772
|
# Anonymous access:
|
|
1755
1773
|
client = boto3.client('s3', config=Config(signature_version=UNSIGNED))
|
|
1756
1774
|
|
|
@@ -11,6 +11,7 @@ BUNDLE_RECO_2_AFQ = \
|
|
|
11
11
|
"SLF_R": "Right Superior Longitudinal"
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
|
|
14
15
|
BUNDLE_MAT_2_PYTHON = {
|
|
15
16
|
'RightCorticospinal': 'Right Corticospinal',
|
|
16
17
|
'LeftCorticospinal': 'Left Corticospinal',
|
|
@@ -40,3 +41,12 @@ BUNDLE_MAT_2_PYTHON = {
|
|
|
40
41
|
'Left SLF': 'Left Superior Longitudinal',
|
|
41
42
|
'RightSLF': 'Right Superior Longitudinal',
|
|
42
43
|
'LeftSLF': 'Left Superior Longitudinal'}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def aws_import_msg_error(module):
|
|
47
|
+
"""Alerts user to install the appropriate aws module """
|
|
48
|
+
msg = f"To use {module} in pyAFQ, you will "
|
|
49
|
+
msg += f"need to have {module} installed. "
|
|
50
|
+
msg += "You can do that by installing pyAFQ with "
|
|
51
|
+
msg += f"`pip install AFQ[aws]`"
|
|
52
|
+
return msg
|