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
@@ -0,0 +1,854 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # Copyright 2016-2025 Blaise Frederick
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+ #
18
+ #
19
+ from typing import Any, Callable, Optional, Tuple, Union
20
+
21
+ import numpy as np
22
+ import numpy.polynomial.polynomial as poly
23
+ from numpy.typing import NDArray
24
+ from scipy.interpolate import CubicSpline, UnivariateSpline
25
+ from scipy.ndimage import median_filter
26
+ from statsmodels.robust import mad
27
+
28
+ import rapidtide.filter as tide_filt
29
+ import rapidtide.io as tide_io
30
+ import rapidtide.workflows.regressfrommaps as tide_regressfrommaps
31
+
32
+ global ratiotooffsetfunc, funcoffsets, maplimits
33
+
34
+
35
+ def smooth(y: NDArray, box_pts: int) -> NDArray:
36
+ """Apply a simple moving average smooth to the input array.
37
+
38
+ This function performs convolution with a uniform boxcar filter to smooth
39
+ the input data. The smoothing is applied using the 'same' mode which
40
+ returns an array of the same length as the input.
41
+
42
+ Parameters
43
+ ----------
44
+ y : NDArray
45
+ Input array to be smoothed.
46
+ box_pts : int
47
+ Number of points in the smoothing window. Must be a positive integer.
48
+
49
+ Returns
50
+ -------
51
+ NDArray
52
+ Smoothed array of the same shape as input `y`.
53
+
54
+ Notes
55
+ -----
56
+ The smoothing is performed using numpy's convolve function with a boxcar
57
+ filter of uniform weights. The 'same' mode ensures the output has the
58
+ same length as the input, with edge effects handled by padding.
59
+
60
+ Examples
61
+ --------
62
+ >>> import numpy as np
63
+ >>> data = np.array([1, 2, 3, 4, 5])
64
+ >>> smooth(data, 3)
65
+ array([1.33333333, 2.33333333, 3.33333333, 4.33333333, 5.33333333])
66
+ """
67
+ box = np.ones(box_pts) / box_pts
68
+ y_smooth = np.convolve(y, box, mode="same")
69
+ return y_smooth
70
+
71
+
72
+ def trainratiotooffset(
73
+ lagtcgenerator: Any,
74
+ timeaxis: NDArray,
75
+ outputname: str,
76
+ outputlevel: str,
77
+ trainlagmin: float = 0.0,
78
+ trainlagmax: float = 0.0,
79
+ trainlagstep: float = 0.5,
80
+ mindelay: float = -3.0,
81
+ maxdelay: float = 3.0,
82
+ numpoints: int = 501,
83
+ smoothpts: int = 3,
84
+ edgepad: int = 5,
85
+ regressderivs: int = 1,
86
+ LGR: Optional[Any] = None,
87
+ TimingLGR: Optional[Any] = None,
88
+ verbose: bool = False,
89
+ debug: bool = False,
90
+ ) -> None:
91
+ """
92
+ Train a mapping from derivative ratio to delay offset using lagged time courses.
93
+
94
+ This function generates synthetic fMRI data by applying time shifts to the
95
+ input lagged time course generator and computes derivative ratios to estimate
96
+ the relationship between the ratio of derivatives and the corresponding delay.
97
+ The resulting mapping is stored globally and optionally saved to BIDS-style
98
+ TSV files.
99
+
100
+ Parameters
101
+ ----------
102
+ lagtcgenerator : Any
103
+ An object that provides the `yfromx` method for generating lagged time courses.
104
+ timeaxis : NDArray
105
+ The time axis (in seconds) for the fMRI data.
106
+ outputname : str
107
+ Base name for output files (e.g., BIDS entity).
108
+ outputlevel : str
109
+ Determines level of output; valid values are "min", "onlyregressors", or others.
110
+ trainlagmin : float, optional
111
+ Minimum lag value for training offsets (default is 0.0).
112
+ trainlagmax : float, optional
113
+ Maximum lag value for training offsets (default is 0.0).
114
+ trainlagstep : float, optional
115
+ Step size for generating training offsets (default is 0.5).
116
+ mindelay : float, optional
117
+ Minimum delay to consider in the delay map (default is -3.0).
118
+ maxdelay : float, optional
119
+ Maximum delay to consider in the delay map (default is 3.0).
120
+ numpoints : int, optional
121
+ Number of points in the delay grid (default is 501).
122
+ smoothpts : int, optional
123
+ Number of points for smoothing (default is 3).
124
+ edgepad : int, optional
125
+ Padding applied to edges during processing (default is 5).
126
+ regressderivs : int, optional
127
+ Number of derivatives to regress (default is 1).
128
+ LGR : Optional[Any], optional
129
+ Logging object for verbose output (default is None).
130
+ TimingLGR : Optional[Any], optional
131
+ Timing logging object (default is None).
132
+ verbose : bool, optional
133
+ Enable verbose logging if True (default is False).
134
+ debug : bool, optional
135
+ Enable debug output if True (default is False).
136
+
137
+ Returns
138
+ -------
139
+ None
140
+ This function does not return any value but updates global variables:
141
+ - `ratiotooffsetfunc`: List of cubic spline interpolants mapping ratio to delay.
142
+ - `funcoffsets`: List of offset values used in training.
143
+ - `maplimits`: Tuple of minimum and maximum ratio values for the mapping.
144
+
145
+ Notes
146
+ -----
147
+ - The function uses `getderivratios` to compute derivative ratios.
148
+ - Output files are written in BIDS TSV format.
149
+ - The mapping function is saved globally for future use.
150
+
151
+ Examples
152
+ --------
153
+ >>> trainratiotooffset(
154
+ ... lagtcgenerator=generator,
155
+ ... timeaxis=time_axis,
156
+ ... outputname="sub-01",
157
+ ... outputlevel="full",
158
+ ... trainlagmin=-1.0,
159
+ ... trainlagmax=1.0,
160
+ ... trainlagstep=0.2,
161
+ ... mindelay=-2.0,
162
+ ... maxdelay=2.0,
163
+ ... numpoints=201,
164
+ ... smoothpts=5,
165
+ ... edgepad=3,
166
+ ... regressderivs=2,
167
+ ... verbose=True,
168
+ ... debug=False
169
+ ... )
170
+ """
171
+ global ratiotooffsetfunc, funcoffsets, maplimits
172
+
173
+ if debug:
174
+ print("ratiotooffsetfunc:")
175
+ lagtcgenerator.info(prefix="\t")
176
+ print("\ttimeaxis:", timeaxis)
177
+ print("\toutputname:", outputname)
178
+ print("\ttrainlagmin:", trainlagmin)
179
+ print("\ttrainlagmax:", trainlagmax)
180
+ print("\ttrainlagstep:", trainlagstep)
181
+ print("\tmindelay:", mindelay)
182
+ print("\tmaxdelay:", maxdelay)
183
+ print("\tsmoothpts:", smoothpts)
184
+ print("\tedgepad:", edgepad)
185
+ print("\tregressderivs:", regressderivs)
186
+ print("\tlagtcgenerator:", lagtcgenerator)
187
+
188
+ # make a delay map
189
+ delaystep = (maxdelay - mindelay) / (numpoints - 1)
190
+ lagtimes = np.linspace(
191
+ mindelay - edgepad * delaystep,
192
+ maxdelay + edgepad * delaystep,
193
+ numpoints + 2 * edgepad,
194
+ endpoint=True,
195
+ )
196
+ if debug:
197
+ print(f"{mindelay=}")
198
+ print(f"{maxdelay=}")
199
+ print(f"{delaystep=}")
200
+ print("lagtimes=", lagtimes)
201
+
202
+ # set up for getratioderivs call
203
+ rt_floattype = "float64"
204
+ internalvalidfmrishape = (numpoints + 2 * edgepad, timeaxis.shape[0])
205
+ fmridata = np.zeros(internalvalidfmrishape, dtype=float)
206
+ fmrimask = np.ones(numpoints + 2 * edgepad, dtype=float)
207
+ validvoxels = np.where(fmrimask > 0)[0]
208
+ sLFOfitmean = np.zeros(numpoints + 2 * edgepad, dtype=rt_floattype)
209
+ rvalue = np.zeros(numpoints + 2 * edgepad, dtype=rt_floattype)
210
+ r2value = np.zeros(numpoints + 2 * edgepad, dtype=rt_floattype)
211
+ fitNorm = np.zeros((numpoints + 2 * edgepad, 2), dtype=rt_floattype)
212
+ fitcoeff = np.zeros((numpoints + 2 * edgepad, 2), dtype=rt_floattype)
213
+ movingsignal = np.zeros(internalvalidfmrishape, dtype=rt_floattype)
214
+ lagtc = np.zeros(internalvalidfmrishape, dtype=rt_floattype)
215
+ filtereddata = np.zeros(internalvalidfmrishape, dtype=rt_floattype)
216
+ sampletime = timeaxis[1] - timeaxis[0]
217
+ optiondict = {
218
+ "regressfiltthreshval": 0.0,
219
+ "saveminimumsLFOfiltfiles": False,
220
+ "nprocs_makelaggedtcs": 1,
221
+ "nprocs_regressionfilt": 1,
222
+ "mp_chunksize": 1000,
223
+ "showprogressbar": False,
224
+ "alwaysmultiproc": False,
225
+ "focaldebug": debug,
226
+ "fmrifreq": 1.0 / sampletime,
227
+ }
228
+
229
+ if trainlagmax - trainlagmin > 0.0:
230
+ numnegoffsets = np.max((-int(np.round(trainlagmin / trainlagstep, 0)), 1))
231
+ numposoffsets = np.max((int(np.round(trainlagmax / trainlagstep, 0)), 1))
232
+ numoffsets = numnegoffsets + 1 + numposoffsets
233
+ trainoffsets = (
234
+ np.linspace(0, (numoffsets - 1) * trainlagstep, numoffsets, endpoint=True)
235
+ - numnegoffsets * trainlagstep
236
+ )
237
+ else:
238
+ trainoffsets = np.array([0.0], dtype=float)
239
+ numoffsets = 1
240
+ if debug:
241
+ print("trainoffsets:", trainoffsets)
242
+ allsmoothregressderivratios = np.zeros(
243
+ (numpoints + 2 * edgepad, numoffsets), dtype=rt_floattype
244
+ )
245
+ theEVs = np.zeros((numoffsets, timeaxis.shape[0]), dtype=float)
246
+
247
+ if verbose and (LGR is not None):
248
+ thisLGR = LGR
249
+ thisTimingLGR = TimingLGR
250
+ else:
251
+ thisLGR = None
252
+ thisTimingLGR = None
253
+
254
+ for whichoffset in range(numoffsets):
255
+ thisoffset = trainoffsets[whichoffset]
256
+
257
+ # now make synthetic fMRI data
258
+ for i in range(numpoints + 2 * edgepad):
259
+ fmridata[i, :] = lagtcgenerator.yfromx(timeaxis - lagtimes[i] + thisoffset)
260
+
261
+ theEVs[whichoffset, :] = lagtcgenerator.yfromx(timeaxis + thisoffset)
262
+
263
+ regressderivratios, regressrvalues = getderivratios(
264
+ fmridata,
265
+ validvoxels,
266
+ timeaxis + thisoffset,
267
+ 0.0 * lagtimes,
268
+ fmrimask,
269
+ lagtcgenerator,
270
+ "glm",
271
+ "refinedelaytest",
272
+ sampletime,
273
+ sLFOfitmean,
274
+ rvalue,
275
+ r2value,
276
+ fitNorm[:, :2],
277
+ fitcoeff[:, :2],
278
+ movingsignal,
279
+ lagtc,
280
+ filtereddata,
281
+ thisLGR,
282
+ thisTimingLGR,
283
+ optiondict,
284
+ regressderivs=regressderivs,
285
+ debug=debug,
286
+ )
287
+ if debug:
288
+ print("before trimming")
289
+ print(f"{regressderivratios.shape=}")
290
+ print(f"{lagtimes.shape=}")
291
+ if regressderivs == 1:
292
+ smoothregressderivratios = tide_filt.unpadvec(
293
+ smooth(
294
+ tide_filt.padvec(regressderivratios, padlen=20, padtype="constant"), smoothpts
295
+ ),
296
+ padlen=20,
297
+ )
298
+ # regressderivratios = regressderivratios[edgepad:-edgepad]
299
+ allsmoothregressderivratios[:, whichoffset] = smoothregressderivratios + 0.0
300
+ else:
301
+ smoothregressderivratios = np.zeros_like(regressderivratios)
302
+ for i in range(regressderivs):
303
+ allsmoothregressderivratios[i, :] = tide_filt.unpadvec(
304
+ smooth(
305
+ tide_filt.padvec(regressderivratios[i, :], padlen=20, padtype="constant"),
306
+ smoothpts,
307
+ ),
308
+ padlen=20,
309
+ )
310
+ # regressderivratios = regressderivratios[:, edgepad:-edgepad]
311
+ allsmoothregressderivratios = smoothregressderivratios + 0.0
312
+
313
+ allsmoothregressderivratios = allsmoothregressderivratios[edgepad:-edgepad, :]
314
+ lagtimes = lagtimes[edgepad:-edgepad]
315
+ if debug:
316
+ print("after trimming")
317
+ print(f"{regressderivratios.shape=}")
318
+ print(f"{allsmoothregressderivratios.shape=}")
319
+ print(f"{lagtimes.shape=}")
320
+
321
+ # find the minimum legal limits of the mapping function
322
+ highestlowerlim = 0
323
+ lowestupperlim = numpoints
324
+ for whichoffset in range(numoffsets):
325
+ xaxis = allsmoothregressderivratios[::-1, whichoffset]
326
+ midpoint = int(len(xaxis) // 2)
327
+ lowerlim = midpoint + 0
328
+ while (lowerlim > 1) and xaxis[lowerlim] > xaxis[lowerlim - 1]:
329
+ lowerlim -= 1
330
+ upperlim = midpoint + 0
331
+ while (upperlim < len(xaxis) - 2) and xaxis[upperlim] < xaxis[upperlim + 1]:
332
+ upperlim += 1
333
+ if lowerlim > highestlowerlim:
334
+ highestlowerlim = lowerlim
335
+ if upperlim < lowestupperlim:
336
+ lowestupperlim = upperlim
337
+
338
+ ratiotooffsetfunc = []
339
+ funcoffsets = []
340
+ for whichoffset in range(numoffsets):
341
+ xaxis = allsmoothregressderivratios[::-1, whichoffset]
342
+ yaxis = lagtimes[::-1]
343
+ xaxis = xaxis[highestlowerlim : lowestupperlim + 1]
344
+ yaxis = yaxis[highestlowerlim : lowestupperlim + 1]
345
+ ratiotooffsetfunc.append(CubicSpline(xaxis, yaxis))
346
+ funcoffsets.append(trainoffsets[whichoffset] + 0.0)
347
+ maplimits = (xaxis[0], xaxis[-1])
348
+
349
+ if outputlevel != "min" and outputlevel != "onlyregressors":
350
+ resampaxis = np.linspace(xaxis[0], xaxis[-1], num=len(xaxis), endpoint=True)
351
+ outputfuncs = np.zeros((resampaxis.size, numoffsets), dtype=float)
352
+ colnames = []
353
+ for whichoffset in range(numoffsets):
354
+ colnames.append(f"{funcoffsets[whichoffset]}")
355
+ outputfuncs[:, whichoffset] = ratiotooffsetfunc[whichoffset](resampaxis)
356
+ if debug:
357
+ print(f"{colnames=}")
358
+ print(f"{outputfuncs.shape=}")
359
+ tide_io.writebidstsv(
360
+ f"{outputname}_desc-ratiotodelayfunc_timeseries",
361
+ np.transpose(outputfuncs),
362
+ 1.0 / (resampaxis[1] - resampaxis[0]),
363
+ starttime=resampaxis[0],
364
+ columns=colnames,
365
+ extraheaderinfo={
366
+ "Description": "The function mapping derivative ratio to delay",
367
+ "minratio": f"{resampaxis[0]}",
368
+ "maxratio": f"{resampaxis[-1]}",
369
+ },
370
+ xaxislabel="coefficientratio",
371
+ yaxislabel="time",
372
+ append=False,
373
+ )
374
+ if numoffsets > 1:
375
+ print(f"{theEVs.shape=}, {numoffsets=}, {(numoffsets>1)=}")
376
+ tide_io.writebidstsv(
377
+ f"{outputname}_desc-trainratioEV_timeseries",
378
+ theEVs,
379
+ 1.0 / (timeaxis[1] - timeaxis[0]),
380
+ starttime=timeaxis[0],
381
+ columns=colnames,
382
+ extraheaderinfo={"Description": f"EVs used for each offset"},
383
+ append=False,
384
+ )
385
+
386
+
387
+ def ratiotodelay(theratio: float, offset: float = 0.0, debug: bool = False) -> Tuple[float, float]:
388
+ """
389
+ Convert a ratio to a delay value using lookup tables and offset compensation.
390
+
391
+ This function maps a given ratio to a corresponding delay value by interpolating
392
+ between pre-calculated offset values. It handles boundary conditions by clamping
393
+ the ratio to predefined limits and applies offset compensation for accurate
394
+ delay calculation.
395
+
396
+ Parameters
397
+ ----------
398
+ theratio : float
399
+ The input ratio value to be converted to delay. This value is used as input
400
+ to the lookup function after being clamped to the valid range.
401
+ offset : float, optional
402
+ Offset value used for compensation and lookup table selection. Default is 0.0.
403
+ debug : bool, optional
404
+ Flag to enable debug output. Default is False.
405
+
406
+ Returns
407
+ -------
408
+ Tuple[float, float]
409
+ A tuple containing:
410
+ - The calculated delay value based on the ratio and offset
411
+ - The closest offset value used for the lookup
412
+
413
+ Notes
414
+ -----
415
+ The function uses global variables `ratiotooffsetfunc`, `funcoffsets`, and `maplimits`:
416
+ - `ratiotooffsetfunc`: List of lookup functions for different offset values
417
+ - `funcoffsets`: List of pre-calculated offset values
418
+ - `maplimits`: Tuple containing minimum and maximum valid ratio limits
419
+
420
+ Examples
421
+ --------
422
+ >>> result = ratiotodelay(0.5, offset=0.1)
423
+ >>> print(result)
424
+ (0.48, 0.1)
425
+
426
+ >>> result = ratiotodelay(1.5, offset=0.0)
427
+ >>> print(result)
428
+ (0.95, 0.0)
429
+ """
430
+ global ratiotooffsetfunc, funcoffsets, maplimits
431
+
432
+ # find the closest calculated offset
433
+ closestindex = 0
434
+ for offsetindex in range(1, len(funcoffsets)):
435
+ if np.fabs(funcoffsets[offsetindex] - offset) < np.fabs(
436
+ funcoffsets[closestindex] - offset
437
+ ):
438
+ closestindex = offsetindex
439
+ closestoffset = funcoffsets[closestindex]
440
+ distance = np.fabs(funcoffsets[closestindex] - offset)
441
+
442
+ if theratio < maplimits[0]:
443
+ return (
444
+ ratiotooffsetfunc[closestindex](maplimits[0]) + (offset - closestoffset),
445
+ closestoffset,
446
+ )
447
+ elif theratio > maplimits[1]:
448
+ return (
449
+ ratiotooffsetfunc[closestindex](maplimits[1]) - (offset - closestoffset),
450
+ closestoffset,
451
+ )
452
+ else:
453
+ return (
454
+ ratiotooffsetfunc[closestindex](theratio),
455
+ closestoffset,
456
+ )
457
+
458
+
459
+ def coffstodelay(
460
+ thecoffs: NDArray, mindelay: float = -3.0, maxdelay: float = 3.0, debug: bool = False
461
+ ) -> float:
462
+ """
463
+ Convert polynomial coefficients to delay value by finding roots within specified bounds.
464
+
465
+ This function constructs a polynomial from the given coefficients and finds its roots
466
+ within the specified delay range. It returns the root closest to zero that lies
467
+ within the valid range, or 0.0 if no valid roots are found.
468
+
469
+ Parameters
470
+ ----------
471
+ thecoffs : NDArray
472
+ Array of polynomial coefficients (excluding the leading 1.0 term).
473
+ mindelay : float, optional
474
+ Minimum allowed delay value, default is -3.0.
475
+ maxdelay : float, optional
476
+ Maximum allowed delay value, default is 3.0.
477
+ debug : bool, optional
478
+ If True, prints debugging information about root selection process,
479
+ default is False.
480
+
481
+ Returns
482
+ -------
483
+ float
484
+ The selected delay value (root closest to zero within bounds),
485
+ or 0.0 if no valid roots are found.
486
+
487
+ Notes
488
+ -----
489
+ The function constructs a polynomial with coefficients [1.0, *thecoffs] and
490
+ finds all roots within the interval [mindelay, maxdelay]. Only real roots
491
+ within the specified bounds are considered valid candidates.
492
+
493
+ Examples
494
+ --------
495
+ >>> import numpy as np
496
+ >>> coeffs = np.array([0.5, -1.0])
497
+ >>> delay = coffstodelay(coeffs, mindelay=-2.0, maxdelay=2.0)
498
+ >>> print(delay)
499
+ 0.5
500
+
501
+ >>> coeffs = np.array([1.0, 0.0, -1.0])
502
+ >>> delay = coffstodelay(coeffs, mindelay=-1.0, maxdelay=1.0, debug=True)
503
+ keeping root 0 (1.0)
504
+ keeping root 1 (-1.0)
505
+ chosen = -1.0
506
+ >>> print(delay)
507
+ -1.0
508
+ """
509
+ justaone = np.array([1.0], dtype=thecoffs.dtype)
510
+ allcoffs = np.concatenate((justaone, thecoffs))
511
+ theroots = (poly.Polynomial(allcoffs, domain=(mindelay, maxdelay))).roots()
512
+ if theroots is None:
513
+ return 0.0
514
+ elif len(theroots) == 1:
515
+ return theroots[0].real
516
+ else:
517
+ candidates = []
518
+ for i in range(len(theroots)):
519
+ if np.isreal(theroots[i]) and (mindelay <= theroots[i] <= maxdelay):
520
+ if debug:
521
+ print(f"keeping root {i} ({theroots[i]})")
522
+ candidates.append(theroots[i].real)
523
+ else:
524
+ if debug:
525
+ print(f"discarding root {i} ({theroots[i]})")
526
+ else:
527
+ pass
528
+ if len(candidates) > 0:
529
+ chosen = candidates[np.argmin(np.fabs(np.array(candidates)))].real
530
+ if debug:
531
+ print(f"{theroots=}, {candidates=}, {chosen=}")
532
+ return chosen
533
+ return 0.0
534
+
535
+
536
+ def getderivratios(
537
+ fmri_data_valid: NDArray,
538
+ validvoxels: NDArray,
539
+ initial_fmri_x: NDArray,
540
+ lagtimes: NDArray,
541
+ fitmask: NDArray,
542
+ genlagtc: Any,
543
+ mode: str,
544
+ outputname: str,
545
+ oversamptr: float,
546
+ sLFOfitmean: NDArray,
547
+ rvalue: NDArray,
548
+ r2value: NDArray,
549
+ fitNorm: NDArray,
550
+ fitcoeff: NDArray,
551
+ movingsignal: Optional[NDArray],
552
+ lagtc: NDArray,
553
+ filtereddata: Optional[NDArray],
554
+ LGR: Optional[Any],
555
+ TimingLGR: Optional[Any],
556
+ optiondict: dict,
557
+ regressderivs: int = 1,
558
+ timemask: Optional[NDArray] = None,
559
+ starttr: Optional[int] = None,
560
+ endtr: Optional[int] = None,
561
+ debug: bool = False,
562
+ ) -> Tuple[NDArray, NDArray]:
563
+ """
564
+ Compute the ratio of the first (or higher-order) derivative of regressors to the main regressor.
565
+
566
+ This function performs regression analysis on fMRI data using lagged timecourses and
567
+ calculates the ratio of each derivative regressor to the main (zeroth-order) regressor.
568
+ It is typically used in the context of hemodynamic response function (HRF) modeling and
569
+ temporal filtering.
570
+
571
+ Parameters
572
+ ----------
573
+ fmri_data_valid : NDArray
574
+ Valid fMRI data (voxels x timepoints).
575
+ validvoxels : NDArray
576
+ Boolean mask indicating valid voxels.
577
+ initial_fmri_x : NDArray
578
+ Initial fMRI design matrix (timepoints x regressors).
579
+ lagtimes : NDArray
580
+ Array of lag times for generating lagged regressors.
581
+ fitmask : NDArray
582
+ Mask for fitting regressors.
583
+ genlagtc : Any
584
+ Function or object for generating lagged timecourses.
585
+ mode : str
586
+ Regression mode (e.g., 'ols', 'wls').
587
+ outputname : str
588
+ Name of the output file or identifier.
589
+ oversamptr : float
590
+ Oversampling factor for temporal resolution.
591
+ sLFOfitmean : NDArray
592
+ Mean of the low-frequency fit.
593
+ rvalue : NDArray
594
+ R-values from regression.
595
+ r2value : NDArray
596
+ R-squared values from regression.
597
+ fitNorm : NDArray
598
+ Normalization factors from regression.
599
+ fitcoeff : NDArray
600
+ Regression coefficients (voxels x regressors).
601
+ movingsignal : NDArray
602
+ Moving signal data.
603
+ lagtc : NDArray
604
+ Lagged timecourses.
605
+ filtereddata : NDArray
606
+ Filtered fMRI data.
607
+ LGR : Optional[Any]
608
+ LGR object for temporal filtering.
609
+ TimingLGR : Optional[Any]
610
+ Timing LGR object for temporal filtering.
611
+ optiondict : dict
612
+ Dictionary of options for regression and processing.
613
+ regressderivs : int, optional
614
+ Number of derivative regressors to include (default is 1).
615
+ timemask : NDArray, optional
616
+ Mask of timepoints to include in regression filtering.
617
+ starttr : Optional[int], optional
618
+ Start timepoint for processing (default is 0).
619
+ endtr : Optional[int], optional
620
+ End timepoint for processing (default is number of timepoints).
621
+ debug : bool, optional
622
+ If True, print debug information (default is False).
623
+
624
+ Returns
625
+ -------
626
+ Tuple[NDArray, NDArray]
627
+ A tuple containing:
628
+ - `regressderivratios`: Array of derivative-to-main regressor ratios (regressors x voxels).
629
+ - `rvalue`: R-values from regression (same as input `rvalue`).
630
+
631
+ Notes
632
+ -----
633
+ - The function uses `tide_regressfrommaps.regressfrommaps` internally for regression.
634
+ - Derivative ratios are computed as `fitcoeff[:, i+1] / fitcoeff[:, 0]` for i in 0 to `regressderivs-1`.
635
+ - NaN values are replaced with 0 using `np.nan_to_num`.
636
+
637
+ Examples
638
+ --------
639
+ >>> ratios, rvals = getderivratios(
640
+ ... fmri_data_valid,
641
+ ... validvoxels,
642
+ ... initial_fmri_x,
643
+ ... lagtimes,
644
+ ... fitmask,
645
+ ... genlagtc,
646
+ ... 'ols',
647
+ ... 'output',
648
+ ... 2.0,
649
+ ... sLFOfitmean,
650
+ ... rvalue,
651
+ ... r2value,
652
+ ... fitNorm,
653
+ ... fitcoeff,
654
+ ... movingsignal,
655
+ ... lagtc,
656
+ ... filtereddata,
657
+ ... None,
658
+ ... None,
659
+ ... optiondict,
660
+ ... regressderivs=2,
661
+ ... starttr=0,
662
+ ... endtr=100,
663
+ ... debug=False
664
+ ... )
665
+ """
666
+ if starttr is None:
667
+ starttr = 0
668
+ if endtr is None:
669
+ endtr = fmri_data_valid.shape[1]
670
+ if debug:
671
+ print("getderivratios: Starting")
672
+ print(f"\t{fitNorm.shape=}")
673
+ print(f"\t{fitcoeff.shape=}")
674
+ print(f"\t{regressderivs=}")
675
+ print(f"\t{starttr=}")
676
+ print(f"\t{endtr=}")
677
+
678
+ if timemask is not None:
679
+ trimmedtimemask = timemask[starttr:endtr]
680
+ else:
681
+ trimmedtimemask = None
682
+
683
+ voxelsprocessed_regressionfilt, regressorset, evset = tide_regressfrommaps.regressfrommaps(
684
+ fmri_data_valid[:, starttr:endtr],
685
+ validvoxels,
686
+ initial_fmri_x[starttr:endtr],
687
+ lagtimes,
688
+ fitmask,
689
+ genlagtc,
690
+ mode,
691
+ outputname,
692
+ oversamptr,
693
+ sLFOfitmean,
694
+ rvalue,
695
+ r2value,
696
+ fitNorm,
697
+ fitcoeff,
698
+ movingsignal,
699
+ lagtc,
700
+ filtereddata,
701
+ LGR,
702
+ TimingLGR,
703
+ optiondict["regressfiltthreshval"],
704
+ False,
705
+ nprocs_makelaggedtcs=optiondict["nprocs_makelaggedtcs"],
706
+ nprocs_regressionfilt=optiondict["nprocs_regressionfilt"],
707
+ regressderivs=regressderivs,
708
+ chunksize=optiondict["mp_chunksize"],
709
+ showprogressbar=optiondict["showprogressbar"],
710
+ alwaysmultiproc=optiondict["alwaysmultiproc"],
711
+ coefficientsonly=True,
712
+ timemask=trimmedtimemask,
713
+ debug=debug,
714
+ )
715
+
716
+ # calculate the ratio of the first derivative to the main regressor
717
+ if regressderivs == 1:
718
+ regressderivratios = np.nan_to_num(fitcoeff[:, 1] / fitcoeff[:, 0])
719
+ else:
720
+ numvoxels = fitcoeff.shape[0]
721
+ regressderivratios = np.zeros((regressderivs, numvoxels), dtype=np.float64)
722
+ for i in range(regressderivs):
723
+ regressderivratios[i, :] = np.nan_to_num(fitcoeff[:, i + 1] / fitcoeff[:, 0])
724
+
725
+ if debug:
726
+ print("getderivratios: End\n\n")
727
+ return regressderivratios, rvalue
728
+
729
+
730
+ def filterderivratios(
731
+ regressderivratios: NDArray,
732
+ nativespaceshape: Tuple[int, ...],
733
+ validvoxels: NDArray,
734
+ thedims: Tuple[float, ...],
735
+ patchthresh: float = 3.0,
736
+ gausssigma: float = 0,
737
+ filetype: str = "nifti",
738
+ rt_floattype: np.dtype = np.float64,
739
+ verbose: bool = True,
740
+ debug: bool = False,
741
+ ) -> Tuple[NDArray, NDArray, float]:
742
+ """
743
+ Filter derivative ratios using median absolute deviation (MAD) and optional smoothing.
744
+
745
+ This function applies a filtering procedure to regression derivative ratios to
746
+ identify and correct outliers. It uses median filtering and compares deviations
747
+ from the median using the median absolute deviation (MAD). Optionally, Gaussian
748
+ smoothing is applied to the filtered data.
749
+
750
+ Parameters
751
+ ----------
752
+ regressderivratios : ndarray
753
+ Array of regression derivative ratios to be filtered.
754
+ nativespaceshape : tuple of int
755
+ Shape of the native space (e.g., (nx, ny, nz)).
756
+ validvoxels : ndarray
757
+ Boolean or integer array indicating valid voxels in the data.
758
+ thedims : tuple of float
759
+ Voxel dimensions (dx, dy, dz) used for Gaussian smoothing.
760
+ patchthresh : float, optional
761
+ Threshold for outlier detection in units of MAD. Default is 3.0.
762
+ gausssigma : float, optional
763
+ Standard deviation for Gaussian smoothing. If 0, no smoothing is applied.
764
+ Default is 0.
765
+ filetype : str, optional
766
+ File type for output mapping. If not "nifti", no median filtering is applied.
767
+ Default is "nifti".
768
+ rt_floattype : str, optional
769
+ Data type for the output arrays. Default is "float64".
770
+ verbose : bool, optional
771
+ If True, print diagnostic information. Default is True.
772
+ debug : bool, optional
773
+ If True, enable debug printing. Default is False.
774
+
775
+ Returns
776
+ -------
777
+ medfilt : ndarray
778
+ Median-filtered version of the input `regressderivratios`.
779
+ filteredarray : ndarray
780
+ Final filtered array with outliers replaced by median values.
781
+ themad : float
782
+ Median absolute deviation of the input `regressderivratios`.
783
+
784
+ Notes
785
+ -----
786
+ - The function uses `median_filter` from `scipy.ndimage` for spatial filtering.
787
+ - If `filetype` is "nifti", the input data is first mapped to a destination array
788
+ using `tide_io.makedestarray` and `tide_io.populatemap`.
789
+ - Gaussian smoothing is applied using `tide_filt.ssmooth` if `gausssigma > 0`.
790
+
791
+ Examples
792
+ --------
793
+ >>> import numpy as np
794
+ >>> from scipy.ndimage import median_filter
795
+ >>> # Assume inputs are prepared
796
+ >>> medfilt, filtered, mad_val = filterderivratios(
797
+ ... regressderivratios, nativespaceshape, validvoxels, thedims,
798
+ ... patchthresh=3.0, gausssigma=1.0, verbose=True
799
+ ... )
800
+ """
801
+
802
+ if debug:
803
+ print("filterderivratios:")
804
+ print(f"\t{patchthresh=}")
805
+ print(f"\t{validvoxels.shape=}")
806
+ print(f"\t{nativespaceshape=}")
807
+
808
+ # filter the ratio to find weird values
809
+ themad = mad(regressderivratios).astype(np.float64)
810
+ if verbose:
811
+ print(f"MAD of regression fit derivative ratios = {themad}")
812
+ outmaparray, internalspaceshape = tide_io.makedestarray(
813
+ nativespaceshape,
814
+ filetype=filetype,
815
+ rt_floattype=rt_floattype,
816
+ )
817
+ mappedregressderivratios = tide_io.populatemap(
818
+ regressderivratios,
819
+ internalspaceshape,
820
+ validvoxels,
821
+ outmaparray,
822
+ debug=debug,
823
+ )
824
+ if filetype != "nifti":
825
+ medfilt = regressderivratios
826
+ filteredarray = regressderivratios
827
+ else:
828
+ if debug:
829
+ print(f"{regressderivratios.shape=}, {mappedregressderivratios.shape=}")
830
+ medfilt = median_filter(
831
+ mappedregressderivratios.reshape(nativespaceshape), size=(3, 3, 3)
832
+ ).reshape(internalspaceshape)[validvoxels]
833
+ filteredarray = np.where(
834
+ np.fabs(regressderivratios - medfilt) > patchthresh * themad,
835
+ medfilt,
836
+ regressderivratios,
837
+ )
838
+ if gausssigma > 0:
839
+ mappedfilteredarray = tide_io.populatemap(
840
+ filteredarray,
841
+ internalspaceshape,
842
+ validvoxels,
843
+ outmaparray,
844
+ debug=debug,
845
+ )
846
+ filteredarray = tide_filt.ssmooth(
847
+ thedims[0],
848
+ thedims[1],
849
+ thedims[2],
850
+ gausssigma,
851
+ mappedfilteredarray.reshape(nativespaceshape),
852
+ ).reshape(internalspaceshape)[validvoxels]
853
+
854
+ return medfilt, filteredarray, themad