pyAFQ 1.3.6__tar.gz → 2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/docbuild.yml +1 -1
  2. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_anisotropic_test.yml +1 -1
  3. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_basic_test.yml +1 -1
  4. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_custom_test.yml +1 -1
  5. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_pft_test.yml +1 -1
  6. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_reco80_test.yml +1 -1
  7. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_reco_test.yml +1 -1
  8. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/nightly_test.yml +1 -1
  9. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/publish-to-test-pypi.yml +1 -1
  10. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/test.yml +2 -2
  11. {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/bundle_dict.py +104 -57
  12. {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/group.py +28 -16
  13. {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/utils.py +2 -0
  14. {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/fetch.py +38 -20
  15. {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/utils.py +10 -0
  16. {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/image.py +34 -16
  17. {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/mapping.py +30 -19
  18. {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/utils.py +2 -0
  19. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/criteria.py +36 -36
  20. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/other_bundles.py +7 -5
  21. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/recognize.py +9 -9
  22. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/roi.py +16 -18
  23. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_rois.py +43 -37
  24. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_utils.py +6 -6
  25. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/utils.py +23 -18
  26. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/data.py +130 -71
  27. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/decorators.py +3 -7
  28. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/mapping.py +54 -24
  29. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/segmentation.py +39 -26
  30. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/tractography.py +92 -35
  31. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/utils.py +38 -1
  32. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/viz.py +29 -67
  33. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_api.py +10 -16
  34. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_definitions.py +12 -4
  35. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/tractography.py +33 -16
  36. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/path.py +31 -2
  37. {pyafq-1.3.6 → pyafq-2.0}/AFQ/version.py +9 -4
  38. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/plot.py +16 -2
  39. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/utils.py +32 -17
  40. {pyafq-1.3.6 → pyafq-2.0}/CHANGES.rst +36 -1
  41. {pyafq-1.3.6 → pyafq-2.0}/PKG-INFO +15 -16
  42. {pyafq-1.3.6 → pyafq-2.0}/bin/pyAFQ +0 -10
  43. {pyafq-1.3.6 → pyafq-2.0}/docs/source/conf.py +1 -1
  44. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/installation_guide.rst +21 -0
  45. pyafq-2.0/docs/source/howto/usage/singularity.rst +16 -0
  46. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_optic_radiations.py +1 -0
  47. {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_002_bids_layout.py +6 -7
  48. {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/Dockerfile +10 -6
  49. {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/cuda_track_template.def +11 -8
  50. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/PKG-INFO +15 -16
  51. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/SOURCES.txt +1 -1
  52. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/requires.txt +12 -13
  53. {pyafq-1.3.6 → pyafq-2.0}/setup.cfg +9 -12
  54. pyafq-1.3.6/AFQ/afq_bids_entities.json +0 -22
  55. {pyafq-1.3.6 → pyafq-2.0}/.github/CITATION.cff +0 -0
  56. {pyafq-1.3.6 → pyafq-2.0}/.github/CONTRIBUTING.md +0 -0
  57. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/docker_pyafq.yml +0 -0
  58. {pyafq-1.3.6 → pyafq-2.0}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  59. {pyafq-1.3.6 → pyafq-2.0}/.gitignore +0 -0
  60. {pyafq-1.3.6 → pyafq-2.0}/.mailmap +0 -0
  61. {pyafq-1.3.6 → pyafq-2.0}/.maintenance/update_changes.sh +0 -0
  62. {pyafq-1.3.6 → pyafq-2.0}/.maintenance/update_zenodo.py +0 -0
  63. {pyafq-1.3.6 → pyafq-2.0}/.pep8speaks.yml +0 -0
  64. {pyafq-1.3.6 → pyafq-2.0}/.zenodo.json +0 -0
  65. {pyafq-1.3.6 → pyafq-2.0}/AFQ/__init__.py +0 -0
  66. {pyafq-1.3.6 → pyafq-2.0}/AFQ/_fixes.py +0 -0
  67. {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/__init__.py +0 -0
  68. {pyafq-1.3.6 → pyafq-2.0}/AFQ/api/participant.py +0 -0
  69. {pyafq-1.3.6 → pyafq-2.0}/AFQ/data/__init__.py +0 -0
  70. {pyafq-1.3.6 → pyafq-2.0}/AFQ/definitions/__init__.py +0 -0
  71. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/QBallTP.py +0 -0
  72. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/__init__.py +0 -0
  73. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/csd.py +0 -0
  74. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/dki.py +0 -0
  75. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/dti.py +0 -0
  76. {pyafq-1.3.6 → pyafq-2.0}/AFQ/models/fwdti.py +0 -0
  77. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/__init__.py +0 -0
  78. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/cleaning.py +0 -0
  79. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/curvature.py +0 -0
  80. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/preprocess.py +0 -0
  81. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/__init__.py +0 -0
  82. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  83. {pyafq-1.3.6 → pyafq-2.0}/AFQ/recognition/tests/test_recognition.py +0 -0
  84. {pyafq-1.3.6 → pyafq-2.0}/AFQ/registration.py +0 -0
  85. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tasks/__init__.py +0 -0
  86. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/__init__.py +0 -0
  87. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  88. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  89. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  90. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  91. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  92. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  93. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  94. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  95. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  96. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  97. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  98. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  99. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  100. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  101. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  102. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  103. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  104. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  105. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  106. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  107. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  108. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  109. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  110. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  111. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  112. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  113. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  114. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  115. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  116. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  117. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  118. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  119. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  120. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  121. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  122. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  123. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  124. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  125. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  126. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  127. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  128. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  129. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  130. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  131. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  132. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  133. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  134. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  135. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  136. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  137. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  138. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  139. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  140. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  141. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  142. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  143. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  144. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  145. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  146. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  147. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  148. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  149. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  150. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  151. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  152. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  153. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  154. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  155. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  156. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  157. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  158. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  159. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  160. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  161. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  162. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  163. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  164. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  165. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  166. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  167. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  168. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  169. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  170. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  171. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  172. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  173. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  174. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  175. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  176. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  177. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  178. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  179. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  180. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  181. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  182. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  183. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  184. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  185. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  186. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  187. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  188. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  189. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  190. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  191. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  192. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  193. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  194. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  195. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  196. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  197. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  198. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  199. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  200. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  201. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  202. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  203. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  204. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  205. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  206. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  207. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  208. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  209. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  210. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  211. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  212. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  213. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  214. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  215. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  216. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  217. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  218. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  219. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  220. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  221. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  222. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  223. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  224. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  225. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  226. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  227. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  228. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  229. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  230. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  231. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  232. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  233. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  234. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  235. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  236. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  237. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  238. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  239. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  240. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  241. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  242. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  243. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  244. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  245. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  246. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  247. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  248. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  249. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  250. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  251. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  252. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  253. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  254. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  255. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  256. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  257. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  258. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  259. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  260. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  261. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  262. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  263. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  264. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  265. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  266. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  267. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  268. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  269. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  270. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  271. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  272. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  273. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  274. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  275. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  276. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  277. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  278. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  279. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  280. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  281. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  282. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  283. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  284. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  285. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_bundle_dict.py +0 -0
  286. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_csd.py +0 -0
  287. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_data.py +0 -0
  288. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_dki.py +0 -0
  289. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_dti.py +0 -0
  290. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_fixes.py +0 -0
  291. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_registration.py +0 -0
  292. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_tractography.py +0 -0
  293. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tests/test_viz.py +0 -0
  294. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/__init__.py +0 -0
  295. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/gputractography.py +0 -0
  296. {pyafq-1.3.6 → pyafq-2.0}/AFQ/tractography/utils.py +0 -0
  297. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/__init__.py +0 -0
  298. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/bin.py +0 -0
  299. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/conversion.py +0 -0
  300. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/docs.py +0 -0
  301. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/models.py +0 -0
  302. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/stats.py +0 -0
  303. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/streamlines.py +0 -0
  304. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/testing.py +0 -0
  305. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/__init__.py +0 -0
  306. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_conversions.py +0 -0
  307. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_path.py +0 -0
  308. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_stats.py +0 -0
  309. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_streamlines.py +0 -0
  310. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/tests/test_volume.py +0 -0
  311. {pyafq-1.3.6 → pyafq-2.0}/AFQ/utils/volume.py +0 -0
  312. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/__init__.py +0 -0
  313. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/altair.py +0 -0
  314. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/fury_backend.py +0 -0
  315. {pyafq-1.3.6 → pyafq-2.0}/AFQ/viz/plotly_backend.py +0 -0
  316. {pyafq-1.3.6 → pyafq-2.0}/CITATION +0 -0
  317. {pyafq-1.3.6 → pyafq-2.0}/LICENSE +0 -0
  318. {pyafq-1.3.6 → pyafq-2.0}/MANIFEST.in +0 -0
  319. {pyafq-1.3.6 → pyafq-2.0}/Makefile +0 -0
  320. {pyafq-1.3.6 → pyafq-2.0}/README.md +0 -0
  321. {pyafq-1.3.6 → pyafq-2.0}/docs/Makefile +0 -0
  322. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_progressbars.py +0 -0
  323. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  324. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/custom.css +0 -0
  325. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/eScience_Logo_HR.png +0 -0
  326. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/escience-logo.png +0 -0
  327. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_static/logo.png +0 -0
  328. {pyafq-1.3.6 → pyafq-2.0}/docs/source/_templates/layout.html +0 -0
  329. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/down_left_arrow.png +0 -0
  330. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/down_right_arrow.png +0 -0
  331. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/greencheck.png +0 -0
  332. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_modeling2.png +0 -0
  333. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_profiling.png +0 -0
  334. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_recognition.png +0 -0
  335. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/_static/tract_tractography.png +0 -0
  336. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/bundle_orientation.rst +0 -0
  337. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/index.rst +0 -0
  338. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/modeling.rst +0 -0
  339. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/profiling.rst +0 -0
  340. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/recognition.rst +0 -0
  341. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/tractography.rst +0 -0
  342. {pyafq-1.3.6 → pyafq-2.0}/docs/source/explanations/tractometry_pipeline.rst +0 -0
  343. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/cite.rst +0 -0
  344. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/contributing.rst +0 -0
  345. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/definitions.rst +0 -0
  346. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/index.rst +0 -0
  347. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/releasing.rst +0 -0
  348. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/developing/tasks.rst +0 -0
  349. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/getting_help.rst +0 -0
  350. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/index.rst +0 -0
  351. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/converter.rst +0 -0
  352. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/data.rst +0 -0
  353. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/docker.rst +0 -0
  354. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/image.rst +0 -0
  355. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/index.rst +0 -0
  356. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/kwargs.rst +0 -0
  357. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/methods.rst +0 -0
  358. {pyafq-1.3.6 → pyafq-2.0}/docs/source/howto/usage/scalars.rst +0 -0
  359. {pyafq-1.3.6 → pyafq-2.0}/docs/source/index.rst +0 -0
  360. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/bundledict.rst +0 -0
  361. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/index.rst +0 -0
  362. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/kwargs.rst +0 -0
  363. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/mapping.rst +0 -0
  364. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/methods.rst +0 -0
  365. {pyafq-1.3.6 → pyafq-2.0}/docs/source/reference/viz_backend.rst +0 -0
  366. {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/kwargsdocs.py +0 -0
  367. {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/methodsdocs.py +0 -0
  368. {pyafq-1.3.6 → pyafq-2.0}/docs/source/sphinxext/updatedocs.py +0 -0
  369. {pyafq-1.3.6 → pyafq-2.0}/docs/source/tutorials/index.rst +0 -0
  370. {pyafq-1.3.6 → pyafq-2.0}/docs/upload-gh-pages.sh +0 -0
  371. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/README.rst +0 -0
  372. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/add_custom_bundle.py +0 -0
  373. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/baby_afq.py +0 -0
  374. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cerebellar_peduncles.py +0 -0
  375. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cloudknot_example.py +0 -0
  376. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
  377. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_acoustic_radiations.py +0 -0
  378. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_afq_callosal.py +0 -0
  379. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_afq_fwdti.py +0 -0
  380. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_recobundles.py +0 -0
  381. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
  382. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
  383. {pyafq-1.3.6 → pyafq-2.0}/examples/howto_examples/vof_example.py +0 -0
  384. {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/README.rst +0 -0
  385. {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_001_afq_api.py +0 -0
  386. {pyafq-1.3.6 → pyafq-2.0}/examples/tutorial_examples/plot_003_viz.py +0 -0
  387. {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/cuda_build.sh +0 -0
  388. {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/docker-build.sh +0 -0
  389. {pyafq-1.3.6 → pyafq-2.0}/gpu_docker/docker-push.sh +0 -0
  390. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/dependency_links.txt +0 -0
  391. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/not-zip-safe +0 -0
  392. {pyafq-1.3.6 → pyafq-2.0}/pyAFQ.egg-info/top_level.txt +0 -0
  393. {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/Dockerfile +0 -0
  394. {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/docker-build.sh +0 -0
  395. {pyafq-1.3.6 → pyafq-2.0}/pyafq_docker/docker-push.sh +0 -0
  396. {pyafq-1.3.6 → pyafq-2.0}/pyproject.toml +0 -0
  397. {pyafq-1.3.6 → pyafq-2.0}/setup.py +0 -0
  398. {pyafq-1.3.6 → pyafq-2.0}/tox.ini +0 -0
@@ -14,7 +14,7 @@ jobs:
14
14
  runs-on: ubuntu-latest
15
15
  strategy:
16
16
  matrix:
17
- python-version: ["3.11"]
17
+ python-version: ["3.12"]
18
18
 
19
19
  steps:
20
20
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -11,7 +11,7 @@ jobs:
11
11
  strategy:
12
12
  max-parallel: 4
13
13
  matrix:
14
- python-version: ["3.9", "3.10", "3.11"]
14
+ python-version: ["3.12"]
15
15
 
16
16
  steps:
17
17
  - name: Checkout repo
@@ -10,7 +10,7 @@ jobs:
10
10
  - name: Set up Python 3.11
11
11
  uses: actions/setup-python@v1
12
12
  with:
13
- python-version: 3.11
13
+ python-version: 3.12
14
14
  - name: Install pep517
15
15
  run: >-
16
16
  python -m
@@ -13,7 +13,7 @@ jobs:
13
13
  strategy:
14
14
  max-parallel: 4
15
15
  matrix:
16
- python-version: ["3.9", "3.10", "3.11"]
16
+ python-version: ["3.10", "3.11", "3.12"]
17
17
  nibabel-pre: [true, false]
18
18
 
19
19
  steps:
@@ -33,7 +33,7 @@ jobs:
33
33
  pip install --pre nibabel
34
34
  - name: Check Dependencies
35
35
  run: |
36
- pipconflictchecker
36
+ python -m pip check
37
37
  - name: Lint
38
38
  run: |
39
39
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -5,6 +5,7 @@ import AFQ.data.fetch as afd
5
5
  import AFQ.utils.volume as auv
6
6
  from AFQ.tasks.utils import get_fname, str_to_desc
7
7
  from AFQ.definitions.utils import find_file
8
+ from AFQ.utils.path import space_from_fname
8
9
 
9
10
  import numpy as np
10
11
  import nibabel as nib
@@ -481,7 +482,7 @@ def baby_bd():
481
482
  "exclude": [templates["SLF_roi1_L"]],
482
483
  "start": templates["pARC_L_start"],
483
484
  "end": templates["VOF_box_small_L"],
484
- "primary_axis": 2,
485
+ "primary_axis": 'I/S',
485
486
  "primary_axis_percentage": 40,
486
487
  "cross_midline": False,
487
488
  "mahal": {"distance_threshold": 4}},
@@ -490,21 +491,21 @@ def baby_bd():
490
491
  "exclude": [templates["SLF_roi1_R"]],
491
492
  "start": templates["pARC_R_start"],
492
493
  "end": templates["VOF_box_small_R"],
493
- "primary_axis": 2,
494
+ "primary_axis": 'I/S',
494
495
  "primary_axis_percentage": 40,
495
496
  "cross_midline": False,
496
497
  "mahal": {"distance_threshold": 4}},
497
498
  'Left Vertical Occipital': {
498
499
  "start": templates["VOF_L_start"],
499
500
  "end": templates["VOF_box_small_L"],
500
- "primary_axis": 2,
501
+ "primary_axis": 'I/S',
501
502
  "primary_axis_percentage": 40,
502
503
  "cross_midline": False,
503
504
  "mahal": {"distance_threshold": 4}},
504
505
  'Right Vertical Occipital': {
505
506
  "start": templates["VOF_R_start"],
506
507
  "end": templates["VOF_box_small_R"],
507
- "primary_axis": 2,
508
+ "primary_axis": 'I/S',
508
509
  "primary_axis_percentage": 40,
509
510
  "cross_midline": False,
510
511
  "mahal": {"distance_threshold": 4}}},
@@ -764,6 +765,14 @@ class BundleDict(MutableMapping):
764
765
  "cross_midline": False
765
766
  }
766
767
  })
768
+
769
+ Note
770
+ ----
771
+ The order of include ROIs may affect your results. This is
772
+ because ROI order within the include list determines the orientation of the
773
+ streamlines (from the first to the last) and the clipping of streamlines
774
+ when `clip_edges` is used, because the streamlines are clipped to
775
+ between the first and last ROIs.
767
776
  """
768
777
 
769
778
  def __init__(self,
@@ -938,62 +947,16 @@ class BundleDict(MutableMapping):
938
947
  resample_subject_to=self.resample_subject_to,
939
948
  keep_in_memory=self.keep_in_memory)
940
949
 
941
- def apply_to_rois(self, b_name, func, *args,
942
- dry_run=False, apply_to_recobundles=False,
943
- **kwargs):
950
+ def apply_to_rois(self, b_name, *args, **kwargs):
944
951
  """
945
- Applies some transformation to all ROIs (include, exclude, end, start)
946
- and the prob_map in a given bundle.
952
+ See: AFQ.api.bundle_dict.apply_to_roi_dict
947
953
 
948
954
  Parameters
949
955
  ----------
950
956
  b_name : name
951
957
  bundle name of bundle whose ROIs will be transformed.
952
- func : function
953
- function whose first argument must be a Nifti1Image and which
954
- returns a Nifti1Image
955
- dry_run : bool
956
- Whether to actually apply changes returned by `func` to the ROIs.
957
- If has_return is False, dry_run is not used.
958
- apply_to_recobundles : bool, optional
959
- Whether to apply the transformation to recobundles
960
- TRKs as well.
961
- Default: False
962
-
963
- *args :
964
- Additional arguments for func
965
- **kwargs
966
- Optional arguments for func
967
-
968
- Returns
969
- -------
970
- A dictionary where keys are
971
- the roi type and values are the transformed ROIs.
972
958
  """
973
- return_vals = {}
974
- for roi_type in [
975
- "include", "exclude",
976
- "start", "end", "prob_map"]:
977
- if roi_type in self._dict[b_name]:
978
- if roi_type in ["start", "end", "prob_map"]:
979
- return_vals[roi_type] = func(
980
- self._dict[b_name][roi_type], *args, **kwargs)
981
- else:
982
- changed_rois = []
983
- for _roi in self._dict[b_name][roi_type]:
984
- changed_rois.append(func(
985
- _roi, *args, **kwargs))
986
- return_vals[roi_type] = changed_rois
987
- if apply_to_recobundles and "recobundles" in self._dict[b_name]:
988
- return_vals["recobundles"] = {}
989
- for sl_type in ["sl", "centroid"]:
990
- return_vals["recobundles"][sl_type] = func(
991
- self._dict[b_name]["recobundles"][sl_type],
992
- *args, **kwargs)
993
- if not dry_run:
994
- for roi_type, roi in return_vals.items():
995
- self._dict[b_name][roi_type] = roi
996
- return return_vals
959
+ return apply_to_roi_dict(self._dict[b_name], *args, **kwargs)
997
960
 
998
961
  def _cond_load_bundle(self, b_name, dry_run=False):
999
962
  """
@@ -1035,7 +998,8 @@ class BundleDict(MutableMapping):
1035
998
  return roi_or_sl
1036
999
 
1037
1000
  def transform_rois(self, bundle_name, mapping, new_affine,
1038
- base_fname=None, apply_to_recobundles=False):
1001
+ base_fname=None, to_space="subject",
1002
+ apply_to_recobundles=False):
1039
1003
  """
1040
1004
  Get the bundle definition with transformed ROIs
1041
1005
  for a given bundle into a
@@ -1056,6 +1020,10 @@ class BundleDict(MutableMapping):
1056
1020
  Base file path to save ROIs too. Additional BIDS
1057
1021
  descriptors will be added to this file path. If None,
1058
1022
  do not save the ROIs.
1023
+ to_space : str, optional
1024
+ Name for space for exported ROIs. Only used if base_fname
1025
+ is not None.
1026
+ Default: "subject"
1059
1027
  apply_to_recobundles : bool, optional
1060
1028
  Whether to apply the transformation to recobundles
1061
1029
  TRKs as well.
@@ -1088,14 +1056,29 @@ class BundleDict(MutableMapping):
1088
1056
  if base_fname is not None:
1089
1057
  fnames = []
1090
1058
  for roi_type, rois in transformed_rois.items():
1059
+ if roi_type == "prob_map":
1060
+ suffix = "probseg"
1061
+ roi_type_name = ""
1062
+ else:
1063
+ suffix = "mask"
1064
+ roi_type_name = roi_type.lower().replace(
1065
+ " ", "").replace(
1066
+ "_", "").replace(
1067
+ "-", "")
1068
+ roi_type_name = roi_type_name[0].upper() \
1069
+ + roi_type_name[1:]
1091
1070
  if not isinstance(rois, list):
1092
1071
  rois = [rois]
1093
1072
  for ii, roi in enumerate(rois):
1073
+ desc = f"{str_to_desc(bundle_name)}{roi_type_name}"
1074
+ if roi_type in ["include", "exclude"]:
1075
+ desc = f"{desc}{ii}"
1094
1076
  fname = get_fname(
1095
1077
  base_fname,
1096
- "_space-subject_desc-"
1097
- f"{str_to_desc(bundle_name)}{roi_type}{ii}"
1098
- "_mask.nii.gz")
1078
+ f"_space-{to_space}_desc-"
1079
+ f"{desc}"
1080
+ f"_{suffix}.nii.gz",
1081
+ "ROIs")
1099
1082
  nib.save(
1100
1083
  nib.Nifti1Image(
1101
1084
  roi.get_fdata().astype(np.float32),
@@ -1138,3 +1121,67 @@ class BundleDict(MutableMapping):
1138
1121
  self.resample_to,
1139
1122
  self.resample_subject_to,
1140
1123
  self.keep_in_memory)
1124
+
1125
+
1126
+ def apply_to_roi_dict(dict_, func, *args,
1127
+ dry_run=False, apply_to_recobundles=False,
1128
+ apply_to_prob_map=True,
1129
+ **kwargs):
1130
+ """
1131
+ Applies some transformation to all ROIs (include, exclude, end, start)
1132
+ and the prob_map in a given bundle.
1133
+
1134
+ Parameters
1135
+ ----------
1136
+ dict_: dict
1137
+ dict describing the bundle using pyAFQ's format. An entry
1138
+ in a BundleDict.
1139
+ func : function
1140
+ function whose first argument must be a Nifti1Image and which
1141
+ returns a Nifti1Image
1142
+ dry_run : bool
1143
+ Whether to actually apply changes returned by `func` to the ROIs.
1144
+ If has_return is False, dry_run is not used.
1145
+ apply_to_recobundles : bool, optional
1146
+ Whether to apply the transformation to recobundles
1147
+ TRKs as well.
1148
+ Default: False
1149
+ apply_to_prob_map : bool, optional
1150
+ Whether to apply the transformation to the prob_map.
1151
+ Default: True
1152
+
1153
+ *args :
1154
+ Additional arguments for func
1155
+ **kwargs
1156
+ Optional arguments for func
1157
+
1158
+ Returns
1159
+ -------
1160
+ A dictionary where keys are
1161
+ the roi type and values are the transformed ROIs.
1162
+ """
1163
+ return_vals = {}
1164
+ roi_types = ["include", "exclude", "start", "end"]
1165
+ if apply_to_prob_map:
1166
+ roi_types.append("prob_map")
1167
+ for roi_type in roi_types:
1168
+ if roi_type in dict_:
1169
+ if roi_type in ["start", "end", "prob_map"]:
1170
+ return_vals[roi_type] = func(
1171
+ dict_[roi_type], *args, **kwargs)
1172
+ else:
1173
+ changed_rois = []
1174
+ for _roi in dict_[roi_type]:
1175
+ changed_rois.append(func(
1176
+ _roi, *args, **kwargs))
1177
+ return_vals[roi_type] = changed_rois
1178
+ if apply_to_recobundles and "recobundles" in dict_:
1179
+ return_vals["recobundles"] = {}
1180
+ for sl_type in ["sl", "centroid"]:
1181
+ return_vals["recobundles"][sl_type] = func(
1182
+ dict_["recobundles"][sl_type],
1183
+ *args, **kwargs)
1184
+ if not dry_run:
1185
+ for roi_type, roi in return_vals.items():
1186
+ dict_[roi_type] = roi
1187
+ return return_vals
@@ -14,6 +14,7 @@ from AFQ.api.utils import (
14
14
  export_all_helper, valid_exports_string)
15
15
  import AFQ.utils.streamlines as aus
16
16
  from AFQ.viz.utils import get_eye
17
+ from AFQ.data.utils import aws_import_msg_error
17
18
 
18
19
  from dipy.utils.parallel import paramap
19
20
  from dipy.io.stateful_tractogram import StatefulTractogram, Space
@@ -30,11 +31,9 @@ import os
30
31
  import os.path as op
31
32
  from tqdm import tqdm
32
33
  import json
33
- import s3fs
34
34
  from time import time
35
35
  import nibabel as nib
36
36
  from PIL import Image
37
- from s3bids.utils import S3BIDSStudy
38
37
  import glob
39
38
 
40
39
  from bids.layout import BIDSLayout, BIDSLayoutIndexer
@@ -45,7 +44,7 @@ except ImportError:
45
44
  using_afqb = False
46
45
 
47
46
 
48
- __all__ = ["GroupAFQ", "get_afq_bids_entities_fname"]
47
+ __all__ = ["GroupAFQ"]
49
48
 
50
49
 
51
50
  logger = logging.getLogger('AFQ')
@@ -59,11 +58,6 @@ def clean_pandas_df(df):
59
58
  return df
60
59
 
61
60
 
62
- def get_afq_bids_entities_fname():
63
- return op.dirname(op.dirname(op.abspath(
64
- aus.__file__))) + "/afq_bids_entities.json"
65
-
66
-
67
61
  class _ParticipantAFQInputs:
68
62
  def __init__(
69
63
  self, dwi_data_file, bval_file, bvec_file, results_dir,
@@ -120,7 +114,7 @@ class GroupAFQ(object):
120
114
  Set "n_jobs" to -1 to automatically parallelize as
121
115
  the number of cpus. Here is an example for how to do
122
116
  multiprocessing with 4 cpus:
123
- {"n_jobs": 4, "engine": "joblib", "backend": "loky"}
117
+ {"n_jobs": 4, "engine": "ray"}
124
118
  Default: {"engine": "serial"}
125
119
  bids_layout_kwargs: dict, optional
126
120
  Additional arguments to give to BIDSLayout from pybids.
@@ -278,6 +272,8 @@ class GroupAFQ(object):
278
272
  if session is not None:
279
273
  results_dir = op.join(results_dir, 'ses-' + session)
280
274
 
275
+ results_dir = op.join(results_dir, "dwi")
276
+
281
277
  dwi_bids_filters = {
282
278
  "subject": subject,
283
279
  "session": session,
@@ -328,16 +324,19 @@ class GroupAFQ(object):
328
324
  this_kwargs["scalars"].remove(scalar)
329
325
  elif key == "import_tract":
330
326
  if isinstance(this_kwargs["import_tract"], dict):
327
+ extension = this_kwargs["import_tract"].pop(
328
+ "extension",
329
+ ['.trk',
330
+ '.tck',
331
+ '.trx',
332
+ '.vtk',
333
+ '.fib',
334
+ '.dpy'])
331
335
  it_res = \
332
336
  bids_layout.get(
333
337
  subject=subject,
334
338
  session=session,
335
- extension=[
336
- '.trk',
337
- '.tck',
338
- '.vtk',
339
- '.fib',
340
- '.dpy'],
339
+ extension=extension,
341
340
  return_type='filename',
342
341
  **this_kwargs["import_tract"])
343
342
  if len(it_res) < 1:
@@ -875,6 +874,10 @@ class GroupAFQ(object):
875
874
 
876
875
  def upload_to_s3(self, s3fs, remote_path):
877
876
  """ Upload entire AFQ derivatives folder to S3"""
877
+ try:
878
+ import s3fs
879
+ except (ImportError, ModuleNotFoundError):
880
+ aws_import_msg_error("s3fs")
878
881
  s3fs.put(self.afq_path, remote_path, recursive=True)
879
882
  if op.exists(self.afqb_path):
880
883
  s3fs.put(self.afqb_path, remote_path, recursive=True)
@@ -897,6 +900,9 @@ class GroupAFQ(object):
897
900
  ex_density_init = nib.load(densities[
898
901
  self.valid_sub_list[0]][
899
902
  self.valid_ses_list[0]]) # for shape and header
903
+ tmpl_name = self.export("tmpl_name", collapse=False)[
904
+ self.valid_sub_list[0]][
905
+ self.valid_ses_list[0]]
900
906
 
901
907
  group_density = np.zeros_like(ex_density_init.get_fdata())
902
908
  self.logger.info("Generating Group Density...")
@@ -917,7 +923,7 @@ class GroupAFQ(object):
917
923
 
918
924
  out_fname = op.abspath(op.join(
919
925
  self.afq_path,
920
- f"desc-density_subjects-all_space-MNI_dwi.nii.gz"))
926
+ f"desc-density_subjects-all_space-{tmpl_name}_dwimap.nii.gz"))
921
927
  nib.save(group_density, out_fname)
922
928
  return out_fname
923
929
 
@@ -1165,6 +1171,12 @@ def download_and_combine_afq_profiles(bucket,
1165
1171
  -------
1166
1172
  Ouput CSV's pandas dataframe.
1167
1173
  """
1174
+ try:
1175
+ from s3bids.utils import S3BIDSStudy
1176
+ import s3fs
1177
+ except (ImportError, ModuleNotFoundError):
1178
+ aws_import_msg_error("s3bids and s3fs")
1179
+
1168
1180
  if "subjects" not in kwargs:
1169
1181
  kwargs["subjects"] = "all"
1170
1182
  if "anon" not in kwargs:
@@ -126,6 +126,8 @@ def export_all_helper(api_afq_object, xforms, indiv, viz):
126
126
  api_afq_object.export("sl_counts")
127
127
  api_afq_object.export("median_bundle_lengths")
128
128
  api_afq_object.export("profiles")
129
+ api_afq_object.export("seed_thresh")
130
+ api_afq_object.export("stop_thresh")
129
131
 
130
132
  if viz:
131
133
  try:
@@ -7,6 +7,7 @@ from dipy.io.streamline import (
7
7
  from dipy.data.fetcher import _make_fetcher
8
8
  import dipy.data as dpd
9
9
  from AFQ.utils.path import drop_extension, apply_cmd_to_afq_derivs
10
+ from AFQ.data.utils import aws_import_msg_error
10
11
 
11
12
  import os
12
13
  import os.path as op
@@ -22,9 +23,6 @@ from tqdm import tqdm
22
23
 
23
24
  import warnings
24
25
  import nibabel as nib
25
- import boto3
26
- from botocore import UNSIGNED
27
- from botocore.client import Config
28
26
 
29
27
 
30
28
  # capture templateflow resource warning and log
@@ -97,11 +95,13 @@ def _fetcher_to_template(fetcher, as_img=False, resample_to=False):
97
95
  if as_img:
98
96
  img = nib.load(img)
99
97
  if resample_to:
100
- img = nib.Nifti1Image(resample(img.get_fdata(),
101
- resample_to,
102
- img.affine,
103
- resample_to.affine).get_fdata(),
104
- resample_to.affine)
98
+ img = nib.Nifti1Image(
99
+ resample(
100
+ img.get_fdata(),
101
+ resample_to,
102
+ moving_affine=img.affine,
103
+ static_affine=resample_to.affine).get_fdata(),
104
+ resample_to.affine)
105
105
  template_dict[drop_extension(f)] = img
106
106
  return template_dict
107
107
 
@@ -420,8 +420,8 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
420
420
  as_array = resample(
421
421
  roi.get_fdata(),
422
422
  resample_to,
423
- roi.affine,
424
- resample_to.affine).get_fdata()
423
+ moving_affine=roi.affine,
424
+ static_affine=resample_to.affine).get_fdata()
425
425
  if threshold:
426
426
  as_array = (as_array > threshold).astype(int)
427
427
 
@@ -1144,16 +1144,15 @@ def organize_stanford_data(path=None, clear_previous_afq=None):
1144
1144
  derivatives_path = op.join(bids_path, 'derivatives')
1145
1145
  dmriprep_folder = op.join(derivatives_path, 'vistasoft')
1146
1146
  freesurfer_folder = op.join(derivatives_path, 'freesurfer')
1147
+ afq_folder = op.join(derivatives_path, 'afq')
1147
1148
 
1148
- if clear_previous_afq is not None and op.exists(derivatives_path):
1149
- afq_folder = op.join(derivatives_path, 'afq')
1149
+ if clear_previous_afq is not None and op.exists(afq_folder):
1150
1150
  if clear_previous_afq == "all":
1151
- if op.exists(afq_folder):
1152
- shutil.rmtree(afq_folder)
1151
+ shutil.rmtree(afq_folder)
1153
1152
  else:
1154
1153
  apply_cmd_to_afq_derivs(
1155
- op.join(afq_folder, "sub-01/ses-01"),
1156
- op.join(afq_folder, "sub-01/ses-01/sub-01_ses-01"),
1154
+ op.join(afq_folder, "sub-01/ses-01/dwi/"),
1155
+ op.join(afq_folder, "sub-01/ses-01/dwi/sub-01_ses-01"),
1157
1156
  dependent_on=clear_previous_afq)
1158
1157
 
1159
1158
  if not op.exists(derivatives_path):
@@ -1351,8 +1350,8 @@ def read_aal_atlas(resample_to=None):
1351
1350
  oo.append(resample(
1352
1351
  data[..., ii],
1353
1352
  resample_to,
1354
- out_dict['atlas'].affine,
1355
- resample_to.affine).get_fdata())
1353
+ moving_affine=out_dict['atlas'].affine,
1354
+ static_affine=resample_to.affine).get_fdata())
1356
1355
  out_dict['atlas'] = nib.Nifti1Image(np.stack(oo, -1),
1357
1356
  resample_to.affine)
1358
1357
  return out_dict
@@ -1386,8 +1385,8 @@ def _apply_mask(template_img, resolution=1):
1386
1385
  resample(
1387
1386
  mask_data,
1388
1387
  template_data,
1389
- mask_img.affine,
1390
- template_img.affine).get_fdata(),
1388
+ moving_affine=mask_img.affine,
1389
+ static_affine=template_img.affine).get_fdata(),
1391
1390
  template_img.affine)
1392
1391
  mask_data = mask_img.get_fdata()
1393
1392
 
@@ -1552,6 +1551,11 @@ def fetch_hcp(subjects,
1552
1551
  a format for organizing and describing outputs of neuroimaging
1553
1552
  experiments. Scientific Data, 3::160044. DOI: 10.1038/sdata.2016.44.
1554
1553
  """
1554
+ try:
1555
+ import boto3
1556
+ except (ImportError, ModuleNotFoundError):
1557
+ aws_import_msg_error("boto3")
1558
+
1555
1559
  if profile_name:
1556
1560
  boto3.setup_default_session(profile_name=profile_name)
1557
1561
  elif aws_access_key_id is not None and aws_secret_access_key is not None:
@@ -1656,6 +1660,13 @@ def fetch_hbn_preproc(subjects, path=None):
1656
1660
  Scientific Data. 2022;9(1):1-27.
1657
1661
 
1658
1662
  """
1663
+ try:
1664
+ import boto3
1665
+ from botocore import UNSIGNED
1666
+ from botocore.client import Config
1667
+ except (ImportError, ModuleNotFoundError):
1668
+ aws_import_msg_error("boto3")
1669
+
1659
1670
  # Anonymous access:
1660
1671
  client = boto3.client('s3', config=Config(signature_version=UNSIGNED))
1661
1672
 
@@ -1751,6 +1762,13 @@ def fetch_hbn_afq(subjects, path=None):
1751
1762
  Scientific Data. 2022;9(1):1-27.
1752
1763
 
1753
1764
  """
1765
+ try:
1766
+ import boto3
1767
+ from botocore import UNSIGNED
1768
+ from botocore.client import Config
1769
+ except (ImportError, ModuleNotFoundError):
1770
+ aws_import_msg_error("boto3")
1771
+
1754
1772
  # Anonymous access:
1755
1773
  client = boto3.client('s3', config=Config(signature_version=UNSIGNED))
1756
1774
 
@@ -11,6 +11,7 @@ BUNDLE_RECO_2_AFQ = \
11
11
  "SLF_R": "Right Superior Longitudinal"
12
12
  }
13
13
 
14
+
14
15
  BUNDLE_MAT_2_PYTHON = {
15
16
  'RightCorticospinal': 'Right Corticospinal',
16
17
  'LeftCorticospinal': 'Left Corticospinal',
@@ -40,3 +41,12 @@ BUNDLE_MAT_2_PYTHON = {
40
41
  'Left SLF': 'Left Superior Longitudinal',
41
42
  'RightSLF': 'Right Superior Longitudinal',
42
43
  'LeftSLF': 'Left Superior Longitudinal'}
44
+
45
+
46
+ def aws_import_msg_error(module):
47
+ """Alerts user to install the appropriate aws module """
48
+ msg = f"To use {module} in pyAFQ, you will "
49
+ msg += f"need to have {module} installed. "
50
+ msg += "You can do that by installing pyAFQ with "
51
+ msg += f"`pip install AFQ[aws]`"
52
+ return msg