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.
- cloud/gmscalc-HCPYA +1 -1
- cloud/mount-and-run +2 -0
- cloud/rapidtide-HCPYA +3 -3
- rapidtide/Colortables.py +538 -38
- rapidtide/OrthoImageItem.py +1094 -51
- rapidtide/RapidtideDataset.py +1709 -114
- rapidtide/__init__.py +0 -8
- rapidtide/_version.py +4 -4
- rapidtide/calccoherence.py +242 -97
- rapidtide/calcnullsimfunc.py +240 -140
- rapidtide/calcsimfunc.py +314 -129
- rapidtide/correlate.py +1211 -389
- rapidtide/data/examples/src/testLD +56 -0
- rapidtide/data/examples/src/test_findmaxlag.py +2 -2
- rapidtide/data/examples/src/test_mlregressallt.py +32 -17
- rapidtide/data/examples/src/testalign +1 -1
- rapidtide/data/examples/src/testatlasaverage +35 -7
- rapidtide/data/examples/src/testboth +21 -0
- rapidtide/data/examples/src/testcifti +11 -0
- rapidtide/data/examples/src/testdelayvar +13 -0
- rapidtide/data/examples/src/testdlfilt +25 -0
- rapidtide/data/examples/src/testfft +35 -0
- rapidtide/data/examples/src/testfileorfloat +37 -0
- rapidtide/data/examples/src/testfmri +92 -42
- rapidtide/data/examples/src/testfuncs +3 -3
- rapidtide/data/examples/src/testglmfilt +8 -6
- rapidtide/data/examples/src/testhappy +84 -51
- rapidtide/data/examples/src/testinitdelay +19 -0
- rapidtide/data/examples/src/testmodels +33 -0
- rapidtide/data/examples/src/testnewrefine +26 -0
- rapidtide/data/examples/src/testnoiseamp +2 -2
- rapidtide/data/examples/src/testppgproc +17 -0
- rapidtide/data/examples/src/testrefineonly +22 -0
- rapidtide/data/examples/src/testretro +26 -13
- rapidtide/data/examples/src/testretrolagtcs +16 -0
- rapidtide/data/examples/src/testrolloff +11 -0
- rapidtide/data/examples/src/testsimdata +45 -28
- rapidtide/data/models/model_cnn_pytorch/loss.png +0 -0
- rapidtide/data/models/model_cnn_pytorch/loss.txt +1 -0
- rapidtide/data/models/model_cnn_pytorch/model.pth +0 -0
- rapidtide/data/models/model_cnn_pytorch/model_meta.json +68 -0
- rapidtide/data/models/model_cnn_pytorch_fulldata/loss.png +0 -0
- rapidtide/data/models/model_cnn_pytorch_fulldata/loss.txt +1 -0
- rapidtide/data/models/model_cnn_pytorch_fulldata/model.pth +0 -0
- rapidtide/data/models/model_cnn_pytorch_fulldata/model_meta.json +80 -0
- rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.png +0 -0
- rapidtide/data/models/model_cnnbp_pytorch_fullldata/loss.txt +1 -0
- rapidtide/data/models/model_cnnbp_pytorch_fullldata/model.pth +0 -0
- rapidtide/data/models/model_cnnbp_pytorch_fullldata/model_meta.json +138 -0
- rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.png +0 -0
- rapidtide/data/models/model_cnnfft_pytorch_fulldata/loss.txt +1 -0
- rapidtide/data/models/model_cnnfft_pytorch_fulldata/model.pth +0 -0
- rapidtide/data/models/model_cnnfft_pytorch_fulldata/model_meta.json +128 -0
- rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.png +0 -0
- rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/loss.txt +1 -0
- rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model.pth +0 -0
- rapidtide/data/models/model_ppgattention_pytorch_w128_fulldata/model_meta.json +49 -0
- rapidtide/data/models/model_revised_tf2/model.keras +0 -0
- rapidtide/data/models/{model_serdar → model_revised_tf2}/model_meta.json +1 -1
- rapidtide/data/models/model_serdar2_tf2/model.keras +0 -0
- rapidtide/data/models/{model_serdar2 → model_serdar2_tf2}/model_meta.json +1 -1
- rapidtide/data/models/model_serdar_tf2/model.keras +0 -0
- rapidtide/data/models/{model_revised → model_serdar_tf2}/model_meta.json +1 -1
- rapidtide/data/reference/HCP1200v2_MTT_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_binmask_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_csf_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_gray_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_graylaghist.json +7 -0
- rapidtide/data/reference/HCP1200v2_graylaghist.tsv.gz +0 -0
- rapidtide/data/reference/HCP1200v2_laghist.json +7 -0
- rapidtide/data/reference/HCP1200v2_laghist.tsv.gz +0 -0
- rapidtide/data/reference/HCP1200v2_mask_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_maxcorr_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_maxtime_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_maxwidth_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_negmask_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_timepercentile_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_white_2mm.nii.gz +0 -0
- rapidtide/data/reference/HCP1200v2_whitelaghist.json +7 -0
- rapidtide/data/reference/HCP1200v2_whitelaghist.tsv.gz +0 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2.xml +131 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_regions.txt +60 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1-seg2_space-MNI152NLin6Asym_2mm.nii.gz +0 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm.nii.gz +0 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin2009cAsym_2mm_mask.nii.gz +0 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL1_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
- rapidtide/data/reference/JHU-ArterialTerritoriesNoVent-LVL2_space-MNI152NLin6Asym_2mm_mask.nii.gz +0 -0
- rapidtide/data/reference/MNI152_T1_1mm_Brain_FAST_seg.nii.gz +0 -0
- rapidtide/data/reference/MNI152_T1_1mm_Brain_Mask.nii.gz +0 -0
- rapidtide/data/reference/MNI152_T1_2mm_Brain_FAST_seg.nii.gz +0 -0
- rapidtide/data/reference/MNI152_T1_2mm_Brain_Mask.nii.gz +0 -0
- rapidtide/decorators.py +91 -0
- rapidtide/dlfilter.py +2553 -414
- rapidtide/dlfiltertorch.py +5201 -0
- rapidtide/externaltools.py +328 -13
- rapidtide/fMRIData_class.py +108 -92
- rapidtide/ffttools.py +168 -0
- rapidtide/filter.py +2704 -1462
- rapidtide/fit.py +2361 -579
- rapidtide/genericmultiproc.py +197 -0
- rapidtide/happy_supportfuncs.py +3255 -548
- rapidtide/helper_classes.py +587 -1116
- rapidtide/io.py +2569 -468
- rapidtide/linfitfiltpass.py +784 -0
- rapidtide/makelaggedtcs.py +267 -97
- rapidtide/maskutil.py +555 -25
- rapidtide/miscmath.py +835 -144
- rapidtide/multiproc.py +217 -44
- rapidtide/patchmatch.py +752 -0
- rapidtide/peakeval.py +32 -32
- rapidtide/ppgproc.py +2205 -0
- rapidtide/qualitycheck.py +353 -40
- rapidtide/refinedelay.py +854 -0
- rapidtide/refineregressor.py +939 -0
- rapidtide/resample.py +725 -204
- rapidtide/scripts/__init__.py +1 -0
- rapidtide/scripts/{adjustoffset → adjustoffset.py} +7 -2
- rapidtide/scripts/{aligntcs → aligntcs.py} +7 -2
- rapidtide/scripts/{applydlfilter → applydlfilter.py} +7 -2
- rapidtide/scripts/applyppgproc.py +28 -0
- rapidtide/scripts/{atlasaverage → atlasaverage.py} +7 -2
- rapidtide/scripts/{atlastool → atlastool.py} +7 -2
- rapidtide/scripts/{calcicc → calcicc.py} +7 -2
- rapidtide/scripts/{calctexticc → calctexticc.py} +7 -2
- rapidtide/scripts/{calcttest → calcttest.py} +7 -2
- rapidtide/scripts/{ccorrica → ccorrica.py} +7 -2
- rapidtide/scripts/delayvar.py +28 -0
- rapidtide/scripts/{diffrois → diffrois.py} +7 -2
- rapidtide/scripts/{endtidalproc → endtidalproc.py} +7 -2
- rapidtide/scripts/{fdica → fdica.py} +7 -2
- rapidtide/scripts/{filtnifti → filtnifti.py} +7 -2
- rapidtide/scripts/{filttc → filttc.py} +7 -2
- rapidtide/scripts/{fingerprint → fingerprint.py} +20 -16
- rapidtide/scripts/{fixtr → fixtr.py} +7 -2
- rapidtide/scripts/{gmscalc → gmscalc.py} +7 -2
- rapidtide/scripts/{happy → happy.py} +7 -2
- rapidtide/scripts/{happy2std → happy2std.py} +7 -2
- rapidtide/scripts/{happywarp → happywarp.py} +8 -4
- rapidtide/scripts/{histnifti → histnifti.py} +7 -2
- rapidtide/scripts/{histtc → histtc.py} +7 -2
- rapidtide/scripts/{glmfilt → linfitfilt.py} +7 -4
- rapidtide/scripts/{localflow → localflow.py} +7 -2
- rapidtide/scripts/{mergequality → mergequality.py} +7 -2
- rapidtide/scripts/{pairproc → pairproc.py} +7 -2
- rapidtide/scripts/{pairwisemergenifti → pairwisemergenifti.py} +7 -2
- rapidtide/scripts/{physiofreq → physiofreq.py} +7 -2
- rapidtide/scripts/{pixelcomp → pixelcomp.py} +7 -2
- rapidtide/scripts/{plethquality → plethquality.py} +7 -2
- rapidtide/scripts/{polyfitim → polyfitim.py} +7 -2
- rapidtide/scripts/{proj2flow → proj2flow.py} +7 -2
- rapidtide/scripts/{rankimage → rankimage.py} +7 -2
- rapidtide/scripts/{rapidtide → rapidtide.py} +7 -2
- rapidtide/scripts/{rapidtide2std → rapidtide2std.py} +7 -2
- rapidtide/scripts/{resamplenifti → resamplenifti.py} +7 -2
- rapidtide/scripts/{resampletc → resampletc.py} +7 -2
- rapidtide/scripts/retrolagtcs.py +28 -0
- rapidtide/scripts/retroregress.py +28 -0
- rapidtide/scripts/{roisummarize → roisummarize.py} +7 -2
- rapidtide/scripts/{runqualitycheck → runqualitycheck.py} +7 -2
- rapidtide/scripts/{showarbcorr → showarbcorr.py} +7 -2
- rapidtide/scripts/{showhist → showhist.py} +7 -2
- rapidtide/scripts/{showstxcorr → showstxcorr.py} +7 -2
- rapidtide/scripts/{showtc → showtc.py} +7 -2
- rapidtide/scripts/{showxcorr_legacy → showxcorr_legacy.py} +8 -8
- rapidtide/scripts/{showxcorrx → showxcorrx.py} +7 -2
- rapidtide/scripts/{showxy → showxy.py} +7 -2
- rapidtide/scripts/{simdata → simdata.py} +7 -2
- rapidtide/scripts/{spatialdecomp → spatialdecomp.py} +7 -2
- rapidtide/scripts/{spatialfit → spatialfit.py} +7 -2
- rapidtide/scripts/{spatialmi → spatialmi.py} +7 -2
- rapidtide/scripts/{spectrogram → spectrogram.py} +7 -2
- rapidtide/scripts/stupidramtricks.py +238 -0
- rapidtide/scripts/{synthASL → synthASL.py} +7 -2
- rapidtide/scripts/{tcfrom2col → tcfrom2col.py} +7 -2
- rapidtide/scripts/{tcfrom3col → tcfrom3col.py} +7 -2
- rapidtide/scripts/{temporaldecomp → temporaldecomp.py} +7 -2
- rapidtide/scripts/{testhrv → testhrv.py} +1 -1
- rapidtide/scripts/{threeD → threeD.py} +7 -2
- rapidtide/scripts/{tidepool → tidepool.py} +7 -2
- rapidtide/scripts/{variabilityizer → variabilityizer.py} +7 -2
- rapidtide/simFuncClasses.py +2113 -0
- rapidtide/simfuncfit.py +312 -108
- rapidtide/stats.py +579 -247
- rapidtide/tests/.coveragerc +27 -6
- rapidtide-2.9.6.data/scripts/fdica → rapidtide/tests/cleanposttest +4 -6
- rapidtide/tests/happycomp +9 -0
- rapidtide/tests/resethappytargets +1 -1
- rapidtide/tests/resetrapidtidetargets +1 -1
- rapidtide/tests/resettargets +1 -1
- rapidtide/tests/runlocaltest +3 -3
- rapidtide/tests/showkernels +1 -1
- rapidtide/tests/test_aliasedcorrelate.py +4 -4
- rapidtide/tests/test_aligntcs.py +1 -1
- rapidtide/tests/test_calcicc.py +1 -1
- rapidtide/tests/test_cleanregressor.py +184 -0
- rapidtide/tests/test_congrid.py +70 -81
- rapidtide/tests/test_correlate.py +1 -1
- rapidtide/tests/test_corrpass.py +4 -4
- rapidtide/tests/test_delayestimation.py +54 -59
- rapidtide/tests/test_dlfiltertorch.py +437 -0
- rapidtide/tests/test_doresample.py +2 -2
- rapidtide/tests/test_externaltools.py +69 -0
- rapidtide/tests/test_fastresampler.py +9 -5
- rapidtide/tests/test_filter.py +96 -57
- rapidtide/tests/test_findmaxlag.py +50 -19
- rapidtide/tests/test_fullrunhappy_v1.py +15 -10
- rapidtide/tests/test_fullrunhappy_v2.py +19 -13
- rapidtide/tests/test_fullrunhappy_v3.py +28 -13
- rapidtide/tests/test_fullrunhappy_v4.py +30 -11
- rapidtide/tests/test_fullrunhappy_v5.py +62 -0
- rapidtide/tests/test_fullrunrapidtide_v1.py +61 -7
- rapidtide/tests/test_fullrunrapidtide_v2.py +26 -14
- rapidtide/tests/test_fullrunrapidtide_v3.py +28 -8
- rapidtide/tests/test_fullrunrapidtide_v4.py +16 -8
- rapidtide/tests/test_fullrunrapidtide_v5.py +15 -6
- rapidtide/tests/test_fullrunrapidtide_v6.py +142 -0
- rapidtide/tests/test_fullrunrapidtide_v7.py +114 -0
- rapidtide/tests/test_fullrunrapidtide_v8.py +66 -0
- rapidtide/tests/test_getparsers.py +158 -0
- rapidtide/tests/test_io.py +59 -18
- rapidtide/tests/{test_glmpass.py → test_linfitfiltpass.py} +10 -10
- rapidtide/tests/test_mi.py +1 -1
- rapidtide/tests/test_miscmath.py +1 -1
- rapidtide/tests/test_motionregress.py +5 -5
- rapidtide/tests/test_nullcorr.py +6 -9
- rapidtide/tests/test_padvec.py +216 -0
- rapidtide/tests/test_parserfuncs.py +101 -0
- rapidtide/tests/test_phaseanalysis.py +1 -1
- rapidtide/tests/test_rapidtideparser.py +59 -53
- rapidtide/tests/test_refinedelay.py +296 -0
- rapidtide/tests/test_runmisc.py +5 -5
- rapidtide/tests/test_sharedmem.py +60 -0
- rapidtide/tests/test_simroundtrip.py +132 -0
- rapidtide/tests/test_simulate.py +1 -1
- rapidtide/tests/test_stcorrelate.py +4 -2
- rapidtide/tests/test_timeshift.py +2 -2
- rapidtide/tests/test_valtoindex.py +1 -1
- rapidtide/tests/test_zRapidtideDataset.py +5 -3
- rapidtide/tests/utils.py +10 -9
- rapidtide/tidepoolTemplate.py +88 -70
- rapidtide/tidepoolTemplate.ui +60 -46
- rapidtide/tidepoolTemplate_alt.py +88 -53
- rapidtide/tidepoolTemplate_alt.ui +62 -52
- rapidtide/tidepoolTemplate_alt_qt6.py +921 -0
- rapidtide/tidepoolTemplate_big.py +1125 -0
- rapidtide/tidepoolTemplate_big.ui +2386 -0
- rapidtide/tidepoolTemplate_big_qt6.py +1129 -0
- rapidtide/tidepoolTemplate_qt6.py +793 -0
- rapidtide/util.py +1389 -148
- rapidtide/voxelData.py +1048 -0
- rapidtide/wiener.py +138 -25
- rapidtide/wiener2.py +114 -8
- rapidtide/workflows/adjustoffset.py +107 -5
- rapidtide/workflows/aligntcs.py +86 -3
- rapidtide/workflows/applydlfilter.py +231 -89
- rapidtide/workflows/applyppgproc.py +540 -0
- rapidtide/workflows/atlasaverage.py +309 -48
- rapidtide/workflows/atlastool.py +130 -9
- rapidtide/workflows/calcSimFuncMap.py +490 -0
- rapidtide/workflows/calctexticc.py +202 -10
- rapidtide/workflows/ccorrica.py +123 -15
- rapidtide/workflows/cleanregressor.py +415 -0
- rapidtide/workflows/delayvar.py +1268 -0
- rapidtide/workflows/diffrois.py +84 -6
- rapidtide/workflows/endtidalproc.py +149 -9
- rapidtide/workflows/fdica.py +197 -17
- rapidtide/workflows/filtnifti.py +71 -4
- rapidtide/workflows/filttc.py +76 -5
- rapidtide/workflows/fitSimFuncMap.py +578 -0
- rapidtide/workflows/fixtr.py +74 -4
- rapidtide/workflows/gmscalc.py +116 -6
- rapidtide/workflows/happy.py +1242 -480
- rapidtide/workflows/happy2std.py +145 -13
- rapidtide/workflows/happy_parser.py +277 -59
- rapidtide/workflows/histnifti.py +120 -4
- rapidtide/workflows/histtc.py +85 -4
- rapidtide/workflows/{glmfilt.py → linfitfilt.py} +128 -14
- rapidtide/workflows/localflow.py +329 -29
- rapidtide/workflows/mergequality.py +80 -4
- rapidtide/workflows/niftidecomp.py +323 -19
- rapidtide/workflows/niftistats.py +178 -8
- rapidtide/workflows/pairproc.py +99 -5
- rapidtide/workflows/pairwisemergenifti.py +86 -3
- rapidtide/workflows/parser_funcs.py +1488 -56
- rapidtide/workflows/physiofreq.py +139 -12
- rapidtide/workflows/pixelcomp.py +211 -9
- rapidtide/workflows/plethquality.py +105 -23
- rapidtide/workflows/polyfitim.py +159 -19
- rapidtide/workflows/proj2flow.py +76 -3
- rapidtide/workflows/rankimage.py +115 -8
- rapidtide/workflows/rapidtide.py +1785 -1858
- rapidtide/workflows/rapidtide2std.py +101 -3
- rapidtide/workflows/rapidtide_parser.py +590 -389
- rapidtide/workflows/refineDelayMap.py +249 -0
- rapidtide/workflows/refineRegressor.py +1215 -0
- rapidtide/workflows/regressfrommaps.py +308 -0
- rapidtide/workflows/resamplenifti.py +86 -4
- rapidtide/workflows/resampletc.py +92 -4
- rapidtide/workflows/retrolagtcs.py +442 -0
- rapidtide/workflows/retroregress.py +1501 -0
- rapidtide/workflows/roisummarize.py +176 -7
- rapidtide/workflows/runqualitycheck.py +72 -7
- rapidtide/workflows/showarbcorr.py +172 -16
- rapidtide/workflows/showhist.py +87 -3
- rapidtide/workflows/showstxcorr.py +161 -4
- rapidtide/workflows/showtc.py +172 -10
- rapidtide/workflows/showxcorrx.py +250 -62
- rapidtide/workflows/showxy.py +186 -16
- rapidtide/workflows/simdata.py +418 -112
- rapidtide/workflows/spatialfit.py +83 -8
- rapidtide/workflows/spatialmi.py +252 -29
- rapidtide/workflows/spectrogram.py +306 -33
- rapidtide/workflows/synthASL.py +157 -6
- rapidtide/workflows/tcfrom2col.py +77 -3
- rapidtide/workflows/tcfrom3col.py +75 -3
- rapidtide/workflows/tidepool.py +3829 -666
- rapidtide/workflows/utils.py +45 -19
- rapidtide/workflows/utils_doc.py +293 -0
- rapidtide/workflows/variabilityizer.py +118 -5
- {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info}/METADATA +30 -223
- rapidtide-3.1.3.dist-info/RECORD +393 -0
- {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info}/WHEEL +1 -1
- rapidtide-3.1.3.dist-info/entry_points.txt +65 -0
- rapidtide-3.1.3.dist-info/top_level.txt +2 -0
- rapidtide/calcandfitcorrpairs.py +0 -262
- rapidtide/data/examples/src/testoutputsize +0 -45
- rapidtide/data/models/model_revised/model.h5 +0 -0
- rapidtide/data/models/model_serdar/model.h5 +0 -0
- rapidtide/data/models/model_serdar2/model.h5 +0 -0
- rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm.nii.gz +0 -0
- rapidtide/data/reference/ASPECTS_nlin_asym_09c_2mm_mask.nii.gz +0 -0
- rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm.nii.gz +0 -0
- rapidtide/data/reference/ATTbasedFlowTerritories_split_nlin_asym_09c_2mm_mask.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_binmask_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_lag_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_mask_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_negmask_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_sigma_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/data/reference/HCP1200_strength_2mm_2009c_asym.nii.gz +0 -0
- rapidtide/glmpass.py +0 -434
- rapidtide/refine_factored.py +0 -641
- rapidtide/scripts/retroglm +0 -23
- rapidtide/workflows/glmfrommaps.py +0 -202
- rapidtide/workflows/retroglm.py +0 -643
- rapidtide-2.9.6.data/scripts/adjustoffset +0 -23
- rapidtide-2.9.6.data/scripts/aligntcs +0 -23
- rapidtide-2.9.6.data/scripts/applydlfilter +0 -23
- rapidtide-2.9.6.data/scripts/atlasaverage +0 -23
- rapidtide-2.9.6.data/scripts/atlastool +0 -23
- rapidtide-2.9.6.data/scripts/calcicc +0 -22
- rapidtide-2.9.6.data/scripts/calctexticc +0 -23
- rapidtide-2.9.6.data/scripts/calcttest +0 -22
- rapidtide-2.9.6.data/scripts/ccorrica +0 -23
- rapidtide-2.9.6.data/scripts/diffrois +0 -23
- rapidtide-2.9.6.data/scripts/endtidalproc +0 -23
- rapidtide-2.9.6.data/scripts/filtnifti +0 -23
- rapidtide-2.9.6.data/scripts/filttc +0 -23
- rapidtide-2.9.6.data/scripts/fingerprint +0 -593
- rapidtide-2.9.6.data/scripts/fixtr +0 -23
- rapidtide-2.9.6.data/scripts/glmfilt +0 -24
- rapidtide-2.9.6.data/scripts/gmscalc +0 -22
- rapidtide-2.9.6.data/scripts/happy +0 -25
- rapidtide-2.9.6.data/scripts/happy2std +0 -23
- rapidtide-2.9.6.data/scripts/happywarp +0 -350
- rapidtide-2.9.6.data/scripts/histnifti +0 -23
- rapidtide-2.9.6.data/scripts/histtc +0 -23
- rapidtide-2.9.6.data/scripts/localflow +0 -23
- rapidtide-2.9.6.data/scripts/mergequality +0 -23
- rapidtide-2.9.6.data/scripts/pairproc +0 -23
- rapidtide-2.9.6.data/scripts/pairwisemergenifti +0 -23
- rapidtide-2.9.6.data/scripts/physiofreq +0 -23
- rapidtide-2.9.6.data/scripts/pixelcomp +0 -23
- rapidtide-2.9.6.data/scripts/plethquality +0 -23
- rapidtide-2.9.6.data/scripts/polyfitim +0 -23
- rapidtide-2.9.6.data/scripts/proj2flow +0 -23
- rapidtide-2.9.6.data/scripts/rankimage +0 -23
- rapidtide-2.9.6.data/scripts/rapidtide +0 -23
- rapidtide-2.9.6.data/scripts/rapidtide2std +0 -23
- rapidtide-2.9.6.data/scripts/resamplenifti +0 -23
- rapidtide-2.9.6.data/scripts/resampletc +0 -23
- rapidtide-2.9.6.data/scripts/retroglm +0 -23
- rapidtide-2.9.6.data/scripts/roisummarize +0 -23
- rapidtide-2.9.6.data/scripts/runqualitycheck +0 -23
- rapidtide-2.9.6.data/scripts/showarbcorr +0 -23
- rapidtide-2.9.6.data/scripts/showhist +0 -23
- rapidtide-2.9.6.data/scripts/showstxcorr +0 -23
- rapidtide-2.9.6.data/scripts/showtc +0 -23
- rapidtide-2.9.6.data/scripts/showxcorr_legacy +0 -536
- rapidtide-2.9.6.data/scripts/showxcorrx +0 -23
- rapidtide-2.9.6.data/scripts/showxy +0 -23
- rapidtide-2.9.6.data/scripts/simdata +0 -23
- rapidtide-2.9.6.data/scripts/spatialdecomp +0 -23
- rapidtide-2.9.6.data/scripts/spatialfit +0 -23
- rapidtide-2.9.6.data/scripts/spatialmi +0 -23
- rapidtide-2.9.6.data/scripts/spectrogram +0 -23
- rapidtide-2.9.6.data/scripts/synthASL +0 -23
- rapidtide-2.9.6.data/scripts/tcfrom2col +0 -23
- rapidtide-2.9.6.data/scripts/tcfrom3col +0 -23
- rapidtide-2.9.6.data/scripts/temporaldecomp +0 -23
- rapidtide-2.9.6.data/scripts/threeD +0 -236
- rapidtide-2.9.6.data/scripts/tidepool +0 -23
- rapidtide-2.9.6.data/scripts/variabilityizer +0 -23
- rapidtide-2.9.6.dist-info/RECORD +0 -359
- rapidtide-2.9.6.dist-info/top_level.txt +0 -86
- {rapidtide-2.9.6.dist-info → rapidtide-3.1.3.dist-info/licenses}/LICENSE +0 -0
rapidtide/workflows/simdata.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
3
|
#
|
|
4
|
-
# Copyright 2016-
|
|
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
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
56
|
-
"
|
|
57
|
-
|
|
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
|
|
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
|
-
|
|
67
|
-
"--
|
|
68
|
-
dest=(band
|
|
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
|
|
119
|
+
help=(f"3D NIFTI file with the {band} delay value in seconds at every point"),
|
|
73
120
|
default=None,
|
|
74
121
|
)
|
|
75
|
-
|
|
76
|
-
"--
|
|
77
|
-
dest=(band
|
|
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
|
|
128
|
+
help=(f"The {band} regressor text file"),
|
|
82
129
|
default=None,
|
|
83
130
|
)
|
|
84
|
-
|
|
85
|
-
"--
|
|
86
|
-
dest=(band
|
|
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
|
|
137
|
+
help=(f"The sample rate of the {band} regressor file, in Hz"),
|
|
91
138
|
default=None,
|
|
92
139
|
)
|
|
93
|
-
|
|
94
|
-
"--
|
|
95
|
-
dest=(band
|
|
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=(
|
|
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
|
-
|
|
150
|
-
pctfile,
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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("
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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,
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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 * (
|
|
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 * (
|
|
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 * (
|
|
247
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
759
|
+
tide_io.savetonifti(simdata, simdataheader, args.outputroot)
|