Code beautification with uncrustify
[alexxy/gromacs.git] / src / gromacs / gmxlib / index.c
index c186a6fe60308ea4f07011124054f05e87667b6d..b39abd386d3d99656afb8b13b0a83d8aca195149 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:
  * GROningen Mixture of Alchemy and Childrens' Stories
  */
 
 
 
-const char gmx_residuetype_undefined[]="Other";
+const char gmx_residuetype_undefined[] = "Other";
 
 struct gmx_residuetype
 {
-    int      n; 
+    int      n;
     char **  resname;
     char **  restype;
-    
+
 };
 
 
 static gmx_bool gmx_ask_yesno(gmx_bool bASK)
 {
-  char c;
+    char c;
 
-  if (bASK) {
-    do {
-      c=toupper(fgetc(stdin));
-    } while ((c != 'Y') && (c != 'N'));
+    if (bASK)
+    {
+        do
+        {
+            c = toupper(fgetc(stdin));
+        }
+        while ((c != 'Y') && (c != 'N'));
 
-    return (c == 'Y');
-  }
-  else
-    return FALSE;
+        return (c == 'Y');
+    }
+    else
+    {
+        return FALSE;
+    }
 }
 
 t_blocka *new_blocka(void)
 {
-  t_blocka *block;
+    t_blocka *block;
 
-  snew(block,1);
-  snew(block->index,1);
+    snew(block, 1);
+    snew(block->index, 1);
 
-  return block;
+    return block;
 }
 
-void write_index(const char *outf, t_blocka *b,char **gnames)
+void write_index(const char *outf, t_blocka *b, char **gnames)
 {
-  FILE *out;
-  int  i,j,k;
-
-  out=gmx_fio_fopen(outf,"w");
-  /* fprintf(out,"%5d  %5d\n",b->nr,b->nra); */
-  for(i=0; (i<b->nr); i++) {
-    fprintf(out,"[ %s ]\n",gnames[i]);
-    for(k=0,j=b->index[i]; j<b->index[i+1]; j++,k++) {
-      fprintf(out,"%4d ",b->a[j]+1);
-      if ((k % 15) == 14)
-       fprintf(out,"\n");
+    FILE *out;
+    int   i, j, k;
+
+    out = gmx_fio_fopen(outf, "w");
+    /* fprintf(out,"%5d  %5d\n",b->nr,b->nra); */
+    for (i = 0; (i < b->nr); i++)
+    {
+        fprintf(out, "[ %s ]\n", gnames[i]);
+        for (k = 0, j = b->index[i]; j < b->index[i+1]; j++, k++)
+        {
+            fprintf(out, "%4d ", b->a[j]+1);
+            if ((k % 15) == 14)
+            {
+                fprintf(out, "\n");
+            }
+        }
+        fprintf(out, "\n");
     }
-    fprintf(out,"\n");
-  }
-  gmx_fio_fclose(out);
+    gmx_fio_fclose(out);
 }
 
-void add_grp(t_blocka *b,char ***gnames,int nra,atom_id a[],const char *name)
+void add_grp(t_blocka *b, char ***gnames, int nra, atom_id a[], const char *name)
 {
-  int i;
+    int i;
 
-  srenew(b->index,b->nr+2);
-  srenew(*gnames,b->nr+1);
-  (*gnames)[b->nr]=strdup(name);
+    srenew(b->index, b->nr+2);
+    srenew(*gnames, b->nr+1);
+    (*gnames)[b->nr] = strdup(name);
 
-  srenew(b->a,b->nra+nra);
-  for(i=0; (i<nra); i++)
-    b->a[b->nra++]=a[i];
-  b->nr++;
-  b->index[b->nr]=b->nra;
+    srenew(b->a, b->nra+nra);
+    for (i = 0; (i < nra); i++)
+    {
+        b->a[b->nra++] = a[i];
+    }
+    b->nr++;
+    b->index[b->nr] = b->nra;
 }
 
-/* compare index in `a' with group in `b' at `index', 
+/* compare index in `a' with group in `b' at `index',
    when `index'<0 it is relative to end of `b' */
 static gmx_bool grp_cmp(t_blocka *b, int nra, atom_id a[], int index)
 {
-  int i;
-  
-  if (index < 0)
-    index = b->nr-1+index;
-  if (index >= b->nr)
-    gmx_fatal(FARGS,"no such index group %d in t_blocka (nr=%d)",index,b->nr);
-  /* compare sizes */
-  if ( nra != b->index[index+1] - b->index[index] )
-    return FALSE;
-  for(i=0; i<nra; i++)
-    if ( a[i] != b->a[b->index[index]+i] )
-      return FALSE;
-  return TRUE;
+    int i;
+
+    if (index < 0)
+    {
+        index = b->nr-1+index;
+    }
+    if (index >= b->nr)
+    {
+        gmx_fatal(FARGS, "no such index group %d in t_blocka (nr=%d)", index, b->nr);
+    }
+    /* compare sizes */
+    if (nra != b->index[index+1] - b->index[index])
+    {
+        return FALSE;
+    }
+    for (i = 0; i < nra; i++)
+    {
+        if (a[i] != b->a[b->index[index]+i])
+        {
+            return FALSE;
+        }
+    }
+    return TRUE;
 }
 
-static void 
+static void
 p_status(const char **restype, int nres, const char **typenames, int ntypes)
 {
-    int i,j;
-    int found;
-    
+    int   i, j;
+    int   found;
+
     int * counter;
-    
-    snew(counter,ntypes);
-    for(i=0;i<ntypes;i++)
+
+    snew(counter, ntypes);
+    for (i = 0; i < ntypes; i++)
     {
-        counter[i]=0;
+        counter[i] = 0;
     }
-    for(i=0;i<nres;i++)
+    for (i = 0; i < nres; i++)
     {
-        found=0;
-        for(j=0;j<ntypes;j++)
+        found = 0;
+        for (j = 0; j < ntypes; j++)
         {
-            if(!gmx_strcasecmp(restype[i],typenames[j]))
+            if (!gmx_strcasecmp(restype[i], typenames[j]))
             {
                 counter[j]++;
             }
         }
     }
-    
-    for(i=0; (i<ntypes); i++) 
+
+    for (i = 0; (i < ntypes); i++)
     {
         if (counter[i] > 0)
         {
-            printf("There are: %5d %10s residues\n",counter[i],typenames[i]);
+            printf("There are: %5d %10s residues\n", counter[i], typenames[i]);
         }
     }
 
@@ -186,125 +207,150 @@ p_status(const char **restype, int nres, const char **typenames, int ntypes)
 
 
 atom_id *
-mk_aid(t_atoms *atoms,const char ** restype,const char * typestring,int *nra,gmx_bool bMatch)
+mk_aid(t_atoms *atoms, const char ** restype, const char * typestring, int *nra, gmx_bool bMatch)
 /* Make an array of atom_ids for all atoms with residuetypes matching typestring, or the opposite if bMatch is false */
 {
     atom_id *a;
-    int     i;
-    int     res;
-    
-    snew(a,atoms->nr);
-    *nra=0;
-    for(i=0; (i<atoms->nr); i++) 
+    int      i;
+    int      res;
+
+    snew(a, atoms->nr);
+    *nra = 0;
+    for (i = 0; (i < atoms->nr); i++)
     {
-        res=!gmx_strcasecmp(restype[atoms->atom[i].resind],typestring);
-        if(bMatch==FALSE)
+        res = !gmx_strcasecmp(restype[atoms->atom[i].resind], typestring);
+        if (bMatch == FALSE)
         {
-            res=!res;
+            res = !res;
         }
-        if(res)
+        if (res)
         {
-            a[(*nra)++]=i;
+            a[(*nra)++] = i;
         }
     }
-  
+
     return a;
 }
 
 typedef struct {
-  char *rname;
-  gmx_bool bNeg;
-  char *gname;
+    char    *rname;
+    gmx_bool bNeg;
+    char    *gname;
 } restp_t;
 
-static void analyse_other(const char ** restype,t_atoms *atoms,
-                         t_blocka *gb,char ***gn,gmx_bool bASK,gmx_bool bVerb)
+static void analyse_other(const char ** restype, t_atoms *atoms,
+                          t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
-  restp_t *restp=NULL;
-  char **attp=NULL;
-  char *rname,*aname;
-  atom_id *other_ndx,*aid,*aaid;
-  int  i,j,k,l,resind,naid,naaid,natp,nrestp=0;
-  
-    for(i=0; (i<atoms->nres); i++)
+    restp_t *restp = NULL;
+    char   **attp  = NULL;
+    char    *rname, *aname;
+    atom_id *other_ndx, *aid, *aaid;
+    int      i, j, k, l, resind, naid, naaid, natp, nrestp = 0;
+
+    for (i = 0; (i < atoms->nres); i++)
     {
-        if (gmx_strcasecmp(restype[i],"Protein") && gmx_strcasecmp(restype[i],"DNA") && gmx_strcasecmp(restype[i],"RNA") && gmx_strcasecmp(restype[i],"Water"))
+        if (gmx_strcasecmp(restype[i], "Protein") && gmx_strcasecmp(restype[i], "DNA") && gmx_strcasecmp(restype[i], "RNA") && gmx_strcasecmp(restype[i], "Water"))
         {
             break;
         }
     }
-  if (i < atoms->nres) {
-    /* we have others */
-    if (bVerb)
-      printf("Analysing residues not classified as Protein/DNA/RNA/Water and splitting into groups...\n");
-    snew(other_ndx,atoms->nr);
-    for(k=0; (k<atoms->nr); k++) {
-      resind = atoms->atom[k].resind;
-      rname = *atoms->resinfo[resind].name;
-        if (gmx_strcasecmp(restype[resind],"Protein") && gmx_strcasecmp(restype[resind],"DNA") && 
-            gmx_strcasecmp(restype[resind],"RNA") && gmx_strcasecmp(restype[resind],"Water")) 
+    if (i < atoms->nres)
+    {
+        /* we have others */
+        if (bVerb)
+        {
+            printf("Analysing residues not classified as Protein/DNA/RNA/Water and splitting into groups...\n");
+        }
+        snew(other_ndx, atoms->nr);
+        for (k = 0; (k < atoms->nr); k++)
         {
+            resind = atoms->atom[k].resind;
+            rname  = *atoms->resinfo[resind].name;
+            if (gmx_strcasecmp(restype[resind], "Protein") && gmx_strcasecmp(restype[resind], "DNA") &&
+                gmx_strcasecmp(restype[resind], "RNA") && gmx_strcasecmp(restype[resind], "Water"))
+            {
 
-       for(l=0; (l<nrestp); l++)
-         if (strcmp(restp[l].rname,rname) == 0)
-           break;
-       if (l==nrestp) {
-         srenew(restp,nrestp+1);
-         restp[nrestp].rname = strdup(rname);
-         restp[nrestp].bNeg  = FALSE;
-         restp[nrestp].gname = strdup(rname);
-         nrestp++;
-        
-    }
-      }
-    }
-    for(i=0; (i<nrestp); i++) {
-      snew(aid,atoms->nr);
-      naid=0;
-      for(j=0; (j<atoms->nr); j++) {
-       rname = *atoms->resinfo[atoms->atom[j].resind].name;
-       if ((strcmp(restp[i].rname,rname) == 0 && !restp[i].bNeg) ||
-           (strcmp(restp[i].rname,rname) != 0 &&  restp[i].bNeg)) {
-         aid[naid++] = j;
-       }
-      }
-      add_grp(gb,gn,naid,aid,restp[i].gname);
-      if (bASK) {
-       printf("split %s into atoms (y/n) ? ",restp[i].gname);
-       fflush(stdout);
-       if (gmx_ask_yesno(bASK)) {
-         natp=0;
-         for(k=0; (k<naid); k++) {
-           aname=*atoms->atomname[aid[k]];
-           for(l=0; (l<natp); l++)
-             if (strcmp(aname,attp[l]) == 0)
-               break;
-           if (l == natp) {
-             srenew(attp,++natp);
-             attp[natp-1]=aname;
-           }
-         }
-         if (natp > 1) {
-           for(l=0; (l<natp); l++) {
-             snew(aaid,naid);
-             naaid=0;
-             for(k=0; (k<naid); k++) {
-               aname=*atoms->atomname[aid[k]];
-               if (strcmp(aname,attp[l])==0) 
-                 aaid[naaid++]=aid[k];
-             }
-             add_grp(gb,gn,naaid,aaid,attp[l]);
-             sfree(aaid);
-           }
-         }
-         sfree(attp);
-         attp=NULL;
-       }
-       sfree(aid);
-      }
+                for (l = 0; (l < nrestp); l++)
+                {
+                    if (strcmp(restp[l].rname, rname) == 0)
+                    {
+                        break;
+                    }
+                }
+                if (l == nrestp)
+                {
+                    srenew(restp, nrestp+1);
+                    restp[nrestp].rname = strdup(rname);
+                    restp[nrestp].bNeg  = FALSE;
+                    restp[nrestp].gname = strdup(rname);
+                    nrestp++;
+
+                }
+            }
+        }
+        for (i = 0; (i < nrestp); i++)
+        {
+            snew(aid, atoms->nr);
+            naid = 0;
+            for (j = 0; (j < atoms->nr); j++)
+            {
+                rname = *atoms->resinfo[atoms->atom[j].resind].name;
+                if ((strcmp(restp[i].rname, rname) == 0 && !restp[i].bNeg) ||
+                    (strcmp(restp[i].rname, rname) != 0 &&  restp[i].bNeg))
+                {
+                    aid[naid++] = j;
+                }
+            }
+            add_grp(gb, gn, naid, aid, restp[i].gname);
+            if (bASK)
+            {
+                printf("split %s into atoms (y/n) ? ", restp[i].gname);
+                fflush(stdout);
+                if (gmx_ask_yesno(bASK))
+                {
+                    natp = 0;
+                    for (k = 0; (k < naid); k++)
+                    {
+                        aname = *atoms->atomname[aid[k]];
+                        for (l = 0; (l < natp); l++)
+                        {
+                            if (strcmp(aname, attp[l]) == 0)
+                            {
+                                break;
+                            }
+                        }
+                        if (l == natp)
+                        {
+                            srenew(attp, ++natp);
+                            attp[natp-1] = aname;
+                        }
+                    }
+                    if (natp > 1)
+                    {
+                        for (l = 0; (l < natp); l++)
+                        {
+                            snew(aaid, naid);
+                            naaid = 0;
+                            for (k = 0; (k < naid); k++)
+                            {
+                                aname = *atoms->atomname[aid[k]];
+                                if (strcmp(aname, attp[l]) == 0)
+                                {
+                                    aaid[naaid++] = aid[k];
+                                }
+                            }
+                            add_grp(gb, gn, naaid, aaid, attp[l]);
+                            sfree(aaid);
+                        }
+                    }
+                    sfree(attp);
+                    attp = NULL;
+                }
+                sfree(aid);
+            }
+        }
+        sfree(other_ndx);
     }
-    sfree(other_ndx);
-  }
 }
 
 /*! /brief Instances of this struct contain the data necessary to
@@ -312,42 +358,46 @@ static void analyse_other(const char ** restype,t_atoms *atoms,
  *         analyse_prot(). */
 typedef struct gmx_help_make_index_group
 {
-  /** The set of atom names that will be used to form this index group */
-  const char **defining_atomnames;
-  /** Size of the defining_atomnames array */
-  const int num_defining_atomnames;
-  /** Name of this index group */
-  const char *group_name;
-  /** Whether the above atom names name the atoms in the group, or
-      those not in the group */
-  gmx_bool bTakeComplement;
-  /** The index in wholename gives the first item in the arrays of
-     atomnames that should be tested with 'gmx_strncasecmp' in stead of
-     gmx_strcasecmp, or -1 if all items should be tested with strcasecmp
-     This is comparable to using a '*' wildcard at the end of specific
-     atom names, but that is more involved to implement...
-   */
-  int wholename;
-  /** Only create this index group if it differs from the one specified in compareto,
-     where -1 means to always create this group. */
-  int compareto;
+    /** The set of atom names that will be used to form this index group */
+    const char **defining_atomnames;
+    /** Size of the defining_atomnames array */
+    const int    num_defining_atomnames;
+    /** Name of this index group */
+    const char  *group_name;
+    /** Whether the above atom names name the atoms in the group, or
+        those not in the group */
+    gmx_bool bTakeComplement;
+    /** The index in wholename gives the first item in the arrays of
+       atomnames that should be tested with 'gmx_strncasecmp' in stead of
+       gmx_strcasecmp, or -1 if all items should be tested with strcasecmp
+       This is comparable to using a '*' wildcard at the end of specific
+       atom names, but that is more involved to implement...
+     */
+    int wholename;
+    /** Only create this index group if it differs from the one specified in compareto,
+       where -1 means to always create this group. */
+    int compareto;
 } t_gmx_help_make_index_group;
 
-static void analyse_prot(const char ** restype,t_atoms *atoms,
-                        t_blocka *gb,char ***gn,gmx_bool bASK,gmx_bool bVerb)
+static void analyse_prot(const char ** restype, t_atoms *atoms,
+                         t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
-  /* lists of atomnames to be used in constructing index groups: */
-  static const char *pnoh[]    = { "H", "HN" };
-  static const char *pnodum[]  = { "MN1",  "MN2",  "MCB1", "MCB2", "MCG1", "MCG2", 
-                            "MCD1", "MCD2", "MCE1", "MCE2", "MNZ1", "MNZ2" };
-  static const char *calpha[]  = { "CA" };
-  static const char *bb[]      = { "N","CA","C" };
-  static const char *mc[]      = { "N","CA","C","O","O1","O2","OC1","OC2","OT","OXT" };
-  static const char *mcb[]     = { "N","CA","CB","C","O","O1","O2","OC1","OC2","OT","OXT" };
-  static const char *mch[]     = { "N","CA","C","O","O1","O2","OC1","OC2","OT","OXT",
-                                  "H1","H2","H3","H","HN" };
-
-  static const t_gmx_help_make_index_group constructing_data[] =
+    /* lists of atomnames to be used in constructing index groups: */
+    static const char *pnoh[]    = { "H", "HN" };
+    static const char *pnodum[]  = {
+        "MN1",  "MN2",  "MCB1", "MCB2", "MCG1", "MCG2",
+        "MCD1", "MCD2", "MCE1", "MCE2", "MNZ1", "MNZ2"
+    };
+    static const char *calpha[]  = { "CA" };
+    static const char *bb[]      = { "N", "CA", "C" };
+    static const char *mc[]      = { "N", "CA", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT" };
+    static const char *mcb[]     = { "N", "CA", "CB", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT" };
+    static const char *mch[]     = {
+        "N", "CA", "C", "O", "O1", "O2", "OC1", "OC2", "OT", "OXT",
+        "H1", "H2", "H3", "H", "HN"
+    };
+
+    static const t_gmx_help_make_index_group constructing_data[] =
     {{ NULL,   0, "Protein",      TRUE,  -1, -1},
      { pnoh,   asize(pnoh),   "Protein-H",    TRUE,  0,  -1},
      { calpha, asize(calpha), "C-alpha",      FALSE, -1, -1},
@@ -357,134 +407,174 @@ static void analyse_prot(const char ** restype,t_atoms *atoms,
      { mch,    asize(mch),    "MainChain+H",  FALSE, -1, -1},
      { mch,    asize(mch),    "SideChain",    TRUE,  -1, -1},
      { mch,    asize(mch),    "SideChain-H",  TRUE,  11, -1},
-     { pnodum, asize(pnodum), "Prot-Masses",  TRUE,  -1, 0},
-    };
-  const int num_index_groups = asize(constructing_data);
-
-  int     n,j;
-  atom_id *aid;
-  int     nra,nnpres,npres;
-  gmx_bool    match;
-  char    ndx_name[STRLEN],*atnm;
-  int i;
-
-  if (bVerb)
-  {
-    printf("Analysing Protein...\n");
-  }
-  snew(aid,atoms->nr);
-
-  /* calculate the number of protein residues */
-  npres=0;
-  for(i=0; (i<atoms->nres); i++) {
-    if (0 == gmx_strcasecmp(restype[i],"Protein")) {
-      npres++;
-    }
-  }
-  /* find matching or complement atoms */
-  for(i=0; (i<(int)num_index_groups); i++) {
-    nra=0;
-    for(n=0; (n<atoms->nr); n++) {
-      if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind],"Protein")) {
-       match=FALSE;
-       for(j=0; (j<constructing_data[i].num_defining_atomnames); j++) {
-         /* skip digits at beginning of atomname, e.g. 1H */
-         atnm=*atoms->atomname[n];
-         while (isdigit(atnm[0])) {
-           atnm++;
-         }
-         if ( (constructing_data[i].wholename==-1) || (j<constructing_data[i].wholename) ) {
-           if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j],atnm)) {
-             match=TRUE;
-           }
-         } else {
-           if (0 == gmx_strncasecmp(constructing_data[i].defining_atomnames[j],atnm,strlen(constructing_data[i].defining_atomnames[j]))) {
-             match=TRUE;
-           }
-         }
-       }
-       if (constructing_data[i].bTakeComplement != match) {
-         aid[nra++]=n;
-       }
-      }
+     { pnodum, asize(pnodum), "Prot-Masses",  TRUE,  -1, 0}, };
+    const int   num_index_groups = asize(constructing_data);
+
+    int         n, j;
+    atom_id    *aid;
+    int         nra, nnpres, npres;
+    gmx_bool    match;
+    char        ndx_name[STRLEN], *atnm;
+    int         i;
+
+    if (bVerb)
+    {
+        printf("Analysing Protein...\n");
     }
-    /* if we want to add this group always or it differs from previous 
-       group, add it: */
-    if ( -1 == constructing_data[i].compareto || !grp_cmp(gb,nra,aid,constructing_data[i].compareto-i) ) {
-      add_grp(gb,gn,nra,aid,constructing_data[i].group_name);
+    snew(aid, atoms->nr);
+
+    /* calculate the number of protein residues */
+    npres = 0;
+    for (i = 0; (i < atoms->nres); i++)
+    {
+        if (0 == gmx_strcasecmp(restype[i], "Protein"))
+        {
+            npres++;
+        }
     }
-  }
-  
-  if (bASK) {
-    for(i=0; (i<(int)num_index_groups); i++) {
-      printf("Split %12s into %5d residues (y/n) ? ",constructing_data[i].group_name,npres);
-      if (gmx_ask_yesno(bASK)) {
-       int resind;
-       nra = 0;
-       for(n=0;((atoms->atom[n].resind < npres) && (n<atoms->nr));) {
-         resind = atoms->atom[n].resind;
-         for(;((atoms->atom[n].resind==resind) && (n<atoms->nr));n++) {
-           match=FALSE;
-           for(j=0;(j<constructing_data[i].num_defining_atomnames); j++) {
-             if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j],*atoms->atomname[n])) {
-               match=TRUE;
-             }
-           }
-           if (constructing_data[i].bTakeComplement != match) {
-             aid[nra++]=n;
-           }
-         }
-         /* copy the residuename to the tail of the groupname */
-         if (nra > 0) {
-           t_resinfo *ri;
-           ri = &atoms->resinfo[resind];
-           sprintf(ndx_name,"%s_%s%d%c",
-                   constructing_data[i].group_name,*ri->name,ri->nr,ri->ic==' ' ? '\0' : ri->ic);
-           add_grp(gb,gn,nra,aid,ndx_name);
-           nra = 0;
-         }
-       }
-      } 
+    /* find matching or complement atoms */
+    for (i = 0; (i < (int)num_index_groups); i++)
+    {
+        nra = 0;
+        for (n = 0; (n < atoms->nr); n++)
+        {
+            if (0 == gmx_strcasecmp(restype[atoms->atom[n].resind], "Protein"))
+            {
+                match = FALSE;
+                for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
+                {
+                    /* skip digits at beginning of atomname, e.g. 1H */
+                    atnm = *atoms->atomname[n];
+                    while (isdigit(atnm[0]))
+                    {
+                        atnm++;
+                    }
+                    if ( (constructing_data[i].wholename == -1) || (j < constructing_data[i].wholename) )
+                    {
+                        if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j], atnm))
+                        {
+                            match = TRUE;
+                        }
+                    }
+                    else
+                    {
+                        if (0 == gmx_strncasecmp(constructing_data[i].defining_atomnames[j], atnm, strlen(constructing_data[i].defining_atomnames[j])))
+                        {
+                            match = TRUE;
+                        }
+                    }
+                }
+                if (constructing_data[i].bTakeComplement != match)
+                {
+                    aid[nra++] = n;
+                }
+            }
+        }
+        /* if we want to add this group always or it differs from previous
+           group, add it: */
+        if (-1 == constructing_data[i].compareto || !grp_cmp(gb, nra, aid, constructing_data[i].compareto-i) )
+        {
+            add_grp(gb, gn, nra, aid, constructing_data[i].group_name);
+        }
     }
-    printf("Make group with sidechain and C=O swapped (y/n) ? ");
-    if (gmx_ask_yesno(bASK)) {
-      /* Make swap sidechain C=O index */
-      int resind,hold;
-      nra = 0;
-      for(n=0;((atoms->atom[n].resind < npres) && (n<atoms->nr));) {
-       resind = atoms->atom[n].resind;
-       hold  = -1;
-       for(;((atoms->atom[n].resind==resind) && (n<atoms->nr));n++)
-         if (strcmp("CA",*atoms->atomname[n]) == 0) {
-           aid[nra++]=n;
-           hold=nra;
-           nra+=2;
-         } else if (strcmp("C",*atoms->atomname[n]) == 0) {
-           if (hold == -1) {
-             gmx_incons("Atom naming problem");
-           }
-           aid[hold]=n;
-         } else if (strcmp("O",*atoms->atomname[n]) == 0) {
-           if (hold == -1) {
-             gmx_incons("Atom naming problem");
-           }
-           aid[hold+1]=n;
-         } else if (strcmp("O1",*atoms->atomname[n]) == 0) {
-           if (hold == -1) {
-             gmx_incons("Atom naming problem");
-           }
-           aid[hold+1]=n;
-         } else 
-           aid[nra++]=n;
-      }
-      /* copy the residuename to the tail of the groupname */
-      if (nra > 0) {
-       add_grp(gb,gn,nra,aid,"SwapSC-CO");
-       nra = 0;
-      } 
+
+    if (bASK)
+    {
+        for (i = 0; (i < (int)num_index_groups); i++)
+        {
+            printf("Split %12s into %5d residues (y/n) ? ", constructing_data[i].group_name, npres);
+            if (gmx_ask_yesno(bASK))
+            {
+                int resind;
+                nra = 0;
+                for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
+                {
+                    resind = atoms->atom[n].resind;
+                    for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
+                    {
+                        match = FALSE;
+                        for (j = 0; (j < constructing_data[i].num_defining_atomnames); j++)
+                        {
+                            if (0 == gmx_strcasecmp(constructing_data[i].defining_atomnames[j], *atoms->atomname[n]))
+                            {
+                                match = TRUE;
+                            }
+                        }
+                        if (constructing_data[i].bTakeComplement != match)
+                        {
+                            aid[nra++] = n;
+                        }
+                    }
+                    /* copy the residuename to the tail of the groupname */
+                    if (nra > 0)
+                    {
+                        t_resinfo *ri;
+                        ri = &atoms->resinfo[resind];
+                        sprintf(ndx_name, "%s_%s%d%c",
+                                constructing_data[i].group_name, *ri->name, ri->nr, ri->ic == ' ' ? '\0' : ri->ic);
+                        add_grp(gb, gn, nra, aid, ndx_name);
+                        nra = 0;
+                    }
+                }
+            }
+        }
+        printf("Make group with sidechain and C=O swapped (y/n) ? ");
+        if (gmx_ask_yesno(bASK))
+        {
+            /* Make swap sidechain C=O index */
+            int resind, hold;
+            nra = 0;
+            for (n = 0; ((atoms->atom[n].resind < npres) && (n < atoms->nr)); )
+            {
+                resind = atoms->atom[n].resind;
+                hold   = -1;
+                for (; ((atoms->atom[n].resind == resind) && (n < atoms->nr)); n++)
+                {
+                    if (strcmp("CA", *atoms->atomname[n]) == 0)
+                    {
+                        aid[nra++] = n;
+                        hold       = nra;
+                        nra       += 2;
+                    }
+                    else if (strcmp("C", *atoms->atomname[n]) == 0)
+                    {
+                        if (hold == -1)
+                        {
+                            gmx_incons("Atom naming problem");
+                        }
+                        aid[hold] = n;
+                    }
+                    else if (strcmp("O", *atoms->atomname[n]) == 0)
+                    {
+                        if (hold == -1)
+                        {
+                            gmx_incons("Atom naming problem");
+                        }
+                        aid[hold+1] = n;
+                    }
+                    else if (strcmp("O1", *atoms->atomname[n]) == 0)
+                    {
+                        if (hold == -1)
+                        {
+                            gmx_incons("Atom naming problem");
+                        }
+                        aid[hold+1] = n;
+                    }
+                    else
+                    {
+                        aid[nra++] = n;
+                    }
+                }
+            }
+            /* copy the residuename to the tail of the groupname */
+            if (nra > 0)
+            {
+                add_grp(gb, gn, nra, aid, "SwapSC-CO");
+                nra = 0;
+            }
+        }
     }
-  }
-  sfree(aid);
+    sfree(aid);
 }
 
 
@@ -494,45 +584,45 @@ static void analyse_prot(const char ** restype,t_atoms *atoms,
  * p_restype is set to a pointer to the type name, or 'Other' if we did not find it.
  */
 int
-gmx_residuetype_get_type(gmx_residuetype_t rt,const char * resname, const char ** p_restype)
+gmx_residuetype_get_type(gmx_residuetype_t rt, const char * resname, const char ** p_restype)
 {
-    int    i,rc;
-    
-    rc=-1;
-    for(i=0;i<rt->n && rc;i++)
+    int    i, rc;
+
+    rc = -1;
+    for (i = 0; i < rt->n && rc; i++)
     {
-        rc=gmx_strcasecmp(rt->resname[i],resname);
+        rc = gmx_strcasecmp(rt->resname[i], resname);
     }
-    
-    *p_restype = (rc==0) ? rt->restype[i-1] : gmx_residuetype_undefined;
-    
+
+    *p_restype = (rc == 0) ? rt->restype[i-1] : gmx_residuetype_undefined;
+
     return rc;
 }
 
 int
-gmx_residuetype_add(gmx_residuetype_t rt,const char *newresname, const char *newrestype)
+gmx_residuetype_add(gmx_residuetype_t rt, const char *newresname, const char *newrestype)
 {
-    int     i;
-    int     found;
+    int           i;
+    int           found;
     const char *  p_oldtype;
-    
-    found = !gmx_residuetype_get_type(rt,newresname,&p_oldtype);
-    
-    if(found && gmx_strcasecmp(p_oldtype,newrestype))
+
+    found = !gmx_residuetype_get_type(rt, newresname, &p_oldtype);
+
+    if (found && gmx_strcasecmp(p_oldtype, newrestype))
     {
-        fprintf(stderr,"Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
-                newresname,p_oldtype,newrestype);
+        fprintf(stderr, "Warning: Residue '%s' already present with type '%s' in database, ignoring new type '%s'.",
+                newresname, p_oldtype, newrestype);
     }
-    
-    if(found==0)
+
+    if (found == 0)
     {
-        srenew(rt->resname,rt->n+1);
-        srenew(rt->restype,rt->n+1);
-        rt->resname[rt->n]=strdup(newresname);
-        rt->restype[rt->n]=strdup(newrestype);
+        srenew(rt->resname, rt->n+1);
+        srenew(rt->restype, rt->n+1);
+        rt->resname[rt->n] = strdup(newresname);
+        rt->restype[rt->n] = strdup(newrestype);
         rt->n++;
     }
-  
+
     return 0;
 }
 
@@ -540,38 +630,38 @@ gmx_residuetype_add(gmx_residuetype_t rt,const char *newresname, const char *new
 int
 gmx_residuetype_init(gmx_residuetype_t *prt)
 {
-    FILE *  db;
-    char    line[STRLEN];
-    char    resname[STRLEN],restype[STRLEN],dum[STRLEN];
-    char *  p;
-    int     i;
+    FILE                 *  db;
+    char                    line[STRLEN];
+    char                    resname[STRLEN], restype[STRLEN], dum[STRLEN];
+    char                 *  p;
+    int                     i;
     struct gmx_residuetype *rt;
-    
-    snew(rt,1);
-    *prt=rt;
-    
+
+    snew(rt, 1);
+    *prt = rt;
+
     rt->n        = 0;
     rt->resname  = NULL;
-    rt->restype = NULL;
-    
-    db=libopen("residuetypes.dat");
-    
-    while(get_a_line(db,line,STRLEN)) 
+    rt->restype  = NULL;
+
+    db = libopen("residuetypes.dat");
+
+    while (get_a_line(db, line, STRLEN))
     {
         strip_comment(line);
         trim(line);
-        if(line[0]!='\0')
+        if (line[0] != '\0')
         {
-            if(sscanf(line,"%s %s %s",resname,restype,dum)!=2)
+            if (sscanf(line, "%s %s %s", resname, restype, dum) != 2)
             {
-                gmx_fatal(FARGS,"Incorrect number of columns (2 expected) for line in residuetypes.dat");
+                gmx_fatal(FARGS, "Incorrect number of columns (2 expected) for line in residuetypes.dat");
             }
-            gmx_residuetype_add(rt,resname,restype);
+            gmx_residuetype_add(rt, resname, restype);
         }
     }
-    
+
     fclose(db);
-    
+
     return 0;
 }
 
@@ -581,8 +671,8 @@ int
 gmx_residuetype_destroy(gmx_residuetype_t rt)
 {
     int i;
-    
-    for(i=0;i<rt->n;i++)
+
+    for (i = 0; i < rt->n; i++)
     {
         sfree(rt->resname[i]);
         sfree(rt->restype[i]);
@@ -590,7 +680,7 @@ gmx_residuetype_destroy(gmx_residuetype_t rt)
     sfree(rt->resname);
     sfree(rt->restype);
     sfree(rt);
-    
+
     return 0;
 }
 
@@ -599,88 +689,88 @@ gmx_residuetype_get_alltypes(gmx_residuetype_t    rt,
                              const char ***       p_typenames,
                              int *                ntypes)
 {
-    int      i,j,n;
-    int      found;
+    int            i, j, n;
+    int            found;
     const char **  my_typename;
-    char *   p;
-    
-    n=0;
-    
-    my_typename=NULL;
-    for(i=0;i<rt->n;i++)
+    char       *   p;
+
+    n = 0;
+
+    my_typename = NULL;
+    for (i = 0; i < rt->n; i++)
     {
-        p=rt->restype[i];
-        found=0;
-        for(j=0;j<n && !found;j++)
+        p     = rt->restype[i];
+        found = 0;
+        for (j = 0; j < n && !found; j++)
         {
-            found=!gmx_strcasecmp(p,my_typename[j]);
+            found = !gmx_strcasecmp(p, my_typename[j]);
         }
-        
-        if(!found)
+
+        if (!found)
         {
-            srenew(my_typename,n+1);
-            my_typename[n]=p;
+            srenew(my_typename, n+1);
+            my_typename[n] = p;
             n++;
         }
     }
-    *ntypes=n;
-    *p_typenames=my_typename; 
-    
+    *ntypes      = n;
+    *p_typenames = my_typename;
+
     return 0;
 }
-    
 
 
-gmx_bool 
+
+gmx_bool
 gmx_residuetype_is_protein(gmx_residuetype_t rt, const char *resnm)
 {
-    gmx_bool rc;
+    gmx_bool    rc;
     const char *p_type;
-    
-    if(gmx_residuetype_get_type(rt,resnm,&p_type)==0 &&
-       gmx_strcasecmp(p_type,"Protein")==0)
+
+    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
+        gmx_strcasecmp(p_type, "Protein") == 0)
     {
-        rc=TRUE;
+        rc = TRUE;
     }
     else
     {
-        rc=FALSE;
+        rc = FALSE;
     }
     return rc;
 }
 
-gmx_bool 
+gmx_bool
 gmx_residuetype_is_dna(gmx_residuetype_t rt, const char *resnm)
 {
-    gmx_bool rc;
+    gmx_bool    rc;
     const char *p_type;
 
-    if(gmx_residuetype_get_type(rt,resnm,&p_type)==0 &&
-       gmx_strcasecmp(p_type,"DNA")==0)
+    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
+        gmx_strcasecmp(p_type, "DNA") == 0)
     {
-        rc=TRUE;
+        rc = TRUE;
     }
     else
     {
-        rc=FALSE;
+        rc = FALSE;
     }
     return rc;
 }
 
-gmx_bool 
+gmx_bool
 gmx_residuetype_is_rna(gmx_residuetype_t rt, const char *resnm)
 {
-    gmx_bool rc;
+    gmx_bool    rc;
     const char *p_type;
 
-    if(gmx_residuetype_get_type(rt,resnm,&p_type)==0 &&
-       gmx_strcasecmp(p_type,"RNA")==0)
+    if (gmx_residuetype_get_type(rt, resnm, &p_type) == 0 &&
+        gmx_strcasecmp(p_type, "RNA") == 0)
     {
-        rc=TRUE;
+        rc = TRUE;
     }
     else
     {
-        rc=FALSE;
+        rc = FALSE;
     }
     return rc;
 }
@@ -699,12 +789,12 @@ gmx_residuetype_get_size(gmx_residuetype_t rt)
 int
 gmx_residuetype_get_index(gmx_residuetype_t rt, const char *resnm)
 {
-    int i,rc;
+    int i, rc;
 
-    rc=-1;
-    for(i=0;i<rt->n && rc;i++)
+    rc = -1;
+    for (i = 0; i < rt->n && rc; i++)
     {
-        rc=gmx_strcasecmp(rt->resname[i],resnm);
+        rc = gmx_strcasecmp(rt->resname[i], resnm);
     }
 
     return (0 == rc) ? i-1 : -1;
@@ -715,448 +805,538 @@ gmx_residuetype_get_index(gmx_residuetype_t rt, const char *resnm)
 const char *
 gmx_residuetype_get_name(gmx_residuetype_t rt, int index)
 {
-  if(index >= 0 && index < rt->n) {
-    return rt->resname[index];
-  } else {
-    return NULL;
-  }
+    if (index >= 0 && index < rt->n)
+    {
+        return rt->resname[index];
+    }
+    else
+    {
+        return NULL;
+    }
 }
 
 
 
-void analyse(t_atoms *atoms,t_blocka *gb,char ***gn,gmx_bool bASK,gmx_bool bVerb)
+void analyse(t_atoms *atoms, t_blocka *gb, char ***gn, gmx_bool bASK, gmx_bool bVerb)
 {
-    gmx_residuetype_t rt=NULL;
-    char    *resnm;
-    atom_id *aid;
-    const char **  restype;
-    int     nra;
-    int     i,k;
-    size_t  j;
-    int     ntypes;
-    char *  p;
-    const char ** p_typename;
-    int     iwater,iion;
-    int     nwater,nion;
-    int     found;
-    
+    gmx_residuetype_t rt = NULL;
+    char             *resnm;
+    atom_id          *aid;
+    const char    **  restype;
+    int               nra;
+    int               i, k;
+    size_t            j;
+    int               ntypes;
+    char           *  p;
+    const char     ** p_typename;
+    int               iwater, iion;
+    int               nwater, nion;
+    int               found;
+
     if (bVerb)
     {
         printf("Analysing residue names:\n");
     }
     /* Create system group, every single atom */
-    snew(aid,atoms->nr);
-    for(i=0;i<atoms->nr;i++)
+    snew(aid, atoms->nr);
+    for (i = 0; i < atoms->nr; i++)
     {
-        aid[i]=i;
+        aid[i] = i;
     }
-    add_grp(gb,gn,atoms->nr,aid,"System"); 
+    add_grp(gb, gn, atoms->nr, aid, "System");
     sfree(aid);
 
     /* For every residue, get a pointer to the residue type name */
     gmx_residuetype_init(&rt);
     assert(rt);
 
-    snew(restype,atoms->nres);
-    ntypes = 0;
+    snew(restype, atoms->nres);
+    ntypes     = 0;
     p_typename = NULL;
-    for(i=0;i<atoms->nres;i++)
+    for (i = 0; i < atoms->nres; i++)
     {
         resnm = *atoms->resinfo[i].name;
-        gmx_residuetype_get_type(rt,resnm,&(restype[i]));
+        gmx_residuetype_get_type(rt, resnm, &(restype[i]));
 
         /* Note that this does not lead to a N*N loop, but N*K, where
          * K is the number of residue _types_, which is small and independent of N.
          */
         found = 0;
-        for(k=0;k<ntypes && !found;k++)
+        for (k = 0; k < ntypes && !found; k++)
         {
-            found = !strcmp(restype[i],p_typename[k]);
+            found = !strcmp(restype[i], p_typename[k]);
         }
-        if(!found)
+        if (!found)
         {
-            srenew(p_typename,ntypes+1);
+            srenew(p_typename, ntypes+1);
             p_typename[ntypes++] = strdup(restype[i]);
         }
-    }    
-    
+    }
+
     if (bVerb)
     {
-        p_status(restype,atoms->nres,p_typename,ntypes);
+        p_status(restype, atoms->nres, p_typename, ntypes);
     }
 
-    for(k=0;k<ntypes;k++)
-    {              
-        aid=mk_aid(atoms,restype,p_typename[k],&nra,TRUE);
+    for (k = 0; k < ntypes; k++)
+    {
+        aid = mk_aid(atoms, restype, p_typename[k], &nra, TRUE);
 
         /* Check for special types to do fancy stuff with */
-        
-        if(!gmx_strcasecmp(p_typename[k],"Protein") && nra>0)
+
+        if (!gmx_strcasecmp(p_typename[k], "Protein") && nra > 0)
         {
             sfree(aid);
             /* PROTEIN */
-            analyse_prot(restype,atoms,gb,gn,bASK,bVerb);
-            
+            analyse_prot(restype, atoms, gb, gn, bASK, bVerb);
+
             /* Create a Non-Protein group */
-            aid=mk_aid(atoms,restype,"Protein",&nra,FALSE);
+            aid = mk_aid(atoms, restype, "Protein", &nra, FALSE);
             if ((nra > 0) && (nra < atoms->nr))
             {
-                add_grp(gb,gn,nra,aid,"non-Protein"); 
+                add_grp(gb, gn, nra, aid, "non-Protein");
             }
             sfree(aid);
         }
-        else if(!gmx_strcasecmp(p_typename[k],"Water") && nra>0)
+        else if (!gmx_strcasecmp(p_typename[k], "Water") && nra > 0)
         {
-            add_grp(gb,gn,nra,aid,p_typename[k]); 
+            add_grp(gb, gn, nra, aid, p_typename[k]);
             /* Add this group as 'SOL' too, for backward compatibility with older gromacs versions */
-            add_grp(gb,gn,nra,aid,"SOL"); 
+            add_grp(gb, gn, nra, aid, "SOL");
 
             sfree(aid);
 
             /* Solvent, create a negated group too */
-            aid=mk_aid(atoms,restype,"Water",&nra,FALSE);
+            aid = mk_aid(atoms, restype, "Water", &nra, FALSE);
             if ((nra > 0) && (nra < atoms->nr))
             {
-                add_grp(gb,gn,nra,aid,"non-Water"); 
+                add_grp(gb, gn, nra, aid, "non-Water");
             }
             sfree(aid);
         }
-        else if(nra>0)
+        else if (nra > 0)
         {
             /* Other groups */
-            add_grp(gb,gn,nra,aid,p_typename[k]); 
+            add_grp(gb, gn, nra, aid, p_typename[k]);
             sfree(aid);
-            analyse_other(restype,atoms,gb,gn,bASK,bVerb);
+            analyse_other(restype, atoms, gb, gn, bASK, bVerb);
         }
     }
-    
+
     sfree(p_typename);
     sfree(restype);
-    gmx_residuetype_destroy(rt);      
-    
+    gmx_residuetype_destroy(rt);
+
     /* Create a merged water_and_ions group */
     iwater = -1;
     iion   = -1;
     nwater = 0;
     nion   = 0;
-        
-    for(i=0;i<gb->nr;i++)
-    {        
-        if(!gmx_strcasecmp((*gn)[i],"Water"))
+
+    for (i = 0; i < gb->nr; i++)
+    {
+        if (!gmx_strcasecmp((*gn)[i], "Water"))
         {
             iwater = i;
             nwater = gb->index[i+1]-gb->index[i];
         }
-        else if(!gmx_strcasecmp((*gn)[i],"Ion"))
+        else if (!gmx_strcasecmp((*gn)[i], "Ion"))
         {
             iion = i;
             nion = gb->index[i+1]-gb->index[i];
         }
     }
-    
-    if(nwater>0 && nion>0)
+
+    if (nwater > 0 && nion > 0)
     {
-        srenew(gb->index,gb->nr+2);
-        srenew(*gn,gb->nr+1);
+        srenew(gb->index, gb->nr+2);
+        srenew(*gn, gb->nr+1);
         (*gn)[gb->nr] = strdup("Water_and_ions");
-        srenew(gb->a,gb->nra+nwater+nion);
-        if(nwater>0)
+        srenew(gb->a, gb->nra+nwater+nion);
+        if (nwater > 0)
         {
-            for(i=gb->index[iwater];i<gb->index[iwater+1];i++)
+            for (i = gb->index[iwater]; i < gb->index[iwater+1]; i++)
             {
                 gb->a[gb->nra++] = gb->a[i];
             }
         }
-        if(nion>0)
+        if (nion > 0)
         {
-            for(i=gb->index[iion];i<gb->index[iion+1];i++)
+            for (i = gb->index[iion]; i < gb->index[iion+1]; i++)
             {
                 gb->a[gb->nra++] = gb->a[i];
             }
         }
         gb->nr++;
-        gb->index[gb->nr]=gb->nra;
+        gb->index[gb->nr] = gb->nra;
     }
 }
 
 
-void check_index(char *gname,int n,atom_id index[],char *traj,int natoms)
+void check_index(char *gname, int n, atom_id index[], char *traj, int natoms)
 {
-  int i;
-  
-  for(i=0; i<n; i++)
-    if (index[i] >= natoms)
-      gmx_fatal(FARGS,"%s atom number (index[%d]=%d) is larger than the number of atoms in %s (%d)",
-                 gname ? gname : "Index",i+1, index[i]+1,
-                 traj ? traj : "the trajectory",natoms);
-    else if (index[i] < 0)
-      gmx_fatal(FARGS,"%s atom number (index[%d]=%d) is less than zero",
-               gname ? gname : "Index",i+1, index[i]+1);
+    int i;
+
+    for (i = 0; i < n; i++)
+    {
+        if (index[i] >= natoms)
+        {
+            gmx_fatal(FARGS, "%s atom number (index[%d]=%d) is larger than the number of atoms in %s (%d)",
+                      gname ? gname : "Index", i+1, index[i]+1,
+                      traj ? traj : "the trajectory", natoms);
+        }
+        else if (index[i] < 0)
+        {
+            gmx_fatal(FARGS, "%s atom number (index[%d]=%d) is less than zero",
+                      gname ? gname : "Index", i+1, index[i]+1);
+        }
+    }
 }
 
 t_blocka *init_index(const char *gfile, char ***grpname)
 {
-  FILE     *in;
-  t_blocka  *b;
-  int      a,maxentries;
-  int      i,j,ng,nread;
-  char     line[STRLEN],*pt,str[STRLEN];
-
-  in=gmx_fio_fopen(gfile,"r");
-  snew(b,1);
-  get_a_line(in,line,STRLEN);
-  if ( line[0]=='[' ) {
-    /* new format */
-    b->nr=0;
-    b->index=NULL;
-    b->nra=0;
-    b->a=NULL;
-    *grpname=NULL;
-    maxentries=0;
-    do {
-      if (get_header(line,str)) {
-       b->nr++;
-       srenew(b->index,b->nr+1);
-       srenew(*grpname,b->nr);
-       if (b->nr==1)
-         b->index[0]=0;
-       b->index[b->nr]=b->index[b->nr-1];
-       (*grpname)[b->nr-1]=strdup(str);
-      } else {
-          if (b->nr==0)
-          {
-              gmx_fatal(FARGS,"The first header of your indexfile is invalid");
-          }
-       pt=line;
-       while (sscanf(pt,"%s",str) == 1) {
-         i=b->index[b->nr];
-         if (i>=maxentries) {
-           maxentries+=1024;
-           srenew(b->a,maxentries);
-         }
-         b->a[i]=strtol(str, NULL, 10)-1;
-         b->index[b->nr]++;
-         (b->nra)++;
-         pt=strstr(pt,str)+strlen(str);
-       }
-      }
-    } while (get_a_line(in,line,STRLEN));
-  } 
-  else {
-    /* old format */
-    sscanf(line,"%d%d",&b->nr,&b->nra);
-    snew(b->index,b->nr+1);
-    snew(*grpname,b->nr);
-    b->index[0]=0;
-    snew(b->a,b->nra);
-    for (i=0; (i<b->nr); i++) {
-      nread=fscanf(in,"%s%d",str,&ng);
-      (*grpname)[i]=strdup(str);
-      b->index[i+1]=b->index[i]+ng;
-      if (b->index[i+1] > b->nra)
-       gmx_fatal(FARGS,"Something wrong in your indexfile at group %s",str);
-      for(j=0; (j<ng); j++) {
-       nread=fscanf(in,"%d",&a);
-       b->a[b->index[i]+j]=a;
-      }
+    FILE      *in;
+    t_blocka  *b;
+    int        a, maxentries;
+    int        i, j, ng, nread;
+    char       line[STRLEN], *pt, str[STRLEN];
+
+    in = gmx_fio_fopen(gfile, "r");
+    snew(b, 1);
+    get_a_line(in, line, STRLEN);
+    if (line[0] == '[')
+    {
+        /* new format */
+        b->nr      = 0;
+        b->index   = NULL;
+        b->nra     = 0;
+        b->a       = NULL;
+        *grpname   = NULL;
+        maxentries = 0;
+        do
+        {
+            if (get_header(line, str))
+            {
+                b->nr++;
+                srenew(b->index, b->nr+1);
+                srenew(*grpname, b->nr);
+                if (b->nr == 1)
+                {
+                    b->index[0] = 0;
+                }
+                b->index[b->nr]     = b->index[b->nr-1];
+                (*grpname)[b->nr-1] = strdup(str);
+            }
+            else
+            {
+                if (b->nr == 0)
+                {
+                    gmx_fatal(FARGS, "The first header of your indexfile is invalid");
+                }
+                pt = line;
+                while (sscanf(pt, "%s", str) == 1)
+                {
+                    i = b->index[b->nr];
+                    if (i >= maxentries)
+                    {
+                        maxentries += 1024;
+                        srenew(b->a, maxentries);
+                    }
+                    b->a[i] = strtol(str, NULL, 10)-1;
+                    b->index[b->nr]++;
+                    (b->nra)++;
+                    pt = strstr(pt, str)+strlen(str);
+                }
+            }
+        }
+        while (get_a_line(in, line, STRLEN));
     }
-  }
-  gmx_fio_fclose(in);
-
-  for(i=0; (i<b->nr); i++) {
-    for(j=b->index[i]; (j<b->index[i+1]); j++) {
-      if (b->a[j] < 0) 
-       fprintf(stderr,"\nWARNING: negative index %d in group %s\n\n",
-               b->a[j],(*grpname)[i]);
+    else
+    {
+        /* old format */
+        sscanf(line, "%d%d", &b->nr, &b->nra);
+        snew(b->index, b->nr+1);
+        snew(*grpname, b->nr);
+        b->index[0] = 0;
+        snew(b->a, b->nra);
+        for (i = 0; (i < b->nr); i++)
+        {
+            nread         = fscanf(in, "%s%d", str, &ng);
+            (*grpname)[i] = strdup(str);
+            b->index[i+1] = b->index[i]+ng;
+            if (b->index[i+1] > b->nra)
+            {
+                gmx_fatal(FARGS, "Something wrong in your indexfile at group %s", str);
+            }
+            for (j = 0; (j < ng); j++)
+            {
+                nread               = fscanf(in, "%d", &a);
+                b->a[b->index[i]+j] = a;
+            }
+        }
+    }
+    gmx_fio_fclose(in);
+
+    for (i = 0; (i < b->nr); i++)
+    {
+        for (j = b->index[i]; (j < b->index[i+1]); j++)
+        {
+            if (b->a[j] < 0)
+            {
+                fprintf(stderr, "\nWARNING: negative index %d in group %s\n\n",
+                        b->a[j], (*grpname)[i]);
+            }
+        }
     }
-  }
-  
-  return b;
+
+    return b;
 }
 
 static void minstring(char *str)
 {
-  int i;
+    int i;
 
-  for (i=0; (i < (int)strlen(str)); i++) 
-    if (str[i]=='-')
-      str[i]='_';
+    for (i = 0; (i < (int)strlen(str)); i++)
+    {
+        if (str[i] == '-')
+        {
+            str[i] = '_';
+        }
+    }
 }
 
 int find_group(char s[], int ngrps, char **grpname)
 {
-  int aa, i, n;
-  char string[STRLEN];
-  gmx_bool bMultiple;
-  
-  bMultiple = FALSE;
-  n = strlen(s);
-  aa=NOTSET;
-  /* first look for whole name match */
-  if (aa==NOTSET)
-    for(i=0; i<ngrps; i++)
-      if (gmx_strcasecmp_min(s,grpname[i])==0) {
-       if(aa!=NOTSET)
-         bMultiple = TRUE;
-       aa=i;
-      }
-  /* second look for first string match */
-  if (aa==NOTSET)
-    for(i=0; i<ngrps; i++)
-      if (gmx_strncasecmp_min(s,grpname[i],n)==0) {
-       if(aa!=NOTSET)
-         bMultiple = TRUE;
-       aa=i;
-      }
-  /* last look for arbitrary substring match */
-  if (aa==NOTSET) {
-    upstring(s);
-    minstring(s);
-    for(i=0; i<ngrps; i++) {
-      strcpy(string, grpname[i]);
-      upstring(string);
-      minstring(string);
-      if (strstr(string,s)!=NULL) {
-       if(aa!=NOTSET)
-         bMultiple = TRUE;
-       aa=i;
-      }
+    int      aa, i, n;
+    char     string[STRLEN];
+    gmx_bool bMultiple;
+
+    bMultiple = FALSE;
+    n         = strlen(s);
+    aa        = NOTSET;
+    /* first look for whole name match */
+    if (aa == NOTSET)
+    {
+        for (i = 0; i < ngrps; i++)
+        {
+            if (gmx_strcasecmp_min(s, grpname[i]) == 0)
+            {
+                if (aa != NOTSET)
+                {
+                    bMultiple = TRUE;
+                }
+                aa = i;
+            }
+        }
+    }
+    /* second look for first string match */
+    if (aa == NOTSET)
+    {
+        for (i = 0; i < ngrps; i++)
+        {
+            if (gmx_strncasecmp_min(s, grpname[i], n) == 0)
+            {
+                if (aa != NOTSET)
+                {
+                    bMultiple = TRUE;
+                }
+                aa = i;
+            }
+        }
+    }
+    /* last look for arbitrary substring match */
+    if (aa == NOTSET)
+    {
+        upstring(s);
+        minstring(s);
+        for (i = 0; i < ngrps; i++)
+        {
+            strcpy(string, grpname[i]);
+            upstring(string);
+            minstring(string);
+            if (strstr(string, s) != NULL)
+            {
+                if (aa != NOTSET)
+                {
+                    bMultiple = TRUE;
+                }
+                aa = i;
+            }
+        }
+    }
+    if (bMultiple)
+    {
+        printf("Error: Multiple groups '%s' selected\n", s);
+        aa = NOTSET;
     }
-  }
-  if (bMultiple) {
-    printf("Error: Multiple groups '%s' selected\n", s);
-    aa=NOTSET;
-  }
-  return aa;
+    return aa;
 }
 
 static int qgroup(int *a, int ngrps, char **grpname)
 {
-    char s[STRLEN];
-    int  aa;
+    char     s[STRLEN];
+    int      aa;
     gmx_bool bInRange;
-    char *end;
+    char    *end;
 
-    do {
-        fprintf(stderr,"Select a group: ");
-        do {
-            if ( scanf("%s",s)!=1 ) 
-                gmx_fatal(FARGS,"Cannot read from input");
+    do
+    {
+        fprintf(stderr, "Select a group: ");
+        do
+        {
+            if (scanf("%s", s) != 1)
+            {
+                gmx_fatal(FARGS, "Cannot read from input");
+            }
             trim(s); /* remove spaces */
-        } while (strlen(s)==0);
+        }
+        while (strlen(s) == 0);
         aa = strtol(s, &end, 10);
-        if (aa==0 && end[0] != '\0') /* string entered */
+        if (aa == 0 && end[0] != '\0') /* string entered */
+        {
             aa = find_group(s, ngrps, grpname);
+        }
         bInRange = (aa >= 0 && aa < ngrps);
         if (!bInRange)
+        {
             printf("Error: No such group '%s'\n", s);
-    } while (!bInRange);
+        }
+    }
+    while (!bInRange);
     printf("Selected %d: '%s'\n", aa, grpname[aa]);
     *a = aa;
     return aa;
 }
 
-static void rd_groups(t_blocka *grps,char **grpname,char *gnames[],
-                     int ngrps,int isize[],atom_id *index[],int grpnr[])
+static void rd_groups(t_blocka *grps, char **grpname, char *gnames[],
+                      int ngrps, int isize[], atom_id *index[], int grpnr[])
 {
-  int i,j,gnr1;
-
-  if (grps->nr==0)
-    gmx_fatal(FARGS,"Error: no groups in indexfile");
-  for(i=0; (i<grps->nr); i++)
-    fprintf(stderr,"Group %5d (%15s) has %5d elements\n",i,grpname[i],
-          grps->index[i+1]-grps->index[i]);
-  for(i=0; (i<ngrps); i++) {
-    if (grps->nr > 1)
-      do {
-       gnr1=qgroup(&grpnr[i], grps->nr, grpname);
-       if ((gnr1<0) || (gnr1>=grps->nr))
-         fprintf(stderr,"Select between %d and %d.\n",0,grps->nr-1);
-      }        while ((gnr1<0) || (gnr1>=grps->nr));
-    else {
-      fprintf(stderr,"There is one group in the index\n");
-      gnr1=0;
+    int i, j, gnr1;
+
+    if (grps->nr == 0)
+    {
+        gmx_fatal(FARGS, "Error: no groups in indexfile");
+    }
+    for (i = 0; (i < grps->nr); i++)
+    {
+        fprintf(stderr, "Group %5d (%15s) has %5d elements\n", i, grpname[i],
+                grps->index[i+1]-grps->index[i]);
+    }
+    for (i = 0; (i < ngrps); i++)
+    {
+        if (grps->nr > 1)
+        {
+            do
+            {
+                gnr1 = qgroup(&grpnr[i], grps->nr, grpname);
+                if ((gnr1 < 0) || (gnr1 >= grps->nr))
+                {
+                    fprintf(stderr, "Select between %d and %d.\n", 0, grps->nr-1);
+                }
+            }
+            while ((gnr1 < 0) || (gnr1 >= grps->nr));
+        }
+        else
+        {
+            fprintf(stderr, "There is one group in the index\n");
+            gnr1 = 0;
+        }
+        gnames[i] = strdup(grpname[gnr1]);
+        isize[i]  = grps->index[gnr1+1]-grps->index[gnr1];
+        snew(index[i], isize[i]);
+        for (j = 0; (j < isize[i]); j++)
+        {
+            index[i][j] = grps->a[grps->index[gnr1]+j];
+        }
     }
-    gnames[i]=strdup(grpname[gnr1]);
-    isize[i]=grps->index[gnr1+1]-grps->index[gnr1];
-    snew(index[i],isize[i]);
-    for(j=0; (j<isize[i]); j++)
-      index[i][j]=grps->a[grps->index[gnr1]+j];
-  }
 }
 
-void rd_index(const char *statfile,int ngrps,int isize[],
-             atom_id *index[],char *grpnames[])
+void rd_index(const char *statfile, int ngrps, int isize[],
+              atom_id *index[], char *grpnames[])
 {
-  char    **gnames;
-  t_blocka *grps;
-  int     *grpnr;
-  
-  snew(grpnr,ngrps);
-  if (!statfile)
-    gmx_fatal(FARGS,"No index file specified");
-  grps=init_index(statfile,&gnames);
-  rd_groups(grps,gnames,grpnames,ngrps,isize,index,grpnr);
+    char    **gnames;
+    t_blocka *grps;
+    int      *grpnr;
+
+    snew(grpnr, ngrps);
+    if (!statfile)
+    {
+        gmx_fatal(FARGS, "No index file specified");
+    }
+    grps = init_index(statfile, &gnames);
+    rd_groups(grps, gnames, grpnames, ngrps, isize, index, grpnr);
 }
 
-void rd_index_nrs(char *statfile,int ngrps,int isize[],
-                 atom_id *index[],char *grpnames[],int grpnr[])
+void rd_index_nrs(char *statfile, int ngrps, int isize[],
+                  atom_id *index[], char *grpnames[], int grpnr[])
 {
-  char    **gnames;
-  t_blocka *grps;
-  
-  if (!statfile)
-    gmx_fatal(FARGS,"No index file specified");
-  grps=init_index(statfile,&gnames);
-  
-  rd_groups(grps,gnames,grpnames,ngrps,isize,index,grpnr);
+    char    **gnames;
+    t_blocka *grps;
+
+    if (!statfile)
+    {
+        gmx_fatal(FARGS, "No index file specified");
+    }
+    grps = init_index(statfile, &gnames);
+
+    rd_groups(grps, gnames, grpnames, ngrps, isize, index, grpnr);
 }
 
 void get_index(t_atoms *atoms, const char *fnm, int ngrps,
-              int isize[], atom_id *index[],char *grpnames[])
+               int isize[], atom_id *index[], char *grpnames[])
 {
-  char    ***gnames;
-  t_blocka *grps = NULL; 
-  int     *grpnr;
-  
-  snew(grpnr,ngrps);
-  snew(gnames,1);
-  if (fnm != NULL) {
-    grps=init_index(fnm,gnames);
-  }
-  else if (atoms) {
-    snew(grps,1);
-    snew(grps->index,1);
-    analyse(atoms,grps,gnames,FALSE,FALSE);
-  }
-  else 
-    gmx_incons("You need to supply a valid atoms structure or a valid index file name");
-  
-  rd_groups(grps,*gnames,grpnames,ngrps,isize,index,grpnr);
+    char    ***gnames;
+    t_blocka  *grps = NULL;
+    int       *grpnr;
+
+    snew(grpnr, ngrps);
+    snew(gnames, 1);
+    if (fnm != NULL)
+    {
+        grps = init_index(fnm, gnames);
+    }
+    else if (atoms)
+    {
+        snew(grps, 1);
+        snew(grps->index, 1);
+        analyse(atoms, grps, gnames, FALSE, FALSE);
+    }
+    else
+    {
+        gmx_incons("You need to supply a valid atoms structure or a valid index file name");
+    }
+
+    rd_groups(grps, *gnames, grpnames, ngrps, isize, index, grpnr);
 }
 
-t_cluster_ndx *cluster_index(FILE *fplog,const char *ndx)
+t_cluster_ndx *cluster_index(FILE *fplog, const char *ndx)
 {
-  t_cluster_ndx *c;
-  int i;
-  
-  snew(c,1);
-  c->clust     = init_index(ndx,&c->grpname);
-  c->maxframe = -1;
-  for(i=0; (i<c->clust->nra); i++)
-    c->maxframe = max(c->maxframe,c->clust->a[i]);
-  fprintf(fplog ? fplog : stdout,
-         "There are %d clusters containing %d structures, highest framenr is %d\n",
-         c->clust->nr,c->clust->nra,c->maxframe);
-  if (debug) {
-    pr_blocka(debug,0,"clust",c->clust,TRUE);
-    for(i=0; (i<c->clust->nra); i++)
-      if ((c->clust->a[i] < 0) || (c->clust->a[i] > c->maxframe))
-       gmx_fatal(FARGS,"Range check error for c->clust->a[%d] = %d\n"
-                 "should be within 0 and %d",i,c->clust->a[i],c->maxframe+1);
-  }
-  c->inv_clust=make_invblocka(c->clust,c->maxframe);
-         
-  return c;
-}
+    t_cluster_ndx *c;
+    int            i;
+
+    snew(c, 1);
+    c->clust     = init_index(ndx, &c->grpname);
+    c->maxframe  = -1;
+    for (i = 0; (i < c->clust->nra); i++)
+    {
+        c->maxframe = max(c->maxframe, c->clust->a[i]);
+    }
+    fprintf(fplog ? fplog : stdout,
+            "There are %d clusters containing %d structures, highest framenr is %d\n",
+            c->clust->nr, c->clust->nra, c->maxframe);
+    if (debug)
+    {
+        pr_blocka(debug, 0, "clust", c->clust, TRUE);
+        for (i = 0; (i < c->clust->nra); i++)
+        {
+            if ((c->clust->a[i] < 0) || (c->clust->a[i] > c->maxframe))
+            {
+                gmx_fatal(FARGS, "Range check error for c->clust->a[%d] = %d\n"
+                          "should be within 0 and %d", i, c->clust->a[i], c->maxframe+1);
+            }
+        }
+    }
+    c->inv_clust = make_invblocka(c->clust, c->maxframe);
 
+    return c;
+}