#!/bin/tcsh -f
# thalseg

set VERSION = '$Id: beta2sxa,v 1.2 2010/05/10 22:51:10 greve Exp $';

set sxa = ();
set betalist = ();
set Nc = ();
set Nper = ();
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
goto parse_args;
parse_args_return:
goto check_params;
check_params_return:
set StartTime = `date`;

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

# Create tmpdir and log file
if($#tmpdir == 0) set tmpdir = $outdir/tmpdir.beta2sxa
mkdir -p $tmpdir
if($#LF == 0) set LF = $tmpdir/thalseg.log
if($LF != /dev/null) rm -f $LF
echo "Log file for beta2sxa" >> $LF
date  | tee -a $LF
echo "" | 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
uname -a  | tee -a $LF

# ---------------------------------
if($#betalist == 1) then
  set beta = $betalist
else
  set beta = $tmpdir/beta.nii
  mri_concat $betalist --o $beta
endif

# Number of expected frames
set nbexp = `echo "$Nc*$Nper" | bc`
# Get number of frames in beta
set tmpfile = $tmpdir/tmp.file
mri_info --o $tmpfile --nframes $beta 
set nbeta = `cat $tmpfile`
if($nbeta != $nbexp) then
  echo "ERROR: dimension mismatch, nbeta=$nbeta, expecting $nbexp" 
  exit 1
endif

# ---------------------------------
set stem = `fname2stem $sxa`
set dat = $stem.dat
echo $dat
rm -f $dat
echo "TR 1" >> $dat
echo "TimeWindow $Nper" >> $dat
echo "TPreStim 0" >> $dat
@ nCond = $Nc + 1
echo "nCond $nCond" >> $dat
echo "Nh $Nper" >> $dat
echo "TER 1" >> $dat
echo "SumXtX" >> $dat
@ r = 0;
set vlist = ();
while ($r < $nbeta)
  @ r = $r + 1;
  @ c = 0;
  while ($c < $nbeta)
    @ c = $c + 1;
    if($r == $c) set v = 1;
    if($r != $c) set v = 0;
    echo "$v ">> $dat
  end
end
echo "hCovMtx" >> $dat
@ r = 0;
while ($r < $nbeta)
  @ r = $r + 1;
  @ c = 0;
  while ($c < $nbeta)
    @ c = $c + 1;
    if($r == $c) set v = 1;
    if($r != $c) set v = 0;
    echo "$v ">> $dat
  end
end

# ---------------------------------
# This creates the "selavg" format used by Anders 
# a billion years ago. z z b1 z b2 z b3 z ...
rm -f $sxa
set z = $tmpdir/z.nii
mri_volsynth --template $beta --nframes $Nper \
  --pdf const --val-a 0 --o $z | tee -a $LF
if($status) exit 1;

set cclist = ($z $z)
@ nthc = 0;
while($nthc < $Nc)
  @ nthc = $nthc + 1;
  set n1 = `echo "($nthc-1)*$Nper" | bc`
  set n2 = `echo "($nthc)*$Nper" | bc`
  echo $nthc $n1 $n2
  set betasub = $tmpdir/beta.sub.$nthc.nii
  mri_convert $beta --fsubsample $n1 1 $n2 $betasub | tee -a $LF
  set cclist = ($cclist $betasub $z)
end
mri_concat $cclist --o $sxa

# old way ##############################################
if(0) then
mri_concat $z $z --o $sxa | tee -a $LF
if($status) exit 1;
@ nthc = 0;
while($nthc < $Nc)
  @ nthc = $nthc + 1;
  set n1 = `echo "($nthc-1)*$Nper" | bc`
  set n2 = `echo "($nthc)*$Nper" | bc`
  echo $nthc $n1 $n2
  set betasub = $tmpdir/beta.sub.nii
  mri_convert $beta --fsubsample $n1 1 $n2 $betasub | tee -a $LF
  if($status) exit 1;
  mri_concat $sxa $betasub --o $sxa | tee -a $LF
  if($status) exit 1;
  mri_concat $sxa $z --o $sxa | tee -a $LF
  if($status) exit 1;
end
endif
###############################################

if($cleanup) rm -rf $tmpdir

echo "Started at $StartTime"
echo "Ended   at `date`"
echo "beta2sxa done"

exit 0

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

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

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

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

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

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

    case "--nper":
      if($#argv < 1) goto arg1err;
      set Nper = $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 "--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($#beta == 0) then
  echo "ERROR: must spec input"
  exit 1;
endif
if($#sxa == 0) then
  set betabase = `basename $beta[1]`;
  set betadir  = `dirname $beta[1]`;
  set betastem = `fname2stem $beta[1]`;
  set betafmt  = `stem2fmt $betastem`;
  set sxa = $betadir/h.$betastem.$betafmt
  echo "Setting output to $sxa"
endif
if($#Nc == 0) then
  echo "ERROR: must spec Nc"
  exit 1;
endif
if($#Nper == 0) then
  echo "ERROR: must spec Nc"
  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 "beta2sxa"
  echo " --b beta"
  echo " --nc Nc"
  echo " --nper Nper"
  echo " --o sxa : default is h.beta"
  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

This is a little script to create files that can be plotted in
tkmedit or tksurfer by passing it as the -t option. This is
convenient whenever your data is a table. The output format
is the the "selavg" format used by Anders a billion years ago. 
z z b1 z b2 z b3 z ...

Eg, 4 groups with 18 subjects per group are stored in a single file
called data.nii. You would then run

beta2sxa --b data.nii --nc 4 --nper 18 

By default, this will create h.data.nii and h.data.dat. You would
then run

tkmedit subject orig.mgz -reg register.dat -t h.data.nii
tksurfer subject lh inflated -reg register.dat -t h.data.nii

If the 4 groups with 18 subjects per group are stored in a different
files the,

beta2sxa --b data1.nii --b data2.nii --b data3.nii --b data4.nii \
  --nc 4 --nper 18 --o h.data.nii

