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
|
@@ -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.
|
|
@@ -18,39 +18,47 @@
|
|
|
18
18
|
#
|
|
19
19
|
import argparse
|
|
20
20
|
import sys
|
|
21
|
+
from typing import Any
|
|
21
22
|
|
|
22
23
|
import numpy as np
|
|
24
|
+
from numpy.typing import NDArray
|
|
25
|
+
from statsmodels.robust import mad
|
|
23
26
|
|
|
24
27
|
import rapidtide.io as tide_io
|
|
25
28
|
import rapidtide.maskutil as tide_mask
|
|
29
|
+
import rapidtide.stats as tide_stats
|
|
26
30
|
import rapidtide.workflows.parser_funcs as pf
|
|
27
31
|
|
|
28
32
|
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
numtimepoints = theshape[1]
|
|
33
|
-
else:
|
|
34
|
-
numtimepoints = 1
|
|
33
|
+
def _get_parser() -> Any:
|
|
34
|
+
"""
|
|
35
|
+
Construct and return an argument parser for the atlasaverage command-line tool.
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
elif method == "median":
|
|
41
|
-
themethod = np.median
|
|
42
|
-
else:
|
|
43
|
-
print(f"illegal summary method {method} in summarize")
|
|
44
|
-
sys.exit()
|
|
37
|
+
This function builds an `argparse.ArgumentParser` object configured with all
|
|
38
|
+
required and optional arguments needed to run the `atlasaverage` utility. It
|
|
39
|
+
handles input validation for file paths and defines various options for
|
|
40
|
+
normalizing, summarizing, and filtering data within atlas regions.
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return regionsummary
|
|
42
|
+
Returns
|
|
43
|
+
-------
|
|
44
|
+
argparse.ArgumentParser
|
|
45
|
+
Configured argument parser object for the atlasaverage tool.
|
|
51
46
|
|
|
47
|
+
Notes
|
|
48
|
+
-----
|
|
49
|
+
The parser is set up with:
|
|
50
|
+
- Two required positional arguments: `datafile` and `templatefile`.
|
|
51
|
+
- One required positional argument: `outputroot`.
|
|
52
|
+
- Several optional arguments controlling normalization, summarization,
|
|
53
|
+
masking, and output formatting.
|
|
52
54
|
|
|
53
|
-
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> parser = _get_parser()
|
|
58
|
+
>>> args = parser.parse_args(['data.nii', 'atlas.nii', 'output'])
|
|
59
|
+
>>> print(args.datafile)
|
|
60
|
+
'data.nii'
|
|
61
|
+
"""
|
|
54
62
|
# get the command line parameters
|
|
55
63
|
parser = argparse.ArgumentParser(
|
|
56
64
|
prog="atlasaverage",
|
|
@@ -83,13 +91,26 @@ def _get_parser():
|
|
|
83
91
|
),
|
|
84
92
|
default="none",
|
|
85
93
|
)
|
|
94
|
+
parser.add_argument(
|
|
95
|
+
"--numpercentiles",
|
|
96
|
+
dest="numpercentiles",
|
|
97
|
+
metavar="NPCT",
|
|
98
|
+
type=int,
|
|
99
|
+
help=(
|
|
100
|
+
"Number of evenly spaced percentiles between 0 and 100 (not including the end points) to calculate "
|
|
101
|
+
"in each region. For example, If NPCT = 1, calculate the 0th, 50th, and 100th percentiles."
|
|
102
|
+
),
|
|
103
|
+
default=1,
|
|
104
|
+
)
|
|
86
105
|
parser.add_argument(
|
|
87
106
|
"--summarymethod",
|
|
88
107
|
dest="summarymethod",
|
|
89
108
|
action="store",
|
|
90
109
|
type=str,
|
|
91
|
-
choices=["mean", "median", "sum"],
|
|
92
|
-
help=(
|
|
110
|
+
choices=["mean", "median", "sum", "std", "MAD", "CoV"],
|
|
111
|
+
help=(
|
|
112
|
+
"Method to summarize the voxels in a region. Choices are 'mean' (default), 'median', 'sum', 'std', 'MAD', and 'CoV'."
|
|
113
|
+
),
|
|
93
114
|
default="mean",
|
|
94
115
|
)
|
|
95
116
|
parser.add_argument(
|
|
@@ -108,6 +129,15 @@ def _get_parser():
|
|
|
108
129
|
),
|
|
109
130
|
default=None,
|
|
110
131
|
)
|
|
132
|
+
parser.add_argument(
|
|
133
|
+
"--regionlabelfile",
|
|
134
|
+
type=lambda x: pf.is_valid_file(parser, x),
|
|
135
|
+
help=(
|
|
136
|
+
"The name of of a text file containing the labels of the regions, one per line. The first line is "
|
|
137
|
+
"the label integer value 1, etc."
|
|
138
|
+
),
|
|
139
|
+
default=None,
|
|
140
|
+
)
|
|
111
141
|
parser.add_argument(
|
|
112
142
|
"--includemask",
|
|
113
143
|
dest="includespec",
|
|
@@ -167,7 +197,160 @@ def _get_parser():
|
|
|
167
197
|
return parser
|
|
168
198
|
|
|
169
199
|
|
|
170
|
-
def
|
|
200
|
+
def summarizevoxels(thevoxels: NDArray, method: str = "mean") -> float:
|
|
201
|
+
"""
|
|
202
|
+
Summarize voxel data using specified statistical method.
|
|
203
|
+
|
|
204
|
+
Parameters
|
|
205
|
+
----------
|
|
206
|
+
thevoxels : ndarray
|
|
207
|
+
Input voxel data array. Can be 1D or 2D, where 2D arrays are interpreted
|
|
208
|
+
as time series with shape (voxels, timepoints).
|
|
209
|
+
method : str, default="mean"
|
|
210
|
+
Summary method to apply. Options are:
|
|
211
|
+
- "mean": Compute mean along axis 0
|
|
212
|
+
- "sum": Compute sum along axis 0
|
|
213
|
+
- "median": Compute median along axis 0
|
|
214
|
+
- "std": Compute standard deviation along axis 0
|
|
215
|
+
- "MAD": Compute median absolute deviation along axis 0
|
|
216
|
+
- "CoV": Compute coefficient of variation (std/mean) along axis 0
|
|
217
|
+
|
|
218
|
+
Returns
|
|
219
|
+
-------
|
|
220
|
+
float or ndarray
|
|
221
|
+
Summary statistic(s) of the voxel data. Returns a scalar for 1D input
|
|
222
|
+
or array of statistics for 2D input along axis 0.
|
|
223
|
+
|
|
224
|
+
Notes
|
|
225
|
+
-----
|
|
226
|
+
- NaN values are converted to zero using `np.nan_to_num` before computation
|
|
227
|
+
- For coefficient of variation ("CoV"), the result is multiplied by 100 to
|
|
228
|
+
express as percentage
|
|
229
|
+
- When input is 1D, time dimension is treated as single timepoint
|
|
230
|
+
- The function handles both 1D and 2D input arrays appropriately
|
|
231
|
+
|
|
232
|
+
Examples
|
|
233
|
+
--------
|
|
234
|
+
>>> import numpy as np
|
|
235
|
+
>>> voxels = np.array([[1, 2, 3], [4, 5, 6]])
|
|
236
|
+
>>> summarizevoxels(voxels, method="mean")
|
|
237
|
+
array([2.5, 3.5, 4.5])
|
|
238
|
+
|
|
239
|
+
>>> summarizevoxels(voxels, method="CoV")
|
|
240
|
+
array([40.82482905, 33.33333333, 25. ])
|
|
241
|
+
"""
|
|
242
|
+
theshape = thevoxels.shape
|
|
243
|
+
if len(theshape) > 1:
|
|
244
|
+
numtimepoints = theshape[1]
|
|
245
|
+
else:
|
|
246
|
+
numtimepoints = 1
|
|
247
|
+
|
|
248
|
+
if method == "CoV":
|
|
249
|
+
if numtimepoints > 1:
|
|
250
|
+
regionsummary = 100.0 * np.nan_to_num(
|
|
251
|
+
np.std(thevoxels, axis=0) / np.mean(thevoxels, axis=0)
|
|
252
|
+
)
|
|
253
|
+
else:
|
|
254
|
+
regionsummary = 100.0 * np.nan_to_num(np.std(thevoxels) / np.mean(thevoxels))
|
|
255
|
+
else:
|
|
256
|
+
if method == "mean":
|
|
257
|
+
themethod = np.mean
|
|
258
|
+
elif method == "sum":
|
|
259
|
+
themethod = np.sum
|
|
260
|
+
elif method == "median":
|
|
261
|
+
themethod = np.median
|
|
262
|
+
elif method == "std":
|
|
263
|
+
themethod = np.std
|
|
264
|
+
elif method == "MAD":
|
|
265
|
+
themethod = mad
|
|
266
|
+
else:
|
|
267
|
+
print(f"illegal summary method {method} in summarizevoxels")
|
|
268
|
+
sys.exit()
|
|
269
|
+
|
|
270
|
+
if numtimepoints > 1:
|
|
271
|
+
regionsummary = np.nan_to_num(themethod(thevoxels, axis=0))
|
|
272
|
+
else:
|
|
273
|
+
regionsummary = np.nan_to_num(themethod(thevoxels))
|
|
274
|
+
return regionsummary
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def atlasaverage(args: Any) -> None:
|
|
278
|
+
"""
|
|
279
|
+
Compute average timecourses or summary statistics for regions defined by an atlas.
|
|
280
|
+
|
|
281
|
+
This function reads fMRI data and a template (atlas) file, extracts timecourses
|
|
282
|
+
or summary statistics for each region in the atlas, and saves the results to
|
|
283
|
+
output files. It supports multiple normalization methods and can process both
|
|
284
|
+
3D and 4D input data.
|
|
285
|
+
|
|
286
|
+
Parameters
|
|
287
|
+
----------
|
|
288
|
+
args : argparse.Namespace
|
|
289
|
+
Arguments parsed from command line. Expected attributes include:
|
|
290
|
+
- datafile : str
|
|
291
|
+
Path to the input fMRI NIfTI file.
|
|
292
|
+
- templatefile : str
|
|
293
|
+
Path to the template NIfTI file defining regions.
|
|
294
|
+
- normmethod : str
|
|
295
|
+
Normalization method for timecourses: 'none', 'pct', 'std', 'var', 'p2p'.
|
|
296
|
+
- outputroot : str
|
|
297
|
+
Root name for output files.
|
|
298
|
+
- debug : bool
|
|
299
|
+
If True, enable debug printing and save intermediate masks.
|
|
300
|
+
- includespec : str or None
|
|
301
|
+
Specification for including voxels in analysis.
|
|
302
|
+
- excludespec : str or None
|
|
303
|
+
Specification for excluding voxels from analysis.
|
|
304
|
+
- extramaskname : str or None
|
|
305
|
+
Path to an additional mask file.
|
|
306
|
+
- regionlabelfile : str or None
|
|
307
|
+
Path to a file containing region labels.
|
|
308
|
+
- regionlistfile : str or None
|
|
309
|
+
Path to a file listing regions to include.
|
|
310
|
+
- summarymethod : str
|
|
311
|
+
Method for summarizing voxel values (e.g., 'mean', 'median').
|
|
312
|
+
- datalabel : str or None
|
|
313
|
+
Label to prepend to output summary.
|
|
314
|
+
- ignorezeros : bool
|
|
315
|
+
If True, exclude zero voxels when computing summaries.
|
|
316
|
+
- numpercentiles : int
|
|
317
|
+
Number of percentiles to compute for each region.
|
|
318
|
+
- headerline : bool
|
|
319
|
+
If True, include a header line in the summary CSV.
|
|
320
|
+
|
|
321
|
+
Returns
|
|
322
|
+
-------
|
|
323
|
+
None
|
|
324
|
+
This function does not return a value but writes output files to disk.
|
|
325
|
+
|
|
326
|
+
Notes
|
|
327
|
+
-----
|
|
328
|
+
For 4D data, the function computes timecourses for each region and saves them
|
|
329
|
+
as a TSV file. For 3D data, it computes summary statistics and saves both
|
|
330
|
+
a labeled NIfTI file and a CSV/TSV summary.
|
|
331
|
+
|
|
332
|
+
Examples
|
|
333
|
+
--------
|
|
334
|
+
>>> import argparse
|
|
335
|
+
>>> args = argparse.Namespace(
|
|
336
|
+
... datafile='fmri.nii.gz',
|
|
337
|
+
... templatefile='atlas.nii.gz',
|
|
338
|
+
... normmethod='std',
|
|
339
|
+
... outputroot='output',
|
|
340
|
+
... debug=False,
|
|
341
|
+
... includespec=None,
|
|
342
|
+
... excludespec=None,
|
|
343
|
+
... extramaskname=None,
|
|
344
|
+
... regionlabelfile=None,
|
|
345
|
+
... regionlistfile=None,
|
|
346
|
+
... summarymethod='mean',
|
|
347
|
+
... datalabel=None,
|
|
348
|
+
... ignorezeros=False,
|
|
349
|
+
... numpercentiles=5,
|
|
350
|
+
... headerline=True
|
|
351
|
+
... )
|
|
352
|
+
>>> atlasaverage(args)
|
|
353
|
+
"""
|
|
171
354
|
if args.normmethod == "none":
|
|
172
355
|
print("will not normalize timecourses")
|
|
173
356
|
elif args.normmethod == "pct":
|
|
@@ -197,11 +380,9 @@ def atlasaverage(args):
|
|
|
197
380
|
sys.exit()
|
|
198
381
|
|
|
199
382
|
print("reshaping")
|
|
200
|
-
|
|
201
|
-
ysize =
|
|
202
|
-
|
|
203
|
-
numtimepoints = thedims[4]
|
|
204
|
-
numvoxels = int(xsize) * int(ysize) * int(numslices)
|
|
383
|
+
xdim, ydim, numslices, numtimepoints = tide_io.parseniftidims(thedims)
|
|
384
|
+
xsize, ysize, slicethickness, tr = tide_io.parseniftisizes(thesizes)
|
|
385
|
+
numvoxels = int(xdim) * int(ydim) * int(numslices)
|
|
205
386
|
|
|
206
387
|
templatevoxels = np.reshape(template_data, numvoxels).astype(int)
|
|
207
388
|
inputvoxels = np.reshape(input_data, (numvoxels, numtimepoints))
|
|
@@ -239,14 +420,14 @@ def atlasaverage(args):
|
|
|
239
420
|
numvoxels,
|
|
240
421
|
extramask=args.extramaskname,
|
|
241
422
|
)
|
|
242
|
-
themask = inputvoxels[:, 0]
|
|
423
|
+
themask = np.ones_like(inputvoxels[:, 0])
|
|
243
424
|
if args.debug:
|
|
244
425
|
print(f"{themask.shape=}")
|
|
245
426
|
if includemask is not None:
|
|
246
427
|
themask = themask * includemask.reshape((numvoxels))
|
|
247
428
|
if args.debug:
|
|
248
429
|
tide_io.savetonifti(
|
|
249
|
-
includemask.reshape((
|
|
430
|
+
includemask.reshape((xdim, ydim, numslices)),
|
|
250
431
|
template_hdr,
|
|
251
432
|
f"{args.outputroot}_includemask",
|
|
252
433
|
)
|
|
@@ -254,7 +435,7 @@ def atlasaverage(args):
|
|
|
254
435
|
themask = themask * (1 - excludemask.reshape((numvoxels)))
|
|
255
436
|
if args.debug:
|
|
256
437
|
tide_io.savetonifti(
|
|
257
|
-
excludemask.reshape((
|
|
438
|
+
excludemask.reshape((xdim, ydim, numslices)),
|
|
258
439
|
template_hdr,
|
|
259
440
|
f"{args.outputroot}_excludemask",
|
|
260
441
|
)
|
|
@@ -262,11 +443,28 @@ def atlasaverage(args):
|
|
|
262
443
|
themask = themask * extramask.reshape((numvoxels))
|
|
263
444
|
if args.debug:
|
|
264
445
|
tide_io.savetonifti(
|
|
265
|
-
extramask.reshape((
|
|
446
|
+
extramask.reshape((xdim, ydim, numslices)),
|
|
266
447
|
template_hdr,
|
|
267
448
|
f"{args.outputroot}_extramask",
|
|
268
449
|
)
|
|
269
450
|
|
|
451
|
+
# get the region names
|
|
452
|
+
numregions = np.max(templatevoxels)
|
|
453
|
+
if args.regionlabelfile is None:
|
|
454
|
+
regionlabels = []
|
|
455
|
+
numdigits = int(np.log10(numregions)) + 1
|
|
456
|
+
for regnum in range(1, numregions + 1):
|
|
457
|
+
regionlabels.append(f"region_{str(regnum).zfill(numdigits)}")
|
|
458
|
+
else:
|
|
459
|
+
regionlabels = tide_io.readlabels(args.regionlabelfile)
|
|
460
|
+
if len(regionlabels) != numregions:
|
|
461
|
+
print(
|
|
462
|
+
"Error: number of labels in label file does not match the number of regions in the template."
|
|
463
|
+
)
|
|
464
|
+
sys.exit()
|
|
465
|
+
if args.debug:
|
|
466
|
+
print(f"Region labels: {regionlabels}")
|
|
467
|
+
|
|
270
468
|
# decide what regions we will summarize
|
|
271
469
|
if args.regionlistfile is None:
|
|
272
470
|
numregions = np.max(templatevoxels)
|
|
@@ -274,6 +472,13 @@ def atlasaverage(args):
|
|
|
274
472
|
else:
|
|
275
473
|
regionlist = tide_io.readvec(args.regionlistfile).astype(int)
|
|
276
474
|
numregions = len(regionlist)
|
|
475
|
+
newlabels = []
|
|
476
|
+
for theregion in range(numregions):
|
|
477
|
+
newlabels.append(regionlabels[theregion])
|
|
478
|
+
regionlabels = newlabels
|
|
479
|
+
if args.debug:
|
|
480
|
+
print(f"Region labels to use: {regionlabels}")
|
|
481
|
+
|
|
277
482
|
timecourses = np.zeros((numregions, numtimepoints), dtype="float")
|
|
278
483
|
print(f"{numregions=}, {regionlist=}")
|
|
279
484
|
|
|
@@ -297,7 +502,7 @@ def atlasaverage(args):
|
|
|
297
502
|
theregionvoxels -= themeans[:, None]
|
|
298
503
|
|
|
299
504
|
if args.normmethod == "none":
|
|
300
|
-
thenormfac = themeans
|
|
505
|
+
thenormfac = np.ones_like(themeans)
|
|
301
506
|
elif args.normmethod == "pct":
|
|
302
507
|
thenormfac = themeans
|
|
303
508
|
elif args.normmethod == "var":
|
|
@@ -316,22 +521,36 @@ def atlasaverage(args):
|
|
|
316
521
|
if thenormfac[theloc] != 0.0:
|
|
317
522
|
theregionvoxels[theloc, :] /= thenormfac[theloc]
|
|
318
523
|
if theregionvoxels.shape[1] > 0:
|
|
319
|
-
timecourses[theregion - 1, :] =
|
|
524
|
+
timecourses[theregion - 1, :] = summarizevoxels(
|
|
320
525
|
theregionvoxels, method=args.summarymethod
|
|
321
526
|
)
|
|
322
527
|
if args.debug:
|
|
323
528
|
print("timecourses shape:", timecourses.shape)
|
|
324
|
-
tide_io.
|
|
529
|
+
tide_io.writebidstsv(
|
|
530
|
+
args.outputroot,
|
|
531
|
+
timecourses,
|
|
532
|
+
1.0 / tr,
|
|
533
|
+
columns=regionlabels,
|
|
534
|
+
yaxislabel="delay offset",
|
|
535
|
+
)
|
|
325
536
|
else:
|
|
326
537
|
print("processing 3D input file")
|
|
327
|
-
outputvoxels = inputvoxels
|
|
328
|
-
|
|
538
|
+
outputvoxels = np.zeros_like(inputvoxels)
|
|
539
|
+
thereglabels = []
|
|
329
540
|
thevals = []
|
|
541
|
+
thepercentiles = []
|
|
542
|
+
theregsizes = []
|
|
543
|
+
thefracs = np.linspace(0.0, 1.0, args.numpercentiles + 2, endpoint=True).tolist()
|
|
544
|
+
numsubregions = len(thefracs) - 1
|
|
545
|
+
segmentedatlasvoxels = np.zeros_like(inputvoxels)
|
|
546
|
+
if args.debug:
|
|
547
|
+
print(f"{len(regionlist)=}, {regionlist=}")
|
|
548
|
+
print(f"{len(regionlabels)=}, {regionlabels=}")
|
|
330
549
|
if args.datalabel is not None:
|
|
331
|
-
|
|
550
|
+
thereglabels.append("Region")
|
|
332
551
|
thevals.append(args.datalabel)
|
|
333
552
|
for theregion in regionlist:
|
|
334
|
-
|
|
553
|
+
thereglabels.append(regionlabels[theregion - 1])
|
|
335
554
|
theregionvoxels = inputvoxels[np.where(templatevoxels * themask == theregion)]
|
|
336
555
|
initnum = theregionvoxels.shape[0]
|
|
337
556
|
if args.ignorezeros:
|
|
@@ -344,41 +563,83 @@ def atlasaverage(args):
|
|
|
344
563
|
if args.debug:
|
|
345
564
|
print(
|
|
346
565
|
f"extracting {theregionvoxels.shape[0]} "
|
|
347
|
-
f"non-zero voxels from region {theregion} of {numregions}{extrabit}"
|
|
566
|
+
f"non-zero voxels from region {theregion} of {numregions}{extrabit} "
|
|
567
|
+
f"({thereglabels[-1]})"
|
|
348
568
|
)
|
|
349
569
|
else:
|
|
350
570
|
if args.debug:
|
|
351
571
|
print(
|
|
352
572
|
f"extracting {theregionvoxels.shape[0]} "
|
|
353
|
-
f"voxels from region {theregion} of {numregions}"
|
|
573
|
+
f"voxels from region {theregion} of {numregions} "
|
|
574
|
+
f"({thereglabels[-1]})"
|
|
354
575
|
)
|
|
355
576
|
if theregionvoxels.shape[0] > 0:
|
|
356
|
-
regionval =
|
|
577
|
+
regionval = summarizevoxels(theregionvoxels, method=args.summarymethod)
|
|
578
|
+
regionsizes = theregionvoxels.shape[0]
|
|
579
|
+
regionpercentiles = [
|
|
580
|
+
f"{num:.4f}"
|
|
581
|
+
for num in tide_stats.getfracvals(
|
|
582
|
+
theregionvoxels,
|
|
583
|
+
thefracs,
|
|
584
|
+
nozero=True,
|
|
585
|
+
debug=False,
|
|
586
|
+
)
|
|
587
|
+
]
|
|
357
588
|
outputvoxels[np.where(templatevoxels == theregion)] = regionval
|
|
358
589
|
thevals.append(str(regionval))
|
|
590
|
+
theregsizes.append(str(regionsizes))
|
|
591
|
+
thepercentiles.append(regionpercentiles)
|
|
359
592
|
else:
|
|
360
593
|
if args.debug:
|
|
361
594
|
print(f"\tregion {theregion} is empty")
|
|
362
595
|
thevals.append("None")
|
|
596
|
+
for thesubregion in range(numsubregions):
|
|
597
|
+
scratchvoxels = np.zeros_like(inputvoxels)
|
|
598
|
+
subregionkey = 1 + (theregion - 1) * numsubregions + thesubregion
|
|
599
|
+
lowerlim = float(regionpercentiles[thesubregion])
|
|
600
|
+
upperlim = float(regionpercentiles[thesubregion + 1])
|
|
601
|
+
scratchvoxels[np.where(lowerlim <= inputvoxels)] = subregionkey
|
|
602
|
+
if thesubregion < numsubregions - 1:
|
|
603
|
+
scratchvoxels[np.where(inputvoxels >= upperlim)] = 0
|
|
604
|
+
scratchvoxels[np.where(templatevoxels * themask != theregion)] = 0
|
|
605
|
+
segmentedatlasvoxels += scratchvoxels
|
|
363
606
|
template_hdr["dim"][4] = 1
|
|
364
607
|
tide_io.savetonifti(
|
|
365
|
-
outputvoxels.reshape((
|
|
608
|
+
outputvoxels.reshape((xdim, ydim, numslices)),
|
|
366
609
|
template_hdr,
|
|
367
610
|
args.outputroot,
|
|
368
611
|
)
|
|
612
|
+
tide_io.savetonifti(
|
|
613
|
+
segmentedatlasvoxels.reshape((xdim, ydim, numslices)),
|
|
614
|
+
template_hdr,
|
|
615
|
+
args.outputroot + "_percentiles",
|
|
616
|
+
)
|
|
617
|
+
|
|
369
618
|
if args.includename is not None or args.excludename is not None:
|
|
370
619
|
tide_io.savetonifti(
|
|
371
|
-
(templatevoxels * themask).reshape((
|
|
620
|
+
(templatevoxels * themask).reshape((xdim, ydim, numslices)),
|
|
372
621
|
template_hdr,
|
|
373
622
|
f"{args.outputroot}_maskedatlas",
|
|
374
623
|
)
|
|
375
624
|
if args.headerline:
|
|
376
625
|
tide_io.writevec(
|
|
377
|
-
[",".join(
|
|
626
|
+
np.array([",".join(thereglabels), ",".join(thevals)]),
|
|
378
627
|
f"{args.outputroot}_regionsummaries.csv",
|
|
379
628
|
)
|
|
380
629
|
else:
|
|
381
630
|
tide_io.writevec(
|
|
382
|
-
[",".join(thevals)],
|
|
631
|
+
np.array([",".join(thevals)]),
|
|
383
632
|
f"{args.outputroot}_regionsummaries.csv",
|
|
384
633
|
)
|
|
634
|
+
|
|
635
|
+
outlines = []
|
|
636
|
+
pctstrings = [f"{num:.0f}" for num in (np.array(thefracs) * 100.0).tolist()]
|
|
637
|
+
outlines.append("Region\tVoxels\t" + "pct-" + "\tpct-".join(pctstrings))
|
|
638
|
+
for idx, region in enumerate(thereglabels):
|
|
639
|
+
outlines.append(
|
|
640
|
+
region + "\t" + theregsizes[idx] + "\t" + "\t".join(thepercentiles[idx])
|
|
641
|
+
)
|
|
642
|
+
tide_io.writevec(
|
|
643
|
+
np.array(outlines),
|
|
644
|
+
f"{args.outputroot}_regionpercentiles.tsv",
|
|
645
|
+
)
|