pyAFQ 1.3.5__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.5 → pyafq-2.0}/.github/workflows/docbuild.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/docker_pyafq.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/docker_pyafq_cuda12.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_anisotropic_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_basic_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_custom_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_pft_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_reco80_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_reco_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_test.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/publish-to-test-pypi.yml +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/test.yml +2 -2
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/_fixes.py +11 -7
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/bundle_dict.py +125 -61
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/group.py +28 -16
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/utils.py +2 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/fetch.py +38 -22
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/utils.py +10 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/image.py +35 -17
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/mapping.py +30 -19
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/utils.py +8 -3
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/cleaning.py +25 -15
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/criteria.py +91 -38
- pyafq-2.0/AFQ/recognition/other_bundles.py +153 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/preprocess.py +10 -2
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/recognize.py +10 -10
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/roi.py +16 -18
- pyafq-2.0/AFQ/recognition/tests/test_other_bundles.py +43 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_rois.py +43 -37
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_utils.py +16 -10
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/utils.py +23 -18
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/data.py +130 -71
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/decorators.py +3 -7
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/mapping.py +54 -24
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/segmentation.py +57 -23
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/tractography.py +126 -58
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/utils.py +38 -1
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/viz.py +29 -67
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_api.py +10 -16
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_definitions.py +22 -4
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_fixes.py +8 -2
- pyafq-2.0/AFQ/tractography/gputractography.py +219 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/tractography.py +33 -16
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/conversion.py +2 -2
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/path.py +31 -2
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/version.py +9 -4
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/fury_backend.py +10 -29
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/plot.py +16 -2
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/plotly_backend.py +10 -17
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/utils.py +32 -19
- {pyafq-1.3.5 → pyafq-2.0}/CHANGES.rst +58 -1
- {pyafq-1.3.5 → pyafq-2.0}/PKG-INFO +17 -21
- {pyafq-1.3.5 → pyafq-2.0}/bin/pyAFQ +0 -10
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/conf.py +1 -1
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/installation_guide.rst +22 -1
- pyafq-2.0/docs/source/howto/usage/singularity.rst +16 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/bundledict.rst +3 -3
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cloudknot_example.py +2 -2
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cloudknot_hcp_example.py +2 -2
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_optic_radiations.py +1 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_001_afq_api.py +4 -2
- {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_002_bids_layout.py +6 -7
- pyafq-2.0/gpu_docker/Dockerfile +34 -0
- pyafq-2.0/gpu_docker/cuda_track_template.def +36 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/PKG-INFO +17 -21
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/SOURCES.txt +3 -1
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/requires.txt +14 -19
- {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/Dockerfile +2 -2
- {pyafq-1.3.5 → pyafq-2.0}/setup.cfg +11 -16
- pyafq-1.3.5/AFQ/afq_bids_entities.json +0 -22
- pyafq-1.3.5/AFQ/tractography/gputractography.py +0 -177
- pyafq-1.3.5/gpu_docker/Dockerfile +0 -53
- pyafq-1.3.5/gpu_docker/cuda_track_template.def +0 -63
- {pyafq-1.3.5 → pyafq-2.0}/.github/CITATION.cff +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.github/CONTRIBUTING.md +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.gitignore +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.mailmap +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.maintenance/update_changes.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.maintenance/update_zenodo.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.pep8speaks.yml +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/.zenodo.json +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/participant.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/QBallTP.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/csd.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/dki.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/dti.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/fwdti.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/curvature.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/registration.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-1.3.5 → 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.5 → 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.5 → 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.5 → 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.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_bundle_dict.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_csd.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_data.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_dki.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_dti.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_registration.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_tractography.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_viz.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/utils.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/bin.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/docs.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/models.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/stats.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/streamlines.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/testing.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_streamlines.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/volume.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/__init__.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/altair.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/CITATION +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/LICENSE +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/MANIFEST.in +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/Makefile +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/README.md +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/Makefile +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_progressbars.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/custom.css +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/logo.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/_templates/layout.html +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/down_left_arrow.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/down_right_arrow.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/greencheck.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_modeling2.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_profiling.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_recognition.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_tractography.png +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/bundle_orientation.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/modeling.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/tractography.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/tractometry_pipeline.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/cite.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/contributing.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/definitions.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/releasing.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/tasks.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/getting_help.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/converter.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/data.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/docker.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/image.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/kwargs.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/methods.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/scalars.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/kwargs.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/mapping.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/methods.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/viz_backend.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/source/tutorials/index.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/docs/upload-gh-pages.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/README.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/add_custom_bundle.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/baby_afq.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cerebellar_peduncles.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_acoustic_radiations.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_afq_callosal.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_afq_fwdti.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_recobundles.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/vof_example.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/README.rst +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_003_viz.py +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/cuda_build.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/docker-build.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/docker-push.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/pyproject.toml +0 -0
- {pyafq-1.3.5 → pyafq-2.0}/setup.py +0 -0
- {pyafq-1.3.5 → 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/`
|
|
@@ -2,6 +2,7 @@ import numpy as np
|
|
|
2
2
|
import logging
|
|
3
3
|
|
|
4
4
|
from scipy.special import lpmv, gammaln
|
|
5
|
+
from scipy.linalg import pinvh
|
|
5
6
|
|
|
6
7
|
from tqdm import tqdm
|
|
7
8
|
|
|
@@ -215,17 +216,20 @@ def gaussian_weights(bundle, n_points=100, return_mahalnobis=False,
|
|
|
215
216
|
for i in range(n_nodes):
|
|
216
217
|
# This should come back as a 3D covariance matrix with the spatial
|
|
217
218
|
# variance covariance of this node across the different streamlines,
|
|
218
|
-
#
|
|
219
|
+
# converted to a positive semi-definite matrix if necessary
|
|
219
220
|
cov = np.cov(sls[:, i, :].T, ddof=0)
|
|
220
|
-
|
|
221
|
-
|
|
221
|
+
if np.any(np.linalg.eigvals(cov) < 0):
|
|
222
|
+
eigenvalues, eigenvectors = np.linalg.eigh((cov + cov.T) / 2)
|
|
223
|
+
eigenvalues[eigenvalues < 0] = 0
|
|
224
|
+
cov = eigenvectors @ np.diag(eigenvalues) @ eigenvectors.T
|
|
222
225
|
|
|
223
226
|
# calculate Mahalanobis for node in every fiber
|
|
224
227
|
if np.any(cov > 0):
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
228
|
+
weights[:, i] = np.sqrt(np.einsum(
|
|
229
|
+
'ij,jk,ik->i',
|
|
230
|
+
diff[:, i, :],
|
|
231
|
+
pinvh(cov),
|
|
232
|
+
diff[:, i, :]))
|
|
229
233
|
|
|
230
234
|
# In the special case where all the streamlines have the exact same
|
|
231
235
|
# coordinate in this node, the covariance matrix is all zeros, so
|
|
@@ -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
|
|
@@ -229,28 +230,42 @@ def default18_bd():
|
|
|
229
230
|
'exclude': [templates['SLF_roi1_L']],
|
|
230
231
|
'space': 'template',
|
|
231
232
|
'start': templates['pARC_L_start'],
|
|
232
|
-
'primary_axis':
|
|
233
|
+
'primary_axis': 'I/S',
|
|
233
234
|
'primary_axis_percentage': 40},
|
|
234
235
|
'Right Posterior Arcuate': {'cross_midline': False,
|
|
235
236
|
'include': [templates['SLFt_roi2_R']],
|
|
236
237
|
'exclude': [templates['SLF_roi1_R']],
|
|
237
238
|
'space': 'template',
|
|
238
239
|
'start': templates['pARC_R_start'],
|
|
239
|
-
'primary_axis':
|
|
240
|
+
'primary_axis': 'I/S',
|
|
240
241
|
'primary_axis_percentage': 40},
|
|
241
242
|
'Left Vertical Occipital': {'cross_midline': False,
|
|
242
243
|
'space': 'template',
|
|
243
244
|
'start': templates['VOF_L_start'],
|
|
244
245
|
'end': templates['VOF_L_end'],
|
|
245
246
|
'inc_addtol': [4, 0],
|
|
246
|
-
'
|
|
247
|
+
'Left Arcuate': {
|
|
248
|
+
'node_thresh': 20},
|
|
249
|
+
'Left Posterior Arcuate': {
|
|
250
|
+
'node_thresh': 1,
|
|
251
|
+
'core': 'Anterior'},
|
|
252
|
+
'Left Inferior Longitudinal': {
|
|
253
|
+
'core': 'Right'},
|
|
254
|
+
'primary_axis': 'I/S',
|
|
247
255
|
'primary_axis_percentage': 40},
|
|
248
256
|
'Right Vertical Occipital': {'cross_midline': False,
|
|
249
257
|
'space': 'template',
|
|
250
258
|
'start': templates['VOF_R_start'],
|
|
251
259
|
'end': templates['VOF_R_end'],
|
|
252
260
|
'inc_addtol': [4, 0],
|
|
253
|
-
'
|
|
261
|
+
'Right Arcuate': {
|
|
262
|
+
'node_thresh': 20},
|
|
263
|
+
'Right Posterior Arcuate': {
|
|
264
|
+
'node_thresh': 1,
|
|
265
|
+
'core': 'Anterior'},
|
|
266
|
+
'Right Inferior Longitudinal': {
|
|
267
|
+
'core': 'Left'},
|
|
268
|
+
'primary_axis': 'I/S',
|
|
254
269
|
'primary_axis_percentage': 40}})
|
|
255
270
|
|
|
256
271
|
|
|
@@ -467,7 +482,7 @@ def baby_bd():
|
|
|
467
482
|
"exclude": [templates["SLF_roi1_L"]],
|
|
468
483
|
"start": templates["pARC_L_start"],
|
|
469
484
|
"end": templates["VOF_box_small_L"],
|
|
470
|
-
"primary_axis":
|
|
485
|
+
"primary_axis": 'I/S',
|
|
471
486
|
"primary_axis_percentage": 40,
|
|
472
487
|
"cross_midline": False,
|
|
473
488
|
"mahal": {"distance_threshold": 4}},
|
|
@@ -476,21 +491,21 @@ def baby_bd():
|
|
|
476
491
|
"exclude": [templates["SLF_roi1_R"]],
|
|
477
492
|
"start": templates["pARC_R_start"],
|
|
478
493
|
"end": templates["VOF_box_small_R"],
|
|
479
|
-
"primary_axis":
|
|
494
|
+
"primary_axis": 'I/S',
|
|
480
495
|
"primary_axis_percentage": 40,
|
|
481
496
|
"cross_midline": False,
|
|
482
497
|
"mahal": {"distance_threshold": 4}},
|
|
483
498
|
'Left Vertical Occipital': {
|
|
484
499
|
"start": templates["VOF_L_start"],
|
|
485
500
|
"end": templates["VOF_box_small_L"],
|
|
486
|
-
"primary_axis":
|
|
501
|
+
"primary_axis": 'I/S',
|
|
487
502
|
"primary_axis_percentage": 40,
|
|
488
503
|
"cross_midline": False,
|
|
489
504
|
"mahal": {"distance_threshold": 4}},
|
|
490
505
|
'Right Vertical Occipital': {
|
|
491
506
|
"start": templates["VOF_R_start"],
|
|
492
507
|
"end": templates["VOF_box_small_R"],
|
|
493
|
-
"primary_axis":
|
|
508
|
+
"primary_axis": 'I/S',
|
|
494
509
|
"primary_axis_percentage": 40,
|
|
495
510
|
"cross_midline": False,
|
|
496
511
|
"mahal": {"distance_threshold": 4}}},
|
|
@@ -750,6 +765,14 @@ class BundleDict(MutableMapping):
|
|
|
750
765
|
"cross_midline": False
|
|
751
766
|
}
|
|
752
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.
|
|
753
776
|
"""
|
|
754
777
|
|
|
755
778
|
def __init__(self,
|
|
@@ -799,6 +822,9 @@ class BundleDict(MutableMapping):
|
|
|
799
822
|
" Only Callosum Anterior Frontal will be used."))
|
|
800
823
|
self.bundle_names.remove("Forceps Minor")
|
|
801
824
|
|
|
825
|
+
def __print__(self):
|
|
826
|
+
print(self._dict)
|
|
827
|
+
|
|
802
828
|
def update_max_includes(self, new_max):
|
|
803
829
|
if new_max > self.max_includes:
|
|
804
830
|
self.max_includes = new_max
|
|
@@ -921,62 +947,16 @@ class BundleDict(MutableMapping):
|
|
|
921
947
|
resample_subject_to=self.resample_subject_to,
|
|
922
948
|
keep_in_memory=self.keep_in_memory)
|
|
923
949
|
|
|
924
|
-
def apply_to_rois(self, b_name,
|
|
925
|
-
dry_run=False, apply_to_recobundles=False,
|
|
926
|
-
**kwargs):
|
|
950
|
+
def apply_to_rois(self, b_name, *args, **kwargs):
|
|
927
951
|
"""
|
|
928
|
-
|
|
929
|
-
and the prob_map in a given bundle.
|
|
952
|
+
See: AFQ.api.bundle_dict.apply_to_roi_dict
|
|
930
953
|
|
|
931
954
|
Parameters
|
|
932
955
|
----------
|
|
933
956
|
b_name : name
|
|
934
957
|
bundle name of bundle whose ROIs will be transformed.
|
|
935
|
-
func : function
|
|
936
|
-
function whose first argument must be a Nifti1Image and which
|
|
937
|
-
returns a Nifti1Image
|
|
938
|
-
dry_run : bool
|
|
939
|
-
Whether to actually apply changes returned by `func` to the ROIs.
|
|
940
|
-
If has_return is False, dry_run is not used.
|
|
941
|
-
apply_to_recobundles : bool, optional
|
|
942
|
-
Whether to apply the transformation to recobundles
|
|
943
|
-
TRKs as well.
|
|
944
|
-
Default: False
|
|
945
|
-
|
|
946
|
-
*args :
|
|
947
|
-
Additional arguments for func
|
|
948
|
-
**kwargs
|
|
949
|
-
Optional arguments for func
|
|
950
|
-
|
|
951
|
-
Returns
|
|
952
|
-
-------
|
|
953
|
-
A dictionary where keys are
|
|
954
|
-
the roi type and values are the transformed ROIs.
|
|
955
958
|
"""
|
|
956
|
-
|
|
957
|
-
for roi_type in [
|
|
958
|
-
"include", "exclude",
|
|
959
|
-
"start", "end", "prob_map"]:
|
|
960
|
-
if roi_type in self._dict[b_name]:
|
|
961
|
-
if roi_type in ["start", "end", "prob_map"]:
|
|
962
|
-
return_vals[roi_type] = func(
|
|
963
|
-
self._dict[b_name][roi_type], *args, **kwargs)
|
|
964
|
-
else:
|
|
965
|
-
changed_rois = []
|
|
966
|
-
for _roi in self._dict[b_name][roi_type]:
|
|
967
|
-
changed_rois.append(func(
|
|
968
|
-
_roi, *args, **kwargs))
|
|
969
|
-
return_vals[roi_type] = changed_rois
|
|
970
|
-
if apply_to_recobundles and "recobundles" in self._dict[b_name]:
|
|
971
|
-
return_vals["recobundles"] = {}
|
|
972
|
-
for sl_type in ["sl", "centroid"]:
|
|
973
|
-
return_vals["recobundles"][sl_type] = func(
|
|
974
|
-
self._dict[b_name]["recobundles"][sl_type],
|
|
975
|
-
*args, **kwargs)
|
|
976
|
-
if not dry_run:
|
|
977
|
-
for roi_type, roi in return_vals.items():
|
|
978
|
-
self._dict[b_name][roi_type] = roi
|
|
979
|
-
return return_vals
|
|
959
|
+
return apply_to_roi_dict(self._dict[b_name], *args, **kwargs)
|
|
980
960
|
|
|
981
961
|
def _cond_load_bundle(self, b_name, dry_run=False):
|
|
982
962
|
"""
|
|
@@ -1018,7 +998,8 @@ class BundleDict(MutableMapping):
|
|
|
1018
998
|
return roi_or_sl
|
|
1019
999
|
|
|
1020
1000
|
def transform_rois(self, bundle_name, mapping, new_affine,
|
|
1021
|
-
base_fname=None,
|
|
1001
|
+
base_fname=None, to_space="subject",
|
|
1002
|
+
apply_to_recobundles=False):
|
|
1022
1003
|
"""
|
|
1023
1004
|
Get the bundle definition with transformed ROIs
|
|
1024
1005
|
for a given bundle into a
|
|
@@ -1039,6 +1020,10 @@ class BundleDict(MutableMapping):
|
|
|
1039
1020
|
Base file path to save ROIs too. Additional BIDS
|
|
1040
1021
|
descriptors will be added to this file path. If None,
|
|
1041
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"
|
|
1042
1027
|
apply_to_recobundles : bool, optional
|
|
1043
1028
|
Whether to apply the transformation to recobundles
|
|
1044
1029
|
TRKs as well.
|
|
@@ -1071,14 +1056,29 @@ class BundleDict(MutableMapping):
|
|
|
1071
1056
|
if base_fname is not None:
|
|
1072
1057
|
fnames = []
|
|
1073
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:]
|
|
1074
1070
|
if not isinstance(rois, list):
|
|
1075
1071
|
rois = [rois]
|
|
1076
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}"
|
|
1077
1076
|
fname = get_fname(
|
|
1078
1077
|
base_fname,
|
|
1079
|
-
"_space-
|
|
1080
|
-
f"{
|
|
1081
|
-
"
|
|
1078
|
+
f"_space-{to_space}_desc-"
|
|
1079
|
+
f"{desc}"
|
|
1080
|
+
f"_{suffix}.nii.gz",
|
|
1081
|
+
"ROIs")
|
|
1082
1082
|
nib.save(
|
|
1083
1083
|
nib.Nifti1Image(
|
|
1084
1084
|
roi.get_fdata().astype(np.float32),
|
|
@@ -1121,3 +1121,67 @@ class BundleDict(MutableMapping):
|
|
|
1121
1121
|
self.resample_to,
|
|
1122
1122
|
self.resample_subject_to,
|
|
1123
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:
|