#!/bin/tcsh -f INITS: set niter = 3000 set lim = 6 set tmp = "___fstmp_" set keep_tmp = 0 set DoProject_First = 0 PARSE: set Narg = $# set cnt = 1 set srfin = "" set spcin = "" if ("$1" == '') goto HELP while ($cnt <= $Narg) set donext = 1; if ($donext && "$argv[$cnt]" == "-help" || "$argv[$cnt]" == "-h") then goto HELP endif if ($donext && "$argv[$cnt]" == "-sphere") then set pLoc = $cnt if ($pLoc == $Narg) then echo "Need dset after -sphere" goto END else @ cnt ++ set srfin = "$argv[$cnt]" set donext = 0 endif endif if ($donext && "$argv[$cnt]" == "-keep_temp") then set pLoc = $cnt set keep_tmp = 1 set donext = 0 endif if ($donext && "$argv[$cnt]" == "-project_first") then set pLoc = $cnt set DoProject_First = 1 set donext = 0 endif if ($donext && "$argv[$cnt]" == "-spec") then set pLoc = $cnt if ($pLoc == $Narg) then echo "Need orientation string after -spec" goto END else @ cnt ++ set spcin = ($argv[$cnt]) set donext = 0 endif endif if ($donext && "$argv[$cnt]" == "-niter") then set pLoc = $cnt if ($pLoc == $Narg) then echo "Need orientation string after -niter" goto END else @ cnt ++ set niter = ($argv[$cnt]) set donext = 0 endif endif if ($donext && "$argv[$cnt]" == "-lim") then set pLoc = $cnt if ($pLoc == $Narg) then echo "Need orientation string after -niter" goto END else @ cnt ++ set lim = ($argv[$cnt]) set donext = 0 endif endif if ($donext == 1) then echo "Error: Option or parameter '$argv[$cnt]' not understood" goto END endif @ cnt ++ end if ( ! -f $spcin ) then echo "" echo "Error `basename $0`" echo "Spec file $spcin not found" echo "" goto END endif if ( ! -f $srfin ) then echo "" echo "Error `basename $0`" echo "Sphere $srfin not found" echo "" goto END endif PATHS_NAMES: set srfd = $srfin:h set srfn = $srfin:t if ("$srfd" == "$srfin") set srfd = '.' set spcd = $spcin:h set spcn = $spcin:t if ("$spcd" == "$spcin") set spcd = '.' set srfp = `@NoExt $srfn asc` set spcp = `@NoExt $spcn spec` set outsn = ${srfp}_fxd.asc CLEANUP: rm -f ${tmp}_*.* >& /dev/null PROJECT_TO_SPHERE: if ($DoProject_First == 1) then echo "Projecting to sphere ..." rm -f ${tmp}_${srfp}_pj.asc >& /dev/null ConvertSurface -i_fs ${srfin} -o_fs ${tmp}_${srfp}_pj.asc -radial_to_sphere 100 set srfp = ${tmp}_${srfp}_pj set srfn = $srfp.asc rm -f ${srfp}.spec >& /dev/null quickspec -tn FS ${srfp}.asc -spec ${srfp}.spec set spcp = $srfp set spcn = $srfp.spec #recreate full name and final output set spc = ${spcd}/${srfp}.spec set srf = ${srfd}/${srfp}.asc else echo "Skipping initial projection." set spc = ${spcd}/${spcp}.spec set srf = ${srfd}/${srfp}.asc endif SURFQUAL: echo "Running SurfQual ..." rm -f ${tmp}_sq_*.* >& /dev/null SurfQual -spec $spc -surf_A $srfp.asc -sphere -prefix ${tmp}_sq_ -summary > ${tmp}_sq_.log set bad = `grep Sketchy_nodes ${tmp}_sq_.log` set nbad = $bad[2] echo "Found $nbad sketchy nodes." if ($nbad == 0) then echo "All is well with the world" goto END else echo "Not gonna not gonna do it" endif FATTEN_THE_GOOSE: echo "Fattening the goose..." rm -f ${tmp}_bd*.* >& /dev/null ROIgrow -i_fs $srfp.asc -lim $lim -roi_nodes ${tmp}_sq__BadNodes.1D.dset'[0]' -prefix ${tmp}_bd set troub = ${tmp}_bd.1D SMOOTH_OUT_TROUBLE: echo "Soothing the kinks..." set wm = nngeom set out = ${tmp}_sm_${srfp}_nl_sm${niter}_${wm} if ( -f ${out}.1D) rm -f ${out}.1D if ( -f ${outsn} ) rm -f ${outsn} SurfSmooth -spec $spc -surf_A $srfn \ -met NN_geom -use_neighbors_outside_mask -Niter $niter -surf_out ${outsn} \ -n_mask $troub PROJECT_AGAIN: echo "Projecting again..." mv ${outsn} ${tmp}_${srfp}_pj_final.asc ConvertSurface -i_fs ${tmp}_${srfp}_pj_final.asc -o_fs ${outsn} -radial_to_sphere 100 rm -f ${outsn}.spec >& /dev/null quickspec -tn FS ${outsn} -tn FS $srfin -spec ${outsn}.spec #echo "Running SUMA..." #suma -spec ${outsn}.spec -dev & NEW_METRICS: echo "New Surface Metrics ..." rm -f ${tmp}_smet_${outsn}* >& /dev/null SurfaceMetrics -spec ${outsn}.spec -surf_A ${outsn} \ -face_normals -prefix ${tmp}_smet_${outsn} CHECK_AGAIN: echo "Running SurfQual on fixed surface..." SurfQual -spec ${outsn}.spec -surf_A ${outsn} -sphere -prefix ${tmp}_sq_${outsn} -summary > ${tmp}_sq_${outsn}.log set bad = `grep Sketchy_nodes ${tmp}_sq_${outsn}.log` set nbad = $bad[2] echo "Found $nbad sketchy nodes." if ($nbad == 0) then echo "" echo "Good." echo "" goto END else echo "" echo "Not good, try increasing number of iterations" echo "" goto END endif goto END HELP: echo "" echo "Usage: `basename $0` <-spec SPEC> <-sphere SPHERE.asc>" echo " [-niter NITER] [-lim LIM] [-keep_temp]" echo " [-project_first]" echo "" echo " Fixes errors in FreeSurfer spherical surfaces." echo " Mandatory parameters:" echo " -spec SPEC: Spec file" echo " -sphere SPHERE.asc: SPHERE.asc is the sphere to be used." echo " Optional parameters:" echo " -niter NITER: Number of local smoothing operations." echo " Default is $niter" echo " -lim LIM: Extent, in mm, by which troubled sections " echo " are fattened. Default is $lim" echo " -project_first: Project to a sphere, before smoothing." echo " Default is: $DoProject_First" echo "" echo " Output:" echo " Corrected surface is called SPHERE_fxd.asc" echo "" echo "Example:" echo "`basename $0` -spec ./2005-10-01-km_rh.spec -sphere ./rh.sphere.asc" echo "" goto END END: if ($keep_tmp == 0) then rm -f ${tmp}_*.* >& /dev/null endif