pyAFQ 1.3__tar.gz → 1.3.2__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 (385) hide show
  1. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/api/bundle_dict.py +15 -26
  2. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/api/group.py +226 -6
  3. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/api/participant.py +17 -19
  4. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/data/fetch.py +5 -5
  5. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/definitions/image.py +9 -12
  6. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/definitions/mapping.py +5 -6
  7. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/csd.py +6 -4
  8. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/segmentation.py +14 -2
  9. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/data.py +180 -27
  10. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/decorators.py +10 -4
  11. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/mapping.py +13 -45
  12. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/segmentation.py +10 -5
  13. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/tractography.py +132 -54
  14. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/viz.py +4 -4
  15. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_api.py +20 -13
  16. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_definitions.py +1 -1
  17. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_segmentation.py +12 -11
  18. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tractography/tractography.py +5 -3
  19. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/conversion.py +34 -0
  20. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/streamlines.py +7 -2
  21. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/version.py +2 -2
  22. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/utils.py +7 -2
  23. {pyAFQ-1.3 → pyafq-1.3.2}/CHANGES.rst +28 -0
  24. {pyAFQ-1.3/pyAFQ.egg-info → pyafq-1.3.2}/PKG-INFO +5 -3
  25. pyafq-1.3.2/docs/source/explanations/bundle_orientation.rst +52 -0
  26. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/index.rst +2 -1
  27. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/bundledict.rst +33 -0
  28. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/kwargs.rst +16 -1
  29. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/methods.rst +10 -2
  30. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/baby_afq.py +4 -0
  31. {pyAFQ-1.3 → pyafq-1.3.2}/examples/tutorial_examples/plot_001_afq_api.py +7 -4
  32. {pyAFQ-1.3 → pyafq-1.3.2/pyAFQ.egg-info}/PKG-INFO +5 -3
  33. {pyAFQ-1.3 → pyafq-1.3.2}/pyAFQ.egg-info/SOURCES.txt +1 -0
  34. {pyAFQ-1.3 → pyafq-1.3.2}/pyAFQ.egg-info/requires.txt +4 -2
  35. {pyAFQ-1.3 → pyafq-1.3.2}/setup.cfg +3 -1
  36. {pyAFQ-1.3 → pyafq-1.3.2}/.github/CITATION.cff +0 -0
  37. {pyAFQ-1.3 → pyafq-1.3.2}/.github/CONTRIBUTING.md +0 -0
  38. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/docbuild.yml +0 -0
  39. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/docker_pyafq.yml +0 -0
  40. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  41. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_anisotropic_test.yml +0 -0
  42. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_basic_test.yml +0 -0
  43. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_custom_test.yml +0 -0
  44. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_pft_test.yml +0 -0
  45. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_reco80_test.yml +0 -0
  46. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_reco_test.yml +0 -0
  47. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/nightly_test.yml +0 -0
  48. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/publish-to-test-pypi.yml +0 -0
  49. {pyAFQ-1.3 → pyafq-1.3.2}/.github/workflows/test.yml +0 -0
  50. {pyAFQ-1.3 → pyafq-1.3.2}/.gitignore +0 -0
  51. {pyAFQ-1.3 → pyafq-1.3.2}/.mailmap +0 -0
  52. {pyAFQ-1.3 → pyafq-1.3.2}/.maintenance/update_changes.sh +0 -0
  53. {pyAFQ-1.3 → pyafq-1.3.2}/.maintenance/update_zenodo.py +0 -0
  54. {pyAFQ-1.3 → pyafq-1.3.2}/.pep8speaks.yml +0 -0
  55. {pyAFQ-1.3 → pyafq-1.3.2}/.zenodo.json +0 -0
  56. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/__init__.py +0 -0
  57. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/_fixes.py +0 -0
  58. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/afq_bids_entities.json +0 -0
  59. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/api/__init__.py +0 -0
  60. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/api/utils.py +0 -0
  61. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/data/__init__.py +0 -0
  62. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/data/utils.py +0 -0
  63. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/definitions/__init__.py +0 -0
  64. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/definitions/utils.py +0 -0
  65. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/QBallTP.py +0 -0
  66. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/__init__.py +0 -0
  67. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/dki.py +0 -0
  68. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/dti.py +0 -0
  69. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/models/fwdti.py +0 -0
  70. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/registration.py +0 -0
  71. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/__init__.py +0 -0
  72. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tasks/utils.py +0 -0
  73. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/__init__.py +0 -0
  74. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  75. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  76. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  77. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  78. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  79. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  80. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  81. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  82. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  83. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  84. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  85. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  86. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  87. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  88. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  89. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  90. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  91. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  92. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  93. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  94. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  95. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  96. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  97. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  98. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  99. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  100. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  101. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  102. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  103. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  104. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  105. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  106. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  107. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  108. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  109. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  110. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  111. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  112. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  113. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  114. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  115. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  116. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  117. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  118. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  119. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  120. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  121. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  122. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  123. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  124. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  125. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  126. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  127. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  128. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  129. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  130. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  131. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  132. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  133. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  134. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  135. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  136. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  137. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  138. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  139. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  140. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  141. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  142. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  143. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  144. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  145. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  146. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  147. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  148. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  149. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  150. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  151. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  152. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  153. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  154. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  155. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  156. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  157. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  158. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  159. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  160. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  161. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  162. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  163. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  164. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  165. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  166. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  167. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  168. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  169. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  170. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  171. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  172. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  173. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  174. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  175. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  176. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  177. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  178. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  179. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  180. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  181. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  182. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  183. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  184. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  185. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  186. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  187. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  188. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  189. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  190. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  191. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  192. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  193. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  194. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  195. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  196. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  197. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  198. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  199. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  200. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  201. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  202. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  203. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  204. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  205. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  206. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  207. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  208. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  209. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  210. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  211. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  212. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  213. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  214. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  215. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  216. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  217. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  218. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  219. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  220. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  221. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  222. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  223. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  224. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  225. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  226. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  227. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  228. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  229. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  230. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  231. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  232. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  233. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  234. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  235. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  236. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  237. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  238. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  239. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  240. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  241. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  242. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  243. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  244. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  245. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  246. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  247. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  248. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  249. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  250. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  251. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  252. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  253. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  254. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  255. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  256. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  257. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  258. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  259. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  260. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  261. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  262. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  263. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  264. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  265. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  266. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  267. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  268. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  269. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  270. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  271. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  272. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_bundle_dict.py +0 -0
  273. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_csd.py +0 -0
  274. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_data.py +0 -0
  275. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_dki.py +0 -0
  276. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_dti.py +0 -0
  277. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_fixes.py +0 -0
  278. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_registration.py +0 -0
  279. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_tractography.py +0 -0
  280. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tests/test_viz.py +0 -0
  281. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tractography/__init__.py +0 -0
  282. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tractography/gputractography.py +0 -0
  283. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/tractography/utils.py +0 -0
  284. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/__init__.py +0 -0
  285. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/bin.py +0 -0
  286. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/docs.py +0 -0
  287. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/models.py +0 -0
  288. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/path.py +0 -0
  289. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/stats.py +0 -0
  290. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/testing.py +0 -0
  291. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/__init__.py +0 -0
  292. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/test_conversions.py +0 -0
  293. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/test_path.py +0 -0
  294. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/test_stats.py +0 -0
  295. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/test_streamlines.py +0 -0
  296. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/tests/test_volume.py +0 -0
  297. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/utils/volume.py +0 -0
  298. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/__init__.py +0 -0
  299. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/altair.py +0 -0
  300. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/fury_backend.py +0 -0
  301. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/plot.py +0 -0
  302. {pyAFQ-1.3 → pyafq-1.3.2}/AFQ/viz/plotly_backend.py +0 -0
  303. {pyAFQ-1.3 → pyafq-1.3.2}/CITATION +0 -0
  304. {pyAFQ-1.3 → pyafq-1.3.2}/LICENSE +0 -0
  305. {pyAFQ-1.3 → pyafq-1.3.2}/MANIFEST.in +0 -0
  306. {pyAFQ-1.3 → pyafq-1.3.2}/Makefile +0 -0
  307. {pyAFQ-1.3 → pyafq-1.3.2}/README.md +0 -0
  308. {pyAFQ-1.3 → pyafq-1.3.2}/bin/pyAFQ +0 -0
  309. {pyAFQ-1.3 → pyafq-1.3.2}/docs/Makefile +0 -0
  310. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_progressbars.py +0 -0
  311. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  312. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_static/custom.css +0 -0
  313. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_static/eScience_Logo_HR.png +0 -0
  314. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_static/escience-logo.png +0 -0
  315. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_static/logo.png +0 -0
  316. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/_templates/layout.html +0 -0
  317. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/conf.py +0 -0
  318. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/down_left_arrow.png +0 -0
  319. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/down_right_arrow.png +0 -0
  320. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/greencheck.png +0 -0
  321. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/tract_modeling2.png +0 -0
  322. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/tract_profiling.png +0 -0
  323. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/tract_recognition.png +0 -0
  324. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/_static/tract_tractography.png +0 -0
  325. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/modeling.rst +0 -0
  326. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/profiling.rst +0 -0
  327. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/recognition.rst +0 -0
  328. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/tractography.rst +0 -0
  329. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/explanations/tractometry_pipeline.rst +0 -0
  330. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/cite.rst +0 -0
  331. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/contributing.rst +0 -0
  332. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/developing/definitions.rst +0 -0
  333. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/developing/index.rst +0 -0
  334. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/developing/releasing.rst +0 -0
  335. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/developing/tasks.rst +0 -0
  336. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/getting_help.rst +0 -0
  337. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/index.rst +0 -0
  338. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/installation_guide.rst +0 -0
  339. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/converter.rst +0 -0
  340. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/data.rst +0 -0
  341. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/docker.rst +0 -0
  342. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/image.rst +0 -0
  343. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/index.rst +0 -0
  344. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/kwargs.rst +0 -0
  345. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/methods.rst +0 -0
  346. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/howto/usage/scalars.rst +0 -0
  347. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/index.rst +0 -0
  348. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/index.rst +0 -0
  349. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/mapping.rst +0 -0
  350. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/reference/viz_backend.rst +0 -0
  351. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/sphinxext/kwargsdocs.py +0 -0
  352. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/sphinxext/methodsdocs.py +0 -0
  353. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/sphinxext/updatedocs.py +0 -0
  354. {pyAFQ-1.3 → pyafq-1.3.2}/docs/source/tutorials/index.rst +0 -0
  355. {pyAFQ-1.3 → pyafq-1.3.2}/docs/upload-gh-pages.sh +0 -0
  356. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/README.rst +0 -0
  357. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/add_custom_bundle.py +0 -0
  358. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/cerebellar_peduncles.py +0 -0
  359. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/cloudknot_example.py +0 -0
  360. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
  361. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_acoustic_radiations.py +0 -0
  362. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_afq_callosal.py +0 -0
  363. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_afq_fwdti.py +0 -0
  364. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_optic_radiations.py +0 -0
  365. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_recobundles.py +0 -0
  366. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
  367. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
  368. {pyAFQ-1.3 → pyafq-1.3.2}/examples/howto_examples/vof_example.py +0 -0
  369. {pyAFQ-1.3 → pyafq-1.3.2}/examples/tutorial_examples/README.rst +0 -0
  370. {pyAFQ-1.3 → pyafq-1.3.2}/examples/tutorial_examples/plot_002_bids_layout.py +0 -0
  371. {pyAFQ-1.3 → pyafq-1.3.2}/examples/tutorial_examples/plot_003_viz.py +0 -0
  372. {pyAFQ-1.3 → pyafq-1.3.2}/gpu_docker/Dockerfile +0 -0
  373. {pyAFQ-1.3 → pyafq-1.3.2}/gpu_docker/cuda_build.sh +0 -0
  374. {pyAFQ-1.3 → pyafq-1.3.2}/gpu_docker/cuda_track_template.def +0 -0
  375. {pyAFQ-1.3 → pyafq-1.3.2}/gpu_docker/docker-build.sh +0 -0
  376. {pyAFQ-1.3 → pyafq-1.3.2}/gpu_docker/docker-push.sh +0 -0
  377. {pyAFQ-1.3 → pyafq-1.3.2}/pyAFQ.egg-info/dependency_links.txt +0 -0
  378. {pyAFQ-1.3 → pyafq-1.3.2}/pyAFQ.egg-info/not-zip-safe +0 -0
  379. {pyAFQ-1.3 → pyafq-1.3.2}/pyAFQ.egg-info/top_level.txt +0 -0
  380. {pyAFQ-1.3 → pyafq-1.3.2}/pyafq_docker/Dockerfile +0 -0
  381. {pyAFQ-1.3 → pyafq-1.3.2}/pyafq_docker/docker-build.sh +0 -0
  382. {pyAFQ-1.3 → pyafq-1.3.2}/pyafq_docker/docker-push.sh +0 -0
  383. {pyAFQ-1.3 → pyafq-1.3.2}/pyproject.toml +0 -0
  384. {pyAFQ-1.3 → pyafq-1.3.2}/setup.py +0 -0
  385. {pyAFQ-1.3 → pyafq-1.3.2}/tox.ini +0 -0
@@ -775,7 +775,6 @@ class BundleDict(MutableMapping):
775
775
  self.resample_to = resample_to
776
776
  self.resample_subject_to = resample_subject_to
777
777
  self.keep_in_memory = keep_in_memory
778
- self.has_bids_info = False
779
778
  self.max_includes = 3
780
779
 
781
780
  self._dict = {}
@@ -787,7 +786,7 @@ class BundleDict(MutableMapping):
787
786
  if self.seg_algo == "afq":
788
787
  if "Forceps Major" in self.bundle_names\
789
788
  and "Callosum Occipital" in self.bundle_names:
790
- self.logger.warning((
789
+ self.logger.info((
791
790
  "Forceps Major and Callosum Occipital bundles"
792
791
  " are co-located, and AFQ"
793
792
  " assigns each streamline to only one bundle."
@@ -795,7 +794,7 @@ class BundleDict(MutableMapping):
795
794
  self.bundle_names.remove("Forceps Major")
796
795
  if "Forceps Minor" in self.bundle_names\
797
796
  and "Callosum Orbital" in self.bundle_names:
798
- self.logger.warning((
797
+ self.logger.info((
799
798
  "Forceps Minor and Callosum Orbital bundles"
800
799
  " are co-located, and AFQ"
801
800
  " assigns each streamline to only one bundle."
@@ -803,7 +802,7 @@ class BundleDict(MutableMapping):
803
802
  self.bundle_names.remove("Forceps Minor")
804
803
  if "Forceps Minor" in self.bundle_names\
805
804
  and "Callosum Anterior Frontal" in self.bundle_names:
806
- self.logger.warning((
805
+ self.logger.info((
807
806
  "Forceps Minor and Callosum Anterior Frontal bundles"
808
807
  " are co-located, and AFQ"
809
808
  " assigns each streamline to only one bundle."
@@ -814,33 +813,23 @@ class BundleDict(MutableMapping):
814
813
  if new_max > self.max_includes:
815
814
  self.max_includes = new_max
816
815
 
817
- def set_bids_info(self, bids_layout, bids_path, subject, session):
818
- """
819
- Provide the bids_layout, a nearest path,
820
- and the subject and session information
821
- to load ROIS from BIDS
822
- """
823
- self.has_bids_info = True
824
- self._bids_info = bids_layout
825
- self._bids_path = bids_path
826
- self._subject = subject
827
- self._session = session
828
-
829
- def _cond_load(self, roi_or_sl, resample_to):
830
- """
831
- Load ROI or streamline if not already loaded
832
- """
816
+ def _use_bids_info(self, roi_or_sl, bids_layout, bids_path,
817
+ subject, session):
833
818
  if isinstance(roi_or_sl, dict):
834
- if not self.has_bids_info:
835
- raise ValueError((
836
- "Attempted to load an ROI using BIDS description without "
837
- "First providing BIDS information."))
838
819
  suffix = roi_or_sl.get("suffix", "dwi")
839
820
  roi_or_sl = find_file(
840
- self._bids_info, self._bids_path,
821
+ bids_layout, bids_path,
841
822
  roi_or_sl,
842
823
  suffix,
843
- self._session, self._subject)
824
+ session, subject)
825
+ return roi_or_sl
826
+ else:
827
+ return roi_or_sl
828
+
829
+ def _cond_load(self, roi_or_sl, resample_to):
830
+ """
831
+ Load ROI or streamline if not already loaded
832
+ """
844
833
  if isinstance(roi_or_sl, str):
845
834
  if self.seg_algo == "afq":
846
835
  return afd.read_resample_roi(
@@ -3,6 +3,8 @@ import warnings
3
3
  import tempfile
4
4
 
5
5
  from AFQ.definitions.mapping import SynMap
6
+ from AFQ.definitions.utils import Definition
7
+ import AFQ.api.bundle_dict as abd
6
8
  warnings.simplefilter(action='ignore', category=FutureWarning) # noqa
7
9
 
8
10
  import logging
@@ -22,6 +24,7 @@ from dipy.io.streamline import save_tractogram
22
24
  from AFQ.version import version as pyafq_version
23
25
  from AFQ.viz.utils import trim
24
26
  import pandas as pd
27
+ import pydra
25
28
  import numpy as np
26
29
  import os
27
30
  import os.path as op
@@ -32,6 +35,7 @@ from time import time
32
35
  import nibabel as nib
33
36
  from PIL import Image
34
37
  from s3bids.utils import S3BIDSStudy
38
+ import glob
35
39
 
36
40
  from bids.layout import BIDSLayout, BIDSLayoutIndexer
37
41
  try:
@@ -60,6 +64,17 @@ def get_afq_bids_entities_fname():
60
64
  aus.__file__))) + "/afq_bids_entities.json"
61
65
 
62
66
 
67
+ class _ParticipantAFQInputs:
68
+ def __init__(
69
+ self, dwi_data_file, bval_file, bvec_file, results_dir,
70
+ kwargs):
71
+ self.dwi_data_file = dwi_data_file
72
+ self.bval_file = bval_file
73
+ self.bvec_file = bvec_file
74
+ self.results_dir = results_dir
75
+ self.kwargs = kwargs
76
+
77
+
63
78
  class GroupAFQ(object):
64
79
  f"""{AFQclass_doc}"""
65
80
 
@@ -146,6 +161,7 @@ class GroupAFQ(object):
146
161
  if not isinstance(bids_layout_kwargs, dict):
147
162
  raise TypeError("bids_layout_kwargs must be a dict")
148
163
 
164
+
149
165
  self.logger = logger
150
166
 
151
167
  self.parallel_params = parallel_params
@@ -252,6 +268,7 @@ class GroupAFQ(object):
252
268
  self.valid_sub_list = []
253
269
  self.valid_ses_list = []
254
270
  self.pAFQ_list = []
271
+ self.pAFQ_inputs_list = []
255
272
  for subject in self.subjects:
256
273
  self.wf_dict[subject] = {}
257
274
  for session in self.sessions:
@@ -296,20 +313,90 @@ class GroupAFQ(object):
296
313
  if suffix is not None:
297
314
  bids_filters["suffix"] = suffix
298
315
 
316
+ # Call find path for all definitions
317
+ for key, value in this_kwargs.items():
318
+ if key == "scalars":
319
+ for scalar in this_kwargs["scalars"]:
320
+ if isinstance(scalar, Definition):
321
+ scalar_found = scalar.find_path(
322
+ bids_layout,
323
+ dwi_data_file,
324
+ subject,
325
+ session,
326
+ required=False)
327
+ if scalar_found is False:
328
+ this_kwargs["scalars"].remove(scalar)
329
+ elif key == "import_tract":
330
+ if isinstance(this_kwargs["import_tract"], dict):
331
+ it_res = \
332
+ bids_layout.get(
333
+ subject=subject,
334
+ session=session,
335
+ extension=[
336
+ '.trk',
337
+ '.tck',
338
+ '.vtk',
339
+ '.fib',
340
+ '.dpy'],
341
+ return_type='filename',
342
+ **this_kwargs["import_tract"])
343
+ if len(it_res) < 1:
344
+ raise ValueError((
345
+ "No custom tractography found for"
346
+ f" subject {subject}"
347
+ " and session "
348
+ f"{session}."))
349
+ elif len(it_res) > 1:
350
+ this_kwargs["import_tract"] = it_res[0]
351
+ logger.warning((
352
+ f"Multiple viable custom tractographies found for"
353
+ f" subject "
354
+ f"{subject} and session "
355
+ f"{session}. Will use: {it_res[0]}"))
356
+ else:
357
+ this_kwargs["import_tract"] = it_res[0]
358
+ elif isinstance(value, dict):
359
+ for _, subvalue in value.items():
360
+ if isinstance(subvalue, Definition):
361
+ subvalue.find_path(
362
+ bids_layout,
363
+ dwi_data_file,
364
+ subject,
365
+ session)
366
+ elif isinstance(value, Definition):
367
+ value.find_path(
368
+ bids_layout,
369
+ dwi_data_file,
370
+ subject,
371
+ session)
372
+
373
+ # call find path for all ROIs
374
+ if "bundle_info" in this_kwargs and isinstance(
375
+ this_kwargs["bundle_info"], abd.BundleDict):
376
+ for b_name in this_kwargs["bundle_info"].bundle_names:
377
+ this_kwargs["bundle_info"].apply_to_rois(
378
+ b_name,
379
+ this_kwargs["bundle_info"]._use_bids_info,
380
+ bids_layout, bids_path, subject, session,
381
+ dry_run=False)
382
+
299
383
  self.valid_sub_list.append(subject)
300
384
  self.valid_ses_list.append(str(session))
301
385
 
302
- this_pAFQ = ParticipantAFQ(
386
+ this_pAFQ_inputs = _ParticipantAFQInputs(
303
387
  dwi_data_file,
304
388
  bval_file, bvec_file,
305
389
  results_dir,
306
- bids_info={
307
- "bids_layout": bids_layout,
308
- "subject": subject,
309
- "session": session},
310
- **this_kwargs)
390
+ this_kwargs)
391
+ this_pAFQ = ParticipantAFQ(
392
+ this_pAFQ_inputs.dwi_data_file,
393
+ this_pAFQ_inputs.bval_file,
394
+ this_pAFQ_inputs.bvec_file,
395
+ this_pAFQ_inputs.results_dir,
396
+ **this_pAFQ_inputs.kwargs)
311
397
  self.wf_dict[subject][str(session)] = this_pAFQ.wf_dict
312
398
  self.pAFQ_list.append(this_pAFQ)
399
+ self.pAFQ_inputs_list.append(this_pAFQ_inputs)
313
400
 
314
401
  def combine_profiles(self):
315
402
  tract_profiles_dict = self.export("profiles")
@@ -916,6 +1003,139 @@ class GroupAFQ(object):
916
1003
  sublink=page_subtitle_link)
917
1004
 
918
1005
 
1006
+ class ParallelGroupAFQ():
1007
+ def __init__(self, *args, **kwargs):
1008
+ orig = GroupAFQ(*args, **kwargs)
1009
+
1010
+ orig.parallel_params["submitter_params"] = \
1011
+ orig.parallel_params.get("submitter_params", {"plugin": "cf"})
1012
+
1013
+ orig.parallel_params["cache_dir"] = \
1014
+ orig.parallel_params.get("cache_dir", None)
1015
+
1016
+ self.parallel_params = orig.parallel_params
1017
+ self.pAFQ_kwargs = orig.pAFQ_inputs_list
1018
+
1019
+ self.finishing_params = dict()
1020
+ self.finishing_params["args"] = args
1021
+ self.finishing_params["kwargs"] = kwargs
1022
+ self.finishing_params["output_dirs"] = [pAFQ.kwargs["output_dir"]
1023
+ for pAFQ in orig.pAFQ_list]
1024
+
1025
+ def _submit_pydra(self, runnable):
1026
+ try:
1027
+ with pydra.Submitter(
1028
+ **self.parallel_params["submitter_params"],
1029
+ ) as sub:
1030
+ sub(runnable=runnable)
1031
+ # Addresses https://github.com/nipype/pydra/issues/630
1032
+ except AttributeError as e:
1033
+ if "'NoneType' object has no attribute 'replace'" not in str(e):
1034
+ raise
1035
+
1036
+ def export(self, attr_name="help", collapse=True):
1037
+ f"""
1038
+ Export a specific output. To print a list of available outputs,
1039
+ call export without arguments.
1040
+ {valid_exports_string}
1041
+
1042
+ Parameters
1043
+ ----------
1044
+ attr_name : str
1045
+ Name of the output to export. Default: "help"
1046
+ collapse : bool
1047
+ Whether to collapse session dimension if there is only 1 session.
1048
+ Default: True
1049
+
1050
+ Returns
1051
+ -------
1052
+ output : dict
1053
+ The specific output as a dictionary. Keys are subjects.
1054
+ Values are dictionaries with keys of sessions
1055
+ if multiple sessions are used. Otherwise, values are
1056
+ the output.
1057
+ None if called without arguments.
1058
+ """
1059
+
1060
+ @pydra.mark.task
1061
+ def export_sub(pAFQ_kwargs, attr_name):
1062
+ pAFQ = ParticipantAFQ(
1063
+ pAFQ_kwargs.dwi_data_file,
1064
+ pAFQ_kwargs.bval_file,
1065
+ pAFQ_kwargs.bvec_file,
1066
+ pAFQ_kwargs.results_dir,
1067
+ **pAFQ_kwargs.kwargs)
1068
+ pAFQ.export(attr_name)
1069
+
1070
+ # Submit to pydra
1071
+ export_sub_task = export_sub(
1072
+ attr_name=attr_name,
1073
+ cache_dir=self.parallel_params["cache_dir"]
1074
+ ).split("pAFQ_kwargs", pAFQ_kwargs=self.pAFQ_kwargs)
1075
+ self._submit_pydra(export_sub_task)
1076
+
1077
+ def export_all(self, viz=True, afqbrowser=True, xforms=True, indiv=True):
1078
+ """ Exports all the possible outputs
1079
+
1080
+ Parameters
1081
+ ----------
1082
+ viz : bool
1083
+ Whether to output visualizations. This includes tract profile
1084
+ plots, a figure containing all bundles, and, if using the AFQ
1085
+ segmentation algorithm, individual bundle figures.
1086
+ Default: True
1087
+ afqbrowser : bool
1088
+ Whether to output an AFQ-Browser from this AFQ instance.
1089
+ Default: True
1090
+ xforms : bool
1091
+ Whether to output the reg_template image in subject space and,
1092
+ depending on if it is possible based on the mapping used, to
1093
+ output the b0 in template space.
1094
+ Default: True
1095
+ indiv : bool
1096
+ Whether to output individual bundles in their own files, in
1097
+ addition to the one file containing all bundles. If using
1098
+ the AFQ segmentation algorithm, individual ROIs are also
1099
+ output.
1100
+ Default: True
1101
+ """
1102
+ @pydra.mark.task
1103
+ def export_sub(
1104
+ pAFQ_kwargs,
1105
+ finishing_params,
1106
+ viz,
1107
+ afqbrowser,
1108
+ xforms,
1109
+ indiv
1110
+ ):
1111
+ pAFQ = ParticipantAFQ(
1112
+ pAFQ_kwargs.dwi_data_file,
1113
+ pAFQ_kwargs.bval_file,
1114
+ pAFQ_kwargs.bvec_file,
1115
+ pAFQ_kwargs.results_dir,
1116
+ **pAFQ_kwargs.kwargs)
1117
+ pAFQ.export_all(viz, xforms, indiv)
1118
+
1119
+ for dir in finishing_params["output_dirs"]:
1120
+ if not glob.glob(op.join(dir, "*_desc-profiles_dwi.csv")):
1121
+ return
1122
+
1123
+ gAFQ = GroupAFQ(*finishing_params["args"],
1124
+ **finishing_params["kwargs"])
1125
+ gAFQ.export_all(viz, afqbrowser, xforms, indiv)
1126
+
1127
+ # Submit to pydra
1128
+ export_sub_task = export_sub(
1129
+ finishing_params=self.finishing_params,
1130
+ viz=viz,
1131
+ afqbrowser=afqbrowser,
1132
+ xforms=xforms,
1133
+ indiv=indiv,
1134
+ cache_dir=self.parallel_params["cache_dir"]
1135
+ ).split("pAFQ_kwargs", pAFQ_kwargs=self.pAFQ_kwargs)
1136
+ self._submit_pydra(export_sub_task)
1137
+
1138
+
919
1139
  def download_and_combine_afq_profiles(bucket,
920
1140
  study_s3_prefix="", deriv_name=None,
921
1141
  out_file=None,
@@ -34,10 +34,9 @@ class ParticipantAFQ(object):
34
34
  dwi_data_file,
35
35
  bval_file, bvec_file,
36
36
  output_dir,
37
- bids_info=None,
38
37
  **kwargs):
39
38
  """
40
- Initialize a ParticipantAFQ object from a BIDS dataset.
39
+ Initialize a ParticipantAFQ object.
41
40
 
42
41
  Parameters
43
42
  ----------
@@ -49,9 +48,6 @@ class ParticipantAFQ(object):
49
48
  Path to bvec file.
50
49
  output_dir : str
51
50
  Path to output directory.
52
- bids_info : dict or None, optional
53
- This is used by GroupAFQ to provide information about
54
- the BIDS layout to each participant.
55
51
  kwargs : additional optional parameters
56
52
  You can set additional parameters for any step
57
53
  of the process. See :ref:`usage/kwargs` for more details.
@@ -70,9 +66,6 @@ class ParticipantAFQ(object):
70
66
  In tracking_params, parameters with the suffix mask which are also
71
67
  an image from AFQ.definitions.image will be handled automatically by
72
68
  the api.
73
-
74
- It is recommended that you leave the bids_info parameter as None,
75
- and instead pass in the paths to the files you want to use directly.
76
69
  """
77
70
  if not isinstance(output_dir, str):
78
71
  raise TypeError(
@@ -95,14 +88,12 @@ class ParticipantAFQ(object):
95
88
  "did you mean tracking_params ?"))
96
89
 
97
90
  self.logger = logging.getLogger('AFQ')
98
- self.output_dir = output_dir
99
91
 
100
92
  self.kwargs = dict(
101
- dwi_path=dwi_data_file,
102
- bval=bval_file,
103
- bvec=bvec_file,
104
- results_dir=output_dir,
105
- bids_info=bids_info,
93
+ dwi_data_file=dwi_data_file,
94
+ bval_file=bval_file,
95
+ bvec_file=bvec_file,
96
+ output_dir=output_dir,
106
97
  base_fname=get_base_fname(output_dir, dwi_data_file),
107
98
  **kwargs)
108
99
  self.make_workflow()
@@ -113,15 +104,22 @@ class ParticipantAFQ(object):
113
104
  self.kwargs["mapping_definition"], SlrMap):
114
105
  plans = { # if using SLR map, do tractography first
115
106
  "data": get_data_plan(self.kwargs),
116
- "tractography": get_tractography_plan(self.kwargs),
117
- "mapping": get_mapping_plan(self.kwargs, use_sls=True),
107
+ "tractography": get_tractography_plan(
108
+ self.kwargs
109
+ ),
110
+ "mapping": get_mapping_plan(
111
+ self.kwargs,
112
+ use_sls=True
113
+ ),
118
114
  "segmentation": get_segmentation_plan(self.kwargs),
119
115
  "viz": get_viz_plan(self.kwargs)}
120
116
  else:
121
117
  plans = { # Otherwise, do mapping first
122
118
  "data": get_data_plan(self.kwargs),
123
119
  "mapping": get_mapping_plan(self.kwargs),
124
- "tractography": get_tractography_plan(self.kwargs),
120
+ "tractography": get_tractography_plan(
121
+ self.kwargs
122
+ ),
125
123
  "segmentation": get_segmentation_plan(self.kwargs),
126
124
  "viz": get_viz_plan(self.kwargs)}
127
125
 
@@ -279,7 +277,7 @@ class ParticipantAFQ(object):
279
277
 
280
278
  def _save_file(curr_img):
281
279
  save_path = op.abspath(op.join(
282
- self.output_dir,
280
+ self.kwargs["output_dir"],
283
281
  "bundle_montage.png"))
284
282
  curr_img.save(save_path)
285
283
  all_fnames.append(save_path)
@@ -373,7 +371,7 @@ class ParticipantAFQ(object):
373
371
  " to a filename and will be ignored."))
374
372
 
375
373
  apply_cmd_to_afq_derivs(
376
- self.output_dir,
374
+ self.kwargs["output_dir"],
377
375
  self.export("base_fname"),
378
376
  cmd=cmd,
379
377
  exception_file_names=exception_file_names,
@@ -263,7 +263,7 @@ pediatric_md5_hashes = [
263
263
  "1c4c0823c23b676d6d35004d93b9c695", "d4830d558cc8f707ebec912b32d197a5",
264
264
  "c405e0dbd9a4091c77b3d1ad200229b4", "ec0aeccc6661d2ee5ed79259383cdcee",
265
265
  "2802cd227b550f6e85df0fec1d515c29", "385addb999dc6d76957d2a35c4ee74bb",
266
- "b79f01829bd95682faaf545c72b1d52c", "b79f01829bd95682faaf545c72b1d52c",
266
+ "0dd14c02b272263adbe2246880979c9d", "99dac5a00c10d81d222f020162fd6194",
267
267
  "e49ba370edca96734d9376f551d413db", "f59e9e69e06325198f70047cd63c3bdc",
268
268
  "ae3bd2931f95adae0280a8f75cd3ca9b", "c409a0036b8c2dd4d03d11fbc6bfbdcd",
269
269
  "c2597a474ea5ec9e3126c35fd238f6b2", "67af59c934147c9f9ff6e0b76c4cc6eb",
@@ -303,7 +303,7 @@ pediatric_md5_hashes = [
303
303
  pediatric_remote_fnames = [
304
304
  "24880625", "24880628", "24880631", "24880634", "24880637", "24880640",
305
305
  "24880643", "24880646", "24880649", "24880652", "24880655", "24880661",
306
- "24880664", "24880667", "24880670", "24880673", "24880676", "24880679",
306
+ "24880664", "24880667", "46407571", "46407568", "24880676", "24880679",
307
307
  "24880685", "24880688", "24880691", "24880694", "24880697", "24880700",
308
308
  "24880703", "24880706", "24880712", "24880715", "24880718", "24880721",
309
309
  "24880724", "24880727", "24880730", "24880733", "24880736", "24880748",
@@ -538,7 +538,7 @@ template_remote_fnames = ["5273680", "5273683", "5273686", "5273689",
538
538
  "11458274", "11458277",
539
539
  "5273695", "5273692", "5273698", "5273701",
540
540
  "11458268", "11458271",
541
- "5273704", "5273707", "5273710", "5273713",
541
+ "5273704", "5273707", "46407574", "46407577",
542
542
  "11458262", "11458265",
543
543
  "5273716", "5273719",
544
544
  "11458220",
@@ -612,8 +612,8 @@ template_md5_hashes = ["6b7aaed1a2982fd0ea436a223133908b",
612
612
  "7e73ab02db30a3ad6bd9e82148c2486e",
613
613
  "f9db3154955a20b67c2dda758800d14c",
614
614
  "73941510c798c1ed1b03e2bd481cd5c7",
615
- "660cdc031ee0716d60159c7d933119ea",
616
- "660cdc031ee0716d60159c7d933119ea",
615
+ "b20e0caa54cf35002cd06cf6033b964f",
616
+ "e751306df304af32c3ce7617913bbd30",
617
617
  "fd012bc89f6bed7bd54530195496bac4",
618
618
  "3406906a86e633cc102127cf210a1063",
619
619
  "9040a7953dcbbf131d135c866182d8ef",
@@ -138,16 +138,13 @@ class ImageFile(ImageDefinition):
138
138
  if nearest_image is None:
139
139
  return False
140
140
 
141
- if session not in self.fnames:
142
- self.fnames[session] = {}
143
- self.fnames[session][subject] = nearest_image
141
+ self.fnames[from_path] = nearest_image
144
142
 
145
- def get_path_data_affine(self, bids_info):
143
+ def get_path_data_affine(self, dwi_path):
146
144
  if self._from_path:
147
145
  image_file = self.fname
148
146
  else:
149
- image_file = self.fnames[
150
- bids_info['session']][bids_info['subject']]
147
+ image_file = self.fnames[dwi_path]
151
148
  image_img = nib.load(image_file)
152
149
  return image_file, image_img.get_fdata(), image_img.affine
153
150
 
@@ -159,10 +156,10 @@ class ImageFile(ImageDefinition):
159
156
  return name_from_path(self.fname) if self._from_path else self.suffix
160
157
 
161
158
  def get_image_getter(self, task_name):
162
- def _image_getter_helper(dwi, bids_info):
159
+ def _image_getter_helper(dwi, dwi_data_file):
163
160
  # Load data
164
161
  image_file, image_data_orig, image_affine = \
165
- self.get_path_data_affine(bids_info)
162
+ self.get_path_data_affine(dwi_data_file)
166
163
 
167
164
  # Apply any conditions on the data
168
165
  image_data, meta = self.apply_conditions(
@@ -178,11 +175,11 @@ class ImageFile(ImageDefinition):
178
175
  image_data.astype(np.float32),
179
176
  dwi.affine), meta
180
177
  if task_name == "data":
181
- def image_getter(dwi, bids_info):
182
- return _image_getter_helper(dwi, bids_info)
178
+ def image_getter(dwi, dwi_data_file):
179
+ return _image_getter_helper(dwi, dwi_data_file)
183
180
  else:
184
- def image_getter(data_imap, bids_info):
185
- return _image_getter_helper(data_imap["dwi"], bids_info)
181
+ def image_getter(data_imap, dwi_data_file):
182
+ return _image_getter_helper(data_imap["dwi"], dwi_data_file)
186
183
  return image_getter
187
184
 
188
185
 
@@ -120,15 +120,14 @@ class FnirtMap(Definition):
120
120
  bids_layout, from_path, self.space_filters, self.space_suffix,
121
121
  session, subject, required=required)
122
122
 
123
- self.fnames[session][subject] = (nearest_warp, nearest_space)
123
+ self.fnames[from_path] = (nearest_warp, nearest_space)
124
124
 
125
- def get_for_subses(self, base_fname, dwi, bids_info, reg_subject,
125
+ def get_for_subses(self, base_fname, dwi, dwi_data_file, reg_subject,
126
126
  reg_template):
127
127
  if self._from_path:
128
128
  nearest_warp, nearest_space = self.fnames
129
129
  else:
130
- nearest_warp, nearest_space = self.fnames[
131
- bids_info['session']][bids_info['subject']]
130
+ nearest_warp, nearest_space = self.fnames[dwi_data_file]
132
131
 
133
132
  our_templ = reg_template
134
133
  subj = Image(dwi)
@@ -182,7 +181,7 @@ class IdentityMap(Definition):
182
181
  def __init__(self):
183
182
  pass
184
183
 
185
- def get_for_subses(self, base_fname, dwi, bids_info, reg_subject,
184
+ def get_for_subses(self, base_fname, dwi, dwi_data_file, reg_subject,
186
185
  reg_template):
187
186
  return ConformedAffineMapping(
188
187
  np.identity(4),
@@ -231,7 +230,7 @@ class GeneratedMapMixin(object):
231
230
  write_json(meta_fname, meta)
232
231
  return prealign_file if save else np.load(prealign_file)
233
232
 
234
- def get_for_subses(self, base_fname, dwi, bids_info, reg_subject,
233
+ def get_for_subses(self, base_fname, dwi, dwi_data_file, reg_subject,
235
234
  reg_template, subject_sls=None, template_sls=None):
236
235
  mapping_file, meta_fname = self.get_fnames(
237
236
  self.extension, base_fname)
@@ -23,7 +23,7 @@ class CsdNanResponseError(Exception):
23
23
  pass
24
24
 
25
25
 
26
- def _model(gtab, data, response=None, sh_order=None):
26
+ def _model(gtab, data, response=None, sh_order=None, csd_fa_thr=0.7):
27
27
  """
28
28
  Helper function that defines a CSD model.
29
29
  """
@@ -50,7 +50,7 @@ def _model(gtab, data, response=None, sh_order=None):
50
50
  response, _ = csd.auto_response_ssst(response_gtab,
51
51
  data,
52
52
  roi_radii=10,
53
- fa_thr=0.7)
53
+ fa_thr=csd_fa_thr)
54
54
  # Catch conditions where an auto-response could not be calculated:
55
55
  if np.all(np.isnan(response[0])):
56
56
  raise CsdNanResponseError
@@ -59,11 +59,13 @@ def _model(gtab, data, response=None, sh_order=None):
59
59
  return csdmodel
60
60
 
61
61
 
62
- def _fit(gtab, data, mask, response=None, sh_order=None, lambda_=1, tau=0.1):
62
+ def _fit(gtab, data, mask, response=None, sh_order=None,
63
+ lambda_=1, tau=0.1, csd_fa_thr=0.7):
63
64
  """
64
65
  Helper function that does the core of fitting a model to data.
65
66
  """
66
- return _model(gtab, data, response, sh_order).fit(data, mask=mask)
67
+ return _model(gtab, data, response, sh_order, csd_fa_thr).fit(
68
+ data, mask=mask)
67
69
 
68
70
 
69
71
  def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
@@ -482,6 +482,15 @@ class Segmentation:
482
482
  else:
483
483
  self.fiber_groups[b_name] = sl
484
484
 
485
+ def _add_bundle_to_meta(self, bundle_name, bundle_info):
486
+ bundle_info = bundle_info.copy()
487
+ # remove keys that can never be serialized
488
+ for key in [
489
+ 'include', 'exclude', 'prob_map',
490
+ 'start', 'end', 'curvature']:
491
+ bundle_info.pop(key, None)
492
+ self.meta[bundle_name] = bundle_info
493
+
485
494
  def segment_afq(self, tg=None):
486
495
  """
487
496
  Assign streamlines to bundles using the waypoint ROI approach
@@ -509,6 +518,7 @@ class Segmentation:
509
518
  dtype=np.uint32)
510
519
 
511
520
  self.fiber_groups = {}
521
+ self.meta = {}
512
522
 
513
523
  # We need to calculate the size of a voxel, so we can transform
514
524
  # from mm to voxel units:
@@ -862,10 +872,12 @@ class Segmentation:
862
872
  sb_include_cuts, in_place=False)
863
873
  self._add_bundle_to_fiber_group(
864
874
  sb_name, bundlesection_select_sl, select_idx, to_flip)
875
+ self._add_bundle_to_meta(sb_name, bundle_def)
865
876
  else:
866
877
  self._add_bundle_to_fiber_group(
867
878
  bundle, select_sl, select_idx, to_flip)
868
- return self.fiber_groups
879
+ self._add_bundle_to_meta(bundle, bundle_def)
880
+ return self.fiber_groups, self.meta
869
881
 
870
882
  def move_streamlines(self, tg, to="template"):
871
883
  """Streamline-based registration of a whole-brain tractogram to
@@ -1052,7 +1064,7 @@ class Segmentation:
1052
1064
  self.img,
1053
1065
  Space.RASMM)
1054
1066
  self.fiber_groups = fiber_groups
1055
- return fiber_groups
1067
+ return fiber_groups, {}
1056
1068
 
1057
1069
 
1058
1070
  def sl_curve(sl, n_points):