Code beautification with uncrustify
[alexxy/gromacs.git] / src / tools / gmx_enemat.c
index b5d7be8c60bdbcb7651223e8dedb114776f53747..bff527f2b066f97d1d065f6530e6a34e94fa47ea 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
  */
 #include "gmx_ana.h"
 
 
-static int search_str2(int nstr,char **str,char *key)
+static int search_str2(int nstr, char **str, char *key)
 {
-  int  i,n;
-  int  keylen = strlen(key);
-  /* Linear search */
-  n=0;
-  while( (n<keylen) && ((key[n]<'0') || (key[n]>'9')) )
-    n++;
-  for(i=0; (i<nstr); i++) 
-    if (gmx_strncasecmp(str[i],key,n)==0)
-      return i;
+    int  i, n;
+    int  keylen = strlen(key);
+    /* Linear search */
+    n = 0;
+    while ( (n < keylen) && ((key[n] < '0') || (key[n] > '9')) )
+    {
+        n++;
+    }
+    for (i = 0; (i < nstr); i++)
+    {
+        if (gmx_strncasecmp(str[i], key, n) == 0)
+        {
+            return i;
+        }
+    }
 
-  return -1;
+    return -1;
 }
 
-int gmx_enemat(int argc,char *argv[])
+int gmx_enemat(int argc, char *argv[])
 {
-  const char *desc[] = {
-    "[TT]g_enemat[tt] extracts an energy matrix from the energy file ([TT]-f[tt]).",
-    "With [TT]-groups[tt] a file must be supplied with on each",
-    "line a group of atoms to be used. For these groups matrix of",
-    "interaction energies will be extracted from the energy file",
-    "by looking for energy groups with names corresponding to pairs",
-    "of groups of atoms, e.g. if your [TT]-groups[tt] file contains:[BR]",
-    "[TT]2[tt][BR]",
-    "[TT]Protein[tt][BR]",
-    "[TT]SOL[tt][BR]",
-    "then energy groups with names like 'Coul-SR:Protein-SOL' and ",
-    "'LJ:Protein-SOL' are expected in the energy file (although",
-    "[TT]g_enemat[tt] is most useful if many groups are analyzed",
-    "simultaneously). Matrices for different energy types are written",
-    "out separately, as controlled by the",
-    "[TT]-[no]coul[tt], [TT]-[no]coulr[tt], [TT]-[no]coul14[tt], ",
-    "[TT]-[no]lj[tt], [TT]-[no]lj14[tt], ",
-    "[TT]-[no]bham[tt] and [TT]-[no]free[tt] options.",
-    "Finally, the total interaction energy energy per group can be ",
-    "calculated ([TT]-etot[tt]).[PAR]",
-    
-    "An approximation of the free energy can be calculated using:",
-    "[MATH]E[SUB]free[sub] = E[SUB]0[sub] + kT [LOG][CHEVRON][EXP](E-E[SUB]0[sub])/kT[exp][chevron][log][math], where '[MATH][CHEVRON][chevron][math]'",
-    "stands for time-average. A file with reference free energies",
-    "can be supplied to calculate the free energy difference",
-    "with some reference state. Group names (e.g. residue names)",
-    "in the reference file should correspond to the group names",
-    "as used in the [TT]-groups[tt] file, but a appended number",
-    "(e.g. residue number) in the [TT]-groups[tt] will be ignored",
-    "in the comparison."
-  };
-  static gmx_bool bSum=FALSE;
-  static gmx_bool bMeanEmtx=TRUE;
-  static int  skip=0,nlevels=20;
-  static real cutmax=1e20,cutmin=-1e20,reftemp=300.0;
-  static gmx_bool bCoulSR=TRUE,bCoulLR=FALSE,bCoul14=FALSE;
-  static gmx_bool bLJSR=TRUE,bLJLR=FALSE,bLJ14=FALSE,bBhamSR=FALSE,bBhamLR=FALSE,
-    bFree=TRUE;
-  t_pargs pa[] = {
-    { "-sum",  FALSE, etBOOL, {&bSum},
-      "Sum the energy terms selected rather than display them all" },
-    { "-skip", FALSE, etINT,  {&skip},
-      "Skip number of frames between data points" },
-    { "-mean", FALSE, etBOOL, {&bMeanEmtx},
-      "with [TT]-groups[tt] extracts matrix of mean energies instead of "
-      "matrix for each timestep" },
-    { "-nlevels", FALSE, etINT, {&nlevels},"number of levels for matrix colors"},
-    { "-max",FALSE, etREAL, {&cutmax},"max value for energies"},
-    { "-min",FALSE, etREAL, {&cutmin},"min value for energies"},
-    { "-coulsr", FALSE, etBOOL, {&bCoulSR},"extract Coulomb SR energies"},
-    { "-coullr", FALSE, etBOOL, {&bCoulLR},"extract Coulomb LR energies"},
-    { "-coul14",FALSE, etBOOL, {&bCoul14},"extract Coulomb 1-4 energies"},
-    { "-ljsr", FALSE, etBOOL, {&bLJSR},"extract Lennard-Jones SR energies"},
-    { "-ljlr", FALSE, etBOOL, {&bLJLR},"extract Lennard-Jones LR energies"},
-    { "-lj14",FALSE, etBOOL, {&bLJ14},"extract Lennard-Jones 1-4 energies"},
-    { "-bhamsr",FALSE, etBOOL, {&bBhamSR},"extract Buckingham SR energies"},
-    { "-bhamlr",FALSE, etBOOL, {&bBhamLR},"extract Buckingham LR energies"},
-    { "-free",FALSE, etBOOL, {&bFree},"calculate free energy"},
-    { "-temp",FALSE, etREAL, {&reftemp},
-      "reference temperature for free energy calculation"}
-  };
-  /* We will define egSP more energy-groups: 
-     egTotal (total energy) */
+    const char     *desc[] = {
+        "[TT]g_enemat[tt] extracts an energy matrix from the energy file ([TT]-f[tt]).",
+        "With [TT]-groups[tt] a file must be supplied with on each",
+        "line a group of atoms to be used. For these groups matrix of",
+        "interaction energies will be extracted from the energy file",
+        "by looking for energy groups with names corresponding to pairs",
+        "of groups of atoms, e.g. if your [TT]-groups[tt] file contains:[BR]",
+        "[TT]2[tt][BR]",
+        "[TT]Protein[tt][BR]",
+        "[TT]SOL[tt][BR]",
+        "then energy groups with names like 'Coul-SR:Protein-SOL' and ",
+        "'LJ:Protein-SOL' are expected in the energy file (although",
+        "[TT]g_enemat[tt] is most useful if many groups are analyzed",
+        "simultaneously). Matrices for different energy types are written",
+        "out separately, as controlled by the",
+        "[TT]-[no]coul[tt], [TT]-[no]coulr[tt], [TT]-[no]coul14[tt], ",
+        "[TT]-[no]lj[tt], [TT]-[no]lj14[tt], ",
+        "[TT]-[no]bham[tt] and [TT]-[no]free[tt] options.",
+        "Finally, the total interaction energy energy per group can be ",
+        "calculated ([TT]-etot[tt]).[PAR]",
+
+        "An approximation of the free energy can be calculated using:",
+        "[MATH]E[SUB]free[sub] = E[SUB]0[sub] + kT [LOG][CHEVRON][EXP](E-E[SUB]0[sub])/kT[exp][chevron][log][math], where '[MATH][CHEVRON][chevron][math]'",
+        "stands for time-average. A file with reference free energies",
+        "can be supplied to calculate the free energy difference",
+        "with some reference state. Group names (e.g. residue names)",
+        "in the reference file should correspond to the group names",
+        "as used in the [TT]-groups[tt] file, but a appended number",
+        "(e.g. residue number) in the [TT]-groups[tt] will be ignored",
+        "in the comparison."
+    };
+    static gmx_bool bSum      = FALSE;
+    static gmx_bool bMeanEmtx = TRUE;
+    static int      skip      = 0, nlevels = 20;
+    static real     cutmax    = 1e20, cutmin = -1e20, reftemp = 300.0;
+    static gmx_bool bCoulSR   = TRUE, bCoulLR = FALSE, bCoul14 = FALSE;
+    static gmx_bool bLJSR     = TRUE, bLJLR = FALSE, bLJ14 = FALSE, bBhamSR = FALSE, bBhamLR = FALSE,
+                    bFree     = TRUE;
+    t_pargs         pa[]      = {
+        { "-sum",  FALSE, etBOOL, {&bSum},
+          "Sum the energy terms selected rather than display them all" },
+        { "-skip", FALSE, etINT,  {&skip},
+          "Skip number of frames between data points" },
+        { "-mean", FALSE, etBOOL, {&bMeanEmtx},
+          "with [TT]-groups[tt] extracts matrix of mean energies instead of "
+          "matrix for each timestep" },
+        { "-nlevels", FALSE, etINT, {&nlevels}, "number of levels for matrix colors"},
+        { "-max", FALSE, etREAL, {&cutmax}, "max value for energies"},
+        { "-min", FALSE, etREAL, {&cutmin}, "min value for energies"},
+        { "-coulsr", FALSE, etBOOL, {&bCoulSR}, "extract Coulomb SR energies"},
+        { "-coullr", FALSE, etBOOL, {&bCoulLR}, "extract Coulomb LR energies"},
+        { "-coul14", FALSE, etBOOL, {&bCoul14}, "extract Coulomb 1-4 energies"},
+        { "-ljsr", FALSE, etBOOL, {&bLJSR}, "extract Lennard-Jones SR energies"},
+        { "-ljlr", FALSE, etBOOL, {&bLJLR}, "extract Lennard-Jones LR energies"},
+        { "-lj14", FALSE, etBOOL, {&bLJ14}, "extract Lennard-Jones 1-4 energies"},
+        { "-bhamsr", FALSE, etBOOL, {&bBhamSR}, "extract Buckingham SR energies"},
+        { "-bhamlr", FALSE, etBOOL, {&bBhamLR}, "extract Buckingham LR energies"},
+        { "-free", FALSE, etBOOL, {&bFree}, "calculate free energy"},
+        { "-temp", FALSE, etREAL, {&reftemp},
+          "reference temperature for free energy calculation"}
+    };
+    /* We will define egSP more energy-groups:
+       egTotal (total energy) */
 #define egTotal egNR
 #define egSP 1
-  gmx_bool       egrp_use[egNR+egSP];
-  ener_file_t in;
-  FILE       *out;
-  int        timecheck=0;
-  gmx_enxnm_t *enm=NULL;
-  t_enxframe *fr;
-  int        teller=0;
-  real       sum;
-  gmx_bool       bCont,bRef;
-  gmx_bool       bCutmax,bCutmin;
-  real       **eneset,*time=NULL;
-  int        *set,i,j,k,prevk,m=0,n,nre,nset,nenergy;
-  char       **groups = NULL;
-  char       groupname[255],fn[255];
-  int        ngroups;
-  t_rgb      rlo,rhi,rmid;
-  real       emax,emid,emin;
-  real       ***emat,**etot,*groupnr;
-  double     beta,expE,**e,*eaver,*efree=NULL,edum;
-  char       label[234];
-  char       **ereflines,**erefres=NULL;
-  real       *eref=NULL,*edif=NULL;
-  int        neref=0;
-  output_env_t oenv;
+    gmx_bool       egrp_use[egNR+egSP];
+    ener_file_t    in;
+    FILE          *out;
+    int            timecheck = 0;
+    gmx_enxnm_t   *enm       = NULL;
+    t_enxframe    *fr;
+    int            teller = 0;
+    real           sum;
+    gmx_bool       bCont, bRef;
+    gmx_bool       bCutmax, bCutmin;
+    real         **eneset, *time = NULL;
+    int           *set, i, j, k, prevk, m = 0, n, nre, nset, nenergy;
+    char         **groups = NULL;
+    char           groupname[255], fn[255];
+    int            ngroups;
+    t_rgb          rlo, rhi, rmid;
+    real           emax, emid, emin;
+    real        ***emat, **etot, *groupnr;
+    double         beta, expE, **e, *eaver, *efree = NULL, edum;
+    char           label[234];
+    char         **ereflines, **erefres = NULL;
+    real          *eref  = NULL, *edif = NULL;
+    int            neref = 0;
+    output_env_t   oenv;
 
-  t_filenm   fnm[] = {
-    { efEDR, "-f", NULL, ffOPTRD },
-    { efDAT, "-groups", "groups.dat", ffREAD },
-    { efDAT, "-eref",   "eref.dat", ffOPTRD },
-    { efXPM, "-emat",   "emat", ffWRITE },
-    { efXVG, "-etot",   "energy", ffWRITE }
-  };
+    t_filenm       fnm[] = {
+        { efEDR, "-f", NULL, ffOPTRD },
+        { efDAT, "-groups", "groups.dat", ffREAD },
+        { efDAT, "-eref",   "eref.dat", ffOPTRD },
+        { efXPM, "-emat",   "emat", ffWRITE },
+        { efXVG, "-etot",   "energy", ffWRITE }
+    };
 #define NFILE asize(fnm)
 
-  parse_common_args(&argc,argv,PCA_CAN_VIEW | PCA_CAN_TIME | PCA_BE_NICE,
-                   NFILE,fnm,asize(pa),pa,asize(desc),desc,0,NULL,&oenv);
-  
-  egrp_use[egCOULSR]=bCoulSR;
-  egrp_use[egLJSR]=bLJSR;
-  egrp_use[egBHAMSR]=bBhamSR;
-  egrp_use[egCOULLR]=bCoulLR;
-  egrp_use[egLJLR]=bLJLR;
-  egrp_use[egBHAMLR]=bBhamLR;
-  egrp_use[egCOUL14]=bCoul14;
-  egrp_use[egLJ14]=bLJ14;
-  egrp_use[egTotal]=TRUE;
-  
-  bRef=opt2bSet("-eref",NFILE,fnm);
-  in=open_enx(ftp2fn(efEDR,NFILE,fnm),"r");
-  do_enxnms(in,&nre,&enm);
-  
-  if (nre == 0)
-    gmx_fatal(FARGS,"No energies!\n");
-  
-  bCutmax=opt2parg_bSet("-max",asize(pa),pa);
-  bCutmin=opt2parg_bSet("-min",asize(pa),pa);
+    parse_common_args(&argc, argv, PCA_CAN_VIEW | PCA_CAN_TIME | PCA_BE_NICE,
+                      NFILE, fnm, asize(pa), pa, asize(desc), desc, 0, NULL, &oenv);
+
+    egrp_use[egCOULSR] = bCoulSR;
+    egrp_use[egLJSR]   = bLJSR;
+    egrp_use[egBHAMSR] = bBhamSR;
+    egrp_use[egCOULLR] = bCoulLR;
+    egrp_use[egLJLR]   = bLJLR;
+    egrp_use[egBHAMLR] = bBhamLR;
+    egrp_use[egCOUL14] = bCoul14;
+    egrp_use[egLJ14]   = bLJ14;
+    egrp_use[egTotal]  = TRUE;
+
+    bRef = opt2bSet("-eref", NFILE, fnm);
+    in   = open_enx(ftp2fn(efEDR, NFILE, fnm), "r");
+    do_enxnms(in, &nre, &enm);
+
+    if (nre == 0)
+    {
+        gmx_fatal(FARGS, "No energies!\n");
+    }
+
+    bCutmax = opt2parg_bSet("-max", asize(pa), pa);
+    bCutmin = opt2parg_bSet("-min", asize(pa), pa);
 
-  nenergy = 0;
+    nenergy = 0;
 
-  /* Read groupnames from input file and construct selection of 
-     energy groups from it*/
-  
-  fprintf(stderr,"Will read groupnames from inputfile\n");
-  ngroups = get_lines(opt2fn("-groups",NFILE,fnm), &groups);
-  fprintf(stderr,"Read %d groups\n",ngroups);
-  snew(set,sqr(ngroups)*egNR/2);
-  n=0;
-  prevk=0;
-  for (i=0; (i<ngroups); i++) {
-    fprintf(stderr,"\rgroup %d",i);
-    for (j=i; (j<ngroups); j++)
-      for(m=0; (m<egNR); m++) 
-       if (egrp_use[m]) {
-         sprintf(groupname,"%s:%s-%s",egrp_nm[m],groups[i],groups[j]);
+    /* Read groupnames from input file and construct selection of
+       energy groups from it*/
+
+    fprintf(stderr, "Will read groupnames from inputfile\n");
+    ngroups = get_lines(opt2fn("-groups", NFILE, fnm), &groups);
+    fprintf(stderr, "Read %d groups\n", ngroups);
+    snew(set, sqr(ngroups)*egNR/2);
+    n     = 0;
+    prevk = 0;
+    for (i = 0; (i < ngroups); i++)
+    {
+        fprintf(stderr, "\rgroup %d", i);
+        for (j = i; (j < ngroups); j++)
+        {
+            for (m = 0; (m < egNR); m++)
+            {
+                if (egrp_use[m])
+                {
+                    sprintf(groupname, "%s:%s-%s", egrp_nm[m], groups[i], groups[j]);
 #ifdef DEBUG
-         fprintf(stderr,"\r%-15s %5d",groupname,n);
+                    fprintf(stderr, "\r%-15s %5d", groupname, n);
 #endif
-         for(k=prevk; (k<prevk+nre); k++)
-           if (strcmp(enm[k%nre].name,groupname) == 0) {
-             set[n++] = k;
-             break;
-           }
-         if (k==prevk+nre)
-           fprintf(stderr,"WARNING! could not find group %s (%d,%d)"
-                   "in energy file\n",groupname,i,j);
-         else
-           prevk = k;
-       }
-  }
-  fprintf(stderr,"\n");
-  nset=n;
-  snew(eneset,nset+1);
-  fprintf(stderr,"Will select half-matrix of energies with %d elements\n",n);
+                    for (k = prevk; (k < prevk+nre); k++)
+                    {
+                        if (strcmp(enm[k%nre].name, groupname) == 0)
+                        {
+                            set[n++] = k;
+                            break;
+                        }
+                    }
+                    if (k == prevk+nre)
+                    {
+                        fprintf(stderr, "WARNING! could not find group %s (%d,%d)"
+                                "in energy file\n", groupname, i, j);
+                    }
+                    else
+                    {
+                        prevk = k;
+                    }
+                }
+            }
+        }
+    }
+    fprintf(stderr, "\n");
+    nset = n;
+    snew(eneset, nset+1);
+    fprintf(stderr, "Will select half-matrix of energies with %d elements\n", n);
 
-  /* Start reading energy frames */  
-  snew(fr,1);
-  do {
-    do {
-      bCont=do_enx(in,fr);
-      if (bCont)
-       timecheck=check_times(fr->t);
-    } while (bCont && (timecheck < 0));
-    
-    if (timecheck == 0) {
+    /* Start reading energy frames */
+    snew(fr, 1);
+    do
+    {
+        do
+        {
+            bCont = do_enx(in, fr);
+            if (bCont)
+            {
+                timecheck = check_times(fr->t);
+            }
+        }
+        while (bCont && (timecheck < 0));
+
+        if (timecheck == 0)
+        {
 #define DONTSKIP(cnt) (skip) ? ((cnt % skip) == 0) : TRUE
-      
-      if (bCont) {
-       fprintf(stderr,"\rRead frame: %d, Time: %.3f",teller,fr->t);
-       
-       if ((nenergy % 1000) == 0) {
-         srenew(time,nenergy+1000);
-         for(i=0; (i<=nset); i++)
-           srenew(eneset[i],nenergy+1000);
-       }
-       time[nenergy] = fr->t;
-       sum=0;
-       for(i=0; (i<nset); i++) {
-         eneset[i][nenergy] = fr->ener[set[i]].e;
-         sum += fr->ener[set[i]].e;
-       }
-       if (bSum) 
-         eneset[nset][nenergy] = sum;
-       nenergy++;
-      }
-      teller++;
-    }
-  } while (bCont && (timecheck == 0));
-  
-  fprintf(stderr,"\n");
 
-  fprintf(stderr,"Will build energy half-matrix of %d groups, %d elements, "
-         "over %d frames\n",ngroups,nset,nenergy);
-  
-  snew(emat,egNR+egSP);
-  for(j=0; (j<egNR+egSP); j++)
-    if (egrp_use[m]) {
-      snew(emat[j],ngroups);
-      for (i=0; (i<ngroups); i++)
-       snew(emat[j][i],ngroups);
-    }
-  snew(groupnr,ngroups);
-  for (i=0; (i<ngroups); i++)
-    groupnr[i] = i+1;
-  rlo.r  = 1.0, rlo.g  = 0.0, rlo.b  = 0.0;
-  rmid.r = 1.0, rmid.g = 1.0, rmid.b = 1.0;
-  rhi.r  = 0.0, rhi.g  = 0.0, rhi.b  = 1.0;
-  if (bMeanEmtx) {
-    snew(e,ngroups);
-    for (i=0; (i<ngroups); i++) 
-      snew(e[i],nenergy);
-    n = 0;
-    for (i=0; (i<ngroups); i++) {
-      for (j=i; (j<ngroups); j++) {
-       for (m=0; (m<egNR); m++) {
-         if (egrp_use[m]) {
-           for (k=0; (k<nenergy); k++) {
-             emat[m][i][j] += eneset[n][k];
-             e[i][k] += eneset[n][k];/* *0.5; */
-             e[j][k] += eneset[n][k];/* *0.5; */
-           }
-           n++;
-           emat[egTotal][i][j]+=emat[m][i][j];
-           emat[m][i][j]/=nenergy;
-           emat[m][j][i]=emat[m][i][j];
-         }
-       }
-       emat[egTotal][i][j]/=nenergy;
-       emat[egTotal][j][i]=emat[egTotal][i][j];
-      }
+            if (bCont)
+            {
+                fprintf(stderr, "\rRead frame: %d, Time: %.3f", teller, fr->t);
+
+                if ((nenergy % 1000) == 0)
+                {
+                    srenew(time, nenergy+1000);
+                    for (i = 0; (i <= nset); i++)
+                    {
+                        srenew(eneset[i], nenergy+1000);
+                    }
+                }
+                time[nenergy] = fr->t;
+                sum           = 0;
+                for (i = 0; (i < nset); i++)
+                {
+                    eneset[i][nenergy] = fr->ener[set[i]].e;
+                    sum               += fr->ener[set[i]].e;
+                }
+                if (bSum)
+                {
+                    eneset[nset][nenergy] = sum;
+                }
+                nenergy++;
+            }
+            teller++;
+        }
     }
-    if (bFree) {
-      if (bRef) {
-       fprintf(stderr,"Will read reference energies from inputfile\n");
-       neref = get_lines(opt2fn("-eref",NFILE,fnm), &ereflines);
-       fprintf(stderr,"Read %d reference energies\n",neref);
-       snew(eref, neref);
-       snew(erefres, neref);
-       for(i=0; (i<neref); i++) {
-         snew(erefres[i], 5);
-         sscanf(ereflines[i],"%s %lf",erefres[i],&edum);
-         eref[i] = edum;
-       }
-      }
-      snew(eaver,ngroups);
-      for (i=0; (i<ngroups); i++) {
-       for (k=0; (k<nenergy); k++)
-         eaver[i] += e[i][k];
-       eaver[i] /= nenergy;
-      }
-      beta = 1.0/(BOLTZ*reftemp);
-      snew(efree,ngroups);
-      snew(edif,ngroups);
-      for (i=0; (i<ngroups); i++) {
-       expE=0;
-       for (k=0; (k<nenergy); k++) {
-         expE += exp(beta*(e[i][k]-eaver[i]));
-       }
-       efree[i] = log(expE/nenergy)/beta + eaver[i];
-       if (bRef) {
-         n = search_str2(neref,erefres,groups[i]);
-         if (n != -1) {
-           edif[i] = efree[i]-eref[n];
-         } else {
-           edif[i] = efree[i];
-           fprintf(stderr,"WARNING: group %s not found "
-                   "in reference energies.\n",groups[i]);
-         }
-       } else 
-         edif[i]=0;
-      }
+    while (bCont && (timecheck == 0));
+
+    fprintf(stderr, "\n");
+
+    fprintf(stderr, "Will build energy half-matrix of %d groups, %d elements, "
+            "over %d frames\n", ngroups, nset, nenergy);
+
+    snew(emat, egNR+egSP);
+    for (j = 0; (j < egNR+egSP); j++)
+    {
+        if (egrp_use[m])
+        {
+            snew(emat[j], ngroups);
+            for (i = 0; (i < ngroups); i++)
+            {
+                snew(emat[j][i], ngroups);
+            }
+        }
     }
-   
-    emid = 0.0;/*(emin+emax)*0.5;*/
-    egrp_nm[egTotal]="total";
-    for (m=0; (m<egNR+egSP); m++) 
-      if (egrp_use[m]) {
-       emin=1e10;
-       emax=-1e10;
-       for (i=0; (i<ngroups); i++) {
-         for (j=i; (j<ngroups); j++) {
-           if (emat[m][i][j] > emax)
-             emax=emat[m][i][j];
-           else if (emat[m][i][j] < emin)
-             emin=emat[m][i][j];
-         }
-       }
-       if (emax==emin)
-         fprintf(stderr,"Matrix of %s energy is uniform at %f "
-                 "(will not produce output).\n",egrp_nm[m],emax);
-       else {
-         fprintf(stderr,"Matrix of %s energy ranges from %f to %f\n",
-                 egrp_nm[m],emin,emax);
-         if ((bCutmax) || (emax>cutmax)) emax=cutmax;
-         if ((bCutmin) || (emin<cutmin)) emin=cutmin;
-         if ((emax==cutmax) || (emin==cutmin))
-           fprintf(stderr,"Energy range adjusted: %f to %f\n",emin,emax);
-         
-         sprintf(fn,"%s%s",egrp_nm[m],ftp2fn(efXPM,NFILE,fnm));
-         sprintf(label,"%s Interaction Energies",egrp_nm[m]);
-         out=ffopen(fn,"w");
-         if (emin>=emid)
-           write_xpm(out,0,label,"Energy (kJ/mol)",
-                     "Residue Index","Residue Index",
-                     ngroups,ngroups,groupnr,groupnr,emat[m],
-                     emid,emax,rmid,rhi,&nlevels);
-         else if (emax<=emid)
-           write_xpm(out,0,label,"Energy (kJ/mol)",
-                     "Residue Index","Residue Index",
-                     ngroups,ngroups,groupnr,groupnr,emat[m],
-                     emin,emid,rlo,rmid,&nlevels);
-         else
-           write_xpm3(out,0,label,"Energy (kJ/mol)",
-                      "Residue Index","Residue Index",
-                      ngroups,ngroups,groupnr,groupnr,emat[m],
-                      emin,emid,emax,rlo,rmid,rhi,&nlevels);
-         ffclose(out);
-       }
-      }
-    snew(etot,egNR+egSP);
-    for (m=0; (m<egNR+egSP); m++) {
-      snew(etot[m],ngroups);
-      for (i=0; (i<ngroups); i++) {
-       for (j=0; (j<ngroups); j++) 
-         etot[m][i]+=emat[m][i][j];
-      }
+    snew(groupnr, ngroups);
+    for (i = 0; (i < ngroups); i++)
+    {
+        groupnr[i] = i+1;
     }
+    rlo.r  = 1.0, rlo.g  = 0.0, rlo.b  = 0.0;
+    rmid.r = 1.0, rmid.g = 1.0, rmid.b = 1.0;
+    rhi.r  = 0.0, rhi.g  = 0.0, rhi.b  = 1.0;
+    if (bMeanEmtx)
+    {
+        snew(e, ngroups);
+        for (i = 0; (i < ngroups); i++)
+        {
+            snew(e[i], nenergy);
+        }
+        n = 0;
+        for (i = 0; (i < ngroups); i++)
+        {
+            for (j = i; (j < ngroups); j++)
+            {
+                for (m = 0; (m < egNR); m++)
+                {
+                    if (egrp_use[m])
+                    {
+                        for (k = 0; (k < nenergy); k++)
+                        {
+                            emat[m][i][j] += eneset[n][k];
+                            e[i][k]       += eneset[n][k]; /* *0.5; */
+                            e[j][k]       += eneset[n][k]; /* *0.5; */
+                        }
+                        n++;
+                        emat[egTotal][i][j] += emat[m][i][j];
+                        emat[m][i][j]       /= nenergy;
+                        emat[m][j][i]        = emat[m][i][j];
+                    }
+                }
+                emat[egTotal][i][j] /= nenergy;
+                emat[egTotal][j][i]  = emat[egTotal][i][j];
+            }
+        }
+        if (bFree)
+        {
+            if (bRef)
+            {
+                fprintf(stderr, "Will read reference energies from inputfile\n");
+                neref = get_lines(opt2fn("-eref", NFILE, fnm), &ereflines);
+                fprintf(stderr, "Read %d reference energies\n", neref);
+                snew(eref, neref);
+                snew(erefres, neref);
+                for (i = 0; (i < neref); i++)
+                {
+                    snew(erefres[i], 5);
+                    sscanf(ereflines[i], "%s %lf", erefres[i], &edum);
+                    eref[i] = edum;
+                }
+            }
+            snew(eaver, ngroups);
+            for (i = 0; (i < ngroups); i++)
+            {
+                for (k = 0; (k < nenergy); k++)
+                {
+                    eaver[i] += e[i][k];
+                }
+                eaver[i] /= nenergy;
+            }
+            beta = 1.0/(BOLTZ*reftemp);
+            snew(efree, ngroups);
+            snew(edif, ngroups);
+            for (i = 0; (i < ngroups); i++)
+            {
+                expE = 0;
+                for (k = 0; (k < nenergy); k++)
+                {
+                    expE += exp(beta*(e[i][k]-eaver[i]));
+                }
+                efree[i] = log(expE/nenergy)/beta + eaver[i];
+                if (bRef)
+                {
+                    n = search_str2(neref, erefres, groups[i]);
+                    if (n != -1)
+                    {
+                        edif[i] = efree[i]-eref[n];
+                    }
+                    else
+                    {
+                        edif[i] = efree[i];
+                        fprintf(stderr, "WARNING: group %s not found "
+                                "in reference energies.\n", groups[i]);
+                    }
+                }
+                else
+                {
+                    edif[i] = 0;
+                }
+            }
+        }
+
+        emid             = 0.0; /*(emin+emax)*0.5;*/
+        egrp_nm[egTotal] = "total";
+        for (m = 0; (m < egNR+egSP); m++)
+        {
+            if (egrp_use[m])
+            {
+                emin = 1e10;
+                emax = -1e10;
+                for (i = 0; (i < ngroups); i++)
+                {
+                    for (j = i; (j < ngroups); j++)
+                    {
+                        if (emat[m][i][j] > emax)
+                        {
+                            emax = emat[m][i][j];
+                        }
+                        else if (emat[m][i][j] < emin)
+                        {
+                            emin = emat[m][i][j];
+                        }
+                    }
+                }
+                if (emax == emin)
+                {
+                    fprintf(stderr, "Matrix of %s energy is uniform at %f "
+                            "(will not produce output).\n", egrp_nm[m], emax);
+                }
+                else
+                {
+                    fprintf(stderr, "Matrix of %s energy ranges from %f to %f\n",
+                            egrp_nm[m], emin, emax);
+                    if ((bCutmax) || (emax > cutmax))
+                    {
+                        emax = cutmax;
+                    }
+                    if ((bCutmin) || (emin < cutmin))
+                    {
+                        emin = cutmin;
+                    }
+                    if ((emax == cutmax) || (emin == cutmin))
+                    {
+                        fprintf(stderr, "Energy range adjusted: %f to %f\n", emin, emax);
+                    }
 
-    out=xvgropen(ftp2fn(efXVG,NFILE,fnm),"Mean Energy","Residue","kJ/mol",
-                 oenv);
-    xvgr_legend(out,0,NULL, oenv);
-    j=0;
-    for (m=0; (m<egNR+egSP); m++) 
-      if (egrp_use[m])
-       fprintf(out,"@ legend string %d \"%s\"\n",j++,egrp_nm[m]);
-    if (bFree)
-      fprintf(out,"@ legend string %d \"%s\"\n",j++,"Free");
-    if (bFree)
-      fprintf(out,"@ legend string %d \"%s\"\n",j++,"Diff");
-    fprintf(out,"@TYPE xy\n");
-    fprintf(out,"#%3s","grp");
-    for (m=0; (m<egNR+egSP); m++)
-      if (egrp_use[m])
-       fprintf(out," %9s",egrp_nm[m]);
-    if (bFree)
-      fprintf(out," %9s","Free");
-    if (bFree)
-      fprintf(out," %9s","Diff");
-    fprintf(out,"\n");
-    for (i=0; (i<ngroups); i++) {
-      fprintf(out,"%3.0f",groupnr[i]);
-      for (m=0; (m<egNR+egSP); m++)
-       if (egrp_use[m])
-         fprintf(out," %9.5g",etot[m][i]);
-      if (bFree)
-       fprintf(out," %9.5g",efree[i]);
-      if (bRef)
-       fprintf(out," %9.5g",edif[i]);
-      fprintf(out,"\n");
+                    sprintf(fn, "%s%s", egrp_nm[m], ftp2fn(efXPM, NFILE, fnm));
+                    sprintf(label, "%s Interaction Energies", egrp_nm[m]);
+                    out = ffopen(fn, "w");
+                    if (emin >= emid)
+                    {
+                        write_xpm(out, 0, label, "Energy (kJ/mol)",
+                                  "Residue Index", "Residue Index",
+                                  ngroups, ngroups, groupnr, groupnr, emat[m],
+                                  emid, emax, rmid, rhi, &nlevels);
+                    }
+                    else if (emax <= emid)
+                    {
+                        write_xpm(out, 0, label, "Energy (kJ/mol)",
+                                  "Residue Index", "Residue Index",
+                                  ngroups, ngroups, groupnr, groupnr, emat[m],
+                                  emin, emid, rlo, rmid, &nlevels);
+                    }
+                    else
+                    {
+                        write_xpm3(out, 0, label, "Energy (kJ/mol)",
+                                   "Residue Index", "Residue Index",
+                                   ngroups, ngroups, groupnr, groupnr, emat[m],
+                                   emin, emid, emax, rlo, rmid, rhi, &nlevels);
+                    }
+                    ffclose(out);
+                }
+            }
+        }
+        snew(etot, egNR+egSP);
+        for (m = 0; (m < egNR+egSP); m++)
+        {
+            snew(etot[m], ngroups);
+            for (i = 0; (i < ngroups); i++)
+            {
+                for (j = 0; (j < ngroups); j++)
+                {
+                    etot[m][i] += emat[m][i][j];
+                }
+            }
+        }
+
+        out = xvgropen(ftp2fn(efXVG, NFILE, fnm), "Mean Energy", "Residue", "kJ/mol",
+                       oenv);
+        xvgr_legend(out, 0, NULL, oenv);
+        j = 0;
+        for (m = 0; (m < egNR+egSP); m++)
+        {
+            if (egrp_use[m])
+            {
+                fprintf(out, "@ legend string %d \"%s\"\n", j++, egrp_nm[m]);
+            }
+        }
+        if (bFree)
+        {
+            fprintf(out, "@ legend string %d \"%s\"\n", j++, "Free");
+        }
+        if (bFree)
+        {
+            fprintf(out, "@ legend string %d \"%s\"\n", j++, "Diff");
+        }
+        fprintf(out, "@TYPE xy\n");
+        fprintf(out, "#%3s", "grp");
+        for (m = 0; (m < egNR+egSP); m++)
+        {
+            if (egrp_use[m])
+            {
+                fprintf(out, " %9s", egrp_nm[m]);
+            }
+        }
+        if (bFree)
+        {
+            fprintf(out, " %9s", "Free");
+        }
+        if (bFree)
+        {
+            fprintf(out, " %9s", "Diff");
+        }
+        fprintf(out, "\n");
+        for (i = 0; (i < ngroups); i++)
+        {
+            fprintf(out, "%3.0f", groupnr[i]);
+            for (m = 0; (m < egNR+egSP); m++)
+            {
+                if (egrp_use[m])
+                {
+                    fprintf(out, " %9.5g", etot[m][i]);
+                }
+            }
+            if (bFree)
+            {
+                fprintf(out, " %9.5g", efree[i]);
+            }
+            if (bRef)
+            {
+                fprintf(out, " %9.5g", edif[i]);
+            }
+            fprintf(out, "\n");
+        }
+        ffclose(out);
     }
-    ffclose(out);
-  } else {
-    fprintf(stderr,"While typing at your keyboard, suddenly...\n"
-           "...nothing happens.\nWARNING: Not Implemented Yet\n");
+    else
+    {
+        fprintf(stderr, "While typing at your keyboard, suddenly...\n"
+                "...nothing happens.\nWARNING: Not Implemented Yet\n");
 /*
     out=ftp2FILE(efMAT,NFILE,fnm,"w");
     n=0;
     emin=emax=0.0;
     for (k=0; (k<nenergy); k++) {
       for (i=0; (i<ngroups); i++)
-       for (j=i+1; (j<ngroups); j++)
-         emat[i][j]=eneset[n][k];
+    for (j=i+1; (j<ngroups); j++)
+      emat[i][j]=eneset[n][k];
       sprintf(label,"t=%.0f ps",time[k]);
       write_matrix(out,ngroups,1,ngroups,groupnr,emat,label,emin,emax,nlevels);
       n++;
     }
     ffclose(out);
-*/
-  }
-  close_enx(in);
-  
-  thanx(stderr);
-  
-  return 0;
+ */
+    }
+    close_enx(in);
+
+    thanx(stderr);
+
+    return 0;
 }