#!/bin/tcsh -f
# tkmeditfv

set VERSION = 'tksurferfv 8.2.0';
setenv FS_COPY_HEADER_CTAB 1 # make sure that anything saved in FV has its colortable

set subject = ();
set overlay = ();
set surflist0 = ();
set overlaylist = ();
set overlaylistname = ()
set overlayreg = ();
set twfvol = ();
set twfreg = ();
set annotlist = ();
set hemi = ();
set fthresh = 2;
set fmax    = 5;
set labellist = ();
set UseTkSurfer = 0;
set curv = curv
set DoAllSurfs = 0;
set altargs = ()
set patch = ()
set annotoutline = 1
set overlaymethod = "mid_to_min"
set vtxno = ()
set view = ()
if($?FV_PATIENT_ORIENTATION == 0) setenv FV_PATIENT_ORIENTATION 1
if($?FV_ROTATE_AROUND_CURSOR == 0) setenv FV_ROTATE_AROUND_CURSOR 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'`;

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

if(! $UseTkSurfer) then
  ### FreeView ####----------------------------------------------
  set cmd = (freeview )
  if($#view) set cmd = ($cmd --view $view)
  if($FV_PATIENT_ORIENTATION == 2) set cmd = ($cmd -neuro-view)
  if($FV_ROTATE_AROUND_CURSOR) set cmd = ($cmd -rotate-around-cursor)
  set cmd = ($cmd -f)
  @ nthsurf = 0;
  foreach surf ($surflist)
    @ nthsurf = $nthsurf + 1;
    set curvfile = $SUBJECTS_DIR/$subject/surf/$hemi.$curv
    set surfarg = "$surf":"curvature=$curvfile"
    if($nthsurf != $#surflist) set surfarg = "$surfarg":"visible=0"
    if($nthsurf == 1 && $#vtxno) set surfarg = "$surfarg":"goto=$vtxno"
    @ nthannot = 0;
    foreach annot ($annotlist) 
      @ nthannot = $nthannot + 1
      set annotfile = $annotfilelist[$nthannot];
      set surfarg = "$surfarg":"annot=$annotfile":"edgethickness=0:annot_outline=$annotoutline"
    end
    @ nthoverlay = 0
    foreach overlay ($overlaylist)
      @ nthoverlay = $nthoverlay + 1
      # Change this when RP changes linear opaque in fv
      set fmid = $fthresh;
      #set surfarg = "$surfarg":"overlay=$overlay":"overlay_threshold=$fthresh,$fmid,$fmax":overlay_method=piecewise
      set surfarg = "$surfarg":"overlay=$overlay":"overlay_threshold=$fthresh,$fmax":"overlay_method=$overlaymethod"
      if($#overlayreg) set surfarg = "$surfarg":"overlay_reg=$overlayreg"
      if($overlaylistname[$nthoverlay] != noname) set surfarg = "$surfarg":"overlay_name=$overlaylistname[$nthoverlay]"
    end
    if($#labellist) then
      foreach label ($labellist)
        set surfarg = "$surfarg":"label=$label"
      end
    endif
    if($#patch) set surfarg = "$surfarg":"patch=$patch"
    if($DoAllSurfs) set surfarg = "$surfarg":"all=true"
    set cmd = ($cmd $surfarg)
  end
  set cmd = ($cmd -viewport 3d)
else
  ### tksurfer ####----------------------------------------------
  set cmd = (tksurfer $subject $hemi $surflist0[1] -fminmax $fthresh $fmax)
  if($#annotlist) set cmd = ($cmd -annot $annotlist[1])
  if($#labellist) set cmd = ($cmd -label $labellist[1])
  foreach overlay ($overlaylist)
    set cmd = ($cmd -overlay $overlay)
  end
endif
set cmd = ($cmd $altargs)
echo $cmd
if($FV_PATIENT_ORIENTATION == 2) then 
  echo "\n\n USING NEUROLOGICAL ORIENTATION FOR VOLUME VIEWING\n\n"
else
  echo "\n\n USING RADIOLOGICAL ORIENTATION FOR VOLUME VIEWING\n\n"
endif
fsvglrun $cmd

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

exit 0

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

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

set subject = $argv[1]; shift;
set hemi = $argv[1]; shift;
set surf = $argv[1]; shift;
set surflist0 = ($surflist0 $surf)

while( $#argv != 0 )

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

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

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

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

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

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

    case "-aparc":
      set annot = aparc.annot
      set annotlist = ($annotlist $annot)
      breaksw

    case "-overlay":
    case "-ov":
      if($#argv < 1) goto arg1err;
      set ov = $argv[1]; shift;
      if(! -e $ov) then
        echo "ERROR: cannot find $ov"
        exit 1;
      endif
      set overlaylist = ($overlaylist $ov)
      if(! `isargflag $argv`) then
        set overlaylistname = ($overlaylistname $argv[1]); shift
      else
        set overlaylistname = ($overlaylistname noname);
      endif
      breaksw

    case "-linear":
      set overlaymethod = linear
      breaksw
    case "-linearopaque":
      set overlaymethod = linearopaque
      breaksw
    case "-piecewise":
      set overlaymethod = piecewise
      breaksw
    case "-min_to_max":
      set overlaymethod = min_to_max
      breaksw

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

    case "-fminmax":
      if($#argv < 2) goto arg2err;
      set fthresh = $argv[1]; shift;
      set fmax = $argv[1]; shift;
      breaksw

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

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

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

    case "-surf":
    case "-aux-surf":
    case "-aux-surface":
      if($#argv < 1) goto arg1err;
      set surf = $argv[1]; shift;
      set surflist0 = ($surf $surflist0);
      breaksw

    case "-pial":
      set surflist0 = (pial $surflist0);
      breaksw

    case "-white":
      set surflist0 = (white $surflist0);
      breaksw

    case "-surfs":
      set surflist0 = (white pial inflated)
      breaksw

    case "-medial":
      set view = medial
      breaksw

    case "-lateral":
      set view = lateral
      breaksw

    case "-inferior":
      set view = inferior
      breaksw

    case "-superior":
      set view = superior
      breaksw

    case "-all":
      set DoAllSurfs = 1;
      breaksw
    case "-no-all":
      set DoAllSurfs = 0;
      breaksw

    case "-outline":
      set annotoutline = 1
      breaksw
    case "--no-outline":
    case "-no-outline":
      set annotoutline = 0
      breaksw

    case "-vtxno":
      set vtxno = $argv[1]; shift;
      breaksw

    case "-tksurfer":
    case "-tkm":
      set UseTkSurfer = 1;
      breaksw

    case "-vgl":
      setenv FS_ALLOW_VGLRUN 1
      breaksw
    case "-novgl":
    case "-no-vgl":
      unsetenv FS_ALLOW_VGLRUN 
      breaksw

    case "-radiological":
    case "-radio":
      setenv FV_PATIENT_ORIENTATION 1
      breaksw
    case "-neurological":
    case "-neuro":
      setenv FV_PATIENT_ORIENTATION 2
      breaksw

    case "-rotate-around-cursor":
    case "-rac":
      setenv FV_ROTATE_AROUND_CURSOR 1
      breaksw
    case "-no-rotate-around-cursor":
    case "-no-rac":
      setenv FV_ROTATE_AROUND_CURSOR 0
      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 "--keep-sphere-vol-geom":
      setenv FV_SPHERE_IGNORE_VG 0
      breaksw

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

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

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

    default:
      set altargs = ($altargs $flag)
      #echo ERROR: Flag $flag unrecognized. 
      #echo $cmdline
      #exit 1
      breaksw
  endsw

end

goto parse_args_return;
############--------------##################

############--------------##################
check_params:

if($subject == getreg) then
  if($#overlayreg == 0) then
    echo "ERROR: must supply regfile with getreg"
    exit 1;
  endif
  set subject = `reg2subject $overlayreg`
endif
if(! -e $SUBJECTS_DIR/$subject) then
  set a = `echo $subject | cut -c1-9`
  if($a == fsaverage || $subject == fsmni152) then
    setenv SUBJECTS_DIR $FREESURFER/subjects
  else
    echo "ERROR: cannot find $subject"
    exit 1;
  endif
endif
set surflist = ();
foreach surf ($surflist0)
  if(-e $surf) then
    set surflist = ($surflist $surf)
  else
    set surfpath = $SUBJECTS_DIR/$subject/surf/$hemi.$surf
    if(! -e $surfpath) then
      echo "ERROR: cannot find $surf or $surfpath"
      exit 1;
    endif
    set surflist = ($surflist $surfpath)
  endif
end


if($#labellist) then
  set labellist2 = ()
  foreach label ($labellist)
    if(! -e $label) then
      set l0 = $SUBJECTS_DIR/$subject/label/$label
      if(! -e $l0 && ! -e $label) then 
        echo "ERROR: cannot find $label or $l0"
        exit 1;
      endif
      set labellist2 = ($labellist2 $l0)
    endif
  end
endif
set annotfilelist = ()
foreach annot ($annotlist)
  if(-e $annot) then
    set annotfile = $annot
  else
    set annotfile = $SUBJECTS_DIR/$subject/label/$hemi.$annot
  endif
  if(! -e $annotfile) then 
    set annotfile = $SUBJECTS_DIR/$subject/label/$hemi.$annot.annot
    if(! -e $annotfile) then 
      echo "ERROR: cannot find $annot for $subject"
      exit 1
    endif
  endif
  set annotfilelist = ($annotfilelist $annotfile)
end

if($#patch) then
  if(! -e $patch) then
    set tmppatch = $SUBJECTS_DIR/$subject/surf/$patch
    if(! -e $tmppatch) then
      echo "ERROR: cannot find $patch"
      exit 1
    else
      set patch = $tmppatch
    endif
  endif
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 "This is a script that runs freeview with arguments like tksurfer."
  echo "Not all tksurfer functionality is replicated."
  echo ""
  echo "tksurferfv subject hemi surface ..."
  echo ""
  echo "-tksurfer : use tksurfer instead of freeview"
  echo "Can have multiple annotations"
  echo ""
  echo "-ov overlay <ovname> : can have multiple overlays"
  echo "-fminmax fmin fmax : thresholds for overlays"
  echo ""
  echo "-all : load white, pial, inflated"
  echo "-vgl : runs freeview with /usr/pubsw/bin/vglrun"
  echo "-no-vgl : does not run freeview with /usr/pubsw/bin/vglrun"
  echo "-no-outline : do not show annots as outline"
  echo "-vtxno vtxno : put cursor on vtxno on the first surface"
  echo "-neuro : use neurological orientation instead of radiological"
  echo "-rotate-around-cursor (-rca) : in 3d view, rotate around cursor (use -no- to turn off)"
  echo "-linear, -linearopaque, -piecewise, -min_to_max (default) : overlay heat scale"
  echo "-medial, -lateral, -inferior, -superior"
  echo "--keep-sphere-vol-geom : do not ignore sphere volume geometry when loading sphere"
  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

