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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. cloud/gmscalc-HCPYA +1 -1
  2. cloud/mount-and-run +2 -0
  3. cloud/rapidtide-HCPYA +3 -3
  4. rapidtide/Colortables.py +538 -38
  5. rapidtide/OrthoImageItem.py +1094 -51
  6. rapidtide/RapidtideDataset.py +1709 -114
  7. rapidtide/__init__.py +0 -8
  8. rapidtide/_version.py +4 -4
  9. rapidtide/calccoherence.py +242 -97
  10. rapidtide/calcnullsimfunc.py +240 -140
  11. rapidtide/calcsimfunc.py +314 -129
  12. rapidtide/correlate.py +1211 -389
  13. rapidtide/data/examples/src/testLD +56 -0
  14. rapidtide/data/examples/src/test_findmaxlag.py +2 -2
  15. rapidtide/data/examples/src/test_mlregressallt.py +32 -17
  16. rapidtide/data/examples/src/testalign +1 -1
  17. rapidtide/data/examples/src/testatlasaverage +35 -7
  18. rapidtide/data/examples/src/testboth +21 -0
  19. rapidtide/data/examples/src/testcifti +11 -0
  20. rapidtide/data/examples/src/testdelayvar +13 -0
  21. rapidtide/data/examples/src/testdlfilt +25 -0
  22. rapidtide/data/examples/src/testfft +35 -0
  23. rapidtide/data/examples/src/testfileorfloat +37 -0
  24. rapidtide/data/examples/src/testfmri +92 -42
  25. rapidtide/data/examples/src/testfuncs +3 -3
  26. rapidtide/data/examples/src/testglmfilt +8 -6
  27. rapidtide/data/examples/src/testhappy +84 -51
  28. rapidtide/data/examples/src/testinitdelay +19 -0
  29. rapidtide/data/examples/src/testmodels +33 -0
  30. rapidtide/data/examples/src/testnewrefine +26 -0
  31. rapidtide/data/examples/src/testnoiseamp +2 -2
  32. rapidtide/data/examples/src/testppgproc +17 -0
  33. rapidtide/data/examples/src/testrefineonly +22 -0
  34. rapidtide/data/examples/src/testretro +26 -13
  35. rapidtide/data/examples/src/testretrolagtcs +16 -0
  36. rapidtide/data/examples/src/testrolloff +11 -0
  37. rapidtide/data/examples/src/testsimdata +45 -28
  38. rapidtide/data/models/model_cnn_pytorch/loss.png +0 -0
  39. rapidtide/data/models/model_cnn_pytorch/loss.txt +1 -0
  40. rapidtide/data/models/model_cnn_pytorch/model.pth +0 -0
  41. rapidtide/data/models/model_cnn_pytorch/model_meta.json +68 -0
  42. rapidtide/data/models/model_cnn_pytorch_fulldata/loss.png +0 -0
  43. rapidtide/data/models/model_cnn_pytorch_fulldata/loss.txt +1 -0
  44. rapidtide/data/models/model_cnn_pytorch_fulldata/model.pth +0 -0
  45. rapidtide/data/models/model_cnn_pytorch_fulldata/model_meta.json +80 -0
  46. rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.png +0 -0
  47. rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.txt +1 -0
  48. rapidtide/data/models/model_cnnbp_pytorch_fullldata/model.pth +0 -0
  49. rapidtide/data/models/model_cnnbp_pytorch_fullldata/model_meta.json +138 -0
  50. rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.png +0 -0
  51. rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.txt +1 -0
  52. rapidtide/data/models/model_cnnfft_pytorch_fulldata/model.pth +0 -0
  53. rapidtide/data/models/model_cnnfft_pytorch_fulldata/model_meta.json +128 -0
  54. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.png +0 -0
  55. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.txt +1 -0
  56. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model.pth +0 -0
  57. rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model_meta.json +49 -0
  58. rapidtide/data/models/model_revised_tf2/model.keras +0 -0
  59. rapidtide/data/models/{model_serdar → model_revised_tf2}/model_meta.json +1 -1
  60. rapidtide/data/models/model_serdar2_tf2/model.keras +0 -0
  61. rapidtide/data/models/{model_serdar2 → model_serdar2_tf2}/model_meta.json +1 -1
  62. rapidtide/data/models/model_serdar_tf2/model.keras +0 -0
  63. rapidtide/data/models/{model_revised → model_serdar_tf2}/model_meta.json +1 -1
  64. rapidtide/data/reference/HCP1200v2_MTT_2mm.nii.gz +0 -0
  65. rapidtide/data/reference/HCP1200v2_binmask_2mm.nii.gz +0 -0
  66. rapidtide/data/reference/HCP1200v2_csf_2mm.nii.gz +0 -0
  67. rapidtide/data/reference/HCP1200v2_gray_2mm.nii.gz +0 -0
  68. rapidtide/data/reference/HCP1200v2_graylaghist.json +7 -0
  69. rapidtide/data/reference/HCP1200v2_graylaghist.tsv.gz +0 -0
  70. rapidtide/data/reference/HCP1200v2_laghist.json +7 -0
  71. rapidtide/data/reference/HCP1200v2_laghist.tsv.gz +0 -0
  72. rapidtide/data/reference/HCP1200v2_mask_2mm.nii.gz +0 -0
  73. rapidtide/data/reference/HCP1200v2_maxcorr_2mm.nii.gz +0 -0
  74. rapidtide/data/reference/HCP1200v2_maxtime_2mm.nii.gz +0 -0
  75. rapidtide/data/reference/HCP1200v2_maxwidth_2mm.nii.gz +0 -0
  76. rapidtide/data/reference/HCP1200v2_negmask_2mm.nii.gz +0 -0
  77. rapidtide/data/reference/HCP1200v2_timepercentile_2mm.nii.gz +0 -0
  78. rapidtide/data/reference/HCP1200v2_white_2mm.nii.gz +0 -0
  79. rapidtide/data/reference/HCP1200v2_whitelaghist.json +7 -0
  80. rapidtide/data/reference/HCP1200v2_whitelaghist.tsv.gz +0 -0
  81. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2.xml +131 -0
  82. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_regions.txt +60 -0
  83. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_space-MNI152NLin6Asym_2mm.nii.gz +0 -0
  84. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm.nii.gz +0 -0
  85. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm_mask.nii.gz +0 -0
  86. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
  87. rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL2_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
  88. rapidtide/data/reference/MNI152_T1_1mm_Brain_FAST_seg.nii.gz +0 -0
  89. rapidtide/data/reference/MNI152_T1_1mm_Brain_Mask.nii.gz +0 -0
  90. rapidtide/data/reference/MNI152_T1_2mm_Brain_FAST_seg.nii.gz +0 -0
  91. rapidtide/data/reference/MNI152_T1_2mm_Brain_Mask.nii.gz +0 -0
  92. rapidtide/decorators.py +91 -0
  93. rapidtide/dlfilter.py +2553 -414
  94. rapidtide/dlfiltertorch.py +5201 -0
  95. rapidtide/externaltools.py +328 -13
  96. rapidtide/fMRIData_class.py +108 -92
  97. rapidtide/ffttools.py +168 -0
  98. rapidtide/filter.py +2704 -1462
  99. rapidtide/fit.py +2361 -579
  100. rapidtide/genericmultiproc.py +197 -0
  101. rapidtide/happy_supportfuncs.py +3255 -548
  102. rapidtide/helper_classes.py +587 -1116
  103. rapidtide/io.py +2569 -468
  104. rapidtide/linfitfiltpass.py +784 -0
  105. rapidtide/makelaggedtcs.py +267 -97
  106. rapidtide/maskutil.py +555 -25
  107. rapidtide/miscmath.py +835 -144
  108. rapidtide/multiproc.py +217 -44
  109. rapidtide/patchmatch.py +752 -0
  110. rapidtide/peakeval.py +32 -32
  111. rapidtide/ppgproc.py +2205 -0
  112. rapidtide/qualitycheck.py +353 -40
  113. rapidtide/refinedelay.py +854 -0
  114. rapidtide/refineregressor.py +939 -0
  115. rapidtide/resample.py +725 -204
  116. rapidtide/scripts/__init__.py +1 -0
  117. rapidtide/scripts/{adjustoffset → adjustoffset.py} +7 -2
  118. rapidtide/scripts/{aligntcs → aligntcs.py} +7 -2
  119. rapidtide/scripts/{applydlfilter → applydlfilter.py} +7 -2
  120. rapidtide/scripts/applyppgproc.py +28 -0
  121. rapidtide/scripts/{atlasaverage → atlasaverage.py} +7 -2
  122. rapidtide/scripts/{atlastool → atlastool.py} +7 -2
  123. rapidtide/scripts/{calcicc → calcicc.py} +7 -2
  124. rapidtide/scripts/{calctexticc → calctexticc.py} +7 -2
  125. rapidtide/scripts/{calcttest → calcttest.py} +7 -2
  126. rapidtide/scripts/{ccorrica → ccorrica.py} +7 -2
  127. rapidtide/scripts/delayvar.py +28 -0
  128. rapidtide/scripts/{diffrois → diffrois.py} +7 -2
  129. rapidtide/scripts/{endtidalproc → endtidalproc.py} +7 -2
  130. rapidtide/scripts/{fdica → fdica.py} +7 -2
  131. rapidtide/scripts/{filtnifti → filtnifti.py} +7 -2
  132. rapidtide/scripts/{filttc → filttc.py} +7 -2
  133. rapidtide/scripts/{fingerprint → fingerprint.py} +20 -16
  134. rapidtide/scripts/{fixtr → fixtr.py} +7 -2
  135. rapidtide/scripts/{gmscalc → gmscalc.py} +7 -2
  136. rapidtide/scripts/{happy → happy.py} +7 -2
  137. rapidtide/scripts/{happy2std → happy2std.py} +7 -2
  138. rapidtide/scripts/{happywarp → happywarp.py} +8 -4
  139. rapidtide/scripts/{histnifti → histnifti.py} +7 -2
  140. rapidtide/scripts/{histtc → histtc.py} +7 -2
  141. rapidtide/scripts/{glmfilt → linfitfilt.py} +7 -4
  142. rapidtide/scripts/{localflow → localflow.py} +7 -2
  143. rapidtide/scripts/{mergequality → mergequality.py} +7 -2
  144. rapidtide/scripts/{pairproc → pairproc.py} +7 -2
  145. rapidtide/scripts/{pairwisemergenifti → pairwisemergenifti.py} +7 -2
  146. rapidtide/scripts/{physiofreq → physiofreq.py} +7 -2
  147. rapidtide/scripts/{pixelcomp → pixelcomp.py} +7 -2
  148. rapidtide/scripts/{plethquality → plethquality.py} +7 -2
  149. rapidtide/scripts/{polyfitim → polyfitim.py} +7 -2
  150. rapidtide/scripts/{proj2flow → proj2flow.py} +7 -2
  151. rapidtide/scripts/{rankimage → rankimage.py} +7 -2
  152. rapidtide/scripts/{rapidtide → rapidtide.py} +7 -2
  153. rapidtide/scripts/{rapidtide2std → rapidtide2std.py} +7 -2
  154. rapidtide/scripts/{resamplenifti → resamplenifti.py} +7 -2
  155. rapidtide/scripts/{resampletc → resampletc.py} +7 -2
  156. rapidtide/scripts/retrolagtcs.py +28 -0
  157. rapidtide/scripts/retroregress.py +28 -0
  158. rapidtide/scripts/{roisummarize → roisummarize.py} +7 -2
  159. rapidtide/scripts/{runqualitycheck → runqualitycheck.py} +7 -2
  160. rapidtide/scripts/{showarbcorr → showarbcorr.py} +7 -2
  161. rapidtide/scripts/{showhist → showhist.py} +7 -2
  162. rapidtide/scripts/{showstxcorr → showstxcorr.py} +7 -2
  163. rapidtide/scripts/{showtc → showtc.py} +7 -2
  164. rapidtide/scripts/{showxcorr_legacy → showxcorr_legacy.py} +8 -8
  165. rapidtide/scripts/{showxcorrx → showxcorrx.py} +7 -2
  166. rapidtide/scripts/{showxy → showxy.py} +7 -2
  167. rapidtide/scripts/{simdata → simdata.py} +7 -2
  168. rapidtide/scripts/{spatialdecomp → spatialdecomp.py} +7 -2
  169. rapidtide/scripts/{spatialfit → spatialfit.py} +7 -2
  170. rapidtide/scripts/{spatialmi → spatialmi.py} +7 -2
  171. rapidtide/scripts/{spectrogram → spectrogram.py} +7 -2
  172. rapidtide/scripts/stupidramtricks.py +238 -0
  173. rapidtide/scripts/{synthASL → synthASL.py} +7 -2
  174. rapidtide/scripts/{tcfrom2col → tcfrom2col.py} +7 -2
  175. rapidtide/scripts/{tcfrom3col → tcfrom3col.py} +7 -2
  176. rapidtide/scripts/{temporaldecomp → temporaldecomp.py} +7 -2
  177. rapidtide/scripts/{testhrv → testhrv.py} +1 -1
  178. rapidtide/scripts/{threeD → threeD.py} +7 -2
  179. rapidtide/scripts/{tidepool → tidepool.py} +7 -2
  180. rapidtide/scripts/{variabilityizer → variabilityizer.py} +7 -2
  181. rapidtide/simFuncClasses.py +2113 -0
  182. rapidtide/simfuncfit.py +312 -108
  183. rapidtide/stats.py +579 -247
  184. rapidtide/tests/.coveragerc +27 -6
  185. rapidtide-2.9.6.data/scripts/fdica → rapidtide/tests/cleanposttest +4 -6
  186. rapidtide/tests/happycomp +9 -0
  187. rapidtide/tests/resethappytargets +1 -1
  188. rapidtide/tests/resetrapidtidetargets +1 -1
  189. rapidtide/tests/resettargets +1 -1
  190. rapidtide/tests/runlocaltest +3 -3
  191. rapidtide/tests/showkernels +1 -1
  192. rapidtide/tests/test_aliasedcorrelate.py +4 -4
  193. rapidtide/tests/test_aligntcs.py +1 -1
  194. rapidtide/tests/test_calcicc.py +1 -1
  195. rapidtide/tests/test_cleanregressor.py +184 -0
  196. rapidtide/tests/test_congrid.py +70 -81
  197. rapidtide/tests/test_correlate.py +1 -1
  198. rapidtide/tests/test_corrpass.py +4 -4
  199. rapidtide/tests/test_delayestimation.py +54 -59
  200. rapidtide/tests/test_dlfiltertorch.py +437 -0
  201. rapidtide/tests/test_doresample.py +2 -2
  202. rapidtide/tests/test_externaltools.py +69 -0
  203. rapidtide/tests/test_fastresampler.py +9 -5
  204. rapidtide/tests/test_filter.py +96 -57
  205. rapidtide/tests/test_findmaxlag.py +50 -19
  206. rapidtide/tests/test_fullrunhappy_v1.py +15 -10
  207. rapidtide/tests/test_fullrunhappy_v2.py +19 -13
  208. rapidtide/tests/test_fullrunhappy_v3.py +28 -13
  209. rapidtide/tests/test_fullrunhappy_v4.py +30 -11
  210. rapidtide/tests/test_fullrunhappy_v5.py +62 -0
  211. rapidtide/tests/test_fullrunrapidtide_v1.py +61 -7
  212. rapidtide/tests/test_fullrunrapidtide_v2.py +26 -14
  213. rapidtide/tests/test_fullrunrapidtide_v3.py +28 -8
  214. rapidtide/tests/test_fullrunrapidtide_v4.py +16 -8
  215. rapidtide/tests/test_fullrunrapidtide_v5.py +15 -6
  216. rapidtide/tests/test_fullrunrapidtide_v6.py +142 -0
  217. rapidtide/tests/test_fullrunrapidtide_v7.py +114 -0
  218. rapidtide/tests/test_fullrunrapidtide_v8.py +66 -0
  219. rapidtide/tests/test_getparsers.py +158 -0
  220. rapidtide/tests/test_io.py +59 -18
  221. rapidtide/tests/{test_glmpass.py → test_linfitfiltpass.py} +10 -10
  222. rapidtide/tests/test_mi.py +1 -1
  223. rapidtide/tests/test_miscmath.py +1 -1
  224. rapidtide/tests/test_motionregress.py +5 -5
  225. rapidtide/tests/test_nullcorr.py +6 -9
  226. rapidtide/tests/test_padvec.py +216 -0
  227. rapidtide/tests/test_parserfuncs.py +101 -0
  228. rapidtide/tests/test_phaseanalysis.py +1 -1
  229. rapidtide/tests/test_rapidtideparser.py +59 -53
  230. rapidtide/tests/test_refinedelay.py +296 -0
  231. rapidtide/tests/test_runmisc.py +5 -5
  232. rapidtide/tests/test_sharedmem.py +60 -0
  233. rapidtide/tests/test_simroundtrip.py +132 -0
  234. rapidtide/tests/test_simulate.py +1 -1
  235. rapidtide/tests/test_stcorrelate.py +4 -2
  236. rapidtide/tests/test_timeshift.py +2 -2
  237. rapidtide/tests/test_valtoindex.py +1 -1
  238. rapidtide/tests/test_zRapidtideDataset.py +5 -3
  239. rapidtide/tests/utils.py +10 -9
  240. rapidtide/tidepoolTemplate.py +88 -70
  241. rapidtide/tidepoolTemplate.ui +60 -46
  242. rapidtide/tidepoolTemplate_alt.py +88 -53
  243. rapidtide/tidepoolTemplate_alt.ui +62 -52
  244. rapidtide/tidepoolTemplate_alt_qt6.py +921 -0
  245. rapidtide/tidepoolTemplate_big.py +1125 -0
  246. rapidtide/tidepoolTemplate_big.ui +2386 -0
  247. rapidtide/tidepoolTemplate_big_qt6.py +1129 -0
  248. rapidtide/tidepoolTemplate_qt6.py +793 -0
  249. rapidtide/util.py +1389 -148
  250. rapidtide/voxelData.py +1048 -0
  251. rapidtide/wiener.py +138 -25
  252. rapidtide/wiener2.py +114 -8
  253. rapidtide/workflows/adjustoffset.py +107 -5
  254. rapidtide/workflows/aligntcs.py +86 -3
  255. rapidtide/workflows/applydlfilter.py +231 -89
  256. rapidtide/workflows/applyppgproc.py +540 -0
  257. rapidtide/workflows/atlasaverage.py +309 -48
  258. rapidtide/workflows/atlastool.py +130 -9
  259. rapidtide/workflows/calcSimFuncMap.py +490 -0
  260. rapidtide/workflows/calctexticc.py +202 -10
  261. rapidtide/workflows/ccorrica.py +123 -15
  262. rapidtide/workflows/cleanregressor.py +415 -0
  263. rapidtide/workflows/delayvar.py +1268 -0
  264. rapidtide/workflows/diffrois.py +84 -6
  265. rapidtide/workflows/endtidalproc.py +149 -9
  266. rapidtide/workflows/fdica.py +197 -17
  267. rapidtide/workflows/filtnifti.py +71 -4
  268. rapidtide/workflows/filttc.py +76 -5
  269. rapidtide/workflows/fitSimFuncMap.py +578 -0
  270. rapidtide/workflows/fixtr.py +74 -4
  271. rapidtide/workflows/gmscalc.py +116 -6
  272. rapidtide/workflows/happy.py +1242 -480
  273. rapidtide/workflows/happy2std.py +145 -13
  274. rapidtide/workflows/happy_parser.py +277 -59
  275. rapidtide/workflows/histnifti.py +120 -4
  276. rapidtide/workflows/histtc.py +85 -4
  277. rapidtide/workflows/{glmfilt.py → linfitfilt.py} +128 -14
  278. rapidtide/workflows/localflow.py +329 -29
  279. rapidtide/workflows/mergequality.py +80 -4
  280. rapidtide/workflows/niftidecomp.py +323 -19
  281. rapidtide/workflows/niftistats.py +178 -8
  282. rapidtide/workflows/pairproc.py +99 -5
  283. rapidtide/workflows/pairwisemergenifti.py +86 -3
  284. rapidtide/workflows/parser_funcs.py +1488 -56
  285. rapidtide/workflows/physiofreq.py +139 -12
  286. rapidtide/workflows/pixelcomp.py +211 -9
  287. rapidtide/workflows/plethquality.py +105 -23
  288. rapidtide/workflows/polyfitim.py +159 -19
  289. rapidtide/workflows/proj2flow.py +76 -3
  290. rapidtide/workflows/rankimage.py +115 -8
  291. rapidtide/workflows/rapidtide.py +1785 -1858
  292. rapidtide/workflows/rapidtide2std.py +101 -3
  293. rapidtide/workflows/rapidtide_parser.py +590 -389
  294. rapidtide/workflows/refineDelayMap.py +249 -0
  295. rapidtide/workflows/refineRegressor.py +1215 -0
  296. rapidtide/workflows/regressfrommaps.py +308 -0
  297. rapidtide/workflows/resamplenifti.py +86 -4
  298. rapidtide/workflows/resampletc.py +92 -4
  299. rapidtide/workflows/retrolagtcs.py +442 -0
  300. rapidtide/workflows/retroregress.py +1501 -0
  301. rapidtide/workflows/roisummarize.py +176 -7
  302. rapidtide/workflows/runqualitycheck.py +72 -7
  303. rapidtide/workflows/showarbcorr.py +172 -16
  304. rapidtide/workflows/showhist.py +87 -3
  305. rapidtide/workflows/showstxcorr.py +161 -4
  306. rapidtide/workflows/showtc.py +172 -10
  307. rapidtide/workflows/showxcorrx.py +250 -62
  308. rapidtide/workflows/showxy.py +186 -16
  309. rapidtide/workflows/simdata.py +418 -112
  310. rapidtide/workflows/spatialfit.py +83 -8
  311. rapidtide/workflows/spatialmi.py +252 -29
  312. rapidtide/workflows/spectrogram.py +306 -33
  313. rapidtide/workflows/synthASL.py +157 -6
  314. rapidtide/workflows/tcfrom2col.py +77 -3
  315. rapidtide/workflows/tcfrom3col.py +75 -3
  316. rapidtide/workflows/tidepool.py +3829 -666
  317. rapidtide/workflows/utils.py +45 -19
  318. rapidtide/workflows/utils_doc.py +293 -0
  319. rapidtide/workflows/variabilityizer.py +118 -5
  320. {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info}/METADATA +30 -223
  321. rapidtide-3.1.3.dist-info/RECORD +393 -0
  322. {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info}/WHEEL +1 -1
  323. rapidtide-3.1.3.dist-info/entry_points.txt +65 -0
  324. rapidtide-3.1.3.dist-info/top_level.txt +2 -0
  325. rapidtide/calcandfitcorrpairs.py +0 -262
  326. rapidtide/data/examples/src/testoutputsize +0 -45
  327. rapidtide/data/models/model_revised/model.h5 +0 -0
  328. rapidtide/data/models/model_serdar/model.h5 +0 -0
  329. rapidtide/data/models/model_serdar2/model.h5 +0 -0
  330. rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm.nii.gz +0 -0
  331. rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm_mask.nii.gz +0 -0
  332. rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm.nii.gz +0 -0
  333. rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm_mask.nii.gz +0 -0
  334. rapidtide/data/reference/HCP1200_binmask_2mm_2009c_asym.nii.gz +0 -0
  335. rapidtide/data/reference/HCP1200_lag_2mm_2009c_asym.nii.gz +0 -0
  336. rapidtide/data/reference/HCP1200_mask_2mm_2009c_asym.nii.gz +0 -0
  337. rapidtide/data/reference/HCP1200_negmask_2mm_2009c_asym.nii.gz +0 -0
  338. rapidtide/data/reference/HCP1200_sigma_2mm_2009c_asym.nii.gz +0 -0
  339. rapidtide/data/reference/HCP1200_strength_2mm_2009c_asym.nii.gz +0 -0
  340. rapidtide/glmpass.py +0 -434
  341. rapidtide/refine_factored.py +0 -641
  342. rapidtide/scripts/retroglm +0 -23
  343. rapidtide/workflows/glmfrommaps.py +0 -202
  344. rapidtide/workflows/retroglm.py +0 -643
  345. rapidtide-2.9.6.data/scripts/adjustoffset +0 -23
  346. rapidtide-2.9.6.data/scripts/aligntcs +0 -23
  347. rapidtide-2.9.6.data/scripts/applydlfilter +0 -23
  348. rapidtide-2.9.6.data/scripts/atlasaverage +0 -23
  349. rapidtide-2.9.6.data/scripts/atlastool +0 -23
  350. rapidtide-2.9.6.data/scripts/calcicc +0 -22
  351. rapidtide-2.9.6.data/scripts/calctexticc +0 -23
  352. rapidtide-2.9.6.data/scripts/calcttest +0 -22
  353. rapidtide-2.9.6.data/scripts/ccorrica +0 -23
  354. rapidtide-2.9.6.data/scripts/diffrois +0 -23
  355. rapidtide-2.9.6.data/scripts/endtidalproc +0 -23
  356. rapidtide-2.9.6.data/scripts/filtnifti +0 -23
  357. rapidtide-2.9.6.data/scripts/filttc +0 -23
  358. rapidtide-2.9.6.data/scripts/fingerprint +0 -593
  359. rapidtide-2.9.6.data/scripts/fixtr +0 -23
  360. rapidtide-2.9.6.data/scripts/glmfilt +0 -24
  361. rapidtide-2.9.6.data/scripts/gmscalc +0 -22
  362. rapidtide-2.9.6.data/scripts/happy +0 -25
  363. rapidtide-2.9.6.data/scripts/happy2std +0 -23
  364. rapidtide-2.9.6.data/scripts/happywarp +0 -350
  365. rapidtide-2.9.6.data/scripts/histnifti +0 -23
  366. rapidtide-2.9.6.data/scripts/histtc +0 -23
  367. rapidtide-2.9.6.data/scripts/localflow +0 -23
  368. rapidtide-2.9.6.data/scripts/mergequality +0 -23
  369. rapidtide-2.9.6.data/scripts/pairproc +0 -23
  370. rapidtide-2.9.6.data/scripts/pairwisemergenifti +0 -23
  371. rapidtide-2.9.6.data/scripts/physiofreq +0 -23
  372. rapidtide-2.9.6.data/scripts/pixelcomp +0 -23
  373. rapidtide-2.9.6.data/scripts/plethquality +0 -23
  374. rapidtide-2.9.6.data/scripts/polyfitim +0 -23
  375. rapidtide-2.9.6.data/scripts/proj2flow +0 -23
  376. rapidtide-2.9.6.data/scripts/rankimage +0 -23
  377. rapidtide-2.9.6.data/scripts/rapidtide +0 -23
  378. rapidtide-2.9.6.data/scripts/rapidtide2std +0 -23
  379. rapidtide-2.9.6.data/scripts/resamplenifti +0 -23
  380. rapidtide-2.9.6.data/scripts/resampletc +0 -23
  381. rapidtide-2.9.6.data/scripts/retroglm +0 -23
  382. rapidtide-2.9.6.data/scripts/roisummarize +0 -23
  383. rapidtide-2.9.6.data/scripts/runqualitycheck +0 -23
  384. rapidtide-2.9.6.data/scripts/showarbcorr +0 -23
  385. rapidtide-2.9.6.data/scripts/showhist +0 -23
  386. rapidtide-2.9.6.data/scripts/showstxcorr +0 -23
  387. rapidtide-2.9.6.data/scripts/showtc +0 -23
  388. rapidtide-2.9.6.data/scripts/showxcorr_legacy +0 -536
  389. rapidtide-2.9.6.data/scripts/showxcorrx +0 -23
  390. rapidtide-2.9.6.data/scripts/showxy +0 -23
  391. rapidtide-2.9.6.data/scripts/simdata +0 -23
  392. rapidtide-2.9.6.data/scripts/spatialdecomp +0 -23
  393. rapidtide-2.9.6.data/scripts/spatialfit +0 -23
  394. rapidtide-2.9.6.data/scripts/spatialmi +0 -23
  395. rapidtide-2.9.6.data/scripts/spectrogram +0 -23
  396. rapidtide-2.9.6.data/scripts/synthASL +0 -23
  397. rapidtide-2.9.6.data/scripts/tcfrom2col +0 -23
  398. rapidtide-2.9.6.data/scripts/tcfrom3col +0 -23
  399. rapidtide-2.9.6.data/scripts/temporaldecomp +0 -23
  400. rapidtide-2.9.6.data/scripts/threeD +0 -236
  401. rapidtide-2.9.6.data/scripts/tidepool +0 -23
  402. rapidtide-2.9.6.data/scripts/variabilityizer +0 -23
  403. rapidtide-2.9.6.dist-info/RECORD +0 -359
  404. rapidtide-2.9.6.dist-info/top_level.txt +0 -86
  405. {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info/licenses}/LICENSE +0 -0
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  # -*- coding: utf-8 -*-
3
3
  #
4
- # Copyright 2016-2024 Blaise Frederick
4
+ # Copyright 2016-2025 Blaise Frederick
5
5
  #
6
6
  # Licensed under the Apache License, Version 2.0 (the "License");
7
7
  # you may not use this file except in compliance with the License.
@@ -18,18 +18,46 @@
18
18
  #
19
19
  import argparse
20
20
  import copy
21
+ from argparse import Namespace
22
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
21
23
 
22
24
  import nibabel as nib
23
25
  import numpy as np
24
26
  import pandas as pd
27
+ from numpy.typing import NDArray
25
28
 
26
29
  import rapidtide.io as tide_io
27
30
  import rapidtide.workflows.parser_funcs as pf
28
31
 
29
32
 
30
- def _get_parser():
33
+ def _get_parser() -> Any:
31
34
  """
32
- Argument parser for diffrois
35
+ Argument parser for diffrois.
36
+
37
+ This function creates and configures an argument parser for the diffrois command-line tool.
38
+ It defines required and optional arguments needed to process ROI (Region of Interest) data
39
+ from a CSV file and generate difference matrices.
40
+
41
+ Returns
42
+ -------
43
+ argparse.ArgumentParser
44
+ Configured argument parser object with defined arguments for diffrois.
45
+
46
+ Notes
47
+ -----
48
+ The parser is configured with:
49
+ - A required datafile argument (CSV input)
50
+ - A required outputroot argument (root name for output files)
51
+ - Optional keyfile argument to specify region label order
52
+ - Optional maxlines argument to limit processing to first N lines
53
+ - Optional debug flag for verbose output
54
+
55
+ Examples
56
+ --------
57
+ >>> parser = _get_parser()
58
+ >>> args = parser.parse_args(['data.csv', 'output_root'])
59
+ >>> print(args.datafile)
60
+ 'data.csv'
33
61
  """
34
62
  parser = argparse.ArgumentParser(
35
63
  prog="diffrois",
@@ -77,7 +105,57 @@ def _get_parser():
77
105
  return parser
78
106
 
79
107
 
80
- def diffrois(args):
108
+ def diffrois(args: Any) -> None:
109
+ """
110
+ Compute pairwise differences between regions in a CSV file and save results as NIfTI images.
111
+
112
+ This function reads region data from a CSV file, computes pairwise differences between
113
+ regions, and saves the results as NIfTI images. It also computes mean and standard
114
+ deviation maps of the differences and saves those as well. The function supports
115
+ optional masking of invalid (NaN) values and can limit the number of input lines
116
+ processed.
117
+
118
+ Parameters
119
+ ----------
120
+ args : argparse.Namespace
121
+ An object containing the following attributes:
122
+ - datafile : str
123
+ Path to the input CSV file containing region data.
124
+ - keyfile : str, optional
125
+ Path to a file listing column keys in the CSV to use for processing.
126
+ - outputroot : str
127
+ Root name for output NIfTI files.
128
+ - maxlines : int, optional
129
+ Maximum number of lines to process from the input CSV.
130
+ - debug : bool
131
+ If True, print debug information during execution.
132
+
133
+ Returns
134
+ -------
135
+ None
136
+ This function does not return any value but saves multiple NIfTI files to disk.
137
+
138
+ Notes
139
+ -----
140
+ The function saves the following NIfTI files:
141
+ - `{outputroot}_diffs.nii.gz`: Pairwise differences between regions.
142
+ - `{outputroot}_mask.nii.gz`: Binary mask indicating valid (non-NaN) values.
143
+ - `{outputroot}_meandiffs.nii.gz`: Mean of differences for each region pair.
144
+ - `{outputroot}_stddiffs.nii.gz`: Standard deviation of differences for each region pair.
145
+ - `{outputroot}_demeaneddiffs.nii.gz`: Demeaned differences (difference minus mean).
146
+
147
+ Examples
148
+ --------
149
+ >>> import argparse
150
+ >>> args = argparse.Namespace(
151
+ ... datafile='data.csv',
152
+ ... keyfile='keys.txt',
153
+ ... outputroot='output',
154
+ ... maxlines=100,
155
+ ... debug=False
156
+ ... )
157
+ >>> diffrois(args)
158
+ """
81
159
  df = pd.read_csv(args.datafile)
82
160
 
83
161
  theregions = np.array(df.columns[1:].values)
@@ -141,8 +219,8 @@ def diffrois(args):
141
219
  numvox = numoutregions * numoutregions
142
220
  thediffs_rs = thediffs.reshape((numvox, numlabels))
143
221
  themask_rs = themask.reshape((numvox, numlabels))
144
- themeandiffs_rs = thediffs_rs[:, 0] * 0.0
145
- thestddiffs_rs = thediffs_rs[:, 0] * 0.0
222
+ themeandiffs_rs = np.zeros_like(thediffs_rs[:, 0])
223
+ thestddiffs_rs = np.zeros_like(thediffs_rs[:, 0])
146
224
  for idx in range(numvox):
147
225
  inputvec = thediffs_rs[idx, :]
148
226
  inputmask = themask_rs[idx, :]
@@ -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.
@@ -19,19 +19,85 @@
19
19
  import argparse
20
20
  import bisect
21
21
  import sys
22
+ from argparse import Namespace
23
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
22
24
 
23
25
  import numpy as np
26
+ from numpy.typing import NDArray
24
27
 
25
28
  import rapidtide.fit as tide_fit
26
29
  import rapidtide.io as tide_io
27
30
  from rapidtide.workflows.parser_funcs import invert_float, is_float
28
31
 
29
32
 
30
- def phase(mcv):
33
+ def phase(mcv: Any) -> None:
34
+ """
35
+ Compute the phase angle of a complex number.
36
+
37
+ This function calculates the phase angle (also known as the argument) of a complex number
38
+ using the arctan2 function, which correctly handles all quadrants and special cases.
39
+
40
+ Parameters
41
+ ----------
42
+ mcv : Any
43
+ A complex number or array of complex numbers for which to compute the phase angle.
44
+ Can be a scalar complex number or an array-like object containing complex numbers.
45
+
46
+ Returns
47
+ -------
48
+ ndarray or scalar
49
+ The phase angle in radians. The return type matches the input type, returning
50
+ a scalar for scalar input or an array for array input. The phase angle is
51
+ in the range [-π, π].
52
+
53
+ Notes
54
+ -----
55
+ This function uses `np.arctan2(mcv.imag, mcv.real)` which is preferred over
56
+ `np.arctan(mcv.imag/mcv.real)` because it correctly handles the quadrant
57
+ and avoids division by zero errors.
58
+
59
+ Examples
60
+ --------
61
+ >>> import numpy as np
62
+ >>> phase(1+1j)
63
+ 0.7853981633974483
64
+
65
+ >>> phase(-1-1j)
66
+ -2.3561944901923448
67
+
68
+ >>> phase(np.array([1+1j, -1-1j]))
69
+ array([ 0.78539816, -2.35619449])
70
+ """
31
71
  return np.arctan2(mcv.imag, mcv.real)
32
72
 
33
73
 
34
- def _get_parser():
74
+ def _get_parser() -> Any:
75
+ """
76
+ Create and configure an argument parser for the endtidalproc command-line tool.
77
+
78
+ This function sets up an `argparse.ArgumentParser` with various options to process
79
+ a gas trace and generate an endtidal waveform. It supports input and output file
80
+ specifications, sample rate configuration, time range settings, threshold for
81
+ peak detection, and debugging options.
82
+
83
+ Returns
84
+ -------
85
+ argparse.ArgumentParser
86
+ Configured argument parser object with all required and optional arguments.
87
+
88
+ Notes
89
+ -----
90
+ The parser is designed for use with the `endtidalproc` program and includes
91
+ mutually exclusive group for specifying sample rate either as frequency or
92
+ time step. The default sample rate is 1 Hz.
93
+
94
+ Examples
95
+ --------
96
+ >>> parser = _get_parser()
97
+ >>> args = parser.parse_args(['input.txt', 'output.txt'])
98
+ >>> print(args.infilename)
99
+ 'input.txt'
100
+ """
35
101
  # get the command line parameters
36
102
  parser = argparse.ArgumentParser(
37
103
  prog="endtidalproc",
@@ -90,7 +156,7 @@ def _get_parser():
90
156
  dest="thresh",
91
157
  metavar="PCT",
92
158
  type=float,
93
- help="Amount of fall (or rise) needed, in percent, to recognize a peak (or trough).",
159
+ help="Amount of fall (or rise) needed, in percent, to recognize a peak (or through).",
94
160
  default=1.0,
95
161
  )
96
162
  parser.add_argument(
@@ -104,7 +170,45 @@ def _get_parser():
104
170
  return parser
105
171
 
106
172
 
107
- def process_args():
173
+ def process_args(args: Any) -> None:
174
+ """
175
+ Process and validate input arguments for audio processing.
176
+
177
+ This function sets default values for samplerate if not provided and
178
+ optionally prints debug information when debug mode is enabled.
179
+
180
+ Parameters
181
+ ----------
182
+ args : Any
183
+ An object containing audio processing arguments. Expected to have
184
+ attributes 'samplerate' and 'debug'. The 'samplerate' attribute
185
+ will be set to 1.0 if None, and 'debug' controls whether to print
186
+ argument information.
187
+
188
+ Returns
189
+ -------
190
+ None
191
+ This function modifies the args object in-place and does not return
192
+ a value.
193
+
194
+ Notes
195
+ -----
196
+ - The function modifies the input args object in-place
197
+ - Default samplerate is set to 1.0 when None is provided
198
+ - Debug output is printed only when args.debug is True
199
+
200
+ Examples
201
+ --------
202
+ >>> class Args:
203
+ ... def __init__(self):
204
+ ... self.samplerate = None
205
+ ... self.debug = True
206
+ ...
207
+ >>> args = Args()
208
+ >>> process_args(args)
209
+ >>> print(args.samplerate)
210
+ 1.0
211
+ """
108
212
  if args.samplerate is None:
109
213
  args.samplerate = 1.0
110
214
 
@@ -116,8 +220,44 @@ def process_args():
116
220
  return args
117
221
 
118
222
 
119
- def endtidalproc(args):
120
- args = process_args()
223
+ def endtidalproc() -> None:
224
+ """
225
+ Process tidal data to detect peaks and interpolate values for output.
226
+
227
+ This function reads a time series from an input file, detects either maximum or
228
+ minimum peaks depending on whether the data is treated as oxygen or CO2, and
229
+ interpolates the peak values over the full time range. The resulting interpolated
230
+ data is written to an output file.
231
+
232
+ Parameters
233
+ ----------
234
+ None
235
+ This function does not take any direct parameters. It reads from command-line
236
+ arguments and system input files.
237
+
238
+ Returns
239
+ -------
240
+ None
241
+ This function does not return any value. It performs file I/O operations
242
+ and writes results to disk.
243
+
244
+ Notes
245
+ -----
246
+ - The function uses `bisect` to find the start and end indices in the time vector
247
+ based on the provided start and end times.
248
+ - Peak detection is performed using `tide_fit.peakdetect`, which requires a
249
+ `lookahead` parameter and a `delta` threshold.
250
+ - If `isoxygen` is True, the function detects minimum peaks; otherwise, it detects
251
+ maximum peaks.
252
+ - The interpolation is linear between detected peaks.
253
+
254
+ Examples
255
+ --------
256
+ >>> endtidalproc()
257
+ Fitting trace as CO2
258
+ endtime must be greater then starttime;
259
+ """
260
+ args = process_args(_get_parser().parse_args(sys.argv[1:]))
121
261
 
122
262
  if args.isoxygen:
123
263
  print("Fitting trace as oxygen")
@@ -138,7 +278,7 @@ def endtidalproc(args):
138
278
  args.thestarttime = xvec[thestartpoint]
139
279
  args.theendtime = xvec[theendpoint]
140
280
 
141
- # set parameters - maxtime is the longest to look ahead for a peak (or trough) in seconds
281
+ # set parameters - maxtime is the longest to look ahead for a peak (or through) in seconds
142
282
  # lookahead should be '(samples / period) / f' where '4 >= f >= 1.25' might be a good value
143
283
  maxtime = 1.0
144
284
  f = 2.0
@@ -166,4 +306,4 @@ def endtidalproc(args):
166
306
 
167
307
 
168
308
  if __name__ == "__main__":
169
- main()
309
+ endtidalproc()
@@ -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.
@@ -40,22 +40,126 @@ if pyfftwpresent:
40
40
  pyfftw.interfaces.cache.enable()
41
41
 
42
42
 
43
+ from argparse import Namespace
44
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
45
+
46
+ from numpy.typing import NDArray
47
+
43
48
  import rapidtide.filter as tide_filt
44
49
  import rapidtide.io as tide_io
45
50
  from rapidtide.workflows.parser_funcs import is_valid_file
46
51
 
47
52
 
48
- def P2R(radii, angles):
53
+ def P2R(radii: Any, angles: Any) -> None:
54
+ """
55
+ Convert polar coordinates to complex numbers.
56
+
57
+ Convert polar coordinates (radii, angles) to complex numbers using the formula
58
+ z = r * exp(i * θ), where r is the radius and θ is the angle in radians.
59
+
60
+ Parameters
61
+ ----------
62
+ radii : Any
63
+ The radial coordinates (magnitude) of the points in polar coordinates.
64
+ Should be a numeric type or array-like object.
65
+ angles : Any
66
+ The angular coordinates (in radians) of the points in polar coordinates.
67
+ Should be a numeric type or array-like object.
68
+
69
+ Returns
70
+ -------
71
+ complex
72
+ Complex numbers in the form z = r * exp(i * θ).
73
+ Returns None if the input parameters are not compatible.
74
+
75
+ Notes
76
+ -----
77
+ This function assumes that the angles are provided in radians.
78
+ The function uses NumPy's exponential function for complex number computation.
79
+
80
+ Examples
81
+ --------
82
+ >>> import numpy as np
83
+ >>> P2R(1, 0)
84
+ (1+0j)
85
+
86
+ >>> P2R(2, np.pi/2)
87
+ (1.2246467991473532e-16+2j)
88
+
89
+ >>> P2R([1, 2, 3], [0, np.pi/2, np.pi])
90
+ [1.+0.j 2.+0.j 3.+0.j]
91
+ """
49
92
  return radii * np.exp(1j * angles)
50
93
 
51
94
 
52
- def R2P(x):
95
+ def R2P(x: Any) -> None:
96
+ """
97
+ Convert rectangular coordinates to polar coordinates.
98
+
99
+ This function converts complex numbers from rectangular (Cartesian) coordinates
100
+ to polar coordinates, returning the magnitude (absolute value) and phase angle.
101
+
102
+ Parameters
103
+ ----------
104
+ x : Any
105
+ Input array-like object containing complex numbers or real numbers.
106
+ Can be a scalar, list, tuple, or numpy array.
107
+
108
+ Returns
109
+ -------
110
+ tuple
111
+ A tuple containing two numpy arrays:
112
+ - First array: absolute values (magnitudes) of input elements
113
+ - Second array: angles (in radians) of input elements
114
+
115
+ Notes
116
+ -----
117
+ For real numbers, the angle is 0 for positive values and π for negative values.
118
+ For complex numbers, the angle is computed using numpy's angle function.
119
+
120
+ Examples
121
+ --------
122
+ >>> import numpy as np
123
+ >>> R2P([1+1j, -1-1j, 2])
124
+ (array([1.41421356, 1.41421356, 2. ]), array([0.78539816, -2.35619449, 0. ]))
125
+
126
+ >>> R2P(np.array([3+4j, 1-1j]))
127
+ (array([5., 1.41421356]), array([0.92729522, -0.78539816]))
128
+ """
53
129
  return np.absolute(x), np.angle(x)
54
130
 
55
131
 
56
- def _get_parser():
132
+ def _get_parser() -> Any:
57
133
  """
58
- Argument parser for fdica
134
+ Argument parser for fdica.
135
+
136
+ This function constructs and returns an `argparse.ArgumentParser` object configured
137
+ for parsing command-line arguments for the `fdica` tool. The parser is designed to
138
+ handle inputs for fitting a spatial template to 3D or 4D NIFTI files, with options
139
+ for spatial filtering, PCA, and ICA decomposition.
140
+
141
+ Returns
142
+ -------
143
+ argparse.ArgumentParser
144
+ Configured argument parser for the fdica tool.
145
+
146
+ Notes
147
+ -----
148
+ The parser expects three required positional arguments:
149
+ - `datafile`: The 3D or 4D NIFTI file to fit.
150
+ - `datamask`: A 3D NIFTI file mask (must match `datafile`).
151
+ - `outputroot`: Root name for output files.
152
+
153
+ Optional arguments include:
154
+ - `--spatialfilt`: Apply Gaussian spatial filtering.
155
+ - `--pcacomponents`: Number of PCA components for phase fitting.
156
+ - `--icacomponents`: Number of ICA components for decomposition.
157
+ - `--debug`: Enable debugging output.
158
+
159
+ Examples
160
+ --------
161
+ >>> parser = _get_parser()
162
+ >>> args = parser.parse_args()
59
163
  """
60
164
  parser = argparse.ArgumentParser(
61
165
  prog="fdica",
@@ -117,16 +221,65 @@ def _get_parser():
117
221
 
118
222
 
119
223
  def fdica(
120
- datafile,
121
- datamask,
122
- outputroot,
123
- gausssigma=0.0,
124
- pcacomponents="mle",
125
- icacomponents=None,
126
- lowerfreq=0.009,
127
- upperfreq=0.15,
128
- debug=False,
129
- ):
224
+ datafile: Any,
225
+ datamask: Any,
226
+ outputroot: Any,
227
+ gausssigma: float = 0.0,
228
+ pcacomponents: str = "mle",
229
+ icacomponents: Optional[Any] = None,
230
+ lowerfreq: float = 0.009,
231
+ upperfreq: float = 0.15,
232
+ debug: bool = False,
233
+ ) -> None:
234
+ """
235
+ Perform frequency-domain independent component analysis (FDICA) on fMRI data.
236
+
237
+ This function reads fMRI data and a corresponding mask, applies spatial filtering if
238
+ requested, performs FFT, and conducts PCA and ICA on the frequency-domain data to
239
+ decompose the signal into independent components. It saves various intermediate and
240
+ final outputs including magnitude, phase, PCA components, and ICA components.
241
+
242
+ Parameters
243
+ ----------
244
+ datafile : Any
245
+ Path to the input NIfTI fMRI data file.
246
+ datamask : Any
247
+ Path to the NIfTI mask file defining the region of interest.
248
+ outputroot : Any
249
+ Root name for output NIfTI files.
250
+ gausssigma : float, optional
251
+ Standard deviation for Gaussian spatial smoothing. If less than 0, automatically
252
+ calculated as mean of spatial dimensions divided by 2. Default is 0.0.
253
+ pcacomponents : str or int, optional
254
+ Number of PCA components to retain. If "mle", uses the minimum description
255
+ length criterion. Default is "mle".
256
+ icacomponents : int, optional
257
+ Number of ICA components to extract. If None, defaults to the number of PCA
258
+ components. Default is None.
259
+ lowerfreq : float, optional
260
+ Lower frequency bound in Hz. Default is 0.009.
261
+ upperfreq : float, optional
262
+ Upper frequency bound in Hz. Default is 0.15.
263
+ debug : bool, optional
264
+ If True, enables debug output. Default is False.
265
+
266
+ Returns
267
+ -------
268
+ None
269
+ The function writes multiple NIfTI files and text files to disk but does not return anything.
270
+
271
+ Notes
272
+ -----
273
+ - The function assumes the input data is in NIfTI format and the mask is 3D.
274
+ - Frequency trimming is performed based on the specified lower and upper bounds.
275
+ - PCA and ICA are applied to the phase data after detrending.
276
+ - Intermediate outputs include magnitude, phase, PCA components, and ICA components.
277
+ - The final reconstructed signal is saved as a NIfTI file.
278
+
279
+ Examples
280
+ --------
281
+ >>> fdica('fmri_data.nii', 'mask.nii', 'output', gausssigma=2.0, lowerfreq=0.01, upperfreq=0.1)
282
+ """
130
283
  # read in data
131
284
  print("reading in data arrays")
132
285
  (
@@ -269,7 +422,7 @@ def fdica(
269
422
  # remove mean and linear component
270
423
  phasemeans = np.zeros((numfitvoxels), dtype="float")
271
424
  phaseslopes = np.zeros((numfitvoxels), dtype="float")
272
- detrendedphasedata = phasedata * 0.0
425
+ detrendedphasedata = np.zeros_like(phasedata)
273
426
  print(f"shape of detrendedphasedata: {detrendedphasedata.shape}")
274
427
  X = np.linspace(lowerbin * hzperpoint, upperbin * hzperpoint, trimmedsize)
275
428
  for i in range(numfitvoxels):
@@ -422,7 +575,34 @@ def fdica(
422
575
  )
423
576
 
424
577
 
425
- def main():
578
+ def main() -> None:
579
+ """
580
+ Main function to execute the FDICA (Fast Independent Component Analysis) pipeline.
581
+
582
+ This function parses command line arguments, prints them for debugging purposes,
583
+ and executes the FDICA algorithm with the specified parameters.
584
+
585
+ Parameters
586
+ ----------
587
+ None
588
+
589
+ Returns
590
+ -------
591
+ None
592
+ This function does not return any value but executes the FDICA pipeline
593
+ and produces output files based on the provided arguments.
594
+
595
+ Notes
596
+ -----
597
+ The function uses a parser to handle command line arguments and includes
598
+ error handling for argument parsing. If parsing fails, the help message is
599
+ displayed before raising the SystemExit exception.
600
+
601
+ Examples
602
+ --------
603
+ >>> main()
604
+ # This would execute the FDICA pipeline with arguments parsed from command line
605
+ """
426
606
  try:
427
607
  args = _get_parser().parse_args()
428
608
  except SystemExit:
@@ -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,17 +17,40 @@
17
17
  #
18
18
  #
19
19
  import argparse
20
+ from argparse import Namespace
21
+ from typing import Any, Callable, Dict, List, Optional, Tuple, Union
20
22
 
21
23
  import numpy as np
24
+ from numpy.typing import NDArray
22
25
 
23
26
  import rapidtide.filter as tide_filt
24
27
  import rapidtide.io as tide_io
25
28
 
26
29
 
27
- def _get_parser():
30
+ def _get_parser() -> Any:
28
31
  """
29
- Argument parser for filtnifti
32
+ Argument parser for filtnifti.
30
33
 
34
+ Creates and configures an argument parser for the filtnifti command-line tool
35
+ that temporally filters NIFTI files.
36
+
37
+ Returns
38
+ -------
39
+ argparse.ArgumentParser
40
+ Configured argument parser object with required command-line arguments
41
+
42
+ Notes
43
+ -----
44
+ The parser expects four command-line arguments in the following order:
45
+ 1. inputfilename - path to input NIFTI file
46
+ 2. outputfilename - path to output NIFTI file
47
+ 3. lowestfreq - low passband frequency limit in Hz (negative values disable HPF)
48
+ 4. highestfreq - high passband frequency limit in Hz (negative values disable LPF)
49
+
50
+ Examples
51
+ --------
52
+ >>> parser = _get_parser()
53
+ >>> args = parser.parse_args(['input.nii', 'output.nii', '0.01', '0.1'])
31
54
  """
32
55
  # get the command line parameters
33
56
  parser = argparse.ArgumentParser(
@@ -50,7 +73,51 @@ def _get_parser():
50
73
  return parser
51
74
 
52
75
 
53
- def filtnifti(args):
76
+ def filtnifti(args: Any) -> None:
77
+ """
78
+ Apply a frequency-domain filter to a 4D NIfTI file containing fMRI data.
79
+
80
+ This function reads an input NIfTI file, applies a bandpass or arbitrary frequency filter
81
+ to each voxel's time series, and saves the filtered data to a new NIfTI file. The filter
82
+ parameters are specified via the `args` object, which should contain attributes such as
83
+ `inputfilename`, `outputfilename`, `lowestfreq`, and `highestfreq`.
84
+
85
+ Parameters
86
+ ----------
87
+ args : Any
88
+ An object containing the following attributes:
89
+ - inputfilename : str
90
+ Path to the input NIfTI file.
91
+ - outputfilename : str
92
+ Path to the output NIfTI file.
93
+ - lowestfreq : float
94
+ Lowest frequency for the filter. If negative, highpass filtering is disabled.
95
+ - highestfreq : float
96
+ Highest frequency for the filter. If negative, lowpass filtering is disabled.
97
+
98
+ Returns
99
+ -------
100
+ None
101
+ This function does not return a value but saves the filtered data to a NIfTI file.
102
+
103
+ Notes
104
+ -----
105
+ - The function uses a non-causal filter (`tide_filt.NoncausalFilter`) for filtering.
106
+ - The TR (repetition time) is read from the NIfTI header, and the sampling frequency
107
+ is computed as `Fs = 1 / TR`.
108
+ - Filtering is applied slice-by-slice to each voxel's time series.
109
+ - If `lowestfreq` or `highestfreq` is set to a negative value, the corresponding filter
110
+ is disabled.
111
+
112
+ Examples
113
+ --------
114
+ Assuming `args` is an object with the required attributes:
115
+
116
+ >>> filtnifti(args)
117
+
118
+ This will read the input NIfTI file, apply the specified filter, and save the result
119
+ to the output file.
120
+ """
54
121
  # get the input TR
55
122
  inputtr_fromfile, numinputtrs = tide_io.fmritimeinfo(args.inputfilename)
56
123
  print("input data: ", numinputtrs, " timepoints, tr = ", inputtr_fromfile)