pyAFQ 3.1__tar.gz → 3.3__tar.gz

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