pyAFQ 2.0__tar.gz → 2.0.1__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 (406) hide show
  1. {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/bundle_dict.py +3 -1
  2. {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/participant.py +1 -1
  3. {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/utils.py +21 -8
  4. {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/fetch.py +7 -1
  5. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/criteria.py +15 -0
  6. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/data.py +6 -4
  7. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/segmentation.py +8 -2
  8. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/tractography.py +2 -0
  9. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/viz.py +1 -1
  10. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_api.py +1 -1
  11. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/gputractography.py +7 -5
  12. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/bin.py +4 -5
  13. pyafq-2.0.1/AFQ/utils/docstring_parser.py +123 -0
  14. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/path.py +12 -9
  15. {pyafq-2.0 → pyafq-2.0.1}/AFQ/version.py +2 -2
  16. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/utils.py +4 -0
  17. {pyafq-2.0 → pyafq-2.0.1}/CHANGES.rst +34 -0
  18. {pyafq-2.0/pyAFQ.egg-info → pyafq-2.0.1}/PKG-INFO +4 -4
  19. pyafq-2.0.1/docs/source/howto/usage/cleaning_params.rst +35 -0
  20. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/index.rst +3 -0
  21. pyafq-2.0.1/docs/source/howto/usage/segmentation_params.rst +33 -0
  22. pyafq-2.0.1/docs/source/howto/usage/tractography_params.rst +34 -0
  23. pyafq-2.0.1/docs/source/reference/kwargs.rst +158 -0
  24. {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/methods.rst +43 -3
  25. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/add_custom_bundle.py +4 -3
  26. pyafq-2.0.1/examples/howto_examples/run_pyAFQ_with_GPU.py +48 -0
  27. pyafq-2.0/examples/tutorial_examples/plot_001_afq_api.py → pyafq-2.0.1/examples/tutorial_examples/plot_001_group_afq_api.py +5 -4
  28. pyafq-2.0.1/examples/tutorial_examples/plot_002_participant_afq_api.py +215 -0
  29. pyafq-2.0.1/examples/tutorial_examples/plot_003_rerun.py +145 -0
  30. pyafq-2.0.1/examples/tutorial_examples/plot_004_export.py +172 -0
  31. pyafq-2.0/examples/tutorial_examples/plot_003_viz.py → pyafq-2.0.1/examples/tutorial_examples/plot_005_viz.py +57 -7
  32. {pyafq-2.0 → pyafq-2.0.1/pyAFQ.egg-info}/PKG-INFO +4 -4
  33. {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/SOURCES.txt +14 -6
  34. {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/requires.txt +1 -2
  35. {pyafq-2.0 → pyafq-2.0.1}/setup.cfg +1 -2
  36. pyafq-2.0/docs/source/reference/kwargs.rst +0 -268
  37. {pyafq-2.0 → pyafq-2.0.1}/.github/CITATION.cff +0 -0
  38. {pyafq-2.0 → pyafq-2.0.1}/.github/CONTRIBUTING.md +0 -0
  39. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docbuild.yml +0 -0
  40. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docker_pyafq.yml +0 -0
  41. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  42. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_anisotropic_test.yml +0 -0
  43. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_basic_test.yml +0 -0
  44. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_custom_test.yml +0 -0
  45. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_pft_test.yml +0 -0
  46. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_reco80_test.yml +0 -0
  47. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_reco_test.yml +0 -0
  48. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/nightly_test.yml +0 -0
  49. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
  50. {pyafq-2.0 → pyafq-2.0.1}/.github/workflows/test.yml +0 -0
  51. {pyafq-2.0 → pyafq-2.0.1}/.gitignore +0 -0
  52. {pyafq-2.0 → pyafq-2.0.1}/.mailmap +0 -0
  53. {pyafq-2.0 → pyafq-2.0.1}/.maintenance/update_changes.sh +0 -0
  54. {pyafq-2.0 → pyafq-2.0.1}/.maintenance/update_zenodo.py +0 -0
  55. {pyafq-2.0 → pyafq-2.0.1}/.pep8speaks.yml +0 -0
  56. {pyafq-2.0 → pyafq-2.0.1}/.zenodo.json +0 -0
  57. {pyafq-2.0 → pyafq-2.0.1}/AFQ/__init__.py +0 -0
  58. {pyafq-2.0 → pyafq-2.0.1}/AFQ/_fixes.py +0 -0
  59. {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/__init__.py +0 -0
  60. {pyafq-2.0 → pyafq-2.0.1}/AFQ/api/group.py +0 -0
  61. {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/__init__.py +0 -0
  62. {pyafq-2.0 → pyafq-2.0.1}/AFQ/data/utils.py +0 -0
  63. {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/__init__.py +0 -0
  64. {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/image.py +0 -0
  65. {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/mapping.py +0 -0
  66. {pyafq-2.0 → pyafq-2.0.1}/AFQ/definitions/utils.py +0 -0
  67. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/QBallTP.py +0 -0
  68. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/__init__.py +0 -0
  69. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/csd.py +0 -0
  70. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/dki.py +0 -0
  71. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/dti.py +0 -0
  72. {pyafq-2.0 → pyafq-2.0.1}/AFQ/models/fwdti.py +0 -0
  73. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/__init__.py +0 -0
  74. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/cleaning.py +0 -0
  75. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/curvature.py +0 -0
  76. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/other_bundles.py +0 -0
  77. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/preprocess.py +0 -0
  78. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/recognize.py +0 -0
  79. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/roi.py +0 -0
  80. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/__init__.py +0 -0
  81. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  82. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_recognition.py +0 -0
  83. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_rois.py +0 -0
  84. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/tests/test_utils.py +0 -0
  85. {pyafq-2.0 → pyafq-2.0.1}/AFQ/recognition/utils.py +0 -0
  86. {pyafq-2.0 → pyafq-2.0.1}/AFQ/registration.py +0 -0
  87. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/__init__.py +0 -0
  88. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/decorators.py +0 -0
  89. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/mapping.py +0 -0
  90. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tasks/utils.py +0 -0
  91. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/__init__.py +0 -0
  92. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  93. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  94. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  95. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  96. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  97. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  98. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  99. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  100. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  101. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  102. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  103. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  104. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  105. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  106. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  107. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  108. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  109. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  110. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  111. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  112. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  113. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  114. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  115. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  116. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  117. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  118. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  119. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  120. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  121. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  122. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  123. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  124. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  125. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  126. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  127. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  128. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  129. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  130. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  131. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  132. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  133. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  134. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  135. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  136. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  137. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  138. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  139. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  140. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  141. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  142. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  143. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  144. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  145. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  146. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  147. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  148. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  149. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  150. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  151. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  152. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  153. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  154. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  155. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  156. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  157. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  158. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  159. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  160. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  161. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  162. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  163. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  164. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  165. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  166. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  167. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  168. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  169. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  170. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  171. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  172. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  173. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  174. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  175. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  176. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  177. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  178. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  179. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  180. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  181. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  182. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  183. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  184. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  185. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  186. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  187. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  188. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  189. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  190. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  191. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  192. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  193. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  194. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  195. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  196. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  197. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  198. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  199. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  200. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  201. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  202. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  203. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  204. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  205. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  206. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  207. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  208. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  209. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  210. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  211. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  212. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  213. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  214. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  215. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  216. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  217. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  218. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  219. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  220. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  221. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  222. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  223. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  224. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  225. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  226. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  227. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  228. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  229. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  230. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  231. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  232. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  233. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  234. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  235. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  236. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  237. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  238. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  239. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  240. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  241. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  242. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  243. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  244. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  245. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  246. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  247. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  248. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  249. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  250. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  251. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  252. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  253. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  254. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  255. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  256. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  257. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  258. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  259. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  260. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  261. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  262. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  263. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  264. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  265. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  266. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  267. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  268. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  269. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  270. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  271. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  272. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  273. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  274. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  275. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  276. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  277. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  278. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  279. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  280. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  281. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  282. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  283. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  284. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  285. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  286. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  287. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  288. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  289. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  290. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_bundle_dict.py +0 -0
  291. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_csd.py +0 -0
  292. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_data.py +0 -0
  293. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_definitions.py +0 -0
  294. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_dki.py +0 -0
  295. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_dti.py +0 -0
  296. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_fixes.py +0 -0
  297. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_registration.py +0 -0
  298. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_tractography.py +0 -0
  299. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tests/test_viz.py +0 -0
  300. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/__init__.py +0 -0
  301. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/tractography.py +0 -0
  302. {pyafq-2.0 → pyafq-2.0.1}/AFQ/tractography/utils.py +0 -0
  303. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/__init__.py +0 -0
  304. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/conversion.py +0 -0
  305. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/docs.py +0 -0
  306. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/models.py +0 -0
  307. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/stats.py +0 -0
  308. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/streamlines.py +0 -0
  309. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/testing.py +0 -0
  310. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/__init__.py +0 -0
  311. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_conversions.py +0 -0
  312. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_path.py +0 -0
  313. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_stats.py +0 -0
  314. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_streamlines.py +0 -0
  315. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/tests/test_volume.py +0 -0
  316. {pyafq-2.0 → pyafq-2.0.1}/AFQ/utils/volume.py +0 -0
  317. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/__init__.py +0 -0
  318. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/altair.py +0 -0
  319. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/fury_backend.py +0 -0
  320. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/plot.py +0 -0
  321. {pyafq-2.0 → pyafq-2.0.1}/AFQ/viz/plotly_backend.py +0 -0
  322. {pyafq-2.0 → pyafq-2.0.1}/CITATION +0 -0
  323. {pyafq-2.0 → pyafq-2.0.1}/LICENSE +0 -0
  324. {pyafq-2.0 → pyafq-2.0.1}/MANIFEST.in +0 -0
  325. {pyafq-2.0 → pyafq-2.0.1}/Makefile +0 -0
  326. {pyafq-2.0 → pyafq-2.0.1}/README.md +0 -0
  327. {pyafq-2.0 → pyafq-2.0.1}/bin/pyAFQ +0 -0
  328. {pyafq-2.0 → pyafq-2.0.1}/docs/Makefile +0 -0
  329. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_progressbars.py +0 -0
  330. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  331. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/custom.css +0 -0
  332. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/eScience_Logo_HR.png +0 -0
  333. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/escience-logo.png +0 -0
  334. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_static/logo.png +0 -0
  335. {pyafq-2.0 → pyafq-2.0.1}/docs/source/_templates/layout.html +0 -0
  336. {pyafq-2.0 → pyafq-2.0.1}/docs/source/conf.py +0 -0
  337. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/down_left_arrow.png +0 -0
  338. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/down_right_arrow.png +0 -0
  339. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/greencheck.png +0 -0
  340. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_modeling2.png +0 -0
  341. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_profiling.png +0 -0
  342. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_recognition.png +0 -0
  343. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/_static/tract_tractography.png +0 -0
  344. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/bundle_orientation.rst +0 -0
  345. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/index.rst +0 -0
  346. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/modeling.rst +0 -0
  347. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/profiling.rst +0 -0
  348. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/recognition.rst +0 -0
  349. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/tractography.rst +0 -0
  350. {pyafq-2.0 → pyafq-2.0.1}/docs/source/explanations/tractometry_pipeline.rst +0 -0
  351. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/cite.rst +0 -0
  352. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/contributing.rst +0 -0
  353. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/definitions.rst +0 -0
  354. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/index.rst +0 -0
  355. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/releasing.rst +0 -0
  356. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/developing/tasks.rst +0 -0
  357. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/getting_help.rst +0 -0
  358. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/index.rst +0 -0
  359. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/installation_guide.rst +0 -0
  360. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/converter.rst +0 -0
  361. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/data.rst +0 -0
  362. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/docker.rst +0 -0
  363. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/image.rst +0 -0
  364. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/kwargs.rst +0 -0
  365. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/methods.rst +0 -0
  366. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/scalars.rst +0 -0
  367. {pyafq-2.0 → pyafq-2.0.1}/docs/source/howto/usage/singularity.rst +0 -0
  368. {pyafq-2.0 → pyafq-2.0.1}/docs/source/index.rst +0 -0
  369. {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/bundledict.rst +0 -0
  370. {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/index.rst +0 -0
  371. {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/mapping.rst +0 -0
  372. {pyafq-2.0 → pyafq-2.0.1}/docs/source/reference/viz_backend.rst +0 -0
  373. {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/kwargsdocs.py +0 -0
  374. {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/methodsdocs.py +0 -0
  375. {pyafq-2.0 → pyafq-2.0.1}/docs/source/sphinxext/updatedocs.py +0 -0
  376. {pyafq-2.0 → pyafq-2.0.1}/docs/source/tutorials/index.rst +0 -0
  377. {pyafq-2.0 → pyafq-2.0.1}/docs/upload-gh-pages.sh +0 -0
  378. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/README.rst +0 -0
  379. /pyafq-2.0/examples/howto_examples/plot_acoustic_radiations.py → /pyafq-2.0.1/examples/howto_examples/acoustic_radiations.py +0 -0
  380. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/baby_afq.py +0 -0
  381. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cerebellar_peduncles.py +0 -0
  382. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cloudknot_example.py +0 -0
  383. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
  384. /pyafq-2.0/examples/howto_examples/plot_optic_radiations.py → /pyafq-2.0.1/examples/howto_examples/optic_radiations.py +0 -0
  385. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_afq_callosal.py +0 -0
  386. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_recobundles.py +0 -0
  387. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/plot_stages_of_tractometry.py +0 -0
  388. /pyafq-2.0/examples/howto_examples/plot_afq_fwdti.py → /pyafq-2.0.1/examples/howto_examples/run_afq_fwdti.py +0 -0
  389. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
  390. {pyafq-2.0 → pyafq-2.0.1}/examples/howto_examples/vof_example.py +0 -0
  391. {pyafq-2.0 → pyafq-2.0.1}/examples/tutorial_examples/README.rst +0 -0
  392. /pyafq-2.0/examples/tutorial_examples/plot_002_bids_layout.py → /pyafq-2.0.1/examples/tutorial_examples/plot_006_bids_layout.py +0 -0
  393. {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/Dockerfile +0 -0
  394. {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/cuda_build.sh +0 -0
  395. {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/cuda_track_template.def +0 -0
  396. {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/docker-build.sh +0 -0
  397. {pyafq-2.0 → pyafq-2.0.1}/gpu_docker/docker-push.sh +0 -0
  398. {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/dependency_links.txt +0 -0
  399. {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/not-zip-safe +0 -0
  400. {pyafq-2.0 → pyafq-2.0.1}/pyAFQ.egg-info/top_level.txt +0 -0
  401. {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/Dockerfile +0 -0
  402. {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/docker-build.sh +0 -0
  403. {pyafq-2.0 → pyafq-2.0.1}/pyafq_docker/docker-push.sh +0 -0
  404. {pyafq-2.0 → pyafq-2.0.1}/pyproject.toml +0 -0
  405. {pyafq-2.0 → pyafq-2.0.1}/setup.py +0 -0
  406. {pyafq-2.0 → pyafq-2.0.1}/tox.ini +0 -0
@@ -722,8 +722,10 @@ class BundleDict(MutableMapping):
722
722
  If there are bundles in bundle_info with the 'space' attribute
723
723
  set to 'subject', their images (all ROIs and probability maps)
724
724
  will be resampled to the affine and shape of this image.
725
+ If None, resamples to DWI. Be careful if you use this,
726
+ that this is the correct choice.
725
727
  If False, no resampling will be done.
726
- Default: None
728
+ Default: False
727
729
 
728
730
  keep_in_memory : bool, optional
729
731
  Whether, once loaded, all ROIs and probability maps will stay
@@ -156,7 +156,7 @@ class ParticipantAFQ(object):
156
156
 
157
157
  def export_up_to(self, attr_name="help"):
158
158
  f"""
159
- Export all derivatives necessary for a specific output.
159
+ Export all derivatives up to, but not including, the specified output.
160
160
  To print a list of available outputs,
161
161
  call export_up_to without arguments.
162
162
  {valid_exports_string}
@@ -1,8 +1,8 @@
1
1
  import contextlib
2
2
  from importlib import import_module
3
3
  from AFQ.viz.utils import viz_import_msg_error
4
+ from AFQ.utils.docstring_parser import parse_numpy_docstring
4
5
  import pimms
5
- from funcargparse import FuncArgParser
6
6
  import logging
7
7
  import warnings
8
8
 
@@ -23,18 +23,31 @@ set_sft_logger_level(logging.CRITICAL)
23
23
 
24
24
  task_modules = ["data", "mapping", "segmentation", "tractography", "viz"]
25
25
 
26
- methods_descriptors = {}
27
- methods_sections = {}
26
+ methods_descriptors = {
27
+ "dwi_data_file": "Path to DWI data file",
28
+ "bval_file": "Path to bval file",
29
+ "bvec_file": "Path to bvec file",
30
+ "output_dir": "Path to output directory",
31
+ "best_scalar": "Go-to scalar for visualizations",
32
+ "base_fname": "Base file name for outputs",
33
+ }
34
+ methods_sections = {
35
+ "dwi_data_file": "data",
36
+ "bval_file": "data",
37
+ "bvec_file": "data",
38
+ "output_dir": "data",
39
+ "best_scalar": "tractography",
40
+ "base_fname": "data",
41
+ }
28
42
  kwargs_descriptors = {}
29
43
  for task_module in task_modules:
30
44
  kwargs_descriptors[task_module] = {}
31
45
  for calc_obj in import_module(
32
46
  f"AFQ.tasks.{task_module}").__dict__.values():
33
47
  if isinstance(calc_obj, pimms.calculation.Calc):
34
- docstr_parser = FuncArgParser()
35
- docstr_parser.setup_args(calc_obj.function)
48
+ docstr_parsed = parse_numpy_docstring(calc_obj.function)
36
49
  if len(calc_obj.efferents) > 1:
37
- eff_descs = docstr_parser.description.split(",")
50
+ eff_descs = docstr_parsed["description"].split(",")
38
51
  if len(eff_descs) != len(calc_obj.efferents):
39
52
  raise NotImplementedError((
40
53
  "If calc method has mutliple outputs, "
@@ -56,10 +69,10 @@ for task_module in task_modules:
56
69
  else:
57
70
  methods_descriptors[
58
71
  calc_obj.efferents[0]] =\
59
- docstr_parser.description
72
+ docstr_parsed["description"]
60
73
  methods_sections[calc_obj.efferents[0]] =\
61
74
  task_module
62
- for arg, info in docstr_parser.unfinished_arguments.items():
75
+ for arg, info in docstr_parsed["arguments"].items():
63
76
  if "help" in info:
64
77
  default = info["default"] if "default" in info else None
65
78
  kwargs_descriptors[task_module][arg] = dict(
@@ -405,6 +405,8 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
405
405
  nibabel image class instance that contains the binary ROI resampled into
406
406
  the requested space.
407
407
  """
408
+ logger = logging.getLogger('AFQ')
409
+
408
410
  if isinstance(roi, str):
409
411
  roi = nib.load(roi)
410
412
 
@@ -414,7 +416,11 @@ def read_resample_roi(roi, resample_to=None, threshold=False):
414
416
  if isinstance(resample_to, str):
415
417
  resample_to = nib.load(resample_to)
416
418
 
417
- if resample_to is False or np.allclose(resample_to.affine, roi.affine):
419
+ if resample_to is False:
420
+ return roi
421
+
422
+ if np.allclose(resample_to.affine, roi.affine):
423
+ logger.info("Resampling skipped as affines already match.")
418
424
  return roi
419
425
 
420
426
  as_array = resample(
@@ -334,6 +334,21 @@ def run_bundle_rec_plan(
334
334
  mapping,
335
335
  img.affine,
336
336
  apply_to_recobundles=True))
337
+
338
+ def check_space(roi):
339
+ if not np.allclose(img.affine, roi.affine):
340
+ logger.warning(
341
+ "Resampling set to False in case where affines "
342
+ "do not match. This is likely due to subject space ROIs"
343
+ " not being in the right space. This found for bundle "
344
+ f"{bundle_name}")
345
+
346
+ apply_to_roi_dict(
347
+ bundle_def,
348
+ check_space,
349
+ dry_run=True,
350
+ apply_to_prob_map=True)
351
+
337
352
  apply_to_roi_dict(
338
353
  bundle_def,
339
354
  lambda roi_img: nib.Nifti1Image(
@@ -86,8 +86,8 @@ def get_data_gtab(dwi_data_file, bval_file, bvec_file, min_bval=None,
86
86
  bvals = bvals[valid_b]
87
87
  bvecs = bvecs[valid_b]
88
88
  gtab = dpg.gradient_table(
89
- bvals, bvecs,
90
- b0_threshold=b0_threshold)
89
+ bvals = bvals, bvecs = bvecs,
90
+ b0_threshold = b0_threshold)
91
91
  img = nib.Nifti1Image(data, img.affine)
92
92
  return data, gtab, img, img.affine
93
93
 
@@ -1081,8 +1081,7 @@ def brain_mask(b0, brain_mask_definition=None):
1081
1081
 
1082
1082
 
1083
1083
  @pimms.calc("bundle_dict", "reg_template", "tmpl_name")
1084
- def get_bundle_dict(segmentation_params,
1085
- brain_mask, b0,
1084
+ def get_bundle_dict(brain_mask, b0,
1086
1085
  bundle_info=None, reg_template_spec="mni_T1",
1087
1086
  reg_template_space_name="mni"):
1088
1087
  """
@@ -1157,6 +1156,9 @@ def get_bundle_dict(segmentation_params,
1157
1156
  bundle_info,
1158
1157
  resample_to=reg_template)
1159
1158
 
1159
+ if bundle_dict.resample_subject_to is None:
1160
+ bundle_dict.resample_subject_to = b0
1161
+
1160
1162
  return bundle_dict, reg_template, reg_template_space_name
1161
1163
 
1162
1164
 
@@ -80,6 +80,11 @@ def segment(data_imap, mapping_imap,
80
80
  temp_tck, data_imap["dwi"], Space.VOX,
81
81
  bbox_valid_check=False)
82
82
  is_trx = False
83
+ if len(tg.streamlines) == 0:
84
+ raise ValueError(f"There are no streamlines in {streamlines}."
85
+ " This is likely due to errors in defining the "
86
+ " tractography parameters or the"
87
+ " seed/stop masks.")
83
88
 
84
89
  indices_to_remove, _ = tg.remove_invalid_streamlines()
85
90
  if len(indices_to_remove) > 0:
@@ -382,8 +387,9 @@ def get_scalar_dict(data_imap, mapping_imap, scalars=["dti_fa", "dti_md"]):
382
387
  List of scalars to use.
383
388
  Can be any of: "dti_fa", "dti_md", "dki_fa", "dki_md", "dki_awf",
384
389
  "dki_mk". Can also be a scalar from AFQ.definitions.image.
385
- Default: For single shell data: ["dti_fa", "dti_md"],
386
- for multi-shell data: ["dki_fa", "dki_md"].
390
+ Defaults for single shell data to ["dti_fa", "dti_md"],
391
+ and for multi-shell data to ["dki_fa", "dki_md"].
392
+ Default: ['dti_fa', 'dti_md']
387
393
  """
388
394
  # Note: some scalars preprocessing done in plans, before this step
389
395
  scalar_dict = {}
@@ -351,6 +351,8 @@ def gpu_tractography(data_imap, tracking_params, fodf, seed, stop,
351
351
  if tracking_params["directions"] == "boot":
352
352
  data = data_imap["data"]
353
353
  else:
354
+ if isinstance(fodf, str):
355
+ fodf = nib.load(fodf)
354
356
  data = fodf.get_fdata()
355
357
 
356
358
  sphere = tracking_params["sphere"]
@@ -365,7 +365,7 @@ def init_viz_backend(viz_backend_spec="plotly_no_gif",
365
365
  generating GIFs in a headless environment. Default: False
366
366
  viz_backend_spec : str, optional
367
367
  Which visualization backend to use.
368
- See Visualization Backends page in documentation for details:
368
+ See Visualization Backends page in documentation for details
369
369
  https://tractometry.org/pyAFQ/usage/viz_backend.html
370
370
  One of {"fury", "plotly", "plotly_no_gif"}.
371
371
  Default: "plotly_no_gif"
@@ -32,7 +32,7 @@ import AFQ.utils.streamlines as aus
32
32
  import AFQ.utils.bin as afb
33
33
  from AFQ.definitions.mapping import SynMap, AffMap, SlrMap, IdentityMap
34
34
  from AFQ.definitions.image import (RoiImage, PFTImage, ImageFile,
35
- TemplateImage, LabelledImageFile)
35
+ TemplateImage)
36
36
 
37
37
 
38
38
  def touch(fname, times=None):
@@ -141,10 +141,12 @@ def gpu_track(data, gtab, seed_img, stop_img,
141
141
  step_size,
142
142
  0.25, # relative peak threshold
143
143
  radians(45), # min separation angle
144
- data.astype(np.float64), H.astype(np.float64), R.astype(np.float64),
144
+ np.ascontiguousarray(data).astype(np.float64),
145
+ H.astype(np.float64), R.astype(np.float64),
145
146
  delta_b.astype(np.float64), delta_q.astype(np.float64),
146
- b0s_mask.astype(np.int32), stop_data.astype(
147
- np.float64), sampling_matrix.astype(np.float64),
147
+ b0s_mask.astype(np.int32),
148
+ np.ascontiguousarray(stop_data).astype(np.float64),
149
+ sampling_matrix.astype(np.float64),
148
150
  sphere.vertices.astype(np.float64), sphere.edges.astype(np.int32),
149
151
  ngpus=ngpus, rng_seed=0)
150
152
 
@@ -162,7 +164,7 @@ def gpu_track(data, gtab, seed_img, stop_img,
162
164
  # Will resize by a factor of 2 if these are exceeded
163
165
  sl_len_guess = 100
164
166
  sl_per_seed_guess = 3
165
- n_sls_guess = sl_per_seed_guess * len(seeds.shape[0])
167
+ n_sls_guess = sl_per_seed_guess * seeds.shape[0]
166
168
 
167
169
  # trx files use memory mapping
168
170
  trx_file = TrxFile(
@@ -193,7 +195,7 @@ def gpu_track(data, gtab, seed_img, stop_img,
193
195
  # TRX uses memmaps here
194
196
  trx_file.streamlines._data[sls_data_idx:new_sls_data_idx] = sls._data
195
197
  trx_file.streamlines._offsets[offsets_idx:
196
- new_offsets_idx] = offsets_idx + sls._offsets
198
+ new_offsets_idx] = sls_data_idx + sls._offsets
197
199
  trx_file.streamlines._lengths[offsets_idx:new_offsets_idx] = sls._lengths
198
200
 
199
201
  offsets_idx = new_offsets_idx
@@ -4,13 +4,13 @@ import platform
4
4
  import os.path as op
5
5
 
6
6
  from argparse import ArgumentParser
7
- from funcargparse import FuncArgParser
8
7
 
9
8
  from AFQ.definitions.image import * # interprets masks loaded from toml
10
9
  from AFQ.definitions.mapping import * # interprets mappings loaded from toml
11
10
  from AFQ.api.bundle_dict import * # interprets bundle_dicts loaded from toml
12
11
  from AFQ.definitions.utils import Definition
13
12
  from AFQ.api.utils import kwargs_descriptors
13
+ from AFQ.utils.docstring_parser import parse_numpy_docstring
14
14
 
15
15
  import nibabel as nib # allows users to input nibabel objects
16
16
 
@@ -178,11 +178,10 @@ def func_dict_to_arg_dict(func_dict=None, logger=None):
178
178
 
179
179
  arg_dict = {}
180
180
  for name, func in func_dict.items():
181
- docstr_parser = FuncArgParser()
182
- docstr_parser.setup_args(func)
181
+ docstr_parsed = parse_numpy_docstring(func)
183
182
  if name == "BIDS":
184
- arg_dict["AFQ_desc"] = docstr_parser.description
185
- for arg, info in docstr_parser.unfinished_arguments.items():
183
+ arg_dict["AFQ_desc"] = docstr_parsed["description"]
184
+ for arg, info in docstr_parsed["arguments"].items():
186
185
  try:
187
186
  section = name.upper() + "_PARAMS"
188
187
  desc = info['help']
@@ -0,0 +1,123 @@
1
+ import re
2
+ import inspect
3
+
4
+ __all__ = ["parse_numpy_docstring"]
5
+
6
+
7
+ def _white_space(text):
8
+ if text is None:
9
+ return None
10
+ else:
11
+ return re.sub(r'[\n\t\s]+', ' ', text).strip()
12
+
13
+
14
+ def _split_parameter_blocks(docstring):
15
+ # First extract just the Parameters section
16
+ params_section = re.search(
17
+ r'Parameters\n-+\n(.*?)(?=\n\s*\n|\n-+\n|\Z)',
18
+ docstring,
19
+ re.DOTALL
20
+ )
21
+ if not params_section:
22
+ return []
23
+
24
+ params_text = params_section.group(1)
25
+ params_text = re.sub(r'\n-+$', '', params_text)
26
+ lines = params_text.split('\n')
27
+
28
+ # Find base indentation (minimum indent of parameter lines)
29
+ base_indent = float('inf')
30
+ for line in lines:
31
+ if re.match(r'\S', line):
32
+ indent = len(re.match(r'^\s*', line).group())
33
+ base_indent = min(base_indent, indent)
34
+
35
+ if base_indent == float('inf'):
36
+ return []
37
+
38
+ # Split into blocks
39
+ param_blocks = []
40
+ current_block = []
41
+
42
+ for line in lines:
43
+ line_indent = len(re.match(r'^\s*', line).group())
44
+ if line_indent == base_indent and re.match(r'\S', line):
45
+ if current_block:
46
+ param_blocks.append('\n'.join(current_block))
47
+ current_block = []
48
+ current_block.append(line)
49
+
50
+ if current_block:
51
+ param_blocks.append('\n'.join(current_block))
52
+
53
+ return param_blocks
54
+
55
+
56
+ def parse_numpy_docstring(docstring):
57
+ """
58
+ Parse a NumPy-style docstring into parameter information.
59
+
60
+ Returns:
61
+ dict: {
62
+ "description": str (first section of docstring),
63
+ "arguments": {
64
+ param_name: {
65
+ "help": str (description),
66
+ "metavar": str (type),
67
+ "default": any (default value)
68
+ }
69
+ }
70
+ }
71
+ """
72
+ if callable(docstring):
73
+ docstring = inspect.getdoc(docstring)
74
+
75
+ if not docstring:
76
+ return {"description": "", "arguments": {}}
77
+
78
+ # Find the description section
79
+ sections = re.split(r'\n\s*\n', docstring.strip())
80
+ description = sections[0].strip()
81
+
82
+ # Find the parameters section
83
+ param_blocks = _split_parameter_blocks(docstring)
84
+ params = {}
85
+
86
+ for block in param_blocks:
87
+ # Split into (param: value) and description
88
+ parts = block.split('\n', maxsplit=1)
89
+ if len(parts) == 0:
90
+ continue
91
+
92
+ # Parse the (param: value)
93
+ header_match = re.match(
94
+ r'(\w+)\s*:\s*([^,\n]+)(?:,\s*optional)?',
95
+ parts[0].strip()
96
+ )
97
+
98
+ if not header_match:
99
+ continue
100
+
101
+ name, type_info = header_match.groups()
102
+ desc = parts[1].strip() if len(parts) > 1 else ''
103
+
104
+ # Parse the description
105
+ default = None
106
+ default_match = re.search(r'[Dd]efault:\s*([^\n]+)', desc)
107
+ if default_match:
108
+ default = default_match.group(1).strip(" .")
109
+ try:
110
+ default = eval(default)
111
+ except:
112
+ default = _white_space(default)
113
+
114
+ params[name] = {
115
+ "help": _white_space(desc),
116
+ "metavar": _white_space(type_info),
117
+ "default": default
118
+ }
119
+
120
+ return {
121
+ "description": _white_space(description),
122
+ "arguments": params
123
+ }
@@ -70,6 +70,9 @@ def apply_cmd_to_afq_derivs(
70
70
  "dependent_on must be one of "
71
71
  "None, 'track', 'recog', 'prof'."))
72
72
 
73
+ if cmd == "rm" or cmd == "cp":
74
+ cmd = cmd + " -r"
75
+
73
76
  if not op.exists(derivs_dir):
74
77
  return
75
78
 
@@ -92,23 +95,23 @@ def apply_cmd_to_afq_derivs(
92
95
  os.system(f"{cmd} {full_path} {suffix}")
93
96
  elif os.path.isdir(full_path):
94
97
  if dependent_on is None:
95
- os.system(f"{cmd} -r {full_path} {suffix}")
98
+ os.system(f"{cmd} {full_path} {suffix}")
96
99
  else:
97
100
  if filename == "ROIs" and "rec" in dependent_on_list:
98
- os.system(f"{cmd} -r {full_path} {suffix}")
101
+ os.system(f"{cmd} {full_path} {suffix}")
99
102
  if filename == "stats" and "rec" in dependent_on_list:
100
- os.system(f"{cmd} -r {full_path} {suffix}")
103
+ os.system(f"{cmd} {full_path} {suffix}")
101
104
  if filename == "tractography" and "trk" in dependent_on_list:
102
- os.system(f"{cmd} -r {full_path} {suffix}")
105
+ os.system(f"{cmd} {full_path} {suffix}")
103
106
  if filename == "models" and "dwi" in dependent_on_list:
104
- os.system(f"{cmd} -r {full_path} {suffix}")
107
+ os.system(f"{cmd} {full_path} {suffix}")
105
108
  if filename == "bundles" and "rec" in dependent_on_list:
106
- os.system(f"{cmd} -r {full_path} {suffix}")
109
+ os.system(f"{cmd} {full_path} {suffix}")
107
110
  if filename == "viz_bundles" and "rec" in dependent_on_list:
108
- os.system(f"{cmd} -r {full_path} {suffix}")
111
+ os.system(f"{cmd} {full_path} {suffix}")
109
112
  if filename == "viz_core_bundles" and \
110
113
  "prof" in dependent_on_list:
111
- os.system(f"{cmd} -r {full_path} {suffix}")
114
+ os.system(f"{cmd} {full_path} {suffix}")
112
115
  if filename == "tract_profile_plots" and \
113
116
  "prof" in dependent_on_list:
114
- os.system(f"{cmd} -r {full_path} {suffix}")
117
+ os.system(f"{cmd} {full_path} {suffix}")
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.0'
21
- __version_tuple__ = version_tuple = (2, 0)
20
+ __version__ = version = '2.0.1'
21
+ __version_tuple__ = version_tuple = (2, 0, 1)
@@ -261,6 +261,10 @@ class PanelFigure():
261
261
  self.fig.canvas.draw()
262
262
  for (y_coord, x_coord, subplot_label_pos, label_text, kwargs) in \
263
263
  self.panel_label_queue:
264
+ if isinstance(x_coord, slice):
265
+ x_coord = x_coord.start
266
+ if isinstance(y_coord, slice):
267
+ y_coord = y_coord.start
264
268
  x_fig_pos = x_coord / self.grid.ncols
265
269
  y_fig_pos = 1.0 - (y_coord / self.grid.nrows)
266
270
  self.fig.text(
@@ -1,3 +1,37 @@
1
+ 2.0.1 (May 15, 2025)
2
+ ====================
3
+ Minor Fixes to VOF, ROI dists, baby BD primary axis filtering, import_tract
4
+ with trx files. Increase in number of examples in docs.
5
+ * [DOC] update broken references (#90)
6
+ * Add track, segment, cleaning explanation (#87)
7
+ * [DOC] How to Export examples (#86)
8
+ * [DOC] Add GPU, clobber docs (#82)
9
+ * [DOC] ParticipantAFQ example (#83)
10
+ * Small docs/viz tool improvements (#62)
11
+ * [ENH] Make Subject Space ROIs Resample By Default (#72)
12
+ * Upgrade DIPY dependency. (#76)
13
+ * Remove funcargparser dependency, replace with extreme regex (#80)
14
+ * RF: Better error handling. (#68)
15
+ * update reference in example (#75)
16
+ * [FIX] recently added typo in pyAFQ GPU integration (#74)
17
+ * DOC: Adds an example of tract profile visualization with "glass brain". (#67)
18
+ * remove dependencies; clarify <3.13 for now (#66)
19
+ * Loosen skimage dependency pin to be larger than 0.14.2 (#61)
20
+ * [FIX] make import_tract work better with TRX files (#54)
21
+ * Remove numpy version restrictions (#53)
22
+ * Further tweaks to new file system (#50)
23
+ * [FIX] change helvetica-bold to helvetica in pyAFQ plotting library (#49)
24
+ * (#48)
25
+ * [ENH/FIX] Pyafq file outputs more folders, more BIDS (#43)
26
+ * [ENH] Include custom ODFs (#33)
27
+ * [ENH] update to numpy 2 (#46)
28
+ * [ENH] update to 3.12 (#45)
29
+ * [FIX] fix VOF (#29)
30
+ * [DOC] added singularity build and usage (#28)
31
+ * [ENH] Use Distance Transform for Include/Exclude Distance calculation; fix ROI dists (#25)
32
+ * DOC: Document the significance of ROIS order in BundleDict (#27)
33
+ * [FIX] update baby BD to new primary axis api (#26)
34
+
1
35
  2.0 (February 25, 2025)
2
36
  =======================
3
37
  This is a major version release, which includes support for Python 3.12 and
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: pyAFQ
3
- Version: 2.0
3
+ Version: 2.0.1
4
4
  Summary: pyAFQ: Automated Fiber Quantification ... in Python
5
5
  Home-page: https://tractometry.github.io/pyAFQ
6
6
  Download-URL: https://github.com/tractometry/pyAFQ
@@ -21,7 +21,7 @@ Requires-Python: <3.13,>=3.10
21
21
  Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: scikit_image>=0.14.2
24
- Requires-Dist: dipy<1.11.0,>=1.10.0
24
+ Requires-Dist: dipy<1.12.0,>=1.11.0
25
25
  Requires-Dist: pandas
26
26
  Requires-Dist: pybids>=0.16.2
27
27
  Requires-Dist: templateflow>=0.8
@@ -31,7 +31,6 @@ Requires-Dist: trx-python
31
31
  Requires-Dist: ray
32
32
  Requires-Dist: toml>=0.10.0
33
33
  Requires-Dist: setuptools_scm[toml]<5.1.0,>=3.4.0
34
- Requires-Dist: funcargparse>=0.2.0
35
34
  Requires-Dist: plotly==5.12.0
36
35
  Requires-Dist: kaleido==0.2.1
37
36
  Requires-Dist: imageio>=2.0.0
@@ -104,6 +103,7 @@ Requires-Dist: s3bids>=0.1.7; extra == "all"
104
103
  Requires-Dist: s3fs; extra == "all"
105
104
  Requires-Dist: boto3>=1.14.0; extra == "all"
106
105
  Dynamic: download-url
106
+ Dynamic: license-file
107
107
 
108
108
  # pyAFQ
109
109
  Automated Fiber Quantification ... in Python.
@@ -0,0 +1,35 @@
1
+ ==========================
2
+ Cleaning Parameters
3
+ ==========================
4
+
5
+ This page documents the configuration options for controlling
6
+ bundle cleaning in pyAFQ. These parameters can be set in your
7
+ configuration file or passed as arguments when using the API.
8
+ Note that this goes inside of segmentation_params.
9
+
10
+ Example Usage
11
+ =============
12
+
13
+ .. code-block:: python
14
+
15
+ from AFQ.api.group import GroupAFQ
16
+ import AFQ.data.fetch as afd
17
+ import os.path as op
18
+
19
+ afd.organize_stanford_data()
20
+
21
+ myafq = GroupAFQ(
22
+ bids_path=op.join(afd.afq_home, 'stanford_hardi'),
23
+ preproc_pipeline='vistasoft',
24
+ segmentation_params=dict(
25
+ cleaning_params=dict(
26
+ distance_threshold=5,
27
+ length_threshold=5, # More lenient cleaning
28
+ ))
29
+ )
30
+
31
+ Cleaning Parameter Reference
32
+ ================================
33
+
34
+ .. autofunction:: AFQ.recognition.cleaning.clean_bundle
35
+ :noindex:
@@ -13,3 +13,6 @@ How to use `pyAFQ`
13
13
  docker
14
14
  methods
15
15
  image
16
+ tractography_params
17
+ segmentation_params
18
+ cleaning_params
@@ -0,0 +1,33 @@
1
+ ==========================
2
+ Segmentation Parameters
3
+ ==========================
4
+
5
+ This page documents the configuration options for controlling
6
+ tractography in pyAFQ. These parameters can be set in your
7
+ configuration file or passed as arguments when using the API.
8
+
9
+ Example Usage
10
+ =============
11
+
12
+ .. code-block:: python
13
+
14
+ from AFQ.api.group import GroupAFQ
15
+ import AFQ.data.fetch as afd
16
+ import os.path as op
17
+
18
+ afd.organize_stanford_data()
19
+
20
+ myafq = GroupAFQ(
21
+ bids_path=op.join(afd.afq_home, 'stanford_hardi'),
22
+ preproc_pipeline='vistasoft',
23
+ segmentation_params=dict(
24
+ dist_to_waypoint=10,
25
+ dist_to_atlas=10)
26
+ )
27
+
28
+
29
+ Segmentation Parameter Reference
30
+ ================================
31
+
32
+ .. autofunction:: AFQ.recognition.recognize.recognize
33
+ :noindex:
@@ -0,0 +1,34 @@
1
+ ==========================
2
+ Tractography Parameters
3
+ ==========================
4
+
5
+ This page documents the configuration options for controlling
6
+ tractography in pyAFQ. These parameters can be set in your configuration file
7
+ or passed as arguments when using the API.
8
+
9
+ Example Usage
10
+ =============
11
+
12
+ .. code-block:: python
13
+
14
+ from AFQ.api.group import GroupAFQ
15
+ import AFQ.data.fetch as afd
16
+ import os.path as op
17
+
18
+ afd.organize_stanford_data()
19
+
20
+ myafq = GroupAFQ(
21
+ bids_path=op.join(afd.afq_home, 'stanford_hardi'),
22
+ preproc_pipeline='vistasoft',
23
+ tracking_params=dict(
24
+ n_seeds=25000,
25
+ random_seeds=True,
26
+ rng_seed=2025,
27
+ trx=True)
28
+ )
29
+
30
+ Tractography Parameter Reference
31
+ ================================
32
+
33
+ .. autofunction:: AFQ.tractography.tractography.track
34
+ :noindex: