#! /bin/csh -f

#
# rocview
#
# Original Author: Doug Greve
# CVS Revision Info:
#    $Author: nicks $
#    $Date: 2007/01/09 22:41:18 $
#    $Revision: 1.13 $
#
# 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 VERSION = '$Id: rocview,v 1.13 2007/01/09 22:41:18 nicks Exp $';
set inputargs = ($argv);

set fprvolid = ();
set tprvolid = ();
set maskvolid = ();
set maskthresh = 0.5;
set ubermaskvolid = ();
set roi = ();
set frame = ();
set mfile = ();
set monly = 0;
set outfile = ();
set inout = 0;    # tpr inside mask/roi, fpr outside mask/roi
set noview = 0;
set deltap = .001;
set alphamin = 0;
set alphamax = .1;
set plotloglog = 1;
set nmin = 0;
set cutends = 0;
set tailtype = 'unsigned';
set polarity = 0;
set log10p = 1;
set zstat = 0;
set fmtimg = 0;
set nerode  = 0;
set ndilate = 0;

if($#argv == 0) then
  goto usage_exit;
  exit 1;
endif

set n = `echo $argv | grep version | wc -l` 
if($n != 0) then
  echo $VERSION
  exit 0;
endif

set PWD = `getpwdcmd`;
if($status) exit 1;

goto parse_args;
parse_args_return:

goto check_params;
check_params_return:

## Set path for matlab file ##
if(! $monly) then
  set MLF = "/tmp/sxa_$$.m"
  set QuitOnError = 1;
else
  set MLF = $mfile;
  set QuitOnError = 0;
endif

if($monly || $noview) then
  set wait = 0;
else
  set wait = 1;
endif

echo matlab file is $MLF 
rm -f $MLF;
echo "% Matlab file for rocview `date`" >> $MLF
echo "% This file may be deleted "     >> $MLF
echo "% $MLF"                          >> $MLF;
echo "global QuitOnError;"             >> $MLF;
echo "QuitOnError = $QuitOnError;"     >> $MLF;

#----------------------------------------#
tee -a > /dev/null $MLF  <<EOF

fprvolid = splitstring('$fprvolid');
tprvolid = '$tprvolid';
maskvolid = splitstring('$maskvolid');
maskthresh = $maskthresh;
ubermaskvolid = '$ubermaskvolid';
frame = [$frame];
outfile = '$outfile';
inout = $inout;
noview = $noview;
wait = $wait;
deltap   = $deltap;
alphamin = $alphamin;
alphamax = $alphamax;
nmin     = $nmin;
cutends  = $cutends;
plotloglog = $plotloglog;
tailtype = '$tailtype';
polarity = $polarity;
log10p = $log10p;
zstat  = $zstat;
fmtimg = $fmtimg;
nerode  = $nerode;
ndilate = $ndilate;

if(~isempty(ubermaskvolid))
  fprintf('Loading ubermask %s\n',ubermaskvolid);
  if(fmtimg==1) 
    ubermaskvol = fast_ldanalyze(ubermaskvolid);
  elseif(fmtimg==2) 
    ubermaskvol = MRIread(ubermaskvolid);
    ubermaskvol = ubermaskvol.vol;
  else          
    ubermaskvol = fmri_ldbvolume(ubermaskvolid);
  end
  nuber = length(find(ubermaskvol));
  fprintf('nuber = %d\n',nuber);
end

if(size(maskvolid,1)==1)
  fprintf('Loading %s\n',maskvolid);
  maskvol = MRIread(maskvolid);
  maskvol = maskvol.vol;

  maskvol = maskvol(:,:,:,1);
  maskvol = abs(maskvol) > maskthresh;
  if(inout) maskvol = ~maskvol; end
  if(cutends)
    fprintf('Cutting ends\n');
    maskvol(1,:,:) = 0;
    maskvol(size(maskvol,1),:,:) = 0;
  end
  if(~isempty(ubermaskvolid))
    fprintf('Masking with ubermask\n');
    maskvol = maskvol & ubermaskvol;
  end
  if(nerode ~= 0)
    fprintf('Eroding Mask %d times\n',nerode);
    maskvol = fast_dilate(maskvol,nerode,1);
  end
  if(ndilate ~= 0)
    fprintf('Dilating Mask %d times\n',ndilate);
    maskvol = fast_dilate(maskvol,ndilate);
  end

  indmask = find(maskvol == 1);
  nmask = length(indmask);
  fprintf('nmask = %d\n',nmask);
  if(nmask == 0)
    fprintf('ERROR: no voxels in mask\n');
    if(QuitOnError) quit; end
    return;
  end

elseif(~isempty(ubermaskvolid))
  fprintf('Masking with ubermask\n');
  maskvol = ubermaskvol;
  indmask = find(maskvol == 1);
  nmask = length(indmask);
  fprintf('nmask = %d\n',nmask);
  if(nmask == 0)
    fprintf('ERROR: no voxels in mask\n');
    if(QuitOnError) quit; end
    return;
  end
else
  indmask = [];
end


if(~isempty(fprvolid))
  fprvol = [];
  for nth = 1:size(fprvolid,1)

    nthfprvolid = deblank(fprvolid(nth,:));
    fprintf('Loading %s\n',nthfprvolid);
    nthfprvol = MRIread(nthfprvolid);
    nthfprvol = nthfprvol.vol;

    if(~isempty(frame)) nthfprvol = nthfprvol(:,:,:,frame+1); end

    sz = size(nthfprvol);
    if(length(sz) == 2) sz = [sz 1 1]; end
    if(length(sz) == 3) sz = [sz 1]; end
    nthfprvol = reshape(nthfprvol, [prod(sz(1:3)) sz(4)]);
    if(size(maskvolid,1)==1)
      if(~isempty(indmask)) nthfprvol = nthfprvol(indmask); end
    end
    if(size(maskvolid,1) > 1)
      nthmaskvolid = deblank(maskvolid(nth,:));
      if(fmtimg) maskvol = fast_ldanalyze(nthmaskvolid);
      else       maskvol = fmri_ldbvolume(nthmaskvolid);
      end
      if(isempty(maskvol)) return; end
      maskvol = maskvol(:,:,:,1);
      maskvol = maskvol > 0.5;
      if(inout) maskvol = ~maskvol; end
      if(cutends)
        fprintf('Cutting ends\n');
        maskvol(1,:,:) = 0;
        maskvol(size(maskvol,1),:,:) = 0;
      end
      if(~isempty(ubermaskvolid))
        maskvol = maskvol & ubermaskvol;
      end
      indmask = find(maskvol == 1);
      fprintf('   %d %s   %d\n',nth,nthmaskvolid,length(indmask));
      if(~isempty(indmask)) nthfprvol = nthfprvol(indmask); end
    end % per fpr mask
    fprvol = [fprvol; nthfprvol];
  end

  fprintf('nsamples = %d\n',length(fprvol));

  if(polarity == 1)
    ind = find(sign(fprvol) >= 0);
    fprvol = fprvol(ind);
    fprintf('INFO: removing %d negative polarity voxels\n',length(ind));
  end
  if(polarity == -1)
    ind = find(sign(fprvol) <= 0);
    fprvol = fprvol(ind);
    fprintf('INFO: removing %d positive polarity voxels\n',length(ind));
  end

  if(log10p) fprvol = (10.^(-abs(fprvol))); end
  if(zstat)  fprvol = abs(fast_z2p(fprvol)); end

  if(strcmp(tailtype,'signed'))
    fprvol = 2*fprvol;
  end

  [pdf alpha nx fpr ] = ComputePDF(reshape1d(fprvol),alphamin,alphamax,deltap);
  %[fpr alpha] = ComputeFPR(reshape1d(fprvol),deltap);
  clear fprvol;

  if(~isempty(outfile))
    fid = fopen(outfile,'w');
    if(fid == -1)
      fprintf('ERROR: cannot open %s\n',outfile);
      if(QuitOnError) quit; end
      return;
    end
    fprintf(fid,'%10.9f %10.9f  %5d\n', [alpha' fpr' nx']'); 
    fclose(fid);
  end

  if(nmin > 0)
    ind = find(nx >= nmin);
    alpha = alpha(ind);
    fpr   = fpr(ind);
  end
  
  h1 = figure;
  if(plotloglog)
    loglog(alpha,alpha,'g-.',alpha,fpr,'r+-');
  else
    plot(alpha,alpha,'g-.',alpha,fpr,'r+-');
  end
  axis([alphamin alphamax alphamin alphamax]);
  title(fprvolid(1,:))
  showfigxy;
  if(wait) uiwait(h1); end
  fprintf(0,'\n');
  if(QuitOnError) quit; end

end

if(~isempty(tprvolid))
  fprintf('Loading %s\n',tprvolid);
  tprvol = fmri_ldbvolume(tprvolid);
  tprvol = sign(tprvol).* (10.^(-abs(tprvol)));
  [tpr alpha] = ComputeFPR(reshape1d(tprvol));
end

qoe;

EOF
#----------------------------------------#

if(! $monly ) then
  echo "------------------------------------------" 
  echo "------- matlab output --------------------" 
  cat $MLF | matlab -nosplash
  echo "------------------------------------------" 
  rm $MLF
endif


exit
############--------------##################
############--------------##################

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

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

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

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

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

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

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

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

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

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

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

    case "-roi":
      if ( $#argv < 6) then
        echo "ERROR: -roi requires 6 arguments"
        exit 1;
      endif
      set roi = $argv[1-6];
      shift;shift;shift;shift;shift;shift;
      breaksw

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

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

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

    case "-img":
      set fmtimg = 1;
      breaksw

    case "-mgh":
      set fmtimg = 2;
      breaksw

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

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

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

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

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

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

    case "-signed":
      set tailtype = 'signed';
      breaksw

    case "-unsigned":
      set tailtype = 'unsigned';
      breaksw

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

    case "-pvals"
      set log10p = 0;
      breaksw

    case "-zstat"
      set log10p = 0;
      set zstat = 1;
      breaksw

    case "-log":
      set plotloglog = 1; 
      breaksw

    case "-nolog":
      set plotloglog = 0; 
      breaksw

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

    case "-umask":
      if ( $#argv == 0) goto arg1err;
      umask $1; shift;
      breaksw

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

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

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

  if($#fprvolid == 0 && $#tprvolid == 0) then
    echo "ERROR: must specify an input volume (fpr or tpr or both)";
    exit 1
  endif

  if($inout && $#maskvolid == 0 && $#roi == 0) then
    echo "ERROR: -inout needs a mask or roi"
    exit 1;
  endif

  if($inout && $#fprvolid != 0 && $#tprvolid != 0) then
    echo "ERROR: cannot use -inout with fpr and tpr";
    exit 1
  endif

  if($#maskvolid != 0 && $#maskvolid != 1 && $#maskvolid != $#fprvolid) then
    echo "ERROR: when spec more than one mask, the number must"
    echo "       be the same as the number of fpr vols"
    exit 1;
  endif
goto check_params_return;
############--------------##################


############--------------##################
arg1err:
  echo "ERROR: flag $flag requires one argument"
  exit 1
############--------------##################

#--------------------------------------------------------------------#
usage_exit:
  echo "USAGE: "
  echo "  rocview"
  echo "   -fpr fprvolid"
  echo "   -tpr tprvolid"
  echo "   -frame frameno (zero-based)"
  echo "   -mask maskvolid <-mask maskvolid>"
  echo "   -maskthresh thresh : default 0.5"
  echo "   -ubermask ubermaskvolid"
  echo "   -nero nerode"
  echo "   -ndil ndilate"
  echo "   -roi slc1 row1 col1 slc2 row2 col2"
  echo "   -inout"
  echo "   -noview"
  echo "   -nolog"
  echo "   -deltap dp"
  echo "   -nmin n : each bin must have n samples to be displayed"
  echo "   -max alphamax"
  echo "   -o outfile"
  echo "   -cutends"

  echo "   -monly mfile"
  echo "   -umask umask          : set unix file permission mask"
  echo "   -version              : print version and exit"
exit 1;
#--------------------------------------------------------------------#
