pyAFQ 3.2__tar.gz → 3.4__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 (483) hide show
  1. {pyafq-3.2 → pyafq-3.4}/.codespellrc +1 -1
  2. {pyafq-3.2 → pyafq-3.4}/.github/workflows/docbuild.yml +1 -1
  3. {pyafq-3.2 → pyafq-3.4}/.github/workflows/docker_pyafq.yml +3 -0
  4. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_anisotropic_test.yml +1 -1
  5. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_basic_test.yml +1 -1
  6. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_reco80_test.yml +1 -1
  7. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_reco_test.yml +1 -1
  8. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_test.yml +1 -1
  9. {pyafq-3.2 → pyafq-3.4}/.gitignore +1 -3
  10. {pyafq-3.2 → pyafq-3.4}/AFQ/_fixes.py +104 -44
  11. {pyafq-3.2 → pyafq-3.4}/AFQ/api/bundle_dict.py +2 -6
  12. {pyafq-3.2 → pyafq-3.4}/AFQ/api/group.py +33 -12
  13. {pyafq-3.2 → pyafq-3.4}/AFQ/api/participant.py +29 -8
  14. {pyafq-3.2 → pyafq-3.4}/AFQ/api/utils.py +4 -9
  15. {pyafq-3.2 → pyafq-3.4}/AFQ/data/fetch.py +20 -1
  16. {pyafq-3.2 → pyafq-3.4}/AFQ/definitions/image.py +23 -0
  17. {pyafq-3.2 → pyafq-3.4}/AFQ/definitions/utils.py +3 -3
  18. {pyafq-3.2 → pyafq-3.4}/AFQ/models/asym_filtering.py +1 -1
  19. {pyafq-3.2 → pyafq-3.4}/AFQ/models/msmt.py +1 -1
  20. pyafq-3.4/AFQ/nn/babyseg.py +197 -0
  21. {pyafq-3.2 → pyafq-3.4}/AFQ/nn/brainchop.py +1 -1
  22. {pyafq-3.2 → pyafq-3.4}/AFQ/nn/multiaxial.py +1 -1
  23. pyafq-3.4/AFQ/nn/tests/test_nn.py +21 -0
  24. pyafq-3.4/AFQ/nn/utils.py +96 -0
  25. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/cleaning.py +54 -10
  26. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/criteria.py +27 -20
  27. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/recognize.py +15 -8
  28. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/test_recognition.py +39 -7
  29. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/test_utils.py +45 -0
  30. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/utils.py +8 -9
  31. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/data.py +52 -3
  32. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/segmentation.py +20 -21
  33. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/structural.py +29 -1
  34. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/tissue.py +42 -5
  35. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/tractography.py +1 -1
  36. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/viz.py +19 -32
  37. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_api.py +19 -33
  38. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_definitions.py +1 -1
  39. {pyafq-3.2 → pyafq-3.4}/AFQ/tractography/tractography.py +11 -7
  40. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/bin.py +269 -222
  41. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/conversion.py +1 -1
  42. pyafq-3.4/AFQ/utils/docs.py +24 -0
  43. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/docstring_parser.py +10 -6
  44. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/streamlines.py +75 -17
  45. pyafq-3.4/AFQ/utils/tests/test_bin.py +100 -0
  46. pyafq-3.4/AFQ/utils/tests/test_streamlines.py +185 -0
  47. pyafq-3.4/AFQ/utils/tests/test_volume.py +105 -0
  48. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/volume.py +78 -15
  49. {pyafq-3.2 → pyafq-3.4}/AFQ/version.py +3 -3
  50. {pyafq-3.2 → pyafq-3.4}/AFQ/viz/altair.py +4 -4
  51. {pyafq-3.2 → pyafq-3.4}/AFQ/viz/fury_backend.py +23 -12
  52. pyafq-3.4/AFQ/viz/plot.py +138 -0
  53. {pyafq-3.2 → pyafq-3.4}/AFQ/viz/plotly_backend.py +51 -37
  54. {pyafq-3.2 → pyafq-3.4}/AFQ/viz/utils.py +105 -83
  55. {pyafq-3.2 → pyafq-3.4}/CHANGES.rst +29 -0
  56. {pyafq-3.2 → pyafq-3.4}/PKG-INFO +18 -20
  57. pyafq-3.4/bin/pyAFQ +179 -0
  58. pyafq-3.4/bin/pyAFQ-bids +225 -0
  59. {pyafq-3.2 → pyafq-3.4}/docs/Makefile +12 -24
  60. {pyafq-3.2 → pyafq-3.4}/docs/source/conf.py +19 -29
  61. {pyafq-3.2 → pyafq-3.4}/docs/source/developing/definitions.rst +2 -3
  62. pyafq-3.4/docs/source/examples/howto_examples/acoustic_radiations.md +148 -0
  63. pyafq-3.4/docs/source/examples/howto_examples/afq_callosal.md +111 -0
  64. pyafq-3.4/docs/source/examples/howto_examples/afq_fwdti.md +178 -0
  65. pyafq-3.4/docs/source/examples/howto_examples/baby_afq.md +184 -0
  66. pyafq-3.2/examples/howto_examples/cerebellar_peduncles.py → pyafq-3.4/docs/source/examples/howto_examples/cerebellar_peduncles.md +45 -30
  67. pyafq-3.4/docs/source/examples/howto_examples/cloudknot_example.md +202 -0
  68. pyafq-3.2/examples/howto_examples/cloudknot_hcp_example.py → pyafq-3.4/docs/source/examples/howto_examples/cloudknot_hcp_example.md +109 -63
  69. pyafq-3.2/examples/howto_examples/README.rst → pyafq-3.4/docs/source/examples/howto_examples/index.rst +4 -1
  70. pyafq-3.4/docs/source/examples/howto_examples/optic_radiations.md +179 -0
  71. pyafq-3.4/docs/source/examples/howto_examples/optic_tract.md +194 -0
  72. pyafq-3.2/examples/howto_examples/plot_stages_of_tractometry.py → pyafq-3.4/docs/source/examples/howto_examples/plot_stages_of_tractometry.md +234 -152
  73. pyafq-3.4/docs/source/examples/howto_examples/plot_trx.md +91 -0
  74. pyafq-3.4/docs/source/examples/howto_examples/pyAFQ_with_GPU.md +78 -0
  75. pyafq-3.2/examples/howto_examples/pyafq_2.py → pyafq-3.4/docs/source/examples/howto_examples/pyafq_2.md +74 -55
  76. pyafq-3.4/docs/source/examples/howto_examples/recobundles.md +75 -0
  77. pyafq-3.4/docs/source/examples/howto_examples/use_subject_space_rois_from_freesurfer.md +167 -0
  78. pyafq-3.2/examples/howto_examples/vof_example.py → pyafq-3.4/docs/source/examples/howto_examples/vof_example.md +28 -7
  79. pyafq-3.2/examples/tutorial_examples/README.rst → pyafq-3.4/docs/source/examples/tutorial_examples/index.rst +4 -1
  80. pyafq-3.4/docs/source/examples/tutorial_examples/plot_001_group_afq_api.md +355 -0
  81. pyafq-3.4/docs/source/examples/tutorial_examples/plot_002_participant_afq_api.md +311 -0
  82. pyafq-3.4/docs/source/examples/tutorial_examples/plot_003_rerun.md +188 -0
  83. pyafq-3.4/docs/source/examples/tutorial_examples/plot_004_export.md +226 -0
  84. pyafq-3.4/docs/source/examples/tutorial_examples/plot_005_viz.md +486 -0
  85. pyafq-3.4/docs/source/examples/tutorial_examples/plot_006_bids_layout.md +330 -0
  86. pyafq-3.2/examples/tutorial_examples/plot_007_rois.py → pyafq-3.4/docs/source/examples/tutorial_examples/plot_007_rois.md +41 -12
  87. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/index.rst +1 -1
  88. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/cleaning_params.rst +2 -3
  89. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/converter.rst +2 -2
  90. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/data.rst +2 -2
  91. pyafq-3.4/docs/source/howto/docker.rst +19 -0
  92. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/image.rst +5 -7
  93. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/index.rst +1 -2
  94. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/installation_guide.rst +2 -2
  95. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/scalars.rst +1 -2
  96. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/segmentation_params.rst +2 -2
  97. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/singularity.rst +3 -3
  98. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/tractography_params.rst +2 -2
  99. {pyafq-3.2 → pyafq-3.4}/docs/source/index.rst +5 -5
  100. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/bundledict.rst +1 -1
  101. pyafq-3.4/docs/source/reference/cli.rst +142 -0
  102. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/fibertracts.rst +6 -6
  103. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/index.rst +1 -1
  104. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/kwargs.rst +1 -1
  105. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/mapping.rst +1 -1
  106. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/methods.rst +1 -1
  107. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/viz_backend.rst +8 -8
  108. {pyafq-3.2 → pyafq-3.4}/docs/source/references.bib +98 -0
  109. {pyafq-3.2 → pyafq-3.4}/docs/source/tutorials/index.rst +8 -11
  110. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/PKG-INFO +18 -20
  111. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/SOURCES.txt +32 -27
  112. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/requires.txt +18 -20
  113. pyafq-3.4/pyAFQ.egg-info/scm_file_list.json +451 -0
  114. pyafq-3.4/pyAFQ.egg-info/scm_version.json +8 -0
  115. {pyafq-3.2 → pyafq-3.4}/setup.cfg +13 -14
  116. pyafq-3.2/AFQ/nn/utils.py +0 -51
  117. pyafq-3.2/AFQ/utils/docs.py +0 -55
  118. pyafq-3.2/AFQ/utils/tests/test_streamlines.py +0 -74
  119. pyafq-3.2/AFQ/utils/tests/test_volume.py +0 -28
  120. pyafq-3.2/AFQ/viz/plot.py +0 -1649
  121. pyafq-3.2/bin/pyAFQ +0 -159
  122. pyafq-3.2/docs/source/_progressbars.py +0 -33
  123. pyafq-3.2/docs/source/howto/docker.rst +0 -15
  124. pyafq-3.2/docs/source/sphinxext/updatedocs.py +0 -38
  125. pyafq-3.2/examples/howto_examples/acoustic_radiations.py +0 -119
  126. pyafq-3.2/examples/howto_examples/add_custom_bundle.py +0 -235
  127. pyafq-3.2/examples/howto_examples/afq_callosal.py +0 -104
  128. pyafq-3.2/examples/howto_examples/afq_fwdti.py +0 -162
  129. pyafq-3.2/examples/howto_examples/baby_afq.py +0 -152
  130. pyafq-3.2/examples/howto_examples/cloudknot_example.py +0 -163
  131. pyafq-3.2/examples/howto_examples/optic_radiations.py +0 -155
  132. pyafq-3.2/examples/howto_examples/optic_tract.py +0 -176
  133. pyafq-3.2/examples/howto_examples/pyAFQ_with_GPU.py +0 -58
  134. pyafq-3.2/examples/howto_examples/recobundles.py +0 -59
  135. pyafq-3.2/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -147
  136. pyafq-3.2/examples/tutorial_examples/plot_001_group_afq_api.py +0 -308
  137. pyafq-3.2/examples/tutorial_examples/plot_002_participant_afq_api.py +0 -268
  138. pyafq-3.2/examples/tutorial_examples/plot_003_rerun.py +0 -160
  139. pyafq-3.2/examples/tutorial_examples/plot_004_export.py +0 -192
  140. pyafq-3.2/examples/tutorial_examples/plot_005_viz.py +0 -436
  141. pyafq-3.2/examples/tutorial_examples/plot_006_bids_layout.py +0 -297
  142. {pyafq-3.2 → pyafq-3.4}/.github/CITATION.cff +0 -0
  143. {pyafq-3.2 → pyafq-3.4}/.github/CONTRIBUTING.md +0 -0
  144. {pyafq-3.2 → pyafq-3.4}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  145. {pyafq-3.2 → pyafq-3.4}/.github/workflows/nightly_custom_test.yml +0 -0
  146. {pyafq-3.2 → pyafq-3.4}/.github/workflows/publish-to-test-pypi.yml +0 -0
  147. {pyafq-3.2 → pyafq-3.4}/.github/workflows/test.yml +0 -0
  148. {pyafq-3.2 → pyafq-3.4}/.mailmap +0 -0
  149. {pyafq-3.2 → pyafq-3.4}/.maintenance/update_changes.sh +0 -0
  150. {pyafq-3.2 → pyafq-3.4}/.maintenance/update_zenodo.py +0 -0
  151. {pyafq-3.2 → pyafq-3.4}/.pep8speaks.yml +0 -0
  152. {pyafq-3.2 → pyafq-3.4}/.pre-commit-config.yaml +0 -0
  153. {pyafq-3.2 → pyafq-3.4}/.zenodo.json +0 -0
  154. {pyafq-3.2 → pyafq-3.4}/AFQ/__init__.py +0 -0
  155. {pyafq-3.2 → pyafq-3.4}/AFQ/api/__init__.py +0 -0
  156. {pyafq-3.2 → pyafq-3.4}/AFQ/data/__init__.py +0 -0
  157. {pyafq-3.2 → pyafq-3.4}/AFQ/data/utils.py +0 -0
  158. {pyafq-3.2 → pyafq-3.4}/AFQ/definitions/__init__.py +0 -0
  159. {pyafq-3.2 → pyafq-3.4}/AFQ/definitions/mapping.py +0 -0
  160. {pyafq-3.2 → pyafq-3.4}/AFQ/models/QBallTP.py +0 -0
  161. {pyafq-3.2 → pyafq-3.4}/AFQ/models/__init__.py +0 -0
  162. {pyafq-3.2 → pyafq-3.4}/AFQ/models/csd.py +0 -0
  163. {pyafq-3.2 → pyafq-3.4}/AFQ/models/dki.py +0 -0
  164. {pyafq-3.2 → pyafq-3.4}/AFQ/models/dti.py +0 -0
  165. {pyafq-3.2 → pyafq-3.4}/AFQ/models/fwdti.py +0 -0
  166. {pyafq-3.2 → pyafq-3.4}/AFQ/models/wmgm_interface.py +0 -0
  167. {pyafq-3.2 → pyafq-3.4}/AFQ/nn/__init__.py +0 -0
  168. {pyafq-3.2 → pyafq-3.4}/AFQ/nn/synthseg.py +0 -0
  169. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/__init__.py +0 -0
  170. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/clustering.py +0 -0
  171. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/curvature.py +0 -0
  172. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/other_bundles.py +0 -0
  173. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/preprocess.py +0 -0
  174. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/roi.py +0 -0
  175. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/sparse_decisions.py +0 -0
  176. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/__init__.py +0 -0
  177. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/conftest.py +0 -0
  178. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  179. {pyafq-3.2 → pyafq-3.4}/AFQ/recognition/tests/test_rois.py +0 -0
  180. {pyafq-3.2 → pyafq-3.4}/AFQ/registration.py +0 -0
  181. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/__init__.py +0 -0
  182. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/decorators.py +0 -0
  183. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/mapping.py +0 -0
  184. {pyafq-3.2 → pyafq-3.4}/AFQ/tasks/utils.py +0 -0
  185. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/__init__.py +0 -0
  186. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  187. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  188. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  189. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  190. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  191. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  192. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  193. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  194. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  195. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  196. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  197. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  198. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  199. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  200. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  201. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  202. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  203. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  204. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  205. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  206. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  207. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  208. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  209. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  210. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  211. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  212. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  213. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  214. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  215. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  216. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  217. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  218. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  219. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  220. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  221. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  222. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  223. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  224. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  225. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  226. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  227. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  228. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  229. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  230. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  231. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  232. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  233. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  234. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  235. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  236. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  237. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  238. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  239. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  240. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  241. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  242. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  243. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  244. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  245. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  246. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  247. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  248. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  249. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  250. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  251. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  252. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  253. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  254. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  255. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  256. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  257. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  258. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  259. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  260. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  261. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  262. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  263. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  264. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  265. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  266. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  267. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  268. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  269. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  270. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  271. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  272. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  273. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  274. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  275. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  276. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  277. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  278. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  279. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  280. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  281. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  282. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  283. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  284. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  285. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  286. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  287. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  288. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  289. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  290. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  291. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  292. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  293. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  294. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  295. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  296. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  297. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  298. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  299. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  300. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  301. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  302. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  303. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  304. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  305. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  306. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  307. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  308. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  309. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  310. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  311. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  312. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  313. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  314. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  315. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  316. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  317. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  318. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  319. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  320. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  321. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  322. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  323. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  324. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  325. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  326. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  327. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  328. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  329. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  330. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  331. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  332. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  333. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  334. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  335. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  336. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  337. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  338. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  339. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  340. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  341. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  342. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  343. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  344. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  345. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  346. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  347. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  348. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  349. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  350. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  351. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  352. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  353. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  354. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  355. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  356. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  357. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  358. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  359. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  360. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  361. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  362. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  363. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  364. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  365. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  366. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  367. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  368. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  369. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  370. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  371. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  372. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  373. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  374. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  375. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  376. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  377. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  378. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  379. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  380. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  381. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  382. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  383. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  384. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_bundle_dict.py +0 -0
  385. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_csd.py +0 -0
  386. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_data.py +0 -0
  387. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_dki.py +0 -0
  388. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_dti.py +0 -0
  389. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_fixes.py +0 -0
  390. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_msmt.py +0 -0
  391. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_nn.py +0 -0
  392. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_registration.py +0 -0
  393. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_tractography.py +0 -0
  394. {pyafq-3.2 → pyafq-3.4}/AFQ/tests/test_viz.py +0 -0
  395. {pyafq-3.2 → pyafq-3.4}/AFQ/tractography/__init__.py +0 -0
  396. {pyafq-3.2 → pyafq-3.4}/AFQ/tractography/utils.py +0 -0
  397. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/__init__.py +0 -0
  398. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/models.py +0 -0
  399. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/path.py +0 -0
  400. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/stats.py +0 -0
  401. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/testing.py +0 -0
  402. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/tests/__init__.py +0 -0
  403. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/tests/test_conversions.py +0 -0
  404. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/tests/test_path.py +0 -0
  405. {pyafq-3.2 → pyafq-3.4}/AFQ/utils/tests/test_stats.py +0 -0
  406. {pyafq-3.2 → pyafq-3.4}/AFQ/viz/__init__.py +0 -0
  407. {pyafq-3.2 → pyafq-3.4}/CITATION +0 -0
  408. {pyafq-3.2 → pyafq-3.4}/LICENSE +0 -0
  409. {pyafq-3.2 → pyafq-3.4}/MANIFEST.in +0 -0
  410. {pyafq-3.2 → pyafq-3.4}/Makefile +0 -0
  411. {pyafq-3.2 → pyafq-3.4}/NOTICE.md +0 -0
  412. {pyafq-3.2 → pyafq-3.4}/README.md +0 -0
  413. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  414. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/CSVfile.png +0 -0
  415. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/FAbrain.png +0 -0
  416. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/ProfileViz.png +0 -0
  417. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/TP_viz.png +0 -0
  418. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/arcuaterois.png +0 -0
  419. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/beaware.png +0 -0
  420. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/custom.css +0 -0
  421. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/diffusion-anisotropic.gif +0 -0
  422. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/diffusion-isotropic.gif +0 -0
  423. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/down_left_arrow.png +0 -0
  424. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/down_right_arrow.png +0 -0
  425. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/dti_in_brain.png +0 -0
  426. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/dtiexplanation.jpg +0 -0
  427. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/eScience_Logo_HR.png +0 -0
  428. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/ecosystem.jpg +0 -0
  429. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/escience-logo.png +0 -0
  430. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/greencheck.png +0 -0
  431. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/inherintambiguity.png +0 -0
  432. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/logo.png +0 -0
  433. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/modelling.png +0 -0
  434. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/modeltotrack.png +0 -0
  435. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_001.gif +0 -0
  436. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_002.gif +0 -0
  437. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_003.gif +0 -0
  438. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_004.gif +0 -0
  439. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_005.gif +0 -0
  440. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_006.gif +0 -0
  441. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_010.gif +0 -0
  442. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_011.gif +0 -0
  443. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_012.gif +0 -0
  444. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tract_modeling2.png +0 -0
  445. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tract_profiling.png +0 -0
  446. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tract_recognition.png +0 -0
  447. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tract_tractography.png +0 -0
  448. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tractometry_pipeline.png +0 -0
  449. {pyafq-3.2 → pyafq-3.4}/docs/source/_static/tropic.png +0 -0
  450. {pyafq-3.2 → pyafq-3.4}/docs/source/_templates/footer.html +0 -0
  451. {pyafq-3.2 → pyafq-3.4}/docs/source/_templates/layout.html +0 -0
  452. {pyafq-3.2 → pyafq-3.4}/docs/source/bib.rst +0 -0
  453. {pyafq-3.2 → pyafq-3.4}/docs/source/developing/contributing.rst +0 -0
  454. {pyafq-3.2 → pyafq-3.4}/docs/source/developing/index.rst +0 -0
  455. {pyafq-3.2 → pyafq-3.4}/docs/source/developing/releasing.rst +0 -0
  456. {pyafq-3.2 → pyafq-3.4}/docs/source/developing/tasks.rst +0 -0
  457. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/bundle_orientation.rst +0 -0
  458. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/modeling.rst +0 -0
  459. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/profiling.rst +0 -0
  460. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/recognition.rst +0 -0
  461. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/tractography.rst +0 -0
  462. {pyafq-3.2 → pyafq-3.4}/docs/source/explanations/whats_new_3.rst +0 -0
  463. {pyafq-3.2 → pyafq-3.4}/docs/source/guides_index.rst +0 -0
  464. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/cite.rst +0 -0
  465. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/getting_help.rst +0 -0
  466. {pyafq-3.2 → pyafq-3.4}/docs/source/howto/rerun.rst +0 -0
  467. {pyafq-3.2 → pyafq-3.4}/docs/source/reference/tissue_properties.rst +0 -0
  468. {pyafq-3.2 → pyafq-3.4}/docs/source/sphinxext/kwargsdocs.py +0 -0
  469. {pyafq-3.2 → pyafq-3.4}/docs/source/sphinxext/methodsdocs.py +0 -0
  470. {pyafq-3.2 → pyafq-3.4}/docs/upload-gh-pages.sh +0 -0
  471. {pyafq-3.2 → pyafq-3.4}/gpu_docker/Dockerfile +0 -0
  472. {pyafq-3.2 → pyafq-3.4}/gpu_docker/docker-build.sh +0 -0
  473. {pyafq-3.2 → pyafq-3.4}/gpu_docker/docker-push.sh +0 -0
  474. {pyafq-3.2 → pyafq-3.4}/gpu_docker/pyafq_with_gpu_template.def +0 -0
  475. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/dependency_links.txt +0 -0
  476. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/not-zip-safe +0 -0
  477. {pyafq-3.2 → pyafq-3.4}/pyAFQ.egg-info/top_level.txt +0 -0
  478. {pyafq-3.2 → pyafq-3.4}/pyafq_docker/Dockerfile +0 -0
  479. {pyafq-3.2 → pyafq-3.4}/pyafq_docker/docker-build.sh +0 -0
  480. {pyafq-3.2 → pyafq-3.4}/pyafq_docker/docker-push.sh +0 -0
  481. {pyafq-3.2 → pyafq-3.4}/pyproject.toml +0 -0
  482. {pyafq-3.2 → pyafq-3.4}/setup.py +0 -0
  483. {pyafq-3.2 → pyafq-3.4}/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
@@ -44,7 +44,7 @@ jobs:
44
44
  - name: Build docs
45
45
  run: |
46
46
  cd docs
47
- make html
47
+ make html SPHINXOPTS="-T"
48
48
  - name: Upload docs
49
49
  uses: actions/upload-artifact@v4
50
50
  with:
@@ -54,3 +54,6 @@ jobs:
54
54
  - name: Push pyAFQ GPU docker image
55
55
  if: github.ref == 'refs/heads/master' || startsWith(github.event.ref, 'refs/tags')
56
56
  run: sh ./gpu_docker/docker-push.sh "nrdg" "11"
57
+
58
+ - name: Report pyAFQ image size
59
+ run: docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | tee -a $GITHUB_STEP_SUMMARY
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Install
28
28
  run: |
29
29
  python -m pip install --upgrade pip
30
- pip install .[dev,fury,afqbrowser,plot,nn]
30
+ pip install .[dev,fury,afqbrowser,nn]
31
31
  - name: Lint
32
32
  run: |
33
33
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Install
28
28
  run: |
29
29
  python -m pip install --upgrade pip
30
- pip install .[dev,fury,afqbrowser,plot,nn]
30
+ pip install .[dev,fury,afqbrowser,nn]
31
31
  - name: Lint
32
32
  run: |
33
33
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Install
28
28
  run: |
29
29
  python -m pip install --upgrade pip
30
- pip install .[dev,fury,afqbrowser,plot,nn]
30
+ pip install .[dev,fury,afqbrowser,nn]
31
31
  - name: Lint
32
32
  run: |
33
33
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Install
28
28
  run: |
29
29
  python -m pip install --upgrade pip
30
- pip install .[dev,fury,afqbrowser,plot,nn]
30
+ pip install .[dev,fury,afqbrowser,nn]
31
31
  - name: Lint
32
32
  run: |
33
33
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -27,7 +27,7 @@ jobs:
27
27
  - name: Install
28
28
  run: |
29
29
  python -m pip install --upgrade pip
30
- pip install .[dev,fury,afqbrowser,plot,nn]
30
+ pip install .[dev,fury,afqbrowser,nn]
31
31
  - name: Lint
32
32
  run: |
33
33
  flake8 --ignore N802,N806,W503 --select W504 `find . -name \*.py | grep -v setup.py | grep -v version.py | grep -v __init__.py | grep -v /docs/`
@@ -5,9 +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
- docs/source/reference/config.rst
11
8
  examples/**/*.nii.gz
12
9
  examples/**/*.trk
13
10
  examples/**/*.npy
@@ -17,5 +14,6 @@ dist
17
14
  .DS_Store
18
15
  **.sw?
19
16
  **Untitled.ipynb
17
+ docs/source/examples/**/*.ipynb
20
18
  pip-wheel-metadata
21
19
  pyAFQ.egg-info
@@ -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
 
@@ -271,17 +272,17 @@ def gaussian_weights(
271
272
  n_sls, n_nodes, _ = sls.shape
272
273
 
273
274
  def _weighting_failed():
274
- weights = np.ones((n_sls, n_nodes))
275
275
  logger.warning(
276
276
  (
277
- "Not enough streamlines for weight calculation, "
277
+ f"Not enough or too many streamlines (n_sls: {n_sls}) "
278
+ "for weight calculation, "
278
279
  "weighting everything evenly"
279
280
  )
280
281
  )
281
282
  if return_mahalanobis:
282
283
  return np.full((n_sls, n_nodes), np.nan)
283
284
  else:
284
- return weights / np.sum(weights, 0)
285
+ return np.full((n_sls, n_nodes), 1.0 / n_sls)
285
286
 
286
287
  if n_sls < 15: # Cov^-1 unstable under this amount
287
288
  return _weighting_failed()
@@ -318,15 +319,20 @@ def gaussian_weights(
318
319
 
319
320
  flat_coords = sls.reshape(-1, 3)
320
321
  flat_groups = working_groups.reshape(-1)
321
- unique_ids = np.unique(flat_groups)
322
+ flat_weights = weights.reshape(-1)
322
323
 
323
- for gid in unique_ids:
324
- mask = flat_groups == gid
325
- group_data = flat_coords[mask]
324
+ order = np.argsort(flat_groups, kind="stable")
325
+ sorted_groups = flat_groups[order]
326
+ sorted_coords = flat_coords[order]
327
+ _, starts = np.unique(sorted_groups, return_index=True)
328
+ ends = np.append(starts[1:], len(sorted_groups))
326
329
 
327
- if len(group_data) < 15:
330
+ for start, end in zip(starts, ends):
331
+ # small groups will have unstable covariance matrices
332
+ if end - start < 15:
328
333
  continue
329
334
 
335
+ group_data = sorted_coords[start:end]
330
336
  mu = stat(group_data, axis=0)
331
337
  diff = group_data - mu
332
338
 
@@ -339,31 +345,49 @@ def gaussian_weights(
339
345
  cov = eigenvectors @ np.diag(eigenvalues) @ eigenvectors.T
340
346
 
341
347
  if np.any(cov > 0):
342
- weights.ravel()[mask] = np.sqrt(
343
- np.einsum("ij,jk,ik->i", diff, pinvh(cov), diff)
344
- )
348
+ m = np.einsum("ij,jk,ik->i", diff, pinvh(cov), diff)
349
+ np.clip(m, 0, None, out=m)
350
+ flat_weights[order[start:end]] = np.sqrt(m)
345
351
 
346
352
  if return_mahalanobis:
347
353
  return weights
348
354
 
349
- with np.errstate(divide="ignore"):
355
+ with np.errstate(divide="ignore", invalid="ignore"):
350
356
  w_inv = 1.0 / weights
351
- w_inv[np.isinf(w_inv)] = 0
357
+ w_inv[~np.isfinite(w_inv)] = 0
358
+
359
+ denom = np.sum(w_inv, axis=0, dtype=np.float64)
360
+ w = np.divide(
361
+ w_inv,
362
+ denom,
363
+ out=np.zeros_like(w_inv, dtype=np.float64),
364
+ where=denom != 0,
365
+ dtype=np.float64,
366
+ )
352
367
 
353
- denom = np.sum(w_inv, axis=0)
354
- w = np.divide(w_inv, denom, out=np.zeros_like(w_inv), where=denom != 0)
355
- col_sums = w.sum(axis=0)
356
- if np.max(np.abs(col_sums - 1)) > 1e-3:
368
+ col_sums = w.sum(axis=0, dtype=np.float64)
369
+ if not np.all(np.abs(col_sums - 1) <= 1e-3):
357
370
  return _weighting_failed()
358
371
  else:
359
- final_sums = w.sum(axis=0, keepdims=True)
360
- np.divide(w, final_sums, out=w, where=final_sums != 0)
361
- return w
372
+ final_sums = w.sum(axis=0, keepdims=True, dtype=np.float64)
373
+ np.divide(w, final_sums, out=w, where=final_sums != 0, dtype=np.float64)
374
+
375
+ weight_sum = np.sum(w, axis=0, dtype=np.float64)
376
+ if not np.allclose(weight_sum, np.ones(n_nodes)):
377
+ bad = ~np.isclose(weight_sum, 1.0, rtol=1e-5, atol=1e-8)
378
+ logger.warning(f"weights not normalized: {w.shape}, {w.dtype}")
379
+ logger.warning(f"n_sls: {n_sls}")
380
+ logger.warning(f"offending nodes: {np.where(bad)[0]}")
381
+ logger.warning(f"their sums: {weight_sum[bad]}")
382
+ logger.warning(f"any nan: {np.isnan(w).any()}")
383
+ del w, w_inv
384
+ return _weighting_failed()
385
+ return w
362
386
 
363
387
 
364
- def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
388
+ def make_mp4(show_m, out_path, n_frames=720, az_ang=-0.5, fps=30, crf=35, verbose=True):
365
389
  """
366
- Make a video from a Fury Show Manager.
390
+ Make an MP4 video from a Fury Show Manager with auto-cropping.
367
391
 
368
392
  Parameters
369
393
  ----------
@@ -371,33 +395,48 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
371
395
  The Fury Show Manager to use for rendering.
372
396
 
373
397
  out_path : str
374
- The name of the output file.
398
+ The name of the output file
375
399
 
376
400
  n_frames : int
377
401
  The number of frames to render.
378
- Default: 36
402
+ Default: 720
379
403
 
380
404
  az_ang : float
381
405
  The angle to rotate the camera around the
382
406
  z-axis for each frame, in degrees.
383
- Default: -10
407
+ Default: -0.5
408
+
409
+ fps : float
410
+ The frames per second for the output video.
411
+ Default: 30
384
412
 
385
- duration : int
386
- The duration of each frame in the output GIF, in milliseconds.
387
- Default: 150
413
+ crf : int
414
+ The Constant Rate Factor for the output video, which controls the
415
+ quality and file size. Lower values result in
416
+ higher quality and larger file sizes.
417
+ Default: 35 (very low quality, small file size)
418
+
419
+ verbose : bool
420
+ Whether to show a progress bar while generating the video.
421
+ Default: True
388
422
  """
423
+ if not out_path.lower().endswith(".mp4"):
424
+ out_path += ".mp4"
425
+
389
426
  video = []
390
427
 
391
428
  show_m.render()
392
429
  show_m.window.draw()
393
430
 
394
431
  with tempfile.TemporaryDirectory() as tmp_dir:
395
- for ii in tqdm(range(n_frames), desc="Generating GIF", leave=False):
432
+ for ii in tqdm(
433
+ range(n_frames), desc="Generating MP4", leave=False, disable=not verbose
434
+ ):
396
435
  frame_fname = f"{tmp_dir}/{ii}.png"
397
436
  show_m.screens[0].controller.rotate((radians(az_ang), 0), None)
398
437
  show_m.render()
399
438
  show_m.window.draw()
400
- show_m.snapshot(frame_fname)
439
+ show_m.snapshot(fname=frame_fname)
401
440
  video.append(Image.open(frame_fname).convert("RGB"))
402
441
 
403
442
  all_left, all_upper = float("inf"), float("inf")
@@ -406,7 +445,6 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
406
445
  for img in video:
407
446
  arr = np.array(img)
408
447
  bg_color = arr[0, 0]
409
-
410
448
  mask = np.any(arr != bg_color, axis=-1)
411
449
 
412
450
  if np.any(mask):
@@ -421,20 +459,42 @@ def make_gif(show_m, out_path, n_frames=36, az_ang=-10, duration=150):
421
459
  all_lower = max(all_lower, ymax)
422
460
 
423
461
  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
- )
462
+
463
+ def align_down(x, multiple=16):
464
+ return (x // multiple) * multiple
465
+
466
+ def align_up(x, multiple=16):
467
+ return ((x + multiple - 1) // multiple) * multiple
468
+
469
+ left = align_up(max(0, all_left), 16)
470
+ upper = align_up(max(0, all_upper), 16)
471
+ right = align_down(min(video[0].width, all_right), 16)
472
+ lower = align_down(min(video[0].height, all_lower), 16)
473
+
474
+ crop_box = (left, upper, right, lower)
430
475
  cropped_video = [img.crop(crop_box) for img in video]
431
476
  else:
432
477
  cropped_video = video
433
478
 
434
- cropped_video[0].save(
479
+ width, height = cropped_video[0].size
480
+ with imageio.get_writer(
435
481
  out_path,
436
- save_all=True,
437
- append_images=cropped_video[1:],
438
- duration=duration,
439
- loop=1,
440
- )
482
+ fps=fps,
483
+ format="ffmpeg",
484
+ codec="libx264",
485
+ pixelformat="yuv420p",
486
+ output_params=[
487
+ "-crf",
488
+ f"{str(int(crf))}",
489
+ "-preset",
490
+ "veryslow",
491
+ "-movflags",
492
+ "+faststart",
493
+ ],
494
+ ) as writer:
495
+ for img in cropped_video:
496
+ if img.size != (width, height):
497
+ img = img.crop((0, 0, width, height))
498
+
499
+ frame_arr = np.array(img)
500
+ 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",
@@ -916,7 +916,6 @@ def baby_bd():
916
916
  "start": templates["pARC_L_start"],
917
917
  "end": templates["VOF_box_small_L"],
918
918
  "primary_axis": "I/S",
919
- "primary_axis_percentage": 40,
920
919
  "cross_midline": False,
921
920
  "mahal": {"distance_threshold": 4},
922
921
  },
@@ -926,7 +925,6 @@ def baby_bd():
926
925
  "start": templates["pARC_R_start"],
927
926
  "end": templates["VOF_box_small_R"],
928
927
  "primary_axis": "I/S",
929
- "primary_axis_percentage": 40,
930
928
  "cross_midline": False,
931
929
  "mahal": {"distance_threshold": 4},
932
930
  },
@@ -934,7 +932,6 @@ def baby_bd():
934
932
  "start": templates["VOF_L_start"],
935
933
  "end": templates["VOF_box_small_L"],
936
934
  "primary_axis": "I/S",
937
- "primary_axis_percentage": 40,
938
935
  "cross_midline": False,
939
936
  "mahal": {"distance_threshold": 4},
940
937
  },
@@ -942,7 +939,6 @@ def baby_bd():
942
939
  "start": templates["VOF_R_start"],
943
940
  "end": templates["VOF_box_small_R"],
944
941
  "primary_axis": "I/S",
945
- "primary_axis_percentage": 40,
946
942
  "cross_midline": False,
947
943
  "mahal": {"distance_threshold": 4},
948
944
  },
@@ -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:
@@ -690,7 +690,14 @@ class GroupAFQ(object):
690
690
  for inputs in calcdata.calcs[idx].inputs:
691
691
  self.export(inputs)
692
692
 
693
- def export_all(self, viz=True, afqbrowser=True, xforms=True, indiv=True):
693
+ def export_all(
694
+ self,
695
+ viz=True,
696
+ afqbrowser=True,
697
+ xforms=True,
698
+ indiv=True,
699
+ delete_full_tractogram=False,
700
+ ):
694
701
  """Exports all the possible outputs
695
702
 
696
703
  Parameters
@@ -714,6 +721,14 @@ class GroupAFQ(object):
714
721
  the AFQ segmentation algorithm, individual ROIs are also
715
722
  output.
716
723
  Default: True
724
+ delete_full_tractogram : bool
725
+ Whether to delete the full, unsegmented tractogram (and its
726
+ associated json) after all other outputs have been generated.
727
+ This can be useful for saving disk space, as the full
728
+ tractogram is typically over 90 percent of the total output size.
729
+ Only the full tractogram and its json are deleted; all other
730
+ outputs are left in place.
731
+ Default: False
717
732
  """
718
733
  start_time = time()
719
734
 
@@ -722,8 +737,19 @@ class GroupAFQ(object):
722
737
  self.combine_profiles()
723
738
  if afqbrowser:
724
739
  self.assemble_AFQ_browser()
740
+ if delete_full_tractogram:
741
+ self.delete_full_tractogram()
725
742
  self.logger.info(f"Time taken for export all: {str(time() - start_time)}")
726
743
 
744
+ def delete_full_tractogram(self):
745
+ """
746
+ Delete the full, unsegmented tractogram (and its associated json)
747
+ for every subject and session. Only the full tractogram and its
748
+ json are deleted; all other outputs are left in place.
749
+ """
750
+ for pAFQ in self.pAFQ_list:
751
+ pAFQ.delete_full_tractogram()
752
+
727
753
  def cmd_outputs(
728
754
  self, cmd="rm", dependent_on=None, up_to=None, exceptions=None, suffix=""
729
755
  ):
@@ -903,11 +929,6 @@ class GroupAFQ(object):
903
929
  )
904
930
  )
905
931
  figure.write_image(this_fname)
906
-
907
- # temporary fix for memory leak
908
- import plotly.io as pio
909
-
910
- pio.kaleido.scope._shutdown_kaleido()
911
932
  else:
912
933
  from fury import window
913
934
 
@@ -917,7 +938,7 @@ class GroupAFQ(object):
917
938
  scene=figure, window_type="offscreen", size=(600, 600)
918
939
  )
919
940
  scene_rotate_forward(show_m, figure)
920
- show_m.snapshot(this_fname)
941
+ show_m.snapshot(fname=this_fname)
921
942
 
922
943
  def _save_file(curr_img, curr_file_num):
923
944
  save_path = op.abspath(
@@ -1427,9 +1448,9 @@ def combine_list_of_profiles(profile_fnames):
1427
1448
  dfs = []
1428
1449
  for fname in profile_fnames:
1429
1450
  profiles = pd.read_csv(fname)
1430
- profiles["subjectID"] = fname.split("sub-")[1].split("/")[0]
1451
+ profiles["subjectID"] = fname.split("sub-")[1].split("/")[0].split("_")[0]
1431
1452
  if "ses-" in fname:
1432
- session_name = fname.split("ses-")[1].split("/")[0]
1453
+ session_name = fname.split("ses-")[1].split("/")[0].split("_")[0]
1433
1454
  else:
1434
1455
  session_name = "unknown"
1435
1456
  profiles["sessionID"] = session_name
@@ -1,5 +1,6 @@
1
1
  import logging
2
2
  import math
3
+ import os
3
4
  import os.path as op
4
5
  import tempfile
5
6
  from math import radians
@@ -8,7 +9,7 @@ from time import time
8
9
  import nibabel as nib
9
10
  from dipy.align import resample
10
11
  from PIL import Image, ImageDraw, ImageFont
11
- from tqdm import tqdm
12
+ from tqdm.auto import tqdm
12
13
 
13
14
  import AFQ.utils.streamlines as aus
14
15
  from AFQ.api.utils import (
@@ -30,7 +31,7 @@ from AFQ.tasks.tractography import get_tractography_plan
30
31
  from AFQ.tasks.utils import get_base_fname
31
32
  from AFQ.tasks.viz import get_viz_plan
32
33
  from AFQ.utils.bin import pyafq_str_to_val
33
- from AFQ.utils.path import apply_cmd_to_afq_derivs
34
+ from AFQ.utils.path import apply_cmd_to_afq_derivs, drop_extension
34
35
  from AFQ.viz.utils import BEST_BUNDLE_ORIENTATIONS, get_eye, trim
35
36
 
36
37
  __all__ = ["ParticipantAFQ"]
@@ -240,7 +241,9 @@ class ParticipantAFQ(object):
240
241
  for inputs in calcdata.calcs[idx].inputs:
241
242
  self.export(inputs)
242
243
 
243
- def export_all(self, viz=True, xforms=True, indiv=True):
244
+ def export_all(
245
+ self, viz=True, xforms=True, indiv=True, delete_full_tractogram=False
246
+ ):
244
247
  f""" Exports all the possible outputs
245
248
  {valid_exports_string}
246
249
 
@@ -262,11 +265,33 @@ class ParticipantAFQ(object):
262
265
  the AFQ segmentation algorithm, individual ROIs are also
263
266
  output.
264
267
  Default: True
268
+ delete_full_tractogram : bool
269
+ Whether to delete the full, unsegmented tractogram (and its
270
+ associated json) after all other outputs have been generated.
271
+ This can be useful for saving disk space, as the full
272
+ tractogram is typically over 90 percent of the total output size.
273
+ Only the full tractogram and its json are deleted;
274
+ all other outputs are left in place.
275
+ Default: False
265
276
  """
266
277
  start_time = time()
267
278
  export_all_helper(self, xforms, indiv, viz)
279
+ if delete_full_tractogram:
280
+ self.delete_full_tractogram()
268
281
  self.logger.info(f"Time taken for export all: {time() - start_time}")
269
282
 
283
+ def delete_full_tractogram(self):
284
+ """
285
+ Delete the full, unsegmented tractogram (and its associated json).
286
+ Only the full tractogram and its json are deleted; all other
287
+ outputs are left in place.
288
+ """
289
+ tractogram_file = self.export("streamlines")
290
+ for fname in (tractogram_file, drop_extension(tractogram_file) + ".json"):
291
+ if op.exists(fname):
292
+ os.remove(fname)
293
+ self.logger.info(f"Deleted {fname}")
294
+
270
295
  def participant_montage(self, images_per_row=3, anatomy=True, bundle_names=None):
271
296
  """
272
297
  Generate montage of all bundles for a given subject.
@@ -344,10 +369,6 @@ class ParticipantAFQ(object):
344
369
  showlegend=False,
345
370
  )
346
371
  figure.write_image(this_fname, scale=4)
347
- # temporary fix for memory leak
348
- import plotly.io as pio
349
-
350
- pio.kaleido.scope._shutdown_kaleido()
351
372
  else:
352
373
  from fury import window
353
374
 
@@ -363,7 +384,7 @@ class ParticipantAFQ(object):
363
384
  pass
364
385
  show_m.render()
365
386
  show_m.window.draw()
366
- show_m.snapshot(this_fname)
387
+ show_m.snapshot(fname=this_fname)
367
388
 
368
389
  def _save_file(curr_img):
369
390
  save_path = op.abspath(
@@ -7,7 +7,6 @@ from dipy.io.stateful_tractogram import set_sft_logger_level
7
7
  from pcollections._lazy import LazyError
8
8
 
9
9
  from AFQ.utils.docstring_parser import parse_numpy_docstring
10
- from AFQ.viz.utils import viz_import_msg_error
11
10
 
12
11
  __all__ = ["methods_descriptors", "kwargs_descriptors", "AFQclass_doc"]
13
12
 
@@ -135,6 +134,9 @@ def check_attribute(attr_name):
135
134
  if attr_name[:-5] in task_modules:
136
135
  return None
137
136
 
137
+ if attr_name in ["tracking_params", "segmentation_params"]:
138
+ return "segmentation_imap"
139
+
138
140
  if attr_name in methods_sections:
139
141
  return f"{methods_sections[attr_name]}_imap"
140
142
 
@@ -176,14 +178,7 @@ def export_all_helper(api_afq_object, xforms, indiv, viz):
176
178
  api_afq_object.export("profiles")
177
179
 
178
180
  if viz:
179
- try:
180
- import IPython # noqa F401
181
- import pingouin # noqa F401
182
- import seaborn # noqa F401
183
- except (ImportError, ModuleNotFoundError):
184
- api_afq_object.logger.warning(viz_import_msg_error("plot"))
185
- else:
186
- api_afq_object.export("tract_profile_plots")
181
+ api_afq_object.export("tract_profile_plots")
187
182
  api_afq_object.export("all_bundles_figure")
188
183
  api_afq_object.export("indiv_bundles_figures")
189
184
 
@@ -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
@@ -55,6 +55,7 @@ __all__ = [
55
55
  "fetch_brainchop_models",
56
56
  "fetch_multiaxial_models",
57
57
  "fetch_synthseg_models",
58
+ "fetch_babyseg_models",
58
59
  "fetch_templates",
59
60
  "read_templates",
60
61
  "fetch_stanford_hardi_tractography",
@@ -263,6 +264,24 @@ fetch_synthseg_models = _make_reusable_fetcher(
263
264
  doc="Download ONNX SynthSeg models",
264
265
  )
265
266
 
267
+ babyseg_remote_fnames = ["67035599"]
268
+
269
+ babyseg_fnames = ["babyseg.onnx"]
270
+
271
+ babyseg_md5_hashes = [
272
+ "5f64b439dcfff36045448e0cc562f6e7",
273
+ ]
274
+
275
+ fetch_babyseg_models = _make_reusable_fetcher(
276
+ "fetch_babyseg_models",
277
+ op.join(afq_home, "babyseg_onnx"),
278
+ baseurl,
279
+ babyseg_remote_fnames,
280
+ babyseg_fnames,
281
+ md5_list=babyseg_md5_hashes,
282
+ doc="Download ONNX BabySeg models",
283
+ )
284
+
266
285
  multiaxial_fnames = [
267
286
  "sagittal_model.onnx",
268
287
  "axial_model.onnx",