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.
@@ -17,19 +17,48 @@
17
17
  #
18
18
  #
19
19
  import argparse
20
+ import sys
21
+ from typing import Any, Optional, Tuple
20
22
 
21
23
  import numpy as np
22
- from matplotlib.pyplot import *
24
+ from numpy.typing import NDArray
23
25
 
26
+ import rapidtide.filter as tide_filt
24
27
  import rapidtide.io as tide_io
25
28
  import rapidtide.miscmath as tide_math
26
29
  import rapidtide.resample as tide_resample
30
+ import rapidtide.voxelData as tide_voxelData
27
31
  import rapidtide.workflows.parser_funcs as pf
28
32
 
29
33
 
30
- def _get_parser():
34
+ def _get_parser() -> Any:
31
35
  """
32
- Argument parser for simdata
36
+ Argument parser for simdata.
37
+
38
+ This function constructs and returns an `argparse.ArgumentParser` object
39
+ configured for parsing command-line arguments used by the `simdata` tool.
40
+ The parser supports both required and optional arguments for generating
41
+ simulated fMRI data with known correlation parameters.
42
+
43
+ Returns
44
+ -------
45
+ argparse.ArgumentParser
46
+ Configured argument parser for simdata command-line interface.
47
+
48
+ Notes
49
+ -----
50
+ The function sets up argument groups for LFO, respiratory, and cardiac
51
+ bands, each with mutually exclusive options for specifying signal strength
52
+ (either as a percentage of mean or as a fraction of inband variance).
53
+ Each band group also accepts optional files for specifying lag, regressor,
54
+ sample rate, and start time.
55
+
56
+ Examples
57
+ --------
58
+ >>> parser = _get_parser()
59
+ >>> args = parser.parse_args(['--lfo pctfile', 'lfo.nii', 'output'])
60
+ >>> print(args.lfo_pctfile)
61
+ 'lfo.nii'
33
62
  """
34
63
  parser = argparse.ArgumentParser(
35
64
  prog="simdata",
@@ -38,61 +67,79 @@ def _get_parser():
38
67
  )
39
68
 
40
69
  # Required arguments
41
- pf.addreqinputniftifile(
42
- parser, "fmrifilename", addedtext="An exemplar BOLD fMRI file with the target dimensions"
70
+ parser.add_argument(
71
+ "fmritr",
72
+ type=lambda x: pf.is_float(parser, x, minval=0.0),
73
+ help="TR of the simulated data, in seconds.",
74
+ )
75
+ parser.add_argument(
76
+ "numtrs",
77
+ type=lambda x: pf.is_int(parser, x, minval=1),
78
+ help="Number of TRs in the simulated data.",
43
79
  )
44
80
  pf.addreqinputniftifile(
45
81
  parser, "immeanfilename", addedtext="3D file with the mean value for each voxel"
46
82
  )
47
83
  parser.add_argument("outputroot", type=str, help="Root name for the output files.")
48
- parser.add_argument(
49
- "slicetimefile",
50
- type=str,
51
- help="Slice acquisition time file, either FSL format or BIDS sidecar.",
52
- )
53
84
 
54
85
  for band in ["lfo", "resp", "cardiac"]:
55
- parser.add_argument(
56
- "--" + band + "pctfile",
57
- dest=(band + "pctfile"),
86
+ if band == "lfo":
87
+ bandopts = parser.add_argument_group("LFO band options")
88
+ elif band == "resp":
89
+ bandopts = parser.add_argument_group("Resp band options")
90
+ else:
91
+ bandopts = parser.add_argument_group("Cardiac band options")
92
+ strengthopts = bandopts.add_mutually_exclusive_group()
93
+ strengthopts.add_argument(
94
+ f"--{band}pctfile",
95
+ dest=(f"{band}pctfile"),
96
+ action="store",
97
+ type=lambda x: pf.is_valid_file(parser, x),
98
+ metavar="FILE",
99
+ help=(f"3D NIFTI file with the {band} amplitude in percent of mean at every point"),
100
+ default=None,
101
+ )
102
+ strengthopts.add_argument(
103
+ f"--{band}signalfraction",
104
+ dest=(f"{band}sigfracfile"),
58
105
  action="store",
59
106
  type=lambda x: pf.is_valid_file(parser, x),
60
107
  metavar="FILE",
61
108
  help=(
62
- "3D NIFTI file with the " + band + " amplitude in percent of mean at every point"
109
+ f"3D NIFTI file with the {band} amplitude expressed as the percentage of inband variance accounted for by the regressor"
63
110
  ),
64
111
  default=None,
65
112
  )
66
- parser.add_argument(
67
- "--" + band + "lagfile",
68
- dest=(band + "lagfile"),
113
+ bandopts.add_argument(
114
+ f"--{band}lagfile",
115
+ dest=(f"{band}lagfile"),
69
116
  action="store",
70
117
  type=lambda x: pf.is_valid_file(parser, x),
71
118
  metavar="FILE",
72
- help=("3D NIFTI file with the " + band + " delay value in seconds at every point"),
119
+ help=(f"3D NIFTI file with the {band} delay value in seconds at every point"),
73
120
  default=None,
74
121
  )
75
- parser.add_argument(
76
- "--" + band + "regressor",
77
- dest=(band + "regressor"),
122
+ bandopts.add_argument(
123
+ f"--{band}regressor",
124
+ dest=(f"{band}regressor"),
78
125
  action="store",
79
126
  type=lambda x: pf.is_valid_file(parser, x),
80
127
  metavar="FILE",
81
- help=("The LFO regressor text file"),
128
+ help=(f"The {band} regressor text file"),
82
129
  default=None,
83
130
  )
84
- parser.add_argument(
85
- "--" + band + "samprate",
86
- dest=(band + "samprate"),
131
+ bandopts.add_argument(
132
+ f"--{band}samprate",
133
+ dest=(f"{band}samprate"),
87
134
  action="store",
88
135
  type=float,
89
136
  metavar="SAMPRATE",
90
- help=("The sample rate of the LFO regressor file, in Hz"),
137
+ help=(f"The sample rate of the {band} regressor file, in Hz"),
91
138
  default=None,
92
139
  )
93
- parser.add_argument(
94
- "--" + band + "starttime",
95
- dest=(band + "starttime"),
140
+ bandopts.add_argument(
141
+ f"--{band}starttime",
142
+ dest=(f"{band}starttime"),
96
143
  action="store",
97
144
  type=float,
98
145
  metavar="STARTTIME",
@@ -105,6 +152,16 @@ def _get_parser():
105
152
  )
106
153
 
107
154
  # optional arguments
155
+ parser.add_argument(
156
+ "--slicetimefile",
157
+ dest="slicetimefile",
158
+ action="store",
159
+ type=str,
160
+ metavar="FILE",
161
+ help="Slice acquisition time file, either FSL format or BIDS sidecar.",
162
+ default=None,
163
+ )
164
+
108
165
  parser.add_argument(
109
166
  "--numskip",
110
167
  dest="numskip",
@@ -129,7 +186,9 @@ def _get_parser():
129
186
  action="store",
130
187
  type=float,
131
188
  metavar="LEVEL",
132
- help=("The variance of the voxel specific noise. Default is 0.0"),
189
+ help=(
190
+ "The variance of the voxel specific noise, as percent of the voxel mean. Default is 0.0"
191
+ ),
133
192
  default=0.0,
134
193
  )
135
194
  parser.add_argument(
@@ -146,19 +205,87 @@ def _get_parser():
146
205
 
147
206
 
148
207
  def prepareband(
149
- fmridims,
150
- pctfile,
151
- lagfile,
152
- regressorfile,
153
- samprate,
154
- starttime,
155
- regressorname,
156
- padtime=30.0,
157
- debug=False,
158
- ):
208
+ simdatadims: Any,
209
+ pctfile: str,
210
+ sigfracfile: Any,
211
+ lagfile: Any,
212
+ regressorfile: Any,
213
+ samprate: Any,
214
+ starttime: Any,
215
+ regressorname: Any,
216
+ padtime: float = 30.0,
217
+ debug: bool = False,
218
+ ) -> Tuple[NDArray, bool, NDArray, object]:
219
+ """
220
+ Prepare band-specific regressor data for time series analysis.
221
+
222
+ This function reads in a regressor timecourse from a text file and resamples it
223
+ to match the dimensions of fMRI data. It also loads percentile and lag data
224
+ from NIfTI files, performing necessary checks for spatial dimension matching.
225
+ A FastResampler is initialized for later use in resampling the regressor.
226
+
227
+ Parameters
228
+ ----------
229
+ simdatadims : Any
230
+ Spatial dimensions of the fMRI data.
231
+ pctfile : str
232
+ Path to the NIfTI file containing percentile data. If None, `sigfracfile` is used.
233
+ sigfracfile : Any
234
+ Path to the NIfTI file containing signal fraction data. Used if `pctfile` is None.
235
+ lagfile : Any
236
+ Path to the NIfTI file containing lag data.
237
+ regressorfile : Any
238
+ Path to the text file containing the regressor timecourse.
239
+ samprate : Any
240
+ Sampling rate of the regressor. If None, uses the value from `regressorfile`.
241
+ starttime : Any
242
+ Start time of the regressor. If None, uses the value from `regressorfile`.
243
+ regressorname : Any
244
+ Name of the regressor, used for logging and debugging.
245
+ padtime : float, optional
246
+ Padding time (in seconds) for the resampler. Default is 30.0.
247
+ debug : bool, optional
248
+ If True, prints debug information. Default is False.
249
+
250
+ Returns
251
+ -------
252
+ tuple
253
+ A tuple containing:
254
+ - pctdata : ndarray
255
+ The loaded and possibly scaled percentile or signal fraction data.
256
+ - pctscale : bool
257
+ Indicates whether the data was scaled from a percentile file.
258
+ - lagdata : ndarray
259
+ The loaded lag data from the NIfTI file.
260
+ - generator : FastResampler
261
+ An initialized FastResampler object for resampling the regressor.
262
+
263
+ Notes
264
+ -----
265
+ - The function checks that the spatial dimensions of the NIfTI files match
266
+ those of the fMRI data.
267
+ - If `pctfile` is None, the function uses `sigfracfile` and scales the data by 100.
268
+ - The regressor is normalized using standard normalization.
269
+
270
+ Examples
271
+ --------
272
+ >>> prepareband(
273
+ ... simdatadims=[64, 64, 32],
274
+ ... pctfile='pct.nii.gz',
275
+ ... sigfracfile=None,
276
+ ... lagfile='lag.nii.gz',
277
+ ... regressorfile='regressor.txt',
278
+ ... samprate=2.0,
279
+ ... starttime=0.0,
280
+ ... regressorname='band1',
281
+ ... padtime=30.0,
282
+ ... debug=False
283
+ ... )
284
+ """
159
285
  if debug:
160
- print("fmridims:", fmridims)
286
+ print("simdatadims:", simdatadims)
161
287
  print("pctfile:", pctfile)
288
+ print("sigfracfile:", sigfracfile)
162
289
  print("lagfile:", lagfile)
163
290
  print("regressorfile:", regressorfile)
164
291
  print("regressorname:", regressorname)
@@ -206,79 +333,238 @@ def prepareband(
206
333
  regressor_x[-1],
207
334
  )
208
335
 
209
- nim_pct, pctdata, pctheader, pctdims, pctsizes = tide_io.readfromnifti(pctfile)
210
- if not tide_io.checkspacedimmatch(pctdims, fmridims):
211
- print(regressorname, "pct file does not match fmri")
212
- exit()
336
+ if pctfile is not None:
337
+ nim_pct, pctdata, pctheader, pctdims, pctsizes = tide_io.readfromnifti(pctfile)
338
+ pctscale = True
339
+ else:
340
+ nim_pct, pctdata, pctheader, pctdims, pctsizes = tide_io.readfromnifti(sigfracfile)
341
+ pctscale = False
342
+ if not tide_io.checkspacedimmatch(pctdims, simdatadims):
343
+ print(regressorname, "pct file does not match fmri")
344
+ exit()
345
+ pctdata /= 100.0
213
346
  nim_lag, lagdata, lagheader, lagdims, lagsizes = tide_io.readfromnifti(lagfile)
214
- if not tide_io.checkspacedimmatch(lagdims, fmridims):
347
+ if not tide_io.checkspacedimmatch(lagdims, simdatadims):
215
348
  print(regressorname, "lag file does not match fmri")
216
349
  exit()
217
350
 
218
351
  generator = tide_resample.FastResampler(
219
352
  regressor_x, regressor_y, padtime=padtime, doplot=False
220
353
  )
221
- return pctdata, lagdata, generator
354
+ return pctdata, pctscale, lagdata, generator
222
355
 
223
356
 
224
357
  def fmrisignal(
225
- times,
226
- meanvalue,
227
- dolfo=False,
228
- lfowave=None,
229
- lfomag=None,
230
- lfodelay=None,
231
- doresp=False,
232
- respwave=None,
233
- respmag=None,
234
- respdelay=None,
235
- docardiac=False,
236
- cardiacwave=None,
237
- cardiacmag=None,
238
- cardiacdelay=None,
239
- ):
358
+ Fs: float,
359
+ times: NDArray,
360
+ meanvalue: float,
361
+ dolfo: bool = False,
362
+ lfowave: Optional[object] = None,
363
+ lfomag: Optional[NDArray] = None,
364
+ lfodelay: Optional[Any] = None,
365
+ lfonoise: float = 0.0,
366
+ lfofilter: Optional[object] = None,
367
+ doresp: bool = False,
368
+ respwave: Optional[object] = None,
369
+ respmag: Optional[NDArray] = None,
370
+ respdelay: Optional[NDArray] = None,
371
+ respnoise: float = 0.0,
372
+ respfilter: Optional[object] = None,
373
+ docardiac: bool = False,
374
+ cardiacwave: Optional[object] = None,
375
+ cardiacmag: Optional[NDArray] = None,
376
+ cardiacdelay: Optional[NDArray] = None,
377
+ cardiacnoise: float = 0.0,
378
+ cardiacfilter: Optional[object] = None,
379
+ ) -> NDArray:
380
+ """
381
+ Generate an fMRI signal by combining multiple physiological waveforms.
382
+
383
+ This function constructs an fMRI signal by summing a base mean signal with
384
+ contributions from low-frequency oscillations (LFO), respiratory signals,
385
+ and cardiac signals, each optionally modulated by amplitude, delay, noise,
386
+ and filtering.
387
+
388
+ Parameters
389
+ ----------
390
+ Fs : float
391
+ Sampling frequency of the signal.
392
+ times : NDArray
393
+ Time vector for the signal.
394
+ meanvalue : float
395
+ Base mean signal value.
396
+ dolfo : bool, optional
397
+ Whether to include low-frequency oscillation (LFO) component. Default is False.
398
+ lfowave : Optional[object], optional
399
+ Waveform object for LFO signal. Default is None.
400
+ lfomag : Optional[Any], optional
401
+ Magnitude of LFO signal. Default is None.
402
+ lfodelay : Optional[Any], optional
403
+ Delay for LFO signal. Default is None.
404
+ lfonoise : float, optional
405
+ Noise level for LFO signal. Default is 0.0.
406
+ lfofilter : Optional[object], optional
407
+ Filter object for LFO noise. Default is None.
408
+ doresp : bool, optional
409
+ Whether to include respiratory signal component. Default is False.
410
+ respwave : Optional[object], optional
411
+ Waveform object for respiratory signal. Default is None.
412
+ respmag : Optional[Any], optional
413
+ Magnitude of respiratory signal. Default is None.
414
+ respdelay : Optional[Any], optional
415
+ Delay for respiratory signal. Default is None.
416
+ respnoise : float, optional
417
+ Noise level for respiratory signal. Default is 0.0.
418
+ respfilter : Optional[object], optional
419
+ Filter object for respiratory noise. Default is None.
420
+ docardiac : bool, optional
421
+ Whether to include cardiac signal component. Default is False.
422
+ cardiacwave : Optional[object], optional
423
+ Waveform object for cardiac signal. Default is None.
424
+ cardiacmag : Optional[Any], optional
425
+ Magnitude of cardiac signal. Default is None.
426
+ cardiacdelay : Optional[Any], optional
427
+ Delay for cardiac signal. Default is None.
428
+ cardiacnoise : float, optional
429
+ Noise level for cardiac signal. Default is 0.0.
430
+ cardiacfilter : Optional[object], optional
431
+ Filter object for cardiac noise. Default is None.
432
+
433
+ Returns
434
+ -------
435
+ None
436
+ The function currently returns None. The actual signal is computed and returned
437
+ by the function body, but the return statement is not correctly implemented.
438
+
439
+ Notes
440
+ -----
441
+ The function modifies the signal in-place and returns a signal array that includes
442
+ contributions from all enabled physiological components. Each component is scaled
443
+ by `meanvalue` and optionally processed with delay, magnitude, noise, and filtering.
444
+
445
+ Examples
446
+ --------
447
+ >>> Fs = 100
448
+ >>> times = np.linspace(0, 10, 1000)
449
+ >>> meanvalue = 1.0
450
+ >>> signal = fmrisignal(Fs, times, meanvalue)
451
+ >>> # With LFO component enabled
452
+ >>> signal = fmrisignal(Fs, times, meanvalue, dolfo=True, lfowave=wave, lfomag=0.5)
453
+ """
240
454
  thesignal = np.zeros((len(times)), dtype=float)
241
455
  if dolfo:
242
- thesignal += meanvalue * (lfomag / 100.0) * lfowave.yfromx(times - lfodelay)
456
+ thesignal += meanvalue * (
457
+ lfomag * lfowave.yfromx(times - lfodelay)
458
+ + lfonoise * lfofilter.apply(Fs, np.random.standard_normal(len(times)))
459
+ )
243
460
  if doresp:
244
- thesignal += meanvalue * (respmag / 100.0) * respwave.yfromx(times - respdelay)
461
+ thesignal += meanvalue * (
462
+ respmag * respwave.yfromx(times - respdelay)
463
+ + respnoise * respfilter.apply(Fs, np.random.standard_normal(len(times)))
464
+ )
245
465
  if docardiac:
246
- thesignal += meanvalue * (cardiacmag / 100.0) * cardiacwave.yfromx(times - cardiacdelay)
247
- return thesignal + meanvalue
466
+ thesignal += meanvalue * (
467
+ cardiacmag * cardiacwave.yfromx(times - cardiacdelay)
468
+ + cardiacnoise * cardiacfilter.apply(Fs, np.random.standard_normal(len(times)))
469
+ )
470
+ thesignal += meanvalue
471
+ return thesignal
248
472
 
249
473
 
250
- def simdata(args):
474
+ def simdata(args: Any) -> None:
475
+ """
476
+ Generate simulated fMRI data based on physiological signal regressors.
477
+
478
+ This function simulates fMRI time series data by incorporating physiological
479
+ signals such as low-frequency oscillations (LFO), respiratory, and cardiac
480
+ signals. It reads in regressor files, applies filtering, and generates
481
+ voxel-wise time series using a signal simulation function.
482
+
483
+ Parameters
484
+ ----------
485
+ args : Any
486
+ An object containing command-line arguments specifying input and output
487
+ parameters. Expected attributes include:
488
+ - lfopctfile, lfosigfracfile, lfolagfile, lforegressor, lfosamprate,
489
+ lfostarttime: LFO-related input files and parameters.
490
+ - resppctfile, respsigfracfile, resplagfile, respregressor, respsamprate,
491
+ respstarttime: Respiratory-related input files and parameters.
492
+ - cardiacpctfile, cardiacsigfracfile, cardiaclagfile, cardiacregressor,
493
+ cardiacsamprate, cardiacstarttime: Cardiac-related input files and parameters.
494
+ - immeanfilename: Path to the mean image file.
495
+ - numtrs, numskip, fmritr: fMRI time series parameters.
496
+ - slicetimefile: Optional path to slice timing file.
497
+ - outputroot: Root name for output NIfTI files.
498
+ - globalnoiselevel, voxelnoiselevel: Noise parameters.
499
+ - debug: Boolean flag for debug output.
500
+
501
+ Returns
502
+ -------
503
+ None
504
+ This function does not return a value but saves the simulated fMRI data
505
+ to NIfTI files.
506
+
507
+ Notes
508
+ -----
509
+ The function requires at least one of LFO, respiratory, or cardiac signal
510
+ parameters to be specified. If none are provided, the function will print
511
+ help and exit.
512
+
513
+ Examples
514
+ --------
515
+ >>> import argparse
516
+ >>> args = argparse.Namespace(
517
+ ... lfopctfile='lfo_pct.nii.gz',
518
+ ... lfolagfile='lfo_lag.nii.gz',
519
+ ... lforegressor='lfo_regressor.txt',
520
+ ... lfosamprate=10.0,
521
+ ... immeanfilename='mean_func.nii.gz',
522
+ ... numtrs=200,
523
+ ... numskip=10,
524
+ ... fmritr=2.0,
525
+ ... outputroot='simulated_data',
526
+ ... globalnoiselevel=0.1,
527
+ ... voxelnoiselevel=0.05,
528
+ ... debug=False
529
+ ... )
530
+ >>> simdata(args)
531
+ """
251
532
  # set default variable values
252
533
  lfopctdata = None
253
534
  lfolagdata = None
254
535
  lfogenerator = None
536
+ lfofilter = None
255
537
 
256
538
  resppctdata = None
257
539
  resplagdata = None
258
540
  respgenerator = None
541
+ respfilter = None
259
542
 
260
543
  cardiacpctdata = None
261
544
  cardiaclagdata = None
262
545
  cardiacgenerator = None
546
+ cardiacfilter = None
263
547
 
264
548
  # check for complete information
265
549
  if (
266
- (args.lfopctfile is None)
550
+ ((args.lfopctfile is None) and (args.lfosigfracfile is None))
267
551
  or (args.lfolagfile is None)
268
552
  or (args.lforegressor is None)
269
553
  or ((args.lfosamprate is None) and (tide_io.parsefilespec(args.lforegressor)[1] is None))
270
554
  ):
271
555
  print("lfopctfile:", args.lfopctfile)
556
+ print("lfosigfracfile:", args.lfosigfracfile)
272
557
  print("lfolagfile:", args.lfolagfile)
273
558
  print("lforegressor:", args.lforegressor)
274
559
  print("lfopctsamprate:", args.lfosamprate)
275
560
  dolfo = False
276
561
  else:
277
562
  dolfo = True
563
+ lfofilter = tide_filt.NoncausalFilter("lfo")
278
564
  print("LFO information is complete, will be included.")
279
565
 
280
566
  if (
281
- (args.resppctfile is None)
567
+ ((args.resppctfile is None) and (args.respsigfracfile is None))
282
568
  or (args.resplagfile is None)
283
569
  or (args.respregressor is None)
284
570
  or ((args.respsamprate is None) and (tide_io.parsefilespec(args.respregressor)[1] is None))
@@ -286,10 +572,11 @@ def simdata(args):
286
572
  doresp = False
287
573
  else:
288
574
  doresp = True
575
+ respfilter = tide_filt.NoncausalFilter("resp")
289
576
  print("Respiratory information is complete, will be included.")
290
577
 
291
578
  if (
292
- (args.cardiacpctfile is None)
579
+ ((args.cardiacpctfile is None) and (args.cardiacsigfracfile is None))
293
580
  or (args.cardiaclagfile is None)
294
581
  or (args.cardiacregressor is None)
295
582
  or (
@@ -300,6 +587,7 @@ def simdata(args):
300
587
  docardiac = False
301
588
  else:
302
589
  docardiac = True
590
+ cardiacfilter = tide_filt.NoncausalFilter("cardiac")
303
591
  print("Cardiac information is complete, will be included.")
304
592
  if not (dolfo or doresp or docardiac):
305
593
  print(
@@ -308,62 +596,56 @@ def simdata(args):
308
596
  _get_parser().print_help()
309
597
  sys.exit()
310
598
 
311
- sliceoffsettimes, normalizedtotr = tide_io.getslicetimesfromfile(args.slicetimefile)
312
-
313
- fmritr, numtrs = tide_io.fmritimeinfo(args.fmrifilename)
314
- if normalizedtotr:
315
- sliceoffsettimes *= fmritr
316
-
317
- nim_fmri, fmridata, fmriheader, fmridims, fmrisizes = tide_io.readfromnifti(args.fmrifilename)
318
- print("fmri data: ", numtrs, " timepoints, tr = ", fmritr)
599
+ print(f"simulated fmri data: {args.numtrs} timepoints, tr = {args.fmritr}")
319
600
 
320
601
  # prepare the output timepoints
321
602
  initial_fmri_x = (
322
603
  np.linspace(
323
- 0.0, fmritr * (numtrs - args.numskip), num=(numtrs - args.numskip), endpoint=False
604
+ 0.0,
605
+ args.fmritr * (args.numtrs - args.numskip),
606
+ num=(args.numtrs - args.numskip),
607
+ endpoint=False,
324
608
  )
325
- + fmritr * args.numskip
609
+ + args.fmritr * args.numskip
326
610
  )
327
611
  print("length of fmri after removing skip:", len(initial_fmri_x))
328
612
  print(
329
- "fmri time has length",
330
- len(initial_fmri_x),
331
- "and runs runs from ",
332
- initial_fmri_x[0],
333
- " to ",
334
- initial_fmri_x[-1],
613
+ f"fmri time has length {len(initial_fmri_x)}",
614
+ f"and runs runs from {initial_fmri_x[0]} to {initial_fmri_x[-1]}",
335
615
  )
336
616
 
337
617
  # read in the immean file
338
618
  print("reading in source files")
339
- (
340
- nim_immean,
341
- immeandata,
342
- immeanheader,
343
- immeandims,
344
- immeansizes,
345
- ) = tide_io.readfromnifti(args.immeanfilename)
346
- if not tide_io.checkspacedimmatch(immeandims, fmridims):
347
- print("immean file does not match")
348
- exit()
619
+ theimmeandata = tide_voxelData.VoxelData(args.immeanfilename, timestep=args.fmritr)
620
+ immeandata = theimmeandata.byvol()
349
621
 
350
622
  # now set up the simulated data array
351
- thedims = fmridims
352
- xsize = thedims[1]
353
- ysize = thedims[2]
354
- numslices = thedims[3]
355
- simdata = np.zeros((xsize, ysize, numslices, len(initial_fmri_x)), dtype="float")
623
+ simdataheader = theimmeandata.copyheader(
624
+ numtimepoints=len(initial_fmri_x), tr=args.fmritr, toffset=args.numskip * args.fmritr
625
+ )
626
+ simdatadims = simdataheader["dim"].copy()
627
+ xsize, ysize, numslices, timepoints = tide_io.parseniftidims(simdatadims)
628
+ simdata = np.zeros((xsize, ysize, numslices, timepoints), dtype="float")
629
+
630
+ # read in the slicetimes file if we have one
631
+ if args.slicetimefile is not None:
632
+ sliceoffsettimes, normalizedtotr, fileisjson = tide_io.getslicetimesfromfile(
633
+ args.slicetimefile
634
+ )
635
+ else:
636
+ sliceoffsettimes = np.zeros((numslices), dtype=float)
356
637
 
357
638
  # set up fast resampling
358
639
  padtime = 60.0
359
- numpadtrs = int(padtime / fmritr)
360
- padtime = fmritr * numpadtrs
640
+ numpadtrs = int(padtime / args.fmritr)
641
+ padtime = args.fmritr * numpadtrs
361
642
 
362
643
  # prepare the input data for interpolation
363
644
  if dolfo:
364
- lfopctdata, lfolagdata, lfogenerator = prepareband(
365
- fmridims,
645
+ lfopctdata, lfopctscale, lfolagdata, lfogenerator = prepareband(
646
+ simdatadims,
366
647
  args.lfopctfile,
648
+ args.lfosigfracfile,
367
649
  args.lfolagfile,
368
650
  args.lforegressor,
369
651
  args.lfosamprate,
@@ -373,9 +655,10 @@ def simdata(args):
373
655
  debug=args.debug,
374
656
  )
375
657
  if doresp:
376
- resppctdata, resplagdata, respgenerator = prepareband(
377
- fmridims,
658
+ resppctdata, resppctscale, resplagdata, respgenerator = prepareband(
659
+ simdatadims,
378
660
  args.resppctfile,
661
+ args.respsigfracfile,
379
662
  args.resplagfile,
380
663
  args.respregressor,
381
664
  args.respsamprate,
@@ -385,9 +668,10 @@ def simdata(args):
385
668
  debug=args.debug,
386
669
  )
387
670
  if docardiac:
388
- cardiacpctdata, cardiaclagdata, cardiacgenerator = prepareband(
389
- fmridims,
671
+ cardiacpctdata, cardiacpctscale, cardiaclagdata, cardiacgenerator = prepareband(
672
+ simdatadims,
390
673
  args.cardiacpctfile,
674
+ args.cardiacsigfracfile,
391
675
  args.cardiaclagfile,
392
676
  args.cardiacregressor,
393
677
  args.cardiacsamprate,
@@ -412,42 +696,64 @@ def simdata(args):
412
696
  # add in the signals
413
697
  if dolfo:
414
698
  lfopct = lfopctdata[i, j, k]
699
+ if lfopctscale:
700
+ lfonoise = 0.0
701
+ else:
702
+ lfonoise = 1.0 - lfopct
415
703
  lfolag = lfolagdata[i, j, k]
416
704
  else:
417
705
  lfopct = 0.0
418
706
  lfolag = 0.0
707
+ lfonoise = 0.0
419
708
  if doresp:
420
709
  resppct = resppctdata[i, j, k]
710
+ if resppctscale:
711
+ respnoise = 0.0
712
+ else:
713
+ respnoise = 1.0 - resppct
421
714
  resplag = resplagdata[i, j, k]
422
715
  else:
423
716
  resppct = 0.0
424
717
  resplag = 0.0
718
+ respnoise = 0.0
425
719
  if docardiac:
426
720
  cardiacpct = cardiacpctdata[i, j, k]
721
+ if cardiacpctscale:
722
+ cardiacnoise = 0.0
723
+ else:
724
+ cardiacnoise = 1.0 - cardiacpct
427
725
  cardiaclag = cardiaclagdata[i, j, k]
428
726
  else:
429
727
  cardiacpct = 0.0
430
728
  cardiaclag = 0.0
729
+ cardiacnoise = 0.0
431
730
 
432
731
  simdata[i, j, k, :] = (
433
732
  fmrisignal(
733
+ (1.0 / args.fmritr),
434
734
  fmri_x_slice,
435
735
  immeandata[i, j, k],
436
736
  dolfo=dolfo,
437
737
  lfowave=lfogenerator,
438
738
  lfomag=lfopct,
439
739
  lfodelay=lfolag,
740
+ lfonoise=lfonoise,
741
+ lfofilter=lfofilter,
440
742
  doresp=doresp,
441
743
  respwave=respgenerator,
442
744
  respmag=resppct,
443
745
  respdelay=resplag,
746
+ respnoise=respnoise,
747
+ respfilter=respfilter,
444
748
  docardiac=docardiac,
445
749
  cardiacwave=cardiacgenerator,
446
750
  cardiacmag=cardiacpct,
447
751
  cardiacdelay=cardiaclag,
752
+ cardiacnoise=cardiacnoise,
753
+ cardiacfilter=cardiacfilter,
448
754
  )
449
755
  + theglobalnoise
450
- + thevoxelnoise
756
+ + (thevoxelnoise) / 100.0 * immeandata[i, j, k]
451
757
  )
452
758
 
453
- tide_io.savetonifti(simdata, fmriheader, args.outputroot)
759
+ tide_io.savetonifti(simdata, simdataheader, args.outputroot)