That was an oversight. I've attached a version that should work. Can you
test it for me? Once I know it works I'll check it in to tree.
doug
On 09/03/2014 12:30 PM, Eryilmaz, Huseyin Hamdi wrote:
Dear FS experts,
I have a question about a MC output file. When I run the MC sim
(using mri_glmfit-sim) on the surface, it generates a bunch of files
including a 'sig.masked.mgh', which is nice for displaying the
significance map limited to the clusters that survive the MC
correction. However, when I run it on the volume, it doesn't generate
this specific file. Does anyone know the reason for that? Is there an
alternative way to display the significance map that show only the
clusters that survive the MC correction?
Many thanks!
Hamdi
--
Hamdi Eryilmaz, PhD
Massachusetts General Hospital
A.A. Martinos Center for Biomedical Imaging
Psychiatric Neuroimaging Division
149 13th St, Charlestown, MA 02129
Phone: +1 617 643 7462
Email:heryil...@partners.org <mailto:heryil...@partners.org>
_______________________________________________
Freesurfer mailing list
Freesurfer@nmr.mgh.harvard.edu
https://mail.nmr.mgh.harvard.edu/mailman/listinfo/freesurfer
--
Douglas N. Greve, Ph.D.
MGH-NMR Center
gr...@nmr.mgh.harvard.edu
Phone Number: 617-724-2358
Fax: 617-726-7422
Bugs: surfer.nmr.mgh.harvard.edu/fswiki/BugReporting
FileDrop: https://gate.nmr.mgh.harvard.edu/filedrop2
www.nmr.mgh.harvard.edu/facility/filedrop/index.html
Outgoing: ftp://surfer.nmr.mgh.harvard.edu/transfer/outgoing/flat/greve/
#!/bin/tcsh -f
set VERSION = '$Id: mri_glmfit-sim,v 1.36.2.6 2013/06/05 17:06:31 greve Exp $';
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 UseUniformPDF = 0;
set UniformPDFMin = ();
set UniformPDFMax = ();
set DiagCluster = 0;
set PBNodeType = ();
set UseCache = 0;
set PermForce = 0;
set UseGRF = 0;
set volsubject = fsaverage;
set subjectOverride = ();
set Bonferroni = 0;
set ReportCentroid = 0;
set annot = aparc
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
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
set mask = `stem2fname $glmdir/mask`
if($status) then
echo "$mask"
exit 1;
endif
if($nulltype != perm) then
set fwhmfile = $glmdir/fwhm.dat
if(! -e $fwhmfile) then
echo "ERROR: cannot find $fwhm"
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(! -e $glmfitcwd) then
echo "ERROR: cannot find $glmfitcwd"
exit 1;
endif
set anattype = volume;
set subject = ();
set hemi = ();
set surf = "white";
set y = ();
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 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 "--y"
set y = $glmfitcwd/$glmfitcmd[1]; shift glmfitcmd;
if(! -e $y) then
set y = $glmdir/`basename $y`
if(! -e $y) then
echo "ERROR: cannot find $y"
exit 1;
endif
endif
breaksw
case "--wls"
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
# Ignore these options that have no args
case "cmdline"
case "mri_glmfit"
case "--osgm"
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 "dods"
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"
shift glmfitcmd;
breaksw
default
echo ""
echo "WARNING: unrecognized mri_glmfit cmd option $flag"
echo ""
sleep 10
#exit 1;
breaksw
endsw
end
if($UseGRF && $anattype != volume) then
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
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
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
if($UseCache) then
set fwhm = `cat $glmdir/fwhm.dat`;
set fwhmStr = `perl -e "printf('"'%02d'"',int ( $fwhm+.5 ) ) "`
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
exit 1;
endif
echo CSD $csdCache | tee -a $LF
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
mkdir -p $glmdir/csd
@ nthJob = 1
while($nthJob <= $nJobs)
set jpad = `printf j%03d $nthJob`
echo "$nthJob/$nJobs `date`" | tee -a $LF
set cmd = (mri_glmfit --y $y $clist2 --mask $mask)
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($#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)
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)
echo "------------------------------------------------" | tee -a $LF
echo $cmd | tee -a $LF
pbsubmit $PBNodeType -c "$cmd"
sleep 5;
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)
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 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 $csdlist --mask $mask \
--cwsig $cwsig --vwsig $vwsig --sum $sum --ocn $ocn \
--oannot $oannot --annot $annot --csdpdf $csdpdf \
--cwpvalthresh $cwpvalthresh --o $msig --no-fixmni)
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;
# 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 \
--avgwf $avgwf --sum /tmp/mri_glmfit-sim.junk.$$)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
rm -f /tmp/mri_glmfit-sim.junk.$$
endif
if($anattype == volume) then
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)
if($Bonferroni) set cmd = ($cmd --bonferroni $Bonferroni)
if(! $UseGRF) set cmd = ($cmd --csdpdf $csdpdf $csdlist --vwsig $vwsig )
if($UseGRF) set cmd = ($cmd --fwhmdat $glmdir/fwhm.dat --sign $simsign
--thmin $thresh)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
# 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 \
--avgwf $avgwf --sum /tmp/mri_glmfit-sim.junk.$$)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) exit 1;
rm -f /tmp/mri_glmfit-sim.junk.$$
if($UseGRF) then
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
date
echo "mri_glmfit-sim done"
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 "--cache":
if( $#argv < 2) goto arg2err;
set thresh = $argv[1]; shift;
set simsign = $argv[1]; shift;
set UseCache = 1;
set DoSim = 0;
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 "--cache-dir":
if( $#argv < 1) goto arg1err;
set CacheDir = $argv[1]; shift;
breaksw
case "--cache-label":
if( $#argv < 1) goto arg1err;
set CacheLabel = $argv[1]; shift;
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 "--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;
if(`hostname` != seychelles && `hostname` != launchpad) then
hostname
echo "ERROR: must be on seychelles or launchpad to pbsubmit"
exit 1;
endif
if(`hostname` == seychelles) set PBNodeType = "-l nodes=1:opteron";
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 "--perm-force":
set PermForce = 1;
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 "--no-sim":
if($#argv < 1) goto arg1err;
set csdbase = $argv[1]; shift;
set DoSim = 0;
breaksw
case "--diag-cluster":
set DiagCluster = 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
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
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"
echo ""
echo " --glmdir glmdir"
echo " --cwp thresh : cluster p-value thresh ($cwpvalthresh)"
echo ""
echo " --cache threshold sign"
echo " --cache-dir dir : default is FREESURFER_HOME/average/mult-comp-cor"
echo " --cache-label label : default is cortex"
echo ""
echo " --grf threshold sign : -log10(p) and pos or neg (volumes only)"
echo ""
echo " --sim nulltype nsim threshold csdbase"
echo " --sim-sign sign : abs,pos,neg"
echo ""
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 " --no-sim csdbase : do not simulate, only run cluster"
echo " --seed seed : set simluation seed"
echo " --fwhm-override fwhm : override fwhm in glmdir":
echo " --uniform min max : use uniform PDF instead of gaussian":
echo ""
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 GLM-based simulations for corrections
for multiple comparisons 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 whether you want to use a pre-cached simulation or whether
you want to run a new simulation. You should use a pre-cached
simulation if: this is a surface-based analysis, you are using
fsaverage (or equivalent), you have whole-brain data, you want to
use a voxel-wise threshold of 1.3, 2.0, 2.3, 3.0, 3.3, or 4.0, and
you are going to use an mc-z simulation. Pre-cached will finish
after a few seconds, your own simulation will take hours or days.
2.a If you want to use a pre-cached, then specify "--cache threshold sign"
where threshold is the vertex-wise threshhold and sign is abs, pos,
or neg. Note: the csdbase will be set to cache.thresh.simsign (eg,
if the threshold was set to 1.3 and sign to pos, then cache.th13.pos.
Skip the remaining steps below.
2.b If you want to run your own simulation, then choose the type of
simulation (nulltype) you want to run. The choices are:
mc-z - synthesized, smoothed z-field (fast)
mc-full - fully synthesized, smoothed gaussian field (slowest)
perm - permutation on original data (probably fasted one)
3. Choose the voxel/vertex-wise threshhold used to define clusters. This
will be -log10(p), where p is the p-value. Eg, to use all voxels/vertices
with p < .01, then set the threshhold = 2.
4. Choose the number of iterations (nsim). This is usually 10,000
(which can take quite a while).
5. Select the CSD base name (csdbase). CSD stands for "Cluster
Simulation Data". There will be a text file for each contrast with
the information about the null distribution. This file will be
called csdbase-contrast.csd, so the csdbase should be something
descriptive. Eg, if you have mc-z, with threshold=2, and sign=pos,
then setting csdbase to mc-z.pos.2 would be appropriate. If the
CSD file exists, then you must delete it or run with --overwrite.
6. Select the threshold sign (--sim-sign). This is the sign of the
threshold used to create the clusters for cluster-wise correction
of multiple comparisons. Options are abs (unsigned), pos
(positive), and neg (negative). If you have an a priori hypothesis
(eg, group1 > group2), then choose positive. If you don not know
the sign, then use abs. Choosing a sign will yield stronger results
(ie, smaller p-values), but you will lose the other sign.
Now run the command:
mri_glmfit-sim --glmdir glmdir \
--cache threshold sign
or
mri_glmfit-sim --glmdir glmdir \
--sim nulltype nsim threshold csdbase \
--sim-sign sign
Example,
mri_glmfit-sim --glmdir lh.thickness.sm05 \
--cache 3 --sim-sign pos
or
mri_glmfit-sim --glmdir lh.thickness.sm05 \
--sim mc-z 10000 3 mc-z.pos.3 --sim-sign pos
This will run mri_glmfit in simulation mode. It will find all the
contrasts that you ran in the original invocation of mri_glmfit and
create CSD files for them. It will use the mask and, for mc
simulations, the FWHM found in the glmdir.
It will then run mri_surfcluster or mri_volcluster for
each contrast, using the sig volume as input and creating the
following files in each contrast directory:
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 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 stimulation but just want to run
the correction for multiple comparisons again to change the
clusterwise threshold. "csdbase" is the same that was used in the
orignial invocation to mri_glmfit-sim. Eg, if this was your original
mri_glmfit-sim command:
mri_glmfit-sim --glmdir lh.thickness.sm05 --cwp .05\
--sim mc-z 10000 3 mc-z.pos.3 --sim-sign pos
But then then you wanted to re-run with a higher CWP, then
mri_glmfit-sim --glmdir lh.thickness.sm05 --no-sim mc-z.pos.3 --cwp .1
--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.
_______________________________________________
Freesurfer mailing list
Freesurfer@nmr.mgh.harvard.edu
https://mail.nmr.mgh.harvard.edu/mailman/listinfo/freesurfer
The information in this e-mail is intended only for the person to whom it is
addressed. If you believe this e-mail was sent to you in error and the e-mail
contains patient information, please contact the Partners Compliance HelpLine at
http://www.partners.org/complianceline . If the e-mail was sent to you in error
but does not contain patient information, please contact the sender and properly
dispose of the e-mail.