pyAFQ 2.0__tar.gz → 2.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 (425) hide show
  1. {pyafq-2.0 → pyafq-2.1}/AFQ/api/bundle_dict.py +12 -12
  2. {pyafq-2.0 → pyafq-2.1}/AFQ/api/group.py +39 -11
  3. {pyafq-2.0 → pyafq-2.1}/AFQ/api/participant.py +7 -2
  4. {pyafq-2.0 → pyafq-2.1}/AFQ/api/utils.py +24 -8
  5. {pyafq-2.0 → pyafq-2.1}/AFQ/data/fetch.py +12 -5
  6. {pyafq-2.0 → pyafq-2.1}/AFQ/models/QBallTP.py +2 -2
  7. {pyafq-2.0 → pyafq-2.1}/AFQ/models/csd.py +13 -13
  8. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/criteria.py +15 -0
  9. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/recognize.py +11 -9
  10. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/data.py +17 -15
  11. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/decorators.py +3 -1
  12. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/mapping.py +13 -7
  13. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/segmentation.py +32 -21
  14. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/tractography.py +2 -0
  15. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/utils.py +0 -15
  16. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/viz.py +50 -21
  17. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_api.py +1 -1
  18. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_csd.py +4 -4
  19. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_tractography.py +4 -3
  20. {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/gputractography.py +16 -12
  21. {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/tractography.py +7 -2
  22. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/bin.py +4 -5
  23. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/docs.py +27 -0
  24. pyafq-2.1/AFQ/utils/docstring_parser.py +123 -0
  25. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/path.py +12 -9
  26. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/streamlines.py +2 -1
  27. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/volume.py +2 -1
  28. {pyafq-2.0 → pyafq-2.1}/AFQ/version.py +2 -2
  29. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/utils.py +4 -0
  30. {pyafq-2.0 → pyafq-2.1}/CHANGES.rst +49 -0
  31. {pyafq-2.0/pyAFQ.egg-info → pyafq-2.1}/PKG-INFO +6 -4
  32. {pyafq-2.0 → pyafq-2.1}/bin/pyAFQ +1 -1
  33. {pyafq-2.0 → pyafq-2.1}/docs/Makefile +18 -3
  34. pyafq-2.1/docs/source/_static/custom.css +114 -0
  35. pyafq-2.1/docs/source/_static/logo.png +0 -0
  36. pyafq-2.1/docs/source/_templates/footer.html +11 -0
  37. pyafq-2.1/docs/source/bib.rst +6 -0
  38. {pyafq-2.0 → pyafq-2.1}/docs/source/conf.py +9 -4
  39. pyafq-2.1/docs/source/developing/contributing.rst +15 -0
  40. pyafq-2.1/docs/source/developing/definitions.rst +61 -0
  41. {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/index.rst +2 -1
  42. pyafq-2.1/docs/source/explanations/bundle_orientation.rst +56 -0
  43. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/index.rst +6 -2
  44. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/modeling.rst +1 -5
  45. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/tractography.rst +1 -9
  46. pyafq-2.1/docs/source/explanations/tractometry_pipeline.rst +41 -0
  47. pyafq-2.1/docs/source/guides_index.rst +10 -0
  48. pyafq-2.1/docs/source/howto/cleaning_params.rst +35 -0
  49. {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/converter.rst +2 -1
  50. {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/data.rst +2 -1
  51. {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/docker.rst +4 -1
  52. {pyafq-2.0 → pyafq-2.1}/docs/source/howto/getting_help.rst +9 -8
  53. {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/image.rst +1 -1
  54. pyafq-2.1/docs/source/howto/index.rst +28 -0
  55. pyafq-2.1/docs/source/howto/installation_guide.rst +132 -0
  56. pyafq-2.1/docs/source/howto/rerun.rst +62 -0
  57. pyafq-2.1/docs/source/howto/segmentation_params.rst +33 -0
  58. pyafq-2.1/docs/source/howto/singularity.rst +27 -0
  59. pyafq-2.1/docs/source/howto/tractography_params.rst +34 -0
  60. {pyafq-2.0 → pyafq-2.1}/docs/source/index.rst +54 -19
  61. {pyafq-2.0 → pyafq-2.1}/docs/source/reference/bundledict.rst +34 -32
  62. pyafq-2.1/docs/source/reference/fibertracts.rst +341 -0
  63. pyafq-2.1/docs/source/reference/index.rst +15 -0
  64. pyafq-2.1/docs/source/reference/kwargs.rst +158 -0
  65. pyafq-2.1/docs/source/reference/mapping.rst +31 -0
  66. {pyafq-2.0 → pyafq-2.1}/docs/source/reference/methods.rst +43 -3
  67. pyafq-2.1/docs/source/reference/tissue_properties.rst +190 -0
  68. pyafq-2.1/docs/source/references.bib +528 -0
  69. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/add_custom_bundle.py +4 -3
  70. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/baby_afq.py +4 -4
  71. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_stages_of_tractometry.py +25 -7
  72. pyafq-2.1/examples/howto_examples/run_pyAFQ_with_GPU.py +48 -0
  73. pyafq-2.0/examples/tutorial_examples/plot_001_afq_api.py → pyafq-2.1/examples/tutorial_examples/plot_001_group_afq_api.py +5 -4
  74. pyafq-2.1/examples/tutorial_examples/plot_002_participant_afq_api.py +215 -0
  75. pyafq-2.1/examples/tutorial_examples/plot_003_rerun.py +145 -0
  76. pyafq-2.1/examples/tutorial_examples/plot_004_export.py +168 -0
  77. pyafq-2.0/examples/tutorial_examples/plot_003_viz.py → pyafq-2.1/examples/tutorial_examples/plot_005_viz.py +57 -7
  78. pyafq-2.0/examples/tutorial_examples/plot_002_bids_layout.py → pyafq-2.1/examples/tutorial_examples/plot_006_bids_layout.py +1 -1
  79. pyafq-2.1/examples/tutorial_examples/plot_007_rois.py +176 -0
  80. {pyafq-2.0 → pyafq-2.1}/gpu_docker/Dockerfile +2 -1
  81. {pyafq-2.0 → pyafq-2.1}/gpu_docker/cuda_track_template.def +1 -0
  82. {pyafq-2.0 → pyafq-2.1/pyAFQ.egg-info}/PKG-INFO +6 -4
  83. {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/SOURCES.txt +33 -20
  84. {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/requires.txt +3 -2
  85. {pyafq-2.0 → pyafq-2.1}/setup.cfg +2 -2
  86. pyafq-2.0/docs/source/_static/custom.css +0 -70
  87. pyafq-2.0/docs/source/_static/logo.png +0 -0
  88. pyafq-2.0/docs/source/explanations/bundle_orientation.rst +0 -52
  89. pyafq-2.0/docs/source/explanations/tractometry_pipeline.rst +0 -31
  90. pyafq-2.0/docs/source/howto/contributing.rst +0 -12
  91. pyafq-2.0/docs/source/howto/developing/definitions.rst +0 -46
  92. pyafq-2.0/docs/source/howto/index.rst +0 -17
  93. pyafq-2.0/docs/source/howto/installation_guide.rst +0 -99
  94. pyafq-2.0/docs/source/howto/usage/index.rst +0 -15
  95. pyafq-2.0/docs/source/howto/usage/kwargs.rst +0 -238
  96. pyafq-2.0/docs/source/howto/usage/methods.rst +0 -350
  97. pyafq-2.0/docs/source/howto/usage/singularity.rst +0 -16
  98. pyafq-2.0/docs/source/reference/index.rst +0 -13
  99. pyafq-2.0/docs/source/reference/kwargs.rst +0 -268
  100. pyafq-2.0/docs/source/reference/mapping.rst +0 -28
  101. {pyafq-2.0 → pyafq-2.1}/.github/CITATION.cff +0 -0
  102. {pyafq-2.0 → pyafq-2.1}/.github/CONTRIBUTING.md +0 -0
  103. {pyafq-2.0 → pyafq-2.1}/.github/workflows/docbuild.yml +0 -0
  104. {pyafq-2.0 → pyafq-2.1}/.github/workflows/docker_pyafq.yml +0 -0
  105. {pyafq-2.0 → pyafq-2.1}/.github/workflows/docker_pyafq_cuda12.yml +0 -0
  106. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_anisotropic_test.yml +0 -0
  107. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_basic_test.yml +0 -0
  108. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_custom_test.yml +0 -0
  109. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_pft_test.yml +0 -0
  110. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_reco80_test.yml +0 -0
  111. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_reco_test.yml +0 -0
  112. {pyafq-2.0 → pyafq-2.1}/.github/workflows/nightly_test.yml +0 -0
  113. {pyafq-2.0 → pyafq-2.1}/.github/workflows/publish-to-test-pypi.yml +0 -0
  114. {pyafq-2.0 → pyafq-2.1}/.github/workflows/test.yml +0 -0
  115. {pyafq-2.0 → pyafq-2.1}/.gitignore +0 -0
  116. {pyafq-2.0 → pyafq-2.1}/.mailmap +0 -0
  117. {pyafq-2.0 → pyafq-2.1}/.maintenance/update_changes.sh +0 -0
  118. {pyafq-2.0 → pyafq-2.1}/.maintenance/update_zenodo.py +0 -0
  119. {pyafq-2.0 → pyafq-2.1}/.pep8speaks.yml +0 -0
  120. {pyafq-2.0 → pyafq-2.1}/.zenodo.json +0 -0
  121. {pyafq-2.0 → pyafq-2.1}/AFQ/__init__.py +0 -0
  122. {pyafq-2.0 → pyafq-2.1}/AFQ/_fixes.py +0 -0
  123. {pyafq-2.0 → pyafq-2.1}/AFQ/api/__init__.py +0 -0
  124. {pyafq-2.0 → pyafq-2.1}/AFQ/data/__init__.py +0 -0
  125. {pyafq-2.0 → pyafq-2.1}/AFQ/data/utils.py +0 -0
  126. {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/__init__.py +0 -0
  127. {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/image.py +0 -0
  128. {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/mapping.py +0 -0
  129. {pyafq-2.0 → pyafq-2.1}/AFQ/definitions/utils.py +0 -0
  130. {pyafq-2.0 → pyafq-2.1}/AFQ/models/__init__.py +0 -0
  131. {pyafq-2.0 → pyafq-2.1}/AFQ/models/dki.py +0 -0
  132. {pyafq-2.0 → pyafq-2.1}/AFQ/models/dti.py +0 -0
  133. {pyafq-2.0 → pyafq-2.1}/AFQ/models/fwdti.py +0 -0
  134. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/__init__.py +0 -0
  135. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/cleaning.py +0 -0
  136. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/curvature.py +0 -0
  137. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/other_bundles.py +0 -0
  138. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/preprocess.py +0 -0
  139. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/roi.py +0 -0
  140. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/__init__.py +0 -0
  141. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_other_bundles.py +0 -0
  142. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_recognition.py +0 -0
  143. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_rois.py +0 -0
  144. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/tests/test_utils.py +0 -0
  145. {pyafq-2.0 → pyafq-2.1}/AFQ/recognition/utils.py +0 -0
  146. {pyafq-2.0 → pyafq-2.1}/AFQ/registration.py +0 -0
  147. {pyafq-2.0 → pyafq-2.1}/AFQ/tasks/__init__.py +0 -0
  148. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/__init__.py +0 -0
  149. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/MoriGroups_Test.mat +0 -0
  150. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/WholeBrainFG_test.mat +0 -0
  151. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/.gitattributes +0 -0
  152. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.datalad/config +0 -0
  153. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/.gitattributes +0 -0
  154. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/CHANGES +0 -0
  155. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/README +0 -0
  156. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/T1w.json +0 -0
  157. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/annex-uuid +0 -0
  158. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/dataset_description.json +0 -0
  159. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/aMRIQC.csv +0 -0
  160. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_group.pdf +0 -0
  161. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-01.pdf +0 -0
  162. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-02.pdf +0 -0
  163. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-03.pdf +0 -0
  164. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-04.pdf +0 -0
  165. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-05.pdf +0 -0
  166. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-06.pdf +0 -0
  167. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-07.pdf +0 -0
  168. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-08.pdf +0 -0
  169. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-09.pdf +0 -0
  170. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-10.pdf +0 -0
  171. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-11.pdf +0 -0
  172. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-12.pdf +0 -0
  173. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-13.pdf +0 -0
  174. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-14.pdf +0 -0
  175. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-15.pdf +0 -0
  176. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-16.pdf +0 -0
  177. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-17.pdf +0 -0
  178. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-18.pdf +0 -0
  179. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-19.pdf +0 -0
  180. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-20.pdf +0 -0
  181. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-21.pdf +0 -0
  182. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-22.pdf +0 -0
  183. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-23.pdf +0 -0
  184. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-24.pdf +0 -0
  185. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-25.pdf +0 -0
  186. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/anatomical_sub-26.pdf +0 -0
  187. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/fMRIQC.csv +0 -0
  188. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_group.pdf +0 -0
  189. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-01.pdf +0 -0
  190. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-02.pdf +0 -0
  191. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-03.pdf +0 -0
  192. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-04.pdf +0 -0
  193. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-05.pdf +0 -0
  194. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-06.pdf +0 -0
  195. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-07.pdf +0 -0
  196. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-08.pdf +0 -0
  197. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-09.pdf +0 -0
  198. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-10.pdf +0 -0
  199. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-11.pdf +0 -0
  200. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-12.pdf +0 -0
  201. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-13.pdf +0 -0
  202. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-14.pdf +0 -0
  203. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-15.pdf +0 -0
  204. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-16.pdf +0 -0
  205. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-17.pdf +0 -0
  206. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-18.pdf +0 -0
  207. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-19.pdf +0 -0
  208. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-20.pdf +0 -0
  209. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-21.pdf +0 -0
  210. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-22.pdf +0 -0
  211. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-23.pdf +0 -0
  212. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-24.pdf +0 -0
  213. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-25.pdf +0 -0
  214. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/derivatives/mriqc/functional_sub-26.pdf +0 -0
  215. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/participants.tsv +0 -0
  216. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  217. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_bold.nii.gz +0 -0
  218. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-1_events.tsv +0 -0
  219. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_bold.nii.gz +0 -0
  220. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-01/func/sub-01_task-flanker_run-2_events.tsv +0 -0
  221. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/anat/sub-02_T1w.nii.gz +0 -0
  222. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_bold.nii.gz +0 -0
  223. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-1_events.tsv +0 -0
  224. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_bold.nii.gz +0 -0
  225. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-02/func/sub-02_task-flanker_run-2_events.tsv +0 -0
  226. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/anat/sub-03_T1w.nii.gz +0 -0
  227. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_bold.nii.gz +0 -0
  228. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-1_events.tsv +0 -0
  229. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_bold.nii.gz +0 -0
  230. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-03/func/sub-03_task-flanker_run-2_events.tsv +0 -0
  231. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/anat/sub-04_T1w.nii.gz +0 -0
  232. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_bold.nii.gz +0 -0
  233. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-1_events.tsv +0 -0
  234. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_bold.nii.gz +0 -0
  235. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-04/func/sub-04_task-flanker_run-2_events.tsv +0 -0
  236. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/anat/sub-05_T1w.nii.gz +0 -0
  237. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_bold.nii.gz +0 -0
  238. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-1_events.tsv +0 -0
  239. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_bold.nii.gz +0 -0
  240. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-05/func/sub-05_task-flanker_run-2_events.tsv +0 -0
  241. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/anat/sub-06_T1w.nii.gz +0 -0
  242. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_bold.nii.gz +0 -0
  243. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-1_events.tsv +0 -0
  244. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_bold.nii.gz +0 -0
  245. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-06/func/sub-06_task-flanker_run-2_events.tsv +0 -0
  246. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/anat/sub-07_T1w.nii.gz +0 -0
  247. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_bold.nii.gz +0 -0
  248. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-1_events.tsv +0 -0
  249. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_bold.nii.gz +0 -0
  250. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-07/func/sub-07_task-flanker_run-2_events.tsv +0 -0
  251. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/anat/sub-08_T1w.nii.gz +0 -0
  252. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_bold.nii.gz +0 -0
  253. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-1_events.tsv +0 -0
  254. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_bold.nii.gz +0 -0
  255. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-08/func/sub-08_task-flanker_run-2_events.tsv +0 -0
  256. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/anat/sub-09_T1w.nii.gz +0 -0
  257. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_bold.nii.gz +0 -0
  258. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-1_events.tsv +0 -0
  259. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_bold.nii.gz +0 -0
  260. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-09/func/sub-09_task-flanker_run-2_events.tsv +0 -0
  261. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/anat/sub-10_T1w.nii.gz +0 -0
  262. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_bold.nii.gz +0 -0
  263. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-1_events.tsv +0 -0
  264. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_bold.nii.gz +0 -0
  265. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-10/func/sub-10_task-flanker_run-2_events.tsv +0 -0
  266. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/anat/sub-11_T1w.nii.gz +0 -0
  267. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_bold.nii.gz +0 -0
  268. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-1_events.tsv +0 -0
  269. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_bold.nii.gz +0 -0
  270. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-11/func/sub-11_task-flanker_run-2_events.tsv +0 -0
  271. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/anat/sub-12_T1w.nii.gz +0 -0
  272. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_bold.nii.gz +0 -0
  273. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-1_events.tsv +0 -0
  274. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_bold.nii.gz +0 -0
  275. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-12/func/sub-12_task-flanker_run-2_events.tsv +0 -0
  276. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/anat/sub-13_T1w.nii.gz +0 -0
  277. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_bold.nii.gz +0 -0
  278. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-1_events.tsv +0 -0
  279. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_bold.nii.gz +0 -0
  280. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-13/func/sub-13_task-flanker_run-2_events.tsv +0 -0
  281. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/anat/sub-14_T1w.nii.gz +0 -0
  282. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_bold.nii.gz +0 -0
  283. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-1_events.tsv +0 -0
  284. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_bold.nii.gz +0 -0
  285. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-14/func/sub-14_task-flanker_run-2_events.tsv +0 -0
  286. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/anat/sub-15_T1w.nii.gz +0 -0
  287. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_bold.nii.gz +0 -0
  288. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-1_events.tsv +0 -0
  289. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_bold.nii.gz +0 -0
  290. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-15/func/sub-15_task-flanker_run-2_events.tsv +0 -0
  291. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/anat/sub-16_T1w.nii.gz +0 -0
  292. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_bold.nii.gz +0 -0
  293. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-1_events.tsv +0 -0
  294. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_bold.nii.gz +0 -0
  295. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-16/func/sub-16_task-flanker_run-2_events.tsv +0 -0
  296. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/anat/sub-17_T1w.nii.gz +0 -0
  297. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_bold.nii.gz +0 -0
  298. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-1_events.tsv +0 -0
  299. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_bold.nii.gz +0 -0
  300. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-17/func/sub-17_task-flanker_run-2_events.tsv +0 -0
  301. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/anat/sub-18_T1w.nii.gz +0 -0
  302. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_bold.nii.gz +0 -0
  303. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-1_events.tsv +0 -0
  304. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_bold.nii.gz +0 -0
  305. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-18/func/sub-18_task-flanker_run-2_events.tsv +0 -0
  306. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/anat/sub-19_T1w.nii.gz +0 -0
  307. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_bold.nii.gz +0 -0
  308. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-1_events.tsv +0 -0
  309. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_bold.nii.gz +0 -0
  310. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-19/func/sub-19_task-flanker_run-2_events.tsv +0 -0
  311. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/anat/sub-20_T1w.nii.gz +0 -0
  312. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_bold.nii.gz +0 -0
  313. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-1_events.tsv +0 -0
  314. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_bold.nii.gz +0 -0
  315. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-20/func/sub-20_task-flanker_run-2_events.tsv +0 -0
  316. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/anat/sub-21_T1w.nii.gz +0 -0
  317. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_bold.nii.gz +0 -0
  318. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-1_events.tsv +0 -0
  319. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_bold.nii.gz +0 -0
  320. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-21/func/sub-21_task-flanker_run-2_events.tsv +0 -0
  321. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/anat/sub-22_T1w.nii.gz +0 -0
  322. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_bold.nii.gz +0 -0
  323. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-1_events.tsv +0 -0
  324. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_bold.nii.gz +0 -0
  325. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-22/func/sub-22_task-flanker_run-2_events.tsv +0 -0
  326. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/anat/sub-23_T1w.nii.gz +0 -0
  327. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_bold.nii.gz +0 -0
  328. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-1_events.tsv +0 -0
  329. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_bold.nii.gz +0 -0
  330. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-23/func/sub-23_task-flanker_run-2_events.tsv +0 -0
  331. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/anat/sub-24_T1w.nii.gz +0 -0
  332. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_bold.nii.gz +0 -0
  333. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-1_events.tsv +0 -0
  334. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_bold.nii.gz +0 -0
  335. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-24/func/sub-24_task-flanker_run-2_events.tsv +0 -0
  336. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/anat/sub-25_T1w.nii.gz +0 -0
  337. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_bold.nii.gz +0 -0
  338. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-1_events.tsv +0 -0
  339. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_bold.nii.gz +0 -0
  340. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-25/func/sub-25_task-flanker_run-2_events.tsv +0 -0
  341. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/anat/sub-26_T1w.nii.gz +0 -0
  342. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_bold.nii.gz +0 -0
  343. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-1_events.tsv +0 -0
  344. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_bold.nii.gz +0 -0
  345. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/sub-26/func/sub-26_task-flanker_run-2_events.tsv +0 -0
  346. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/data/mocks3/ds000102-mimic/task-flanker_bold.json +0 -0
  347. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_bundle_dict.py +0 -0
  348. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_data.py +0 -0
  349. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_definitions.py +0 -0
  350. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_dki.py +0 -0
  351. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_dti.py +0 -0
  352. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_fixes.py +0 -0
  353. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_registration.py +0 -0
  354. {pyafq-2.0 → pyafq-2.1}/AFQ/tests/test_viz.py +0 -0
  355. {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/__init__.py +0 -0
  356. {pyafq-2.0 → pyafq-2.1}/AFQ/tractography/utils.py +0 -0
  357. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/__init__.py +0 -0
  358. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/conversion.py +0 -0
  359. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/models.py +0 -0
  360. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/stats.py +0 -0
  361. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/testing.py +0 -0
  362. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/__init__.py +0 -0
  363. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_conversions.py +0 -0
  364. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_path.py +0 -0
  365. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_stats.py +0 -0
  366. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_streamlines.py +0 -0
  367. {pyafq-2.0 → pyafq-2.1}/AFQ/utils/tests/test_volume.py +0 -0
  368. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/__init__.py +0 -0
  369. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/altair.py +0 -0
  370. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/fury_backend.py +0 -0
  371. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/plot.py +0 -0
  372. {pyafq-2.0 → pyafq-2.1}/AFQ/viz/plotly_backend.py +0 -0
  373. {pyafq-2.0 → pyafq-2.1}/CITATION +0 -0
  374. {pyafq-2.0 → pyafq-2.1}/LICENSE +0 -0
  375. {pyafq-2.0 → pyafq-2.1}/MANIFEST.in +0 -0
  376. {pyafq-2.0 → pyafq-2.1}/Makefile +0 -0
  377. {pyafq-2.0 → pyafq-2.1}/README.md +0 -0
  378. {pyafq-2.0 → pyafq-2.1}/docs/source/_progressbars.py +0 -0
  379. {pyafq-2.0 → pyafq-2.1}/docs/source/_static/BDE_Banner_revised20160211-01.jpg +0 -0
  380. {pyafq-2.0 → pyafq-2.1}/docs/source/_static/eScience_Logo_HR.png +0 -0
  381. {pyafq-2.0 → pyafq-2.1}/docs/source/_static/escience-logo.png +0 -0
  382. {pyafq-2.0 → pyafq-2.1}/docs/source/_templates/layout.html +0 -0
  383. {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/releasing.rst +0 -0
  384. {pyafq-2.0/docs/source/howto → pyafq-2.1/docs/source}/developing/tasks.rst +0 -0
  385. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/down_left_arrow.png +0 -0
  386. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/down_right_arrow.png +0 -0
  387. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/greencheck.png +0 -0
  388. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_modeling2.png +0 -0
  389. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_profiling.png +0 -0
  390. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_recognition.png +0 -0
  391. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/_static/tract_tractography.png +0 -0
  392. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/profiling.rst +0 -0
  393. {pyafq-2.0 → pyafq-2.1}/docs/source/explanations/recognition.rst +0 -0
  394. {pyafq-2.0 → pyafq-2.1}/docs/source/howto/cite.rst +0 -0
  395. {pyafq-2.0/docs/source/howto/usage → pyafq-2.1/docs/source/howto}/scalars.rst +0 -0
  396. {pyafq-2.0 → pyafq-2.1}/docs/source/reference/viz_backend.rst +0 -0
  397. {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/kwargsdocs.py +0 -0
  398. {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/methodsdocs.py +0 -0
  399. {pyafq-2.0 → pyafq-2.1}/docs/source/sphinxext/updatedocs.py +0 -0
  400. {pyafq-2.0 → pyafq-2.1}/docs/source/tutorials/index.rst +0 -0
  401. {pyafq-2.0 → pyafq-2.1}/docs/upload-gh-pages.sh +0 -0
  402. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/README.rst +0 -0
  403. /pyafq-2.0/examples/howto_examples/plot_acoustic_radiations.py → /pyafq-2.1/examples/howto_examples/acoustic_radiations.py +0 -0
  404. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cerebellar_peduncles.py +0 -0
  405. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cloudknot_example.py +0 -0
  406. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/cloudknot_hcp_example.py +0 -0
  407. /pyafq-2.0/examples/howto_examples/plot_optic_radiations.py → /pyafq-2.1/examples/howto_examples/optic_radiations.py +0 -0
  408. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_afq_callosal.py +0 -0
  409. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/plot_recobundles.py +0 -0
  410. /pyafq-2.0/examples/howto_examples/plot_afq_fwdti.py → /pyafq-2.1/examples/howto_examples/run_afq_fwdti.py +0 -0
  411. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/use_subject_space_rois_from_freesurfer.py +0 -0
  412. {pyafq-2.0 → pyafq-2.1}/examples/howto_examples/vof_example.py +0 -0
  413. {pyafq-2.0 → pyafq-2.1}/examples/tutorial_examples/README.rst +0 -0
  414. {pyafq-2.0 → pyafq-2.1}/gpu_docker/cuda_build.sh +0 -0
  415. {pyafq-2.0 → pyafq-2.1}/gpu_docker/docker-build.sh +0 -0
  416. {pyafq-2.0 → pyafq-2.1}/gpu_docker/docker-push.sh +0 -0
  417. {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/dependency_links.txt +0 -0
  418. {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/not-zip-safe +0 -0
  419. {pyafq-2.0 → pyafq-2.1}/pyAFQ.egg-info/top_level.txt +0 -0
  420. {pyafq-2.0 → pyafq-2.1}/pyafq_docker/Dockerfile +0 -0
  421. {pyafq-2.0 → pyafq-2.1}/pyafq_docker/docker-build.sh +0 -0
  422. {pyafq-2.0 → pyafq-2.1}/pyafq_docker/docker-push.sh +0 -0
  423. {pyafq-2.0 → pyafq-2.1}/pyproject.toml +0 -0
  424. {pyafq-2.0 → pyafq-2.1}/setup.py +0 -0
  425. {pyafq-2.0 → pyafq-2.1}/tox.ini +0 -0
@@ -451,7 +451,7 @@ def baby_bd():
451
451
  'mahal': {'distance_threshold': 4}},
452
452
  'Forceps Minor': {'cross_midline': True,
453
453
  'include': [templates['FA_R'],
454
- templates['mid-saggital'],
454
+ templates['mid-sagittal'],
455
455
  templates['FA_L']],
456
456
  'exclude': [],
457
457
  'space': 'template',
@@ -459,7 +459,7 @@ def baby_bd():
459
459
  'mahal': {'distance_threshold': 4}},
460
460
  'Forceps Major': {'cross_midline': True,
461
461
  'include': [templates['FP_R'],
462
- templates['mid-saggital'],
462
+ templates['mid-sagittal'],
463
463
  templates['FP_L']],
464
464
  'exclude': [],
465
465
  'space': 'template',
@@ -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
@@ -1017,9 +1019,9 @@ class BundleDict(MutableMapping):
1017
1019
  new_affine : array
1018
1020
  Affine of space transformed into.
1019
1021
  base_fname : str, optional
1020
- Base file path to save ROIs too. Additional BIDS
1022
+ Base file path to construct file path from. Additional BIDS
1021
1023
  descriptors will be added to this file path. If None,
1022
- do not save the ROIs.
1024
+ no file paths returned.
1023
1025
  to_space : str, optional
1024
1026
  Name for space for exported ROIs. Only used if base_fname
1025
1027
  is not None.
@@ -1033,8 +1035,8 @@ class BundleDict(MutableMapping):
1033
1035
  -------
1034
1036
  If base_fname is None, a dictionary where keys are
1035
1037
  the roi type and values are the transformed ROIs.
1036
- Otherwise, a list of file names where the transformed
1037
- ROIs are saved.
1038
+ Otherwise, a list of file names and a list of transformed ROIs
1039
+ are returned.
1038
1040
  """
1039
1041
  if self.is_bundle_in_template(bundle_name):
1040
1042
  transformed_rois = self.apply_to_rois(
@@ -1055,6 +1057,7 @@ class BundleDict(MutableMapping):
1055
1057
 
1056
1058
  if base_fname is not None:
1057
1059
  fnames = []
1060
+ list_of_rois_to_save = []
1058
1061
  for roi_type, rois in transformed_rois.items():
1059
1062
  if roi_type == "prob_map":
1060
1063
  suffix = "probseg"
@@ -1079,12 +1082,9 @@ class BundleDict(MutableMapping):
1079
1082
  f"{desc}"
1080
1083
  f"_{suffix}.nii.gz",
1081
1084
  "ROIs")
1082
- nib.save(
1083
- nib.Nifti1Image(
1084
- roi.get_fdata().astype(np.float32),
1085
- roi.affine), fname)
1086
1085
  fnames.append(fname)
1087
- return fnames
1086
+ list_of_rois_to_save.append(roi)
1087
+ return list_of_rois_to_save, fnames
1088
1088
  else:
1089
1089
  return transformed_rois
1090
1090
 
@@ -127,7 +127,7 @@ class GroupAFQ(object):
127
127
 
128
128
  Examples
129
129
  --------
130
- api.GroupAFQ(my_path, csd_sh_order=4)
130
+ api.GroupAFQ(my_path, csd_sh_order_max=4)
131
131
  api.GroupAFQ(
132
132
  my_path,
133
133
  reg_template_spec="mni_t2", reg_subject_spec="b0")
@@ -208,8 +208,9 @@ class GroupAFQ(object):
208
208
 
209
209
  pl_desc_file = op.join(self.afq_path, 'dataset_description.json')
210
210
 
211
- with open(pl_desc_file, 'w') as outfile:
212
- json.dump(pipeline_description, outfile)
211
+ if not op.exists(pl_desc_file):
212
+ with open(pl_desc_file, 'w') as outfile:
213
+ json.dump(pipeline_description, outfile)
213
214
 
214
215
  self.subjects = bids_layout.get(return_type='id', target='subject')
215
216
  if not len(self.subjects):
@@ -410,7 +411,12 @@ class GroupAFQ(object):
410
411
  self.afq_path, "tract_profiles.csv"))
411
412
  os.makedirs(op.dirname(out_file), exist_ok=True)
412
413
  _df = clean_pandas_df(_df)
413
- _df.to_csv(out_file, index=False)
414
+ try:
415
+ _df.to_csv(out_file, index=False)
416
+ except:
417
+ logger.warning((
418
+ "Unable to update combined tract profile. "
419
+ "This is likely due to file permissions."))
414
420
  return _df
415
421
 
416
422
  def get_streamlines_json(self):
@@ -502,6 +508,8 @@ class GroupAFQ(object):
502
508
  None if called without arguments.
503
509
  """
504
510
  section = check_attribute(attr_name)
511
+ if section == False:
512
+ return None
505
513
 
506
514
  # iterate over subjects / sessions,
507
515
  # decide if they need to be calculated or not
@@ -554,6 +562,9 @@ class GroupAFQ(object):
554
562
  Name of the output to export up to. Default: "help"
555
563
  """
556
564
  section = check_attribute(attr_name)
565
+ if section == False:
566
+ return None
567
+
557
568
  wf_dict = self.wf_dict[
558
569
  self.valid_sub_list[0]][self.valid_ses_list[0]]
559
570
  if section is not None:
@@ -772,7 +783,13 @@ class GroupAFQ(object):
772
783
  self.afq_path,
773
784
  (f"bundle-{bundle_name}_view-{view}"
774
785
  f"_idx-{curr_file_num}_montage.png")))
775
- curr_img.save(save_path)
786
+ try:
787
+ curr_img.save(save_path)
788
+ except:
789
+ if op.exists(save_path):
790
+ logger.info("Montage file already exists, skipping.")
791
+ else:
792
+ logger.warning("Unable to save montage file, skipping.")
776
793
  all_fnames.append(save_path)
777
794
 
778
795
  this_img_trimmed = {}
@@ -865,12 +882,23 @@ class GroupAFQ(object):
865
882
  sls_mni,
866
883
  reg_template,
867
884
  Space.VOX)
868
- save_tractogram(
869
- moved_sft,
870
- op.abspath(op.join(
871
- self.afq_path,
872
- f"bundle-{bundle_name}_subjects-all_MNI.trk")),
873
- bbox_valid_check=False)
885
+
886
+ save_path = op.abspath(op.join(
887
+ self.afq_path,
888
+ f"bundle-{bundle_name}_subjects-all_MNI.trk"))
889
+ try:
890
+ save_tractogram(
891
+ moved_sft,
892
+ save_path,
893
+ bbox_valid_check=False)
894
+ except:
895
+ if op.exists(save_path):
896
+ logger.info(("Combined bundles file "
897
+ "already exists, skipping."))
898
+ else:
899
+ logger.warning((
900
+ "Unable to save combined "
901
+ "bundles file, skipping."))
874
902
 
875
903
  def upload_to_s3(self, s3fs, remote_path):
876
904
  """ Upload entire AFQ derivatives folder to S3"""
@@ -56,7 +56,7 @@ class ParticipantAFQ(object):
56
56
  --------
57
57
  api.ParticipantAFQ(
58
58
  dwi_data_file, bval_file, bvec_file, output_dir,
59
- csd_sh_order=4)
59
+ csd_sh_order_max=4)
60
60
  api.ParticipantAFQ(
61
61
  dwi_data_file, bval_file, bvec_file, output_dir,
62
62
  reg_template_spec="mni_t2", reg_subject_spec="b0")
@@ -149,6 +149,8 @@ class ParticipantAFQ(object):
149
149
  The specific output, or None if called without arguments.
150
150
  """
151
151
  section = check_attribute(attr_name)
152
+ if section == False:
153
+ return None
152
154
 
153
155
  if section is None:
154
156
  return self.wf_dict[attr_name]
@@ -156,7 +158,7 @@ class ParticipantAFQ(object):
156
158
 
157
159
  def export_up_to(self, attr_name="help"):
158
160
  f"""
159
- Export all derivatives necessary for a specific output.
161
+ Export all derivatives up to, but not including, the specified output.
160
162
  To print a list of available outputs,
161
163
  call export_up_to without arguments.
162
164
  {valid_exports_string}
@@ -167,6 +169,9 @@ class ParticipantAFQ(object):
167
169
  Name of the output to export up to. Default: "help"
168
170
  """
169
171
  section = check_attribute(attr_name)
172
+ if section == False:
173
+ return None
174
+
170
175
  wf_dict = self.wf_dict
171
176
  if section is not None:
172
177
  wf_dict = wf_dict[section]
@@ -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(
@@ -97,6 +110,9 @@ valid_exports_string = (
97
110
  def check_attribute(attr_name):
98
111
  if attr_name == "help":
99
112
  print(valid_exports_string)
113
+ return False
114
+
115
+ if attr_name[:-5] in task_modules:
100
116
  return None
101
117
 
102
118
  if attr_name in methods_sections:
@@ -238,7 +238,7 @@ pediatric_fnames = [
238
238
  "VOF_box_L.nii.gz", "VOF_box_R.nii.gz",
239
239
  "UNCNeo-withCerebellum-for-babyAFQ.nii.gz",
240
240
  "UNCNeo_JHU_tracts_prob-for-babyAFQ.nii.gz",
241
- "mid-saggital.nii.gz",
241
+ "mid-sagittal.nii.gz",
242
242
  "OR_rightV1.nii.gz",
243
243
  "OR_rightThal.nii.gz",
244
244
  "OR_right_roi3.nii.gz",
@@ -308,7 +308,7 @@ pediatric_remote_fnames = [
308
308
  "24880739", "24880742", "24880754", "24880757", "24880760", "24880763",
309
309
  "24880769", "24880772", "24880775", "24880778", "24880781", "24880787",
310
310
  "24880790", "24880793", "24880796", "24880802", "24880805", "24880808",
311
- "24880616", "24880613", "24986396",
311
+ "24880616", "24880613", "54869903",
312
312
  "42120480",
313
313
  "42120483",
314
314
  "42120486",
@@ -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(
@@ -1049,8 +1055,9 @@ def to_bids_description(path, fname='dataset_description.json',
1049
1055
  """Dumps a dict into a bids description at the given location"""
1050
1056
  kwargs.update({"BIDSVersion": BIDSVersion})
1051
1057
  desc_file = op.join(path, fname)
1052
- with open(desc_file, 'w') as outfile:
1053
- json.dump(kwargs, outfile)
1058
+ if not op.exists(desc_file):
1059
+ with open(desc_file, 'w') as outfile:
1060
+ json.dump(kwargs, outfile)
1054
1061
 
1055
1062
 
1056
1063
  def organize_cfin_data(path=None):
@@ -7,7 +7,7 @@ from dipy.reconst.shm import anisotropic_power, sh_to_sf_matrix
7
7
  __all__ = ["extract_odf", "anisotropic_index", "anisotropic_power"]
8
8
 
9
9
 
10
- def extract_odf(odf, sphere=default_sphere, sh_order=8):
10
+ def extract_odf(odf, sphere=default_sphere, sh_order_max=8):
11
11
  """
12
12
  Calculates spherical harmonics coefficients and
13
13
  isotropic and anisotropic diffusion components
@@ -18,7 +18,7 @@ def extract_odf(odf, sphere=default_sphere, sh_order=8):
18
18
  ISO = odf_norm.min(axis=-1)
19
19
 
20
20
  _, invB = sh_to_sf_matrix(
21
- sphere, sh_order=sh_order, basis_type=None, return_inv=True)
21
+ sphere, sh_order_max=sh_order_max, basis_type=None, return_inv=True)
22
22
  shm = blas.dgemm(
23
23
  alpha=1.,
24
24
  a=odf.reshape(-1, invB.shape[0]), b=invB).reshape(
@@ -23,19 +23,19 @@ class CsdNanResponseError(Exception):
23
23
  pass
24
24
 
25
25
 
26
- def _model(gtab, data, response=None, sh_order=None, csd_fa_thr=0.7):
26
+ def _model(gtab, data, response=None, sh_order_max=None, csd_fa_thr=0.7):
27
27
  """
28
28
  Helper function that defines a CSD model.
29
29
  """
30
- if sh_order is None:
30
+ if sh_order_max is None:
31
31
  ndata = np.sum(~gtab.b0s_mask)
32
32
  # See dipy.reconst.shm.calculate_max_order
33
33
  L1 = (-3 + np.sqrt(1 + 8 * ndata)) / 2.0
34
- sh_order = int(L1)
35
- if np.mod(sh_order, 2) != 0:
36
- sh_order = sh_order - 1
37
- if sh_order > 8:
38
- sh_order = 8
34
+ sh_order_max = int(L1)
35
+ if np.mod(sh_order_max, 2) != 0:
36
+ sh_order_max = sh_order_max - 1
37
+ if sh_order_max > 8:
38
+ sh_order_max = 8
39
39
 
40
40
  my_model = csd.ConstrainedSphericalDeconvModel
41
41
  if response is None:
@@ -55,21 +55,21 @@ def _model(gtab, data, response=None, sh_order=None, csd_fa_thr=0.7):
55
55
  if np.all(np.isnan(response[0])):
56
56
  raise CsdNanResponseError
57
57
 
58
- csdmodel = my_model(gtab, response, sh_order=sh_order)
58
+ csdmodel = my_model(gtab, response, sh_order_max=sh_order_max)
59
59
  return csdmodel
60
60
 
61
61
 
62
- def _fit(gtab, data, mask, response=None, sh_order=None,
62
+ def _fit(gtab, data, mask, response=None, sh_order_max=None,
63
63
  lambda_=1, tau=0.1, csd_fa_thr=0.7):
64
64
  """
65
65
  Helper function that does the core of fitting a model to data.
66
66
  """
67
- return _model(gtab, data, response, sh_order, csd_fa_thr).fit(
67
+ return _model(gtab, data, response, sh_order_max, csd_fa_thr).fit(
68
68
  data, mask=mask)
69
69
 
70
70
 
71
71
  def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
72
- b0_threshold=50, sh_order=None, lambda_=1, tau=0.1, out_dir=None):
72
+ b0_threshold=50, sh_order_max=None, lambda_=1, tau=0.1, out_dir=None):
73
73
  """
74
74
  Fit the CSD model and save file with SH coefficients.
75
75
 
@@ -94,7 +94,7 @@ def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
94
94
  b0_threshold : float,optional.
95
95
  The value of diffusion-weighting under which we consider it to be
96
96
  equivalent to 0. Default:50
97
- sh_order : int, optional.
97
+ sh_order_max : int, optional.
98
98
  default: infer the number of parameters from the number of data
99
99
  volumes, but no larger than 8.
100
100
  lambda_ : float, optional.
@@ -126,7 +126,7 @@ def fit_csd(data_files, bval_files, bvec_files, mask=None, response=None,
126
126
  b0_threshold=b0_threshold,
127
127
  mask=mask)
128
128
 
129
- csdfit = _fit(gtab, data, mask, response=response, sh_order=sh_order,
129
+ csdfit = _fit(gtab, data, mask, response=response, sh_order_max=sh_order_max,
130
130
  lambda_=lambda_, tau=tau)
131
131
 
132
132
  if out_dir is None:
@@ -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(
@@ -122,16 +122,18 @@ def recognize(
122
122
  References
123
123
  ----------
124
124
  .. [Hua2008] Hua K, Zhang J, Wakana S, Jiang H, Li X, et al. (2008)
125
- Tract probability maps in stereotaxic spaces: analyses of white
126
- matter anatomy and tract-specific quantification. Neuroimage 39:
127
- 336-347
125
+ Tract probability maps in stereotaxic spaces: analyses of white
126
+ matter anatomy and tract-specific quantification. Neuroimage 39:
127
+ 336-347
128
+
128
129
  .. [Yeatman2012] Yeatman, Jason D., Robert F. Dougherty, Nathaniel J.
129
- Myall, Brian A. Wandell, and Heidi M. Feldman. 2012. "Tract Profiles of
130
- White Matter Properties: Automating Fiber-Tract Quantification"
131
- PloS One 7 (11): e49790.
132
- .. [Garyfallidis17] Garyfallidis et al. Recognition of white matter
133
- bundles using local and global streamline-based registration and
134
- clustering, Neuroimage, 2017.
130
+ Myall, Brian A. Wandell, and Heidi M. Feldman. 2012. "Tract Profiles
131
+ of White Matter Properties: Automating Fiber-Tract Quantification"
132
+ PloS One 7 (11): e49790.
133
+
134
+ .. [Garyfallidis2018] Garyfallidis et al. Recognition of white matter
135
+ bundles using local and global streamline-based registration and
136
+ clustering, Neuroimage, 2017.
135
137
  """
136
138
  if rng is None:
137
139
  rng = np.random.RandomState()
@@ -86,7 +86,7 @@ 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,
89
+ bvals=bvals, bvecs=bvecs,
90
90
  b0_threshold=b0_threshold)
91
91
  img = nib.Nifti1Image(data, img.affine)
92
92
  return data, gtab, img, img.affine
@@ -293,7 +293,7 @@ def msdki_msk(msdki_tf):
293
293
  subfolder="models")
294
294
  @as_img
295
295
  def csd_params(dwi, brain_mask, gtab, data,
296
- csd_response=None, csd_sh_order=None,
296
+ csd_response=None, csd_sh_order_max=None,
297
297
  csd_lambda_=1, csd_tau=0.1,
298
298
  csd_fa_thr=0.7):
299
299
  """
@@ -309,7 +309,7 @@ def csd_params(dwi, brain_mask, gtab, data,
309
309
  (i.e. S0). If not provided, auto_response will be used to calculate
310
310
  these values.
311
311
  Default: None
312
- csd_sh_order : int or None, optional.
312
+ csd_sh_order_max : int or None, optional.
313
313
  default: infer the number of parameters from the number of data
314
314
  volumes, but no larger than 8.
315
315
  Default: None
@@ -340,7 +340,7 @@ def csd_params(dwi, brain_mask, gtab, data,
340
340
  csdf = csd_fit_model(
341
341
  gtab, data,
342
342
  mask=mask,
343
- response=csd_response, sh_order=csd_sh_order,
343
+ response=csd_response, sh_order_max=csd_sh_order_max,
344
344
  lambda_=csd_lambda_, tau=csd_tau,
345
345
  csd_fa_thr=csd_fa_thr)
346
346
  except CsdNanResponseError as e:
@@ -349,7 +349,7 @@ def csd_params(dwi, brain_mask, gtab, data,
349
349
  f'{dwi}.') from e
350
350
 
351
351
  meta = dict(
352
- SphericalHarmonicDegree=csd_sh_order,
352
+ SphericalHarmonicDegree=csd_sh_order_max,
353
353
  ResponseFunctionTensor=csd_response,
354
354
  lambda_=csd_lambda_,
355
355
  tau=csd_tau,
@@ -579,7 +579,7 @@ def rumba_f_wm(rumba_fit):
579
579
  @pimms.calc("opdt_params", "opdt_gfa")
580
580
  def opdt_params(base_fname, data, gtab,
581
581
  dwi_affine, brain_mask,
582
- opdt_sh_order=8):
582
+ opdt_sh_order_max=8):
583
583
  """
584
584
  full path to a nifti file containing
585
585
  parameters for the Orientation Probability Density Transform
@@ -592,7 +592,7 @@ def opdt_params(base_fname, data, gtab,
592
592
  Spherical harmonics order for OPDT model. Must be even.
593
593
  Default: 8
594
594
  """
595
- opdt_model = shm.OpdtModel(gtab, opdt_sh_order)
595
+ opdt_model = shm.OpdtModel(gtab, opdt_sh_order_max)
596
596
  opdt_fit = opdt_model.fit(data, mask=brain_mask)
597
597
 
598
598
  params_suffix = "_model-OPDT_param-fod_dwimap.nii.gz"
@@ -602,7 +602,7 @@ def opdt_params(base_fname, data, gtab,
602
602
  get_fname(base_fname,
603
603
  f"{drop_extension(params_suffix)}.json",
604
604
  "models"),
605
- dict(sh_order=opdt_sh_order)
605
+ dict(sh_order_max=opdt_sh_order_max)
606
606
  )
607
607
 
608
608
  GFA_suffix = "_model-OPDT_param-GFA_dwimap.nii.gz"
@@ -610,7 +610,7 @@ def opdt_params(base_fname, data, gtab,
610
610
  nib.save(nib.Nifti1Image(opdt_fit.gfa, dwi_affine), GFA_fname)
611
611
  write_json(
612
612
  get_fname(base_fname, f"{drop_extension(GFA_suffix)}.json", "models"),
613
- dict(sh_order=opdt_sh_order)
613
+ dict(sh_order_max=opdt_sh_order_max)
614
614
  )
615
615
 
616
616
  return params_fname, GFA_fname
@@ -647,7 +647,7 @@ def opdt_ai(opdt_params):
647
647
  @pimms.calc("csa_params", "csa_gfa")
648
648
  def csa_params(base_fname, data, gtab,
649
649
  dwi_affine, brain_mask,
650
- csa_sh_order=8):
650
+ csa_sh_order_max=8):
651
651
  """
652
652
  full path to a nifti file containing
653
653
  parameters for the Constant Solid Angle
@@ -660,7 +660,7 @@ def csa_params(base_fname, data, gtab,
660
660
  Spherical harmonics order for CSA model. Must be even.
661
661
  Default: 8
662
662
  """
663
- csa_model = shm.CsaOdfModel(gtab, csa_sh_order)
663
+ csa_model = shm.CsaOdfModel(gtab, csa_sh_order_max)
664
664
  csa_fit = csa_model.fit(data, mask=brain_mask)
665
665
 
666
666
  params_suffix = "_model-csa_param-fod_dwimap.nii.gz"
@@ -670,7 +670,7 @@ def csa_params(base_fname, data, gtab,
670
670
  get_fname(base_fname,
671
671
  f"{drop_extension(params_suffix)}.json",
672
672
  "models"),
673
- dict(sh_order=csa_sh_order)
673
+ dict(sh_order_max=csa_sh_order_max)
674
674
  )
675
675
 
676
676
  GFA_suffix = "_model-csa_param-gfa_dwimap.nii.gz"
@@ -681,7 +681,7 @@ def csa_params(base_fname, data, gtab,
681
681
  base_fname,
682
682
  f"{drop_extension(GFA_suffix)}.json",
683
683
  "models"),
684
- dict(sh_order=csa_sh_order)
684
+ dict(sh_order_max=csa_sh_order_max)
685
685
  )
686
686
 
687
687
  return params_fname, GFA_fname
@@ -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
 
@@ -143,9 +143,11 @@ def as_file(suffix, include_track=False, include_seg=False, subfolder=None):
143
143
  this_file = this_file + ".trk"
144
144
 
145
145
  if not op.exists(this_file):
146
+ logger.info(f"Calculating {suffix}")
147
+
146
148
  gen, meta = func(*args[:og_arg_count], **kwargs)
147
149
 
148
- logger.info(f"Saving {this_file}")
150
+ logger.info(f"{suffix} completed. Saving to {this_file}")
149
151
  if isinstance(gen, nib.Nifti1Image):
150
152
  nib.save(gen, this_file)
151
153
  elif isinstance(gen, StatefulTractogram):
@@ -1,4 +1,5 @@
1
1
  import nibabel as nib
2
+ import numpy as np
2
3
  import os.path as op
3
4
  import logging
4
5
 
@@ -84,16 +85,21 @@ def export_rois(base_fname, output_dir, dwi_data_file, data_imap, mapping):
84
85
  to_space = space_from_fname(dwi_data_file)
85
86
  for bundle_name in bundle_dict:
86
87
  roi_files[bundle_name] = []
87
- for roi_fname in bundle_dict.transform_rois(
88
+ for roi, roi_fname in zip(*bundle_dict.transform_rois(
88
89
  bundle_name, mapping, data_imap["dwi_affine"],
89
90
  base_fname=base_roi_fname,
90
- to_space=to_space):
91
- logger.info(f"Saving {roi_fname}")
91
+ to_space=to_space)):
92
92
  roi_files[bundle_name].append(roi_fname)
93
- meta = {
94
- "Bundle Definition": bundle_dict.get_b_info(bundle_name)}
95
- meta_fname = f'{drop_extension(roi_fname)}.json'
96
- write_json(meta_fname, meta)
93
+ if not op.exists(roi_fname):
94
+ logger.info(f"Saving {roi_fname}")
95
+ nib.save(
96
+ nib.Nifti1Image(
97
+ roi.get_fdata().astype(np.float32),
98
+ roi.affine), roi_fname)
99
+ meta = {
100
+ "Bundle Definition": bundle_dict.get_b_info(bundle_name)}
101
+ meta_fname = f'{drop_extension(roi_fname)}.json'
102
+ write_json(meta_fname, meta)
97
103
  return {'rois': roi_files}
98
104
 
99
105