pyAFQ 1.3.5__tar.gz → 2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (401) hide show
  1. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/docbuild.yml +1 -1
  2. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/docker_pyafq.yml +1 -1
  3. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/docker_pyafq_cuda12.yml +1 -1
  4. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_anisotropic_test.yml +1 -1
  5. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_basic_test.yml +1 -1
  6. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_custom_test.yml +1 -1
  7. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_pft_test.yml +1 -1
  8. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_reco80_test.yml +1 -1
  9. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_reco_test.yml +1 -1
  10. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/nightly_test.yml +1 -1
  11. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/publish-to-test-pypi.yml +1 -1
  12. {pyafq-1.3.5 → pyafq-2.0}/.github/workflows/test.yml +2 -2
  13. {pyafq-1.3.5 → pyafq-2.0}/AFQ/_fixes.py +11 -7
  14. {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/bundle_dict.py +125 -61
  15. {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/group.py +28 -16
  16. {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/utils.py +2 -0
  17. {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/fetch.py +38 -22
  18. {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/utils.py +10 -0
  19. {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/image.py +35 -17
  20. {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/mapping.py +30 -19
  21. {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/utils.py +8 -3
  22. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/cleaning.py +25 -15
  23. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/criteria.py +91 -38
  24. pyafq-2.0/AFQ/recognition/other_bundles.py +153 -0
  25. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/preprocess.py +10 -2
  26. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/recognize.py +10 -10
  27. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/roi.py +16 -18
  28. pyafq-2.0/AFQ/recognition/tests/test_other_bundles.py +43 -0
  29. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_rois.py +43 -37
  30. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_utils.py +16 -10
  31. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/utils.py +23 -18
  32. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/data.py +130 -71
  33. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/decorators.py +3 -7
  34. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/mapping.py +54 -24
  35. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/segmentation.py +57 -23
  36. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/tractography.py +126 -58
  37. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/utils.py +38 -1
  38. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/viz.py +29 -67
  39. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_api.py +10 -16
  40. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_definitions.py +22 -4
  41. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_fixes.py +8 -2
  42. pyafq-2.0/AFQ/tractography/gputractography.py +219 -0
  43. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/tractography.py +33 -16
  44. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/conversion.py +2 -2
  45. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/path.py +31 -2
  46. {pyafq-1.3.5 → pyafq-2.0}/AFQ/version.py +9 -4
  47. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/fury_backend.py +10 -29
  48. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/plot.py +16 -2
  49. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/plotly_backend.py +10 -17
  50. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/utils.py +32 -19
  51. {pyafq-1.3.5 → pyafq-2.0}/CHANGES.rst +58 -1
  52. {pyafq-1.3.5 → pyafq-2.0}/PKG-INFO +17 -21
  53. {pyafq-1.3.5 → pyafq-2.0}/bin/pyAFQ +0 -10
  54. {pyafq-1.3.5 → pyafq-2.0}/docs/source/conf.py +1 -1
  55. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/installation_guide.rst +22 -1
  56. pyafq-2.0/docs/source/howto/usage/singularity.rst +16 -0
  57. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/bundledict.rst +3 -3
  58. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cloudknot_example.py +2 -2
  59. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cloudknot_hcp_example.py +2 -2
  60. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_optic_radiations.py +1 -0
  61. {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_001_afq_api.py +4 -2
  62. {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_002_bids_layout.py +6 -7
  63. pyafq-2.0/gpu_docker/Dockerfile +34 -0
  64. pyafq-2.0/gpu_docker/cuda_track_template.def +36 -0
  65. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/PKG-INFO +17 -21
  66. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/SOURCES.txt +3 -1
  67. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/requires.txt +14 -19
  68. {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/Dockerfile +2 -2
  69. {pyafq-1.3.5 → pyafq-2.0}/setup.cfg +11 -16
  70. pyafq-1.3.5/AFQ/afq_bids_entities.json +0 -22
  71. pyafq-1.3.5/AFQ/tractography/gputractography.py +0 -177
  72. pyafq-1.3.5/gpu_docker/Dockerfile +0 -53
  73. pyafq-1.3.5/gpu_docker/cuda_track_template.def +0 -63
  74. {pyafq-1.3.5 → pyafq-2.0}/.github/CITATION.cff +0 -0
  75. {pyafq-1.3.5 → pyafq-2.0}/.github/CONTRIBUTING.md +0 -0
  76. {pyafq-1.3.5 → pyafq-2.0}/.gitignore +0 -0
  77. {pyafq-1.3.5 → pyafq-2.0}/.mailmap +0 -0
  78. {pyafq-1.3.5 → pyafq-2.0}/.maintenance/update_changes.sh +0 -0
  79. {pyafq-1.3.5 → pyafq-2.0}/.maintenance/update_zenodo.py +0 -0
  80. {pyafq-1.3.5 → pyafq-2.0}/.pep8speaks.yml +0 -0
  81. {pyafq-1.3.5 → pyafq-2.0}/.zenodo.json +0 -0
  82. {pyafq-1.3.5 → pyafq-2.0}/AFQ/__init__.py +0 -0
  83. {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/__init__.py +0 -0
  84. {pyafq-1.3.5 → pyafq-2.0}/AFQ/api/participant.py +0 -0
  85. {pyafq-1.3.5 → pyafq-2.0}/AFQ/data/__init__.py +0 -0
  86. {pyafq-1.3.5 → pyafq-2.0}/AFQ/definitions/__init__.py +0 -0
  87. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/QBallTP.py +0 -0
  88. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/__init__.py +0 -0
  89. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/csd.py +0 -0
  90. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/dki.py +0 -0
  91. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/dti.py +0 -0
  92. {pyafq-1.3.5 → pyafq-2.0}/AFQ/models/fwdti.py +0 -0
  93. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/__init__.py +0 -0
  94. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/curvature.py +0 -0
  95. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/__init__.py +0 -0
  96. {pyafq-1.3.5 → pyafq-2.0}/AFQ/recognition/tests/test_recognition.py +0 -0
  97. {pyafq-1.3.5 → pyafq-2.0}/AFQ/registration.py +0 -0
  98. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tasks/__init__.py +0 -0
  99. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/__init__.py +0 -0
  100. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  101. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  102. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  103. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  104. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  105. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  106. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  107. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  108. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  109. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  110. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  111. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  112. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  113. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  114. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  115. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  116. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  117. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  118. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  119. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  120. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  121. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  122. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  123. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  124. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  125. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  126. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  127. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  128. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  129. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  130. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  131. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  132. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  133. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  134. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  135. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  136. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  137. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  138. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  139. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  140. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  141. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  142. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  143. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  144. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  145. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  146. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  147. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  148. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  149. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  150. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  151. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  152. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  153. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  154. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  155. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  156. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  157. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  158. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  159. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  160. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  161. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  162. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  163. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  164. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  165. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  166. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  167. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  168. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  169. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  170. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  171. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  172. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  173. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  174. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  175. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  176. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  177. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  178. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  179. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  180. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  181. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  182. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  183. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  184. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  185. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  186. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  187. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  188. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  189. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  190. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  191. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  192. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  193. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  194. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  195. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  196. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  197. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  198. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  199. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  200. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  201. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  202. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  203. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  204. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  205. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  206. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  207. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  208. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  209. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  210. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  211. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  212. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  213. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  214. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  215. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  216. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  217. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  218. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  219. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  220. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  221. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  222. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  223. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  224. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  225. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  226. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  227. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  228. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  229. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  230. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  231. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  232. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  233. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  234. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  235. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  236. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  237. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  238. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  239. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  240. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  241. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  242. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  243. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  244. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  245. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  246. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  247. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  248. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  249. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  250. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  251. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  252. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  253. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  254. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  255. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  256. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  257. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  258. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  259. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  260. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  261. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  262. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  263. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  264. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  265. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  266. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  267. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  268. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  269. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  270. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  271. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  272. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  273. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  274. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  275. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  276. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  277. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  278. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  279. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  280. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  281. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  282. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  283. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  284. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  285. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  286. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  287. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  288. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  289. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  290. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  291. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  292. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  293. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  294. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  295. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  296. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  297. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  298. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_bundle_dict.py +0 -0
  299. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_csd.py +0 -0
  300. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_data.py +0 -0
  301. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_dki.py +0 -0
  302. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_dti.py +0 -0
  303. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_registration.py +0 -0
  304. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_tractography.py +0 -0
  305. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tests/test_viz.py +0 -0
  306. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/__init__.py +0 -0
  307. {pyafq-1.3.5 → pyafq-2.0}/AFQ/tractography/utils.py +0 -0
  308. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/__init__.py +0 -0
  309. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/bin.py +0 -0
  310. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/docs.py +0 -0
  311. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/models.py +0 -0
  312. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/stats.py +0 -0
  313. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/streamlines.py +0 -0
  314. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/testing.py +0 -0
  315. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/__init__.py +0 -0
  316. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_conversions.py +0 -0
  317. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_path.py +0 -0
  318. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_stats.py +0 -0
  319. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_streamlines.py +0 -0
  320. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/tests/test_volume.py +0 -0
  321. {pyafq-1.3.5 → pyafq-2.0}/AFQ/utils/volume.py +0 -0
  322. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/__init__.py +0 -0
  323. {pyafq-1.3.5 → pyafq-2.0}/AFQ/viz/altair.py +0 -0
  324. {pyafq-1.3.5 → pyafq-2.0}/CITATION +0 -0
  325. {pyafq-1.3.5 → pyafq-2.0}/LICENSE +0 -0
  326. {pyafq-1.3.5 → pyafq-2.0}/MANIFEST.in +0 -0
  327. {pyafq-1.3.5 → pyafq-2.0}/Makefile +0 -0
  328. {pyafq-1.3.5 → pyafq-2.0}/README.md +0 -0
  329. {pyafq-1.3.5 → pyafq-2.0}/docs/Makefile +0 -0
  330. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_progressbars.py +0 -0
  331. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  332. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/custom.css +0 -0
  333. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/eScience_Logo_HR.png +0 -0
  334. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/escience-logo.png +0 -0
  335. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_static/logo.png +0 -0
  336. {pyafq-1.3.5 → pyafq-2.0}/docs/source/_templates/layout.html +0 -0
  337. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/down_left_arrow.png +0 -0
  338. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/down_right_arrow.png +0 -0
  339. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/greencheck.png +0 -0
  340. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_modeling2.png +0 -0
  341. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_profiling.png +0 -0
  342. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_recognition.png +0 -0
  343. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/_static/tract_tractography.png +0 -0
  344. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/bundle_orientation.rst +0 -0
  345. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/index.rst +0 -0
  346. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/modeling.rst +0 -0
  347. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/profiling.rst +0 -0
  348. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/recognition.rst +0 -0
  349. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/tractography.rst +0 -0
  350. {pyafq-1.3.5 → pyafq-2.0}/docs/source/explanations/tractometry_pipeline.rst +0 -0
  351. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/cite.rst +0 -0
  352. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/contributing.rst +0 -0
  353. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/definitions.rst +0 -0
  354. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/index.rst +0 -0
  355. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/releasing.rst +0 -0
  356. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/developing/tasks.rst +0 -0
  357. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/getting_help.rst +0 -0
  358. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/index.rst +0 -0
  359. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/converter.rst +0 -0
  360. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/data.rst +0 -0
  361. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/docker.rst +0 -0
  362. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/image.rst +0 -0
  363. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/index.rst +0 -0
  364. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/kwargs.rst +0 -0
  365. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/methods.rst +0 -0
  366. {pyafq-1.3.5 → pyafq-2.0}/docs/source/howto/usage/scalars.rst +0 -0
  367. {pyafq-1.3.5 → pyafq-2.0}/docs/source/index.rst +0 -0
  368. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/index.rst +0 -0
  369. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/kwargs.rst +0 -0
  370. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/mapping.rst +0 -0
  371. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/methods.rst +0 -0
  372. {pyafq-1.3.5 → pyafq-2.0}/docs/source/reference/viz_backend.rst +0 -0
  373. {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/kwargsdocs.py +0 -0
  374. {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/methodsdocs.py +0 -0
  375. {pyafq-1.3.5 → pyafq-2.0}/docs/source/sphinxext/updatedocs.py +0 -0
  376. {pyafq-1.3.5 → pyafq-2.0}/docs/source/tutorials/index.rst +0 -0
  377. {pyafq-1.3.5 → pyafq-2.0}/docs/upload-gh-pages.sh +0 -0
  378. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/README.rst +0 -0
  379. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/add_custom_bundle.py +0 -0
  380. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/baby_afq.py +0 -0
  381. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/cerebellar_peduncles.py +0 -0
  382. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_acoustic_radiations.py +0 -0
  383. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_afq_callosal.py +0 -0
  384. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_afq_fwdti.py +0 -0
  385. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_recobundles.py +0 -0
  386. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
  387. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
  388. {pyafq-1.3.5 → pyafq-2.0}/examples/howto_examples/vof_example.py +0 -0
  389. {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/README.rst +0 -0
  390. {pyafq-1.3.5 → pyafq-2.0}/examples/tutorial_examples/plot_003_viz.py +0 -0
  391. {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/cuda_build.sh +0 -0
  392. {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/docker-build.sh +0 -0
  393. {pyafq-1.3.5 → pyafq-2.0}/gpu_docker/docker-push.sh +0 -0
  394. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/dependency_links.txt +0 -0
  395. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/not-zip-safe +0 -0
  396. {pyafq-1.3.5 → pyafq-2.0}/pyAFQ.egg-info/top_level.txt +0 -0
  397. {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/docker-build.sh +0 -0
  398. {pyafq-1.3.5 → pyafq-2.0}/pyafq_docker/docker-push.sh +0 -0
  399. {pyafq-1.3.5 → pyafq-2.0}/pyproject.toml +0 -0
  400. {pyafq-1.3.5 → pyafq-2.0}/setup.py +0 -0
  401. {pyafq-1.3.5 → 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
@@ -1,6 +1,6 @@
1
1
  name: Build and Push pyAFQ Docker Image
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
@@ -1,6 +1,6 @@
1
1
  name: Build and Push pyAFQ CUDA12 Image
2
2
 
3
- on: [push]
3
+ on: [push, pull_request]
4
4
 
5
5
  jobs:
6
6
  build:
@@ -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/`
@@ -2,6 +2,7 @@ import numpy as np
2
2
  import logging
3
3
 
4
4
  from scipy.special import lpmv, gammaln
5
+ from scipy.linalg import pinvh
5
6
 
6
7
  from tqdm import tqdm
7
8
 
@@ -215,17 +216,20 @@ def gaussian_weights(bundle, n_points=100, return_mahalnobis=False,
215
216
  for i in range(n_nodes):
216
217
  # This should come back as a 3D covariance matrix with the spatial
217
218
  # variance covariance of this node across the different streamlines,
218
- # reorganized as an upper diagonal matrix for expected Mahalanobis
219
+ # converted to a positive semi-definite matrix if necessary
219
220
  cov = np.cov(sls[:, i, :].T, ddof=0)
220
- while np.any(np.linalg.eigvals(cov) < 0):
221
- cov += np.eye(cov.shape[0]) * 1e-12
221
+ if np.any(np.linalg.eigvals(cov) < 0):
222
+ eigenvalues, eigenvectors = np.linalg.eigh((cov + cov.T) / 2)
223
+ eigenvalues[eigenvalues < 0] = 0
224
+ cov = eigenvectors @ np.diag(eigenvalues) @ eigenvectors.T
222
225
 
223
226
  # calculate Mahalanobis for node in every fiber
224
227
  if np.any(cov > 0):
225
- ci = np.linalg.inv(cov)
226
-
227
- dist = (diff[:, i, :] @ ci) * diff[:, i, :]
228
- weights[:, i] = np.sqrt(np.sum(dist, axis=1))
228
+ weights[:, i] = np.sqrt(np.einsum(
229
+ 'ij,jk,ik->i',
230
+ diff[:, i, :],
231
+ pinvh(cov),
232
+ diff[:, i, :]))
229
233
 
230
234
  # In the special case where all the streamlines have the exact same
231
235
  # coordinate in this node, the covariance matrix is all zeros, so
@@ -5,6 +5,7 @@ import AFQ.data.fetch as afd
5
5
  import AFQ.utils.volume as auv
6
6
  from AFQ.tasks.utils import get_fname, str_to_desc
7
7
  from AFQ.definitions.utils import find_file
8
+ from AFQ.utils.path import space_from_fname
8
9
 
9
10
  import numpy as np
10
11
  import nibabel as nib
@@ -229,28 +230,42 @@ def default18_bd():
229
230
  'exclude': [templates['SLF_roi1_L']],
230
231
  'space': 'template',
231
232
  'start': templates['pARC_L_start'],
232
- 'primary_axis': 2,
233
+ 'primary_axis': 'I/S',
233
234
  'primary_axis_percentage': 40},
234
235
  'Right Posterior Arcuate': {'cross_midline': False,
235
236
  'include': [templates['SLFt_roi2_R']],
236
237
  'exclude': [templates['SLF_roi1_R']],
237
238
  'space': 'template',
238
239
  'start': templates['pARC_R_start'],
239
- 'primary_axis': 2,
240
+ 'primary_axis': 'I/S',
240
241
  'primary_axis_percentage': 40},
241
242
  'Left Vertical Occipital': {'cross_midline': False,
242
243
  'space': 'template',
243
244
  'start': templates['VOF_L_start'],
244
245
  'end': templates['VOF_L_end'],
245
246
  'inc_addtol': [4, 0],
246
- 'primary_axis': 2,
247
+ 'Left Arcuate': {
248
+ 'node_thresh': 20},
249
+ 'Left Posterior Arcuate': {
250
+ 'node_thresh': 1,
251
+ 'core': 'Anterior'},
252
+ 'Left Inferior Longitudinal': {
253
+ 'core': 'Right'},
254
+ 'primary_axis': 'I/S',
247
255
  'primary_axis_percentage': 40},
248
256
  'Right Vertical Occipital': {'cross_midline': False,
249
257
  'space': 'template',
250
258
  'start': templates['VOF_R_start'],
251
259
  'end': templates['VOF_R_end'],
252
260
  'inc_addtol': [4, 0],
253
- 'primary_axis': 2,
261
+ 'Right Arcuate': {
262
+ 'node_thresh': 20},
263
+ 'Right Posterior Arcuate': {
264
+ 'node_thresh': 1,
265
+ 'core': 'Anterior'},
266
+ 'Right Inferior Longitudinal': {
267
+ 'core': 'Left'},
268
+ 'primary_axis': 'I/S',
254
269
  'primary_axis_percentage': 40}})
255
270
 
256
271
 
@@ -467,7 +482,7 @@ def baby_bd():
467
482
  "exclude": [templates["SLF_roi1_L"]],
468
483
  "start": templates["pARC_L_start"],
469
484
  "end": templates["VOF_box_small_L"],
470
- "primary_axis": 2,
485
+ "primary_axis": 'I/S',
471
486
  "primary_axis_percentage": 40,
472
487
  "cross_midline": False,
473
488
  "mahal": {"distance_threshold": 4}},
@@ -476,21 +491,21 @@ def baby_bd():
476
491
  "exclude": [templates["SLF_roi1_R"]],
477
492
  "start": templates["pARC_R_start"],
478
493
  "end": templates["VOF_box_small_R"],
479
- "primary_axis": 2,
494
+ "primary_axis": 'I/S',
480
495
  "primary_axis_percentage": 40,
481
496
  "cross_midline": False,
482
497
  "mahal": {"distance_threshold": 4}},
483
498
  'Left Vertical Occipital': {
484
499
  "start": templates["VOF_L_start"],
485
500
  "end": templates["VOF_box_small_L"],
486
- "primary_axis": 2,
501
+ "primary_axis": 'I/S',
487
502
  "primary_axis_percentage": 40,
488
503
  "cross_midline": False,
489
504
  "mahal": {"distance_threshold": 4}},
490
505
  'Right Vertical Occipital': {
491
506
  "start": templates["VOF_R_start"],
492
507
  "end": templates["VOF_box_small_R"],
493
- "primary_axis": 2,
508
+ "primary_axis": 'I/S',
494
509
  "primary_axis_percentage": 40,
495
510
  "cross_midline": False,
496
511
  "mahal": {"distance_threshold": 4}}},
@@ -750,6 +765,14 @@ class BundleDict(MutableMapping):
750
765
  "cross_midline": False
751
766
  }
752
767
  })
768
+
769
+ Note
770
+ ----
771
+ The order of include ROIs may affect your results. This is
772
+ because ROI order within the include list determines the orientation of the
773
+ streamlines (from the first to the last) and the clipping of streamlines
774
+ when `clip_edges` is used, because the streamlines are clipped to
775
+ between the first and last ROIs.
753
776
  """
754
777
 
755
778
  def __init__(self,
@@ -799,6 +822,9 @@ class BundleDict(MutableMapping):
799
822
  " Only Callosum Anterior Frontal will be used."))
800
823
  self.bundle_names.remove("Forceps Minor")
801
824
 
825
+ def __print__(self):
826
+ print(self._dict)
827
+
802
828
  def update_max_includes(self, new_max):
803
829
  if new_max > self.max_includes:
804
830
  self.max_includes = new_max
@@ -921,62 +947,16 @@ class BundleDict(MutableMapping):
921
947
  resample_subject_to=self.resample_subject_to,
922
948
  keep_in_memory=self.keep_in_memory)
923
949
 
924
- def apply_to_rois(self, b_name, func, *args,
925
- dry_run=False, apply_to_recobundles=False,
926
- **kwargs):
950
+ def apply_to_rois(self, b_name, *args, **kwargs):
927
951
  """
928
- Applies some transformation to all ROIs (include, exclude, end, start)
929
- and the prob_map in a given bundle.
952
+ See: AFQ.api.bundle_dict.apply_to_roi_dict
930
953
 
931
954
  Parameters
932
955
  ----------
933
956
  b_name : name
934
957
  bundle name of bundle whose ROIs will be transformed.
935
- func : function
936
- function whose first argument must be a Nifti1Image and which
937
- returns a Nifti1Image
938
- dry_run : bool
939
- Whether to actually apply changes returned by `func` to the ROIs.
940
- If has_return is False, dry_run is not used.
941
- apply_to_recobundles : bool, optional
942
- Whether to apply the transformation to recobundles
943
- TRKs as well.
944
- Default: False
945
-
946
- *args :
947
- Additional arguments for func
948
- **kwargs
949
- Optional arguments for func
950
-
951
- Returns
952
- -------
953
- A dictionary where keys are
954
- the roi type and values are the transformed ROIs.
955
958
  """
956
- return_vals = {}
957
- for roi_type in [
958
- "include", "exclude",
959
- "start", "end", "prob_map"]:
960
- if roi_type in self._dict[b_name]:
961
- if roi_type in ["start", "end", "prob_map"]:
962
- return_vals[roi_type] = func(
963
- self._dict[b_name][roi_type], *args, **kwargs)
964
- else:
965
- changed_rois = []
966
- for _roi in self._dict[b_name][roi_type]:
967
- changed_rois.append(func(
968
- _roi, *args, **kwargs))
969
- return_vals[roi_type] = changed_rois
970
- if apply_to_recobundles and "recobundles" in self._dict[b_name]:
971
- return_vals["recobundles"] = {}
972
- for sl_type in ["sl", "centroid"]:
973
- return_vals["recobundles"][sl_type] = func(
974
- self._dict[b_name]["recobundles"][sl_type],
975
- *args, **kwargs)
976
- if not dry_run:
977
- for roi_type, roi in return_vals.items():
978
- self._dict[b_name][roi_type] = roi
979
- return return_vals
959
+ return apply_to_roi_dict(self._dict[b_name], *args, **kwargs)
980
960
 
981
961
  def _cond_load_bundle(self, b_name, dry_run=False):
982
962
  """
@@ -1018,7 +998,8 @@ class BundleDict(MutableMapping):
1018
998
  return roi_or_sl
1019
999
 
1020
1000
  def transform_rois(self, bundle_name, mapping, new_affine,
1021
- base_fname=None, apply_to_recobundles=False):
1001
+ base_fname=None, to_space="subject",
1002
+ apply_to_recobundles=False):
1022
1003
  """
1023
1004
  Get the bundle definition with transformed ROIs
1024
1005
  for a given bundle into a
@@ -1039,6 +1020,10 @@ class BundleDict(MutableMapping):
1039
1020
  Base file path to save ROIs too. Additional BIDS
1040
1021
  descriptors will be added to this file path. If None,
1041
1022
  do not save the ROIs.
1023
+ to_space : str, optional
1024
+ Name for space for exported ROIs. Only used if base_fname
1025
+ is not None.
1026
+ Default: "subject"
1042
1027
  apply_to_recobundles : bool, optional
1043
1028
  Whether to apply the transformation to recobundles
1044
1029
  TRKs as well.
@@ -1071,14 +1056,29 @@ class BundleDict(MutableMapping):
1071
1056
  if base_fname is not None:
1072
1057
  fnames = []
1073
1058
  for roi_type, rois in transformed_rois.items():
1059
+ if roi_type == "prob_map":
1060
+ suffix = "probseg"
1061
+ roi_type_name = ""
1062
+ else:
1063
+ suffix = "mask"
1064
+ roi_type_name = roi_type.lower().replace(
1065
+ " ", "").replace(
1066
+ "_", "").replace(
1067
+ "-", "")
1068
+ roi_type_name = roi_type_name[0].upper() \
1069
+ + roi_type_name[1:]
1074
1070
  if not isinstance(rois, list):
1075
1071
  rois = [rois]
1076
1072
  for ii, roi in enumerate(rois):
1073
+ desc = f"{str_to_desc(bundle_name)}{roi_type_name}"
1074
+ if roi_type in ["include", "exclude"]:
1075
+ desc = f"{desc}{ii}"
1077
1076
  fname = get_fname(
1078
1077
  base_fname,
1079
- "_space-subject_desc-"
1080
- f"{str_to_desc(bundle_name)}{roi_type}{ii}"
1081
- "_mask.nii.gz")
1078
+ f"_space-{to_space}_desc-"
1079
+ f"{desc}"
1080
+ f"_{suffix}.nii.gz",
1081
+ "ROIs")
1082
1082
  nib.save(
1083
1083
  nib.Nifti1Image(
1084
1084
  roi.get_fdata().astype(np.float32),
@@ -1121,3 +1121,67 @@ class BundleDict(MutableMapping):
1121
1121
  self.resample_to,
1122
1122
  self.resample_subject_to,
1123
1123
  self.keep_in_memory)
1124
+
1125
+
1126
+ def apply_to_roi_dict(dict_, func, *args,
1127
+ dry_run=False, apply_to_recobundles=False,
1128
+ apply_to_prob_map=True,
1129
+ **kwargs):
1130
+ """
1131
+ Applies some transformation to all ROIs (include, exclude, end, start)
1132
+ and the prob_map in a given bundle.
1133
+
1134
+ Parameters
1135
+ ----------
1136
+ dict_: dict
1137
+ dict describing the bundle using pyAFQ's format. An entry
1138
+ in a BundleDict.
1139
+ func : function
1140
+ function whose first argument must be a Nifti1Image and which
1141
+ returns a Nifti1Image
1142
+ dry_run : bool
1143
+ Whether to actually apply changes returned by `func` to the ROIs.
1144
+ If has_return is False, dry_run is not used.
1145
+ apply_to_recobundles : bool, optional
1146
+ Whether to apply the transformation to recobundles
1147
+ TRKs as well.
1148
+ Default: False
1149
+ apply_to_prob_map : bool, optional
1150
+ Whether to apply the transformation to the prob_map.
1151
+ Default: True
1152
+
1153
+ *args :
1154
+ Additional arguments for func
1155
+ **kwargs
1156
+ Optional arguments for func
1157
+
1158
+ Returns
1159
+ -------
1160
+ A dictionary where keys are
1161
+ the roi type and values are the transformed ROIs.
1162
+ """
1163
+ return_vals = {}
1164
+ roi_types = ["include", "exclude", "start", "end"]
1165
+ if apply_to_prob_map:
1166
+ roi_types.append("prob_map")
1167
+ for roi_type in roi_types:
1168
+ if roi_type in dict_:
1169
+ if roi_type in ["start", "end", "prob_map"]:
1170
+ return_vals[roi_type] = func(
1171
+ dict_[roi_type], *args, **kwargs)
1172
+ else:
1173
+ changed_rois = []
1174
+ for _roi in dict_[roi_type]:
1175
+ changed_rois.append(func(
1176
+ _roi, *args, **kwargs))
1177
+ return_vals[roi_type] = changed_rois
1178
+ if apply_to_recobundles and "recobundles" in dict_:
1179
+ return_vals["recobundles"] = {}
1180
+ for sl_type in ["sl", "centroid"]:
1181
+ return_vals["recobundles"][sl_type] = func(
1182
+ dict_["recobundles"][sl_type],
1183
+ *args, **kwargs)
1184
+ if not dry_run:
1185
+ for roi_type, roi in return_vals.items():
1186
+ dict_[roi_type] = roi
1187
+ return return_vals
@@ -14,6 +14,7 @@ from AFQ.api.utils import (
14
14
  export_all_helper, valid_exports_string)
15
15
  import AFQ.utils.streamlines as aus
16
16
  from AFQ.viz.utils import get_eye
17
+ from AFQ.data.utils import aws_import_msg_error
17
18
 
18
19
  from dipy.utils.parallel import paramap
19
20
  from dipy.io.stateful_tractogram import StatefulTractogram, Space
@@ -30,11 +31,9 @@ import os
30
31
  import os.path as op
31
32
  from tqdm import tqdm
32
33
  import json
33
- import s3fs
34
34
  from time import time
35
35
  import nibabel as nib
36
36
  from PIL import Image
37
- from s3bids.utils import S3BIDSStudy
38
37
  import glob
39
38
 
40
39
  from bids.layout import BIDSLayout, BIDSLayoutIndexer
@@ -45,7 +44,7 @@ except ImportError:
45
44
  using_afqb = False
46
45
 
47
46
 
48
- __all__ = ["GroupAFQ", "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: