By default, mri_glmfit-sim will compute a spatial average inside of a
cluster to create the OCN table, so the values do not agree with the
table below. In he case of area or volume inputs, it needs to compute
the sum instead of the average. I have just modified this program to do
this. I've attached this new version. Copy it to $FREESURFER/bin
To run, add --spatial-sum to the command line
On 1/26/2021 12:56 PM, Na, Xiaoxu wrote:
External Email - Use Caution
To make it clear, I would like to extract the area of each subject in
the cluster. May I know if this is the correct way? If not, it’s
appreciated if you would point it out. Thanks!
*From:* freesurfer-boun...@nmr.mgh.harvard.edu
<freesurfer-boun...@nmr.mgh.harvard.edu> *On Behalf Of *Na, Xiaoxu
*Sent:* Tuesday, January 26, 2021 11:44 AM
*To:* freesurfer@nmr.mgh.harvard.edu
*Subject:* [Freesurfer] Unit of the Numbers in cache.th40.neg.y.ocn.dat
* External Email - Use Caution *
Dear Freesurfer Experts,
As I’d like to extract the average value of each subject in the
cluster after running group analysis, may I know the unit of these
numbers?
Since the one I’m running is surface area, and the cluster is 444mm^2,
all the numbers in the file cache.th40.neg.y.ocn.dat is in the range
of [0.55 1.05], may I know if this is correct and if so, how the unit
is for those? Thanks a lot!
ClusterNo
Max
VtxMax
Size(mm^2)
MNIX
MNIY
MNIZ
CWP
CWPLow
CWPHi
NVtxs
WghtVtx
1
-4.8321
40067
444.11
-58.1
-16.6
-23.9
0.0002
0
0.0004
670
-2784.11
Regards,
Xiaoxu
------------------------------------------------------------------------
Confidentiality Notice: This e-mail message, including any
attachments, is for the sole use of the intended recipient(s) and may
contain confidential and privileged information. Any unauthorized
review, use, disclosure or distribution is prohibited. If you are not
the intended recipient, please contact the sender by reply e-mail and
destroy all copies of the original message.
_______________________________________________
Freesurfer mailing list
Freesurfer@nmr.mgh.harvard.edu
https://mail.nmr.mgh.harvard.edu/mailman/listinfo/freesurfer
#!/bin/tcsh -f
set VERSION = 'mri_glmfit-sim @FS_VERSION@';
setenv LANG en_US.UTF-8
set inputargs = ($argv);
set glmdir = ()
set nulltype = ();
set nsim = ()
set thresh = ()
set csdbase = ()
set simsign = ()
set cwpvalthresh = .05
set Overwrite = 0;
set DoSim = 1;
set LF = ();
set AllDoneFile = ();
set Seed = ();
set fwhmOverride = ();
set fwhmAdd = 0;
set UseUniformPDF = 0;
set UniformPDFMin = ();
set UniformPDFMax = ();
set DiagCluster = 0;
set PBNodeType = ();
set UseCache = 0;
set PermForce = 1;
set PermSignFlip = 0; # for osgm-type contrasts
set PermResid = 1; # use residual when running permutation, ter Braak method
set UseGRF = 0;
set volsubject = fsaverage;
set subjectOverride = ();
set Bonferroni = 0;
set ReportCentroid = 0;
set annot = aparc
set IsPVR = 0;
set DoClusterMean = 1
set OutputAnnot = 1
set DoGRFOCNAnat = 0;
set y = ()
set framemask = ()
set PermNonStatCor = 0;
set fwhmmap = ()
set DoSpatialSum = 0
set nJobs = 1;
set DoBackground = 0;
set DoPBSubmit = 0;
set DoPoll = 0;
set tSleepSec = 10;
set CacheDir = $FREESURFER_HOME/average/mult-comp-cor
set CacheLabel = cortex;
set tmpdir = ();
set CleanUp = 1;
set PrintHelp = 0;
if($#argv == 0) goto usage_exit;
set n = `echo $argv | grep -e --help | wc -l`
if($n != 0) then
set PrintHelp = 1;
goto usage_exit;
endif
set n = `echo $argv | grep -e --version | wc -l`
if($n != 0) then
echo $VERSION
exit 0;
endif
source $FREESURFER_HOME/sources.csh
goto parse_args;
parse_args_return:
goto check_params;
check_params_return:
if(! -e $glmdir) then
echo "ERROR: cannot find $glmdir"
exit 1;
endif
set glmfitlog = $glmdir/mri_glmfit.log
if(! -e $glmfitlog) then
echo "ERROR: cannot find $glmfitlog"
exit 1;
endif
if($nulltype != perm) then
set fwhmfile = $glmdir/fwhm.dat
if(! -e $fwhmfile) then
echo "ERROR: cannot find $fwhmfile"
exit 1;
endif
# This may be overridden
set fwhm = `cat $fwhmfile`;
else
set fwhm = 0;
endif
set glmfitcwd = `cat $glmfitlog | awk '{if($1 == "cwd") print $2}'`
if(0 && ! -e $glmfitcwd) then
echo "ERROR: cannot find $glmfitcwd"
exit 1;
endif
set glmfitcwd = `pwd`;
set anattype = volume;
set subject = ();
set hemi = ();
set surf = "white";
set wls = ();
set glmfitcwd = `cat $glmfitlog | awk '{if($1 == "cwd") print $2}'`
# Go through the original mri_glmfit command-line
set glmfitcmd0 = `cat $glmfitlog | awk '{if($1 == "cmdline") print $0}'`
set glmfitcmd = ($glmfitcmd0);
echo $glmfitcmd
set gd2mtx = dods
set UseTable = 0;
set label = ();
while($#glmfitcmd)
set flag = $glmfitcmd[1]; shift glmfitcmd;
#echo $flag
switch($flag)
case "--surf"
case "--surface"
set subject = $glmfitcmd[1]; shift glmfitcmd;
set hemi = $glmfitcmd[1]; shift glmfitcmd;
set anattype = surface;
if($#glmfitcmd != 0) then
set c = `echo $glmfitcmd[1] | cut -c 1-2`;
if("$c" != "--") then
set surf = $glmfitcmd[1]; shift glmfitcmd;
endif
endif
breaksw
case "--fsgd"
shift glmfitcmd;
if($#glmfitcmd > 0) then
if($glmfitcmd[1] == doss) set gd2mtx = doss
endif
breaksw
case "--label"
set label = $glmfitcmd[1]; shift glmfitcmd;
breaksw
case "--perm-force"
# Probably never gets here
set PermForce = 1;
breaksw
case "--table"
case "--y"
if($#y == 0) set y = $glmfitcmd[1];
shift glmfitcmd;
if($DoClusterMean) then
if(! -e $y) then
set y = $glmfitcwd/$y
if(! -e $y) then
set y = $glmdir/`basename $y`
if(! -e $y) then
echo "ERROR: cannot find $y"
echo "If you do not have this file, run with --no-y as the first
option"
exit 1;
endif
endif
endif
endif
if("$flag" == "--table") set UseTable = 1;
breaksw
case "--frame-mask"
set framemask = $glmfitcmd[1];
shift glmfitcmd;
if(! -e $framemask) then
echo "ERROR: cannot find frame mask $framemask"
exit 1;
endif
echo "Using frame mask $framemask"
breaksw
case "--wls"
if($nulltype == perm) then
echo "ERROR: cannot use permutation with weighted least squares (--wls)"
echo "You must re-run mri_glmfit without the --wls flag"
exit 1;
endif
set wls = $glmfitcwd/$glmfitcmd[1]; shift glmfitcmd;
if(! -e $wls) then
set wls = $glmdir/`basename $wls`
if(! -e $wls) then
echo "ERROR: cannot find $wls"
exit 1;
endif
endif
breaksw
case "--osgm"
# Technically don't need to do this here because automatically done in
mri_glmfit
set PermSignFlip = 1;
breaksw
# Ignore these options that have no args
case "cmdline"
case "mri_glmfit"
case "--prune"
case "--no-prune"
case "--pca"
case "--synth"
case "--allowsubjrep"
case "--illcond"
case "--debug"
case "--synth"
case "--cortex"
case "--kurtosis"
case "--nii"
case "--nii.gz"
case "--rescale-x"
case "--no-rescale-x"
case "--fisher"
case "--no-pcc"
case "dods"
case "mri_glmfit.bin"
case "--save-eres"
case "--eres-save"
case "--save-fwhm-map"
case "--mgz"
case "--mgh"
case "--nii"
case "--nii.gz"
breaksw
# Ignore these options that have one arg
case "--glmdir"
case "--o"
case "--C"
case "--X"
case "--w"
case "--fwhm"
case "--mask"
case "--seed"
case "--var-fwhm"
case "--yffxvar"
case "--ffxdof"
case "--ffxdofdat"
case "--exclude-frame"
shift glmfitcmd;
breaksw
case "--pvr"
set IsPVR = 1;
shift glmfitcmd;
breaksw
# Ignore these options that have two args
case "--rand-split"
shift glmfitcmd;
shift glmfitcmd;
breaksw
default
echo ""
echo "INFO: unrecognized mri_glmfit cmd option $flag"
echo " ... probably not a problem"
echo ""
#sleep 10
#exit 1;
breaksw
endsw
end
set mask = ();
if(! $UseTable) then
set mask = `stem2fname $glmdir/mask`
if($status) then
echo "$mask"
exit 1;
endif
endif
if(0 && $UseGRF && $anattype != volume) then
# not true anymore
echo "ERROR: can only use --grf with volume"
exit 1;
endif
if($UseGRF) then
set csdbase = "grf.th$thresh.$simsign"
#set tmp = `echo "$thresh*10"|bc -l`
#set tmp = `printf %02d $tmp`
#set csdbase = "grf.th$tmp.$simsign"
endif
if($#subjectOverride) set subject = $subjectOverride
# Make sure the subject exists
if($#subject != 0) then
if(! -e $SUBJECTS_DIR/$subject) then
echo "ERROR: cannot find $subject in $SUBJECTS_DIR"
exit 1;
endif
echo "SURFACE: $subject $hemi"
endif
# Get a list of contrasts, etc
set FSGDhasCon = 0;
if(-e $glmdir/y.fsgd) then
# check whether contrasts were specified in the FSGD
set FSGDhasCon = `cat $glmdir/y.fsgd | awk '{if($1 == "Contrast") print 1}' |
wc -l`
endif
if($#tmpdir == 0) set tmpdir = $glmdir/tmp.mri_glmfit-sim-$$
mkdir -p $tmpdir
set clist = ($glmdir/*/C.dat)
if($status) then
echo "ERROR: cannot find any contrasts"
exit 1;
endif
set clist2 = ();
set conlist = ();
foreach c ($clist)
set tmp = `dirname $c`
set conname = `basename $tmp`
set conlist = ($conlist $conname);
set confile = $tmpdir/$conname.mtx
cp $c $confile
# If Cons in the FSGD, dont spec on glmfit cmd line
if($FSGDhasCon == 0) set clist2 = ($clist2 --C $confile);
# Make sure sig is there
set sig = `stem2fname $glmdir/$conname/sig`
if($status) then
echo "$sig"
exit 1;
endif
# Make sure that csd is not there
if($DoSim) then
ls $glmdir/csd/$csdbase.j???-$conname.csd >& /dev/null
set csdexists = (! $status)
if($csdexists) then
set csdfiles = ($glmdir/csd/$csdbase.j???-$conname.csd)
if(! $Overwrite) then
echo "ERROR: $csdfiles already exists"
echo "Delete it or run with --overwrite"
exit 1;
endif
rm -f $csdfiles
endif
endif
end
set StartDate = `date`
# Create log file
if($#LF == 0) then
if($UseCache == 0) then
set LF = $glmdir/$csdbase.mri_glmfit-sim.log
else
set LF = $glmdir/cache.mri_glmfit-sim.log
endif
rm -f $LF
endif
echo "log file is $LF"
echo "" | tee -a $LF
echo "cd `pwd`" | tee -a $LF
echo $0 | tee -a $LF
echo $inputargs | tee -a $LF
echo "" | tee -a $LF
echo $VERSION | tee -a $LF
date | tee -a $LF
uname -a | tee -a $LF
echo $user | tee -a $LF
echo "setenv SUBJECTS_DIR $SUBJECTS_DIR" | tee -a $LF
echo "FREESURFER_HOME $FREESURFER_HOME" | tee -a $LF
echo "" | tee -a $LF
echo "Original mri_glmfit command line:" | tee -a $LF
echo $glmfitcmd0 | tee -a $LF
echo "" | tee -a $LF
echo "DoSim = $DoSim" | tee -a $LF
echo "UseCache = $UseCache" | tee -a $LF
echo "DoPoll = $DoPoll" | tee -a $LF
echo "DoPBSubmit = $DoPBSubmit" | tee -a $LF
echo "DoBackground = $DoBackground" | tee -a $LF
echo "DiagCluster = $DiagCluster" | tee -a $LF
echo "gd2mtx = $gd2mtx" | tee -a $LF
if($#Seed) echo "Seed = $Seed" | tee -a $LF
echo "fwhm = $fwhm" | tee -a $LF
if($#fwhmOverride) then
# Change fwhm from value in glmdir to override value
echo "fwhmOverride = $fwhmOverride" | tee -a $LF
set fwhm = $fwhmOverride
endif
mkdir -p $glmdir/csd
if($UseCache) then
#set fwhm = `cat $glmdir/fwhm.dat`;
set fwhmStr = `perl -e "printf('"'%02d'"',int ( $fwhm+0.5+$fwhmAdd ) ) "`
if($fwhmStr == 00) set fwhmStr = 01;
set threshStr = `perl -e "print 10*$thresh"`;
set csdCache =
$CacheDir/$subject/$hemi/$CacheLabel/fwhm$fwhmStr/$simsign/th$threshStr/mc-z.csd
if(! -e $csdCache) then
echo "ERROR: cannot find $csdCache" | tee -a $LF
echo " This often happens when the measured FWHM is very high and their is
not a table entry." | tee -a $LF
echo " Consider using lower smoothing levels." | tee -a $LF
exit 1;
endif
echo CSD $csdCache | tee -a $LF
if($#csdbase == 0) set csdbase = cache.th$threshStr.$simsign
endif
if($DoSim) then
# Use fsgd if there, if not use X
set fsgd = ();
set X = ();
if(-e $glmdir/y.fsgd) then
set fsgd = $glmdir/y.fsgd
else
set X = $glmdir/Xg.dat
endif
# Number of sim iterations per job
set nSimPerJob = `echo "$nsim/$nJobs" | bc`;
echo "nSimPerJob = $nSimPerJob"| tee -a $LF
if($DoPoll) then
set PollDir = $glmdir/csd/poll
mkdir -p $PollDir
# User can create this file to stop simulation
set StopFile = $PollDir/StopSim
rm -f $StopFile
endif
# ----------------- Run glmfit simulation ----------------------
# This may take a while
@ nthJob = 1
while($nthJob <= $nJobs)
set jpad = `printf j%03d $nthJob`
echo "$nthJob/$nJobs `date`" | tee -a $LF
set cmd = (mri_glmfit $clist2)
set cmd = ($cmd --sim $nulltype $nSimPerJob $thresh \
$glmdir/csd/$csdbase.$jpad)
set cmd = ($cmd --sim-sign $simsign --fwhm $fwhm)
if($#fsgd) set cmd = ($cmd --fsgd $fsgd $gd2mtx)
if($#X) set cmd = ($cmd --X $X)
if($#wls) set cmd = ($cmd --wls $wls)
if($#framemask) set cmd = ($cmd --frame-mask $framemask)
# --y must go after --fsgd
if(! $UseTable) then
set cmd = ($cmd --mask $mask)
if($PermResid == 0) set cmd = ($cmd --y $y)
if($PermResid == 1) set cmd = ($cmd --y $residual)
if($PermSignFlip == 1) set cmd = ($cmd --perm-1)
if($PermNonStatCor) set cmd = ($cmd --perm-nonstatcor)
endif
if($UseTable) set cmd = ($cmd --table $y)
#if($#label) set cmd = ($cmd --label $label)
if($PermForce) set cmd = ($cmd --perm-force)
if($anattype == surface) set cmd = ($cmd --surf $subject $hemi $surf);
if($#Seed) set cmd = ($cmd --seed $Seed);
if($UseUniformPDF) set cmd = ($cmd --uniform $UniformPDFMin $UniformPDFMax);
if($DiagCluster) set cmd = ($cmd --diag-cluster --debug)
if($?verbose) set cmd = ($cmd --debug)
if($DoPoll) then
set DoneFile = $PollDir/done.$csdbase.$jpad
rm -f $DoneFile
set cmd = ($cmd --sim-done $DoneFile)
endif
echo $cmd | tee -a $LF
if(! $DoPoll) then
# Run directly in shell
$cmd | tee -a $LF
if($status && ! $DiagCluster) exit 1;
date | tee -a $LF
# ----------------------------------------------------
if($DiagCluster) then
set conname = $conlist[1];
set sig = ./$conname-sig.mgh
set csd = $glmdir/csd/$csdbase.$jpad-$conname.csd
set sum = $glmdir/csd/$csdbase.$jpad-$conname.diag
if($anattype == surface) then
set cmd = (mri_surfcluster --subject $subject \
--hemi $hemi --surf $surf --cwpvalthresh $cwpvalthresh)
if($ReportCentroid) set cmd = ($cmd --centroid);
set c = 4;
endif
if($anattype == volume) then
set cmd = (mri_volcluster)
set c = 3;
endif
set cmd = ($cmd --in $sig --mask $mask --cwpvalthresh $cwpvalthresh \
--sum $sum --thmin $thresh --sign $simsign)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
set maxclustB = `grep -v \# $csd | awk '{print $3}' | sort -nr | head
-n 1`;
set maxclustA = `grep -v \# $sum | awk -v c=$c '{print $c}' | sort -nr
| head -n 1`;
echo "MaxClusterSizeA $maxclustA"| tee -a $LF
echo "MaxClusterSizeB $maxclustB"| tee -a $LF
exit 1;
endif
# ----------------------------------------------------
else
if($DoBackground) then
# Run in background
$cmd >>& $LF &
endif
if($DoPBSubmit) then
# pbsubmit
echo "PBSUBMIT ---------------------------------" | tee -a $LF
pbsubmit $PBNodeType -c "$cmd >> $LF" | tee -a $LF
sleep 10;
echo "" | tee -a $LF
endif
endif
@ nthJob = $nthJob + 1
end
if($DoPoll) then
# Possible bug: if job above dies without creating done file
echo "Polling" | tee -a $LF
@ nthPoll = 0;
set Done = 0;
while(! $Done)
if(-e $StopFile) then
# Something has gone wrong, maybe user deleted to halt
echo "WARNING: simulation aborted by user" | tee -a $LF
exit 1;
endif
if(! -e $PollDir) then
# Something has gone wrong, maybe user deleted to halt
echo "ERROR: cannot find $PollDir, aborting" | tee -a $LF
exit 1;
endif
@ nthPoll = $nthPoll + 1;
set Done = 1;
@ nthJob = 1
while($nthJob <= $nJobs)
set jpad = `printf j%03d $nthJob`
set DoneFile = $PollDir/done.$csdbase.$jpad
if(! -e $DoneFile) then
echo "Poll $nthPoll job $nthJob `date`" | tee -a $LF
set Done = 0;
break;
endif
@ nthJob = $nthJob + 1
end
sleep $tSleepSec
end
endif
endif #DoSim
if($DoPBSubmit) then
# pbsubmit the surfcluster part
set cmd = (mri_glmfit-sim --glmdir $glmdir --tmp $tmpdir)
set cmd = ($cmd --sim-sign $simsign --no-sim $csdbase --cwpvalthresh
$cwpvalthresh)
set cmd = ($cmd --log $LF)
if($PermNonStatCor) set cmd = ($cmd --perm-nonstatcor)
echo "------------------------------------------------" | tee -a $LF
echo $cmd | tee -a $LF
pbsubmit $PBNodeType -c "$cmd"
sleep 1;
echo ""
echo "Just submitted this as a job, and exiting now."
echo ""
# Could wait until it is done by polling for AllDoneFile
exit 0;
endif
# -------------- now run clustering -------------------- #
foreach conname ($conlist)
if($UseTable) continue;
set csdlist = ();
if(! $UseGRF) then
if($UseCache) then
set csdfiles = ($csdCache)
else
ls $glmdir/csd/$csdbase.j???-$conname.csd >& /dev/null
if($status) then
echo "ERROR: cannot find any csd files"| tee -a $LF
exit 1;
endif
set csdfiles = ($glmdir/csd/$csdbase.j???-$conname.csd)
endif
set csdlist = ();
foreach csd ($csdfiles)
set csdlist = ($csdlist --csd $csd);
end
endif
set sig = `stem2fname $glmdir/$conname/sig`
set ext = `fname2ext $sig`
set vwsig = $glmdir/$conname/$csdbase.sig.voxel.$ext
set vwsigmax = $glmdir/$conname/$csdbase.sig.voxel.max.dat
set cwsig = $glmdir/$conname/$csdbase.sig.cluster.$ext
set msig = $glmdir/$conname/$csdbase.sig.masked.$ext
set ocn = $glmdir/$conname/$csdbase.sig.ocn.$ext
set oannot = $glmdir/$conname/$csdbase.sig.ocn.annot
set sum = $glmdir/$conname/$csdbase.sig.cluster.summary
set csdpdf = $glmdir/$conname/$csdbase.pdf.dat
if($anattype == surface) then
set cmd = (mri_surfcluster --in $sig --mask $mask \
--cwsig $cwsig --sum $sum --ocn $ocn \
--annot $annot --cwpvalthresh $cwpvalthresh --o $msig --no-fixmni)
set cmd = ($cmd --csd-out $glmdir/csd/all.$csdbase-$conname.csd)
if(! $UseGRF) set cmd = ($cmd $csdlist --csdpdf $csdpdf --vwsig $vwsig
--vwsigmax $vwsigmax)
if($UseGRF) set cmd = ($cmd --fwhm $fwhm --hemi $hemi --subject $subject
--thmin $thresh --sign $simsign)
if($PermNonStatCor) set cmd = ($cmd --fwhm-map $fwhmmap)
if($OutputAnnot) set cmd = ($cmd --oannot $oannot)
if($Bonferroni) set cmd = ($cmd --bonferroni $Bonferroni)
if($ReportCentroid) set cmd = ($cmd --centroid);
set cmd = ($cmd --surf $surf); # bug to have to do this
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
if($DoClusterMean) then
# Create an average "waveform" for each cluster
set avgwf = $glmdir/$conname/$csdbase.y.ocn.dat
set cmd = (mri_segstats --seg $ocn --exclude 0 \
--i $y --sum /tmp/mri_glmfit-sim.junk.$$)
if($DoSpatialSum == 0) set cmd = ($cmd --avgwf $avgwf)
if($DoSpatialSum == 1) set cmd = ($cmd --sumwf $avgwf)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
rm -f /tmp/mri_glmfit-sim.junk.$$
endif
endif
if($anattype == volume) then
mri_info --o /tmp/mri_glmfit-sim.junk.$$.cres --cres $sig
set voxsize = `cat /tmp/mri_glmfit-sim.junk.$$.cres`
if($voxsize != 2) then
echo "ERROR: voxel size of input is $voxsize, expecting 2"
exit 1
endif
set reg = $FREESURFER_HOME/subjects/$volsubject/mri.2mm/reg.2mm.dat
set aseg = aparc+aseg.mgz
if(! -e $FREESURFER_HOME/subjects/$volsubject/mri/$aseg) set aseg = aseg.mgz
set cmd = (mri_volcluster --in $sig --mask $mask --reg $reg --no-fixmni\
--cwsig $cwsig --sum $sum --ocn $ocn --cwpvalthresh $cwpvalthresh \
--seg $volsubject $aseg --out $msig --allowdiag)
if($Bonferroni) set cmd = ($cmd --bonferroni $Bonferroni)
if(! $UseGRF) set cmd = ($cmd --csdpdf $csdpdf $csdlist --vwsig $vwsig
--vwsigmax $vwsigmax)
if($UseGRF) set cmd = ($cmd --fwhmdat $glmdir/fwhm.dat --sign $simsign
--thmin $thresh --sign $simsign)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
if($DoClusterMean) then
# Create an average "waveform" for each cluster
set avgwf = $glmdir/$conname/$csdbase.y.ocn.dat
set cmd = (mri_segstats --seg $ocn --exclude 0 \
--i $y --sum /tmp/mri_glmfit-sim.junk.$$)
if($DoSpatialSum == 0) set cmd = ($cmd --avgwf $avgwf)
if($DoSpatialSum == 1) set cmd = ($cmd --sumwf $avgwf)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
rm -f /tmp/mri_glmfit-sim.junk.$$
endif
if($UseGRF && $DoGRFOCNAnat) then
# Map the OCN into anat space, takes a lot of disk space
set ocnanat = $glmdir/$conname/$csdbase.sig.ocn.anat.$ext
set cmd = (mri_vol2vol --interp nearest --mov $ocn --regheader \
--targ $SUBJECTS_DIR/fsaverage/mri/orig.mgz \
--o $ocnanat --no-save-reg)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
endif
endif
# For some reason cwsig has 4 frames, just take 1st
set cmd = (mri_convert $cwsig $cwsig --frame 0)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
end
if($CleanUp) rm -r $tmpdir
if($#AllDoneFile) touch $AllDoneFile
echo $StartDate | tee -a $LF
date | tee -a $LF
echo "mri_glmfit-sim done" | tee -a $LF
exit 0
###############################################
############--------------##################
parse_args:
set cmdline = ($argv);
while( $#argv != 0 )
set flag = $argv[1]; shift;
switch($flag)
case "--glmdir":
if( $#argv < 0) goto arg1err;
set glmdir = $argv[1]; shift;
breaksw
case "--y":
if($#argv < 0) goto arg1err;
# Override input in fsgd file
set y = $argv[1]; shift;
if(! -e $y) then
echo "ERROR: cannot find $y"
exit 1
endif
breaksw
case "--mczsim":
case "--mcsim":
case "--cache":
if( $#argv < 2) goto arg2err;
set thresh = $argv[1]; shift;
set simsign = $argv[1]; shift;
set UseCache = 1;
set DoSim = 0;
# Handles the case where LC_NUMERIC is not set to en_US.UTF-8
set thresh = `echo $thresh | sed 's/,/./g'`
set thresh = `printf %2.1f $thresh`
if($thresh != 1.3 && $thresh != 2.0 && $thresh != 2.3 && \
$thresh != 3.0 && $thresh != 3.3 && $thresh != 4.0) then
echo "ERROR: thresh = $thresh, must be 1.3, 2.0, 2.3, 3.0, 3.3, 4.0"
exit 1;
endif
breaksw
case "--mczsim-dir":
case "--cache-dir":
if( $#argv < 1) goto arg1err;
set CacheDir = $argv[1]; shift;
set UseCache = 1;
set DoSim = 0;
breaksw
case "--mczsim-label":
case "--cache-label":
if( $#argv < 1) goto arg1err;
set CacheLabel = $argv[1]; shift;
set UseCache = 1;
set DoSim = 0;
breaksw
case "--vol-subject":
if( $#argv < 1) goto arg1err;
set volsubject = $argv[1]; shift;
breaksw
case "--grf":
if( $#argv < 2) goto arg2err;
set thresh = $argv[1]; shift;
set simsign = $argv[1]; shift;
#if($simsign != pos && $simsign != neg) then
#echo "ERROR: must use pos or neg with --grf"
#exit 1;
#endif
set UseGRF = 1;
set DoSim = 0;
breaksw
case "--perm":
if( $#argv < 3) goto arg4err;
set nulltype = perm;
set nsim = $argv[1]; shift;
set thresh = $argv[1]; shift;
set simsign = $argv[1]; shift;
set threshStr = `perl -e "print 10*$thresh"`;
set csdbase = perm.th$threshStr.$simsign
breaksw
case "--perm-nonstatcor":
set PermNonStatCor = 1;
set csdbase = perm.nsc.th$threshStr.$simsign
breaksw
case "--sim":
if( $#argv < 4) goto arg4err;
set nulltype = $argv[1]; shift;
set nsim = $argv[1]; shift;
set thresh = $argv[1]; shift;
set csdbase = $argv[1]; shift;
breaksw
case "--sim-sign":
if( $#argv < 1) goto arg1err;
set simsign = $argv[1]; shift;
breaksw
case "--subject-override":
if( $#argv < 1) goto arg1err;
set subjectOverride = $argv[1]; shift;
breaksw
case "--centroid":
set ReportCentroid = 1;
breaksw
case "--log":
if( $#argv < 1) goto arg1err;
set LF = $argv[1]; shift;
breaksw
case "--a2009s":
set annot = "aparc.a2009s"
breaksw
case "--annot":
if( $#argv < 1) goto arg1err;
set annot = $argv[1]; shift;
breaksw
case "--overwrite":
set Overwrite = 1;
breaksw
case "--pbsubmit":
if($#argv < 1) goto arg1err;
set nJobs = $argv[1]; shift;
set DoPBSubmit = 1;
set DoPoll = 1;
set DoBackground = 0;
breaksw
case "--bg":
if($#argv < 1) goto arg1err;
set nJobs = $argv[1]; shift;
set DoBackground = 1;
set DoPoll = 1;
set DoPBSubmit = 0;
breaksw
case "--no-bg":
set DoBackground = 0;
set DoPoll = 0;
breaksw
case "--sleep":
if($#argv < 1) goto arg1err;
set tSleepSec = $argv[1]; shift;
breaksw
case "--seed":
if($#argv < 1) goto arg1err;
set Seed = $argv[1]; shift;
breaksw
case "--fwhm-override":
if($#argv < 1) goto arg1err;
set fwhmOverride = $argv[1]; shift;
breaksw
case "--fwhm-add":
if($#argv < 1) goto arg1err;
set fwhmAdd = $argv[1]; shift;
breaksw
case "--perm-force":
set PermForce = 1;
breaksw
case "--perm-resid":
set PermResid = 1;
set PermForce = 1; # purpose of using residual is to allow non-orthog
breaksw
case "--no-perm-force":
set PermForce = 0;
breaksw
case "--no-perm-resid":
set PermForce = 0;
set PermResid = 0;
breaksw
case "--tmp":
if($#argv < 1) goto arg1err;
set tmpdir = $argv[1]; shift;
breaksw
case "--bonferroni":
if($#argv < 1) goto arg1err;
set Bonferroni = $argv[1]; shift;
breaksw
case "--2spaces":
set Bonferroni = 2;
breaksw
case "--3spaces":
set Bonferroni = 3;
breaksw
case "--cwpvalthresh":
case "--cwp":
if($#argv < 1) goto arg1err;
set cwpvalthresh = $argv[1]; shift;
breaksw
case "--uniform":
if($#argv < 2) goto arg2err;
set UniformPDFMin = $argv[1]; shift;
set UniformPDFMax = $argv[1]; shift;
set UseUniformPDF = 1;
breaksw
case "--base":
if($#argv < 1) goto arg1err;
set csdbase = $argv[1]; shift;
breaksw
case "--no-sim":
if($#argv < 1) goto arg1err;
set csdbase = $argv[1]; shift;
set DoSim = 0;
breaksw
case "--spatial-sum":
set DoSpatialSum = 1;
breaksw
case "--diag-cluster":
set DiagCluster = 1;
breaksw
case "--no-out-annot":
set OutputAnnot = 0
breaksw
case "--no-cluster-mean":
case "--no-y":
set DoClusterMean = 0;
breaksw
case "--no-grf-ocn-anat":
set DoGRFOCNAnat = 0;
breaksw
case "--grf-ocn-anat":
set DoGRFOCNAnat = 1;
breaksw
case "--debug":
set verbose = 1;
set echo = 1;
breaksw
default:
echo ERROR: Flag $flag unrecognized.
echo $cmdline
exit 1
breaksw
endsw
end
goto parse_args_return;
############--------------##################
############--------------##################
check_params:
if($#glmdir == 0) then
echo "ERROR: must spec --glmdir"
exit 1;
endif
if($DoSim) then
if($#nulltype == 0) then
echo "ERROR: must spec --sim"
exit 1;
endif
if($#simsign == 0) then
echo "ERROR: must spec --sim-sign"
exit 1;
endif
endif
set residual = ()
if($nulltype == perm && $PermResid) then
set stem = $glmdir/eres
set residual = `stem2fname $stem`
if($status) then
echo "ERROR: cannot find residual $stem needed with --perm-resid"
echo " when running mri_glmfit, make sure to include --eres-save"
exit 1;
endif
endif
if($DiagCluster && $DoBackground) then
echo "ERROR: cannot background with --diag-cluster"
exit 1;
endif
if($DiagCluster && $DoPBSubmit) then
echo "ERROR: cannot pbsubmit with --diag-cluster"
exit 1;
endif
if($DiagCluster && $DoSim == 0) then
echo "ERROR: must simulate with --diag-cluster"
exit 1;
endif
if($PermNonStatCor) then
set stem = $glmdir/fwhm
set fwhmmap = `stem2fname $stem`
if($status) then
echo "ERROR: cannot find fwhmmap $stem needed with --perm-nonstatcor"
echo " when running mri_glmfit, make sure to include --save-fwhm-map"
exit 1;
endif
endif
goto check_params_return;
############--------------##################
############--------------##################
arg1err:
echo "ERROR: flag $flag requires one argument"
exit 1
############--------------##################
############--------------##################
arg2err:
echo "ERROR: flag $flag requires two arguments"
exit 1
############--------------##################
############--------------##################
arg4err:
echo "ERROR: flag $flag requires four arguments"
exit 1
############--------------##################
############--------------##################
usage_exit:
echo ""
echo "mri_glmfit-sim --help"
echo ""
echo " --glmdir glmdir"
echo " --cwp cwthresh : cluster-wise p-value threshold ($cwpvalthresh)"
echo ""
echo "Use pre-computed z-based monte-carlo simulations (see mri_mcsim)"
echo " --mczsim vwthreshold sign"
echo "If you have run your own simulations (mri_mcsim), then specify "
echo " --mczsim-dir dir : default is FREESURFER_HOME/average/mult-comp-cor"
echo " --mczsim-label label : default is cortex"
echo ""
echo "Use permutation simulation"
echo " --perm nsim CFT sign : permutation simulation with nsim iterations"
echo " --perm-resid : add this with non-orthogonal designs to run
permutation"
echo " on the residual rather than on the raw data (must have run
mri_glmfit"
echo " with --eres-save)"
echo " --perm-signflip : use sign flipping instead of shuffling (automatic
for --osgm)"
echo ""
echo "Use Gaussian Random Fields (GRF), volumes only"
echo " --grf vwthreshold sign : -log10(p) and sign (pos, neg, abs)"
echo ""
echo "Correct for multiple spaces"
echo " --2spaces : additional Bonferroni correction across 2 spaces (eg, lh,
rh)"
echo " --3spaces : additional Bonferroni correction across 3 spaces (eg, lh,
rh, mni305)"
echo ""
echo " --overwrite : delete previous CSDs"
echo " --bg njobs : divide sim into njobs and put in background"
echo " --sleep tSleepSec : number of seconds to sleep between background
polls "
echo ""
echo " --a2009s : use aparc.a2009s instead of aparc for reporting region of
vertex max"
echo " --annot annot : use annot instead of aparc for reporting region of
vertex max"
echo ""
echo " --log logfile : default is csdbase.mri_glmfit-sim.log"
echo ""
echo " --base csdbase : override csdbase name"
echo " --no-sim csdbase : do not simulate, only run cluster"
echo " --seed seed : set simluation seed"
echo " --fwhm-override fwhm : override fwhm in glmdir":
echo " --fwhm-add fwhmAdd : add fwhmAdd to the estimated fwhm before
addressing table":
echo " --uniform min max : use uniform PDF instead of gaussian":
echo " --no-out-annot : do not output a cluster annotation"
echo " --no-cluster-mean : do not compute means of each subject in each
cluster (was --no-y)"
echo " --y yFile : use yFile instead of determining yFile from glmdir"
echo " --centroid : report the coordinates/annotation of the centroid instead
of max"
echo " --spatial-sum : compute the sum over voxels in the cluster rather than"
echo " the average when creating the y.ocn file. This is good for when the
input is area or volume"
echo " --help"
echo ""
if(! $PrintHelp) exit 1;
echo $VERSION
cat $0 | awk 'BEGIN{prt=0}{if(prt) print $0; if($1 == "BEGINHELP") prt = 1 }'
exit 1;
#---- Everything below here is printed out as part of help -----#
BEGINHELP
This program is a script to run corrections for multiple comparisons
(CMC) on the volume or the surface. It is a front-end for the
mri_glmfit, mri_surfcluster, and mri_volcluster programs.
To use this program:
1. Run mri_glmfit on your data, giving it the glm directory
(--glmdir), and all the other arguments.
2. Choose a voxel-wise (cluster-forming) threshold vwthresh. The
vwthresh takes the value -log10(p) where p is the p-value. So if
vwthresh = 2, then p<.01. You should understand the difference
between the cluster-forming threshold and the cluster-wise
threshold (--cwp). For mczsim, vwthresh must be 1.3, 2.0, 2.3, 3.0,
3.3, or 4.0 (unless you have simulated more values). There are no
good methods to choose this value. Typically 2 or 3 is used.
It is not recommended to use 1.3 unless performing a permutation
operation.
3. Choose the sign of the effect, either positive (pos), negative
(neg) or absolute/unsigned (abs). If you have an a priori
hypothesis (eg, group1 > group2), then choose positive. If you do
not expect a particular sign, then use abs. Choosing a sign will
yield stronger results (ie, smaller p-values), but you will lose
voxels with the opposite sign. NOTE: the "abs" for GRF is only
approximate. For volumes, it may give very conservative results.
4. Choose the method. This will be either: (1) --mczsim z-based monte
carlo simulation (See
surfer.nmr.mgh.harvard.edu/fswiki/BuildYourOwnMonteCarlo).
(2) --perm for permutation simulation, or (3) --grf for Gaussian Random Field
method (analytical). For permution, you must choose the number of simulation
iterations (typically 5000-1000); permutation may take a few hours to
complete. GRF is for volumes only.
Now run the command, eg,
mri_glmfit-sim --glmdir glmdir --mczsim 2 abs
or
mri_glmfit-sim --glmdir glmdir --sim perm 1000 3 abs
The output will be in each contrast folder and will be something like
the following (where csdbase will be "cache" with --mczsim or "perm"
with --perm or "grf" with --grf)
csdbase.sig.voxel.mgh
csdbase.sig.cluster.mgh
csdbase.sig.cluster.summary
csdbase.y.ocn.dat
csdbase.sig.ocn.mgh
csdbase.sig.ocn.annot (for surfaces only)
csdbase.sig.masked.mgh
csdbase.sig.voxel.mgh - the sig volume corrected for multiple
comparisons on a voxel-wise basis. The threshhold and sign are
irrelevant. The value at each voxel is the corrected -log10(p-value)
for that voxel.
csdbase.sig.cluster.mgh - the sig volume corrected for multiple
comparisons on a cluster-wise basis. The value at each voxel
is the -log10(p), where p is the pvalue of the cluster at
that voxel. If that voxel does not belong to a cluster, its
value will be 0.
csdbase.sig.cluster.summary - this is the cluster summary table
(a simple text file).
csdbase.y.ocn.dat - this is a summary of the input (y) over each
cluster. It has a column for each cluster. Each row is a subject. The
value is the average of the input (y) in each cluster. This is a
simple text file.
csdbase.sig.ocn.mgh - output cluster number volume. The value of the
voxel is the integer cluster number that that voxel belongs to. This
can be used like a segmentation (eg, to load into tkmedit or
use for running mri_segstats).
csdbase.sig.ocn.annot (for surfaces only) - this is an annotation
with the annotation name being the cluster number. This can be
used like any other annotation (eg, to load into tksurfer or
as input for mri_segstats or mris_anatomical_stats).
csdbase.sig.masked.mgh - the original sig volume masked to show
only clusters.
OTHER OPTIONS
--overwrite
Overwrite existing CSD files when performing simulation. Default
is to not overwrite so that you do not clobber CSD files that you
spent a weekend creating.
--bg njobs
CAREFUL!!!! WARNING!!! Divide the number of simulation interations
into njobs background jobs. If the simulation jobs die uncleanly for
some reason, this will never quit because it looks for a file created
by the simulation job before continuing. If this file is not created,
then it will keep polling for this file forever. ALSO: if you are not
running on a computer with multiple nodes, then this will not make it
run any faster (in fact, it will run slower). You can stop
backgrounded jobs creating a file called glmdir/csd/poll/StopSim. If
you are in the Martinos center, do not attempt to use --bg on the
launchpad computational cluster.
--cwp cwpvalthresh
--cwpvalthresh cwpvalthresh
Only report clusters that have p < cwpvalthresh. Default is .05. If
you want to change this after running a permutation simulation, you do
not need to re-run the entire simulation. Just run mri_glmfit with the
--no-sim option.
--2spaces
--3spaces
This adds an addition correction for multiple comparisons for when the
current correction is part of a larger analysis. For example, if you
are doing a structural study looking at both the left and the right
hemispheres, mri_glmfit-sim must be run separately for each
hemisphere. By default, it will give you p-values corrected only for
one hemisphere. To correct for both hemispheres use --2spaces. For an
fMRI study in which you are using both hemispheres and subcortical
structures, then use --3spaces. The correction applied is Bonferroni
(N=2 for --2spaces and N=3 for --3spaces).
--no-sim csdbase
Run this if you have already run the permutation stimulation but just
want to run the correction for multiple comparisons again to change
the clusterwise threshold. "csdbase" should be "perm"
--seed seed
Set the seed for simulation random number generator. This is mostly
used for debugging.
--fwhm-override fwhm
Override fwhm in glmdir with given value. This is mostly
used for debugging.
--no-cluster-mean
Do not compute means of each subject in each cluster. This computation
requires the y input file which might not be available in all cases.
When using this option, put it first on the command-line.
--y yFile
Specify the GLM input (ie, argument to --y in mri_glmfit) rather
than determining it from the glmdir. This can be handy if the
y file was deleted at some point.
--perm nsim CFT sign
Perform a permutation simulation to correct for multiple comparisons using
nsim iterations, a cluster forming threshold of CFT (in -log10(p) units),
using the given contrast sign (pos, neg, abs).
--perm-signflip
Perform sign flipping instead of shuffling. This is required (and
automatic) when --osgm is used. But it can be helpful when looking
at any main effect. Eg, if you have two groups, then it is usually
the case that you will look at the difference between the groups.
If you want to look at the mean of the groups, then you would
want to enable sign flipping.
--perm-resid
--no-perm-resid
perm-resid is used for non-orthogonal designs (eg, when there is a
covariate present). It runs the permutation using the residual of the
analysis as the input rather than the raw data (the residual will have
the covariate regressed out). You must have originally run mri_glmfit
with the --eres-save option. This method is an APPROXIMATION known as
the ter Braak method (ter Braak, 1992) that allows for permutation to
be run on non-orthogonal designs. See also Winkler, 2014. This is
turned ON by default. Use --no-perm-resid to turn off.
ter Braak, C.J.F., 1992. Permutation versus bootstrap significance
tests in multiple regression and ANOVA. In: Jöckel, K.-H., Rothe, G.,
Sendler, W. (Eds.), Bootstrapping and Related
Techniques. No. 1989. Springer-Verlag, Berlin, pp. 79–86.
Winkler, et al, 2014. Permutation inference for the general linear
model. Neuroimage 92 (2014) 381–397.
_______________________________________________
Freesurfer mailing list
Freesurfer@nmr.mgh.harvard.edu
https://mail.nmr.mgh.harvard.edu/mailman/listinfo/freesurfer