rapidtide 2.9.5__py3-none-any.whl → 3.1.3__py3-none-any.whl

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 (405) hide show
  1. cloud/gmscalc-HCPYA +1 -1
  2. cloud/mount-and-run +2 -0
  3. cloud/rapidtide-HCPYA +3 -3
  4. rapidtide/Colortables.py +538 -38
  5. rapidtide/OrthoImageItem.py +1094 -51
  6. rapidtide/RapidtideDataset.py +1709 -114
  7. rapidtide/__init__.py +0 -8
  8. rapidtide/_version.py +4 -4
  9. rapidtide/calccoherence.py +242 -97
  10. rapidtide/calcnullsimfunc.py +240 -140
  11. rapidtide/calcsimfunc.py +314 -129
  12. rapidtide/correlate.py +1211 -389
  13. rapidtide/data/examples/src/testLD +56 -0
  14. rapidtide/data/examples/src/test_findmaxlag.py +2 -2
  15. rapidtide/data/examples/src/test_mlregressallt.py +32 -17
  16. rapidtide/data/examples/src/testalign +1 -1
  17. rapidtide/data/examples/src/testatlasaverage +35 -7
  18. rapidtide/data/examples/src/testboth +21 -0
  19. rapidtide/data/examples/src/testcifti +11 -0
  20. rapidtide/data/examples/src/testdelayvar +13 -0
  21. rapidtide/data/examples/src/testdlfilt +25 -0
  22. rapidtide/data/examples/src/testfft +35 -0
  23. rapidtide/data/examples/src/testfileorfloat +37 -0
  24. rapidtide/data/examples/src/testfmri +94 -27
  25. rapidtide/data/examples/src/testfuncs +3 -3
  26. rapidtide/data/examples/src/testglmfilt +8 -6
  27. rapidtide/data/examples/src/testhappy +84 -51
  28. rapidtide/data/examples/src/testinitdelay +19 -0
  29. rapidtide/data/examples/src/testmodels +33 -0
  30. rapidtide/data/examples/src/testnewrefine +26 -0
  31. rapidtide/data/examples/src/testnoiseamp +21 -0
  32. rapidtide/data/examples/src/testppgproc +17 -0
  33. rapidtide/data/examples/src/testrefineonly +22 -0
  34. rapidtide/data/examples/src/testretro +26 -13
  35. rapidtide/data/examples/src/testretrolagtcs +16 -0
  36. rapidtide/data/examples/src/testrolloff +11 -0
  37. rapidtide/data/examples/src/testsimdata +45 -28
  38. rapidtide/data/models/model_cnn_pytorch/loss.png +0 -0
  39. rapidtide/data/models/model_cnn_pytorch/loss.txt +1 -0
  40. rapidtide/data/models/model_cnn_pytorch/model.pth +0 -0
  41. rapidtide/data/models/model_cnn_pytorch/model_meta.json +68 -0
  42. rapidtide/data/models/model_cnn_pytorch_fulldata/loss.png +0 -0
  43. rapidtide/data/models/model_cnn_pytorch_fulldata/loss.txt +1 -0
  44. rapidtide/data/models/model_cnn_pytorch_fulldata/model.pth +0 -0
  45. rapidtide/data/models/model_cnn_pytorch_fulldata/model_meta.json +80 -0
  46. rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.png +0 -0
  47. rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.txt +1 -0
  48. rapidtide/data/models/model_cnnbp_pytorch_fullldata/model.pth +0 -0
  49. rapidtide/data/models/model_cnnbp_pytorch_fullldata/model_meta.json +138 -0
  50. rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.png +0 -0
  51. rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.txt +1 -0
  52. rapidtide/data/models/model_cnnfft_pytorch_fulldata/model.pth +0 -0
  53. rapidtide/data/models/model_cnnfft_pytorch_fulldata/model_meta.json +128 -0
  54. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.png +0 -0
  55. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.txt +1 -0
  56. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model.pth +0 -0
  57. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model_meta.json +49 -0
  58. rapidtide/data/models/model_revised_tf2/model.keras +0 -0
  59. rapidtide/data/models/{model_serdar → model_revised_tf2}/model_meta.json +1 -1
  60. rapidtide/data/models/model_serdar2_tf2/model.keras +0 -0
  61. rapidtide/data/models/{model_serdar2 → model_serdar2_tf2}/model_meta.json +1 -1
  62. rapidtide/data/models/model_serdar_tf2/model.keras +0 -0
  63. rapidtide/data/models/{model_revised → model_serdar_tf2}/model_meta.json +1 -1
  64. rapidtide/data/reference/HCP1200v2_MTT_2mm.nii.gz +0 -0
  65. rapidtide/data/reference/HCP1200v2_binmask_2mm.nii.gz +0 -0
  66. rapidtide/data/reference/HCP1200v2_csf_2mm.nii.gz +0 -0
  67. rapidtide/data/reference/HCP1200v2_gray_2mm.nii.gz +0 -0
  68. rapidtide/data/reference/HCP1200v2_graylaghist.json +7 -0
  69. rapidtide/data/reference/HCP1200v2_graylaghist.tsv.gz +0 -0
  70. rapidtide/data/reference/HCP1200v2_laghist.json +7 -0
  71. rapidtide/data/reference/HCP1200v2_laghist.tsv.gz +0 -0
  72. rapidtide/data/reference/HCP1200v2_mask_2mm.nii.gz +0 -0
  73. rapidtide/data/reference/HCP1200v2_maxcorr_2mm.nii.gz +0 -0
  74. rapidtide/data/reference/HCP1200v2_maxtime_2mm.nii.gz +0 -0
  75. rapidtide/data/reference/HCP1200v2_maxwidth_2mm.nii.gz +0 -0
  76. rapidtide/data/reference/HCP1200v2_negmask_2mm.nii.gz +0 -0
  77. rapidtide/data/reference/HCP1200v2_timepercentile_2mm.nii.gz +0 -0
  78. rapidtide/data/reference/HCP1200v2_white_2mm.nii.gz +0 -0
  79. rapidtide/data/reference/HCP1200v2_whitelaghist.json +7 -0
  80. rapidtide/data/reference/HCP1200v2_whitelaghist.tsv.gz +0 -0
  81. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2.xml +131 -0
  82. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_regions.txt +60 -0
  83. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_space-MNI152NLin6Asym_2mm.nii.gz +0 -0
  84. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm.nii.gz +0 -0
  85. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm_mask.nii.gz +0 -0
  86. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
  87. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL2_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
  88. rapidtide/data/reference/MNI152_T1_1mm_Brain_FAST_seg.nii.gz +0 -0
  89. rapidtide/data/reference/MNI152_T1_1mm_Brain_Mask.nii.gz +0 -0
  90. rapidtide/data/reference/MNI152_T1_2mm_Brain_FAST_seg.nii.gz +0 -0
  91. rapidtide/data/reference/MNI152_T1_2mm_Brain_Mask.nii.gz +0 -0
  92. rapidtide/decorators.py +91 -0
  93. rapidtide/dlfilter.py +2553 -414
  94. rapidtide/dlfiltertorch.py +5201 -0
  95. rapidtide/externaltools.py +328 -13
  96. rapidtide/fMRIData_class.py +178 -0
  97. rapidtide/ffttools.py +168 -0
  98. rapidtide/filter.py +2704 -1462
  99. rapidtide/fit.py +2361 -579
  100. rapidtide/genericmultiproc.py +197 -0
  101. rapidtide/happy_supportfuncs.py +3255 -548
  102. rapidtide/helper_classes.py +590 -1181
  103. rapidtide/io.py +2569 -468
  104. rapidtide/linfitfiltpass.py +784 -0
  105. rapidtide/makelaggedtcs.py +267 -97
  106. rapidtide/maskutil.py +555 -25
  107. rapidtide/miscmath.py +867 -137
  108. rapidtide/multiproc.py +217 -44
  109. rapidtide/patchmatch.py +752 -0
  110. rapidtide/peakeval.py +32 -32
  111. rapidtide/ppgproc.py +2205 -0
  112. rapidtide/qualitycheck.py +353 -40
  113. rapidtide/refinedelay.py +854 -0
  114. rapidtide/refineregressor.py +939 -0
  115. rapidtide/resample.py +725 -204
  116. rapidtide/scripts/__init__.py +1 -0
  117. rapidtide/scripts/{adjustoffset → adjustoffset.py} +7 -2
  118. rapidtide/scripts/{aligntcs → aligntcs.py} +7 -2
  119. rapidtide/scripts/{applydlfilter → applydlfilter.py} +7 -2
  120. rapidtide/scripts/applyppgproc.py +28 -0
  121. rapidtide/scripts/{atlasaverage → atlasaverage.py} +7 -2
  122. rapidtide/scripts/{atlastool → atlastool.py} +7 -2
  123. rapidtide/scripts/{calcicc → calcicc.py} +7 -2
  124. rapidtide/scripts/{calctexticc → calctexticc.py} +7 -2
  125. rapidtide/scripts/{calcttest → calcttest.py} +7 -2
  126. rapidtide/scripts/{ccorrica → ccorrica.py} +7 -2
  127. rapidtide/scripts/delayvar.py +28 -0
  128. rapidtide/scripts/{diffrois → diffrois.py} +7 -2
  129. rapidtide/scripts/{endtidalproc → endtidalproc.py} +7 -2
  130. rapidtide/scripts/{fdica → fdica.py} +7 -2
  131. rapidtide/scripts/{filtnifti → filtnifti.py} +7 -2
  132. rapidtide/scripts/{filttc → filttc.py} +7 -2
  133. rapidtide/scripts/{fingerprint → fingerprint.py} +20 -16
  134. rapidtide/scripts/{fixtr → fixtr.py} +7 -2
  135. rapidtide/scripts/{gmscalc → gmscalc.py} +7 -2
  136. rapidtide/scripts/{happy → happy.py} +7 -2
  137. rapidtide/scripts/{happy2std → happy2std.py} +7 -2
  138. rapidtide/scripts/{happywarp → happywarp.py} +8 -4
  139. rapidtide/scripts/{histnifti → histnifti.py} +7 -2
  140. rapidtide/scripts/{histtc → histtc.py} +7 -2
  141. rapidtide/scripts/{glmfilt → linfitfilt.py} +7 -4
  142. rapidtide/scripts/{localflow → localflow.py} +7 -2
  143. rapidtide/scripts/{mergequality → mergequality.py} +7 -2
  144. rapidtide/scripts/{pairproc → pairproc.py} +7 -2
  145. rapidtide/scripts/{pairwisemergenifti → pairwisemergenifti.py} +7 -2
  146. rapidtide/scripts/{physiofreq → physiofreq.py} +7 -2
  147. rapidtide/scripts/{pixelcomp → pixelcomp.py} +7 -2
  148. rapidtide/scripts/{plethquality → plethquality.py} +7 -2
  149. rapidtide/scripts/{polyfitim → polyfitim.py} +7 -2
  150. rapidtide/scripts/{proj2flow → proj2flow.py} +7 -2
  151. rapidtide/scripts/{rankimage → rankimage.py} +7 -2
  152. rapidtide/scripts/{rapidtide → rapidtide.py} +7 -2
  153. rapidtide/scripts/{rapidtide2std → rapidtide2std.py} +7 -2
  154. rapidtide/scripts/{resamplenifti → resamplenifti.py} +7 -2
  155. rapidtide/scripts/{resampletc → resampletc.py} +7 -2
  156. rapidtide/scripts/retrolagtcs.py +28 -0
  157. rapidtide/scripts/retroregress.py +28 -0
  158. rapidtide/scripts/{roisummarize → roisummarize.py} +7 -2
  159. rapidtide/scripts/{runqualitycheck → runqualitycheck.py} +7 -2
  160. rapidtide/scripts/{showarbcorr → showarbcorr.py} +7 -2
  161. rapidtide/scripts/{showhist → showhist.py} +7 -2
  162. rapidtide/scripts/{showstxcorr → showstxcorr.py} +7 -2
  163. rapidtide/scripts/{showtc → showtc.py} +7 -2
  164. rapidtide/scripts/{showxcorr_legacy → showxcorr_legacy.py} +8 -8
  165. rapidtide/scripts/{showxcorrx → showxcorrx.py} +7 -2
  166. rapidtide/scripts/{showxy → showxy.py} +7 -2
  167. rapidtide/scripts/{simdata → simdata.py} +7 -2
  168. rapidtide/scripts/{spatialdecomp → spatialdecomp.py} +7 -2
  169. rapidtide/scripts/{spatialfit → spatialfit.py} +7 -2
  170. rapidtide/scripts/{spatialmi → spatialmi.py} +7 -2
  171. rapidtide/scripts/{spectrogram → spectrogram.py} +7 -2
  172. rapidtide/scripts/stupidramtricks.py +238 -0
  173. rapidtide/scripts/{synthASL → synthASL.py} +7 -2
  174. rapidtide/scripts/{tcfrom2col → tcfrom2col.py} +7 -2
  175. rapidtide/scripts/{tcfrom3col → tcfrom3col.py} +7 -2
  176. rapidtide/scripts/{temporaldecomp → temporaldecomp.py} +7 -2
  177. rapidtide/scripts/{testhrv → testhrv.py} +1 -1
  178. rapidtide/scripts/{threeD → threeD.py} +7 -2
  179. rapidtide/scripts/{tidepool → tidepool.py} +7 -2
  180. rapidtide/scripts/{variabilityizer → variabilityizer.py} +7 -2
  181. rapidtide/simFuncClasses.py +2113 -0
  182. rapidtide/simfuncfit.py +312 -108
  183. rapidtide/stats.py +579 -247
  184. rapidtide/tests/.coveragerc +27 -6
  185. rapidtide-2.9.5.data/scripts/fdica → rapidtide/tests/cleanposttest +4 -6
  186. rapidtide/tests/happycomp +9 -0
  187. rapidtide/tests/resethappytargets +1 -1
  188. rapidtide/tests/resetrapidtidetargets +1 -1
  189. rapidtide/tests/resettargets +1 -1
  190. rapidtide/tests/runlocaltest +3 -3
  191. rapidtide/tests/showkernels +1 -1
  192. rapidtide/tests/test_aliasedcorrelate.py +4 -4
  193. rapidtide/tests/test_aligntcs.py +1 -1
  194. rapidtide/tests/test_calcicc.py +1 -1
  195. rapidtide/tests/test_cleanregressor.py +184 -0
  196. rapidtide/tests/test_congrid.py +70 -81
  197. rapidtide/tests/test_correlate.py +1 -1
  198. rapidtide/tests/test_corrpass.py +4 -4
  199. rapidtide/tests/test_delayestimation.py +54 -59
  200. rapidtide/tests/test_dlfiltertorch.py +437 -0
  201. rapidtide/tests/test_doresample.py +2 -2
  202. rapidtide/tests/test_externaltools.py +69 -0
  203. rapidtide/tests/test_fastresampler.py +9 -5
  204. rapidtide/tests/test_filter.py +96 -57
  205. rapidtide/tests/test_findmaxlag.py +50 -19
  206. rapidtide/tests/test_fullrunhappy_v1.py +15 -10
  207. rapidtide/tests/test_fullrunhappy_v2.py +19 -13
  208. rapidtide/tests/test_fullrunhappy_v3.py +28 -13
  209. rapidtide/tests/test_fullrunhappy_v4.py +30 -11
  210. rapidtide/tests/test_fullrunhappy_v5.py +62 -0
  211. rapidtide/tests/test_fullrunrapidtide_v1.py +61 -7
  212. rapidtide/tests/test_fullrunrapidtide_v2.py +27 -15
  213. rapidtide/tests/test_fullrunrapidtide_v3.py +28 -8
  214. rapidtide/tests/test_fullrunrapidtide_v4.py +16 -8
  215. rapidtide/tests/test_fullrunrapidtide_v5.py +15 -6
  216. rapidtide/tests/test_fullrunrapidtide_v6.py +142 -0
  217. rapidtide/tests/test_fullrunrapidtide_v7.py +114 -0
  218. rapidtide/tests/test_fullrunrapidtide_v8.py +66 -0
  219. rapidtide/tests/test_getparsers.py +158 -0
  220. rapidtide/tests/test_io.py +59 -18
  221. rapidtide/tests/{test_glmpass.py → test_linfitfiltpass.py} +10 -10
  222. rapidtide/tests/test_mi.py +1 -1
  223. rapidtide/tests/test_miscmath.py +1 -1
  224. rapidtide/tests/test_motionregress.py +5 -5
  225. rapidtide/tests/test_nullcorr.py +6 -9
  226. rapidtide/tests/test_padvec.py +216 -0
  227. rapidtide/tests/test_parserfuncs.py +101 -0
  228. rapidtide/tests/test_phaseanalysis.py +1 -1
  229. rapidtide/tests/test_rapidtideparser.py +59 -53
  230. rapidtide/tests/test_refinedelay.py +296 -0
  231. rapidtide/tests/test_runmisc.py +5 -5
  232. rapidtide/tests/test_sharedmem.py +60 -0
  233. rapidtide/tests/test_simroundtrip.py +132 -0
  234. rapidtide/tests/test_simulate.py +1 -1
  235. rapidtide/tests/test_stcorrelate.py +4 -2
  236. rapidtide/tests/test_timeshift.py +2 -2
  237. rapidtide/tests/test_valtoindex.py +1 -1
  238. rapidtide/tests/test_zRapidtideDataset.py +5 -3
  239. rapidtide/tests/utils.py +10 -9
  240. rapidtide/tidepoolTemplate.py +88 -70
  241. rapidtide/tidepoolTemplate.ui +60 -46
  242. rapidtide/tidepoolTemplate_alt.py +88 -53
  243. rapidtide/tidepoolTemplate_alt.ui +62 -52
  244. rapidtide/tidepoolTemplate_alt_qt6.py +921 -0
  245. rapidtide/tidepoolTemplate_big.py +1125 -0
  246. rapidtide/tidepoolTemplate_big.ui +2386 -0
  247. rapidtide/tidepoolTemplate_big_qt6.py +1129 -0
  248. rapidtide/tidepoolTemplate_qt6.py +793 -0
  249. rapidtide/util.py +1389 -148
  250. rapidtide/voxelData.py +1048 -0
  251. rapidtide/wiener.py +138 -25
  252. rapidtide/wiener2.py +114 -8
  253. rapidtide/workflows/adjustoffset.py +107 -5
  254. rapidtide/workflows/aligntcs.py +86 -3
  255. rapidtide/workflows/applydlfilter.py +231 -89
  256. rapidtide/workflows/applyppgproc.py +540 -0
  257. rapidtide/workflows/atlasaverage.py +309 -48
  258. rapidtide/workflows/atlastool.py +130 -9
  259. rapidtide/workflows/calcSimFuncMap.py +490 -0
  260. rapidtide/workflows/calctexticc.py +202 -10
  261. rapidtide/workflows/ccorrica.py +123 -15
  262. rapidtide/workflows/cleanregressor.py +415 -0
  263. rapidtide/workflows/delayvar.py +1268 -0
  264. rapidtide/workflows/diffrois.py +84 -6
  265. rapidtide/workflows/endtidalproc.py +149 -9
  266. rapidtide/workflows/fdica.py +197 -17
  267. rapidtide/workflows/filtnifti.py +71 -4
  268. rapidtide/workflows/filttc.py +76 -5
  269. rapidtide/workflows/fitSimFuncMap.py +578 -0
  270. rapidtide/workflows/fixtr.py +74 -4
  271. rapidtide/workflows/gmscalc.py +116 -6
  272. rapidtide/workflows/happy.py +1242 -480
  273. rapidtide/workflows/happy2std.py +145 -13
  274. rapidtide/workflows/happy_parser.py +277 -59
  275. rapidtide/workflows/histnifti.py +120 -4
  276. rapidtide/workflows/histtc.py +85 -4
  277. rapidtide/workflows/{glmfilt.py → linfitfilt.py} +128 -14
  278. rapidtide/workflows/localflow.py +329 -29
  279. rapidtide/workflows/mergequality.py +80 -4
  280. rapidtide/workflows/niftidecomp.py +323 -19
  281. rapidtide/workflows/niftistats.py +178 -8
  282. rapidtide/workflows/pairproc.py +99 -5
  283. rapidtide/workflows/pairwisemergenifti.py +86 -3
  284. rapidtide/workflows/parser_funcs.py +1488 -56
  285. rapidtide/workflows/physiofreq.py +139 -12
  286. rapidtide/workflows/pixelcomp.py +211 -9
  287. rapidtide/workflows/plethquality.py +105 -23
  288. rapidtide/workflows/polyfitim.py +159 -19
  289. rapidtide/workflows/proj2flow.py +76 -3
  290. rapidtide/workflows/rankimage.py +115 -8
  291. rapidtide/workflows/rapidtide.py +1833 -1919
  292. rapidtide/workflows/rapidtide2std.py +101 -3
  293. rapidtide/workflows/rapidtide_parser.py +607 -372
  294. rapidtide/workflows/refineDelayMap.py +249 -0
  295. rapidtide/workflows/refineRegressor.py +1215 -0
  296. rapidtide/workflows/regressfrommaps.py +308 -0
  297. rapidtide/workflows/resamplenifti.py +86 -4
  298. rapidtide/workflows/resampletc.py +92 -4
  299. rapidtide/workflows/retrolagtcs.py +442 -0
  300. rapidtide/workflows/retroregress.py +1501 -0
  301. rapidtide/workflows/roisummarize.py +176 -7
  302. rapidtide/workflows/runqualitycheck.py +72 -7
  303. rapidtide/workflows/showarbcorr.py +172 -16
  304. rapidtide/workflows/showhist.py +87 -3
  305. rapidtide/workflows/showstxcorr.py +161 -4
  306. rapidtide/workflows/showtc.py +172 -10
  307. rapidtide/workflows/showxcorrx.py +250 -62
  308. rapidtide/workflows/showxy.py +186 -16
  309. rapidtide/workflows/simdata.py +418 -112
  310. rapidtide/workflows/spatialfit.py +83 -8
  311. rapidtide/workflows/spatialmi.py +252 -29
  312. rapidtide/workflows/spectrogram.py +306 -33
  313. rapidtide/workflows/synthASL.py +157 -6
  314. rapidtide/workflows/tcfrom2col.py +77 -3
  315. rapidtide/workflows/tcfrom3col.py +75 -3
  316. rapidtide/workflows/tidepool.py +3829 -666
  317. rapidtide/workflows/utils.py +45 -19
  318. rapidtide/workflows/utils_doc.py +293 -0
  319. rapidtide/workflows/variabilityizer.py +118 -5
  320. {rapidtide-2.9.5.dist-info → rapidtide-3.1.3.dist-info}/METADATA +30 -223
  321. rapidtide-3.1.3.dist-info/RECORD +393 -0
  322. {rapidtide-2.9.5.dist-info → rapidtide-3.1.3.dist-info}/WHEEL +1 -1
  323. rapidtide-3.1.3.dist-info/entry_points.txt +65 -0
  324. rapidtide-3.1.3.dist-info/top_level.txt +2 -0
  325. rapidtide/calcandfitcorrpairs.py +0 -262
  326. rapidtide/data/examples/src/testoutputsize +0 -45
  327. rapidtide/data/models/model_revised/model.h5 +0 -0
  328. rapidtide/data/models/model_serdar/model.h5 +0 -0
  329. rapidtide/data/models/model_serdar2/model.h5 +0 -0
  330. rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm.nii.gz +0 -0
  331. rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm_mask.nii.gz +0 -0
  332. rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm.nii.gz +0 -0
  333. rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm_mask.nii.gz +0 -0
  334. rapidtide/data/reference/HCP1200_binmask_2mm_2009c_asym.nii.gz +0 -0
  335. rapidtide/data/reference/HCP1200_lag_2mm_2009c_asym.nii.gz +0 -0
  336. rapidtide/data/reference/HCP1200_mask_2mm_2009c_asym.nii.gz +0 -0
  337. rapidtide/data/reference/HCP1200_negmask_2mm_2009c_asym.nii.gz +0 -0
  338. rapidtide/data/reference/HCP1200_sigma_2mm_2009c_asym.nii.gz +0 -0
  339. rapidtide/data/reference/HCP1200_strength_2mm_2009c_asym.nii.gz +0 -0
  340. rapidtide/glmpass.py +0 -434
  341. rapidtide/refine_factored.py +0 -641
  342. rapidtide/scripts/retroglm +0 -23
  343. rapidtide/workflows/glmfrommaps.py +0 -202
  344. rapidtide/workflows/retroglm.py +0 -643
  345. rapidtide-2.9.5.data/scripts/adjustoffset +0 -23
  346. rapidtide-2.9.5.data/scripts/aligntcs +0 -23
  347. rapidtide-2.9.5.data/scripts/applydlfilter +0 -23
  348. rapidtide-2.9.5.data/scripts/atlasaverage +0 -23
  349. rapidtide-2.9.5.data/scripts/atlastool +0 -23
  350. rapidtide-2.9.5.data/scripts/calcicc +0 -22
  351. rapidtide-2.9.5.data/scripts/calctexticc +0 -23
  352. rapidtide-2.9.5.data/scripts/calcttest +0 -22
  353. rapidtide-2.9.5.data/scripts/ccorrica +0 -23
  354. rapidtide-2.9.5.data/scripts/diffrois +0 -23
  355. rapidtide-2.9.5.data/scripts/endtidalproc +0 -23
  356. rapidtide-2.9.5.data/scripts/filtnifti +0 -23
  357. rapidtide-2.9.5.data/scripts/filttc +0 -23
  358. rapidtide-2.9.5.data/scripts/fingerprint +0 -593
  359. rapidtide-2.9.5.data/scripts/fixtr +0 -23
  360. rapidtide-2.9.5.data/scripts/glmfilt +0 -24
  361. rapidtide-2.9.5.data/scripts/gmscalc +0 -22
  362. rapidtide-2.9.5.data/scripts/happy +0 -25
  363. rapidtide-2.9.5.data/scripts/happy2std +0 -23
  364. rapidtide-2.9.5.data/scripts/happywarp +0 -350
  365. rapidtide-2.9.5.data/scripts/histnifti +0 -23
  366. rapidtide-2.9.5.data/scripts/histtc +0 -23
  367. rapidtide-2.9.5.data/scripts/localflow +0 -23
  368. rapidtide-2.9.5.data/scripts/mergequality +0 -23
  369. rapidtide-2.9.5.data/scripts/pairproc +0 -23
  370. rapidtide-2.9.5.data/scripts/pairwisemergenifti +0 -23
  371. rapidtide-2.9.5.data/scripts/physiofreq +0 -23
  372. rapidtide-2.9.5.data/scripts/pixelcomp +0 -23
  373. rapidtide-2.9.5.data/scripts/plethquality +0 -23
  374. rapidtide-2.9.5.data/scripts/polyfitim +0 -23
  375. rapidtide-2.9.5.data/scripts/proj2flow +0 -23
  376. rapidtide-2.9.5.data/scripts/rankimage +0 -23
  377. rapidtide-2.9.5.data/scripts/rapidtide +0 -23
  378. rapidtide-2.9.5.data/scripts/rapidtide2std +0 -23
  379. rapidtide-2.9.5.data/scripts/resamplenifti +0 -23
  380. rapidtide-2.9.5.data/scripts/resampletc +0 -23
  381. rapidtide-2.9.5.data/scripts/retroglm +0 -23
  382. rapidtide-2.9.5.data/scripts/roisummarize +0 -23
  383. rapidtide-2.9.5.data/scripts/runqualitycheck +0 -23
  384. rapidtide-2.9.5.data/scripts/showarbcorr +0 -23
  385. rapidtide-2.9.5.data/scripts/showhist +0 -23
  386. rapidtide-2.9.5.data/scripts/showstxcorr +0 -23
  387. rapidtide-2.9.5.data/scripts/showtc +0 -23
  388. rapidtide-2.9.5.data/scripts/showxcorr_legacy +0 -536
  389. rapidtide-2.9.5.data/scripts/showxcorrx +0 -23
  390. rapidtide-2.9.5.data/scripts/showxy +0 -23
  391. rapidtide-2.9.5.data/scripts/simdata +0 -23
  392. rapidtide-2.9.5.data/scripts/spatialdecomp +0 -23
  393. rapidtide-2.9.5.data/scripts/spatialfit +0 -23
  394. rapidtide-2.9.5.data/scripts/spatialmi +0 -23
  395. rapidtide-2.9.5.data/scripts/spectrogram +0 -23
  396. rapidtide-2.9.5.data/scripts/synthASL +0 -23
  397. rapidtide-2.9.5.data/scripts/tcfrom2col +0 -23
  398. rapidtide-2.9.5.data/scripts/tcfrom3col +0 -23
  399. rapidtide-2.9.5.data/scripts/temporaldecomp +0 -23
  400. rapidtide-2.9.5.data/scripts/threeD +0 -236
  401. rapidtide-2.9.5.data/scripts/tidepool +0 -23
  402. rapidtide-2.9.5.data/scripts/variabilityizer +0 -23
  403. rapidtide-2.9.5.dist-info/RECORD +0 -357
  404. rapidtide-2.9.5.dist-info/top_level.txt +0 -86
  405. {rapidtide-2.9.5.dist-info → rapidtide-3.1.3.dist-info/licenses}/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
  #
4
- # Copyright 2016-2024 Blaise Frederick
4
+ # Copyright 2016-2025 Blaise Frederick
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -18,39 +18,47 @@
18
18
  #
19
19
  import argparse
20
20
  import sys
21
+ from typing import Any
21
22
 
22
23
  import numpy as np
24
+ from numpy.typing import NDArray
25
+ from statsmodels.robust import mad
23
26
 
24
27
  import rapidtide.io as tide_io
25
28
  import rapidtide.maskutil as tide_mask
29
+ import rapidtide.stats as tide_stats
26
30
  import rapidtide.workflows.parser_funcs as pf
27
31
 
28
32
 
29
- def summarize(thevoxels, method="mean"):
30
- theshape = thevoxels.shape
31
- if len(theshape) > 1:
32
- numtimepoints = theshape[1]
33
- else:
34
- numtimepoints = 1
33
+ def _get_parser() -> Any:
34
+ """
35
+ Construct and return an argument parser for the atlasaverage command-line tool.
35
36
 
36
- if method == "mean":
37
- themethod = np.mean
38
- elif method == "sum":
39
- themethod = np.sum
40
- elif method == "median":
41
- themethod = np.median
42
- else:
43
- print(f"illegal summary method {method} in summarize")
44
- sys.exit()
37
+ This function builds an `argparse.ArgumentParser` object configured with all
38
+ required and optional arguments needed to run the `atlasaverage` utility. It
39
+ handles input validation for file paths and defines various options for
40
+ normalizing, summarizing, and filtering data within atlas regions.
45
41
 
46
- if numtimepoints > 1:
47
- regionsummary = np.nan_to_num(themethod(thevoxels, axis=0))
48
- else:
49
- regionsummary = np.nan_to_num(themethod(thevoxels))
50
- return regionsummary
42
+ Returns
43
+ -------
44
+ argparse.ArgumentParser
45
+ Configured argument parser object for the atlasaverage tool.
51
46
 
47
+ Notes
48
+ -----
49
+ The parser is set up with:
50
+ - Two required positional arguments: `datafile` and `templatefile`.
51
+ - One required positional argument: `outputroot`.
52
+ - Several optional arguments controlling normalization, summarization,
53
+ masking, and output formatting.
52
54
 
53
- def _get_parser():
55
+ Examples
56
+ --------
57
+ >>> parser = _get_parser()
58
+ >>> args = parser.parse_args(['data.nii', 'atlas.nii', 'output'])
59
+ >>> print(args.datafile)
60
+ 'data.nii'
61
+ """
54
62
  # get the command line parameters
55
63
  parser = argparse.ArgumentParser(
56
64
  prog="atlasaverage",
@@ -83,13 +91,26 @@ def _get_parser():
83
91
  ),
84
92
  default="none",
85
93
  )
94
+ parser.add_argument(
95
+ "--numpercentiles",
96
+ dest="numpercentiles",
97
+ metavar="NPCT",
98
+ type=int,
99
+ help=(
100
+ "Number of evenly spaced percentiles between 0 and 100 (not including the end points) to calculate "
101
+ "in each region. For example, If NPCT = 1, calculate the 0th, 50th, and 100th percentiles."
102
+ ),
103
+ default=1,
104
+ )
86
105
  parser.add_argument(
87
106
  "--summarymethod",
88
107
  dest="summarymethod",
89
108
  action="store",
90
109
  type=str,
91
- choices=["mean", "median", "sum"],
92
- help=("Method to summarize a region. Choices are 'mean' (default), 'median', and 'sum'."),
110
+ choices=["mean", "median", "sum", "std", "MAD", "CoV"],
111
+ help=(
112
+ "Method to summarize the voxels in a region. Choices are 'mean' (default), 'median', 'sum', 'std', 'MAD', and 'CoV'."
113
+ ),
93
114
  default="mean",
94
115
  )
95
116
  parser.add_argument(
@@ -108,6 +129,15 @@ def _get_parser():
108
129
  ),
109
130
  default=None,
110
131
  )
132
+ parser.add_argument(
133
+ "--regionlabelfile",
134
+ type=lambda x: pf.is_valid_file(parser, x),
135
+ help=(
136
+ "The name of of a text file containing the labels of the regions, one per line. The first line is "
137
+ "the label integer value 1, etc."
138
+ ),
139
+ default=None,
140
+ )
111
141
  parser.add_argument(
112
142
  "--includemask",
113
143
  dest="includespec",
@@ -167,7 +197,160 @@ def _get_parser():
167
197
  return parser
168
198
 
169
199
 
170
- def atlasaverage(args):
200
+ def summarizevoxels(thevoxels: NDArray, method: str = "mean") -> float:
201
+ """
202
+ Summarize voxel data using specified statistical method.
203
+
204
+ Parameters
205
+ ----------
206
+ thevoxels : ndarray
207
+ Input voxel data array. Can be 1D or 2D, where 2D arrays are interpreted
208
+ as time series with shape (voxels, timepoints).
209
+ method : str, default="mean"
210
+ Summary method to apply. Options are:
211
+ - "mean": Compute mean along axis 0
212
+ - "sum": Compute sum along axis 0
213
+ - "median": Compute median along axis 0
214
+ - "std": Compute standard deviation along axis 0
215
+ - "MAD": Compute median absolute deviation along axis 0
216
+ - "CoV": Compute coefficient of variation (std/mean) along axis 0
217
+
218
+ Returns
219
+ -------
220
+ float or ndarray
221
+ Summary statistic(s) of the voxel data. Returns a scalar for 1D input
222
+ or array of statistics for 2D input along axis 0.
223
+
224
+ Notes
225
+ -----
226
+ - NaN values are converted to zero using `np.nan_to_num` before computation
227
+ - For coefficient of variation ("CoV"), the result is multiplied by 100 to
228
+ express as percentage
229
+ - When input is 1D, time dimension is treated as single timepoint
230
+ - The function handles both 1D and 2D input arrays appropriately
231
+
232
+ Examples
233
+ --------
234
+ >>> import numpy as np
235
+ >>> voxels = np.array([[1, 2, 3], [4, 5, 6]])
236
+ >>> summarizevoxels(voxels, method="mean")
237
+ array([2.5, 3.5, 4.5])
238
+
239
+ >>> summarizevoxels(voxels, method="CoV")
240
+ array([40.82482905, 33.33333333, 25. ])
241
+ """
242
+ theshape = thevoxels.shape
243
+ if len(theshape) > 1:
244
+ numtimepoints = theshape[1]
245
+ else:
246
+ numtimepoints = 1
247
+
248
+ if method == "CoV":
249
+ if numtimepoints > 1:
250
+ regionsummary = 100.0 * np.nan_to_num(
251
+ np.std(thevoxels, axis=0) / np.mean(thevoxels, axis=0)
252
+ )
253
+ else:
254
+ regionsummary = 100.0 * np.nan_to_num(np.std(thevoxels) / np.mean(thevoxels))
255
+ else:
256
+ if method == "mean":
257
+ themethod = np.mean
258
+ elif method == "sum":
259
+ themethod = np.sum
260
+ elif method == "median":
261
+ themethod = np.median
262
+ elif method == "std":
263
+ themethod = np.std
264
+ elif method == "MAD":
265
+ themethod = mad
266
+ else:
267
+ print(f"illegal summary method {method} in summarizevoxels")
268
+ sys.exit()
269
+
270
+ if numtimepoints > 1:
271
+ regionsummary = np.nan_to_num(themethod(thevoxels, axis=0))
272
+ else:
273
+ regionsummary = np.nan_to_num(themethod(thevoxels))
274
+ return regionsummary
275
+
276
+
277
+ def atlasaverage(args: Any) -> None:
278
+ """
279
+ Compute average timecourses or summary statistics for regions defined by an atlas.
280
+
281
+ This function reads fMRI data and a template (atlas) file, extracts timecourses
282
+ or summary statistics for each region in the atlas, and saves the results to
283
+ output files. It supports multiple normalization methods and can process both
284
+ 3D and 4D input data.
285
+
286
+ Parameters
287
+ ----------
288
+ args : argparse.Namespace
289
+ Arguments parsed from command line. Expected attributes include:
290
+ - datafile : str
291
+ Path to the input fMRI NIfTI file.
292
+ - templatefile : str
293
+ Path to the template NIfTI file defining regions.
294
+ - normmethod : str
295
+ Normalization method for timecourses: 'none', 'pct', 'std', 'var', 'p2p'.
296
+ - outputroot : str
297
+ Root name for output files.
298
+ - debug : bool
299
+ If True, enable debug printing and save intermediate masks.
300
+ - includespec : str or None
301
+ Specification for including voxels in analysis.
302
+ - excludespec : str or None
303
+ Specification for excluding voxels from analysis.
304
+ - extramaskname : str or None
305
+ Path to an additional mask file.
306
+ - regionlabelfile : str or None
307
+ Path to a file containing region labels.
308
+ - regionlistfile : str or None
309
+ Path to a file listing regions to include.
310
+ - summarymethod : str
311
+ Method for summarizing voxel values (e.g., 'mean', 'median').
312
+ - datalabel : str or None
313
+ Label to prepend to output summary.
314
+ - ignorezeros : bool
315
+ If True, exclude zero voxels when computing summaries.
316
+ - numpercentiles : int
317
+ Number of percentiles to compute for each region.
318
+ - headerline : bool
319
+ If True, include a header line in the summary CSV.
320
+
321
+ Returns
322
+ -------
323
+ None
324
+ This function does not return a value but writes output files to disk.
325
+
326
+ Notes
327
+ -----
328
+ For 4D data, the function computes timecourses for each region and saves them
329
+ as a TSV file. For 3D data, it computes summary statistics and saves both
330
+ a labeled NIfTI file and a CSV/TSV summary.
331
+
332
+ Examples
333
+ --------
334
+ >>> import argparse
335
+ >>> args = argparse.Namespace(
336
+ ... datafile='fmri.nii.gz',
337
+ ... templatefile='atlas.nii.gz',
338
+ ... normmethod='std',
339
+ ... outputroot='output',
340
+ ... debug=False,
341
+ ... includespec=None,
342
+ ... excludespec=None,
343
+ ... extramaskname=None,
344
+ ... regionlabelfile=None,
345
+ ... regionlistfile=None,
346
+ ... summarymethod='mean',
347
+ ... datalabel=None,
348
+ ... ignorezeros=False,
349
+ ... numpercentiles=5,
350
+ ... headerline=True
351
+ ... )
352
+ >>> atlasaverage(args)
353
+ """
171
354
  if args.normmethod == "none":
172
355
  print("will not normalize timecourses")
173
356
  elif args.normmethod == "pct":
@@ -197,11 +380,9 @@ def atlasaverage(args):
197
380
  sys.exit()
198
381
 
199
382
  print("reshaping")
200
- xsize = thedims[1]
201
- ysize = thedims[2]
202
- numslices = thedims[3]
203
- numtimepoints = thedims[4]
204
- numvoxels = int(xsize) * int(ysize) * int(numslices)
383
+ xdim, ydim, numslices, numtimepoints = tide_io.parseniftidims(thedims)
384
+ xsize, ysize, slicethickness, tr = tide_io.parseniftisizes(thesizes)
385
+ numvoxels = int(xdim) * int(ydim) * int(numslices)
205
386
 
206
387
  templatevoxels = np.reshape(template_data, numvoxels).astype(int)
207
388
  inputvoxels = np.reshape(input_data, (numvoxels, numtimepoints))
@@ -239,14 +420,14 @@ def atlasaverage(args):
239
420
  numvoxels,
240
421
  extramask=args.extramaskname,
241
422
  )
242
- themask = inputvoxels[:, 0] * 0 + 1
423
+ themask = np.ones_like(inputvoxels[:, 0])
243
424
  if args.debug:
244
425
  print(f"{themask.shape=}")
245
426
  if includemask is not None:
246
427
  themask = themask * includemask.reshape((numvoxels))
247
428
  if args.debug:
248
429
  tide_io.savetonifti(
249
- includemask.reshape((xsize, ysize, numslices)),
430
+ includemask.reshape((xdim, ydim, numslices)),
250
431
  template_hdr,
251
432
  f"{args.outputroot}_includemask",
252
433
  )
@@ -254,7 +435,7 @@ def atlasaverage(args):
254
435
  themask = themask * (1 - excludemask.reshape((numvoxels)))
255
436
  if args.debug:
256
437
  tide_io.savetonifti(
257
- excludemask.reshape((xsize, ysize, numslices)),
438
+ excludemask.reshape((xdim, ydim, numslices)),
258
439
  template_hdr,
259
440
  f"{args.outputroot}_excludemask",
260
441
  )
@@ -262,11 +443,28 @@ def atlasaverage(args):
262
443
  themask = themask * extramask.reshape((numvoxels))
263
444
  if args.debug:
264
445
  tide_io.savetonifti(
265
- extramask.reshape((xsize, ysize, numslices)),
446
+ extramask.reshape((xdim, ydim, numslices)),
266
447
  template_hdr,
267
448
  f"{args.outputroot}_extramask",
268
449
  )
269
450
 
451
+ # get the region names
452
+ numregions = np.max(templatevoxels)
453
+ if args.regionlabelfile is None:
454
+ regionlabels = []
455
+ numdigits = int(np.log10(numregions)) + 1
456
+ for regnum in range(1, numregions + 1):
457
+ regionlabels.append(f"region_{str(regnum).zfill(numdigits)}")
458
+ else:
459
+ regionlabels = tide_io.readlabels(args.regionlabelfile)
460
+ if len(regionlabels) != numregions:
461
+ print(
462
+ "Error: number of labels in label file does not match the number of regions in the template."
463
+ )
464
+ sys.exit()
465
+ if args.debug:
466
+ print(f"Region labels: {regionlabels}")
467
+
270
468
  # decide what regions we will summarize
271
469
  if args.regionlistfile is None:
272
470
  numregions = np.max(templatevoxels)
@@ -274,6 +472,13 @@ def atlasaverage(args):
274
472
  else:
275
473
  regionlist = tide_io.readvec(args.regionlistfile).astype(int)
276
474
  numregions = len(regionlist)
475
+ newlabels = []
476
+ for theregion in range(numregions):
477
+ newlabels.append(regionlabels[theregion])
478
+ regionlabels = newlabels
479
+ if args.debug:
480
+ print(f"Region labels to use: {regionlabels}")
481
+
277
482
  timecourses = np.zeros((numregions, numtimepoints), dtype="float")
278
483
  print(f"{numregions=}, {regionlist=}")
279
484
 
@@ -297,7 +502,7 @@ def atlasaverage(args):
297
502
  theregionvoxels -= themeans[:, None]
298
503
 
299
504
  if args.normmethod == "none":
300
- thenormfac = themeans * 0.0 + 1.0
505
+ thenormfac = np.ones_like(themeans)
301
506
  elif args.normmethod == "pct":
302
507
  thenormfac = themeans
303
508
  elif args.normmethod == "var":
@@ -316,22 +521,36 @@ def atlasaverage(args):
316
521
  if thenormfac[theloc] != 0.0:
317
522
  theregionvoxels[theloc, :] /= thenormfac[theloc]
318
523
  if theregionvoxels.shape[1] > 0:
319
- timecourses[theregion - 1, :] = summarize(
524
+ timecourses[theregion - 1, :] = summarizevoxels(
320
525
  theregionvoxels, method=args.summarymethod
321
526
  )
322
527
  if args.debug:
323
528
  print("timecourses shape:", timecourses.shape)
324
- tide_io.writenpvecs(timecourses, args.outputroot)
529
+ tide_io.writebidstsv(
530
+ args.outputroot,
531
+ timecourses,
532
+ 1.0 / tr,
533
+ columns=regionlabels,
534
+ yaxislabel="delay offset",
535
+ )
325
536
  else:
326
537
  print("processing 3D input file")
327
- outputvoxels = inputvoxels * 0.0
328
- theregnums = []
538
+ outputvoxels = np.zeros_like(inputvoxels)
539
+ thereglabels = []
329
540
  thevals = []
541
+ thepercentiles = []
542
+ theregsizes = []
543
+ thefracs = np.linspace(0.0, 1.0, args.numpercentiles + 2, endpoint=True).tolist()
544
+ numsubregions = len(thefracs) - 1
545
+ segmentedatlasvoxels = np.zeros_like(inputvoxels)
546
+ if args.debug:
547
+ print(f"{len(regionlist)=}, {regionlist=}")
548
+ print(f"{len(regionlabels)=}, {regionlabels=}")
330
549
  if args.datalabel is not None:
331
- theregnums.append("Region")
550
+ thereglabels.append("Region")
332
551
  thevals.append(args.datalabel)
333
552
  for theregion in regionlist:
334
- theregnums.append(str(theregion))
553
+ thereglabels.append(regionlabels[theregion - 1])
335
554
  theregionvoxels = inputvoxels[np.where(templatevoxels * themask == theregion)]
336
555
  initnum = theregionvoxels.shape[0]
337
556
  if args.ignorezeros:
@@ -344,41 +563,83 @@ def atlasaverage(args):
344
563
  if args.debug:
345
564
  print(
346
565
  f"extracting {theregionvoxels.shape[0]} "
347
- f"non-zero voxels from region {theregion} of {numregions}{extrabit}"
566
+ f"non-zero voxels from region {theregion} of {numregions}{extrabit} "
567
+ f"({thereglabels[-1]})"
348
568
  )
349
569
  else:
350
570
  if args.debug:
351
571
  print(
352
572
  f"extracting {theregionvoxels.shape[0]} "
353
- f"voxels from region {theregion} of {numregions}"
573
+ f"voxels from region {theregion} of {numregions} "
574
+ f"({thereglabels[-1]})"
354
575
  )
355
576
  if theregionvoxels.shape[0] > 0:
356
- regionval = summarize(theregionvoxels, method=args.summarymethod)
577
+ regionval = summarizevoxels(theregionvoxels, method=args.summarymethod)
578
+ regionsizes = theregionvoxels.shape[0]
579
+ regionpercentiles = [
580
+ f"{num:.4f}"
581
+ for num in tide_stats.getfracvals(
582
+ theregionvoxels,
583
+ thefracs,
584
+ nozero=True,
585
+ debug=False,
586
+ )
587
+ ]
357
588
  outputvoxels[np.where(templatevoxels == theregion)] = regionval
358
589
  thevals.append(str(regionval))
590
+ theregsizes.append(str(regionsizes))
591
+ thepercentiles.append(regionpercentiles)
359
592
  else:
360
593
  if args.debug:
361
594
  print(f"\tregion {theregion} is empty")
362
595
  thevals.append("None")
596
+ for thesubregion in range(numsubregions):
597
+ scratchvoxels = np.zeros_like(inputvoxels)
598
+ subregionkey = 1 + (theregion - 1) * numsubregions + thesubregion
599
+ lowerlim = float(regionpercentiles[thesubregion])
600
+ upperlim = float(regionpercentiles[thesubregion + 1])
601
+ scratchvoxels[np.where(lowerlim <= inputvoxels)] = subregionkey
602
+ if thesubregion < numsubregions - 1:
603
+ scratchvoxels[np.where(inputvoxels >= upperlim)] = 0
604
+ scratchvoxels[np.where(templatevoxels * themask != theregion)] = 0
605
+ segmentedatlasvoxels += scratchvoxels
363
606
  template_hdr["dim"][4] = 1
364
607
  tide_io.savetonifti(
365
- outputvoxels.reshape((xsize, ysize, numslices)),
608
+ outputvoxels.reshape((xdim, ydim, numslices)),
366
609
  template_hdr,
367
610
  args.outputroot,
368
611
  )
612
+ tide_io.savetonifti(
613
+ segmentedatlasvoxels.reshape((xdim, ydim, numslices)),
614
+ template_hdr,
615
+ args.outputroot + "_percentiles",
616
+ )
617
+
369
618
  if args.includename is not None or args.excludename is not None:
370
619
  tide_io.savetonifti(
371
- (templatevoxels * themask).reshape((xsize, ysize, numslices)),
620
+ (templatevoxels * themask).reshape((xdim, ydim, numslices)),
372
621
  template_hdr,
373
622
  f"{args.outputroot}_maskedatlas",
374
623
  )
375
624
  if args.headerline:
376
625
  tide_io.writevec(
377
- [",".join(theregnums), ",".join(thevals)],
626
+ np.array([",".join(thereglabels), ",".join(thevals)]),
378
627
  f"{args.outputroot}_regionsummaries.csv",
379
628
  )
380
629
  else:
381
630
  tide_io.writevec(
382
- [",".join(thevals)],
631
+ np.array([",".join(thevals)]),
383
632
  f"{args.outputroot}_regionsummaries.csv",
384
633
  )
634
+
635
+ outlines = []
636
+ pctstrings = [f"{num:.0f}" for num in (np.array(thefracs) * 100.0).tolist()]
637
+ outlines.append("Region\tVoxels\t" + "pct-" + "\tpct-".join(pctstrings))
638
+ for idx, region in enumerate(thereglabels):
639
+ outlines.append(
640
+ region + "\t" + theregsizes[idx] + "\t" + "\t".join(thepercentiles[idx])
641
+ )
642
+ tide_io.writevec(
643
+ np.array(outlines),
644
+ f"{args.outputroot}_regionpercentiles.tsv",
645
+ )