#!/bin/tcsh -f
# gcainit

set VERSION = 'gcainit dev';

set gcadir = ();
set DoneFile = ();
set nthreads = 1;
set RunIt = 1;

set tmpdir = ();
set cleanup = 1;
set LF = ();

set inputargs = ($argv);
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:

set StartTime = `date`;
set tSecStart = `date '+%s'`;
set year  = `date +%Y`
set month = `date +%m`
set day   = `date +%d`
set hour   = `date +%H`
set min    = `date +%M`

mkdir -p $gcadir
pushd $gcadir > /dev/null
set gcadir = `pwd`;
popd > /dev/null
mkdir -p $gcadir/gca

setenv SUBJECTS_DIR $gcadir

# Set up log file
mkdir -p $gcadir/log
if($#LF == 0) set LF = $gcadir/log/gcainit.log
if($LF != /dev/null) rm -f $LF
echo "Log file for gcainit" >> $LF
date  | tee -a $LF
echo "" | tee -a $LF
echo "setenv SUBJECTS_DIR $SUBJECTS_DIR" | tee -a $LF
echo "cd `pwd`"  | tee -a $LF
echo $0 $inputargs | tee -a $LF
echo "" | tee -a $LF
cat $FREESURFER_HOME/build-stamp.txt | tee -a $LF
echo $VERSION | tee -a $LF
uname -a  | tee -a $LF
if($?PBS_JOBID) then
  echo "pbsjob $PBS_JOBID"  | tee -a $LF
endif

#========================================================
set initsubject = `cat $gcadir/scripts/initsubject.txt`
set mantal = `cat $gcadir/scripts/mantal.txt`
set manseg = `cat $gcadir/scripts/manseg.txt`
if( -e $gcadir/scripts/dosym.txt) then
  set DoSym = `cat $gcadir/scripts/dosym.txt`
else
  set DoSym = 0;
endif

# Intensity normalize init subject, ~60 sec
@ nth = 0;
set subject = $initsubject
set mridir = $SUBJECTS_DIR/$subject/mri
set seg  = $mridir/$manseg 

# Have to add this or else other programs get unhappy
set cmd = (mri_add_xform_to_header $xfm $seg $seg)
pwd | tee -a $LF
$cmd |& tee -a $LF
if($status) goto error_exit;

set maskvol = brainmask.mgz
set mask = $mridir/$maskvol
set nu   = $mridir/nu.mgz
set cmd = (mri_ca_normalize -mask $mask -seg $seg $nu noatlas noxform $norm)
echo "Normalizing `date`" |& tee -a $LF
echo $cmd |& tee -a $LF
if($RunIt) then 
  rm -f $norm
  $cmd | tee -a $LF
  if($status) goto error_exit;
endif

# Now produce the initial GCA using this one subject, ~60 sec
echo "Building GCA `date`" |& tee -a $LF
set cmd = (mri_ca_train)
if($DoSym) set cmd = ($cmd -sym)
set cmd = ($cmd -prior_spacing 2 -node_spacing 8 -mask $maskvol \
  -parc_dir $manseg  -xform $mantal -T1 $normname -check $initsubject $gca)
echo $cmd |& tee -a $LF
if($RunIt) then 
  rm -f $gca
  $cmd |& tee -a $LF
  if($status) goto error_exit;
endif

#========================================================

# Done
echo " " |& tee -a $LF
set tSecEnd = `date '+%s'`;
@ tSecRun = $tSecEnd - $tSecStart;
set tRunHours = `echo $tSecRun/3600|bc -l`
set tRunHours = `printf %5.2f $tRunHours`
echo "Started at $StartTime " |& tee -a $LF
echo "Ended   at `date`" |& tee -a $LF
echo "Gcainit-Run-Time-Sec $tSecRun" |& tee -a $LF
echo "Gcainit-Run-Time-Hours $tRunHours" |& tee -a $LF
echo " " |& tee -a $LF
echo "gcainit Done" |& tee -a $LF
echo ""|& tee -a $LF
if($#DoneFile) then
  echo $DoneFile
  echo "0" > $DoneFile
endif

exit 0

############--------------##################
error_exit:
echo "ERROR: $cmd"  |& tee -a $LF
date  |& tee -a $LF
echo "gcainit exited with errors"  |& tee -a $LF
if($#DoneFile) then
  echo $DoneFile
  echo "1" > $DoneFile
endif
exit 1;
###############################################

############--------------##################
parse_args:
set cmdline = ($argv);
while( $#argv != 0 )

  set flag = $argv[1]; shift;
  
  switch($flag)

    case "--g":
    case "--o":
      if($#argv < 1) goto arg1err;
      set gcadir = $argv[1]; shift;
      breaksw

    case "--dontrun":
    case "--dont-run":
      set RunIt = 0;
      breaksw

    case "--done":
      if($#argv < 1) goto arg1err;
      set DoneFile = $argv[1]; shift;
      rm -f $DoneFile
      breaksw

    case "--threads"
    case "--nthreads"
      set nthreads = $argv[1]; shift;
      setenv OMP_NUM_THREADS $nthreads
      setenv FS_OMP_NUM_THREADS $nthreads
      breaksw

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

    case "--nolog":
    case "--no-log":
      set LF = /dev/null
      breaksw

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

    case "--nocleanup":
      set cleanup = 0;
      breaksw

    case "--cleanup":
      set cleanup = 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($#gcadir == 0) then
  echo "ERROR: must spec gcadir"
  exit 1;
endif

set initsubject = (`cat $gcadir/scripts/initsubject.txt`);

set mridir = $SUBJECTS_DIR/$initsubject/mri
set mask = $mridir/brainmask.mgz
set nu   = $mridir/nu.mgz
foreach vol ($mask $nu)
  if(! -e $vol) then
    echo "ERROR: cannot find $vol"
    exit 1;
  endif
end
set xfm = $mridir/transforms/talairach.xfm
if(! -e $xfm) then
  echo "ERROR: cannot find $xfm"
  exit 1;
endif

# These two are the outputs of this script
set normname = norm.i01.mgz
set norm = $gcadir/$initsubject/mri/$normname
set gca = $gcadir/gca/gca.i01.gca

if(-e $gca) then
  echo "ERROR: $gca already exists"
  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
############--------------##################

############--------------##################
usage_exit:
  echo ""
  echo "gcainit"
  echo " --g gcadir : output of gcaprep"
  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

