#! /bin/csh -f

#
# diag-fmri
#
# This program is used to stress the fmri analysis software
# to look for bugs or anything else that might be amiss.
# It synthesizes and processes data, examining the errors in
# the hemodynamic estimages and the false-positive rate.
#
# Original Author: Doug Greve
# CVS Revision Info:
#    $Author: nicks $
#    $Date: 2007/01/09 22:41:17 $
#    $Revision: 1.2 $
#
# 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 DIAGFMRI_VER = '$Id: diag-fmri,v 1.2 2007/01/09 22:41:17 nicks Exp $';
echo "$DIAGFMRI_VER"

set StartTime = `date`;

if($#argv == 0) then
  set TopDir = `pwd`/tmp-diag-data
else
  set TopDir = $argv[1];
endif
echo $TopDir

set fsd = bold;
set subject = dougg

mkdir -p $TopDir
cd $TopDir

set DoCMtx    = 1;
set DoOptSeq  = 1;
set DoSynth   = 1;
set DoMotCor  = 0;
set UseMotCor = 0;
set DoINorm  = 1;
set DoSXA    = 1;
set DoECM    = 0;
set DoStXG   = 1;
set DoHDRErr = 1;
set DoFPR    = 1;
set DoISFE     = 1;
set DoISHDRErr = 1;
set DoISStXG   = 1;
set DoISFPR    = 1;
set DoISRE     = 1;
set DoISREFPR  = 1;

set IPR = 3.125
set BPR = 5.000

set MONLY    = 0;

set SXAGammFit = 0;

set Sessions = (sess01)
set Sessions = (sess01 sess02 sess03 sess04 sess05 sess06)
set w = (1 1 1 1 1 1);

if(0) then
set w = ();
set Sessions = ();
@ nth = 1;
while($nth <= 30)
  set tmp = `printf %02d $nth`;
  set Sessions = ($Sessions sess$tmp)
  @ nth = $nth + 1;
  set w = ($w 1)
end
endif
echo $Sessions

set Runs     = (001)

set Npercond = (64)
set Tpercond = (2)
set WCond    = (1)
set Ntp      = 128;
set Nskip    = 0;

set NullCondId = 0;
set SNR      = .1;
set ROI      = (20 20 40 40);
#set ROI      = (1 1 64 64);
set Nslices  = 1;
set TWSynth = 20;
set TR      = 2;
set TWEst   = 20; # Estimate Time Window #
set TPreStim = 4;
set TER     = 1;
set TSR     = $TER;  # Temporal Synth Res, used by optseq and synth
set Tres    = $TER;
@ Nh        = $TWEst / $TER;
#@ Nh        = 10
set Delta   = 2.25;
set Tau     = 1.25;
set fMRIOffset = 1000;
set fMRITrend  = 0;
set PercentSigChange = 5;
set RescaleTarget = 1000;
set SigAmp = $PercentSigChange;
#set RnnMaxDelay = 20;
set RnnMaxDelay = 0;
#@ Nnac = $RnnMaxDelay / $TR
@ Nnac = 0;

set Alpha = .5;
set Rho   = .88;

set Contrast = "-a 1 -c 0  -tt tm"
set WDelay = ();
while( $#WDelay < $Nh)
  set WDelay = ($WDelay 1);
end

set hdrstem     = $fsd/sxa/h;
set ecovmtxstem = $fsd/sxa/ecm;
set eresdir     = $fsd/sxa/eres
set signaldir   = $fsd/sxa/signal
set pstem       = $fsd/sxa/p;
set fsigstem    = $fsd/sxa/fsig
set Nruns   = $#Runs;

# ------- Contrast matrix --------------- #
set CMtxFile = $TopDir/cmtx;
if($DoCMtx) then
  echo "------- mkcontrast -----------"
  set cmd = (mkcontrast -o $CMtxFile -nconds $#Npercond)
  set cmd = ($cmd -wcond $WCond -TER $TER -ndelays $Nh)
  set cmd = ($cmd -wdelay $WDelay -sumconds) # -sumdelays"
  $cmd
  if($status) then
    echo "mkcontrast failed"
    echo $cmd
    pwd
    exit 1;
  endif
  set rt = $status
  if($rt)then
    echo "----------------------------------------------"
    echo "ERROR: mkcontrast exited with $rt"
    pwd
    echo "$cmd"
    echo "----------------------------------------------"
    exit -1;
  endif
endif

############# Generate Sequences ###################
if($DoOptSeq) then
  set MF = "";
  if($MONLY) set MF = "-monly optseq.m"

  echo "-------------------------------------------------------------------"
  echo "-------------------- optseq ---------------------------------------"
  set cmd = "optseq -npercond $Npercond -tpercond $Tpercond -o par/par "
  set cmd = "$cmd -ntp $Ntp -nsessions $#Sessions -nruns $Nruns "
  set cmd = "$cmd -TR $TR -TER $TSR -Tres $TSR -timewindow $TWEst"
  set cmd = "$cmd -prestim $TPreStim -nsearch 101 -seed 54 $MF"
  pwd
  echo $cmd
  $cmd

  set rt = $status
  if($rt)then
    echo "ERROR: optseq exited with $rt"
    exit -1;
  endif

endif

set sessidfile  = sessid;
set sessdirfile = sessdir;

rm -f $sessidfile
pwd > $sessdirfile

############ Loop over sessions #####################
set isstems  = ();
set wisstems = ();
@ SessionNo = 1;
foreach Session ($Sessions)

  echo $Session >> $sessidfile

  set fmristem  = f;

  echo -------- Session $Session ---------------
  mkdir -p $Session/$fsd
  pushd $Session >& /dev/null
  echo $subject > subjectname

  echo "seqencename synthetic" > $fsd/seq.info
  echo "nrows 64"       >> $fsd/seq.info
  echo "ncols 64"       >> $fsd/seq.info
  echo "nslcs $Nslices" >> $fsd/seq.info
  echo "rowpixelsize $IPR" >> $fsd/seq.info
  echo "colpixelsize $IPR" >> $fsd/seq.info
  echo "slcpixelsize $BPR" >> $fsd/seq.info
  echo "ntrs         $Ntp" >> $fsd/seq.info
  echo "TR $TR"      >> $fsd/seq.info

  set regfile = $fsd/register.dat
  rm -f $regfile
  echo "$subject" >> $regfile
  echo "$IPR" >> $regfile
  echo "$BPR" >> $regfile
  echo "0.100" >> $regfile
  echo "1 0 0 0 " >> $regfile
  echo "0 1 0 0 " >> $regfile
  echo "0 0 1 0 " >> $regfile
  echo "0 0 0 1 " >> $regfile


  ######### Synthesize ############
  if($DoSynth) then
    set parstem = `printf ../par/par-s%03d $SessionNo`;
    set pars = ();
    @ n = 1;
    while ( $n <= $Nruns)
      set par = `printf %s-r%03d.dat $parstem $n`;
      set pars = ($pars $par);
      @ n = $n + 1;
    end
    echo ------------- Synthesizing ----------------
    set MF = "";
    if($MONLY)  set MF = "-monly synthfmri.m"

    synthfmri -dir $fsd -SNR $SNR -signalroi $ROI \
              -delta $Delta -tau $Tau -TR $TR -TER $TSR \
              -tw $TWSynth -offset $fMRIOffset -trend $fMRITrend\
              -psch $PercentSigChange -nskip $Nskip\
              -nruns $Nruns -nslices $Nslices \
       	      -rnnmaxdelay $RnnMaxDelay -alpha $Alpha -rho $Rho \
#              -npercond $Npercond \
              $MF\
	      -par $pars 

    set rt = $status
    if($rt)then
      echo "ERROR: synthfmri exited with $rt"
      exit -1;
    endif

    foreach run ($Runs)
      set par     = `printf ../par/par-s%03d-r%03d.dat $SessionNo $run`;
      set par2 = $fsd/$run/par.dat
      cp $par $par2
      if($status) then
        pwd
        echo "ERROR: cp $par $par2"
        exit 1;
      endif
    end

  endif

  ####### Motion Correction ###########
  if($DoMotCor) then
    pwd
    set ntmp = 1;
    set targstem = $fsd/001/f
    while($ntmp <= $Nruns) 
      set runstr = $fsd/`printf %03d $ntmp`;
      echo "---------- Motion Correction Run $ntmp -------------"
      set MF = ();
      if($MONLY)  set MF = "-scriptonly run-mc-afni-$ntmp"
      set instem  = $runstr/f
      set outstem = $runstr/fmc
      set cmd = "mc-afni -i $instem -o $outstem -t $targstem $MF -ipr $IPR -bpr $BPR"
      echo "-------------------------------------------- "
      pwd
      echo $cmd
      $cmd
      echo "-------------------------------------------- "
      @ ntmp = $ntmp + 1;
    end
    if($UseMotCor) set fmristem = fmc;
  endif

  ######### INorm ############
  if( $DoINorm ) then
    echo ---------------- INorm ----------------------
    set instems = ();
    foreach run ($Runs)
      pushd $fsd/$run > /dev/null
      set MF = "";
      if($MONLY) set MF = "-monly inorm.m"

      inorm -i $fmristem -TR $TR # -rescale $RescaleTarget $MF
      set rt = $status
      if ( $rt ) then
        echo "ERROR: inorm exited with $rt"
        exit -1;
      endif
      popd > /dev/null;
    end
  endif

  ######### SelXAvg ############
  if($DoSXA) then

    set instems = ();
    set pars    = ();
    foreach run ($Runs)
      set par     = `printf ../par/par-s%03d-r%03d.dat $SessionNo $run`;
      #set par     = par/par-0$run.dat
      set pars    = ($pars    -p $par);
      set instems = ($instems -i $fsd/$run/$fmristem);
      set par2 = $fsd/$run/par.dat
      cp $par $par2
    end

    if($SXAGammFit) then
      set GammaFit = "-gammafit $Delta $Tau"
    else
      set GammaFit = ""
    endif

    set MF = "";
    if($MONLY) set MF = "-monly sxa.m"

    set ECM = "";
    if($DoECM) set ECM = "-ecovmtx $ecovmtxstem";

    set args = ();
    set args = ($args -TR $TR -TER $TER -tw $TWEst -detrend )
    set args = ($args $instems $pars -o $hdrstem -basegment)
    set args = ($args -prestim $TPreStim $GammaFit $MF)
    set args = ($args -rescale $RescaleTarget -nskip $Nskip)
    set cmd = (selxavg2 $args)
    echo "---------------------------------------------------"
    pwd
    echo $cmd
    $cmd
    set rt = $status
    if($rt)then
      echo "ERROR: selxavg2 exited with $rt"
      exit -1;
    endif
  endif

  ########## Stxgrinder ##########
  if($DoStXG) then
    set MF = "";
    if($MONLY) set MF = "-monly stxg.m"

    set cmd = (stxgrinder -i $hdrstem -o $pstem )
    set cmd = ($cmd -pmin $pstem"min" -fsig $fsigstem $MF )
    set cmd = ($cmd -cmtx $CMtxFile)
    $cmd
    set rt = $status
    if($rt)then
      echo "ERROR: stxgrinder exited with $rt"
      exit -1;
    endif
  endif

  ########## HDR Error Evaluation ##########
  if($DoHDRErr) then
    set MF = "";
    if($MONLY) set MF = "-monly hdrerr.m"

    hdrerror -i $fsd/sxa/h_000.bfloat -o hdrerror.dat -roi $ROI \
           -sigamp $SigAmp -SNR $SNR\
           -delta $Delta -tau $Tau $MF &
    set rt = $status
    if($rt)then
      echo "ERROR: hdrerror exited with $rt"
      exit -1;
    endif
    set DoHDRErr = 0;
  endif

  ########## FPR Evaluation ##########
  if($DoFPR) then
    set MF = "";
    if($MONLY) set MF = "-monly fprshow.m"
    fpr -i $fsigstem"_000.bfloat" -o fpr.dat \
        -roi $ROI -maxalpha .2  $MF &
    set rt = $status 
    if($rt)then
      echo "ERROR: fpr exited with $rt"
      pwd
      exit -1;
    endif
    set DoFPR = 0;
  endif

  popd >& /dev/null

  set isstems = ($isstems -i $Session/$fsd/sxa/h);
  set wisstems = ($wisstems -i $Session/$fsd/sxa/h $w[$SessionNo]);

  @ SessionNo = $SessionNo + 1;
end # loop over sessions

############### Inter-Subject Averaging ##################
if($DoISFE) then
  set MF = "";
  if($MONLY) set MF = "-monly isx_fe.m"

  # -weighted $wisstems 
  set cmd = (isxavg-fe $MF $isstems -o isxavgfe/h)
  $cmd
  set rt = $status
  if($rt)then
    echo "ERROR: isxavg-fe exited with $rt"
    pwd
    echo $cmd
    exit -1;
  endif
endif

########## Stxgrinder ##########
if($DoISStXG) then
  set MF = "";
  if($MONLY) set MF = "-monly stx_fe.m"

  set hdrstem = isxavgfe/h
  set pstem   = isxavgfe/p
  stxgrinder -i $hdrstem -o $pstem  $MF\
               $Contrast  # -cmtx $CMtxFile 
  set rt = $status
  if($rt)then
    echo "ERROR: stxgrinder exited with $rt"
    exit -1;
  endif
endif

########## HDR Error Evaluation ##########
if($DoISHDRErr) then
    set MF = "";
    if($MONLY) set MF = "-monly hdrerr_fe.m"

    hdrerror -i isxavgfe/h_000.bfloat -o isxavgfe/hdrerror.dat -roi $ROI \
           -sigamp $SigAmp -SNR $SNR\
           -delta $Delta -tau $Tau $MF &
    set rt = $status
    if($rt)then
      echo "ERROR: hdrerror exited with $rt"
      exit -1;
    endif
endif

########## FPR Evaluation ##########
if($DoISFPR) then
    set MF = "";
    if($MONLY) set MF = "-monly fpr_fe.m"

    fpr -i isxavgfe/p_000.bfloat -o isxavgfe/fpr.dat \
        -maxalpha 1.0  $MF & #-roi $ROI 
    set rt = $status
    if($rt)then
      echo "ERROR: fpr exited with $rt"
      exit -1;
    endif
endif

############### Inter-Subject Averaging - random effects #########
if($DoISRE) then
  echo "-------------- ISAVG-RE -------------------------"
  set MF = "";
  if($MONLY) then
    set MF = "-monly isx_re.m"
    pwd
    echo "mfile is isx_re.m"
  endif

  set cmd = "isxavg-re $isstems $MF -sig isxavgre/p -minsig isxavgre/pmin -t isxavgre/t -avg isxavgre/avg   -cmtx $CMtxFile"
  $cmd
  set rt = $status
  if($rt)then
    echo "ERROR: isxavg-re exited with $rt"
    echo $cmd
    exit -1;
  endif
endif

########## FPR Evaluation ##########
if($DoISREFPR) then
    echo "-------------- FPR-RE -------------------------"
    set MF = "";
    if($MONLY) set MF = "-monly fpr_re.m"

    set cmd = "fpr -i isxavgre/p_000.bfloat -o isxavgre/fpr.dat -roi $ROI -maxalpha 1.0  $MF"
    $cmd
    set rt = $status
    if($rt)then
      echo "ERROR: fpr exited with $rt"
      echo $cmd
      exit -1;
    endif
endif

set EndTime = `date`;
echo "Started at $StartTime"
echo "Ended   at $EndTime"

exit 0;
