#!/usr/bin/tcsh -f
# mergeseg

set VERSION = 'mergeseg mockbuild-local';

set outseg = ();
set mergeseg = ();
set srcseg = ();
set segid = ()
set segidonly = 0
set segiderode = 0;
set ctab = ()
setenv FS_MRIMASK_ALLOW_DIFF_GEOM 0

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`

set outdir = `dirname $outseg`
mkdir -p $outdir
pushd $outdir > /dev/null
set outdir = `pwd`;
popd > /dev/null

if($#tmpdir == 0) then
  set tmpdir = `fs_temp_dir --scratch --base $outdir`
endif
mkdir -p $tmpdir

# Set up log file
if($#LF == 0) set LF = $outseg.log
if($LF != /dev/null) rm -f $LF
echo "Log file for mergeseg" >> $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

#========================================================
set notmergeseg = $tmpdir/not.mergeseg.mgh
set cmd = (mri_binarize --i $mergeseg --inv --o $notmergeseg)
if($segidonly) then
  set cmd = ($cmd --match $segid)
  if($segiderode > 0) set cmd = ($cmd --erode $segiderode)
else
  set cmd = ($cmd --min 0.5)
endif

echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) goto error_exit;

set srcsegnotmerge = $tmpdir/srcsegnotmerge.mgh
set cmd = (mri_mask $srcseg $notmergeseg $srcsegnotmerge)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) goto error_exit;
if($cleanup) rm $notmergeseg

if($#segid) then
  set mergeseg2 = $tmpdir/mergeseg.mgh
  set cmd = (mri_binarize --i $mergeseg --o $mergeseg2 --binval $segid)
  if($segidonly) then
    set cmd = ($cmd --match $segid)
    if($segiderode > 0) set cmd = ($cmd --erode $segiderode)
  else
    set cmd = ($cmd --min 0.5)
  endif
  echo $cmd | tee -a $LF
  $cmd | tee -a $LF
  if($status) goto error_exit;
else
  set mergeseg2 = $mergeseg
endif

set cmd = (fscalc $mergeseg2 sum $srcsegnotmerge -o $outseg)
echo $cmd | tee -a $LF
$cmd | tee -a $LF
if($status) goto error_exit;

if($#ctab) then
  set cmd = (mri_convert $outseg --ctab $ctab $outseg)
  echo $cmd | tee -a $LF
  $cmd | tee -a $LF
  if($status) goto error_exit;
endif

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

# Cleanup
if($cleanup) rm -rf $tmpdir

# 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 "Mergeseg-Run-Time-Sec $tSecRun" |& tee -a $LF
echo "Mergeseg-Run-Time-Hours $tRunHours" |& tee -a $LF
echo " " |& tee -a $LF
echo "mergeseg Done" |& tee -a $LF
exit 0

###############################################

############--------------##################
error_exit:
echo "ERROR:"

exit 1;
###############################################

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

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

    case "--src":
      if($#argv < 1) goto arg1err;
      set srcseg = $argv[1]; shift;
      if(! -e $srcseg) then
        echo "ERROR: cannot find $srcseg"
        exit 1;
      endif
      breaksw

    case "--merge":
      if($#argv < 1) goto arg1err;
      set mergeseg = $argv[1]; shift;
      if(! -e $mergeseg) then
        echo "ERROR: cannot find $mergeseg"
        exit 1;
      endif
      breaksw

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

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

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

    case "--segid-erode":
      # Only applies to --segid-only
      if($#argv < 1) goto arg1err;
      set segiderode = $argv[1]; shift;
      breaksw

    case "--ctab":
      if($#argv < 1) goto arg1err;
      set ctab = $argv[1]; shift;
      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($#srcseg == 0) then
  echo "ERROR: must spec src seg"
  exit 1;
endif
if($#mergeseg == 0) then
  echo "ERROR: must spec merge seg"
  exit 1;
endif
if($#outseg == 0) then
  echo "ERROR: must spec out seg"
  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 "mergeseg --help"
  echo " --src source segmentation"
  echo " --merge merge seg volume "
  echo " --o outseg"
  echo " --segid segindex (optional)"
  echo " --segid-only segindex : only take segindex from merge"
  echo " --segid-erode Nerode : erode seg-only segindex before merge"
  echo " --ctab ctab : color table to embed in the output"
  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

Merges one segmentation into another. The output is the same as the source
except in voxels where the merge seg is non-zero in which case those voxels
are replaced with the values in the merge segmentation volume. 

If you specify the segindex, then all the voxels in the merge seg will be set
to segindex.

