pyAFQ 3.1__tar.gz → 3.3__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-3.1 → pyafq-3.3}/.codespellrc +1 -1
- {pyafq-3.1 → pyafq-3.3}/.gitignore +0 -2
- {pyafq-3.1 → pyafq-3.3}/AFQ/_fixes.py +60 -23
- {pyafq-3.1 → pyafq-3.3}/AFQ/api/bundle_dict.py +42 -2
- {pyafq-3.1 → pyafq-3.3}/AFQ/api/group.py +3 -3
- {pyafq-3.1 → pyafq-3.3}/AFQ/api/participant.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/data/fetch.py +7 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/asym_filtering.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/dki.py +0 -8
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/msmt.py +1 -7
- {pyafq-3.1 → pyafq-3.3}/AFQ/nn/multiaxial.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/criteria.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/utils.py +7 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/data.py +19 -5
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/segmentation.py +17 -26
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/structural.py +18 -18
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/tractography.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/viz.py +11 -11
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_api.py +9 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_bundle_dict.py +1 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/tractography/tractography.py +4 -1
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/conversion.py +1 -1
- pyafq-3.3/AFQ/utils/docs.py +24 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/streamlines.py +75 -17
- pyafq-3.3/AFQ/utils/tests/test_streamlines.py +185 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/version.py +3 -3
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/altair.py +3 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/fury_backend.py +23 -12
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/plotly_backend.py +43 -19
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/utils.py +29 -46
- {pyafq-3.1 → pyafq-3.3}/CHANGES.rst +17 -0
- {pyafq-3.1 → pyafq-3.3}/PKG-INFO +8 -8
- {pyafq-3.1 → pyafq-3.3}/docs/Makefile +5 -23
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/custom.css +8 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/conf.py +19 -28
- pyafq-3.3/docs/source/examples/howto_examples/acoustic_radiations.md +133 -0
- pyafq-3.1/examples/howto_examples/add_custom_bundle.py → pyafq-3.3/docs/source/examples/howto_examples/add_custom_bundle.md +109 -92
- pyafq-3.3/docs/source/examples/howto_examples/afq_callosal.md +119 -0
- pyafq-3.3/docs/source/examples/howto_examples/afq_fwdti.md +174 -0
- pyafq-3.3/docs/source/examples/howto_examples/baby_afq.md +168 -0
- pyafq-3.1/examples/howto_examples/cerebellar_peduncles.py → pyafq-3.3/docs/source/examples/howto_examples/cerebellar_peduncles.md +42 -31
- pyafq-3.3/docs/source/examples/howto_examples/cloudknot_example.md +198 -0
- pyafq-3.1/examples/howto_examples/cloudknot_hcp_example.py → pyafq-3.3/docs/source/examples/howto_examples/cloudknot_hcp_example.md +105 -63
- pyafq-3.1/examples/howto_examples/README.rst → pyafq-3.3/docs/source/examples/howto_examples/index.rst +4 -1
- pyafq-3.3/docs/source/examples/howto_examples/optic_radiations.md +175 -0
- pyafq-3.3/docs/source/examples/howto_examples/optic_tract.md +190 -0
- pyafq-3.1/examples/howto_examples/plot_stages_of_tractometry.py → pyafq-3.3/docs/source/examples/howto_examples/plot_stages_of_tractometry.md +230 -152
- pyafq-3.3/docs/source/examples/howto_examples/pyAFQ_with_GPU.md +74 -0
- pyafq-3.1/examples/howto_examples/pyafq_2.py → pyafq-3.3/docs/source/examples/howto_examples/pyafq_2.md +70 -55
- pyafq-3.3/docs/source/examples/howto_examples/recobundles.md +71 -0
- pyafq-3.3/docs/source/examples/howto_examples/use_subject_space_rois_from_freesurfer.md +163 -0
- pyafq-3.1/examples/howto_examples/vof_example.py → pyafq-3.3/docs/source/examples/howto_examples/vof_example.md +24 -7
- pyafq-3.1/examples/tutorial_examples/README.rst → pyafq-3.3/docs/source/examples/tutorial_examples/index.rst +4 -1
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_001_group_afq_api.md +349 -0
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_002_participant_afq_api.md +307 -0
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_003_rerun.md +184 -0
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_004_export.md +222 -0
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_005_viz.md +482 -0
- pyafq-3.3/docs/source/examples/tutorial_examples/plot_006_bids_layout.md +326 -0
- pyafq-3.1/examples/tutorial_examples/plot_007_rois.py → pyafq-3.3/docs/source/examples/tutorial_examples/plot_007_rois.md +37 -12
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/index.rst +1 -1
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/converter.rst +1 -1
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/data.rst +2 -2
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/index.rst +1 -1
- {pyafq-3.1 → pyafq-3.3}/docs/source/index.rst +5 -5
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/bundledict.rst +1 -1
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/fibertracts.rst +45 -11
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/kwargs.rst +3 -3
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/methods.rst +1 -1
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/viz_backend.rst +8 -8
- {pyafq-3.1 → pyafq-3.3}/docs/source/tutorials/index.rst +3 -5
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/PKG-INFO +8 -8
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/SOURCES.txt +25 -26
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/requires.txt +7 -8
- {pyafq-3.1 → pyafq-3.3}/setup.cfg +5 -5
- pyafq-3.1/AFQ/utils/docs.py +0 -55
- pyafq-3.1/AFQ/utils/tests/test_streamlines.py +0 -74
- pyafq-3.1/docs/source/_progressbars.py +0 -33
- pyafq-3.1/examples/howto_examples/acoustic_radiations.py +0 -119
- pyafq-3.1/examples/howto_examples/afq_callosal.py +0 -104
- pyafq-3.1/examples/howto_examples/afq_fwdti.py +0 -162
- pyafq-3.1/examples/howto_examples/baby_afq.py +0 -152
- pyafq-3.1/examples/howto_examples/cloudknot_example.py +0 -164
- pyafq-3.1/examples/howto_examples/optic_radiations.py +0 -155
- pyafq-3.1/examples/howto_examples/optic_tract.py +0 -176
- pyafq-3.1/examples/howto_examples/pyAFQ_with_GPU.py +0 -58
- pyafq-3.1/examples/howto_examples/recobundles.py +0 -59
- pyafq-3.1/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -147
- pyafq-3.1/examples/tutorial_examples/plot_001_group_afq_api.py +0 -303
- pyafq-3.1/examples/tutorial_examples/plot_002_participant_afq_api.py +0 -268
- pyafq-3.1/examples/tutorial_examples/plot_003_rerun.py +0 -160
- pyafq-3.1/examples/tutorial_examples/plot_004_export.py +0 -192
- pyafq-3.1/examples/tutorial_examples/plot_005_viz.py +0 -436
- pyafq-3.1/examples/tutorial_examples/plot_006_bids_layout.py +0 -297
- {pyafq-3.1 → pyafq-3.3}/.github/CITATION.cff +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/CONTRIBUTING.md +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/docbuild.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/docker_pyafq.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_anisotropic_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_basic_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_custom_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_reco80_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_reco_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/nightly_test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/publish-to-test-pypi.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.github/workflows/test.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.mailmap +0 -0
- {pyafq-3.1 → pyafq-3.3}/.maintenance/update_changes.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/.maintenance/update_zenodo.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/.pep8speaks.yml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.pre-commit-config.yaml +0 -0
- {pyafq-3.1 → pyafq-3.3}/.zenodo.json +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/api/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/api/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/data/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/data/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/definitions/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/definitions/image.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/definitions/mapping.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/definitions/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/QBallTP.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/csd.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/dti.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/fwdti.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/models/wmgm_interface.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/nn/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/nn/brainchop.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/nn/synthseg.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/nn/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/cleaning.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/clustering.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/curvature.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/other_bundles.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/preprocess.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/recognize.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/roi.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/sparse_decisions.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/conftest.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/test_other_bundles.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/test_rois.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/recognition/tests/test_utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/registration.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/decorators.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/mapping.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/tissue.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tasks/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_csd.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_data.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_definitions.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_dki.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_dti.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_fixes.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_msmt.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_nn.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_registration.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_tractography.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tests/test_viz.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tractography/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/tractography/utils.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/bin.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/docstring_parser.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/models.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/path.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/stats.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/testing.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/utils/volume.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/__init__.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/AFQ/viz/plot.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/CITATION +0 -0
- {pyafq-3.1 → pyafq-3.3}/LICENSE +0 -0
- {pyafq-3.1 → pyafq-3.3}/MANIFEST.in +0 -0
- {pyafq-3.1 → pyafq-3.3}/Makefile +0 -0
- {pyafq-3.1 → pyafq-3.3}/NOTICE.md +0 -0
- {pyafq-3.1 → pyafq-3.3}/README.md +0 -0
- {pyafq-3.1 → pyafq-3.3}/bin/pyAFQ +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/CSVfile.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/FAbrain.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/ProfileViz.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/TP_viz.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/arcuaterois.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/beaware.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/diffusion-anisotropic.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/diffusion-isotropic.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/down_left_arrow.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/down_right_arrow.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/dti_in_brain.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/dtiexplanation.jpg +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/ecosystem.jpg +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/greencheck.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/inherintambiguity.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/logo.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/modelling.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/modeltotrack.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_001.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_002.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_003.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_004.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_005.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_006.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_010.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_011.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_012.gif +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tract_modeling2.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tract_profiling.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tract_recognition.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tract_tractography.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tractometry_pipeline.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_static/tropic.png +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_templates/footer.html +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/_templates/layout.html +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/bib.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/developing/contributing.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/developing/definitions.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/developing/index.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/developing/releasing.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/developing/tasks.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/bundle_orientation.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/modeling.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/tractography.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/explanations/whats_new_3.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/guides_index.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/cite.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/cleaning_params.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/docker.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/getting_help.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/image.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/installation_guide.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/rerun.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/scalars.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/segmentation_params.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/singularity.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/howto/tractography_params.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/index.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/mapping.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/reference/tissue_properties.rst +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/references.bib +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/docs/upload-gh-pages.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/gpu_docker/Dockerfile +0 -0
- {pyafq-3.1 → pyafq-3.3}/gpu_docker/docker-build.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/gpu_docker/docker-push.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/gpu_docker/pyafq_with_gpu_template.def +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyafq_docker/Dockerfile +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-3.1 → pyafq-3.3}/pyproject.toml +0 -0
- {pyafq-3.1 → pyafq-3.3}/setup.py +0 -0
- {pyafq-3.1 → pyafq-3.3}/tox.ini +0 -0
|
@@ -3,6 +3,7 @@ import math
|
|
|
3
3
|
import tempfile
|
|
4
4
|
from math import radians
|
|
5
5
|
|
|
6
|
+
import imageio
|
|
6
7
|
import numpy as np
|
|
7
8
|
from dipy.align import vector_fields as vfu
|
|
8
9
|
from dipy.align.imwarp import DiffeomorphicMap, mult_aff
|
|
@@ -11,7 +12,7 @@ from dipy.tracking.streamline import set_number_of_points
|
|
|
11
12
|
from PIL import Image
|
|
12
13
|
from scipy.linalg import blas, pinvh
|
|
13
14
|
from scipy.special import gammaln, lpmv
|
|
14
|
-
from tqdm import tqdm
|
|
15
|
+
from tqdm.auto import tqdm
|
|
15
16
|
|
|
16
17
|
logger = logging.getLogger("AFQ")
|
|
17
18
|
|
|
@@ -361,9 +362,9 @@ def gaussian_weights(
|
|
|
361
362
|
return w
|
|
362
363
|
|
|
363
364
|
|
|
364
|
-
def
|
|
365
|
+
def make_mp4(show_m, out_path, n_frames=720, az_ang=-0.5, fps=30, crf=35, verbose=True):
|
|
365
366
|
"""
|
|
366
|
-
Make
|
|
367
|
+
Make an MP4 video from a Fury Show Manager with auto-cropping.
|
|
367
368
|
|
|
368
369
|
Parameters
|
|
369
370
|
----------
|
|
@@ -371,28 +372,43 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
|
|
|
371
372
|
The Fury Show Manager to use for rendering.
|
|
372
373
|
|
|
373
374
|
out_path : str
|
|
374
|
-
The name of the output file
|
|
375
|
+
The name of the output file
|
|
375
376
|
|
|
376
377
|
n_frames : int
|
|
377
378
|
The number of frames to render.
|
|
378
|
-
Default:
|
|
379
|
+
Default: 720
|
|
379
380
|
|
|
380
381
|
az_ang : float
|
|
381
382
|
The angle to rotate the camera around the
|
|
382
383
|
z-axis for each frame, in degrees.
|
|
383
|
-
Default: -
|
|
384
|
+
Default: -0.5
|
|
384
385
|
|
|
385
|
-
|
|
386
|
-
The
|
|
387
|
-
Default:
|
|
386
|
+
fps : float
|
|
387
|
+
The frames per second for the output video.
|
|
388
|
+
Default: 30
|
|
389
|
+
|
|
390
|
+
crf : int
|
|
391
|
+
The Constant Rate Factor for the output video, which controls the
|
|
392
|
+
quality and file size. Lower values result in
|
|
393
|
+
higher quality and larger file sizes.
|
|
394
|
+
Default: 35 (very low quality, small file size)
|
|
395
|
+
|
|
396
|
+
verbose : bool
|
|
397
|
+
Whether to show a progress bar while generating the video.
|
|
398
|
+
Default: True
|
|
388
399
|
"""
|
|
400
|
+
if not out_path.lower().endswith(".mp4"):
|
|
401
|
+
out_path += ".mp4"
|
|
402
|
+
|
|
389
403
|
video = []
|
|
390
404
|
|
|
391
405
|
show_m.render()
|
|
392
406
|
show_m.window.draw()
|
|
393
407
|
|
|
394
408
|
with tempfile.TemporaryDirectory() as tmp_dir:
|
|
395
|
-
for ii in tqdm(
|
|
409
|
+
for ii in tqdm(
|
|
410
|
+
range(n_frames), desc="Generating MP4", leave=False, disable=not verbose
|
|
411
|
+
):
|
|
396
412
|
frame_fname = f"{tmp_dir}/{ii}.png"
|
|
397
413
|
show_m.screens[0].controller.rotate((radians(az_ang), 0), None)
|
|
398
414
|
show_m.render()
|
|
@@ -406,7 +422,6 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
|
|
|
406
422
|
for img in video:
|
|
407
423
|
arr = np.array(img)
|
|
408
424
|
bg_color = arr[0, 0]
|
|
409
|
-
|
|
410
425
|
mask = np.any(arr != bg_color, axis=-1)
|
|
411
426
|
|
|
412
427
|
if np.any(mask):
|
|
@@ -421,20 +436,42 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
|
|
|
421
436
|
all_lower = max(all_lower, ymax)
|
|
422
437
|
|
|
423
438
|
if all_left < all_right:
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
439
|
+
|
|
440
|
+
def align_down(x, multiple=16):
|
|
441
|
+
return (x // multiple) * multiple
|
|
442
|
+
|
|
443
|
+
def align_up(x, multiple=16):
|
|
444
|
+
return ((x + multiple - 1) // multiple) * multiple
|
|
445
|
+
|
|
446
|
+
left = align_up(max(0, all_left), 16)
|
|
447
|
+
upper = align_up(max(0, all_upper), 16)
|
|
448
|
+
right = align_down(min(video[0].width, all_right), 16)
|
|
449
|
+
lower = align_down(min(video[0].height, all_lower), 16)
|
|
450
|
+
|
|
451
|
+
crop_box = (left, upper, right, lower)
|
|
430
452
|
cropped_video = [img.crop(crop_box) for img in video]
|
|
431
453
|
else:
|
|
432
454
|
cropped_video = video
|
|
433
455
|
|
|
434
|
-
cropped_video[0].
|
|
456
|
+
width, height = cropped_video[0].size
|
|
457
|
+
with imageio.get_writer(
|
|
435
458
|
out_path,
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
459
|
+
fps=fps,
|
|
460
|
+
format="ffmpeg",
|
|
461
|
+
codec="libx264",
|
|
462
|
+
pixelformat="yuv420p",
|
|
463
|
+
output_params=[
|
|
464
|
+
"-crf",
|
|
465
|
+
f"{str(int(crf))}",
|
|
466
|
+
"-preset",
|
|
467
|
+
"veryslow",
|
|
468
|
+
"-movflags",
|
|
469
|
+
"+faststart",
|
|
470
|
+
],
|
|
471
|
+
) as writer:
|
|
472
|
+
for img in cropped_video:
|
|
473
|
+
if img.size != (width, height):
|
|
474
|
+
img = img.crop((0, 0, width, height))
|
|
475
|
+
|
|
476
|
+
frame_arr = np.array(img)
|
|
477
|
+
writer.append_data(frame_arr)
|
|
@@ -300,6 +300,7 @@ def default_bd():
|
|
|
300
300
|
templates["SLF_roi1_L"],
|
|
301
301
|
templates["IFO_roi1_L"],
|
|
302
302
|
templates["pARC_xroi1_L"],
|
|
303
|
+
templates["TPSPL_roi1_L"],
|
|
303
304
|
],
|
|
304
305
|
"space": "template",
|
|
305
306
|
"start": templates["pARC_L_start"],
|
|
@@ -316,6 +317,7 @@ def default_bd():
|
|
|
316
317
|
templates["SLF_roi1_R"],
|
|
317
318
|
templates["IFO_roi1_R"],
|
|
318
319
|
templates["pARC_xroi1_R"],
|
|
320
|
+
templates["TPSPL_roi1_R"],
|
|
319
321
|
],
|
|
320
322
|
"space": "template",
|
|
321
323
|
"start": templates["pARC_R_start"],
|
|
@@ -325,6 +327,44 @@ def default_bd():
|
|
|
325
327
|
"length": {"min_len": 30},
|
|
326
328
|
"primary_axis": "I/S",
|
|
327
329
|
},
|
|
330
|
+
"Left Temporo-parietal": {
|
|
331
|
+
"cross_midline": False,
|
|
332
|
+
"include": [
|
|
333
|
+
templates["SLFt_roi2_L"],
|
|
334
|
+
templates["TPSPL_roi1_L"],
|
|
335
|
+
],
|
|
336
|
+
"exclude": [
|
|
337
|
+
templates["SLF_roi1_L"],
|
|
338
|
+
templates["IFO_roi1_L"],
|
|
339
|
+
templates["pARC_xroi1_L"],
|
|
340
|
+
],
|
|
341
|
+
"space": "template",
|
|
342
|
+
"start": templates["pARC_L_start"],
|
|
343
|
+
"end": templates["pARC_L_end"],
|
|
344
|
+
"Left Arcuate": {"overlap": 20},
|
|
345
|
+
"Left Optic Radiation": {"core": "Right"},
|
|
346
|
+
"length": {"min_len": 30},
|
|
347
|
+
"primary_axis": "I/S",
|
|
348
|
+
},
|
|
349
|
+
"Right Temporo-parietal": {
|
|
350
|
+
"cross_midline": False,
|
|
351
|
+
"include": [
|
|
352
|
+
templates["SLFt_roi2_R"],
|
|
353
|
+
templates["TPSPL_roi1_R"],
|
|
354
|
+
],
|
|
355
|
+
"exclude": [
|
|
356
|
+
templates["SLF_roi1_R"],
|
|
357
|
+
templates["IFO_roi1_R"],
|
|
358
|
+
templates["pARC_xroi1_R"],
|
|
359
|
+
],
|
|
360
|
+
"space": "template",
|
|
361
|
+
"start": templates["pARC_R_start"],
|
|
362
|
+
"end": templates["pARC_R_end"],
|
|
363
|
+
"Right Arcuate": {"overlap": 20},
|
|
364
|
+
"Right Optic Radiation": {"core": "Left"},
|
|
365
|
+
"length": {"min_len": 30},
|
|
366
|
+
"primary_axis": "I/S",
|
|
367
|
+
},
|
|
328
368
|
"Left Vertical Occipital": {
|
|
329
369
|
"cross_midline": False,
|
|
330
370
|
"space": "template",
|
|
@@ -347,7 +387,7 @@ def default_bd():
|
|
|
347
387
|
"primary_axis": "I/S",
|
|
348
388
|
"ORG_spectral_subbundles": SpectralSubbundleDict(
|
|
349
389
|
{
|
|
350
|
-
"Left
|
|
390
|
+
"Left Early Visual": {
|
|
351
391
|
"cluster_IDs": [78],
|
|
352
392
|
"Left Optic Radiation": {
|
|
353
393
|
"core": "Anterior",
|
|
@@ -409,7 +449,7 @@ def default_bd():
|
|
|
409
449
|
"primary_axis": "I/S",
|
|
410
450
|
"ORG_spectral_subbundles": SpectralSubbundleDict(
|
|
411
451
|
{
|
|
412
|
-
"Right
|
|
452
|
+
"Right Early Visual": {
|
|
413
453
|
"cluster_IDs": [78],
|
|
414
454
|
"Right Optic Radiation": {
|
|
415
455
|
"core": "Anterior",
|
|
@@ -18,7 +18,7 @@ from dipy.io.stateful_tractogram import Space, StatefulTractogram
|
|
|
18
18
|
from dipy.io.streamline import save_tractogram
|
|
19
19
|
from dipy.utils.parallel import paramap
|
|
20
20
|
from PIL import Image
|
|
21
|
-
from tqdm import tqdm
|
|
21
|
+
from tqdm.auto import tqdm
|
|
22
22
|
|
|
23
23
|
import AFQ.api.bundle_dict as abd
|
|
24
24
|
import AFQ.definitions.image as afm
|
|
@@ -555,7 +555,7 @@ class GroupAFQ(object):
|
|
|
555
555
|
ses
|
|
556
556
|
]
|
|
557
557
|
seg_sft = aus.SegmentedSFT.fromfile(this_bundles_file, this_img)
|
|
558
|
-
seg_sft.
|
|
558
|
+
seg_sft.to_rasmm()
|
|
559
559
|
subses_info.append((seg_sft, this_mapping, this_img, this_reg_template))
|
|
560
560
|
|
|
561
561
|
bundle_dict = self.export("bundle_dict", collapse=False)[
|
|
@@ -567,7 +567,7 @@ class GroupAFQ(object):
|
|
|
567
567
|
for b in bundle_dict.bundle_names:
|
|
568
568
|
for i in range(len(self.valid_sub_list)):
|
|
569
569
|
seg_sft, mapping, img, reg_template = subses_info[i]
|
|
570
|
-
idx = seg_sft.
|
|
570
|
+
idx = seg_sft.get_bundle_idxs(b)
|
|
571
571
|
# use the first subses that works
|
|
572
572
|
# otherwise try each successive subses
|
|
573
573
|
if len(idx) == 0:
|
|
@@ -22,7 +22,7 @@ from dipy.io.streamline import (
|
|
|
22
22
|
from dipy.segment.clustering import QuickBundles
|
|
23
23
|
from dipy.segment.featurespeed import ResampleFeature
|
|
24
24
|
from dipy.segment.metric import AveragePointwiseEuclideanMetric
|
|
25
|
-
from tqdm import tqdm
|
|
25
|
+
from tqdm.auto import tqdm
|
|
26
26
|
|
|
27
27
|
from AFQ._fixes import get_simplified_transform
|
|
28
28
|
from AFQ.data.utils import aws_import_msg_error
|
|
@@ -783,6 +783,8 @@ template_fnames = [
|
|
|
783
783
|
"VOF_xroi1_R.nii.gz",
|
|
784
784
|
"VOF_xroi2_L.nii.gz",
|
|
785
785
|
"VOF_xroi2_R.nii.gz",
|
|
786
|
+
"TPSPL_roi1_L.nii.gz",
|
|
787
|
+
"TPSPL_roi1_R.nii.gz",
|
|
786
788
|
]
|
|
787
789
|
|
|
788
790
|
|
|
@@ -903,6 +905,8 @@ template_remote_fnames = [
|
|
|
903
905
|
"62582596",
|
|
904
906
|
"62582599",
|
|
905
907
|
"62582602",
|
|
908
|
+
"64928463",
|
|
909
|
+
"64928466",
|
|
906
910
|
]
|
|
907
911
|
|
|
908
912
|
|
|
@@ -1024,6 +1028,8 @@ template_md5_hashes = [
|
|
|
1024
1028
|
"0cda34ce714759bad909fcf9051f3d64",
|
|
1025
1029
|
"6b65a5e178853e993f52b438ffb0f6c6",
|
|
1026
1030
|
"e36f5adf08eb3efd5849397f0f8ef6a4",
|
|
1031
|
+
"4418a1277ff768a5752368edda2bbcac",
|
|
1032
|
+
"44db3c4b841bca2e8b56ef4f650fa3d5",
|
|
1027
1033
|
]
|
|
1028
1034
|
|
|
1029
1035
|
fetch_templates = _make_reusable_fetcher(
|
|
@@ -14,7 +14,7 @@ from dipy.data import get_sphere
|
|
|
14
14
|
from dipy.direction import peak_directions
|
|
15
15
|
from dipy.reconst.shm import sh_to_sf, sh_to_sf_matrix, sph_harm_ind_list
|
|
16
16
|
from numba import config, njit, prange, set_num_threads
|
|
17
|
-
from tqdm import tqdm
|
|
17
|
+
from tqdm.auto import tqdm
|
|
18
18
|
|
|
19
19
|
logger = logging.getLogger("AFQ")
|
|
20
20
|
|
|
@@ -11,14 +11,6 @@ import AFQ.utils.models as ut
|
|
|
11
11
|
__all__ = ["fit_dki", "predict"]
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def _fit(gtab, data, mask=None, return_S0_hat=False):
|
|
15
|
-
dkimodel = dki.DiffusionKurtosisModel(gtab, return_S0_hat=return_S0_hat)
|
|
16
|
-
return dkimodel.fit(
|
|
17
|
-
data,
|
|
18
|
-
mask=mask,
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
|
|
22
14
|
def fit_dki(
|
|
23
15
|
data_files,
|
|
24
16
|
bval_files,
|
|
@@ -2,7 +2,7 @@ import numpy as np
|
|
|
2
2
|
import osqp
|
|
3
3
|
from dipy.reconst.mcsd import MSDeconvFit, MultiShellDeconvModel
|
|
4
4
|
from scipy.sparse import csr_matrix
|
|
5
|
-
from tqdm import tqdm
|
|
5
|
+
from tqdm.auto import tqdm
|
|
6
6
|
|
|
7
7
|
__all__ = ["MultiShellDeconvModel"]
|
|
8
8
|
|
|
@@ -28,12 +28,6 @@ def _fit(self, data, mask=None):
|
|
|
28
28
|
for i in range(A.shape[0]):
|
|
29
29
|
A[i] /= np.linalg.norm(A[i])
|
|
30
30
|
|
|
31
|
-
A_outer = np.empty((n, n, m), dtype=np.float64)
|
|
32
|
-
for k in range(m):
|
|
33
|
-
for i in range(n):
|
|
34
|
-
for j in range(n):
|
|
35
|
-
A_outer[i, j, k] = A[k, i] * A[k, j]
|
|
36
|
-
|
|
37
31
|
Q = R.T @ R
|
|
38
32
|
|
|
39
33
|
A = csr_matrix(A)
|
|
@@ -11,7 +11,7 @@ from dipy.segment.clustering import QuickBundles
|
|
|
11
11
|
from dipy.segment.featurespeed import ResampleFeature
|
|
12
12
|
from dipy.segment.metricspeed import AveragePointwiseEuclideanMetric
|
|
13
13
|
from scipy.ndimage import distance_transform_edt
|
|
14
|
-
from tqdm import tqdm
|
|
14
|
+
from tqdm.auto import tqdm
|
|
15
15
|
from trx.io import load as load_trx
|
|
16
16
|
|
|
17
17
|
import AFQ.recognition.cleaning as abc
|
|
@@ -7,8 +7,9 @@ import dipy.tracking.streamlinespeed as dps
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
from dipy.io.stateful_tractogram import Space, StatefulTractogram
|
|
9
9
|
from dipy.io.streamline import save_tractogram
|
|
10
|
+
from dipy.tracking import Streamlines
|
|
10
11
|
from dipy.tracking.distances import bundles_distances_mdf
|
|
11
|
-
from tqdm import tqdm
|
|
12
|
+
from tqdm.auto import tqdm
|
|
12
13
|
|
|
13
14
|
axes_dict = {
|
|
14
15
|
"L/R": 0,
|
|
@@ -125,11 +126,16 @@ def resample_tg(tg, n_points):
|
|
|
125
126
|
if len(tg.shape) > 2:
|
|
126
127
|
streamlines = tg.tolist()
|
|
127
128
|
streamlines = [np.asarray(item) for item in streamlines]
|
|
129
|
+
else:
|
|
130
|
+
streamlines = [np.asarray(tg)]
|
|
128
131
|
elif hasattr(tg, "streamlines"):
|
|
129
132
|
streamlines = tg.streamlines
|
|
130
133
|
else:
|
|
131
134
|
streamlines = tg
|
|
132
135
|
|
|
136
|
+
streamlines = Streamlines(streamlines)
|
|
137
|
+
if streamlines._data.dtype != np.float32:
|
|
138
|
+
streamlines._data = streamlines._data.astype(np.float32)
|
|
133
139
|
return dps.set_number_of_points(streamlines, n_points)
|
|
134
140
|
|
|
135
141
|
|
|
@@ -27,7 +27,6 @@ from AFQ.models.asym_filtering import (
|
|
|
27
27
|
)
|
|
28
28
|
from AFQ.models.csd import CsdNanResponseError
|
|
29
29
|
from AFQ.models.csd import _fit as csd_fit_model
|
|
30
|
-
from AFQ.models.dki import _fit as dki_fit_model
|
|
31
30
|
from AFQ.models.dti import _fit as dti_fit_model
|
|
32
31
|
from AFQ.models.dti import noise_from_b0
|
|
33
32
|
from AFQ.models.fwdti import _fit as fwdti_fit_model
|
|
@@ -315,7 +314,11 @@ def dki_params(brain_mask, gtab, data, citations):
|
|
|
315
314
|
)
|
|
316
315
|
)
|
|
317
316
|
mask = nib.load(brain_mask).get_fdata()
|
|
318
|
-
|
|
317
|
+
dkimodel = dpy_dki.DiffusionKurtosisModel(gtab, return_S0_hat=True)
|
|
318
|
+
dkf = dkimodel.fit(
|
|
319
|
+
data,
|
|
320
|
+
mask=mask,
|
|
321
|
+
)
|
|
319
322
|
meta = dict(
|
|
320
323
|
Description=(
|
|
321
324
|
"Diffusion Coefficient, encoded as a kurtosis tensor representation"
|
|
@@ -408,7 +411,9 @@ def msdki_msd(msdki_tf):
|
|
|
408
411
|
full path to a nifti file containing
|
|
409
412
|
the MSDKI mean signal diffusivity
|
|
410
413
|
"""
|
|
411
|
-
|
|
414
|
+
msd = msdki_tf.msd.copy()
|
|
415
|
+
msd[msd < 0] = 0
|
|
416
|
+
return msd, {"Description": "Mean Signal Diffusivity"}
|
|
412
417
|
|
|
413
418
|
|
|
414
419
|
@immlib.calc("msdki_msk")
|
|
@@ -419,7 +424,10 @@ def msdki_msk(msdki_tf):
|
|
|
419
424
|
full path to a nifti file containing
|
|
420
425
|
the MSDKI mean signal kurtosis
|
|
421
426
|
"""
|
|
422
|
-
|
|
427
|
+
msk = msdki_tf.msk.copy()
|
|
428
|
+
msk[msk < 0] = 0
|
|
429
|
+
msk[msk > 10] = 0
|
|
430
|
+
return msk, {"Description": "Mean Signal Kurtosis"}
|
|
423
431
|
|
|
424
432
|
|
|
425
433
|
@immlib.calc("csd_params")
|
|
@@ -1480,7 +1488,13 @@ def get_data_plan(kwargs):
|
|
|
1480
1488
|
if "scalars" not in kwargs:
|
|
1481
1489
|
bvals, _ = read_bvals_bvecs(kwargs["bval_file"], kwargs["bvec_file"])
|
|
1482
1490
|
if len(dpg.unique_bvals_magnitude(bvals)) > 2:
|
|
1483
|
-
kwargs["scalars"] = [
|
|
1491
|
+
kwargs["scalars"] = [
|
|
1492
|
+
"dti_fa",
|
|
1493
|
+
"dti_md",
|
|
1494
|
+
"t1w_over_b0",
|
|
1495
|
+
"msdki_msd",
|
|
1496
|
+
"msdki_msk",
|
|
1497
|
+
]
|
|
1484
1498
|
else:
|
|
1485
1499
|
kwargs["scalars"] = ["dti_fa", "dti_md", "t1w_over_b0"]
|
|
1486
1500
|
else:
|
|
@@ -38,9 +38,7 @@ logger = logging.getLogger("AFQ")
|
|
|
38
38
|
|
|
39
39
|
@immlib.calc("bundles")
|
|
40
40
|
@as_file("_desc-bundles_tractography")
|
|
41
|
-
def segment(
|
|
42
|
-
structural_imap, data_imap, mapping_imap, tractography_imap, segmentation_params
|
|
43
|
-
):
|
|
41
|
+
def segment(data_imap, mapping_imap, tractography_imap, segmentation_params):
|
|
44
42
|
"""
|
|
45
43
|
full path to a trk/trx file containing containing
|
|
46
44
|
segmented streamlines, labeled by bundle
|
|
@@ -93,16 +91,15 @@ def segment(
|
|
|
93
91
|
**segmentation_params,
|
|
94
92
|
)
|
|
95
93
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if len(seg_sft.sft) < 1:
|
|
94
|
+
if len(bundles) == 0:
|
|
99
95
|
raise ValueError("Fatal: No bundles recognized.")
|
|
100
96
|
|
|
97
|
+
seg_sft = aus.SegmentedSFT(bundles)
|
|
98
|
+
|
|
101
99
|
if is_trx:
|
|
102
|
-
seg_sft.sft.dtype_dict = {"positions": np.
|
|
100
|
+
seg_sft.sft.dtype_dict = {"positions": np.float16, "offsets": np.uint32}
|
|
103
101
|
tgram = TrxFile.from_sft(seg_sft.sft)
|
|
104
102
|
tgram.groups = seg_sft.bundle_idxs
|
|
105
|
-
|
|
106
103
|
else:
|
|
107
104
|
tgram = seg_sft.sft
|
|
108
105
|
|
|
@@ -154,8 +151,8 @@ def export_bundles(base_fname, output_dir, bundles, tracking_params):
|
|
|
154
151
|
if len(bundle_sft) > 0:
|
|
155
152
|
logger.info(f"Saving {fname}")
|
|
156
153
|
if is_trx:
|
|
157
|
-
|
|
158
|
-
"positions": np.
|
|
154
|
+
bundle_sft.dtype_dict = {
|
|
155
|
+
"positions": np.float16,
|
|
159
156
|
"offsets": np.uint32,
|
|
160
157
|
}
|
|
161
158
|
trxfile = TrxFile.from_sft(bundle_sft)
|
|
@@ -209,15 +206,9 @@ def export_bundle_lengths(bundles):
|
|
|
209
206
|
len_data[f"{bundle} Median"] = 0
|
|
210
207
|
len_data[f"{bundle} Min"] = 0
|
|
211
208
|
len_data[f"{bundle} Max"] = 0
|
|
212
|
-
len_data["Total Recognized Median"] = np.median(
|
|
213
|
-
|
|
214
|
-
)
|
|
215
|
-
len_data["Total Recognized Min"] = np.min(
|
|
216
|
-
seg_sft.sft._tractogram._streamlines._lengths
|
|
217
|
-
)
|
|
218
|
-
len_data["Total Recognized Max"] = np.max(
|
|
219
|
-
seg_sft.sft._tractogram._streamlines._lengths
|
|
220
|
-
)
|
|
209
|
+
len_data["Total Recognized Median"] = np.median(seg_sft.get_lengths())
|
|
210
|
+
len_data["Total Recognized Min"] = np.min(seg_sft.get_lengths())
|
|
211
|
+
len_data["Total Recognized Max"] = np.max(seg_sft.get_lengths())
|
|
221
212
|
|
|
222
213
|
counts_df = pd.DataFrame(
|
|
223
214
|
data=len_data,
|
|
@@ -297,7 +288,7 @@ def tract_profiles(
|
|
|
297
288
|
reference = nib.load(scalar_dict[list(scalar_dict.keys())[0]])
|
|
298
289
|
seg_sft = aus.SegmentedSFT.fromfile(bundles, reference=reference)
|
|
299
290
|
|
|
300
|
-
seg_sft.
|
|
291
|
+
seg_sft.to_rasmm()
|
|
301
292
|
for bundle_name in seg_sft.bundle_names:
|
|
302
293
|
this_sl = seg_sft.get_bundle(bundle_name).streamlines
|
|
303
294
|
if len(this_sl) == 0:
|
|
@@ -398,14 +389,14 @@ def get_scalar_dict(
|
|
|
398
389
|
"dki_mk", or other scalars found in AFQ.tasks.data.
|
|
399
390
|
Can also be a scalar from AFQ.definitions.image.
|
|
400
391
|
Finally, can also be "t1w".
|
|
401
|
-
Defaults for single shell data to ["dti_fa", "dti_md", "
|
|
402
|
-
and for multi-shell data to ["
|
|
403
|
-
"
|
|
404
|
-
Default: ['dti_fa', 'dti_md', '
|
|
392
|
+
Defaults for single shell data to ["dti_fa", "dti_md", "t1w_over_b0"],
|
|
393
|
+
and for multi-shell data to ["dti_fa", "dti_md", "t1w_over_b0",
|
|
394
|
+
"msdki_msd", "msdki_msk"].
|
|
395
|
+
Default: ['dti_fa', 'dti_md', 't1w_over_b0']
|
|
405
396
|
"""
|
|
406
|
-
# Note: some scalars preprocessing done in
|
|
397
|
+
# Note: some scalars preprocessing done in data plan, before this step
|
|
407
398
|
if scalars is None:
|
|
408
|
-
scalars = ["dti_fa", "dti_md", "
|
|
399
|
+
scalars = ["dti_fa", "dti_md", "t1w_over_b0"]
|
|
409
400
|
scalar_dict = {}
|
|
410
401
|
for scalar in scalars:
|
|
411
402
|
if isinstance(scalar, str):
|
|
@@ -2,6 +2,7 @@ import logging
|
|
|
2
2
|
|
|
3
3
|
import immlib
|
|
4
4
|
import nibabel as nib
|
|
5
|
+
import numpy as np
|
|
5
6
|
from numba import get_num_threads
|
|
6
7
|
|
|
7
8
|
from AFQ.definitions.utils import Definition
|
|
@@ -90,7 +91,7 @@ def onnx_kwargs(
|
|
|
90
91
|
|
|
91
92
|
@immlib.calc("synthseg_model")
|
|
92
93
|
@as_file(suffix="_model-synthseg2_probseg.nii.gz", subfolder="nn")
|
|
93
|
-
def synthseg_model(
|
|
94
|
+
def synthseg_model(t1_file, citations, onnx_kwargs):
|
|
94
95
|
"""
|
|
95
96
|
full path to the synthseg2 model segmentations
|
|
96
97
|
|
|
@@ -110,9 +111,9 @@ def synthseg_model(t1_masked, citations, onnx_kwargs):
|
|
|
110
111
|
"SynthSeg 2.0",
|
|
111
112
|
"Or, provide your own segmentations using PVEImage or PVEImages.",
|
|
112
113
|
)
|
|
113
|
-
t1_img = nib.load(
|
|
114
|
+
t1_img = nib.load(t1_file)
|
|
114
115
|
predictions = run_synthseg(ort, t1_img, "synthseg2", onnx_kwargs)
|
|
115
|
-
return predictions, dict(T1w=
|
|
116
|
+
return predictions, dict(T1w=t1_file)
|
|
116
117
|
|
|
117
118
|
|
|
118
119
|
@immlib.calc("mx_model")
|
|
@@ -143,7 +144,7 @@ def mx_model(t1_file, t1w_brain_mask, citations, onnx_kwargs):
|
|
|
143
144
|
|
|
144
145
|
@immlib.calc("t1w_brain_mask")
|
|
145
146
|
@as_file(suffix="_desc-T1w_mask.nii.gz")
|
|
146
|
-
def t1w_brain_mask(
|
|
147
|
+
def t1w_brain_mask(synthseg_model, brain_mask_definition=None):
|
|
147
148
|
"""
|
|
148
149
|
full path to a nifti file containing brain mask from T1w image
|
|
149
150
|
|
|
@@ -154,28 +155,27 @@ def t1w_brain_mask(t1_file, citations, onnx_kwargs, brain_mask_definition=None):
|
|
|
154
155
|
the brain mask, which gets applied before registration to a
|
|
155
156
|
template.
|
|
156
157
|
If you want no brain mask to be applied, use FullImage.
|
|
157
|
-
If None, use
|
|
158
|
+
If None, use Synthseg model.
|
|
158
159
|
Default: None
|
|
159
160
|
|
|
160
161
|
References
|
|
161
162
|
----------
|
|
162
|
-
[1]
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
[1] Billot, Benjamin, et al. "Robust machine learning segmentation
|
|
164
|
+
for large-scale analysis of heterogeneous clinical brain MRI
|
|
165
|
+
datasets." Proceedings of the National Academy of Sciences 120.9
|
|
166
|
+
(2023): e2216399120.
|
|
167
|
+
[2] Billot, Benjamin, et al. "SynthSeg: Segmentation of brain MRI scans
|
|
168
|
+
of any contrast and resolution without retraining." Medical image
|
|
169
|
+
analysis 86 (2023): 102789.
|
|
166
170
|
"""
|
|
167
171
|
# Note that any case where brain_mask_definition is not None
|
|
168
|
-
# is handled in
|
|
172
|
+
# is handled in get_structural_plan
|
|
169
173
|
# This is just the default
|
|
170
174
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
)
|
|
176
|
-
return run_brainchop(ort, nib.load(t1_file), "mindgrab", onnx_kwargs), dict(
|
|
177
|
-
T1w=t1_file, model="mindgrab"
|
|
178
|
-
)
|
|
175
|
+
predictions = nib.load(synthseg_model)
|
|
176
|
+
brain_mask = (predictions.get_fdata() > 0).astype(np.uint8)
|
|
177
|
+
brain_mask_img = nib.Nifti1Image(brain_mask, predictions.affine)
|
|
178
|
+
return brain_mask_img, dict(SynthsegPredictions=synthseg_model)
|
|
179
179
|
|
|
180
180
|
|
|
181
181
|
@immlib.calc("t1_masked")
|