pyAFQ 3.2__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.2 → pyafq-3.3}/.codespellrc +1 -1
- {pyafq-3.2 → pyafq-3.3}/.gitignore +0 -2
- {pyafq-3.2 → pyafq-3.3}/AFQ/_fixes.py +60 -23
- {pyafq-3.2 → pyafq-3.3}/AFQ/api/bundle_dict.py +2 -2
- {pyafq-3.2 → pyafq-3.3}/AFQ/api/group.py +3 -3
- {pyafq-3.2 → pyafq-3.3}/AFQ/api/participant.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/data/fetch.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/asym_filtering.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/msmt.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/nn/multiaxial.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/criteria.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/utils.py +7 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/segmentation.py +11 -20
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/tractography.py +1 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/viz.py +11 -11
- {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/tractography.py +4 -1
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/conversion.py +1 -1
- pyafq-3.3/AFQ/utils/docs.py +24 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/streamlines.py +75 -17
- pyafq-3.3/AFQ/utils/tests/test_streamlines.py +185 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/version.py +3 -3
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/fury_backend.py +23 -12
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/plotly_backend.py +43 -19
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/utils.py +23 -44
- {pyafq-3.2 → pyafq-3.3}/CHANGES.rst +6 -0
- {pyafq-3.2 → pyafq-3.3}/PKG-INFO +8 -8
- {pyafq-3.2 → pyafq-3.3}/docs/Makefile +5 -23
- {pyafq-3.2 → pyafq-3.3}/docs/source/conf.py +19 -28
- pyafq-3.3/docs/source/examples/howto_examples/acoustic_radiations.md +133 -0
- pyafq-3.2/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.2/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.2/examples/howto_examples/cloudknot_hcp_example.py → pyafq-3.3/docs/source/examples/howto_examples/cloudknot_hcp_example.md +105 -63
- pyafq-3.2/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.2/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.2/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.2/examples/howto_examples/vof_example.py → pyafq-3.3/docs/source/examples/howto_examples/vof_example.md +24 -7
- pyafq-3.2/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.2/examples/tutorial_examples/plot_007_rois.py → pyafq-3.3/docs/source/examples/tutorial_examples/plot_007_rois.md +37 -12
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/index.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/converter.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/data.rst +2 -2
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/index.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/index.rst +5 -5
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/bundledict.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/fibertracts.rst +6 -6
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/kwargs.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/methods.rst +1 -1
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/viz_backend.rst +8 -8
- {pyafq-3.2 → pyafq-3.3}/docs/source/tutorials/index.rst +3 -5
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/PKG-INFO +8 -8
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/SOURCES.txt +25 -26
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/requires.txt +7 -8
- {pyafq-3.2 → pyafq-3.3}/setup.cfg +5 -5
- pyafq-3.2/AFQ/utils/docs.py +0 -55
- pyafq-3.2/AFQ/utils/tests/test_streamlines.py +0 -74
- pyafq-3.2/docs/source/_progressbars.py +0 -33
- pyafq-3.2/examples/howto_examples/acoustic_radiations.py +0 -119
- pyafq-3.2/examples/howto_examples/afq_callosal.py +0 -104
- pyafq-3.2/examples/howto_examples/afq_fwdti.py +0 -162
- pyafq-3.2/examples/howto_examples/baby_afq.py +0 -152
- pyafq-3.2/examples/howto_examples/cloudknot_example.py +0 -163
- pyafq-3.2/examples/howto_examples/optic_radiations.py +0 -155
- pyafq-3.2/examples/howto_examples/optic_tract.py +0 -176
- pyafq-3.2/examples/howto_examples/pyAFQ_with_GPU.py +0 -58
- pyafq-3.2/examples/howto_examples/recobundles.py +0 -59
- pyafq-3.2/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -147
- pyafq-3.2/examples/tutorial_examples/plot_001_group_afq_api.py +0 -308
- pyafq-3.2/examples/tutorial_examples/plot_002_participant_afq_api.py +0 -268
- pyafq-3.2/examples/tutorial_examples/plot_003_rerun.py +0 -160
- pyafq-3.2/examples/tutorial_examples/plot_004_export.py +0 -192
- pyafq-3.2/examples/tutorial_examples/plot_005_viz.py +0 -436
- pyafq-3.2/examples/tutorial_examples/plot_006_bids_layout.py +0 -297
- {pyafq-3.2 → pyafq-3.3}/.github/CITATION.cff +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/CONTRIBUTING.md +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/docbuild.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/docker_pyafq.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_anisotropic_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_basic_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_custom_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_reco80_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_reco_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/publish-to-test-pypi.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.github/workflows/test.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.mailmap +0 -0
- {pyafq-3.2 → pyafq-3.3}/.maintenance/update_changes.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/.maintenance/update_zenodo.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/.pep8speaks.yml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.pre-commit-config.yaml +0 -0
- {pyafq-3.2 → pyafq-3.3}/.zenodo.json +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/api/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/api/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/data/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/data/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/image.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/mapping.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/QBallTP.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/csd.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/dki.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/dti.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/fwdti.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/models/wmgm_interface.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/nn/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/nn/brainchop.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/nn/synthseg.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/nn/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/cleaning.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/clustering.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/curvature.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/other_bundles.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/preprocess.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/recognize.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/roi.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/sparse_decisions.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/conftest.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_other_bundles.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_recognition.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_rois.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/registration.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/data.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/decorators.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/mapping.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/structural.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/tissue.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
- {pyafq-3.2 → 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.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_api.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_bundle_dict.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_csd.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_data.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_definitions.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_dki.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_dti.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_fixes.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_msmt.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_nn.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_registration.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_tractography.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_viz.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/utils.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/bin.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/docstring_parser.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/models.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/path.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/stats.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/testing.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_conversions.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_path.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_stats.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_volume.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/utils/volume.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/__init__.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/altair.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/AFQ/viz/plot.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/CITATION +0 -0
- {pyafq-3.2 → pyafq-3.3}/LICENSE +0 -0
- {pyafq-3.2 → pyafq-3.3}/MANIFEST.in +0 -0
- {pyafq-3.2 → pyafq-3.3}/Makefile +0 -0
- {pyafq-3.2 → pyafq-3.3}/NOTICE.md +0 -0
- {pyafq-3.2 → pyafq-3.3}/README.md +0 -0
- {pyafq-3.2 → pyafq-3.3}/bin/pyAFQ +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/CSVfile.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/FAbrain.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/ProfileViz.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/TP_viz.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/arcuaterois.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/beaware.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/custom.css +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/diffusion-anisotropic.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/diffusion-isotropic.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/down_left_arrow.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/down_right_arrow.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/dti_in_brain.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/dtiexplanation.jpg +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/eScience_Logo_HR.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/ecosystem.jpg +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/escience-logo.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/greencheck.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/inherintambiguity.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/logo.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/modelling.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/modeltotrack.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_001.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_002.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_003.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_004.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_005.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_006.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_010.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_011.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_012.gif +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_modeling2.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_profiling.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_recognition.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_tractography.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tractometry_pipeline.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tropic.png +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_templates/footer.html +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/_templates/layout.html +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/bib.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/developing/contributing.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/developing/definitions.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/developing/index.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/developing/releasing.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/developing/tasks.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/bundle_orientation.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/modeling.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/profiling.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/recognition.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/tractography.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/whats_new_3.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/guides_index.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/cite.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/cleaning_params.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/docker.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/getting_help.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/image.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/installation_guide.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/rerun.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/scalars.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/segmentation_params.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/singularity.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/howto/tractography_params.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/index.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/mapping.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/reference/tissue_properties.rst +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/references.bib +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/kwargsdocs.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/methodsdocs.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/updatedocs.py +0 -0
- {pyafq-3.2 → pyafq-3.3}/docs/upload-gh-pages.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/gpu_docker/Dockerfile +0 -0
- {pyafq-3.2 → pyafq-3.3}/gpu_docker/docker-build.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/gpu_docker/docker-push.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/gpu_docker/pyafq_with_gpu_template.def +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/dependency_links.txt +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/not-zip-safe +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/top_level.txt +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyafq_docker/Dockerfile +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyafq_docker/docker-build.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyafq_docker/docker-push.sh +0 -0
- {pyafq-3.2 → pyafq-3.3}/pyproject.toml +0 -0
- {pyafq-3.2 → pyafq-3.3}/setup.py +0 -0
- {pyafq-3.2 → 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)
|
|
@@ -387,7 +387,7 @@ def default_bd():
|
|
|
387
387
|
"primary_axis": "I/S",
|
|
388
388
|
"ORG_spectral_subbundles": SpectralSubbundleDict(
|
|
389
389
|
{
|
|
390
|
-
"Left
|
|
390
|
+
"Left Early Visual": {
|
|
391
391
|
"cluster_IDs": [78],
|
|
392
392
|
"Left Optic Radiation": {
|
|
393
393
|
"core": "Anterior",
|
|
@@ -449,7 +449,7 @@ def default_bd():
|
|
|
449
449
|
"primary_axis": "I/S",
|
|
450
450
|
"ORG_spectral_subbundles": SpectralSubbundleDict(
|
|
451
451
|
{
|
|
452
|
-
"Right
|
|
452
|
+
"Right Early Visual": {
|
|
453
453
|
"cluster_IDs": [78],
|
|
454
454
|
"Right Optic Radiation": {
|
|
455
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
|
|
@@ -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,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
|
|
|
@@ -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:
|
|
@@ -120,13 +120,13 @@ def viz_bundles(
|
|
|
120
120
|
)
|
|
121
121
|
|
|
122
122
|
fname = None
|
|
123
|
-
if "
|
|
124
|
-
fname = get_fname(base_fname, ".
|
|
123
|
+
if "no_mp4" not in viz_backend.backend:
|
|
124
|
+
fname = get_fname(base_fname, ".mp4", "..")
|
|
125
125
|
|
|
126
126
|
try:
|
|
127
|
-
viz_backend.
|
|
127
|
+
viz_backend.create_mp4(figure, fname)
|
|
128
128
|
except PermissionError as e:
|
|
129
|
-
logger.warning(f"Failed to write
|
|
129
|
+
logger.warning(f"Failed to write MP4 file: {fname} \n{e}")
|
|
130
130
|
if "plotly" in viz_backend.backend:
|
|
131
131
|
fname = get_fname(base_fname, ".html", "..")
|
|
132
132
|
|
|
@@ -156,7 +156,7 @@ def viz_indivBundle(
|
|
|
156
156
|
n_points_indiv=40,
|
|
157
157
|
):
|
|
158
158
|
"""
|
|
159
|
-
list of full paths to html or
|
|
159
|
+
list of full paths to html or mp4 files
|
|
160
160
|
containing visualizations of individual bundles
|
|
161
161
|
|
|
162
162
|
Parameters
|
|
@@ -255,15 +255,15 @@ def viz_indivBundle(
|
|
|
255
255
|
|
|
256
256
|
base_fname = op.join(output_dir, op.split(base_fname)[1])
|
|
257
257
|
figures[bundle_name] = figure
|
|
258
|
-
if "
|
|
258
|
+
if "no_mp4" not in viz_backend.backend:
|
|
259
259
|
fname = get_fname(
|
|
260
260
|
base_fname,
|
|
261
|
-
f"_desc-{str_to_desc(bundle_name)}_tractography.
|
|
261
|
+
f"_desc-{str_to_desc(bundle_name)}_tractography.mp4",
|
|
262
262
|
"viz_bundles",
|
|
263
263
|
)
|
|
264
264
|
|
|
265
265
|
try:
|
|
266
|
-
viz_backend.
|
|
266
|
+
viz_backend.create_mp4(figure, fname)
|
|
267
267
|
except PermissionError as e:
|
|
268
268
|
if not failed_write:
|
|
269
269
|
logger.warning(
|
|
@@ -380,7 +380,7 @@ def plot_tract_profiles(base_fname, output_dir, scalars, segmentation_imap):
|
|
|
380
380
|
|
|
381
381
|
|
|
382
382
|
@immlib.calc("viz_backend")
|
|
383
|
-
def init_viz_backend(viz_backend_spec="
|
|
383
|
+
def init_viz_backend(viz_backend_spec="plotly_no_mp4"):
|
|
384
384
|
"""
|
|
385
385
|
An instance of the `AFQ.viz.utils.viz_backend` class.
|
|
386
386
|
|
|
@@ -390,8 +390,8 @@ def init_viz_backend(viz_backend_spec="plotly_no_gif"):
|
|
|
390
390
|
Which visualization backend to use.
|
|
391
391
|
See Visualization Backends page in documentation for details
|
|
392
392
|
https://tractometry.org/pyAFQ/reference/viz_backend.html
|
|
393
|
-
One of {"fury", "plotly", "
|
|
394
|
-
Default: "
|
|
393
|
+
One of {"fury", "plotly", "plotly_no_mp4"}.
|
|
394
|
+
Default: "plotly_no_mp4"
|
|
395
395
|
"""
|
|
396
396
|
if "fury" not in viz_backend_spec and "plotly" not in viz_backend_spec:
|
|
397
397
|
raise TypeError("viz_backend_spec must contain either 'fury' or 'plotly'")
|
|
@@ -18,7 +18,7 @@ from dipy.tracking.tracker import (
|
|
|
18
18
|
)
|
|
19
19
|
from nibabel.streamlines.tractogram import LazyTractogram
|
|
20
20
|
from skimage.segmentation import find_boundaries
|
|
21
|
-
from tqdm import tqdm
|
|
21
|
+
from tqdm.auto import tqdm
|
|
22
22
|
|
|
23
23
|
from AFQ._fixes import tensor_odf
|
|
24
24
|
from AFQ.tractography.utils import gen_seeds
|
|
@@ -358,6 +358,9 @@ def track(
|
|
|
358
358
|
rng_seed=tracking_kwargs["random_seed"],
|
|
359
359
|
chunk_size=jit_chunk_size,
|
|
360
360
|
) as jit_tracker:
|
|
361
|
+
jit_tracker.set_compression_parameters(
|
|
362
|
+
pos_dtype=np.float16, linearize=False
|
|
363
|
+
)
|
|
361
364
|
if trx:
|
|
362
365
|
res = jit_tracker.generate_trx(seeds, params_img)
|
|
363
366
|
else:
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import base64
|
|
2
|
+
|
|
3
|
+
from IPython.display import HTML
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def embed_video(path):
|
|
7
|
+
with open(path, "rb") as f:
|
|
8
|
+
mp4_data = base64.b64encode(f.read()).decode()
|
|
9
|
+
return HTML(
|
|
10
|
+
f'<video controls><source src="data:video/mp4;base64,{mp4_data}" '
|
|
11
|
+
'type="video/mp4"></video>'
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def embed_image(path):
|
|
16
|
+
with open(path, "rb") as f:
|
|
17
|
+
img_data = base64.b64encode(f.read()).decode()
|
|
18
|
+
return HTML(f'<img src="data:image/png;base64,{img_data}"/>')
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def embed_html(path):
|
|
22
|
+
with open(path, "r") as f:
|
|
23
|
+
html_content = f.read()
|
|
24
|
+
return HTML(html_content)
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import os.path as op
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
|
-
from dipy.io.stateful_tractogram import Space, StatefulTractogram
|
|
4
|
+
from dipy.io.stateful_tractogram import Origin, Space, StatefulTractogram
|
|
5
5
|
from dipy.io.streamline import load_tractogram, save_tractogram
|
|
6
|
+
from nibabel.affines import voxel_sizes
|
|
7
|
+
from nibabel.orientations import aff2axcodes
|
|
6
8
|
|
|
7
9
|
try:
|
|
8
10
|
from trx.io import load as load_trx
|
|
@@ -17,8 +19,22 @@ from AFQ.utils.path import drop_extension, read_json
|
|
|
17
19
|
|
|
18
20
|
class SegmentedSFT:
|
|
19
21
|
def __init__(self, bundles, sidecar_info=None):
|
|
22
|
+
"""
|
|
23
|
+
Initialize a SegmentedSFT object.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
bundles : dict
|
|
28
|
+
A dictionary where keys are bundle names and values are either
|
|
29
|
+
StatefulTractogram objects or dictionaries with keys "sl"
|
|
30
|
+
and "idx".
|
|
31
|
+
sidecar_info : dict, optional
|
|
32
|
+
Sidecar information to optionally attach.
|
|
33
|
+
"""
|
|
34
|
+
|
|
20
35
|
if sidecar_info is None:
|
|
21
36
|
sidecar_info = {}
|
|
37
|
+
self.sidecar_info = sidecar_info
|
|
22
38
|
self.bundle_names = []
|
|
23
39
|
sls = []
|
|
24
40
|
idxs = {}
|
|
@@ -43,7 +59,6 @@ class SegmentedSFT:
|
|
|
43
59
|
else:
|
|
44
60
|
self.this_tracking_idxs = None
|
|
45
61
|
|
|
46
|
-
self.sidecar_info = sidecar_info
|
|
47
62
|
self.sidecar_info["bundle_ids"] = {}
|
|
48
63
|
dps = np.zeros(len(sls))
|
|
49
64
|
for ii, bundle_name in enumerate(self.bundle_names):
|
|
@@ -59,6 +74,15 @@ class SegmentedSFT:
|
|
|
59
74
|
)
|
|
60
75
|
self.sidecar_info["tracking_idx"] = self.this_tracking_idxs
|
|
61
76
|
|
|
77
|
+
def get_lengths(self):
|
|
78
|
+
return self.sft._tractogram._streamlines._lengths
|
|
79
|
+
|
|
80
|
+
def to_rasmm(self):
|
|
81
|
+
self.sft.to_space(Space.RASMM)
|
|
82
|
+
|
|
83
|
+
def get_bundle_idxs(self, b_name):
|
|
84
|
+
return self.bundle_idxs[b_name]
|
|
85
|
+
|
|
62
86
|
def get_bundle(self, b_name):
|
|
63
87
|
return self.sft[self.bundle_idxs[b_name]]
|
|
64
88
|
|
|
@@ -68,8 +92,6 @@ class SegmentedSFT:
|
|
|
68
92
|
@classmethod
|
|
69
93
|
def fromfile(cls, trk_or_trx_file, reference="same", sidecar_file=None):
|
|
70
94
|
if sidecar_file is None:
|
|
71
|
-
# assume json sidecar has the same name as trk_file,
|
|
72
|
-
# but with json suffix
|
|
73
95
|
sidecar_file = f"{drop_extension(trk_or_trx_file)}.json"
|
|
74
96
|
if not op.exists(sidecar_file):
|
|
75
97
|
raise ValueError(
|
|
@@ -80,20 +102,11 @@ class SegmentedSFT:
|
|
|
80
102
|
)
|
|
81
103
|
sidecar_info = read_json(sidecar_file)
|
|
82
104
|
if trk_or_trx_file.endswith(".trx"):
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if reference == "same":
|
|
87
|
-
reference = sft
|
|
88
|
-
bundles = {}
|
|
89
|
-
for bundle in trx.groups:
|
|
90
|
-
idx = trx.groups[bundle]
|
|
91
|
-
bundles[bundle] = StatefulTractogram(
|
|
92
|
-
sft.streamlines[idx], reference, Space.RASMM
|
|
93
|
-
)
|
|
105
|
+
bundles = load_trx(trk_or_trx_file, reference)
|
|
106
|
+
bundles.streamlines._data = bundles.streamlines._data.astype(np.float32)
|
|
107
|
+
return SegmentedTRX(bundles, sidecar_info)
|
|
94
108
|
else:
|
|
95
109
|
sft = load_tractogram(trk_or_trx_file, reference, to_space=Space.RASMM)
|
|
96
|
-
|
|
97
110
|
if reference == "same":
|
|
98
111
|
reference = sft
|
|
99
112
|
bundles = {}
|
|
@@ -105,8 +118,53 @@ class SegmentedSFT:
|
|
|
105
118
|
)
|
|
106
119
|
else:
|
|
107
120
|
bundles["whole_brain"] = sft
|
|
121
|
+
return SegmentedSFT(bundles, sidecar_info)
|
|
122
|
+
|
|
108
123
|
|
|
109
|
-
|
|
124
|
+
class SegmentedTRX(SegmentedSFT):
|
|
125
|
+
def __init__(self, trx, sidecar_info=None):
|
|
126
|
+
"""
|
|
127
|
+
Initialize a SegmentedTRX object.
|
|
128
|
+
|
|
129
|
+
Parameters
|
|
130
|
+
----------
|
|
131
|
+
trx : TrxFile
|
|
132
|
+
The TRX file to interact with.
|
|
133
|
+
sidecar_info : dict, optional
|
|
134
|
+
Sidecar information to optionally attach.
|
|
135
|
+
"""
|
|
136
|
+
if sidecar_info is None:
|
|
137
|
+
sidecar_info = {}
|
|
138
|
+
self.sidecar_info = sidecar_info
|
|
139
|
+
|
|
140
|
+
# Loading from TRX, we do not calculate additional information,
|
|
141
|
+
# To avoid loading unnecessary streamlines into memory
|
|
142
|
+
self.bundle_names = list(trx.groups.keys())
|
|
143
|
+
self.sft = trx
|
|
144
|
+
|
|
145
|
+
# Mimic SFT attributes for compatibility
|
|
146
|
+
affine = np.array(self.sft.header["VOXEL_TO_RASMM"], dtype=np.float32)
|
|
147
|
+
dimensions = np.array(self.sft.header["DIMENSIONS"], dtype=np.uint16)
|
|
148
|
+
vox_sizes = np.array(voxel_sizes(affine), dtype=np.float32)
|
|
149
|
+
vox_order = "".join(aff2axcodes(affine))
|
|
150
|
+
space_attributes = (affine, dimensions, vox_sizes, vox_order)
|
|
151
|
+
self.sft.space_attributes = space_attributes
|
|
152
|
+
self.sft.space = Space.RASMM
|
|
153
|
+
self.sft.origin = Origin.NIFTI
|
|
154
|
+
self.sft.dtype_dict = self.sft.get_dtype_dict()
|
|
155
|
+
|
|
156
|
+
def get_lengths(self):
|
|
157
|
+
return self.sft.streamlines._lengths
|
|
158
|
+
|
|
159
|
+
def to_rasmm(self):
|
|
160
|
+
pass # always in RASMM
|
|
161
|
+
|
|
162
|
+
def get_bundle_idxs(self, b_name):
|
|
163
|
+
return self.sft.groups[b_name]
|
|
164
|
+
|
|
165
|
+
def get_bundle(self, b_name):
|
|
166
|
+
idx = self.sft.groups[b_name]
|
|
167
|
+
return StatefulTractogram(self.sft.streamlines[idx], self.sft, Space.RASMM)
|
|
110
168
|
|
|
111
169
|
|
|
112
170
|
def split_streamline(streamlines, sl_to_split, split_idx):
|