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

# Create overview table of automated NOESY assignment and structure calculation
# Peter Guentert, 5-10-2002
# Modified version, Peter Guentert, 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.pdb ]; 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; mint=0; lev=1000000; }
             nsho[cycle]=nsho[cycle]-msho; msho=0
             nmed[cycle]=nmed[cycle]-mmed; mmed=0
             nlng[cycle]=nlng[cycle]-mlng; mlng=0
             nint[cycle]=nint[cycle]-mint; mint=0
             r1=$1; r2=$4
             c1=substr(r1,1,1); c2=substr(r2,1,1)
             if (index("0123456789",c1)>0) c1=""
             else r1=substr(r1,2)
             if (index("0123456789",c2)>0) c2=""
             else r2=substr(r2,2)
             if (c1==c2) { l=r1-r2; if (l<0) l=-l; if (l<lev) lev=l }
             #print $1,$4,r1,r2,c1,c2
             if (lev<=1) msho=1
             else if (lev<5) mmed=1
             else if (lev<1000000) mlng=1
             else mint=1
             nsho[cycle]=nsho[cycle]+msho
             nmed[cycle]=nmed[cycle]+mmed
             nlng[cycle]=nlng[cycle]+mlng
             nint[cycle]=nint[cycle]+mint
             }
     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])
           ninter=0; for (i=1;i<=cycle;i++) ninter+=nint[i]
           if (ninter==0) printf("\n%s","  long-range, |i-j|>=5                   : ")
           else printf("\n%s","  long-range, |i-j|>=5 intra-chain       : ")
           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])
           if (ninter>0) {
             printf("\n%s","  inter-chain                            : ")
             for (i=1;i<=cycle;i++)
               if (percent==0 || nupl[i]<=0) printf("%8d",nint[i])
               else printf("%7.1f%%",(100.0/nupl[i])*nint[i])
             }
           printf("\n%s","  Average assignments/restraint          : ")
           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
                                 driftb[nrange*100+cycle]=0.0; drifth[nrange*100+cycle]=0.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 }
     /^    Backbone RMSD to final/  { driftb[nrange*100+cycle]=$6 }
     /^    Heavy atom RMSD to final/  { drifth[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") }
             if (driftb[irange*100+1]>=0.0) {
               printf("%s","  Backbone RMSD to final                 : ")
               for (i=1;i<=cycle;i++) printf("%8.2f",driftb[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") }
             if (drifth[irange*100+1]>=0.0) {
               printf("%s","  Heavy atom RMSD to final               : ")
               for (i=1;i<=cycle;i++) printf("%8.2f",drifth[irange*100+i])
               printf("\n") }
             }
         }
    ' ${prefix}cycle[1-9].ovw $final
echo
