#! /bin/tcsh -f

#
# mri-funcvits
#
# REPLACE_WITH_ONE_LINE_SHORT_DESCRIPTION
#
# Original Author: REPLACE_WITH_FULL_NAME_OF_CREATING_AUTHOR
# CVS Revision Info:
#    $Author: nicks $
#    $Date: 2007/01/06 00:01:14 $
#    $Revision: 1.7 $
#
# Copyright (C) 2002-2007,
# 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 FUNCVITS_VER = '$Id: mri-funcvits,v 1.7 2007/01/06 00:01:14 nicks Exp $';

set stem     = ();
set outdir   = ();
set icosize  = 10242;
set hemilist = (lh rh);
set svitdir  = ();
set icodir   = ();
#set origsurfname = orig
set paintsurfname = white
set sphsurfname  = sphere
set cansurfname  = sphere.dist_new
set noforce = 0;
set mailuser = ()
set debug = 0;
set regfile = ();

goto parse_args;
parse_args_return:

if($#stem != 1 || $#outdir != 1) then
  echo "\nUSAGE: \n\n mri-funcvits "
  echo "   -stem      template stem      --required--"
  echo "   -outdir    output directory   --required--"
  echo "   -reg       registration file  templatedir/register.dat"
  echo "   -paintsurf surface upon which to paint  $paintsurfname"
  echo "   -sphere    spherical surface  $sphsurfname"
  echo "   -icosize   icosahedron size   $icosize"
  echo "   -hemi      hemifield(s)       lh rh"
  echo "   -svitdir   svit directory     SubjectsDir/subject/svit"
  echo "   -icodir    ico directory      $FREESURFER_HOME/lib/bem"
  echo "   -umask     newumask"
  echo "   -mail      user"
  echo "   -noforce   dont create if already exists"
  echo "\n $FUNCVITS_VER \n"
  exit 1;
endif

set TemplateDir  = `dirname $stem`;
if(! -d $TemplateDir ) then
  echo "ERROR: cannot find directory $TemplateDir"
  exit 1;
endif

set TemplateBase = `basename $stem`;
pushd $TemplateDir >& /dev/null
set  TemplateDir = `pwd`;
popd  >& /dev/null

set TemplateStem = $TemplateDir/$TemplateBase

## make sure the regfile exists ##
set rmfregfile = 0;
set fregfile = $TemplateDir/register.dat
if($#regfile == 0) then
  set regfile = $fregfile;
else
  if(! -f $regfile ) then
    echo "ERROR: cannot find $regfile";
    exit 1;
  endif
  cp $regfile $fregfile
  set rmfregfile = 1;
endif

## Get the name of the subject ##
set subject = `head -n 1 $fregfile`
if($#svitdir == 0) then
  set svitdir   = $SUBJECTS_DIR/$subject/svit
endif
if(! -d $svitdir ) then
  echo "ERROR: cannot find directory $svitdir"
  exit 1;
endif

if($#icodir == 0) then
  set icodir   = $FREESURFER_HOME/lib/bem/
endif
if(! -d $icodir ) then
  echo "ERROR: cannot find directory $icodir"
  exit 1;
endif

if(! -d $outdir) mkdir $outdir
if(! -d $outdir ) then
  echo "ERROR: cannot create directory $outdir"
  exit 1;
endif
cd $outdir

echo "\n$FUNCVITS_VER\n"
echo $0
uname -a
echo "Stem:     $stem"
echo "OutDir:   $outdir"
echo "Subject:  $subject"
#echo "Orig:     $origsurfname"
echo "PaintSurf: $paintsurfname"
echo "Sphere:   $sphsurfname"
echo "IcoSize:  $icosize"
echo "VitDir:   $svitdir"
echo "IcoDir:   $icodir"
echo "noforce:  $noforce"
echo "regfile:  $fregfile"

echo "Started at `date`"

foreach hemi ($hemilist)

  echo "\n\n"
  echo "------------------------------------------------------"
  echo "------------- Hemifield $hemi ------------------------"
  echo "`date` "
  echo "------------------------------------------------------"
  echo "\n\n"

  set sphsurf  = $SUBJECTS_DIR/$subject/surf/$hemi.$sphsurfname
  set cansurf  = $SUBJECTS_DIR/$subject/surf/$hemi.$cansurfname
  #set origsurf = $SUBJECTS_DIR/$subject/surf/$hemi.$origsurfname
  set paintsurf = $SUBJECTS_DIR/$subject/surf/$hemi.$paintsurfname

  set s2iscvit   = $svitdir/$hemi.sph-to-ic$icosize-sc.vit
  set csurffc    = $hemi.csurf-fc.vss
  set func2csurf = $hemi.func-to-csurf.vit
  set func2ico   = $hemi.func-to-ic$icosize.vit

  # -- Compute location of csurf vertices in func coords ---------- #
  if(-f $csurffc &&  $noforce) then
     echo "$csurffc  already exists, skipping"
  else
    echo "---- $csurffc `date`--------"
    # set cmd = "vss-project -i $origsurf -f surf "
    set cmd = "vss-project -i $paintsurf -f surf "
    set cmd = "$cmd -pm $fregfile -f register -o $csurffc"
    if($debug) then
      echo $cmd
    endif
    $cmd
    if($status) then
      echo "ERROR: vss-project"
      exit 1;
    endif
  endif

  # --- func2csurf ---------- #
  if(-f $func2csurf  &&  $noforce) then
     echo "$func2csurf  already exists, skipping"
  else
    echo "---- $func2csurf `date`--------"
    vss-buildvit -s $TemplateStem -f bvolume-coords -t $csurffc \
                 -mli -vit $func2csurf
    if($status) then
      echo "ERROR: vss-buildvit"
      exit 1;
    endif
  endif

  # --- func2ico ---------- #
  if(-f $func2ico  &&  $noforce) then
     echo "$func2ico  already exists, skipping"
  else
    echo "--- $func2ico  `date`"
    vss-cascadevit -a2b $func2csurf -b2c $s2iscvit \
          -a2c $func2ico
    if($status) then
      echo "ERROR: vss-cascadevit"
      exit 1;
    endif
    echo "$func2ico done at `date`"
  endif

end

if($#mailuser == 1) then
  echo "mri-funcvits $subject $icosize finished at `date`" | \
    mail -s "mri-funcvits $subject `date`" $mailuser;
endif

if($rmfregfile)   rm -f $fregfile

echo "Finished at `date`"
echo "mri-funcvits completed successfully"


exit 0;
###########################################

############--------------##################
parse_args:

set cmdline = "$argv";
while( $#argv != 0 )

  set flag = $argv[1]; shift;

  switch($flag)

    case "-verbose"
      set verbose = 1;
      breaksw

    case "-echo"
      set echo = 1;
      breaksw

    case "-debug"
      set debug   = 1;
      set echo    = 1;
      set verbose = 1;
      breaksw

    case "-stem":
    case "-st":
      if ( $#argv == 0) goto arg1err;
      set stem = $argv[1]; shift;
      breaksw

    case "-reg":
      if ( $#argv == 0) goto arg1err;
      set regfile = $argv[1]; shift;
      breaksw

    case "-paintsurf"
    case "-ps"
      if ( $#argv == 0) goto arg1err;
      set paintsurfname = $argv[1]; shift;
      breaksw

    case "-sphere"
    case "-sp"
      if ( $#argv == 0) goto arg1err;
      set sphsurfname = $argv[1]; shift;
      breaksw

    case "-can"
    case "-ca"
      if ( $#argv == 0) goto arg1err;
      set cansurfname = $argv[1]; shift;
      breaksw

    case "-icosize":
    case "-ic":
      if ( $#argv == 0) goto arg1err;
      set icosize = $argv[1]; shift;
      breaksw

    case "-hemi":
    case "-he":
      if ( $#argv == 0) goto arg1err;
      set hemilist = $argv[1]; shift;
      if("$hemilist" != "lh" && "$hemilist" != "rh") then
        echo "ERROR: -hemi must be either lh or rh ($hemilist)"
        exit 1;
      endif
      breaksw

    case "-outdir":
    case "-ou":
      if ( $#argv == 0) goto arg1err;
      set outdir = $argv[1]; shift;
      breaksw

    case "-svitdir":
    case "-sv":
      if ( $#argv == 0) goto arg1err;
      set svitdir = $argv[1]; shift;
      breaksw

    case "-icodir":
      if ( $#argv == 0) goto arg1err;
      set icodir = $argv[1]; shift;
      breaksw

    case "-umask":
    case "-um":
      if ( $#argv == 0) goto arg1err;
      echo "INFO: Setting umask to $argv[1]"
      umask $argv[1]; shift;
      breaksw

    case "-mail":
    case "-ma":
      if ( $#argv == 0) goto arg1err;
      set mailuser = $argv[1]; shift
      breaksw

    case "-noforce":
      set noforce = 1;
      breaksw

    default:
      echo ERROR: Flag $flag unrecognized.
      echo $cmdline
      exit 1
      breaksw
  endsw

end
goto parse_args_return;
