pyAFQ 3.2__tar.gz → 3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. {pyafq-3.2 → pyafq-3.3}/.codespellrc +1 -1
  2. {pyafq-3.2 → pyafq-3.3}/.gitignore +0 -2
  3. {pyafq-3.2 → pyafq-3.3}/AFQ/_fixes.py +60 -23
  4. {pyafq-3.2 → pyafq-3.3}/AFQ/api/bundle_dict.py +2 -2
  5. {pyafq-3.2 → pyafq-3.3}/AFQ/api/group.py +3 -3
  6. {pyafq-3.2 → pyafq-3.3}/AFQ/api/participant.py +1 -1
  7. {pyafq-3.2 → pyafq-3.3}/AFQ/data/fetch.py +1 -1
  8. {pyafq-3.2 → pyafq-3.3}/AFQ/models/asym_filtering.py +1 -1
  9. {pyafq-3.2 → pyafq-3.3}/AFQ/models/msmt.py +1 -1
  10. {pyafq-3.2 → pyafq-3.3}/AFQ/nn/multiaxial.py +1 -1
  11. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/criteria.py +1 -1
  12. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/utils.py +7 -1
  13. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/segmentation.py +11 -20
  14. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/tractography.py +1 -1
  15. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/viz.py +11 -11
  16. {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/tractography.py +4 -1
  17. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/conversion.py +1 -1
  18. pyafq-3.3/AFQ/utils/docs.py +24 -0
  19. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/streamlines.py +75 -17
  20. pyafq-3.3/AFQ/utils/tests/test_streamlines.py +185 -0
  21. {pyafq-3.2 → pyafq-3.3}/AFQ/version.py +3 -3
  22. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/fury_backend.py +23 -12
  23. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/plotly_backend.py +43 -19
  24. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/utils.py +23 -44
  25. {pyafq-3.2 → pyafq-3.3}/CHANGES.rst +6 -0
  26. {pyafq-3.2 → pyafq-3.3}/PKG-INFO +8 -8
  27. {pyafq-3.2 → pyafq-3.3}/docs/Makefile +5 -23
  28. {pyafq-3.2 → pyafq-3.3}/docs/source/conf.py +19 -28
  29. pyafq-3.3/docs/source/examples/howto_examples/acoustic_radiations.md +133 -0
  30. pyafq-3.2/examples/howto_examples/add_custom_bundle.py → pyafq-3.3/docs/source/examples/howto_examples/add_custom_bundle.md +109 -92
  31. pyafq-3.3/docs/source/examples/howto_examples/afq_callosal.md +119 -0
  32. pyafq-3.3/docs/source/examples/howto_examples/afq_fwdti.md +174 -0
  33. pyafq-3.3/docs/source/examples/howto_examples/baby_afq.md +168 -0
  34. pyafq-3.2/examples/howto_examples/cerebellar_peduncles.py → pyafq-3.3/docs/source/examples/howto_examples/cerebellar_peduncles.md +42 -31
  35. pyafq-3.3/docs/source/examples/howto_examples/cloudknot_example.md +198 -0
  36. pyafq-3.2/examples/howto_examples/cloudknot_hcp_example.py → pyafq-3.3/docs/source/examples/howto_examples/cloudknot_hcp_example.md +105 -63
  37. pyafq-3.2/examples/howto_examples/README.rst → pyafq-3.3/docs/source/examples/howto_examples/index.rst +4 -1
  38. pyafq-3.3/docs/source/examples/howto_examples/optic_radiations.md +175 -0
  39. pyafq-3.3/docs/source/examples/howto_examples/optic_tract.md +190 -0
  40. pyafq-3.2/examples/howto_examples/plot_stages_of_tractometry.py → pyafq-3.3/docs/source/examples/howto_examples/plot_stages_of_tractometry.md +230 -152
  41. pyafq-3.3/docs/source/examples/howto_examples/pyAFQ_with_GPU.md +74 -0
  42. pyafq-3.2/examples/howto_examples/pyafq_2.py → pyafq-3.3/docs/source/examples/howto_examples/pyafq_2.md +70 -55
  43. pyafq-3.3/docs/source/examples/howto_examples/recobundles.md +71 -0
  44. pyafq-3.3/docs/source/examples/howto_examples/use_subject_space_rois_from_freesurfer.md +163 -0
  45. pyafq-3.2/examples/howto_examples/vof_example.py → pyafq-3.3/docs/source/examples/howto_examples/vof_example.md +24 -7
  46. pyafq-3.2/examples/tutorial_examples/README.rst → pyafq-3.3/docs/source/examples/tutorial_examples/index.rst +4 -1
  47. pyafq-3.3/docs/source/examples/tutorial_examples/plot_001_group_afq_api.md +349 -0
  48. pyafq-3.3/docs/source/examples/tutorial_examples/plot_002_participant_afq_api.md +307 -0
  49. pyafq-3.3/docs/source/examples/tutorial_examples/plot_003_rerun.md +184 -0
  50. pyafq-3.3/docs/source/examples/tutorial_examples/plot_004_export.md +222 -0
  51. pyafq-3.3/docs/source/examples/tutorial_examples/plot_005_viz.md +482 -0
  52. pyafq-3.3/docs/source/examples/tutorial_examples/plot_006_bids_layout.md +326 -0
  53. pyafq-3.2/examples/tutorial_examples/plot_007_rois.py → pyafq-3.3/docs/source/examples/tutorial_examples/plot_007_rois.md +37 -12
  54. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/index.rst +1 -1
  55. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/converter.rst +1 -1
  56. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/data.rst +2 -2
  57. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/index.rst +1 -1
  58. {pyafq-3.2 → pyafq-3.3}/docs/source/index.rst +5 -5
  59. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/bundledict.rst +1 -1
  60. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/fibertracts.rst +6 -6
  61. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/kwargs.rst +1 -1
  62. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/methods.rst +1 -1
  63. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/viz_backend.rst +8 -8
  64. {pyafq-3.2 → pyafq-3.3}/docs/source/tutorials/index.rst +3 -5
  65. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/PKG-INFO +8 -8
  66. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/SOURCES.txt +25 -26
  67. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/requires.txt +7 -8
  68. {pyafq-3.2 → pyafq-3.3}/setup.cfg +5 -5
  69. pyafq-3.2/AFQ/utils/docs.py +0 -55
  70. pyafq-3.2/AFQ/utils/tests/test_streamlines.py +0 -74
  71. pyafq-3.2/docs/source/_progressbars.py +0 -33
  72. pyafq-3.2/examples/howto_examples/acoustic_radiations.py +0 -119
  73. pyafq-3.2/examples/howto_examples/afq_callosal.py +0 -104
  74. pyafq-3.2/examples/howto_examples/afq_fwdti.py +0 -162
  75. pyafq-3.2/examples/howto_examples/baby_afq.py +0 -152
  76. pyafq-3.2/examples/howto_examples/cloudknot_example.py +0 -163
  77. pyafq-3.2/examples/howto_examples/optic_radiations.py +0 -155
  78. pyafq-3.2/examples/howto_examples/optic_tract.py +0 -176
  79. pyafq-3.2/examples/howto_examples/pyAFQ_with_GPU.py +0 -58
  80. pyafq-3.2/examples/howto_examples/recobundles.py +0 -59
  81. pyafq-3.2/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -147
  82. pyafq-3.2/examples/tutorial_examples/plot_001_group_afq_api.py +0 -308
  83. pyafq-3.2/examples/tutorial_examples/plot_002_participant_afq_api.py +0 -268
  84. pyafq-3.2/examples/tutorial_examples/plot_003_rerun.py +0 -160
  85. pyafq-3.2/examples/tutorial_examples/plot_004_export.py +0 -192
  86. pyafq-3.2/examples/tutorial_examples/plot_005_viz.py +0 -436
  87. pyafq-3.2/examples/tutorial_examples/plot_006_bids_layout.py +0 -297
  88. {pyafq-3.2 → pyafq-3.3}/.github/CITATION.cff +0 -0
  89. {pyafq-3.2 → pyafq-3.3}/.github/CONTRIBUTING.md +0 -0
  90. {pyafq-3.2 → pyafq-3.3}/.github/workflows/docbuild.yml +0 -0
  91. {pyafq-3.2 → pyafq-3.3}/.github/workflows/docker_pyafq.yml +0 -0
  92. {pyafq-3.2 → pyafq-3.3}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  93. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_anisotropic_test.yml +0 -0
  94. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_basic_test.yml +0 -0
  95. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_custom_test.yml +0 -0
  96. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_reco80_test.yml +0 -0
  97. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_reco_test.yml +0 -0
  98. {pyafq-3.2 → pyafq-3.3}/.github/workflows/nightly_test.yml +0 -0
  99. {pyafq-3.2 → pyafq-3.3}/.github/workflows/publish-to-test-pypi.yml +0 -0
  100. {pyafq-3.2 → pyafq-3.3}/.github/workflows/test.yml +0 -0
  101. {pyafq-3.2 → pyafq-3.3}/.mailmap +0 -0
  102. {pyafq-3.2 → pyafq-3.3}/.maintenance/update_changes.sh +0 -0
  103. {pyafq-3.2 → pyafq-3.3}/.maintenance/update_zenodo.py +0 -0
  104. {pyafq-3.2 → pyafq-3.3}/.pep8speaks.yml +0 -0
  105. {pyafq-3.2 → pyafq-3.3}/.pre-commit-config.yaml +0 -0
  106. {pyafq-3.2 → pyafq-3.3}/.zenodo.json +0 -0
  107. {pyafq-3.2 → pyafq-3.3}/AFQ/__init__.py +0 -0
  108. {pyafq-3.2 → pyafq-3.3}/AFQ/api/__init__.py +0 -0
  109. {pyafq-3.2 → pyafq-3.3}/AFQ/api/utils.py +0 -0
  110. {pyafq-3.2 → pyafq-3.3}/AFQ/data/__init__.py +0 -0
  111. {pyafq-3.2 → pyafq-3.3}/AFQ/data/utils.py +0 -0
  112. {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/__init__.py +0 -0
  113. {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/image.py +0 -0
  114. {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/mapping.py +0 -0
  115. {pyafq-3.2 → pyafq-3.3}/AFQ/definitions/utils.py +0 -0
  116. {pyafq-3.2 → pyafq-3.3}/AFQ/models/QBallTP.py +0 -0
  117. {pyafq-3.2 → pyafq-3.3}/AFQ/models/__init__.py +0 -0
  118. {pyafq-3.2 → pyafq-3.3}/AFQ/models/csd.py +0 -0
  119. {pyafq-3.2 → pyafq-3.3}/AFQ/models/dki.py +0 -0
  120. {pyafq-3.2 → pyafq-3.3}/AFQ/models/dti.py +0 -0
  121. {pyafq-3.2 → pyafq-3.3}/AFQ/models/fwdti.py +0 -0
  122. {pyafq-3.2 → pyafq-3.3}/AFQ/models/wmgm_interface.py +0 -0
  123. {pyafq-3.2 → pyafq-3.3}/AFQ/nn/__init__.py +0 -0
  124. {pyafq-3.2 → pyafq-3.3}/AFQ/nn/brainchop.py +0 -0
  125. {pyafq-3.2 → pyafq-3.3}/AFQ/nn/synthseg.py +0 -0
  126. {pyafq-3.2 → pyafq-3.3}/AFQ/nn/utils.py +0 -0
  127. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/__init__.py +0 -0
  128. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/cleaning.py +0 -0
  129. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/clustering.py +0 -0
  130. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/curvature.py +0 -0
  131. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/other_bundles.py +0 -0
  132. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/preprocess.py +0 -0
  133. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/recognize.py +0 -0
  134. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/roi.py +0 -0
  135. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/sparse_decisions.py +0 -0
  136. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/__init__.py +0 -0
  137. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/conftest.py +0 -0
  138. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  139. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_recognition.py +0 -0
  140. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_rois.py +0 -0
  141. {pyafq-3.2 → pyafq-3.3}/AFQ/recognition/tests/test_utils.py +0 -0
  142. {pyafq-3.2 → pyafq-3.3}/AFQ/registration.py +0 -0
  143. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/__init__.py +0 -0
  144. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/data.py +0 -0
  145. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/decorators.py +0 -0
  146. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/mapping.py +0 -0
  147. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/structural.py +0 -0
  148. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/tissue.py +0 -0
  149. {pyafq-3.2 → pyafq-3.3}/AFQ/tasks/utils.py +0 -0
  150. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/__init__.py +0 -0
  151. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  152. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  153. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  154. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  155. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  156. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  157. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  158. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  159. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  160. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  161. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  162. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  163. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  164. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  165. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  166. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  167. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  168. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  169. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  170. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  171. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  172. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  173. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  174. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  175. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  176. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  177. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  178. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  179. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  180. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  181. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  182. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  183. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  184. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  185. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  186. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  187. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  188. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  189. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  190. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  191. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  192. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  193. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  194. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  195. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  196. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  197. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  198. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  199. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  200. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  201. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  202. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  203. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  204. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  205. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  206. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  207. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  208. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  209. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  210. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  211. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  212. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  213. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  214. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  215. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  216. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  217. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  218. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  219. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  220. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  221. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  222. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  223. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  224. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  225. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  226. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  227. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  228. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  229. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  230. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  231. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  232. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  233. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  234. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  235. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  236. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  237. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  238. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  239. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  240. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  241. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  242. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  243. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  244. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  245. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  246. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  247. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  248. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  249. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  250. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  251. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  252. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  253. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  254. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  255. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  256. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  257. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  258. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  259. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  260. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  261. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  262. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  263. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  264. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  265. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  266. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  267. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  268. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  269. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  270. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  271. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  272. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  273. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  274. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  275. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  276. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  277. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  278. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  279. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  280. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  281. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  282. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  283. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  284. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  285. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  286. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  287. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  288. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  289. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  290. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  291. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  292. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  293. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  294. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  295. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  296. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  297. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  298. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  299. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  300. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  301. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  302. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  303. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  304. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  305. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  306. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  307. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  308. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  309. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  310. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  311. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  312. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  313. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  314. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  315. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  316. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  317. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  318. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  319. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  320. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  321. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  322. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  323. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  324. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  325. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  326. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  327. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  328. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  329. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  330. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  331. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  332. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  333. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  334. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  335. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  336. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  337. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  338. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  339. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  340. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  341. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  342. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  343. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  344. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  345. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  346. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  347. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  348. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  349. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_api.py +0 -0
  350. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_bundle_dict.py +0 -0
  351. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_csd.py +0 -0
  352. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_data.py +0 -0
  353. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_definitions.py +0 -0
  354. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_dki.py +0 -0
  355. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_dti.py +0 -0
  356. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_fixes.py +0 -0
  357. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_msmt.py +0 -0
  358. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_nn.py +0 -0
  359. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_registration.py +0 -0
  360. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_tractography.py +0 -0
  361. {pyafq-3.2 → pyafq-3.3}/AFQ/tests/test_viz.py +0 -0
  362. {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/__init__.py +0 -0
  363. {pyafq-3.2 → pyafq-3.3}/AFQ/tractography/utils.py +0 -0
  364. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/__init__.py +0 -0
  365. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/bin.py +0 -0
  366. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/docstring_parser.py +0 -0
  367. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/models.py +0 -0
  368. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/path.py +0 -0
  369. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/stats.py +0 -0
  370. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/testing.py +0 -0
  371. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/__init__.py +0 -0
  372. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_conversions.py +0 -0
  373. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_path.py +0 -0
  374. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_stats.py +0 -0
  375. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/tests/test_volume.py +0 -0
  376. {pyafq-3.2 → pyafq-3.3}/AFQ/utils/volume.py +0 -0
  377. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/__init__.py +0 -0
  378. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/altair.py +0 -0
  379. {pyafq-3.2 → pyafq-3.3}/AFQ/viz/plot.py +0 -0
  380. {pyafq-3.2 → pyafq-3.3}/CITATION +0 -0
  381. {pyafq-3.2 → pyafq-3.3}/LICENSE +0 -0
  382. {pyafq-3.2 → pyafq-3.3}/MANIFEST.in +0 -0
  383. {pyafq-3.2 → pyafq-3.3}/Makefile +0 -0
  384. {pyafq-3.2 → pyafq-3.3}/NOTICE.md +0 -0
  385. {pyafq-3.2 → pyafq-3.3}/README.md +0 -0
  386. {pyafq-3.2 → pyafq-3.3}/bin/pyAFQ +0 -0
  387. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  388. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/CSVfile.png +0 -0
  389. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/FAbrain.png +0 -0
  390. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/ProfileViz.png +0 -0
  391. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/TP_viz.png +0 -0
  392. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/arcuaterois.png +0 -0
  393. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/beaware.png +0 -0
  394. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/custom.css +0 -0
  395. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/diffusion-anisotropic.gif +0 -0
  396. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/diffusion-isotropic.gif +0 -0
  397. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/down_left_arrow.png +0 -0
  398. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/down_right_arrow.png +0 -0
  399. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/dti_in_brain.png +0 -0
  400. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/dtiexplanation.jpg +0 -0
  401. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/eScience_Logo_HR.png +0 -0
  402. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/ecosystem.jpg +0 -0
  403. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/escience-logo.png +0 -0
  404. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/greencheck.png +0 -0
  405. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/inherintambiguity.png +0 -0
  406. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/logo.png +0 -0
  407. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/modelling.png +0 -0
  408. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/modeltotrack.png +0 -0
  409. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_001.gif +0 -0
  410. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_002.gif +0 -0
  411. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_003.gif +0 -0
  412. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_004.gif +0 -0
  413. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_005.gif +0 -0
  414. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_006.gif +0 -0
  415. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_010.gif +0 -0
  416. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_011.gif +0 -0
  417. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_012.gif +0 -0
  418. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_modeling2.png +0 -0
  419. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_profiling.png +0 -0
  420. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_recognition.png +0 -0
  421. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tract_tractography.png +0 -0
  422. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tractometry_pipeline.png +0 -0
  423. {pyafq-3.2 → pyafq-3.3}/docs/source/_static/tropic.png +0 -0
  424. {pyafq-3.2 → pyafq-3.3}/docs/source/_templates/footer.html +0 -0
  425. {pyafq-3.2 → pyafq-3.3}/docs/source/_templates/layout.html +0 -0
  426. {pyafq-3.2 → pyafq-3.3}/docs/source/bib.rst +0 -0
  427. {pyafq-3.2 → pyafq-3.3}/docs/source/developing/contributing.rst +0 -0
  428. {pyafq-3.2 → pyafq-3.3}/docs/source/developing/definitions.rst +0 -0
  429. {pyafq-3.2 → pyafq-3.3}/docs/source/developing/index.rst +0 -0
  430. {pyafq-3.2 → pyafq-3.3}/docs/source/developing/releasing.rst +0 -0
  431. {pyafq-3.2 → pyafq-3.3}/docs/source/developing/tasks.rst +0 -0
  432. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/bundle_orientation.rst +0 -0
  433. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/modeling.rst +0 -0
  434. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/profiling.rst +0 -0
  435. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/recognition.rst +0 -0
  436. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/tractography.rst +0 -0
  437. {pyafq-3.2 → pyafq-3.3}/docs/source/explanations/whats_new_3.rst +0 -0
  438. {pyafq-3.2 → pyafq-3.3}/docs/source/guides_index.rst +0 -0
  439. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/cite.rst +0 -0
  440. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/cleaning_params.rst +0 -0
  441. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/docker.rst +0 -0
  442. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/getting_help.rst +0 -0
  443. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/image.rst +0 -0
  444. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/installation_guide.rst +0 -0
  445. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/rerun.rst +0 -0
  446. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/scalars.rst +0 -0
  447. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/segmentation_params.rst +0 -0
  448. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/singularity.rst +0 -0
  449. {pyafq-3.2 → pyafq-3.3}/docs/source/howto/tractography_params.rst +0 -0
  450. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/index.rst +0 -0
  451. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/mapping.rst +0 -0
  452. {pyafq-3.2 → pyafq-3.3}/docs/source/reference/tissue_properties.rst +0 -0
  453. {pyafq-3.2 → pyafq-3.3}/docs/source/references.bib +0 -0
  454. {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/kwargsdocs.py +0 -0
  455. {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/methodsdocs.py +0 -0
  456. {pyafq-3.2 → pyafq-3.3}/docs/source/sphinxext/updatedocs.py +0 -0
  457. {pyafq-3.2 → pyafq-3.3}/docs/upload-gh-pages.sh +0 -0
  458. {pyafq-3.2 → pyafq-3.3}/gpu_docker/Dockerfile +0 -0
  459. {pyafq-3.2 → pyafq-3.3}/gpu_docker/docker-build.sh +0 -0
  460. {pyafq-3.2 → pyafq-3.3}/gpu_docker/docker-push.sh +0 -0
  461. {pyafq-3.2 → pyafq-3.3}/gpu_docker/pyafq_with_gpu_template.def +0 -0
  462. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/dependency_links.txt +0 -0
  463. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/not-zip-safe +0 -0
  464. {pyafq-3.2 → pyafq-3.3}/pyAFQ.egg-info/top_level.txt +0 -0
  465. {pyafq-3.2 → pyafq-3.3}/pyafq_docker/Dockerfile +0 -0
  466. {pyafq-3.2 → pyafq-3.3}/pyafq_docker/docker-build.sh +0 -0
  467. {pyafq-3.2 → pyafq-3.3}/pyafq_docker/docker-push.sh +0 -0
  468. {pyafq-3.2 → pyafq-3.3}/pyproject.toml +0 -0
  469. {pyafq-3.2 → pyafq-3.3}/setup.py +0 -0
  470. {pyafq-3.2 → 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)
@@ -387,7 +387,7 @@ def default_bd():
387
387
  "primary_axis": "I/S",
388
388
  "ORG_spectral_subbundles": SpectralSubbundleDict(
389
389
  {
390
- "Left V1V3": {
390
+ "Left Early Visual": {
391
391
  "cluster_IDs": [78],
392
392
  "Left Optic Radiation": {
393
393
  "core": "Anterior",
@@ -449,7 +449,7 @@ def default_bd():
449
449
  "primary_axis": "I/S",
450
450
  "ORG_spectral_subbundles": SpectralSubbundleDict(
451
451
  {
452
- "Right V1V3": {
452
+ "Right Early Visual": {
453
453
  "cluster_IDs": [78],
454
454
  "Right Optic Radiation": {
455
455
  "core": "Anterior",
@@ -18,7 +18,7 @@ from dipy.io.stateful_tractogram import Space, StatefulTractogram
18
18
  from dipy.io.streamline import save_tractogram
19
19
  from dipy.utils.parallel import paramap
20
20
  from PIL import Image
21
- from tqdm import tqdm
21
+ from tqdm.auto import tqdm
22
22
 
23
23
  import AFQ.api.bundle_dict as abd
24
24
  import AFQ.definitions.image as afm
@@ -555,7 +555,7 @@ class GroupAFQ(object):
555
555
  ses
556
556
  ]
557
557
  seg_sft = aus.SegmentedSFT.fromfile(this_bundles_file, this_img)
558
- seg_sft.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
@@ -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
 
@@ -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
 
@@ -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
 
@@ -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:
@@ -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,
@@ -120,13 +120,13 @@ def viz_bundles(
120
120
  )
121
121
 
122
122
  fname = None
123
- if "no_gif" not in viz_backend.backend:
124
- fname = get_fname(base_fname, ".gif", "..")
123
+ if "no_mp4" not in viz_backend.backend:
124
+ fname = get_fname(base_fname, ".mp4", "..")
125
125
 
126
126
  try:
127
- viz_backend.create_gif(figure, fname)
127
+ viz_backend.create_mp4(figure, fname)
128
128
  except PermissionError as e:
129
- logger.warning(f"Failed to write GIF file: {fname} \n{e}")
129
+ logger.warning(f"Failed to write MP4 file: {fname} \n{e}")
130
130
  if "plotly" in viz_backend.backend:
131
131
  fname = get_fname(base_fname, ".html", "..")
132
132
 
@@ -156,7 +156,7 @@ def viz_indivBundle(
156
156
  n_points_indiv=40,
157
157
  ):
158
158
  """
159
- list of full paths to html or gif files
159
+ list of full paths to html or mp4 files
160
160
  containing visualizations of individual bundles
161
161
 
162
162
  Parameters
@@ -255,15 +255,15 @@ def viz_indivBundle(
255
255
 
256
256
  base_fname = op.join(output_dir, op.split(base_fname)[1])
257
257
  figures[bundle_name] = figure
258
- if "no_gif" not in viz_backend.backend:
258
+ if "no_mp4" not in viz_backend.backend:
259
259
  fname = get_fname(
260
260
  base_fname,
261
- f"_desc-{str_to_desc(bundle_name)}_tractography.gif",
261
+ f"_desc-{str_to_desc(bundle_name)}_tractography.mp4",
262
262
  "viz_bundles",
263
263
  )
264
264
 
265
265
  try:
266
- viz_backend.create_gif(figure, fname)
266
+ viz_backend.create_mp4(figure, fname)
267
267
  except PermissionError as e:
268
268
  if not failed_write:
269
269
  logger.warning(
@@ -380,7 +380,7 @@ def plot_tract_profiles(base_fname, output_dir, scalars, segmentation_imap):
380
380
 
381
381
 
382
382
  @immlib.calc("viz_backend")
383
- def init_viz_backend(viz_backend_spec="plotly_no_gif"):
383
+ def init_viz_backend(viz_backend_spec="plotly_no_mp4"):
384
384
  """
385
385
  An instance of the `AFQ.viz.utils.viz_backend` class.
386
386
 
@@ -390,8 +390,8 @@ def init_viz_backend(viz_backend_spec="plotly_no_gif"):
390
390
  Which visualization backend to use.
391
391
  See Visualization Backends page in documentation for details
392
392
  https://tractometry.org/pyAFQ/reference/viz_backend.html
393
- One of {"fury", "plotly", "plotly_no_gif"}.
394
- Default: "plotly_no_gif"
393
+ One of {"fury", "plotly", "plotly_no_mp4"}.
394
+ Default: "plotly_no_mp4"
395
395
  """
396
396
  if "fury" not in viz_backend_spec and "plotly" not in viz_backend_spec:
397
397
  raise TypeError("viz_backend_spec must contain either 'fury' or 'plotly'")
@@ -18,7 +18,7 @@ from dipy.tracking.tracker import (
18
18
  )
19
19
  from nibabel.streamlines.tractogram import LazyTractogram
20
20
  from skimage.segmentation import find_boundaries
21
- from tqdm import tqdm
21
+ from tqdm.auto import tqdm
22
22
 
23
23
  from AFQ._fixes import tensor_odf
24
24
  from AFQ.tractography.utils import gen_seeds
@@ -358,6 +358,9 @@ def track(
358
358
  rng_seed=tracking_kwargs["random_seed"],
359
359
  chunk_size=jit_chunk_size,
360
360
  ) as jit_tracker:
361
+ jit_tracker.set_compression_parameters(
362
+ pos_dtype=np.float16, linearize=False
363
+ )
361
364
  if trx:
362
365
  res = jit_tracker.generate_trx(seeds, params_img)
363
366
  else:
@@ -2,7 +2,7 @@ import nibabel as nib
2
2
  import numpy as np
3
3
  import scipy.io
4
4
  from dipy.io.stateful_tractogram import Space, StatefulTractogram
5
- from tqdm import tqdm
5
+ from tqdm.auto import tqdm
6
6
 
7
7
  from AFQ.data.utils import BUNDLE_MAT_2_PYTHON
8
8
 
@@ -0,0 +1,24 @@
1
+ import base64
2
+
3
+ from IPython.display import HTML
4
+
5
+
6
+ def embed_video(path):
7
+ with open(path, "rb") as f:
8
+ mp4_data = base64.b64encode(f.read()).decode()
9
+ return HTML(
10
+ f'<video controls><source src="data:video/mp4;base64,{mp4_data}" '
11
+ 'type="video/mp4"></video>'
12
+ )
13
+
14
+
15
+ def embed_image(path):
16
+ with open(path, "rb") as f:
17
+ img_data = base64.b64encode(f.read()).decode()
18
+ return HTML(f'<img src="data:image/png;base64,{img_data}"/>')
19
+
20
+
21
+ def embed_html(path):
22
+ with open(path, "r") as f:
23
+ html_content = f.read()
24
+ return HTML(html_content)
@@ -1,8 +1,10 @@
1
1
  import os.path as op
2
2
 
3
3
  import numpy as np
4
- from dipy.io.stateful_tractogram import Space, StatefulTractogram
4
+ from dipy.io.stateful_tractogram import Origin, Space, StatefulTractogram
5
5
  from dipy.io.streamline import load_tractogram, save_tractogram
6
+ from nibabel.affines import voxel_sizes
7
+ from nibabel.orientations import aff2axcodes
6
8
 
7
9
  try:
8
10
  from trx.io import load as load_trx
@@ -17,8 +19,22 @@ from AFQ.utils.path import drop_extension, read_json
17
19
 
18
20
  class SegmentedSFT:
19
21
  def __init__(self, bundles, sidecar_info=None):
22
+ """
23
+ Initialize a SegmentedSFT object.
24
+
25
+ Parameters
26
+ ----------
27
+ bundles : dict
28
+ A dictionary where keys are bundle names and values are either
29
+ StatefulTractogram objects or dictionaries with keys "sl"
30
+ and "idx".
31
+ sidecar_info : dict, optional
32
+ Sidecar information to optionally attach.
33
+ """
34
+
20
35
  if sidecar_info is None:
21
36
  sidecar_info = {}
37
+ self.sidecar_info = sidecar_info
22
38
  self.bundle_names = []
23
39
  sls = []
24
40
  idxs = {}
@@ -43,7 +59,6 @@ class SegmentedSFT:
43
59
  else:
44
60
  self.this_tracking_idxs = None
45
61
 
46
- self.sidecar_info = sidecar_info
47
62
  self.sidecar_info["bundle_ids"] = {}
48
63
  dps = np.zeros(len(sls))
49
64
  for ii, bundle_name in enumerate(self.bundle_names):
@@ -59,6 +74,15 @@ class SegmentedSFT:
59
74
  )
60
75
  self.sidecar_info["tracking_idx"] = self.this_tracking_idxs
61
76
 
77
+ def get_lengths(self):
78
+ return self.sft._tractogram._streamlines._lengths
79
+
80
+ def to_rasmm(self):
81
+ self.sft.to_space(Space.RASMM)
82
+
83
+ def get_bundle_idxs(self, b_name):
84
+ return self.bundle_idxs[b_name]
85
+
62
86
  def get_bundle(self, b_name):
63
87
  return self.sft[self.bundle_idxs[b_name]]
64
88
 
@@ -68,8 +92,6 @@ class SegmentedSFT:
68
92
  @classmethod
69
93
  def fromfile(cls, trk_or_trx_file, reference="same", sidecar_file=None):
70
94
  if sidecar_file is None:
71
- # assume json sidecar has the same name as trk_file,
72
- # but with json suffix
73
95
  sidecar_file = f"{drop_extension(trk_or_trx_file)}.json"
74
96
  if not op.exists(sidecar_file):
75
97
  raise ValueError(
@@ -80,20 +102,11 @@ class SegmentedSFT:
80
102
  )
81
103
  sidecar_info = read_json(sidecar_file)
82
104
  if trk_or_trx_file.endswith(".trx"):
83
- trx = load_trx(trk_or_trx_file, reference)
84
- trx.streamlines._data = trx.streamlines._data.astype(np.float32)
85
- sft = trx.to_sft()
86
- if reference == "same":
87
- reference = sft
88
- bundles = {}
89
- for bundle in trx.groups:
90
- idx = trx.groups[bundle]
91
- bundles[bundle] = StatefulTractogram(
92
- sft.streamlines[idx], reference, Space.RASMM
93
- )
105
+ bundles = load_trx(trk_or_trx_file, reference)
106
+ bundles.streamlines._data = bundles.streamlines._data.astype(np.float32)
107
+ return SegmentedTRX(bundles, sidecar_info)
94
108
  else:
95
109
  sft = load_tractogram(trk_or_trx_file, reference, to_space=Space.RASMM)
96
-
97
110
  if reference == "same":
98
111
  reference = sft
99
112
  bundles = {}
@@ -105,8 +118,53 @@ class SegmentedSFT:
105
118
  )
106
119
  else:
107
120
  bundles["whole_brain"] = sft
121
+ return SegmentedSFT(bundles, sidecar_info)
122
+
108
123
 
109
- return cls(bundles, sidecar_info)
124
+ class SegmentedTRX(SegmentedSFT):
125
+ def __init__(self, trx, sidecar_info=None):
126
+ """
127
+ Initialize a SegmentedTRX object.
128
+
129
+ Parameters
130
+ ----------
131
+ trx : TrxFile
132
+ The TRX file to interact with.
133
+ sidecar_info : dict, optional
134
+ Sidecar information to optionally attach.
135
+ """
136
+ if sidecar_info is None:
137
+ sidecar_info = {}
138
+ self.sidecar_info = sidecar_info
139
+
140
+ # Loading from TRX, we do not calculate additional information,
141
+ # To avoid loading unnecessary streamlines into memory
142
+ self.bundle_names = list(trx.groups.keys())
143
+ self.sft = trx
144
+
145
+ # Mimic SFT attributes for compatibility
146
+ affine = np.array(self.sft.header["VOXEL_TO_RASMM"], dtype=np.float32)
147
+ dimensions = np.array(self.sft.header["DIMENSIONS"], dtype=np.uint16)
148
+ vox_sizes = np.array(voxel_sizes(affine), dtype=np.float32)
149
+ vox_order = "".join(aff2axcodes(affine))
150
+ space_attributes = (affine, dimensions, vox_sizes, vox_order)
151
+ self.sft.space_attributes = space_attributes
152
+ self.sft.space = Space.RASMM
153
+ self.sft.origin = Origin.NIFTI
154
+ self.sft.dtype_dict = self.sft.get_dtype_dict()
155
+
156
+ def get_lengths(self):
157
+ return self.sft.streamlines._lengths
158
+
159
+ def to_rasmm(self):
160
+ pass # always in RASMM
161
+
162
+ def get_bundle_idxs(self, b_name):
163
+ return self.sft.groups[b_name]
164
+
165
+ def get_bundle(self, b_name):
166
+ idx = self.sft.groups[b_name]
167
+ return StatefulTractogram(self.sft.streamlines[idx], self.sft, Space.RASMM)
110
168
 
111
169
 
112
170
  def split_streamline(streamlines, sl_to_split, split_idx):