Code beautification with uncrustify
[alexxy/gromacs.git] / src / tools / gmx_disre.c
index c1fe188fc32e0be5153c6cf43bc6f841d571823a..408448a474c91e4e0207730e340f6edd1efeceb0 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * 
+ *
  *                This source code is part of
- * 
+ *
  *                 G   R   O   M   A   C   S
- * 
+ *
  *          GROningen MAchine for Chemical Simulations
- * 
+ *
  *                        VERSION 3.2.0
  * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * of the License, or (at your option) any later version.
- * 
+ *
  * If you want to redistribute modifications, please consider that
  * scientific software is very special. Version control is crucial -
  * bugs must be traceable. We will be happy to consider code for
  * inclusion in the official distribution, but derived work must not
  * be called official GROMACS. Details are found in the README & COPYING
  * files - if they are missing, get the official version at www.gromacs.org.
- * 
+ *
  * To help us fund GROMACS development, we humbly ask that you cite
  * the papers on the package - you can find them in the top README file.
- * 
+ *
  * For more info, check our website at http://www.gromacs.org
- * 
+ *
  * And Hey:
  * Green Red Orange Magenta Azure Cyan Skyblue
  */
 
 
 typedef struct {
-  int n;
-  real v;
+    int  n;
+    real v;
 } t_toppop;
 
-t_toppop *top=NULL;
-int      ntop=0;
+t_toppop *top  = NULL;
+int       ntop = 0;
 
 typedef struct {
-  int  nv,nframes;
-  real sumv,averv,maxv;
-  real *aver1,*aver2,*aver_3,*aver_6;
+    int   nv, nframes;
+    real  sumv, averv, maxv;
+    real *aver1, *aver2, *aver_3, *aver_6;
 } t_dr_result;
 
 static void init5(int n)
 {
-  ntop=n;
-  snew(top,ntop);
+    ntop = n;
+    snew(top, ntop);
 }
 
 static void reset5(void)
 {
-  int i;
+    int i;
 
-  for(i=0; (i<ntop); i++) {
-    top[i].n=-1;
-    top[i].v= 0;
-  }
+    for (i = 0; (i < ntop); i++)
+    {
+        top[i].n = -1;
+        top[i].v = 0;
+    }
 }
 
-int tpcomp(const void *a,const void *b)
+int tpcomp(const void *a, const void *b)
 {
-  t_toppop *tpa;
-  t_toppop *tpb;
+    t_toppop *tpa;
+    t_toppop *tpb;
 
-  tpa=(t_toppop *)a;
-  tpb=(t_toppop *)b;
+    tpa = (t_toppop *)a;
+    tpb = (t_toppop *)b;
 
-  return  (1e7*(tpb->v-tpa->v));
+    return  (1e7*(tpb->v-tpa->v));
 }
 
-static void add5(int ndr,real viol)
+static void add5(int ndr, real viol)
 {
-  int i,mini;
-  
-  mini=0;
-  for(i=1; (i<ntop); i++)
-    if (top[i].v < top[mini].v) 
-      mini=i;
-  if (viol > top[mini].v) {
-    top[mini].v=viol;
-    top[mini].n=ndr;
-  }
+    int i, mini;
+
+    mini = 0;
+    for (i = 1; (i < ntop); i++)
+    {
+        if (top[i].v < top[mini].v)
+        {
+            mini = i;
+        }
+    }
+    if (viol > top[mini].v)
+    {
+        top[mini].v = viol;
+        top[mini].n = ndr;
+    }
 }
 
 static void print5(FILE *fp)
 {
-  int i;
-
-  qsort(top,ntop,sizeof(top[0]),tpcomp);
-  fprintf(fp,"Index:");
-  for(i=0; (i<ntop); i++)
-    fprintf(fp," %6d",top[i].n);
-  fprintf(fp,"\nViol: ");
-  for(i=0; (i<ntop); i++)
-    fprintf(fp," %6.3f",top[i].v);
-  fprintf(fp,"\n");
+    int i;
+
+    qsort(top, ntop, sizeof(top[0]), tpcomp);
+    fprintf(fp, "Index:");
+    for (i = 0; (i < ntop); i++)
+    {
+        fprintf(fp, " %6d", top[i].n);
+    }
+    fprintf(fp, "\nViol: ");
+    for (i = 0; (i < ntop); i++)
+    {
+        fprintf(fp, " %6.3f", top[i].v);
+    }
+    fprintf(fp, "\n");
 }
 
-static void check_viol(FILE *log,t_commrec *cr,
-                      t_ilist *disres,t_iparams forceparams[],
-                      t_functype functype[],rvec x[],rvec f[],
-                      t_forcerec *fr,t_pbc *pbc,t_graph *g,t_dr_result dr[],
-                      int clust_id,int isize,atom_id index[],real vvindex[],
-                      t_fcdata *fcd)
+static void check_viol(FILE *log, t_commrec *cr,
+                       t_ilist *disres, t_iparams forceparams[],
+                       t_functype functype[], rvec x[], rvec f[],
+                       t_forcerec *fr, t_pbc *pbc, t_graph *g, t_dr_result dr[],
+                       int clust_id, int isize, atom_id index[], real vvindex[],
+                       t_fcdata *fcd)
 {
-  t_iatom *forceatoms;
-  int     i,j,nat,n,type,nviol,ndr,label;
-  real    ener,rt,mviol,tviol,viol,lam,dvdl,drt;
-  static  gmx_bool bFirst=TRUE;
-  
-  lam  =0;
-  dvdl =0;
-  tviol=0;
-  nviol=0;
-  mviol=0;
-  ndr=0;
-  if (ntop)
-    reset5();
-  forceatoms=disres->iatoms;
-  for(j=0; (j<isize); j++) {
-    vvindex[j]=0;
-  }
-  nat = interaction_function[F_DISRES].nratoms+1; 
-  for(i=0; (i<disres->nr); ) {
-    type  = forceatoms[i];
-    n     = 0;
-    label = forceparams[type].disres.label;
-    if (debug) 
-      fprintf(debug,"DISRE: ndr = %d, label = %d  i=%d, n =%d\n",
-             ndr,label,i,n);
-    if (ndr != label) 
-      gmx_fatal(FARGS,"tpr inconsistency. ndr = %d, label = %d\n",ndr,label);
-    do {
-      n += nat;
-    } while (((i+n) < disres->nr) && 
-            (forceparams[forceatoms[i+n]].disres.label == label));
-    
-    calc_disres_R_6(cr->ms,n,&forceatoms[i],forceparams,
-                   (const rvec*)x,pbc,fcd,NULL);
-
-    if (fcd->disres.Rt_6[0] <= 0) 
-      gmx_fatal(FARGS,"ndr = %d, rt_6 = %f",ndr,fcd->disres.Rt_6[0]);
-    
-    rt = pow(fcd->disres.Rt_6[0],-1.0/6.0);
-    dr[clust_id].aver1[ndr]  += rt;
-    dr[clust_id].aver2[ndr]  += sqr(rt);
-    drt = pow(rt,-3.0);
-    dr[clust_id].aver_3[ndr] += drt;
-    dr[clust_id].aver_6[ndr] += fcd->disres.Rt_6[0];
-    
-    ener=interaction_function[F_DISRES].ifunc(n,&forceatoms[i],forceparams,
-                                             (const rvec*)x,f,fr->fshift,
-                                             pbc,g,lam,&dvdl,NULL,fcd,NULL);
-    viol = fcd->disres.sumviol;
-    
-    if (viol > 0) {
-      nviol++;
-      if (ntop)
-       add5(forceparams[type].disres.label,viol);
-      if (viol > mviol) 
-       mviol = viol;
-      tviol += viol;
-      for(j=0; (j<isize); j++) {
-       if (index[j] == forceparams[type].disres.label)
-         vvindex[j]=pow(fcd->disres.Rt_6[0],-1.0/6.0);
-       }
-    }
-    ndr ++;
-    i   += n;
-  }
-  dr[clust_id].nv   = nviol;
-  dr[clust_id].maxv = mviol;
-  dr[clust_id].sumv = tviol;
-  dr[clust_id].averv= tviol/ndr;
-  dr[clust_id].nframes++;
-  
-  if (bFirst) {
-    fprintf(stderr,"\nThere are %d restraints and %d pairs\n",
-           ndr,disres->nr/nat);
-    bFirst = FALSE;
-  }
-  if (ntop)
-    print5(log);
+    t_iatom         *forceatoms;
+    int              i, j, nat, n, type, nviol, ndr, label;
+    real             ener, rt, mviol, tviol, viol, lam, dvdl, drt;
+    static  gmx_bool bFirst = TRUE;
+
+    lam   = 0;
+    dvdl  = 0;
+    tviol = 0;
+    nviol = 0;
+    mviol = 0;
+    ndr   = 0;
+    if (ntop)
+    {
+        reset5();
+    }
+    forceatoms = disres->iatoms;
+    for (j = 0; (j < isize); j++)
+    {
+        vvindex[j] = 0;
+    }
+    nat = interaction_function[F_DISRES].nratoms+1;
+    for (i = 0; (i < disres->nr); )
+    {
+        type  = forceatoms[i];
+        n     = 0;
+        label = forceparams[type].disres.label;
+        if (debug)
+        {
+            fprintf(debug, "DISRE: ndr = %d, label = %d  i=%d, n =%d\n",
+                    ndr, label, i, n);
+        }
+        if (ndr != label)
+        {
+            gmx_fatal(FARGS, "tpr inconsistency. ndr = %d, label = %d\n", ndr, label);
+        }
+        do
+        {
+            n += nat;
+        }
+        while (((i+n) < disres->nr) &&
+               (forceparams[forceatoms[i+n]].disres.label == label));
+
+        calc_disres_R_6(cr->ms, n, &forceatoms[i], forceparams,
+                        (const rvec*)x, pbc, fcd, NULL);
+
+        if (fcd->disres.Rt_6[0] <= 0)
+        {
+            gmx_fatal(FARGS, "ndr = %d, rt_6 = %f", ndr, fcd->disres.Rt_6[0]);
+        }
+
+        rt = pow(fcd->disres.Rt_6[0], -1.0/6.0);
+        dr[clust_id].aver1[ndr]  += rt;
+        dr[clust_id].aver2[ndr]  += sqr(rt);
+        drt = pow(rt, -3.0);
+        dr[clust_id].aver_3[ndr] += drt;
+        dr[clust_id].aver_6[ndr] += fcd->disres.Rt_6[0];
+
+        ener = interaction_function[F_DISRES].ifunc(n, &forceatoms[i], forceparams,
+                                                    (const rvec*)x, f, fr->fshift,
+                                                    pbc, g, lam, &dvdl, NULL, fcd, NULL);
+        viol = fcd->disres.sumviol;
+
+        if (viol > 0)
+        {
+            nviol++;
+            if (ntop)
+            {
+                add5(forceparams[type].disres.label, viol);
+            }
+            if (viol > mviol)
+            {
+                mviol = viol;
+            }
+            tviol += viol;
+            for (j = 0; (j < isize); j++)
+            {
+                if (index[j] == forceparams[type].disres.label)
+                {
+                    vvindex[j] = pow(fcd->disres.Rt_6[0], -1.0/6.0);
+                }
+            }
+        }
+        ndr++;
+        i   += n;
+    }
+    dr[clust_id].nv    = nviol;
+    dr[clust_id].maxv  = mviol;
+    dr[clust_id].sumv  = tviol;
+    dr[clust_id].averv = tviol/ndr;
+    dr[clust_id].nframes++;
+
+    if (bFirst)
+    {
+        fprintf(stderr, "\nThere are %d restraints and %d pairs\n",
+                ndr, disres->nr/nat);
+        bFirst = FALSE;
+    }
+    if (ntop)
+    {
+        print5(log);
+    }
 }
 
 typedef struct {
-  int  index;
-  gmx_bool bCore;
-  real up1,r,rT3,rT6,viol,violT3,violT6;
+    int      index;
+    gmx_bool bCore;
+    real     up1, r, rT3, rT6, viol, violT3, violT6;
 } t_dr_stats;
 
-static int drs_comp(const void *a,const void *b)
+static int drs_comp(const void *a, const void *b)
 {
-  t_dr_stats *da,*db;
-  
-  da = (t_dr_stats *)a;
-  db = (t_dr_stats *)b;
-  
-  if (da->viol > db->viol)
-    return -1;
-  else if (da->viol < db->viol)
-    return 1;
-  else
-    return 0;
+    t_dr_stats *da, *db;
+
+    da = (t_dr_stats *)a;
+    db = (t_dr_stats *)b;
+
+    if (da->viol > db->viol)
+    {
+        return -1;
+    }
+    else if (da->viol < db->viol)
+    {
+        return 1;
+    }
+    else
+    {
+        return 0;
+    }
 }
 
-static void dump_dump(FILE *log,int ndr,t_dr_stats drs[])
+static void dump_dump(FILE *log, int ndr, t_dr_stats drs[])
 {
-  static const char *core[] = { "All restraints", "Core restraints" };
-  static const char *tp[]   = { "linear", "third power", "sixth power" };
-  real viol_tot,viol_max,viol=0;
-  gmx_bool bCore;
-  int  nviol,nrestr;
-  int  i,kkk;
-
-  for(bCore = FALSE; (bCore <= TRUE); bCore++) {
-    for(kkk=0; (kkk<3); kkk++) {
-      viol_tot  = 0;
-      viol_max  = 0;
-      nviol     = 0;
-      nrestr    = 0;
-      for(i=0; (i<ndr); i++) {
-       if (!bCore || (bCore && drs[i].bCore)) {
-         switch (kkk) {
-         case 0:
-           viol = drs[i].viol;
-           break;
-         case 1: 
-           viol = drs[i].violT3;
-           break;
-         case 2:
-           viol = drs[i].violT6;
-           break;
-         default:
-           gmx_incons("Dumping violations");
-         }
-         viol_max     = max(viol_max,viol);
-         if (viol > 0)
-           nviol++;
-         viol_tot  += viol;
-         nrestr++;
-       }
-      }
-      if ((nrestr > 0) || (bCore && (nrestr < ndr))) {
-       fprintf(log,"\n");
-       fprintf(log,"+++++++ %s ++++++++\n",core[bCore]);
-       fprintf(log,"+++++++ Using %s averaging: ++++++++\n",tp[kkk]);
-       fprintf(log,"Sum of violations: %8.3f nm\n",viol_tot);
-       if (nrestr > 0)
-         fprintf(log,"Average violation: %8.3f nm\n",viol_tot/nrestr);
-       fprintf(log,"Largest violation: %8.3f nm\n",viol_max);
-       fprintf(log,"Number of violated restraints: %d/%d\n",nviol,nrestr);
-      }
-    }
-  }
+    static const char *core[] = { "All restraints", "Core restraints" };
+    static const char *tp[]   = { "linear", "third power", "sixth power" };
+    real               viol_tot, viol_max, viol = 0;
+    gmx_bool           bCore;
+    int                nviol, nrestr;
+    int                i, kkk;
+
+    for (bCore = FALSE; (bCore <= TRUE); bCore++)
+    {
+        for (kkk = 0; (kkk < 3); kkk++)
+        {
+            viol_tot  = 0;
+            viol_max  = 0;
+            nviol     = 0;
+            nrestr    = 0;
+            for (i = 0; (i < ndr); i++)
+            {
+                if (!bCore || (bCore && drs[i].bCore))
+                {
+                    switch (kkk)
+                    {
+                        case 0:
+                            viol = drs[i].viol;
+                            break;
+                        case 1:
+                            viol = drs[i].violT3;
+                            break;
+                        case 2:
+                            viol = drs[i].violT6;
+                            break;
+                        default:
+                            gmx_incons("Dumping violations");
+                    }
+                    viol_max     = max(viol_max, viol);
+                    if (viol > 0)
+                    {
+                        nviol++;
+                    }
+                    viol_tot  += viol;
+                    nrestr++;
+                }
+            }
+            if ((nrestr > 0) || (bCore && (nrestr < ndr)))
+            {
+                fprintf(log, "\n");
+                fprintf(log, "+++++++ %s ++++++++\n", core[bCore]);
+                fprintf(log, "+++++++ Using %s averaging: ++++++++\n", tp[kkk]);
+                fprintf(log, "Sum of violations: %8.3f nm\n", viol_tot);
+                if (nrestr > 0)
+                {
+                    fprintf(log, "Average violation: %8.3f nm\n", viol_tot/nrestr);
+                }
+                fprintf(log, "Largest violation: %8.3f nm\n", viol_max);
+                fprintf(log, "Number of violated restraints: %d/%d\n", nviol, nrestr);
+            }
+        }
+    }
 }
 
-static void dump_viol(FILE *log,int ndr,t_dr_stats *drs,gmx_bool bLinear)
+static void dump_viol(FILE *log, int ndr, t_dr_stats *drs, gmx_bool bLinear)
 {
-  int i;
-  
-  fprintf(log,"Restr. Core     Up1     <r>   <rT3>   <rT6>  <viol><violT3><violT6>\n");
-  for(i=0; (i<ndr); i++) {
-    if (bLinear  && (drs[i].viol == 0))
-      break;
-    fprintf(log,"%6d%5s%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n",
-           drs[i].index,yesno_names[drs[i].bCore],
-           drs[i].up1,drs[i].r,drs[i].rT3,drs[i].rT6,
-           drs[i].viol,drs[i].violT3,drs[i].violT6);
-  }
+    int i;
+
+    fprintf(log, "Restr. Core     Up1     <r>   <rT3>   <rT6>  <viol><violT3><violT6>\n");
+    for (i = 0; (i < ndr); i++)
+    {
+        if (bLinear  && (drs[i].viol == 0))
+        {
+            break;
+        }
+        fprintf(log, "%6d%5s%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n",
+                drs[i].index, yesno_names[drs[i].bCore],
+                drs[i].up1, drs[i].r, drs[i].rT3, drs[i].rT6,
+                drs[i].viol, drs[i].violT3, drs[i].violT6);
+    }
 }
 
-static gmx_bool is_core(int i,int isize,atom_id index[])
-{
-  int kk;
-  gmx_bool bIC = FALSE;
-  
-  for(kk=0; !bIC && (kk<isize); kk++)
-    bIC = (index[kk] == i);
-    
-  return bIC;
-}            
-
-static void dump_stats(FILE *log,int nsteps,int ndr,t_ilist *disres,
-                      t_iparams ip[],t_dr_result *dr,
-                      int isize,atom_id index[],t_atoms *atoms)
+static gmx_bool is_core(int i, int isize, atom_id index[])
 {
-  int  i,j,nra;
-  t_dr_stats *drs;
-
-  fprintf(log,"\n");
-  fprintf(log,"++++++++++++++ STATISTICS ++++++++++++++++++++++++\n");  
-  snew(drs,ndr);
-  j         = 0;
-  nra       = interaction_function[F_DISRES].nratoms+1;
-  for(i=0; (i<ndr); i++) {
-    /* Search for the appropriate restraint */
-    for( ; (j<disres->nr); j+=nra) {
-      if (ip[disres->iatoms[j]].disres.label == i)
-       break;
-    }
-    drs[i].index  = i;
-    drs[i].bCore  = is_core(i,isize,index);
-    drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
-    drs[i].r      = dr->aver1[i]/nsteps;
-    drs[i].rT3    = pow(dr->aver_3[i]/nsteps,-1.0/3.0);
-    drs[i].rT6    = pow(dr->aver_6[i]/nsteps,-1.0/6.0);
-    drs[i].viol   = max(0,drs[i].r-drs[i].up1);
-    drs[i].violT3 = max(0,drs[i].rT3-drs[i].up1);
-    drs[i].violT6 = max(0,drs[i].rT6-drs[i].up1);
-    if (atoms) {
-      int j1 = disres->iatoms[j+1];
-      int j2 = disres->iatoms[j+2];
-      atoms->pdbinfo[j1].bfac += drs[i].violT3*5;
-      atoms->pdbinfo[j2].bfac += drs[i].violT3*5;
-    }
-  }
-  dump_viol(log,ndr,drs,FALSE);
-  
-  fprintf(log,"+++ Sorted by linear averaged violations: +++\n");
-  qsort(drs,ndr,sizeof(drs[0]),drs_comp);
-  dump_viol(log,ndr,drs,TRUE);
-             
-  dump_dump(log,ndr,drs);
-  
-  sfree(drs);
+    int      kk;
+    gmx_bool bIC = FALSE;
+
+    for (kk = 0; !bIC && (kk < isize); kk++)
+    {
+        bIC = (index[kk] == i);
+    }
+
+    return bIC;
 }
 
-static void dump_clust_stats(FILE *fp,int ndr,t_ilist *disres,
-                            t_iparams ip[],t_blocka *clust,t_dr_result dr[],
-                            char *clust_name[],int isize,atom_id index[])
+static void dump_stats(FILE *log, int nsteps, int ndr, t_ilist *disres,
+                       t_iparams ip[], t_dr_result *dr,
+                       int isize, atom_id index[], t_atoms *atoms)
 {
-  int    i,j,k,nra,mmm=0;
-  double sumV,maxV,sumVT3,sumVT6,maxVT3,maxVT6;
-  t_dr_stats *drs;
-
-  fprintf(fp,"\n");
-  fprintf(fp,"++++++++++++++ STATISTICS ++++++++++++++++++++++\n");  
-  fprintf(fp,"Cluster  NFrames    SumV      MaxV     SumVT     MaxVT     SumVS     MaxVS\n");
-
-  snew(drs,ndr);
-  
-  for(k=0; (k<clust->nr); k++) {
-    if (dr[k].nframes == 0)
-      continue;
-    if (dr[k].nframes != (clust->index[k+1]-clust->index[k])) 
-      gmx_fatal(FARGS,"Inconsistency in cluster %s.\n"
-               "Found %d frames in trajectory rather than the expected %d\n",
-               clust_name[k],dr[k].nframes,
-               clust->index[k+1]-clust->index[k]);
-    if (!clust_name[k])
-      gmx_fatal(FARGS,"Inconsistency with cluster %d. Invalid name",k);
+    int         i, j, nra;
+    t_dr_stats *drs;
+
+    fprintf(log, "\n");
+    fprintf(log, "++++++++++++++ STATISTICS ++++++++++++++++++++++++\n");
+    snew(drs, ndr);
     j         = 0;
     nra       = interaction_function[F_DISRES].nratoms+1;
-    sumV = sumVT3 = sumVT6 = maxV = maxVT3 = maxVT6 = 0;
-    for(i=0; (i<ndr); i++) {
-      /* Search for the appropriate restraint */
-      for( ; (j<disres->nr); j+=nra) {
-       if (ip[disres->iatoms[j]].disres.label == i)
-         break;
-      }
-      drs[i].index  = i;
-      drs[i].bCore  = is_core(i,isize,index);
-      drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
-      drs[i].r      = dr[k].aver1[i]/dr[k].nframes;
-      if ((dr[k].aver_3[i] <= 0) || (dr[k].aver_3[i] != dr[k].aver_3[i]))
-       gmx_fatal(FARGS,"dr[%d].aver_3[%d] = %f",k,i,dr[k].aver_3[i]);
-      drs[i].rT3    = pow(dr[k].aver_3[i]/dr[k].nframes,-1.0/3.0);
-      drs[i].rT6    = pow(dr[k].aver_6[i]/dr[k].nframes,-1.0/6.0);
-      drs[i].viol   = max(0,drs[i].r-drs[i].up1);
-      drs[i].violT3 = max(0,drs[i].rT3-drs[i].up1);
-      drs[i].violT6 = max(0,drs[i].rT6-drs[i].up1);
-      sumV   += drs[i].viol;
-      sumVT3 += drs[i].violT3;
-      sumVT6 += drs[i].violT6;
-      maxV    = max(maxV,drs[i].viol);
-      maxVT3  = max(maxVT3,drs[i].violT3);
-      maxVT6  = max(maxVT6,drs[i].violT6);
-    }
-    if (strcmp(clust_name[k],"1000") == 0) {
-      mmm ++;
-    }
-    fprintf(fp,"%-10s%6d%8.3f  %8.3f  %8.3f  %8.3f  %8.3f  %8.3f\n",
-           clust_name[k],
-           dr[k].nframes,sumV,maxV,sumVT3,maxVT3,sumVT6,maxVT6);
-  
-  }
-  fflush(fp);
-  sfree(drs);
+    for (i = 0; (i < ndr); i++)
+    {
+        /* Search for the appropriate restraint */
+        for (; (j < disres->nr); j += nra)
+        {
+            if (ip[disres->iatoms[j]].disres.label == i)
+            {
+                break;
+            }
+        }
+        drs[i].index  = i;
+        drs[i].bCore  = is_core(i, isize, index);
+        drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
+        drs[i].r      = dr->aver1[i]/nsteps;
+        drs[i].rT3    = pow(dr->aver_3[i]/nsteps, -1.0/3.0);
+        drs[i].rT6    = pow(dr->aver_6[i]/nsteps, -1.0/6.0);
+        drs[i].viol   = max(0, drs[i].r-drs[i].up1);
+        drs[i].violT3 = max(0, drs[i].rT3-drs[i].up1);
+        drs[i].violT6 = max(0, drs[i].rT6-drs[i].up1);
+        if (atoms)
+        {
+            int j1 = disres->iatoms[j+1];
+            int j2 = disres->iatoms[j+2];
+            atoms->pdbinfo[j1].bfac += drs[i].violT3*5;
+            atoms->pdbinfo[j2].bfac += drs[i].violT3*5;
+        }
+    }
+    dump_viol(log, ndr, drs, FALSE);
+
+    fprintf(log, "+++ Sorted by linear averaged violations: +++\n");
+    qsort(drs, ndr, sizeof(drs[0]), drs_comp);
+    dump_viol(log, ndr, drs, TRUE);
+
+    dump_dump(log, ndr, drs);
+
+    sfree(drs);
+}
+
+static void dump_clust_stats(FILE *fp, int ndr, t_ilist *disres,
+                             t_iparams ip[], t_blocka *clust, t_dr_result dr[],
+                             char *clust_name[], int isize, atom_id index[])
+{
+    int         i, j, k, nra, mmm = 0;
+    double      sumV, maxV, sumVT3, sumVT6, maxVT3, maxVT6;
+    t_dr_stats *drs;
+
+    fprintf(fp, "\n");
+    fprintf(fp, "++++++++++++++ STATISTICS ++++++++++++++++++++++\n");
+    fprintf(fp, "Cluster  NFrames    SumV      MaxV     SumVT     MaxVT     SumVS     MaxVS\n");
+
+    snew(drs, ndr);
+
+    for (k = 0; (k < clust->nr); k++)
+    {
+        if (dr[k].nframes == 0)
+        {
+            continue;
+        }
+        if (dr[k].nframes != (clust->index[k+1]-clust->index[k]))
+        {
+            gmx_fatal(FARGS, "Inconsistency in cluster %s.\n"
+                      "Found %d frames in trajectory rather than the expected %d\n",
+                      clust_name[k], dr[k].nframes,
+                      clust->index[k+1]-clust->index[k]);
+        }
+        if (!clust_name[k])
+        {
+            gmx_fatal(FARGS, "Inconsistency with cluster %d. Invalid name", k);
+        }
+        j         = 0;
+        nra       = interaction_function[F_DISRES].nratoms+1;
+        sumV      = sumVT3 = sumVT6 = maxV = maxVT3 = maxVT6 = 0;
+        for (i = 0; (i < ndr); i++)
+        {
+            /* Search for the appropriate restraint */
+            for (; (j < disres->nr); j += nra)
+            {
+                if (ip[disres->iatoms[j]].disres.label == i)
+                {
+                    break;
+                }
+            }
+            drs[i].index  = i;
+            drs[i].bCore  = is_core(i, isize, index);
+            drs[i].up1    = ip[disres->iatoms[j]].disres.up1;
+            drs[i].r      = dr[k].aver1[i]/dr[k].nframes;
+            if ((dr[k].aver_3[i] <= 0) || (dr[k].aver_3[i] != dr[k].aver_3[i]))
+            {
+                gmx_fatal(FARGS, "dr[%d].aver_3[%d] = %f", k, i, dr[k].aver_3[i]);
+            }
+            drs[i].rT3    = pow(dr[k].aver_3[i]/dr[k].nframes, -1.0/3.0);
+            drs[i].rT6    = pow(dr[k].aver_6[i]/dr[k].nframes, -1.0/6.0);
+            drs[i].viol   = max(0, drs[i].r-drs[i].up1);
+            drs[i].violT3 = max(0, drs[i].rT3-drs[i].up1);
+            drs[i].violT6 = max(0, drs[i].rT6-drs[i].up1);
+            sumV         += drs[i].viol;
+            sumVT3       += drs[i].violT3;
+            sumVT6       += drs[i].violT6;
+            maxV          = max(maxV, drs[i].viol);
+            maxVT3        = max(maxVT3, drs[i].violT3);
+            maxVT6        = max(maxVT6, drs[i].violT6);
+        }
+        if (strcmp(clust_name[k], "1000") == 0)
+        {
+            mmm++;
+        }
+        fprintf(fp, "%-10s%6d%8.3f  %8.3f  %8.3f  %8.3f  %8.3f  %8.3f\n",
+                clust_name[k],
+                dr[k].nframes, sumV, maxV, sumVT3, maxVT3, sumVT6, maxVT6);
+
+    }
+    fflush(fp);
+    sfree(drs);
 }
 
-static void init_dr_res(t_dr_result *dr,int ndr)
+static void init_dr_res(t_dr_result *dr, int ndr)
 {
-  snew(dr->aver1,ndr+1);
-  snew(dr->aver2,ndr+1);
-  snew(dr->aver_3,ndr+1);
-  snew(dr->aver_6,ndr+1);
-  dr->nv      = 0;
-  dr->nframes = 0;
-  dr->sumv    = 0;
-  dr->maxv    = 0;
-  dr->averv   = 0;
+    snew(dr->aver1, ndr+1);
+    snew(dr->aver2, ndr+1);
+    snew(dr->aver_3, ndr+1);
+    snew(dr->aver_6, ndr+1);
+    dr->nv      = 0;
+    dr->nframes = 0;
+    dr->sumv    = 0;
+    dr->maxv    = 0;
+    dr->averv   = 0;
 }
 
-static void dump_disre_matrix(const char *fn,t_dr_result *dr,int ndr,
-                             int nsteps,t_idef *idef,gmx_mtop_t *mtop,
-                             real max_dr,int nlevels,gmx_bool bThird)
+static void dump_disre_matrix(const char *fn, t_dr_result *dr, int ndr,
+                              int nsteps, t_idef *idef, gmx_mtop_t *mtop,
+                              real max_dr, int nlevels, gmx_bool bThird)
 {
-  FILE     *fp;
-  int      *resnr;
-  int      n_res,a_offset,mb,mol,a;
-  t_atoms  *atoms;
-  int      iii,i,j,nra,nratoms,tp,ri,rj,index,nlabel,label;
-  atom_id  ai,aj,*ptr;
-  real     **matrix,*t_res,hi,*w_dr,rav,rviol;
-  t_rgb    rlo = { 1, 1, 1 };
-  t_rgb    rhi = { 0, 0, 0 };
-  if (fn == NULL)
-    return;
-
-  snew(resnr,mtop->natoms);
-  n_res = 0;
-  a_offset = 0;
-  for(mb=0; mb<mtop->nmolblock; mb++) {
-    atoms = &mtop->moltype[mtop->molblock[mb].type].atoms;
-    for(mol=0; mol<mtop->molblock[mb].nmol; mol++) {
-      for(a=0; a<atoms->nr; a++) {
-       resnr[a_offset+a] = n_res + atoms->atom[a].resind;
-      }
-      n_res    += atoms->nres;
-      a_offset += atoms->nr;
-    }
-  }
-
-  snew(t_res,n_res);
-  for(i=0; (i<n_res); i++)
-    t_res[i] = i+1;
-  snew(matrix,n_res);
-  for(i=0; (i<n_res); i++) 
-    snew(matrix[i],n_res);
-  nratoms = interaction_function[F_DISRES].nratoms;
-  nra = (idef->il[F_DISRES].nr/(nratoms+1));
-  snew(ptr,nra+1);
-  index   = 0;
-  nlabel  = 0;
-  ptr[0]  = 0;
-  snew(w_dr,ndr);
-  for(i=0; (i<idef->il[F_DISRES].nr); i+=nratoms+1) {
-    tp       = idef->il[F_DISRES].iatoms[i];
-    label    = idef->iparams[tp].disres.label;
-    
-    if (label != index) {
-      /* Set index pointer */
-      ptr[index+1] = i;
-      if (nlabel <= 0)
-       gmx_fatal(FARGS,"nlabel is %d, label = %d",nlabel,label);
-      if (index >= ndr)
-       gmx_fatal(FARGS,"ndr = %d, index = %d",ndr,index);
-      /* Update the weight */
-      w_dr[index] = 1.0/nlabel;
-      index  = label;
-      nlabel = 1;
-    }
-    else {
-      nlabel++;
-    }
-  }
-  printf("nlabel = %d, index = %d, ndr = %d\n",nlabel,index,ndr);
-  hi = 0;
-  for(i=0; (i<ndr); i++) {
-    for(j=ptr[i]; (j<ptr[i+1]); j+=nratoms+1) {
-      tp  = idef->il[F_DISRES].iatoms[j];
-      ai  = idef->il[F_DISRES].iatoms[j+1];
-      aj  = idef->il[F_DISRES].iatoms[j+2];
-    
-      ri = resnr[ai];
-      rj = resnr[aj];
-      if (bThird)
-       rav = pow(dr->aver_3[i]/nsteps,-1.0/3.0);
-      else
-       rav = dr->aver1[i]/nsteps;
-      if (debug)
-       fprintf(debug,"DR %d, atoms %d, %d, distance %g\n",i,ai,aj,rav);
-      rviol = max(0,rav-idef->iparams[tp].disres.up1);
-      matrix[ri][rj] += w_dr[i]*rviol;
-      matrix[rj][ri] += w_dr[i]*rviol;
-      hi = max(hi,matrix[ri][rj]);
-      hi = max(hi,matrix[rj][ri]);
-    }
-  }
-
-  sfree(resnr);
-
-  if (max_dr > 0) {
-    if (hi > max_dr)
-      printf("Warning: the maxdr that you have specified (%g) is smaller than\nthe largest value in your simulation (%g)\n",max_dr,hi);
-    hi = max_dr;
-  }
-  printf("Highest level in the matrix will be %g\n",hi);
-  fp = ffopen(fn,"w");  
-  write_xpm(fp,0,"Distance Violations","<V> (nm)","Residue","Residue",
-           n_res,n_res,t_res,t_res,matrix,0,hi,rlo,rhi,&nlevels);
-  ffclose(fp);
+    FILE      *fp;
+    int       *resnr;
+    int        n_res, a_offset, mb, mol, a;
+    t_atoms   *atoms;
+    int        iii, i, j, nra, nratoms, tp, ri, rj, index, nlabel, label;
+    atom_id    ai, aj, *ptr;
+    real     **matrix, *t_res, hi, *w_dr, rav, rviol;
+    t_rgb      rlo = { 1, 1, 1 };
+    t_rgb      rhi = { 0, 0, 0 };
+    if (fn == NULL)
+    {
+        return;
+    }
+
+    snew(resnr, mtop->natoms);
+    n_res    = 0;
+    a_offset = 0;
+    for (mb = 0; mb < mtop->nmolblock; mb++)
+    {
+        atoms = &mtop->moltype[mtop->molblock[mb].type].atoms;
+        for (mol = 0; mol < mtop->molblock[mb].nmol; mol++)
+        {
+            for (a = 0; a < atoms->nr; a++)
+            {
+                resnr[a_offset+a] = n_res + atoms->atom[a].resind;
+            }
+            n_res    += atoms->nres;
+            a_offset += atoms->nr;
+        }
+    }
+
+    snew(t_res, n_res);
+    for (i = 0; (i < n_res); i++)
+    {
+        t_res[i] = i+1;
+    }
+    snew(matrix, n_res);
+    for (i = 0; (i < n_res); i++)
+    {
+        snew(matrix[i], n_res);
+    }
+    nratoms = interaction_function[F_DISRES].nratoms;
+    nra     = (idef->il[F_DISRES].nr/(nratoms+1));
+    snew(ptr, nra+1);
+    index   = 0;
+    nlabel  = 0;
+    ptr[0]  = 0;
+    snew(w_dr, ndr);
+    for (i = 0; (i < idef->il[F_DISRES].nr); i += nratoms+1)
+    {
+        tp       = idef->il[F_DISRES].iatoms[i];
+        label    = idef->iparams[tp].disres.label;
+
+        if (label != index)
+        {
+            /* Set index pointer */
+            ptr[index+1] = i;
+            if (nlabel <= 0)
+            {
+                gmx_fatal(FARGS, "nlabel is %d, label = %d", nlabel, label);
+            }
+            if (index >= ndr)
+            {
+                gmx_fatal(FARGS, "ndr = %d, index = %d", ndr, index);
+            }
+            /* Update the weight */
+            w_dr[index] = 1.0/nlabel;
+            index       = label;
+            nlabel      = 1;
+        }
+        else
+        {
+            nlabel++;
+        }
+    }
+    printf("nlabel = %d, index = %d, ndr = %d\n", nlabel, index, ndr);
+    hi = 0;
+    for (i = 0; (i < ndr); i++)
+    {
+        for (j = ptr[i]; (j < ptr[i+1]); j += nratoms+1)
+        {
+            tp  = idef->il[F_DISRES].iatoms[j];
+            ai  = idef->il[F_DISRES].iatoms[j+1];
+            aj  = idef->il[F_DISRES].iatoms[j+2];
+
+            ri = resnr[ai];
+            rj = resnr[aj];
+            if (bThird)
+            {
+                rav = pow(dr->aver_3[i]/nsteps, -1.0/3.0);
+            }
+            else
+            {
+                rav = dr->aver1[i]/nsteps;
+            }
+            if (debug)
+            {
+                fprintf(debug, "DR %d, atoms %d, %d, distance %g\n", i, ai, aj, rav);
+            }
+            rviol           = max(0, rav-idef->iparams[tp].disres.up1);
+            matrix[ri][rj] += w_dr[i]*rviol;
+            matrix[rj][ri] += w_dr[i]*rviol;
+            hi              = max(hi, matrix[ri][rj]);
+            hi              = max(hi, matrix[rj][ri]);
+        }
+    }
+
+    sfree(resnr);
+
+    if (max_dr > 0)
+    {
+        if (hi > max_dr)
+        {
+            printf("Warning: the maxdr that you have specified (%g) is smaller than\nthe largest value in your simulation (%g)\n", max_dr, hi);
+        }
+        hi = max_dr;
+    }
+    printf("Highest level in the matrix will be %g\n", hi);
+    fp = ffopen(fn, "w");
+    write_xpm(fp, 0, "Distance Violations", "<V> (nm)", "Residue", "Residue",
+              n_res, n_res, t_res, t_res, matrix, 0, hi, rlo, rhi, &nlevels);
+    ffclose(fp);
 }
 
-int gmx_disre(int argc,char *argv[])
+int gmx_disre(int argc, char *argv[])
 {
-  const char *desc[] = {
-    "[TT]g_disre[tt] computes violations of distance restraints.",
-    "If necessary, all protons can be added to a protein molecule ",
-    "using the [TT]g_protonate[tt] program.[PAR]",
-    "The program always",
-    "computes the instantaneous violations rather than time-averaged,",
-    "because this analysis is done from a trajectory file afterwards",
-    "it does not make sense to use time averaging. However,",
-    "the time averaged values per restraint are given in the log file.[PAR]",
-    "An index file may be used to select specific restraints for",
-    "printing.[PAR]",
-    "When the optional [TT]-q[tt] flag is given a [TT].pdb[tt] file coloured by the",
-    "amount of average violations.[PAR]",
-    "When the [TT]-c[tt] option is given, an index file will be read",
-    "containing the frames in your trajectory corresponding to the clusters",
-    "(defined in another manner) that you want to analyze. For these clusters",
-    "the program will compute average violations using the third power",
-    "averaging algorithm and print them in the log file."
-  };
-  static int  ntop      = 0;
-  static int  nlevels   = 20;
-  static real max_dr    = 0;
-  static gmx_bool bThird    = TRUE;
-  t_pargs pa[] = {
-    { "-ntop", FALSE, etINT,  {&ntop},
-      "Number of large violations that are stored in the log file every step" },
-    { "-maxdr", FALSE, etREAL, {&max_dr},
-      "Maximum distance violation in matrix output. If less than or equal to 0 the maximum will be determined by the data." },
-    { "-nlevels", FALSE, etINT, {&nlevels},
-      "Number of levels in the matrix output" },
-    { "-third", FALSE, etBOOL, {&bThird},
-      "Use inverse third power averaging or linear for matrix output" }
-  };
-  
-  FILE        *out=NULL,*aver=NULL,*numv=NULL,*maxxv=NULL,*xvg=NULL;
-  t_tpxheader header;
-  t_inputrec  ir;
-  gmx_mtop_t  mtop;
-  rvec        *xtop;
-  gmx_localtop_t *top;
-  t_atoms     *atoms=NULL;
-  t_forcerec  *fr;
-  t_fcdata    fcd;
-  t_nrnb      nrnb;
-  t_commrec   *cr;
-  t_graph     *g;
-  int         ntopatoms,natoms,i,j,kkk;
-  t_trxstatus *status;
-  real        t;
-  rvec        *x,*f,*xav=NULL;
-  matrix      box;
-  gmx_bool        bPDB;
-  int         isize;
-  atom_id     *index=NULL,*ind_fit=NULL;
-  char        *grpname;
-  t_cluster_ndx *clust=NULL;
-  t_dr_result dr,*dr_clust=NULL;
-  char        **leg;
-  real        *vvindex=NULL,*w_rls=NULL;
-  t_mdatoms   *mdatoms;
-  t_pbc       pbc,*pbc_null;
-  int         my_clust;
-  FILE        *fplog;
-  output_env_t oenv;
-  gmx_rmpbc_t  gpbc=NULL;
-  
-  t_filenm fnm[] = {
-    { efTPX, NULL, NULL, ffREAD },
-    { efTRX, "-f", NULL, ffREAD },
-    { efXVG, "-ds", "drsum",  ffWRITE },
-    { efXVG, "-da", "draver", ffWRITE },
-    { efXVG, "-dn", "drnum",  ffWRITE },
-    { efXVG, "-dm", "drmax",  ffWRITE },
-    { efXVG, "-dr", "restr",  ffWRITE },
-    { efLOG, "-l",  "disres", ffWRITE },
-    { efNDX, NULL,  "viol",   ffOPTRD },
-    { efPDB, "-q",  "viol",   ffOPTWR },
-    { efNDX, "-c",  "clust",  ffOPTRD },
-    { efXPM, "-x",  "matrix", ffOPTWR }
-  };
+    const char     *desc[] = {
+        "[TT]g_disre[tt] computes violations of distance restraints.",
+        "If necessary, all protons can be added to a protein molecule ",
+        "using the [TT]g_protonate[tt] program.[PAR]",
+        "The program always",
+        "computes the instantaneous violations rather than time-averaged,",
+        "because this analysis is done from a trajectory file afterwards",
+        "it does not make sense to use time averaging. However,",
+        "the time averaged values per restraint are given in the log file.[PAR]",
+        "An index file may be used to select specific restraints for",
+        "printing.[PAR]",
+        "When the optional [TT]-q[tt] flag is given a [TT].pdb[tt] file coloured by the",
+        "amount of average violations.[PAR]",
+        "When the [TT]-c[tt] option is given, an index file will be read",
+        "containing the frames in your trajectory corresponding to the clusters",
+        "(defined in another manner) that you want to analyze. For these clusters",
+        "the program will compute average violations using the third power",
+        "averaging algorithm and print them in the log file."
+    };
+    static int      ntop      = 0;
+    static int      nlevels   = 20;
+    static real     max_dr    = 0;
+    static gmx_bool bThird    = TRUE;
+    t_pargs         pa[]      = {
+        { "-ntop", FALSE, etINT,  {&ntop},
+          "Number of large violations that are stored in the log file every step" },
+        { "-maxdr", FALSE, etREAL, {&max_dr},
+          "Maximum distance violation in matrix output. If less than or equal to 0 the maximum will be determined by the data." },
+        { "-nlevels", FALSE, etINT, {&nlevels},
+          "Number of levels in the matrix output" },
+        { "-third", FALSE, etBOOL, {&bThird},
+          "Use inverse third power averaging or linear for matrix output" }
+    };
+
+    FILE           *out = NULL, *aver = NULL, *numv = NULL, *maxxv = NULL, *xvg = NULL;
+    t_tpxheader     header;
+    t_inputrec      ir;
+    gmx_mtop_t      mtop;
+    rvec           *xtop;
+    gmx_localtop_t *top;
+    t_atoms        *atoms = NULL;
+    t_forcerec     *fr;
+    t_fcdata        fcd;
+    t_nrnb          nrnb;
+    t_commrec      *cr;
+    t_graph        *g;
+    int             ntopatoms, natoms, i, j, kkk;
+    t_trxstatus    *status;
+    real            t;
+    rvec           *x, *f, *xav = NULL;
+    matrix          box;
+    gmx_bool        bPDB;
+    int             isize;
+    atom_id        *index = NULL, *ind_fit = NULL;
+    char           *grpname;
+    t_cluster_ndx  *clust = NULL;
+    t_dr_result     dr, *dr_clust = NULL;
+    char          **leg;
+    real           *vvindex = NULL, *w_rls = NULL;
+    t_mdatoms      *mdatoms;
+    t_pbc           pbc, *pbc_null;
+    int             my_clust;
+    FILE           *fplog;
+    output_env_t    oenv;
+    gmx_rmpbc_t     gpbc = NULL;
+
+    t_filenm        fnm[] = {
+        { efTPX, NULL, NULL, ffREAD },
+        { efTRX, "-f", NULL, ffREAD },
+        { efXVG, "-ds", "drsum",  ffWRITE },
+        { efXVG, "-da", "draver", ffWRITE },
+        { efXVG, "-dn", "drnum",  ffWRITE },
+        { efXVG, "-dm", "drmax",  ffWRITE },
+        { efXVG, "-dr", "restr",  ffWRITE },
+        { efLOG, "-l",  "disres", ffWRITE },
+        { efNDX, NULL,  "viol",   ffOPTRD },
+        { efPDB, "-q",  "viol",   ffOPTWR },
+        { efNDX, "-c",  "clust",  ffOPTRD },
+        { efXPM, "-x",  "matrix", ffOPTWR }
+    };
 #define NFILE asize(fnm)
 
-  cr  = init_par(&argc,&argv);
-  parse_common_args(&argc,argv,PCA_CAN_TIME | PCA_CAN_VIEW | PCA_BE_NICE,
-                   NFILE,fnm,asize(pa),pa,asize(desc),desc,0,NULL,&oenv);
-
-  gmx_log_open(ftp2fn(efLOG,NFILE,fnm),cr,FALSE,0,&fplog);
-  
-  if (ntop)
-    init5(ntop);
-  
-  read_tpxheader(ftp2fn(efTPX,NFILE,fnm),&header,FALSE,NULL,NULL);
-  snew(xtop,header.natoms);
-  read_tpx(ftp2fn(efTPX,NFILE,fnm),&ir,box,&ntopatoms,xtop,NULL,NULL,&mtop);
-  bPDB = opt2bSet("-q",NFILE,fnm);
-  if (bPDB) {
-    snew(xav,ntopatoms);
-    snew(ind_fit,ntopatoms);
-    snew(w_rls,ntopatoms);
-    for(kkk=0; (kkk<ntopatoms); kkk++) {
-      w_rls[kkk] = 1;
-      ind_fit[kkk] = kkk;
-    }
-    
-    snew(atoms,1);
-    *atoms = gmx_mtop_global_atoms(&mtop);
-    
-    if (atoms->pdbinfo == NULL) {
-      snew(atoms->pdbinfo,atoms->nr);
-    }
-  } 
-
-  top = gmx_mtop_generate_local_top(&mtop,&ir);
-
-  g = NULL;
-  pbc_null = NULL;
-  if (ir.ePBC != epbcNONE) {
-    if (ir.bPeriodicMols)
-      pbc_null = &pbc;
+    cr  = init_par(&argc, &argv);
+    parse_common_args(&argc, argv, PCA_CAN_TIME | PCA_CAN_VIEW | PCA_BE_NICE,
+                      NFILE, fnm, asize(pa), pa, asize(desc), desc, 0, NULL, &oenv);
+
+    gmx_log_open(ftp2fn(efLOG, NFILE, fnm), cr, FALSE, 0, &fplog);
+
+    if (ntop)
+    {
+        init5(ntop);
+    }
+
+    read_tpxheader(ftp2fn(efTPX, NFILE, fnm), &header, FALSE, NULL, NULL);
+    snew(xtop, header.natoms);
+    read_tpx(ftp2fn(efTPX, NFILE, fnm), &ir, box, &ntopatoms, xtop, NULL, NULL, &mtop);
+    bPDB = opt2bSet("-q", NFILE, fnm);
+    if (bPDB)
+    {
+        snew(xav, ntopatoms);
+        snew(ind_fit, ntopatoms);
+        snew(w_rls, ntopatoms);
+        for (kkk = 0; (kkk < ntopatoms); kkk++)
+        {
+            w_rls[kkk]   = 1;
+            ind_fit[kkk] = kkk;
+        }
+
+        snew(atoms, 1);
+        *atoms = gmx_mtop_global_atoms(&mtop);
+
+        if (atoms->pdbinfo == NULL)
+        {
+            snew(atoms->pdbinfo, atoms->nr);
+        }
+    }
+
+    top = gmx_mtop_generate_local_top(&mtop, &ir);
+
+    g        = NULL;
+    pbc_null = NULL;
+    if (ir.ePBC != epbcNONE)
+    {
+        if (ir.bPeriodicMols)
+        {
+            pbc_null = &pbc;
+        }
+        else
+        {
+            g = mk_graph(fplog, &top->idef, 0, mtop.natoms, FALSE, FALSE);
+        }
+    }
+
+    if (ftp2bSet(efNDX, NFILE, fnm))
+    {
+        rd_index(ftp2fn(efNDX, NFILE, fnm), 1, &isize, &index, &grpname);
+        xvg = xvgropen(opt2fn("-dr", NFILE, fnm), "Individual Restraints", "Time (ps)",
+                       "nm", oenv);
+        snew(vvindex, isize);
+        snew(leg, isize);
+        for (i = 0; (i < isize); i++)
+        {
+            index[i]++;
+            snew(leg[i], 12);
+            sprintf(leg[i], "index %d", index[i]);
+        }
+        xvgr_legend(xvg, isize, (const char**)leg, oenv);
+    }
     else
-      g = mk_graph(fplog,&top->idef,0,mtop.natoms,FALSE,FALSE);
-  }
-  
-  if (ftp2bSet(efNDX,NFILE,fnm)) {
-    rd_index(ftp2fn(efNDX,NFILE,fnm),1,&isize,&index,&grpname);
-    xvg=xvgropen(opt2fn("-dr",NFILE,fnm),"Individual Restraints","Time (ps)",
-                "nm",oenv);
-    snew(vvindex,isize);
-    snew(leg,isize);
-    for(i=0; (i<isize); i++) {
-      index[i]++;
-      snew(leg[i],12);
-      sprintf(leg[i],"index %d",index[i]);
-    }
-    xvgr_legend(xvg,isize,(const char**)leg,oenv);
-  }
-  else 
-    isize=0;
-
-  ir.dr_tau=0.0;
-  init_disres(fplog,&mtop,&ir,NULL,FALSE,&fcd,NULL,FALSE);
-
-  natoms=read_first_x(oenv,&status,ftp2fn(efTRX,NFILE,fnm),&t,&x,box);
-  snew(f,5*natoms);
-  
-  init_dr_res(&dr,fcd.disres.nres);
-  if (opt2bSet("-c",NFILE,fnm)) {
-    clust = cluster_index(fplog,opt2fn("-c",NFILE,fnm));
-    snew(dr_clust,clust->clust->nr+1);
-    for(i=0; (i<=clust->clust->nr); i++)
-      init_dr_res(&dr_clust[i],fcd.disres.nres);
-  }
-  else {       
-    out =xvgropen(opt2fn("-ds",NFILE,fnm),
-                 "Sum of Violations","Time (ps)","nm",oenv);
-    aver=xvgropen(opt2fn("-da",NFILE,fnm),
-                 "Average Violation","Time (ps)","nm",oenv);
-    numv=xvgropen(opt2fn("-dn",NFILE,fnm),
-                 "# Violations","Time (ps)","#",oenv);
-    maxxv=xvgropen(opt2fn("-dm",NFILE,fnm),
-                  "Largest Violation","Time (ps)","nm",oenv);
-  }
-
-  mdatoms = init_mdatoms(fplog,&mtop,ir.efep!=efepNO);
-  atoms2md(&mtop,&ir,0,NULL,0,mtop.natoms,mdatoms);
-  update_mdatoms(mdatoms,ir.fepvals->init_lambda);
-  fr      = mk_forcerec();
-  fprintf(fplog,"Made forcerec\n");
-  init_forcerec(fplog,oenv,fr,NULL,&ir,&mtop,cr,box,FALSE,
-                NULL,NULL,NULL,NULL,NULL,FALSE,-1);
-  init_nrnb(&nrnb);
-  if (ir.ePBC != epbcNONE)
-    gpbc = gmx_rmpbc_init(&top->idef,ir.ePBC,natoms,box);
-  
-  j=0;
-  do {
-    if (ir.ePBC != epbcNONE) {
-      if (ir.bPeriodicMols)
-       set_pbc(&pbc,ir.ePBC,box);
-      else
-       gmx_rmpbc(gpbc,natoms,box,x);
-    }
-    
-    if (clust) {
-      if (j > clust->maxframe)
-       gmx_fatal(FARGS,"There are more frames in the trajectory than in the cluster index file. t = %8f\n",t);
-      my_clust = clust->inv_clust[j];
-      range_check(my_clust,0,clust->clust->nr);
-      check_viol(fplog,cr,&(top->idef.il[F_DISRES]),
-                top->idef.iparams,top->idef.functype,
-                x,f,fr,pbc_null,g,dr_clust,my_clust,isize,index,vvindex,&fcd);
+    {
+        isize = 0;
+    }
+
+    ir.dr_tau = 0.0;
+    init_disres(fplog, &mtop, &ir, NULL, FALSE, &fcd, NULL, FALSE);
+
+    natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE, fnm), &t, &x, box);
+    snew(f, 5*natoms);
+
+    init_dr_res(&dr, fcd.disres.nres);
+    if (opt2bSet("-c", NFILE, fnm))
+    {
+        clust = cluster_index(fplog, opt2fn("-c", NFILE, fnm));
+        snew(dr_clust, clust->clust->nr+1);
+        for (i = 0; (i <= clust->clust->nr); i++)
+        {
+            init_dr_res(&dr_clust[i], fcd.disres.nres);
+        }
     }
     else
-      check_viol(fplog,cr,&(top->idef.il[F_DISRES]),
-                top->idef.iparams,top->idef.functype,
-                x,f,fr,pbc_null,g,&dr,0,isize,index,vvindex,&fcd);
-    if (bPDB) {
-      reset_x(atoms->nr,ind_fit,atoms->nr,NULL,x,w_rls);
-      do_fit(atoms->nr,w_rls,x,x);
-      if (j == 0) {
-       /* Store the first frame of the trajectory as 'characteristic'
-        * for colouring with violations.
-        */
-       for(kkk=0; (kkk<atoms->nr); kkk++)
-         copy_rvec(x[kkk],xav[kkk]);
-      }
-    }
-    if (!clust) {
-      if (isize > 0) {
-       fprintf(xvg,"%10g",t);
-       for(i=0; (i<isize); i++)
-         fprintf(xvg,"  %10g",vvindex[i]);
-       fprintf(xvg,"\n");
-      }    
-      fprintf(out,  "%10g  %10g\n",t,dr.sumv);
-      fprintf(aver, "%10g  %10g\n",t,dr.averv);
-      fprintf(maxxv,"%10g  %10g\n",t,dr.maxv);
-      fprintf(numv, "%10g  %10d\n",t,dr.nv);
-    }
-    j++;
-  } while (read_next_x(oenv,status,&t,natoms,x,box));
-  close_trj(status);
-  if (ir.ePBC != epbcNONE)
-    gmx_rmpbc_done(gpbc);
-
-  if (clust) {
-    dump_clust_stats(fplog,fcd.disres.nres,&(top->idef.il[F_DISRES]),
-                    top->idef.iparams,clust->clust,dr_clust,
-                    clust->grpname,isize,index);
-  }
-  else {
-    dump_stats(fplog,j,fcd.disres.nres,&(top->idef.il[F_DISRES]),
-              top->idef.iparams,&dr,isize,index,
-              bPDB ? atoms : NULL);
-    if (bPDB) {
-      write_sto_conf(opt2fn("-q",NFILE,fnm),
-                    "Coloured by average violation in Angstrom",
-                    atoms,xav,NULL,ir.ePBC,box);
-    }
-    dump_disre_matrix(opt2fn_null("-x",NFILE,fnm),&dr,fcd.disres.nres,
-                     j,&top->idef,&mtop,max_dr,nlevels,bThird);
-    ffclose(out);
-    ffclose(aver);
-    ffclose(numv);
-    ffclose(maxxv);
-    if (isize > 0) {
-      ffclose(xvg);
-      do_view(oenv,opt2fn("-dr",NFILE,fnm),"-nxy");
-    }
-    do_view(oenv,opt2fn("-dn",NFILE,fnm),"-nxy");
-    do_view(oenv,opt2fn("-da",NFILE,fnm),"-nxy");
-    do_view(oenv,opt2fn("-ds",NFILE,fnm),"-nxy");
-    do_view(oenv,opt2fn("-dm",NFILE,fnm),"-nxy");
-  }
-  thanx(stderr);
-
-  gmx_finalize_par();
-
-  gmx_log_close(fplog);
-  
-  return 0;
+    {
+        out = xvgropen(opt2fn("-ds", NFILE, fnm),
+                       "Sum of Violations", "Time (ps)", "nm", oenv);
+        aver = xvgropen(opt2fn("-da", NFILE, fnm),
+                        "Average Violation", "Time (ps)", "nm", oenv);
+        numv = xvgropen(opt2fn("-dn", NFILE, fnm),
+                        "# Violations", "Time (ps)", "#", oenv);
+        maxxv = xvgropen(opt2fn("-dm", NFILE, fnm),
+                         "Largest Violation", "Time (ps)", "nm", oenv);
+    }
+
+    mdatoms = init_mdatoms(fplog, &mtop, ir.efep != efepNO);
+    atoms2md(&mtop, &ir, 0, NULL, 0, mtop.natoms, mdatoms);
+    update_mdatoms(mdatoms, ir.fepvals->init_lambda);
+    fr      = mk_forcerec();
+    fprintf(fplog, "Made forcerec\n");
+    init_forcerec(fplog, oenv, fr, NULL, &ir, &mtop, cr, box, FALSE,
+                  NULL, NULL, NULL, NULL, NULL, FALSE, -1);
+    init_nrnb(&nrnb);
+    if (ir.ePBC != epbcNONE)
+    {
+        gpbc = gmx_rmpbc_init(&top->idef, ir.ePBC, natoms, box);
+    }
+
+    j = 0;
+    do
+    {
+        if (ir.ePBC != epbcNONE)
+        {
+            if (ir.bPeriodicMols)
+            {
+                set_pbc(&pbc, ir.ePBC, box);
+            }
+            else
+            {
+                gmx_rmpbc(gpbc, natoms, box, x);
+            }
+        }
+
+        if (clust)
+        {
+            if (j > clust->maxframe)
+            {
+                gmx_fatal(FARGS, "There are more frames in the trajectory than in the cluster index file. t = %8f\n", t);
+            }
+            my_clust = clust->inv_clust[j];
+            range_check(my_clust, 0, clust->clust->nr);
+            check_viol(fplog, cr, &(top->idef.il[F_DISRES]),
+                       top->idef.iparams, top->idef.functype,
+                       x, f, fr, pbc_null, g, dr_clust, my_clust, isize, index, vvindex, &fcd);
+        }
+        else
+        {
+            check_viol(fplog, cr, &(top->idef.il[F_DISRES]),
+                       top->idef.iparams, top->idef.functype,
+                       x, f, fr, pbc_null, g, &dr, 0, isize, index, vvindex, &fcd);
+        }
+        if (bPDB)
+        {
+            reset_x(atoms->nr, ind_fit, atoms->nr, NULL, x, w_rls);
+            do_fit(atoms->nr, w_rls, x, x);
+            if (j == 0)
+            {
+                /* Store the first frame of the trajectory as 'characteristic'
+                 * for colouring with violations.
+                 */
+                for (kkk = 0; (kkk < atoms->nr); kkk++)
+                {
+                    copy_rvec(x[kkk], xav[kkk]);
+                }
+            }
+        }
+        if (!clust)
+        {
+            if (isize > 0)
+            {
+                fprintf(xvg, "%10g", t);
+                for (i = 0; (i < isize); i++)
+                {
+                    fprintf(xvg, "  %10g", vvindex[i]);
+                }
+                fprintf(xvg, "\n");
+            }
+            fprintf(out,  "%10g  %10g\n", t, dr.sumv);
+            fprintf(aver, "%10g  %10g\n", t, dr.averv);
+            fprintf(maxxv, "%10g  %10g\n", t, dr.maxv);
+            fprintf(numv, "%10g  %10d\n", t, dr.nv);
+        }
+        j++;
+    }
+    while (read_next_x(oenv, status, &t, natoms, x, box));
+    close_trj(status);
+    if (ir.ePBC != epbcNONE)
+    {
+        gmx_rmpbc_done(gpbc);
+    }
+
+    if (clust)
+    {
+        dump_clust_stats(fplog, fcd.disres.nres, &(top->idef.il[F_DISRES]),
+                         top->idef.iparams, clust->clust, dr_clust,
+                         clust->grpname, isize, index);
+    }
+    else
+    {
+        dump_stats(fplog, j, fcd.disres.nres, &(top->idef.il[F_DISRES]),
+                   top->idef.iparams, &dr, isize, index,
+                   bPDB ? atoms : NULL);
+        if (bPDB)
+        {
+            write_sto_conf(opt2fn("-q", NFILE, fnm),
+                           "Coloured by average violation in Angstrom",
+                           atoms, xav, NULL, ir.ePBC, box);
+        }
+        dump_disre_matrix(opt2fn_null("-x", NFILE, fnm), &dr, fcd.disres.nres,
+                          j, &top->idef, &mtop, max_dr, nlevels, bThird);
+        ffclose(out);
+        ffclose(aver);
+        ffclose(numv);
+        ffclose(maxxv);
+        if (isize > 0)
+        {
+            ffclose(xvg);
+            do_view(oenv, opt2fn("-dr", NFILE, fnm), "-nxy");
+        }
+        do_view(oenv, opt2fn("-dn", NFILE, fnm), "-nxy");
+        do_view(oenv, opt2fn("-da", NFILE, fnm), "-nxy");
+        do_view(oenv, opt2fn("-ds", NFILE, fnm), "-nxy");
+        do_view(oenv, opt2fn("-dm", NFILE, fnm), "-nxy");
+    }
+    thanx(stderr);
+
+    gmx_finalize_par();
+
+    gmx_log_close(fplog);
+
+    return 0;
 }