#!/bin/tcsh -f
# fvcompare

set VERSION = 'fvcompare dev';

set subject1 = ();
set subject2 = ();
set subject3 = ();
set subject4 = ();
set SD1 = ();
set SD2 = ();
set SD3 = ();
set SD4 = ();
set vollist = ();
set seglist = ();
set segcolor = $FREESURFER_HOME/FreeSurferColorLUT.txt
set segopacity = 1;
set surflist = (white pial);
set surfcolor1 = (yellow red blue);
set surfcolor2 = (green blue blue);
set surfcolor3 = (green blue blue);
set surfcolor4 = (green blue blue);
set tmpdir = ();
set cleanup = 1;
set LF = ();
set name1 = "s1"
set name2 = "s2"
set name3 = "s3"
set name4 = "s4"
set grayscale = (":grayscale=10,130")
set NoSeg = 0;
#set NoSurf = 0;
set hemilist = (lh rh)
set snolist = (1 2)
set CursorCRS = ();
set CenterCursor = 0;
set Zoom = ();
set annot = ();
set pointset = ();
set altargs = ()
set DoWoT2Pial = 0;

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 cmd = (freeview )
if($#pointset) set cmd = ($cmd -c $pointset)
foreach vol ($vollist)
  foreach s ($snolist)
    if($s == 1) then
      set subject = $subject1
      set surfcolor = ($surfcolor1);
      set name = $name1
      set sd = $SD1
    endif
    if($s == 2) then
      set subject = $subject2
      set surfcolor = ($surfcolor2);
      set name = $name2
      set sd = $SD2
    endif
    if($s == 3) then
      set subject = $subject3
      set surfcolor = ($surfcolor3);
      set name = $name3
      set sd = $SD3
    endif
    if($s == 4) then
      set subject = $subject4
      set surfcolor = ($surfcolor4);
      set name = $name4
      set sd = $SD4
    endif
    set sname = `basename $subject`
    set volbase = `basename $vol .mgz`
    set cue = $name-$volbase
    set v = $subject/mri/$vol
    set cmd = ($cmd -v "$v":"name=$cue$grayscale")
  end
end
foreach seg ($seglist)
  foreach s ($snolist)
    if($s == 1) then
      set subject = $subject1
      set surfcolor = ($surfcolor1);
      set name = $name1;
      set sd = $SD1
    endif
    if($s == 2) then
      set subject = $subject2
      set surfcolor = ($surfcolor2);
      set name = $name2;
      set sd = $SD2
    endif
    if($s == 3) then
      set subject = $subject3
      set surfcolor = ($surfcolor3);
      set name = $name3;
      set sd = $SD3
    endif
    if($s == 4) then
      set subject = $subject4
      set surfcolor = ($surfcolor4);
      set name = $name4;
      set sd = $SD4
    endif
    set segbase = `basename $seg .mgz`
    set cue = $name-$segbase
    set v = $subject/mri/$seg
    set cmd = ($cmd -v "$v":"lut=$segcolor":"opacity=$segopacity":"colormap=lut":"name=$cue")
  end
end
foreach hemi ($hemilist)
  @ nth = 0;
  foreach surf ($surflist)
    @ nth = $nth + 1;
    foreach s ($snolist)
      if($s == 1) then
        set subject = $subject1
        set surfcolor = ($surfcolor1);
        set name = $name1
        set sd = $SD1
      endif
      if($s == 2) then
        set subject = $subject2
        set surfcolor = ($surfcolor2);
        set name = $name2
        set sd = $SD2
      endif
      if($s == 3) then
        set subject = $subject3
        set surfcolor = ($surfcolor3);
        set name = $name3
        set sd = $SD3
      endif
      if($s == 4) then
        set subject = $subject4
        set surfcolor = ($surfcolor4);
        set name = $name4
        set sd = $SD4
      endif
      set cue = "$name-$hemi.$surf-$surfcolor[$nth]"
      set surfarg = "$subject/surf/$hemi.$surf":"edgecolor=$surfcolor[$nth]":"name=$cue"
      if($#annot) then
        set annotfile = $subject/label/$hemi.$annot
        if(! -e $annotfile) then
          echo "ERROR: cannot find $annotfile"
          exit 1;
        endif
        set surfarg = "$surfarg":"annot=$annotfile":"edgethickness=0:annot_outline=1"
      endif
      set cmd = ($cmd --surface $surfarg)
    end
  end
end

if($DoWoT2Pial) then
  set surf = woT2.pial
  foreach subject ($subject1 $subject2)
    if($subject == $subject1) set name = $name1
    if($subject == $subject2) set name = $name2
    foreach hemi ($hemilist)
      set cue = "$name-$hemi.$surf"
      set surfarg = "$subject/surf/$hemi.$surf":"edgecolor=magenta":"name=$cue"
      set cmd = ($cmd --surface $surfarg)
    end
  end
endif

if($#CursorCRS) set cmd = ($cmd -slice $CursorCRS)
if($CenterCursor) set cmd = ($cmd -cc)
if($#Zoom) set cmd = ($cmd -zoom $Zoom)
set cmd = ($cmd $altargs)
echo $cmd
fsvglrun $cmd

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

echo "fvcompare Done"
exit 0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    case "--sd":
      if($#argv < 1) goto arg1err;
      setenv SUBJECTS_DIR $argv[1]; shift;
      breaksw

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

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

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

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

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

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

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

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

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

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

    case "--aseg":
      set seglist = ($seglist aseg.mgz);
      breaksw

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

    case "--no-seg":
      set NoSeg = 1;
      breaksw

    case "--woT2":
    case "--wot2":
      set DoWoT2Pial = 1;
      breaksw
    case "--no-woT2":
    case "--no-wot2":
      set DoWoT2Pial = 0;
      breaksw


    case "--no-surf":
      set NoSurf = 1;
      set surflist = ()
      breaksw

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

    case "--lh":
      set hemilist = (lh)
      breaksw
    case "--rh":
      set hemilist = (rh)
      breaksw

    case "--inflated":
      set surflist = ($surflist inflated)
      breaksw

    case "--orig":
      set surflist = (orig orig.nofix)
      breaksw

    case "--white":
      set surflist = (white)
      breaksw

    case "--pial":
      set surflist = (white)
      breaksw

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

    case "--gray":
    case "--grayscale":
      if($#argv < 2) goto arg2err;
      set g1 = $argv[1]; shift;
      set g2 = $argv[1]; shift;
      set grayscale = (":grayscale=$g1,$g2")
      breaksw

    case "--crs":
      if($#argv < 3) goto arg3err;
      set CursorCRS = ($argv[1-3]);
      shift;shift;shift;
      set CenterCursor = 1;
      breaksw

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

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

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

    case "--aparc":
      set annot = aparc.annot
      breaksw

    case "--vgl":
      setenv FS_ALLOW_VGLRUN 1
      breaksw
    case "--novgl":
    case "--no-vgl":
      unsetenv FS_ALLOW_VGLRUN 
      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:
      set altargs = ($altargs $flag)
      #echo ERROR: Flag $flag unrecognized. 
      #echo $cmdline
      #exit 1
      breaksw
  endsw

end

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

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

if($#SD1 == 0) set SD1 = $SUBJECTS_DIR
if($#SD2 == 0) set SD2 = $SUBJECTS_DIR
if($#SD3 == 0) set SD3 = $SUBJECTS_DIR
if($#SD4 == 0) set SD4 = $SUBJECTS_DIR

if($#subject1 == 0) then
  echo "ERROR: must spec subject1"
  exit 1;
endif
set subject1tmp = $SD1/$subject1
if(! -e $subject1tmp) then
  echo "ERROR: cannot find $subject1tmp"
  exit 1;
endif
set subject1 = $subject1tmp;

if($#subject2 == 0) then
  echo "ERROR: must spec subject2"
  exit 1;
endif
set subject2tmp = $SD2/$subject2
if(! -e $subject2tmp) then
  echo "ERROR: cannot find $subject2tmp"
endif
set subject2 = $subject2tmp;

if($#subject3) set snolist = ($snolist 3)
if($#subject4) set snolist = ($snolist 4)

if($#vollist == 0) set vollist = (brain.finalsurfs.mgz)
if($#seglist == 0) set seglist = (aparc+aseg.mgz)

if($NoSeg) set seglist = ()
#if($NoSurf) set surflist = ()

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 "fvcompare"
  echo "  --s1 subject1 --s2 subject2"
  echo "  --s subject --sd1 SD1 --sd2 SD2"
  echo "  --n1 name1 --n2 name2 (default s1 and s2)"
  echo "  --c1 whitecolor1 pialcolor1 ... : set surface colors"
  echo " Note you can add two more subjects using --s3, --n3, --c3, --s4, etc"
  echo "  --vol volname (as found in subject/mri; default is brainmask.mgz, can have multiple)"
  echo "  --seg segname (as found in subject/mri; default is aparc+aseg.mgz, can have multiple)"
  echo "  --aseg : add aseg.mgz to seglist"
  echo "  --no-seg : do not display segmentations"
  echo "  --lh, --rh : only display left or right hemi"
  echo "  --no-surf : do not display surfaces"
  echo "  --gray min max : set gray scale levels (default is 0 255)"
  echo "  --crs col row slice : place cursor at given location and center FoV"
  echo "  --zoom Zoom : set zoom level"
  echo "  --annot annotname :  loads annotname.annot onto surfaces"
  echo "  --aparc : load aparc.annot onto surfaces"
  echo "  --inflated : load inflated surfaces in addition to white and pial"
  echo "  --white : only show white surfaces"
  echo "  --orig : only show orig.nofix and orig surfaces"
  echo "  --surf surfname : only show surfname"
  echo "  --p pointset : load point set file"
  echo "  --wot2 : include the ?h.woT2.pial surfs"
  echo ""
  echo "Note: unrecognized arguments are appended to freeview command line"
  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

Simultaneously loads volume, segmentation, and surface data from two
subjects in freeview, eg, for comparing across time or for comparing
across different analysis methods. The two subjects can be in the same
or different SUBJECTS_DIRs. No registration is applied.  If the name
option is used, then the given name is prepended to the volume or
surface name (default is "s1" and "s2")

If the two subjects are in the same SUBJECTS_DIR, then run something
like

fvcompare --s1  subject1 --s2 subject2

If they are in different SUBJECTS_DIRs, then run something like

fvcompare --s1 subject1 --sd1 DEV_SUBJECTS_DIR --s2 subject2 --sd2 STD_SUBJECTS_DIR \
  --n1 dev --n2 stable 

If the subjects have the same name but in different SUBJECTS_DIR, then 

fvcompare --s  subject --sd1 SUBJECTS_DIR1 --sd2 SUBJECTS_DIR2

