#! /bin/tcsh -f
#
# mris_compute_lgi
#
# Computes local measurements of gyrification at points over cortical surface.
# --help option will show usage
#
# This script implements the work of Marie Schaer et al., as described in:
#
# "A Surface-based Approach to Quantify Local Cortical Gyrification",
# Schaer M. et al., IEEE Transactions on Medical Imaging, 2007, TMI-2007-0180
#
# Original Author: Marie Schaer
#
# Copyright (C) 2007-2008,
# The General Hospital Corporation (Boston, MA).
# All rights reserved.
#
# Distribution, usage and copying of this software is covered under the
# terms found in the License Agreement file named 'COPYING' found in the
# FreeSurfer source code root directory, and duplicated here:
# https://surfer.nmr.mgh.harvard.edu/fswiki/FreeSurferOpenSourceLicense
#
# General inquiries: freesurfer@nmr.mgh.harvard.edu
# Bug reports: analysis-bugs@nmr.mgh.harvard.edu
#
set VERSION = 'mris_compute_lgi dev';
set PrintHelp = 0;
set RunIt = 1;
set cmdargs = ($argv);
set use_mris_extract = 1
set closespheresize = 15
set smoothiters = 30
set radius = 25
set stepsize = 100
#set echo=1
set start=`date`
if($#argv == 0) then
# zero args is not allowed
goto usage_exit;
endif
goto parse_args;
parse_args_return:
goto check_params;
check_params_return:
# begin...
#---------
# check for matlab
set MATLAB = `getmatlab`;
if($status) then
echo "ERROR: Matlab is required to run mris_compute_lgi!"
exit 1;
endif
# temporary work files go here...
set tmpdir = ($PWD/tmp-mris_compute_lgi-${input})
set cmd=(rm -Rf $tmpdir)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
set cmd=(mkdir -p $tmpdir)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
#
# mris_fill
#
# create a filled-volume from the input surface file...
set cmd=(mris_fill -c -r 1 ${input} ${tmpdir}/${input}.filled.mgz)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
#
# make_outer_surface.m
#
# create the outer surface from the filled volume
set MLF = `fs_temp_file --suffix .m`
set arg1 = ${tmpdir}/${input}.filled.mgz
set arg2 = ${closespheresize}
set arg3 = ${tmpdir}/${input}-outer
rm -f ${arg3}
echo "make_outer_surface('${arg1}',${arg2},'${arg3}'); exit" > $MLF
echo "================="
echo "`cat $MLF`"
echo "================="
if ($RunIt) then
cat $MLF | ${MATLAB} -display iconic -nojvm -nosplash
endif
echo ""
rm -f ${MLF}
if ( $RunIt && ! -e ${arg3} ) then
echo "ERROR: make_outer_surface did not create output file '${arg3}'!"
exit 1
endif
#
# mris_extract_main_component (optional, default)
#
if ($use_mris_extract) then
set cmd=(mris_extract_main_component \
${tmpdir}/${input}-outer \
${tmpdir}/${input}-outer-main)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
else
set cmd=(cp ${tmpdir}/${input}-outer ${tmpdir}/${input}-outer-main)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
endif
#
# mris_smooth
#
# smooth this jaggy, tessellated surface
set cmd=(mris_smooth -nw -n ${smoothiters} \
${tmpdir}/${input}-outer-main \
./${input}-outer-smoothed)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
#
# mris_euler_number (a QA check, total defects should = 0)
#
set cmd=(mris_euler_number ./${input}-outer-smoothed)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
#
# mris_convert
#
# output normals of the smoothed outer surface
set cmd=(mris_convert -n \
${input}-outer-smoothed \
${tmpdir}/${input}-outer-smoothed-normals.asc)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
#
# find_corresponding_center_FSformat.m
#
# create ROI center files
set MLF = `fs_temp_file --suffix .m`
set arg1 = ${input}
set arg2 = ${input}-outer-smoothed
set arg3 = ${stepsize}
set arg4 = ${tmpdir}
set arg5 = ${MLF}
echo "find_corresponding_center_FSformat('${arg1}','${arg2}',${arg3},'${arg4}','${arg5}'); exit" > $MLF
echo "================="
echo "`cat $MLF`"
echo "================="
if ($RunIt) then
cat ${MLF} | ${MATLAB} -display iconic -nojvm -nosplash
endif
echo ""
if ( $RunIt && -e ${MLF} ) then
echo "ERROR: find_corresponding_center_FSformat did not complete successfully!"
exit 1
endif
#
# make_roi_paths.m
#
# create ROI path files
set MLF = `fs_temp_file --suffix .m`
set arg1 = ${input}
set arg2 = ${input}-outer-smoothed
set arg3 = ${radius}
set arg4 = ${stepsize}
set arg5 = ${tmpdir}
set arg6 = ${MLF}
echo "make_roi_paths('${arg1}','${arg2}',${arg3},${arg4},'${arg5}','${arg6}'); exit" > $MLF
echo "================="
echo "`cat $MLF`"
echo "================="
if ($RunIt) then
cat $MLF | ${MATLAB} -display iconic -nojvm -nosplash
endif
echo ""
if ( $RunIt && -e ${MLF} ) then
echo "ERROR: make_roi_paths did not complete successfully!"
exit 1
endif
#
# mri_path2label
#
# create ROI label files
if ($RunIt) then
set confillxfn = ${tmpdir}/mri_path2label.input
rm -f ${confillxfn}
set vertices = (`cat ${tmpdir}/${input}.center.vertices`)
foreach v (${vertices})
set center = (`cat ${tmpdir}/${input}.${v}.center`)
set pathf = (${tmpdir}/${input}.${v}.path)
set labelf = (${tmpdir}/${input}.${v}.label)
echo "${center} ${pathf} ${labelf}" >> ${confillxfn}
end
set cmd = (mri_path2label --confillxfn ${input} ${confillxfn})
echo "================="
echo "$cmd"
echo "================="
$cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
else # -dontrun flag is set
echo "================="
echo "mri_path2label..."
echo "================="
endif
#
# compute_lgi.m
#
# finally, compute lGI measurements
compute_lgi:
set MLF = `fs_temp_file --suffix .m`
set arg1 = ${input}
set arg2 = ${input}-outer-smoothed
set arg3 = ${tmpdir}/${input}-outer-smoothed-normals.asc
set arg4 = ${stepsize}
set arg5 = ${radius}
set arg6 = ${tmpdir}
rm -f ${tmpdir}/${input}_lgi.asc
echo "compute_lgi('${arg1}','${arg2}','${arg3}',${arg4},${arg5},'${arg6}'); exit" \
> $MLF
echo "================="
echo "`cat $MLF`"
echo "================="
if ($RunIt) then
cat $MLF | ${MATLAB} -display iconic -nojvm -nosplash
endif
echo ""
rm -f ${MLF}
if ( $RunIt && ! -e ${tmpdir}/${input}_lgi.asc ) then
echo "ERROR: compute_lgi did not create output file '${tmpdir}/${input}_lgi.asc'!"
exit 1
endif
#
# mris_convert
#
# convert ascii file to scalar
set cmd=(mris_convert -c \
${tmpdir}/${input}_lgi.asc \
${input} \
${input}_lgi)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
if($status) then
echo "ERROR: $cmd failed!"
exit 1;
endif
#--------
# end...
set cmd=(rm -Rf $tmpdir)
echo "================="
echo "$cmd"
echo "================="
if ($RunIt) $cmd
set end=`date`
echo "done."
echo "Start: $start"
echo "End: $end"
exit 0
#----------------------------------------------------------#
############--------------##################
parse_args:
set cmdline = ($argv);
while( $#argv != 0 )
set flag = $argv[1]; shift;
switch($flag)
case "--close_sphere_size":
set closespheresize = $argv[1]; shift;
echo "Using sphere size of ${closespheresize}mm for morph closing op."
breaksw
case "--smooth_iters":
set smoothiters = $argv[1]; shift;
echo "Smoothing using ${smoothiters} iterations."
breaksw
case "--step_size":
set stepsize = $argv[1]; shift;
echo "Skipping every ${stepsize} vertices during lGI calcs."
breaksw
case "--help":
set PrintHelp = 1;
goto usage_exit;
exit 0;
breaksw
case "--version":
echo $VERSION
exit 0;
breaksw
case "-i":
case "--i":
case "--input":
if ( $#argv == 0) goto arg1err;
set input = $argv[1]; shift;
#echo ${input}
breaksw
case "--dont_extract":
set use_mris_extract = 0
breaksw
case "--debug":
case "--echo":
set echo = 1;
set verbose = 1
breaksw
case "--dontrun":
set RunIt = 0;
breaksw
default:
breaksw
endsw
end
goto parse_args_return;
############--------------##################
############--------------##################
arg1err:
echo "ERROR: flag $flag requires one argument"
exit 1
############--------------##################
############--------------##################
check_params:
if(! $?FREESURFER_HOME ) then
echo "ERROR: environment variable FREESURFER_HOME not set."
exit 1;
endif
if(! -e $FREESURFER_HOME ) then
echo "ERROR: FREESURFER_HOME $FREESURFER_HOME does not exist."
exit 1;
endif
if(! $?input) then
echo "ERROR: missing input filename! See mris_compute_lgi --help"
exit 1;
endif
if(! -e ${input} ) then
echo "ERROR: input file '${input}' does not exist."
exit 1;
endif
goto check_params_return;
############--------------##################
############--------------##################
usage_exit:
echo ""
echo "USAGE: mris_compute_lgi [options] --i "
echo ""
echo "Produces a surface map file containing local gyrification measures."
echo "Output file is named _lgi, where is the"
echo "specified input surface (ex. lh.pial produces lh.pial_lgi)."
echo ""
echo "Required Arguments"
echo " --i : input surface file, typically lh.pial or rh.pial"
echo ""
echo "Optional Arguments"
echo " --close_sphere_size : use sphere of size mm for morph"
echo " closing operation (default: ${closespheresize})"
echo " --smooth_iters : smooth outer-surface number of"
echo " iterations (default: ${smoothiters})"
echo " --step_size : skip every vertices when"
echo " computing lGI (default: ${stepsize})"
echo " --help : short descriptive help"
echo " --version : script version info"
echo " --echo : enable command echo, for debug"
echo " --debug : same as --echo"
echo " --dontrun : just show commands (dont run them)"
echo ""
if(! $PrintHelp) exit 1;
echo Version: $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
Computes local measurements of gyrification at thousands of points over the
entire cortical surface using the method described in:
"A Surface-based Approach to Quantify Local Cortical Gyrification",
Schaer M. et al., IEEE Transactions on Medical Imaging, 2007, TMI-2007-0180
Input is a pial surface mesh, and the output a scalar data file containing
the local gyrification index data at each vertices.
Example:
mris_compute_lgi --i lh.pial
produces lh.pial_lgi
See also http://surfer.nmr.mgh.harvard.edu/fswiki/LGI