#!/bin/sh
# Copyright (c) 2002-09 Peter Guntert. All rights reserved.

# Create overview table of automated NOESY assignment and structure calculation
# Peter Guntert, 5-10-2002
# Modified version, Peter Guntert, 28-02-2005


# ------ Command line options ------

long=0
percent=0
options=lhp

optind=1
usage=""
eval par=\$$optind
while true; do
  case $par in
  --) optind=`expr $optind + 1`; break;;
  -?*) option=`echo X$par | sed 's/^X-\(.\).*/\1/'`
       if [ `echo $options | sed 's/.*'$option'.*/+/'` != "+" ]; then
         echo "$0: -$option: unknown option"; usage=1
       elif [ `echo $options | sed 's/.*'$option':.*/+/'` = "+" ]; then
         optind=`expr $optind + 1`
         eval $option=\$$optind
       else
         eval $option=1
       fi
       par=`echo X$par | sed 's/^X-./-/'`
       if [ "$par" = "-" ]; then 
         optind=`expr $optind + 1`
	 eval par=\$$optind
       fi
       ;;
  *) break;;
  esac
done
shift `expr $optind - 1`

if [ "$h" ]; then usage=1; fi
if [ "$usage" ]; then
  echo "Usage: $prog -hlp parameters ..."					         
  echo  									         
  echo "       -h	     help"						         
  echo "       -l            long, more detailed output"          
  echo "       -p            percentages instead of absolute values"          
  exit 2
fi
if [ "$l" ]; then long=1; fi
if [ "$p" ]; then percent=1; fi


prefix=$1

# ------- General parameters -------

for logfile in AUTO.out CANDID.out CALC.out $prefix.out; do
  if [ -f $logfile ]; then break; fi
done
if [ $# -ge 2 ]; then logfile=$2; fi
if [ -f $logfile ]; then
  awk '/^CYANA .* [(].*[)]/ { version=$0; end=""; }
       /^.*-.*-.* .*:.*:.*$/ { if (start=="") start=$0; else end=$0 }
       /Computation time for / { i=NF-1; t+=$i }
       /Total computation time/ { i=NF-1; t=$i }
       END { print ""
  	     print		"Program version                          : " version
  	     print		"Start time                               : " start 
  	     if (end!="") print "End time                                 : " end 
  	     if (t!=0) printf("%s%0.2f min\n","Computation time                         : ",t/60.0) 
  	   }
      ' $logfile
fi

echo "Directory                                : `uname -n`:`pwd`"
echo
        

# ------- Peak statistics -------

files=`ls ${prefix}cycle[1-9].noa 2>/dev/null`
if [ "$files" ]; then
  final=""; if [ -f ${prefix}final.cor ]; then final=1; fi
  awk 'FNR==1 { l=-1; insel=0; inuna=0 }
       /^  with additional assignment/ { nsel=nsav; }
       { if (l>=0) {
           if ((!long) && ($1=="in" || $1=="without" || $1=="not" || $2=="violation")) next;
  	   l++; if (cycle==1) line[l]=substr($0,5,43) 
	   if ($1=="Cross") { insel=0; inuna=0; }
  	   if (NF>=3 && $1!="Comparison" && $2!="peaks:") {
	     n=$NF+0
	     if (percent==0) line[l]=line[l] sprintf("%8d",n);
	     else if ($1=="selected") { insel=1; line[l]=line[l] sprintf("%8d",n); nsel=n; if (nsel<=0) nsel=1; }
	     else if ($1!="in" || inuna==0) line[l]=line[l] sprintf("%7.1f%%",(100.0/nsel)*n);
	     else line[l]=line[l] sprintf("%7.1f%%",(100.0/nselp[$2])*n);
	     if ($1=="unassigned") inuna=1
	     if (insel==1 && inuna==0 && $1=="in") { if (n<=0) n=1; nselp[$2]=n }
	   }
	 }
       }
       /^  Cross peaks with reference assignment/ { nsav=nsel; nsel=$NF+0; print nsav,nsel}
       /^    Peaks:$/ { l=0; cycle++; }
       END { printf("%s","Cycle                                    : ")
  	     for (i=1;i<=cycle;i++) printf("%8d",i)
  	     if (final) printf("   final");
  	     printf("\n\nPeaks:\n")
  	     for (i=1;i<=l;i++) print line[i]; }
      ' percent=$percent final=$final long=$long $files
  #    ' final=$final long=$long cycle[1-9].[an][so][sa]
fi
    

# ------- Upper distance limit statistics -------


final=""; if [ -f ${prefix}final.upl ]; then final=${prefix}final.upl; fi
awk 'FNR==1 { cycle++ }
     NF>=7 { nass[cycle]++;
             if ($7!="0.00") { nupl[cycle]++; msho=0; mmed=0; mlng=0; lev=1000000; }
	     nsho[cycle]=nsho[cycle]-msho; msho=0
	     nmed[cycle]=nmed[cycle]-mmed; mmed=0
	     nlng[cycle]=nlng[cycle]-mlng; mlng=0
	     l=$1-$4; if (l<0) l=-l; if (l<lev) lev=l;
	     if (lev<=1) msho=1
	     else if (lev<5) mmed=1
	     else mlng=1
	     nsho[cycle]=nsho[cycle]+msho
	     nmed[cycle]=nmed[cycle]+mmed
	     nlng[cycle]=nlng[cycle]+mlng
             }
     END { printf("%s","Upper distance limits:")
	   printf("\n%s","  total                                  : ")
           for (i=1;i<=cycle;i++) printf("%8d",nupl[i])
	   printf("\n%s","  short-range, |i-j|<=1                  : ")
           for (i=1;i<=cycle;i++) 
	     if (percent==0 || nupl[i]<=0) printf("%8d",nsho[i]) 
	     else printf("%7.1f%%",(100.0/nupl[i])*nsho[i])
	   printf("\n%s","  medium-range, 1<|i-j|<5                : ")
           for (i=1;i<=cycle;i++) 
	     if (percent==0 || nupl[i]<=0) printf("%8d",nmed[i]) 
	     else printf("%7.1f%%",(100.0/nupl[i])*nmed[i])
	   printf("\n%s","  long-range, |i-j|>=5                   : ")
           for (i=1;i<=cycle;i++) 
	     if (percent==0 || nupl[i]<=0) printf("%8d",nlng[i]) 
	     else printf("%7.1f%%",(100.0/nupl[i])*nlng[i])
	   printf("\n%s","  Average assignments/constraint         : ")
           for (i=1;i<=cycle;i++) printf("%8.2f",nass[i]/nupl[i]) 
	   printf("\n") }
    ' percent=$percent ${prefix}cycle[1-9].upl $final

    
# ------- Target function and RMSD statistics -------

final=""; if [ -f ${prefix}final.ovw ]; then final=${prefix}final.ovw; fi
awk '/^    Ave / { cycle++; tf[cycle]=$2; nrange=0 }
     /^    RMSDs for residues/ { nrange++; range[nrange]=substr($0,24,length($0)-23-1)
                                 biasb[nrange*100+cycle]=-1.0; biash[nrange*100+cycle]=-1.0 }
     /^    Average backbone RMSD/  { rmsdb[nrange*100+cycle]=$7 }
     /^    Average heavy atom RMSD/  { rmsdh[nrange*100+cycle]=$8 }
     /^    Backbone RMSD to reference/  { biasb[nrange*100+cycle]=$6 }
     /^    Heavy atom RMSD to reference/  { biash[nrange*100+cycle]=$7 }
     END { printf("\n%s","Average target function value            : ")
           for (i=1;i<=cycle;i++) printf("%8.2f",tf[i])
	   printf("\n")
	   for (irange=1;irange<=nrange;irange++) {
	     printf("\nRMSD (residues %s):\n",range[irange])
	     printf("%s","  Average backbone RMSD to mean          : ")
             for (i=1;i<=cycle;i++) printf("%8.2f",rmsdb[irange*100+i])
	     printf("\n")
	     if (biasb[irange*100+1]>=0.0) {
	       printf("%s","  Backbone RMSD to reference             : ")
               for (i=1;i<=cycle;i++) printf("%8.2f",biasb[irange*100+i])
	       printf("\n") }
	     printf("%s","  Average heavy atom RMSD to mean        : ")
             for (i=1;i<=cycle;i++) printf("%8.2f",rmsdh[irange*100+i])
	     printf("\n")
	     if (biash[irange*100+1]>=0.0) {
	       printf("%s","  Heavy atom RMSD to reference           : ")
               for (i=1;i<=cycle;i++) printf("%8.2f",biash[irange*100+i])
	       printf("\n") }
	     }
	 }
    ' ${prefix}cycle[1-9].ovw $final
echo
