pyAFQ 3.3__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 (464) hide show
  1. {pyafq-3.3 → pyafq-3.4}/.github/workflows/docbuild.yml +1 -1
  2. {pyafq-3.3 → pyafq-3.4}/.github/workflows/docker_pyafq.yml +3 -0
  3. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_anisotropic_test.yml +1 -1
  4. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_basic_test.yml +1 -1
  5. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_reco80_test.yml +1 -1
  6. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_reco_test.yml +1 -1
  7. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_test.yml +1 -1
  8. {pyafq-3.3 → pyafq-3.4}/.gitignore +1 -1
  9. {pyafq-3.3 → pyafq-3.4}/AFQ/_fixes.py +44 -21
  10. {pyafq-3.3 → pyafq-3.4}/AFQ/api/bundle_dict.py +0 -4
  11. {pyafq-3.3 → pyafq-3.4}/AFQ/api/group.py +30 -9
  12. {pyafq-3.3 → pyafq-3.4}/AFQ/api/participant.py +28 -7
  13. {pyafq-3.3 → pyafq-3.4}/AFQ/api/utils.py +4 -9
  14. {pyafq-3.3 → pyafq-3.4}/AFQ/data/fetch.py +19 -0
  15. {pyafq-3.3 → pyafq-3.4}/AFQ/definitions/image.py +23 -0
  16. {pyafq-3.3 → pyafq-3.4}/AFQ/definitions/utils.py +3 -3
  17. pyafq-3.4/AFQ/nn/babyseg.py +197 -0
  18. {pyafq-3.3 → pyafq-3.4}/AFQ/nn/brainchop.py +1 -1
  19. pyafq-3.4/AFQ/nn/tests/test_nn.py +21 -0
  20. pyafq-3.4/AFQ/nn/utils.py +96 -0
  21. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/cleaning.py +54 -10
  22. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/criteria.py +26 -19
  23. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/recognize.py +15 -8
  24. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/test_recognition.py +39 -7
  25. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/test_utils.py +45 -0
  26. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/utils.py +1 -8
  27. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/data.py +52 -3
  28. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/segmentation.py +10 -2
  29. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/structural.py +29 -1
  30. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/tissue.py +42 -5
  31. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/viz.py +8 -21
  32. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_api.py +19 -33
  33. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_definitions.py +1 -1
  34. {pyafq-3.3 → pyafq-3.4}/AFQ/tractography/tractography.py +7 -6
  35. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/bin.py +269 -222
  36. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/docstring_parser.py +10 -6
  37. pyafq-3.4/AFQ/utils/tests/test_bin.py +100 -0
  38. pyafq-3.4/AFQ/utils/tests/test_volume.py +105 -0
  39. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/volume.py +78 -15
  40. {pyafq-3.3 → pyafq-3.4}/AFQ/version.py +3 -3
  41. {pyafq-3.3 → pyafq-3.4}/AFQ/viz/altair.py +4 -4
  42. pyafq-3.4/AFQ/viz/plot.py +138 -0
  43. {pyafq-3.3 → pyafq-3.4}/AFQ/viz/plotly_backend.py +10 -20
  44. {pyafq-3.3 → pyafq-3.4}/AFQ/viz/utils.py +82 -39
  45. {pyafq-3.3 → pyafq-3.4}/CHANGES.rst +23 -0
  46. {pyafq-3.3 → pyafq-3.4}/PKG-INFO +11 -13
  47. pyafq-3.4/bin/pyAFQ +179 -0
  48. pyafq-3.4/bin/pyAFQ-bids +225 -0
  49. {pyafq-3.3 → pyafq-3.4}/docs/Makefile +7 -1
  50. {pyafq-3.3 → pyafq-3.4}/docs/source/conf.py +0 -1
  51. {pyafq-3.3 → pyafq-3.4}/docs/source/developing/definitions.rst +2 -3
  52. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/acoustic_radiations.md +22 -7
  53. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/afq_callosal.md +12 -20
  54. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/afq_fwdti.md +5 -1
  55. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/baby_afq.md +32 -16
  56. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/cerebellar_peduncles.md +5 -1
  57. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/cloudknot_example.md +5 -1
  58. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/cloudknot_hcp_example.md +5 -1
  59. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/optic_radiations.md +5 -1
  60. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/optic_tract.md +7 -3
  61. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/plot_stages_of_tractometry.md +4 -0
  62. pyafq-3.4/docs/source/examples/howto_examples/plot_trx.md +91 -0
  63. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/pyAFQ_with_GPU.md +6 -2
  64. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/pyafq_2.md +6 -2
  65. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/recobundles.md +5 -1
  66. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/use_subject_space_rois_from_freesurfer.md +5 -1
  67. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/vof_example.md +5 -1
  68. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_001_group_afq_api.md +7 -1
  69. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_002_participant_afq_api.md +4 -0
  70. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_003_rerun.md +5 -1
  71. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_004_export.md +4 -0
  72. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_005_viz.md +5 -1
  73. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_006_bids_layout.md +5 -1
  74. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/plot_007_rois.md +4 -0
  75. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/cleaning_params.rst +2 -3
  76. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/converter.rst +1 -1
  77. pyafq-3.4/docs/source/howto/docker.rst +19 -0
  78. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/image.rst +5 -7
  79. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/index.rst +0 -1
  80. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/installation_guide.rst +2 -2
  81. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/scalars.rst +1 -2
  82. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/segmentation_params.rst +2 -2
  83. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/singularity.rst +3 -3
  84. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/tractography_params.rst +2 -2
  85. pyafq-3.4/docs/source/reference/cli.rst +142 -0
  86. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/index.rst +1 -1
  87. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/mapping.rst +1 -1
  88. {pyafq-3.3 → pyafq-3.4}/docs/source/references.bib +98 -0
  89. {pyafq-3.3 → pyafq-3.4}/docs/source/tutorials/index.rst +6 -7
  90. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/PKG-INFO +11 -13
  91. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/SOURCES.txt +8 -2
  92. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/requires.txt +11 -12
  93. pyafq-3.4/pyAFQ.egg-info/scm_file_list.json +451 -0
  94. pyafq-3.4/pyAFQ.egg-info/scm_version.json +8 -0
  95. {pyafq-3.3 → pyafq-3.4}/setup.cfg +8 -9
  96. pyafq-3.3/AFQ/nn/utils.py +0 -51
  97. pyafq-3.3/AFQ/utils/tests/test_volume.py +0 -28
  98. pyafq-3.3/AFQ/viz/plot.py +0 -1649
  99. pyafq-3.3/bin/pyAFQ +0 -159
  100. pyafq-3.3/docs/source/examples/howto_examples/add_custom_bundle.md +0 -252
  101. pyafq-3.3/docs/source/howto/docker.rst +0 -15
  102. pyafq-3.3/docs/source/sphinxext/updatedocs.py +0 -38
  103. {pyafq-3.3 → pyafq-3.4}/.codespellrc +0 -0
  104. {pyafq-3.3 → pyafq-3.4}/.github/CITATION.cff +0 -0
  105. {pyafq-3.3 → pyafq-3.4}/.github/CONTRIBUTING.md +0 -0
  106. {pyafq-3.3 → pyafq-3.4}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  107. {pyafq-3.3 → pyafq-3.4}/.github/workflows/nightly_custom_test.yml +0 -0
  108. {pyafq-3.3 → pyafq-3.4}/.github/workflows/publish-to-test-pypi.yml +0 -0
  109. {pyafq-3.3 → pyafq-3.4}/.github/workflows/test.yml +0 -0
  110. {pyafq-3.3 → pyafq-3.4}/.mailmap +0 -0
  111. {pyafq-3.3 → pyafq-3.4}/.maintenance/update_changes.sh +0 -0
  112. {pyafq-3.3 → pyafq-3.4}/.maintenance/update_zenodo.py +0 -0
  113. {pyafq-3.3 → pyafq-3.4}/.pep8speaks.yml +0 -0
  114. {pyafq-3.3 → pyafq-3.4}/.pre-commit-config.yaml +0 -0
  115. {pyafq-3.3 → pyafq-3.4}/.zenodo.json +0 -0
  116. {pyafq-3.3 → pyafq-3.4}/AFQ/__init__.py +0 -0
  117. {pyafq-3.3 → pyafq-3.4}/AFQ/api/__init__.py +0 -0
  118. {pyafq-3.3 → pyafq-3.4}/AFQ/data/__init__.py +0 -0
  119. {pyafq-3.3 → pyafq-3.4}/AFQ/data/utils.py +0 -0
  120. {pyafq-3.3 → pyafq-3.4}/AFQ/definitions/__init__.py +0 -0
  121. {pyafq-3.3 → pyafq-3.4}/AFQ/definitions/mapping.py +0 -0
  122. {pyafq-3.3 → pyafq-3.4}/AFQ/models/QBallTP.py +0 -0
  123. {pyafq-3.3 → pyafq-3.4}/AFQ/models/__init__.py +0 -0
  124. {pyafq-3.3 → pyafq-3.4}/AFQ/models/asym_filtering.py +0 -0
  125. {pyafq-3.3 → pyafq-3.4}/AFQ/models/csd.py +0 -0
  126. {pyafq-3.3 → pyafq-3.4}/AFQ/models/dki.py +0 -0
  127. {pyafq-3.3 → pyafq-3.4}/AFQ/models/dti.py +0 -0
  128. {pyafq-3.3 → pyafq-3.4}/AFQ/models/fwdti.py +0 -0
  129. {pyafq-3.3 → pyafq-3.4}/AFQ/models/msmt.py +0 -0
  130. {pyafq-3.3 → pyafq-3.4}/AFQ/models/wmgm_interface.py +0 -0
  131. {pyafq-3.3 → pyafq-3.4}/AFQ/nn/__init__.py +0 -0
  132. {pyafq-3.3 → pyafq-3.4}/AFQ/nn/multiaxial.py +0 -0
  133. {pyafq-3.3 → pyafq-3.4}/AFQ/nn/synthseg.py +0 -0
  134. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/__init__.py +0 -0
  135. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/clustering.py +0 -0
  136. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/curvature.py +0 -0
  137. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/other_bundles.py +0 -0
  138. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/preprocess.py +0 -0
  139. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/roi.py +0 -0
  140. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/sparse_decisions.py +0 -0
  141. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/__init__.py +0 -0
  142. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/conftest.py +0 -0
  143. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  144. {pyafq-3.3 → pyafq-3.4}/AFQ/recognition/tests/test_rois.py +0 -0
  145. {pyafq-3.3 → pyafq-3.4}/AFQ/registration.py +0 -0
  146. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/__init__.py +0 -0
  147. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/decorators.py +0 -0
  148. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/mapping.py +0 -0
  149. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/tractography.py +0 -0
  150. {pyafq-3.3 → pyafq-3.4}/AFQ/tasks/utils.py +0 -0
  151. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/__init__.py +0 -0
  152. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  153. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  154. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  155. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  156. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  157. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  158. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  159. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  160. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  161. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  162. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  163. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  164. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  165. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  166. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  167. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  168. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  169. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  170. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  171. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  172. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  173. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  174. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  175. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  176. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  177. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  178. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  179. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  180. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  181. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  182. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  183. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  184. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  185. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  186. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  187. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  188. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  189. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  190. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  191. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  192. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  193. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  194. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  195. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  196. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  197. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  198. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  199. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  200. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  201. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  202. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  203. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  204. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  205. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  206. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  207. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  208. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  209. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  210. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  211. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  212. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  213. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  214. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  215. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  216. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  217. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  218. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  219. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  220. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  221. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  222. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  223. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  224. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  225. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  226. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  227. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  228. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  229. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  230. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  231. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  232. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  233. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  234. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  235. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  236. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  237. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  238. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  239. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  240. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  241. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  242. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  243. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  244. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  245. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  246. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  247. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  248. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  249. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  250. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  251. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  252. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  253. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  254. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  255. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  256. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  257. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  258. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  259. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  260. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  261. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  262. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  263. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  264. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  265. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  266. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  267. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  268. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  269. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  270. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  271. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  272. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  273. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  274. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  275. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  276. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  277. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  278. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  279. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  280. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  281. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  282. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  283. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  284. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  285. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  286. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  287. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  288. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  289. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  290. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  291. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  292. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  293. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  294. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  295. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  296. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  297. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  298. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  299. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  300. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  301. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  302. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  303. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  304. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  305. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  306. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  307. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  308. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  309. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  310. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  311. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  312. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  313. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  314. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  315. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  316. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  317. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  318. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  319. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  320. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  321. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  322. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  323. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  324. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  325. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  326. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  327. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  328. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  329. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  330. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  331. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  332. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  333. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  334. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  335. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  336. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  337. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  338. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  339. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  340. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  341. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  342. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  343. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  344. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  345. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  346. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  347. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  348. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  349. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  350. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_bundle_dict.py +0 -0
  351. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_csd.py +0 -0
  352. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_data.py +0 -0
  353. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_dki.py +0 -0
  354. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_dti.py +0 -0
  355. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_fixes.py +0 -0
  356. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_msmt.py +0 -0
  357. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_nn.py +0 -0
  358. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_registration.py +0 -0
  359. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_tractography.py +0 -0
  360. {pyafq-3.3 → pyafq-3.4}/AFQ/tests/test_viz.py +0 -0
  361. {pyafq-3.3 → pyafq-3.4}/AFQ/tractography/__init__.py +0 -0
  362. {pyafq-3.3 → pyafq-3.4}/AFQ/tractography/utils.py +0 -0
  363. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/__init__.py +0 -0
  364. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/conversion.py +0 -0
  365. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/docs.py +0 -0
  366. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/models.py +0 -0
  367. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/path.py +0 -0
  368. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/stats.py +0 -0
  369. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/streamlines.py +0 -0
  370. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/testing.py +0 -0
  371. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/tests/__init__.py +0 -0
  372. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/tests/test_conversions.py +0 -0
  373. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/tests/test_path.py +0 -0
  374. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/tests/test_stats.py +0 -0
  375. {pyafq-3.3 → pyafq-3.4}/AFQ/utils/tests/test_streamlines.py +0 -0
  376. {pyafq-3.3 → pyafq-3.4}/AFQ/viz/__init__.py +0 -0
  377. {pyafq-3.3 → pyafq-3.4}/AFQ/viz/fury_backend.py +0 -0
  378. {pyafq-3.3 → pyafq-3.4}/CITATION +0 -0
  379. {pyafq-3.3 → pyafq-3.4}/LICENSE +0 -0
  380. {pyafq-3.3 → pyafq-3.4}/MANIFEST.in +0 -0
  381. {pyafq-3.3 → pyafq-3.4}/Makefile +0 -0
  382. {pyafq-3.3 → pyafq-3.4}/NOTICE.md +0 -0
  383. {pyafq-3.3 → pyafq-3.4}/README.md +0 -0
  384. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  385. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/CSVfile.png +0 -0
  386. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/FAbrain.png +0 -0
  387. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/ProfileViz.png +0 -0
  388. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/TP_viz.png +0 -0
  389. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/arcuaterois.png +0 -0
  390. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/beaware.png +0 -0
  391. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/custom.css +0 -0
  392. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/diffusion-anisotropic.gif +0 -0
  393. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/diffusion-isotropic.gif +0 -0
  394. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/down_left_arrow.png +0 -0
  395. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/down_right_arrow.png +0 -0
  396. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/dti_in_brain.png +0 -0
  397. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/dtiexplanation.jpg +0 -0
  398. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/eScience_Logo_HR.png +0 -0
  399. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/ecosystem.jpg +0 -0
  400. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/escience-logo.png +0 -0
  401. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/greencheck.png +0 -0
  402. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/inherintambiguity.png +0 -0
  403. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/logo.png +0 -0
  404. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/modelling.png +0 -0
  405. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/modeltotrack.png +0 -0
  406. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_001.gif +0 -0
  407. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_002.gif +0 -0
  408. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_003.gif +0 -0
  409. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_004.gif +0 -0
  410. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_005.gif +0 -0
  411. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_006.gif +0 -0
  412. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_010.gif +0 -0
  413. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_011.gif +0 -0
  414. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/sphx_glr_plot_stages_of_tractometry_012.gif +0 -0
  415. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tract_modeling2.png +0 -0
  416. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tract_profiling.png +0 -0
  417. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tract_recognition.png +0 -0
  418. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tract_tractography.png +0 -0
  419. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tractometry_pipeline.png +0 -0
  420. {pyafq-3.3 → pyafq-3.4}/docs/source/_static/tropic.png +0 -0
  421. {pyafq-3.3 → pyafq-3.4}/docs/source/_templates/footer.html +0 -0
  422. {pyafq-3.3 → pyafq-3.4}/docs/source/_templates/layout.html +0 -0
  423. {pyafq-3.3 → pyafq-3.4}/docs/source/bib.rst +0 -0
  424. {pyafq-3.3 → pyafq-3.4}/docs/source/developing/contributing.rst +0 -0
  425. {pyafq-3.3 → pyafq-3.4}/docs/source/developing/index.rst +0 -0
  426. {pyafq-3.3 → pyafq-3.4}/docs/source/developing/releasing.rst +0 -0
  427. {pyafq-3.3 → pyafq-3.4}/docs/source/developing/tasks.rst +0 -0
  428. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/howto_examples/index.rst +0 -0
  429. {pyafq-3.3 → pyafq-3.4}/docs/source/examples/tutorial_examples/index.rst +0 -0
  430. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/bundle_orientation.rst +0 -0
  431. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/index.rst +0 -0
  432. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/modeling.rst +0 -0
  433. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/profiling.rst +0 -0
  434. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/recognition.rst +0 -0
  435. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/tractography.rst +0 -0
  436. {pyafq-3.3 → pyafq-3.4}/docs/source/explanations/whats_new_3.rst +0 -0
  437. {pyafq-3.3 → pyafq-3.4}/docs/source/guides_index.rst +0 -0
  438. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/cite.rst +0 -0
  439. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/data.rst +0 -0
  440. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/getting_help.rst +0 -0
  441. {pyafq-3.3 → pyafq-3.4}/docs/source/howto/rerun.rst +0 -0
  442. {pyafq-3.3 → pyafq-3.4}/docs/source/index.rst +0 -0
  443. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/bundledict.rst +0 -0
  444. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/fibertracts.rst +0 -0
  445. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/kwargs.rst +0 -0
  446. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/methods.rst +0 -0
  447. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/tissue_properties.rst +0 -0
  448. {pyafq-3.3 → pyafq-3.4}/docs/source/reference/viz_backend.rst +0 -0
  449. {pyafq-3.3 → pyafq-3.4}/docs/source/sphinxext/kwargsdocs.py +0 -0
  450. {pyafq-3.3 → pyafq-3.4}/docs/source/sphinxext/methodsdocs.py +0 -0
  451. {pyafq-3.3 → pyafq-3.4}/docs/upload-gh-pages.sh +0 -0
  452. {pyafq-3.3 → pyafq-3.4}/gpu_docker/Dockerfile +0 -0
  453. {pyafq-3.3 → pyafq-3.4}/gpu_docker/docker-build.sh +0 -0
  454. {pyafq-3.3 → pyafq-3.4}/gpu_docker/docker-push.sh +0 -0
  455. {pyafq-3.3 → pyafq-3.4}/gpu_docker/pyafq_with_gpu_template.def +0 -0
  456. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/dependency_links.txt +0 -0
  457. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/not-zip-safe +0 -0
  458. {pyafq-3.3 → pyafq-3.4}/pyAFQ.egg-info/top_level.txt +0 -0
  459. {pyafq-3.3 → pyafq-3.4}/pyafq_docker/Dockerfile +0 -0
  460. {pyafq-3.3 → pyafq-3.4}/pyafq_docker/docker-build.sh +0 -0
  461. {pyafq-3.3 → pyafq-3.4}/pyafq_docker/docker-push.sh +0 -0
  462. {pyafq-3.3 → pyafq-3.4}/pyproject.toml +0 -0
  463. {pyafq-3.3 → pyafq-3.4}/setup.py +0 -0
  464. {pyafq-3.3 → pyafq-3.4}/tox.ini +0 -0
@@ -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,7 +5,6 @@ AFQ/version.py
5
5
  docs/_build
6
6
  docs/build
7
7
  docs/source/auto_examples/
8
- docs/source/reference/config.rst
9
8
  examples/**/*.nii.gz
10
9
  examples/**/*.trk
11
10
  examples/**/*.npy
@@ -15,5 +14,6 @@ dist
15
14
  .DS_Store
16
15
  **.sw?
17
16
  **Untitled.ipynb
17
+ docs/source/examples/**/*.ipynb
18
18
  pip-wheel-metadata
19
19
  pyAFQ.egg-info
@@ -272,17 +272,17 @@ def gaussian_weights(
272
272
  n_sls, n_nodes, _ = sls.shape
273
273
 
274
274
  def _weighting_failed():
275
- weights = np.ones((n_sls, n_nodes))
276
275
  logger.warning(
277
276
  (
278
- "Not enough streamlines for weight calculation, "
277
+ f"Not enough or too many streamlines (n_sls: {n_sls}) "
278
+ "for weight calculation, "
279
279
  "weighting everything evenly"
280
280
  )
281
281
  )
282
282
  if return_mahalanobis:
283
283
  return np.full((n_sls, n_nodes), np.nan)
284
284
  else:
285
- return weights / np.sum(weights, 0)
285
+ return np.full((n_sls, n_nodes), 1.0 / n_sls)
286
286
 
287
287
  if n_sls < 15: # Cov^-1 unstable under this amount
288
288
  return _weighting_failed()
@@ -319,15 +319,20 @@ def gaussian_weights(
319
319
 
320
320
  flat_coords = sls.reshape(-1, 3)
321
321
  flat_groups = working_groups.reshape(-1)
322
- unique_ids = np.unique(flat_groups)
322
+ flat_weights = weights.reshape(-1)
323
323
 
324
- for gid in unique_ids:
325
- mask = flat_groups == gid
326
- 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))
327
329
 
328
- 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:
329
333
  continue
330
334
 
335
+ group_data = sorted_coords[start:end]
331
336
  mu = stat(group_data, axis=0)
332
337
  diff = group_data - mu
333
338
 
@@ -340,26 +345,44 @@ def gaussian_weights(
340
345
  cov = eigenvectors @ np.diag(eigenvalues) @ eigenvectors.T
341
346
 
342
347
  if np.any(cov > 0):
343
- weights.ravel()[mask] = np.sqrt(
344
- np.einsum("ij,jk,ik->i", diff, pinvh(cov), diff)
345
- )
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)
346
351
 
347
352
  if return_mahalanobis:
348
353
  return weights
349
354
 
350
- with np.errstate(divide="ignore"):
355
+ with np.errstate(divide="ignore", invalid="ignore"):
351
356
  w_inv = 1.0 / weights
352
- 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
+ )
353
367
 
354
- denom = np.sum(w_inv, axis=0)
355
- w = np.divide(w_inv, denom, out=np.zeros_like(w_inv), where=denom != 0)
356
- col_sums = w.sum(axis=0)
357
- 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):
358
370
  return _weighting_failed()
359
371
  else:
360
- final_sums = w.sum(axis=0, keepdims=True)
361
- np.divide(w, final_sums, out=w, where=final_sums != 0)
362
- 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
363
386
 
364
387
 
365
388
  def make_mp4(show_m, out_path, n_frames=720, az_ang=-0.5, fps=30, crf=35, verbose=True):
@@ -413,7 +436,7 @@ def make_mp4(show_m, out_path, n_frames=720, az_ang=-0.5, fps=30, crf=35, verbos
413
436
  show_m.screens[0].controller.rotate((radians(az_ang), 0), None)
414
437
  show_m.render()
415
438
  show_m.window.draw()
416
- show_m.snapshot(frame_fname)
439
+ show_m.snapshot(fname=frame_fname)
417
440
  video.append(Image.open(frame_fname).convert("RGB"))
418
441
 
419
442
  all_left, all_upper = float("inf"), float("inf")
@@ -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
  },
@@ -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
@@ -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
 
@@ -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",
@@ -12,6 +12,7 @@ from AFQ.tasks.utils import get_tp
12
12
  __all__ = [
13
13
  "ImageFile",
14
14
  "FullImage",
15
+ "BabyBrainMask",
15
16
  "RoiImage",
16
17
  "LabelledImageFile",
17
18
  "ThresholdedImageFile",
@@ -312,6 +313,28 @@ class FullImage(ImageDefinition):
312
313
  return image_getter
313
314
 
314
315
 
316
+ class BabyBrainMask(ImageDefinition):
317
+ def __init__(self):
318
+ pass
319
+
320
+ def get_name(self):
321
+ return "babyseg_brain_mask"
322
+
323
+ def get_image_getter(self, task_name):
324
+ def _image_getter_helper(babyseg_model):
325
+ predictions = nib.load(babyseg_model)
326
+ brain_mask = (predictions.get_fdata() > 0).astype(np.uint8)
327
+ brain_mask_img = nib.Nifti1Image(brain_mask, predictions.affine)
328
+ return brain_mask_img, dict(BabySegPredictions=babyseg_model)
329
+
330
+ if task_name == "structural":
331
+ return _image_getter_helper
332
+ else:
333
+ raise ValueError(
334
+ "BabyBrainMask can only be used in the structural context."
335
+ )
336
+
337
+
315
338
  class RoiImage(ImageDefinition):
316
339
  """
317
340
  Define an image which is all include ROIs or'd together.
@@ -27,9 +27,9 @@ class Definition(object):
27
27
  def find_path(self, bids_layout, from_path, subject, session, required=True):
28
28
  pass
29
29
 
30
- def str_for_toml(self):
30
+ def str_formal(self):
31
31
  """
32
- Uses __init__ in str_for_toml to make string that will instantiate
32
+ Uses __init__ in str_formal to make string that will instantiate
33
33
  itself. Assumes object will have attributes of same name as
34
34
  __init__ args. This is important for reading/writing definitions
35
35
  as arguments to config files.
@@ -56,7 +56,7 @@ def _arglist_to_string(args, get_attr=None):
56
56
  if get_attr is not None:
57
57
  arg = getattr(get_attr, arg)
58
58
  if isinstance(arg, Definition):
59
- arg = arg.str_for_toml()
59
+ arg = arg.str_formal()
60
60
  elif isinstance(arg, str):
61
61
  arg = f'"{arg}"'
62
62
  elif isinstance(arg, list):