rapidtide 2.9.6__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 +92 -42
  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 +2 -2
  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 +108 -92
  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 +587 -1116
  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 +835 -144
  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.6.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 +26 -14
  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 +1785 -1858
  292. rapidtide/workflows/rapidtide2std.py +101 -3
  293. rapidtide/workflows/rapidtide_parser.py +590 -389
  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.6.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.6.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.6.data/scripts/adjustoffset +0 -23
  346. rapidtide-2.9.6.data/scripts/aligntcs +0 -23
  347. rapidtide-2.9.6.data/scripts/applydlfilter +0 -23
  348. rapidtide-2.9.6.data/scripts/atlasaverage +0 -23
  349. rapidtide-2.9.6.data/scripts/atlastool +0 -23
  350. rapidtide-2.9.6.data/scripts/calcicc +0 -22
  351. rapidtide-2.9.6.data/scripts/calctexticc +0 -23
  352. rapidtide-2.9.6.data/scripts/calcttest +0 -22
  353. rapidtide-2.9.6.data/scripts/ccorrica +0 -23
  354. rapidtide-2.9.6.data/scripts/diffrois +0 -23
  355. rapidtide-2.9.6.data/scripts/endtidalproc +0 -23
  356. rapidtide-2.9.6.data/scripts/filtnifti +0 -23
  357. rapidtide-2.9.6.data/scripts/filttc +0 -23
  358. rapidtide-2.9.6.data/scripts/fingerprint +0 -593
  359. rapidtide-2.9.6.data/scripts/fixtr +0 -23
  360. rapidtide-2.9.6.data/scripts/glmfilt +0 -24
  361. rapidtide-2.9.6.data/scripts/gmscalc +0 -22
  362. rapidtide-2.9.6.data/scripts/happy +0 -25
  363. rapidtide-2.9.6.data/scripts/happy2std +0 -23
  364. rapidtide-2.9.6.data/scripts/happywarp +0 -350
  365. rapidtide-2.9.6.data/scripts/histnifti +0 -23
  366. rapidtide-2.9.6.data/scripts/histtc +0 -23
  367. rapidtide-2.9.6.data/scripts/localflow +0 -23
  368. rapidtide-2.9.6.data/scripts/mergequality +0 -23
  369. rapidtide-2.9.6.data/scripts/pairproc +0 -23
  370. rapidtide-2.9.6.data/scripts/pairwisemergenifti +0 -23
  371. rapidtide-2.9.6.data/scripts/physiofreq +0 -23
  372. rapidtide-2.9.6.data/scripts/pixelcomp +0 -23
  373. rapidtide-2.9.6.data/scripts/plethquality +0 -23
  374. rapidtide-2.9.6.data/scripts/polyfitim +0 -23
  375. rapidtide-2.9.6.data/scripts/proj2flow +0 -23
  376. rapidtide-2.9.6.data/scripts/rankimage +0 -23
  377. rapidtide-2.9.6.data/scripts/rapidtide +0 -23
  378. rapidtide-2.9.6.data/scripts/rapidtide2std +0 -23
  379. rapidtide-2.9.6.data/scripts/resamplenifti +0 -23
  380. rapidtide-2.9.6.data/scripts/resampletc +0 -23
  381. rapidtide-2.9.6.data/scripts/retroglm +0 -23
  382. rapidtide-2.9.6.data/scripts/roisummarize +0 -23
  383. rapidtide-2.9.6.data/scripts/runqualitycheck +0 -23
  384. rapidtide-2.9.6.data/scripts/showarbcorr +0 -23
  385. rapidtide-2.9.6.data/scripts/showhist +0 -23
  386. rapidtide-2.9.6.data/scripts/showstxcorr +0 -23
  387. rapidtide-2.9.6.data/scripts/showtc +0 -23
  388. rapidtide-2.9.6.data/scripts/showxcorr_legacy +0 -536
  389. rapidtide-2.9.6.data/scripts/showxcorrx +0 -23
  390. rapidtide-2.9.6.data/scripts/showxy +0 -23
  391. rapidtide-2.9.6.data/scripts/simdata +0 -23
  392. rapidtide-2.9.6.data/scripts/spatialdecomp +0 -23
  393. rapidtide-2.9.6.data/scripts/spatialfit +0 -23
  394. rapidtide-2.9.6.data/scripts/spatialmi +0 -23
  395. rapidtide-2.9.6.data/scripts/spectrogram +0 -23
  396. rapidtide-2.9.6.data/scripts/synthASL +0 -23
  397. rapidtide-2.9.6.data/scripts/tcfrom2col +0 -23
  398. rapidtide-2.9.6.data/scripts/tcfrom3col +0 -23
  399. rapidtide-2.9.6.data/scripts/temporaldecomp +0 -23
  400. rapidtide-2.9.6.data/scripts/threeD +0 -236
  401. rapidtide-2.9.6.data/scripts/tidepool +0 -23
  402. rapidtide-2.9.6.data/scripts/variabilityizer +0 -23
  403. rapidtide-2.9.6.dist-info/RECORD +0 -359
  404. rapidtide-2.9.6.dist-info/top_level.txt +0 -86
  405. {rapidtide-2.9.6.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,19 +18,54 @@
18
18
  #
19
19
  import argparse
20
20
  import sys
21
+ from typing import Any, Tuple, Union
21
22
 
22
23
  import matplotlib.pyplot as plt
23
24
  import numpy as np
24
25
  from mpl_toolkits.axes_grid1 import make_axes_locatable
25
- from scipy.signal import check_NOLA, stft
26
+ from numpy.typing import NDArray
27
+ from scipy.signal import ShortTimeFFT, check_NOLA, stft
26
28
 
27
29
  import rapidtide.io as tide_io
28
30
  from rapidtide.workflows.parser_funcs import is_float, is_int, is_valid_file
29
31
 
32
+ NPFloat2DArray = NDArray[Union[np.float32, np.float64]]
30
33
 
31
- def _get_parser():
34
+
35
+ def _get_parser() -> Any:
32
36
  """
33
- Argument parser for spectrogram
37
+ Argument parser for spectrogram.
38
+
39
+ This function creates and configures an argument parser for the spectrogram
40
+ command-line tool that computes and displays spectrograms from text files
41
+ containing timecourse data.
42
+
43
+ Returns
44
+ -------
45
+ argparse.ArgumentParser
46
+ Configured argument parser object with all required and optional
47
+ arguments for spectrogram computation.
48
+
49
+ Notes
50
+ -----
51
+ The parser expects a text file containing one data point per line and a
52
+ specified sample rate. The spectrogram is computed using the Short-Time
53
+ Fourier Transform (STFT) with configurable segment length.
54
+
55
+ Examples
56
+ --------
57
+ >>> parser = _get_parser()
58
+ >>> args = parser.parse_args(['input.txt', '44100'])
59
+ >>> print(args.textfilename)
60
+ 'input.txt'
61
+ >>> print(args.samplerate)
62
+ 44100
63
+
64
+ See Also
65
+ --------
66
+ is_valid_file : Validates input file existence and readability
67
+ is_float : Validates float conversion
68
+ is_int : Validates integer conversion
34
69
  """
35
70
  parser = argparse.ArgumentParser(
36
71
  prog="spectrogram",
@@ -38,15 +73,14 @@ def _get_parser():
38
73
  allow_abbrev=False,
39
74
  )
40
75
 
41
- # Required arguments
76
+ # Required argument
42
77
  parser.add_argument(
43
- "textfilename",
78
+ "inputfile",
44
79
  type=lambda x: is_valid_file(parser, x),
45
80
  help="The input data file (text file containing a timecourse, one point per line).",
46
81
  )
47
- parser.add_argument(
48
- "samplerate", type=lambda x: is_float(parser, x), help="Sample rate in Hz."
49
- )
82
+
83
+ # Optional arguments
50
84
  parser.add_argument(
51
85
  "--nperseg",
52
86
  dest="nperseg",
@@ -55,6 +89,15 @@ def _get_parser():
55
89
  help=("The number of points to include in each spectrogram (default is 128)."),
56
90
  default=128,
57
91
  )
92
+ parser.add_argument(
93
+ "--samplerate",
94
+ dest="samplerate",
95
+ metavar="RATE",
96
+ action="store",
97
+ type=lambda x: is_float(parser, x),
98
+ help="Sample rate in Hz.",
99
+ default=None,
100
+ )
58
101
  parser.add_argument(
59
102
  "--debug",
60
103
  dest="debug",
@@ -66,32 +109,138 @@ def _get_parser():
66
109
  return parser
67
110
 
68
111
 
69
- def calcspecgram(x, time, nperseg=32, windowtype="hann"):
70
- """Make and plot a log-scaled spectrogram"""
112
+ def calcspecgram(
113
+ x: NDArray[np.floating[Any]],
114
+ time: NDArray[np.floating[Any]],
115
+ nperseg: int = 32,
116
+ windowtype: str = "hann",
117
+ ) -> Tuple[NDArray, NDArray, NDArray, bool]:
118
+ """
119
+ Make and plot a log-scaled spectrogram.
120
+
121
+ This function computes a spectrogram using the Short-Time Fourier Transform (STFT)
122
+ with configurable window parameters and returns frequency, time, and STFT data
123
+ along with a check for invertibility.
124
+
125
+ Parameters
126
+ ----------
127
+ x : NDArray[np.floating[Any]]
128
+ Input signal data to compute the spectrogram for.
129
+ time : NDArray[np.floating[Any]]
130
+ Time vector corresponding to the input signal. Used to calculate sampling
131
+ frequency from the time differences.
132
+ nperseg : int, optional
133
+ Length of each segment for the STFT, by default 32.
134
+ windowtype : str, optional
135
+ Type of window to use for the STFT, by default "hann".
136
+
137
+ Returns
138
+ -------
139
+ freq : ndarray
140
+ Array of frequencies corresponding to the spectrogram rows.
141
+ segtimes : ndarray
142
+ Array of time points corresponding to the spectrogram columns.
143
+ thestft : ndarray
144
+ Short-Time Fourier Transform of the input signal.
145
+ isinvertable : bool
146
+ Boolean flag indicating whether the window satisfies the Non-Overlap
147
+ Additivity of Overlapped Windows (NOLA) constraint for invertibility.
148
+
149
+ Notes
150
+ -----
151
+ The function calculates the sampling frequency from the time vector and uses
152
+ the ShortTimeFFT library to compute the STFT. The window overlap is set to
153
+ ensure maximum overlap (nperseg - 1) for optimal spectrogram resolution.
154
+
155
+ Examples
156
+ --------
157
+ >>> import numpy as np
158
+ >>> from scipy.signal import chirp
159
+ >>> t = np.linspace(0, 1, 1000)
160
+ >>> x = chirp(t, f0=1, f1=10, t1=1, method='linear')
161
+ >>> freq, times, stft, invertible = calcspecgram(x, t)
162
+ >>> print(f"Frequency range: {freq[0]:.2f} to {freq[-1]:.2f} Hz")
163
+ >>> print(f"Time range: {times[0]:.2f} to {times[-1]:.2f} seconds")
164
+ """
71
165
  dt = np.diff(time)[0] # In days...
72
166
  fs = 1.0 / dt
73
- nfft = nperseg
74
167
  noverlap = nperseg - 1
75
168
 
76
- freq, segtimes, thestft = stft(
77
- x,
78
- fs=fs,
79
- window=windowtype,
80
- nperseg=nperseg,
81
- noverlap=noverlap,
82
- nfft=nfft,
83
- detrend="linear",
84
- return_onesided=True,
85
- boundary="zeros",
86
- padded=True,
87
- axis=-1,
169
+ SFT = ShortTimeFFT.from_window(
170
+ windowtype,
171
+ fs,
172
+ nperseg,
173
+ noverlap,
174
+ mfft=nperseg,
175
+ fft_mode="onesided",
176
+ scale_to="magnitude",
177
+ phase_shift=None,
88
178
  )
179
+ freq = SFT.f
180
+ thestft = SFT.stft(x, p0=0, p1=(len(x) - noverlap) // SFT.hop, k_offset=nperseg // 2)
181
+ segtimes = SFT.t(len(x), p0=0, p1=(len(x) - noverlap) // SFT.hop, k_offset=nperseg // 2)
89
182
 
90
183
  isinvertable = check_NOLA(windowtype, nperseg, noverlap, tol=1e-10)
91
184
  return freq, segtimes, thestft, isinvertable
92
185
 
93
186
 
94
- def showspecgram(thestft, time, freq, ax, fig, mode="mag"):
187
+ def showspecgram(
188
+ thestft: Any, time: Any, freq: Any, ax: Any, fig: Any, mode: str = "mag"
189
+ ) -> Tuple[Any, Any]:
190
+ """
191
+ Display a spectrogram plot based on the provided STFT data.
192
+
193
+ This function visualizes the Short-Time Fourier Transform (STFT) of a signal
194
+ in the form of a spectrogram. It supports multiple display modes including
195
+ magnitude, phase, real, and imaginary components. The function also handles
196
+ logarithmic scaling for amplitude values and includes a colorbar with appropriate
197
+ labeling.
198
+
199
+ Parameters
200
+ ----------
201
+ thestft : Any
202
+ The Short-Time Fourier Transform (STFT) of the signal. Typically a 2D array
203
+ where rows correspond to frequency bins and columns to time frames.
204
+ time : Any
205
+ Time vector corresponding to the STFT columns. Used for x-axis labeling.
206
+ freq : Any
207
+ Frequency vector corresponding to the STFT rows. Used for y-axis labeling.
208
+ ax : Any
209
+ Matplotlib axis object on which the spectrogram will be plotted.
210
+ fig : Any
211
+ Matplotlib figure object used to create the colorbar.
212
+ mode : str, optional
213
+ The mode of visualization. Options are:
214
+ - "mag": Magnitude of the STFT (default)
215
+ - "phase": Phase of the STFT
216
+ - "real": Real part of the STFT
217
+ - "imag": Imaginary part of the STFT
218
+
219
+ Returns
220
+ -------
221
+ Tuple[Any, Any]
222
+ A tuple containing:
223
+ - im: The image object returned by `pcolormesh`
224
+ - cbar: The colorbar object added to the plot
225
+
226
+ Notes
227
+ -----
228
+ - For magnitude mode, the data is log-scaled using `log10`.
229
+ - For phase mode, the data is scaled between -π and π.
230
+ - The y-axis is set to range from `freq[1]` to `freq.max()` to avoid potential
231
+ issues with zero frequency bins.
232
+ - X-axis tick labels are hidden for cleaner visualization.
233
+ - If an invalid `mode` is provided, the function will print an error and exit.
234
+
235
+ Examples
236
+ --------
237
+ >>> import numpy as np
238
+ >>> import matplotlib.pyplot as plt
239
+ >>> # Assuming `sft` is your STFT data, `t` is time, `f` is frequency
240
+ >>> fig, ax = plt.subplots()
241
+ >>> im, cbar = showspecgram(sft, t, f, ax, fig, mode="mag")
242
+ >>> plt.show()
243
+ """
95
244
  # Log scaling for amplitude values
96
245
  if mode == "mag":
97
246
  spec_img = np.log10(np.abs(thestft))
@@ -145,13 +294,84 @@ def showspecgram(thestft, time, freq, ax, fig, mode="mag"):
145
294
  return im, cbar
146
295
 
147
296
 
148
- def make_legend_axes(ax):
297
+ def make_legend_axes(ax: Any) -> object:
298
+ """
299
+ Create a new axes for legend placement next to the given axes.
300
+
301
+ This function creates a new axes object positioned to the right of the
302
+ provided axes, which can be used for placing legends. The new axes is
303
+ created using matplotlib's make_axes_locatable utility.
304
+
305
+ Parameters
306
+ ----------
307
+ ax : matplotlib.axes.Axes
308
+ The original axes object to which the legend axes will be appended.
309
+
310
+ Returns
311
+ -------
312
+ matplotlib.axes.Axes
313
+ The newly created axes object that can be used for legend placement.
314
+
315
+ Notes
316
+ -----
317
+ The legend axes is positioned to the right of the original axes with:
318
+ - Size: 0.4 inches width
319
+ - Padding: 0.2 inches from the original axes
320
+
321
+ Examples
322
+ --------
323
+ >>> import matplotlib.pyplot as plt
324
+ >>> fig, ax = plt.subplots()
325
+ >>> ax.plot([1, 2, 3], [1, 4, 9])
326
+ >>> legend_ax = make_legend_axes(ax)
327
+ >>> ax.legend(['data'], bbox_to_anchor=(1.05, 1), loc='upper left')
328
+ >>> plt.show()
329
+ """
149
330
  divider = make_axes_locatable(ax)
150
331
  legend_ax = divider.append_axes("right", 0.4, pad=0.2)
151
332
  return legend_ax
152
333
 
153
334
 
154
- def ndplot(x, time, thelabel, nperseg=32):
335
+ def ndplot(x: Any, time: Any, thelabel: Any, nperseg: int = 32) -> None:
336
+ """
337
+ Plot spectrogram magnitude, phase, and time-domain signal.
338
+
339
+ This function computes and displays a spectrogram of the input signal `x` using
340
+ the Short-Time Fourier Transform (STFT). It shows the magnitude and phase of
341
+ the spectrogram in separate subplots, and overlays the original time-domain
342
+ signal on a third subplot.
343
+
344
+ Parameters
345
+ ----------
346
+ x : array-like
347
+ Input signal to be analyzed.
348
+ time : array-like
349
+ Time vector corresponding to the signal `x`.
350
+ thelabel : str
351
+ Label used for plotting titles.
352
+ nperseg : int, optional
353
+ Length of each segment for the STFT. Default is 32.
354
+
355
+ Returns
356
+ -------
357
+ None
358
+ This function does not return any value. It displays the plot directly.
359
+
360
+ Notes
361
+ -----
362
+ - The function uses `calcspecgram` to compute the STFT and checks if the
363
+ spectrogram is invertible.
364
+ - The magnitude and phase are plotted in the first two subplots.
365
+ - The time-domain signal is overlaid in the third subplot.
366
+ - The function relies on `showspecgram` for plotting the spectrograms.
367
+
368
+ Examples
369
+ --------
370
+ >>> import numpy as np
371
+ >>> t = np.linspace(0, 1, 1000)
372
+ >>> x = np.sin(2 * np.pi * 50 * t)
373
+ >>> ndplot(x, t, "Example Signal")
374
+ """
155
375
  print("arrived in ndplot")
156
376
  fig = plt.figure()
157
377
 
@@ -196,7 +416,45 @@ def ndplot(x, time, thelabel, nperseg=32):
196
416
  # plt.subplots_adjust(hspace=0.0)
197
417
 
198
418
 
199
- def spectrogram(args):
419
+ def spectrogram(args: Any) -> None:
420
+ """
421
+ Compute and display spectrogram of time series data from text file.
422
+
423
+ This function reads time series data from a text file, computes its spectrogram
424
+ using Welch's method, and displays the result. The spectrogram shows how
425
+ the frequency content of the signal changes over time.
426
+
427
+ Parameters
428
+ ----------
429
+ args : Any
430
+ Command line arguments containing:
431
+ - textfilename : str
432
+ Path to the text file containing time series data
433
+ - samplerate : float
434
+ Sampling rate of the tidal data in Hz
435
+ - nperseg : int, optional
436
+ Length of each segment for FFT (default: 256)
437
+ - debug : bool, optional
438
+ Enable debug output (default: False)
439
+
440
+ Returns
441
+ -------
442
+ None
443
+ This function displays the spectrogram plot and does not return any value.
444
+
445
+ Notes
446
+ -----
447
+ The function uses Welch's method for spectral estimation, which divides the
448
+ signal into overlapping segments and averages their periodograms. The time
449
+ axis is automatically calculated based on the sampling rate and data length.
450
+
451
+ Examples
452
+ --------
453
+ >>> import argparse
454
+ >>> args = argparse.Namespace(textfilename='tidal_data.txt',
455
+ ... samplerate=10.0, nperseg=512, debug=False)
456
+ >>> spectrogram(args)
457
+ """
200
458
  # get the command line parameters
201
459
  try:
202
460
  args = _get_parser().parse_args()
@@ -206,12 +464,27 @@ def spectrogram(args):
206
464
  if args.debug:
207
465
  print(args)
208
466
 
209
- # handle required args first
210
- timestep = 1.0 / args.samplerate
467
+ # read in data
468
+ (
469
+ samplerate,
470
+ starttime,
471
+ colnames,
472
+ yvec,
473
+ compressed,
474
+ filetype,
475
+ ) = tide_io.readvectorsfromtextfile(args.inputfile, onecol=True)
476
+
477
+ # get the sample rate squared away
478
+ if args.samplerate is not None:
479
+ samplerate = args.samplerate
480
+ else:
481
+ if samplerate is None:
482
+ print("Sample rate must be specified in input file or with --samplerate")
483
+ sys.exit()
484
+ timestep = 1.0 / samplerate
211
485
 
212
- yvec = tide_io.readvec(args.textfilename)
213
- xvec = np.arange(0.0, len(yvec), 1.0) * timestep
486
+ xvec = np.arange(0.0, len(yvec), 1.0) * timestep + starttime
214
487
 
215
- thelabel = args.textfilename
488
+ thelabel = args.inputfile
216
489
  ndplot(yvec, xvec, thelabel, nperseg=args.nperseg)
217
490
  plt.show()
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
  #
4
- # Copyright 2020-2024 Blaise Frederick
4
+ # Copyright 2020-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.
@@ -17,14 +17,42 @@
17
17
  #
18
18
  #
19
19
  import argparse
20
+ from argparse import Namespace
21
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
20
22
 
21
23
  import numpy as np
24
+ from numpy.typing import NDArray
22
25
 
23
26
  import rapidtide.io as tide_io
24
27
  from rapidtide.RapidtideDataset import RapidtideDataset
25
28
 
26
29
 
27
- def _get_parser():
30
+ def _get_parser() -> Any:
31
+ """
32
+ Get the argument parser for the synthASL command-line tool.
33
+
34
+ This function constructs and returns an `argparse.ArgumentParser` object configured
35
+ with the necessary arguments for running the synthASL tool, which uses rapidtide
36
+ output to predict ASL (Arterial Spin Labeling) images.
37
+
38
+ Returns
39
+ -------
40
+ argparse.ArgumentParser
41
+ Configured argument parser with required and optional arguments for synthASL.
42
+
43
+ Notes
44
+ -----
45
+ The parser includes both required positional arguments and several optional
46
+ arguments that control the ASL synthesis process. Default values are set according
47
+ to typical parameters used in ASL analysis.
48
+
49
+ Examples
50
+ --------
51
+ >>> parser = _get_parser()
52
+ >>> args = parser.parse_args(['dataset_name', 'output.nii.gz'])
53
+ >>> print(args.dataset)
54
+ 'dataset_name'
55
+ """
28
56
  # get the command line parameters
29
57
  parser = argparse.ArgumentParser(
30
58
  prog="synthASL",
@@ -70,8 +98,73 @@ def _get_parser():
70
98
  return parser
71
99
 
72
100
 
73
- def calcASL(lags, strengths, widths, mask, tagoffset=2.945, pld=1.8, TI=1.8, bloodT1=1.841):
74
- theaslimage = lags * 0.0
101
+ def calcASL(
102
+ lags: Any,
103
+ strengths: Any,
104
+ widths: Any,
105
+ mask: Any,
106
+ tagoffset: float = 2.945,
107
+ pld: float = 1.8,
108
+ TI: float = 1.8,
109
+ bloodT1: float = 1.841,
110
+ ) -> None:
111
+ """
112
+ Calculate ASL (Arterial Spin Labeling) signal based on lags, strengths, and timing parameters.
113
+
114
+ This function computes the ASL signal by applying temporal dynamics to the input lags and
115
+ strengths, considering blood T1 relaxation effects and tagging timing parameters.
116
+
117
+ Parameters
118
+ ----------
119
+ lags : array-like
120
+ Time lags for the ASL signal calculation
121
+ strengths : array-like
122
+ Signal strengths corresponding to the lags
123
+ widths : array-like
124
+ Widths parameter (not used in current implementation)
125
+ mask : array-like
126
+ Binary mask for region of interest
127
+ tagoffset : float, optional
128
+ Tagging offset in seconds, default is 2.945
129
+ pld : float, optional
130
+ Preparation delay in seconds, default is 1.8
131
+ TI : float, optional
132
+ Inversion time in seconds, default is 1.8
133
+ bloodT1 : float, optional
134
+ Blood T1 relaxation time in seconds, default is 1.841
135
+
136
+ Returns
137
+ -------
138
+ tuple
139
+ A tuple containing:
140
+ - theaslimage : array-like
141
+ Calculated ASL image signal
142
+ - tagdecayfac : array-like
143
+ Tagging decay factor
144
+ - oxyfac : array-like
145
+ Oxygenation factor (constant value of 1.0)
146
+ - cbvfac : array-like
147
+ CBV (Cerebral Blood Volume) factor
148
+ - calcmask : array-like
149
+ Calculated mask with time constraints
150
+ - offsets : array-like
151
+ Time offsets after adding tagoffset
152
+
153
+ Notes
154
+ -----
155
+ The function applies exponential decay based on blood T1 relaxation and only considers
156
+ positive delays after the preparation delay (pld). The calculation uses a linear
157
+ interpolation over 50 time points between pld and pld + TI.
158
+
159
+ Examples
160
+ --------
161
+ >>> import numpy as np
162
+ >>> lags = np.array([0.5, 1.0, 1.5])
163
+ >>> strengths = np.array([1.0, 1.5, 2.0])
164
+ >>> mask = np.array([1, 1, 1])
165
+ >>> result = calcASL(lags, strengths, None, mask)
166
+ """
167
+ theaslimage = np.zeros_like(lags)
75
168
 
76
169
  # convert rapidtide delays to time from tagging, and only keep positive delays after pld
77
170
  offsets = lags + tagoffset
@@ -79,13 +172,71 @@ def calcASL(lags, strengths, widths, mask, tagoffset=2.945, pld=1.8, TI=1.8, blo
79
172
 
80
173
  for imtime in np.linspace(pld, pld + TI, num=50, endpoint=True):
81
174
  tagdecayfac = np.exp(-(offsets + imtime) / bloodT1) * calcmask
82
- oxyfac = strengths * 0.0 + 1.0
175
+ oxyfac = np.ones_like(strengths)
83
176
  cbvfac = np.fabs(strengths) * oxyfac
84
177
  theaslimage += tagdecayfac * cbvfac
85
178
  return theaslimage, tagdecayfac, oxyfac, cbvfac, calcmask, offsets
86
179
 
87
180
 
88
- def synthASL(args):
181
+ def synthASL(args: Any) -> None:
182
+ """
183
+ Generate synthetic ASL (Arterial Spin Labeling) images and associated parameters.
184
+
185
+ This function reads ASL dataset parameters from a specified input dataset,
186
+ computes synthetic ASL signal using the `calcASL` function, and saves the
187
+ resulting images and intermediate outputs as NIfTI files.
188
+
189
+ Parameters
190
+ ----------
191
+ args : Any
192
+ Command-line arguments object containing the following attributes:
193
+ - dataset : str
194
+ Path to the input dataset.
195
+ - outputfilename : str
196
+ Base name for output NIfTI files.
197
+ - bloodT1 : float
198
+ Blood T1 relaxation time in seconds.
199
+ - tagoffset : float
200
+ Tag offset in seconds.
201
+ - pld : float
202
+ Post-labeling delay in seconds.
203
+ - labelduration : float
204
+ Labeling pulse duration in seconds.
205
+
206
+ Returns
207
+ -------
208
+ None
209
+ This function does not return a value but writes multiple NIfTI files
210
+ to disk, including:
211
+ - `<outputfilename>_ASL.nii.gz`
212
+ - `<outputfilename>_tagdecayfac.nii.gz`
213
+ - `<outputfilename>_oxyfac.nii.gz`
214
+ - `<outputfilename>_cbvfac.nii.gz`
215
+ - `<outputfilename>_calcmask.nii.gz`
216
+ - `<outputfilename>_offsets.nii.gz`
217
+ - `<outputfilename>_lagmask.nii.gz`
218
+ - `<outputfilename>_lagtimes.nii.gz`
219
+ - `<outputfilename>_lagstrengths.nii.gz`
220
+
221
+ Notes
222
+ -----
223
+ The function relies on the `RapidtideDataset` class to load overlay data
224
+ and uses `calcASL` to compute the synthetic ASL signal. All outputs are
225
+ saved using `tide_io.savetonifti`.
226
+
227
+ Examples
228
+ --------
229
+ >>> import argparse
230
+ >>> args = argparse.Namespace(
231
+ ... dataset="path/to/dataset",
232
+ ... outputfilename="output",
233
+ ... bloodT1=1.6,
234
+ ... tagoffset=0.0,
235
+ ... pld=1.5,
236
+ ... labelduration=1.0
237
+ ... )
238
+ >>> synthASL(args)
239
+ """
89
240
  # get the command line parameters
90
241
  try:
91
242
  args = _get_parser().parse_args()