Code beautification with uncrustify
[alexxy/gromacs.git] / src / tools / gmx_helix.c
index ffbbf5522a9f1d15419b1c5cd7158549356f52e0..0bc87e154c5d88f1ebd60a9a166d7be0cc2b7ce0 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 "xvgr.h"
 #include "gmx_ana.h"
 
-void dump_otrj(FILE *otrj,int natoms,atom_id all_index[],rvec x[],
-              real fac,rvec xav[])
+void dump_otrj(FILE *otrj, int natoms, atom_id all_index[], rvec x[],
+               real fac, rvec xav[])
 {
-  static FILE *fp=NULL;
-  static real fac0=1.0;
-  
-  int  i,ai,m;
-  real xa,xm;
-  
-  if (fp==NULL) {
-    fp=ffopen("WEDGAMMA10.DAT","w");
-    fac0=fac;
-  }
-  fac/=fac0;
-  
-  fprintf(fp,"%10g\n",fac);
-  
-  for(i=0; (i<natoms); i++) {
-    ai=all_index[i];
-    for(m=0; (m<DIM); m++) {
-      xa = xav[ai][m];
-      xm = x[ai][m]*fac;
-      xav[ai][m] = xa+xm;
-      x[ai][m]   = xm;
+    static FILE *fp   = NULL;
+    static real  fac0 = 1.0;
+
+    int          i, ai, m;
+    real         xa, xm;
+
+    if (fp == NULL)
+    {
+        fp   = ffopen("WEDGAMMA10.DAT", "w");
+        fac0 = fac;
+    }
+    fac /= fac0;
+
+    fprintf(fp, "%10g\n", fac);
+
+    for (i = 0; (i < natoms); i++)
+    {
+        ai = all_index[i];
+        for (m = 0; (m < DIM); m++)
+        {
+            xa         = xav[ai][m];
+            xm         = x[ai][m]*fac;
+            xav[ai][m] = xa+xm;
+            x[ai][m]   = xm;
+        }
     }
-  }
-  write_gms_ndx(otrj,natoms,all_index,x,NULL);
+    write_gms_ndx(otrj, natoms, all_index, x, NULL);
 }
 
-int gmx_helix(int argc,char *argv[])
+int gmx_helix(int argc, char *argv[])
 {
-  const char *desc[] = {
-    "[TT]g_helix[tt] computes all kinds of helix properties. First, the peptide",
-    "is checked to find the longest helical part, as determined by",
-    "hydrogen bonds and [GRK]phi[grk]/[GRK]psi[grk] angles.",
-    "That bit is fitted",
-    "to an ideal helix around the [IT]z[it]-axis and centered around the origin.",
-    "Then the following properties are computed:[PAR]",
-    "[BB]1.[bb] Helix radius (file [TT]radius.xvg[tt]). This is merely the",
-    "RMS deviation in two dimensions for all C[GRK]alpha[grk] atoms.",
-    "it is calculated as [SQRT]([SUM][sum][SUB]i[sub] (x^2(i)+y^2(i)))/N[sqrt] where N is the number",
-    "of backbone atoms. For an ideal helix the radius is 0.23 nm[BR]",
-    "[BB]2.[bb] Twist (file [TT]twist.xvg[tt]). The average helical angle per",
-    "residue is calculated. For an [GRK]alpha[grk]-helix it is 100 degrees,",
-    "for 3-10 helices it will be smaller, and ", 
-    "for 5-helices it will be larger.[BR]",
-    "[BB]3.[bb] Rise per residue (file [TT]rise.xvg[tt]). The helical rise per", 
-    "residue is plotted as the difference in [IT]z[it]-coordinate between C[GRK]alpha[grk]", 
-    "atoms. For an ideal helix, this is 0.15 nm[BR]",
-    "[BB]4.[bb] Total helix length (file [TT]len-ahx.xvg[tt]). The total length", 
-    "of the", 
-    "helix in nm. This is simply the average rise (see above) times the",  
-    "number of helical residues (see below).[BR]",
-    "[BB]5.[bb] Helix dipole, backbone only (file [TT]dip-ahx.xvg[tt]).[BR]",
-    "[BB]6.[bb] RMS deviation from ideal helix, calculated for the C[GRK]alpha[grk]",
-    "atoms only (file [TT]rms-ahx.xvg[tt]).[BR]",
-    "[BB]7.[bb] Average C[GRK]alpha[grk] - C[GRK]alpha[grk] dihedral angle (file [TT]phi-ahx.xvg[tt]).[BR]",
-    "[BB]8.[bb] Average [GRK]phi[grk] and [GRK]psi[grk] angles (file [TT]phipsi.xvg[tt]).[BR]",
-    "[BB]9.[bb] Ellipticity at 222 nm according to Hirst and Brooks.",
-    "[PAR]"
-  };
-  static const char *ppp[efhNR+2] = { 
-    NULL, "RAD", "TWIST", "RISE", "LEN", "NHX", "DIP", "RMS", "CPHI", 
-    "RMSA", "PHI", "PSI", "HB3", "HB4", "HB5", "CD222", NULL
-  };
-  static gmx_bool bCheck=FALSE,bFit=TRUE,bDBG=FALSE,bEV=FALSE;
-  static int  rStart=0,rEnd=0,r0=1;
-  t_pargs pa [] = {
-    { "-r0", FALSE, etINT, {&r0},
-      "The first residue number in the sequence" },
-    { "-q",  FALSE, etBOOL,{&bCheck},
-      "Check at every step which part of the sequence is helical" },
-    { "-F",  FALSE, etBOOL,{&bFit},
-      "Toggle fit to a perfect helix" },
-    { "-db", FALSE, etBOOL,{&bDBG},
-      "Print debug info" },
-    { "-prop", FALSE, etENUM, {ppp},
-      "Select property to weight eigenvectors with. WARNING experimental stuff" },
-    { "-ev", FALSE, etBOOL,{&bEV},
-      "Write a new 'trajectory' file for ED" },
-    { "-ahxstart", FALSE, etINT, {&rStart},
-      "First residue in helix" },
-    { "-ahxend", FALSE, etINT, {&rEnd},
-      "Last residue in helix" }
-  };
-
-  typedef struct {
-    FILE *fp,*fp2;
-    gmx_bool bfp2;
-    const char *filenm;
-    const char *title;
-    const char *xaxis;
-    const char *yaxis;
-    real val;
-  } t_xvgrfile;
-  
-  t_xvgrfile xf[efhNR] = {
-    { NULL, NULL, TRUE,  "radius",  "Helix radius",               NULL, "r (nm)" , 0.0 },
-    { NULL, NULL, TRUE,  "twist",   "Twist per residue",          NULL, "Angle (deg)", 0.0 },
-    { NULL, NULL, TRUE,  "rise",    "Rise per residue",           NULL, "Rise (nm)", 0.0 },
-    { NULL, NULL, FALSE, "len-ahx", "Length of the Helix",        NULL, "Length (nm)", 0.0 },
-    { NULL, NULL, FALSE, "dip-ahx", "Helix Backbone Dipole",      NULL, "rq (nm e)", 0.0 },
-    { NULL, NULL, TRUE,  "rms-ahx", "RMS Deviation from Ideal Helix", NULL, "RMS (nm)", 0.0 },
-    { NULL, NULL, FALSE, "rmsa-ahx","Average RMSD per Residue",   "Residue", "RMS (nm)", 0.0 },
-    { NULL, NULL,FALSE,  "cd222",   "Ellipticity at 222 nm", NULL, "nm", 0.0 },
-    { NULL, NULL, TRUE,  "pprms",   "RMS Distance from \\8a\\4-helix", NULL, "deg" , 0.0 },
-    { NULL, NULL, TRUE,  "caphi",   "Average Ca-Ca Dihedral",     NULL, "\\8F\\4(deg)", 0.0 },
-    { NULL, NULL, TRUE,  "phi",     "Average \\8F\\4 angles", NULL, "deg" , 0.0 },
-    { NULL, NULL, TRUE,  "psi",     "Average \\8Y\\4 angles", NULL, "deg" , 0.0 },
-    { NULL, NULL, TRUE,  "hb3",     "Average n-n+3 hbond length", NULL, "nm" , 0.0 },
-    { NULL, NULL, TRUE,  "hb4",     "Average n-n+4 hbond length", NULL, "nm" , 0.0 },
-    { NULL, NULL, TRUE,  "hb5",     "Average n-n+5 hbond length", NULL, "nm" , 0.0 },
-    { NULL, NULL,FALSE,  "JCaHa",   "J-Coupling Values",        "Residue", "Hz" , 0.0 },
-    { NULL, NULL,FALSE,  "helicity","Helicity per Residue",     "Residue", "% of time" , 0.0 }
-  };
-  output_env_t oenv;
-  FILE       *otrj;
-  char       buf[54],prop[256];
-  t_trxstatus *status;
-  int        natoms,nre,nres;
-  t_bb       *bb;
-  int        i,j,ai,m,nall,nbb,nca,teller,nSel=0;
-  atom_id    *bbindex,*caindex,*allindex;
-  t_topology *top;
-  int        ePBC;
-  rvec       *x,*xref,*xav;
-  real       t;
-  real       rms,fac;
-  matrix     box;
-  gmx_rmpbc_t  gpbc=NULL;
-  gmx_bool       bRange;
-  t_filenm  fnm[] = {
-    { efTPX, NULL,  NULL,   ffREAD  },
-    { efNDX, NULL,  NULL,   ffREAD  },
-    { efTRX, "-f",  NULL,   ffREAD  },
-    { efG87, "-to", NULL,   ffOPTWR },
-    { efSTO, "-cz", "zconf",ffWRITE },
-    { efSTO, "-co", "waver",ffWRITE }
-  };
+    const char        *desc[] = {
+        "[TT]g_helix[tt] computes all kinds of helix properties. First, the peptide",
+        "is checked to find the longest helical part, as determined by",
+        "hydrogen bonds and [GRK]phi[grk]/[GRK]psi[grk] angles.",
+        "That bit is fitted",
+        "to an ideal helix around the [IT]z[it]-axis and centered around the origin.",
+        "Then the following properties are computed:[PAR]",
+        "[BB]1.[bb] Helix radius (file [TT]radius.xvg[tt]). This is merely the",
+        "RMS deviation in two dimensions for all C[GRK]alpha[grk] atoms.",
+        "it is calculated as [SQRT]([SUM][sum][SUB]i[sub] (x^2(i)+y^2(i)))/N[sqrt] where N is the number",
+        "of backbone atoms. For an ideal helix the radius is 0.23 nm[BR]",
+        "[BB]2.[bb] Twist (file [TT]twist.xvg[tt]). The average helical angle per",
+        "residue is calculated. For an [GRK]alpha[grk]-helix it is 100 degrees,",
+        "for 3-10 helices it will be smaller, and ",
+        "for 5-helices it will be larger.[BR]",
+        "[BB]3.[bb] Rise per residue (file [TT]rise.xvg[tt]). The helical rise per",
+        "residue is plotted as the difference in [IT]z[it]-coordinate between C[GRK]alpha[grk]",
+        "atoms. For an ideal helix, this is 0.15 nm[BR]",
+        "[BB]4.[bb] Total helix length (file [TT]len-ahx.xvg[tt]). The total length",
+        "of the",
+        "helix in nm. This is simply the average rise (see above) times the",
+        "number of helical residues (see below).[BR]",
+        "[BB]5.[bb] Helix dipole, backbone only (file [TT]dip-ahx.xvg[tt]).[BR]",
+        "[BB]6.[bb] RMS deviation from ideal helix, calculated for the C[GRK]alpha[grk]",
+        "atoms only (file [TT]rms-ahx.xvg[tt]).[BR]",
+        "[BB]7.[bb] Average C[GRK]alpha[grk] - C[GRK]alpha[grk] dihedral angle (file [TT]phi-ahx.xvg[tt]).[BR]",
+        "[BB]8.[bb] Average [GRK]phi[grk] and [GRK]psi[grk] angles (file [TT]phipsi.xvg[tt]).[BR]",
+        "[BB]9.[bb] Ellipticity at 222 nm according to Hirst and Brooks.",
+        "[PAR]"
+    };
+    static const char *ppp[efhNR+2] = {
+        NULL, "RAD", "TWIST", "RISE", "LEN", "NHX", "DIP", "RMS", "CPHI",
+        "RMSA", "PHI", "PSI", "HB3", "HB4", "HB5", "CD222", NULL
+    };
+    static gmx_bool    bCheck = FALSE, bFit = TRUE, bDBG = FALSE, bEV = FALSE;
+    static int         rStart = 0, rEnd = 0, r0 = 1;
+    t_pargs            pa []  = {
+        { "-r0", FALSE, etINT, {&r0},
+          "The first residue number in the sequence" },
+        { "-q",  FALSE, etBOOL, {&bCheck},
+          "Check at every step which part of the sequence is helical" },
+        { "-F",  FALSE, etBOOL, {&bFit},
+          "Toggle fit to a perfect helix" },
+        { "-db", FALSE, etBOOL, {&bDBG},
+          "Print debug info" },
+        { "-prop", FALSE, etENUM, {ppp},
+          "Select property to weight eigenvectors with. WARNING experimental stuff" },
+        { "-ev", FALSE, etBOOL, {&bEV},
+          "Write a new 'trajectory' file for ED" },
+        { "-ahxstart", FALSE, etINT, {&rStart},
+          "First residue in helix" },
+        { "-ahxend", FALSE, etINT, {&rEnd},
+          "Last residue in helix" }
+    };
+
+    typedef struct {
+        FILE       *fp, *fp2;
+        gmx_bool    bfp2;
+        const char *filenm;
+        const char *title;
+        const char *xaxis;
+        const char *yaxis;
+        real        val;
+    } t_xvgrfile;
+
+    t_xvgrfile     xf[efhNR] = {
+        { NULL, NULL, TRUE,  "radius",  "Helix radius",               NULL, "r (nm)", 0.0 },
+        { NULL, NULL, TRUE,  "twist",   "Twist per residue",          NULL, "Angle (deg)", 0.0 },
+        { NULL, NULL, TRUE,  "rise",    "Rise per residue",           NULL, "Rise (nm)", 0.0 },
+        { NULL, NULL, FALSE, "len-ahx", "Length of the Helix",        NULL, "Length (nm)", 0.0 },
+        { NULL, NULL, FALSE, "dip-ahx", "Helix Backbone Dipole",      NULL, "rq (nm e)", 0.0 },
+        { NULL, NULL, TRUE,  "rms-ahx", "RMS Deviation from Ideal Helix", NULL, "RMS (nm)", 0.0 },
+        { NULL, NULL, FALSE, "rmsa-ahx", "Average RMSD per Residue",   "Residue", "RMS (nm)", 0.0 },
+        { NULL, NULL, FALSE,  "cd222",   "Ellipticity at 222 nm", NULL, "nm", 0.0 },
+        { NULL, NULL, TRUE,  "pprms",   "RMS Distance from \\8a\\4-helix", NULL, "deg", 0.0 },
+        { NULL, NULL, TRUE,  "caphi",   "Average Ca-Ca Dihedral",     NULL, "\\8F\\4(deg)", 0.0 },
+        { NULL, NULL, TRUE,  "phi",     "Average \\8F\\4 angles", NULL, "deg", 0.0 },
+        { NULL, NULL, TRUE,  "psi",     "Average \\8Y\\4 angles", NULL, "deg", 0.0 },
+        { NULL, NULL, TRUE,  "hb3",     "Average n-n+3 hbond length", NULL, "nm", 0.0 },
+        { NULL, NULL, TRUE,  "hb4",     "Average n-n+4 hbond length", NULL, "nm", 0.0 },
+        { NULL, NULL, TRUE,  "hb5",     "Average n-n+5 hbond length", NULL, "nm", 0.0 },
+        { NULL, NULL, FALSE,  "JCaHa",   "J-Coupling Values",        "Residue", "Hz", 0.0 },
+        { NULL, NULL, FALSE,  "helicity", "Helicity per Residue",     "Residue", "% of time", 0.0 }
+    };
+
+    output_env_t   oenv;
+    FILE          *otrj;
+    char           buf[54], prop[256];
+    t_trxstatus   *status;
+    int            natoms, nre, nres;
+    t_bb          *bb;
+    int            i, j, ai, m, nall, nbb, nca, teller, nSel = 0;
+    atom_id       *bbindex, *caindex, *allindex;
+    t_topology    *top;
+    int            ePBC;
+    rvec          *x, *xref, *xav;
+    real           t;
+    real           rms, fac;
+    matrix         box;
+    gmx_rmpbc_t    gpbc = NULL;
+    gmx_bool       bRange;
+    t_filenm       fnm[] = {
+        { efTPX, NULL,  NULL,   ffREAD  },
+        { efNDX, NULL,  NULL,   ffREAD  },
+        { efTRX, "-f",  NULL,   ffREAD  },
+        { efG87, "-to", NULL,   ffOPTWR },
+        { efSTO, "-cz", "zconf", ffWRITE },
+        { efSTO, "-co", "waver", 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);
-  
-  bRange=(opt2parg_bSet("-ahxstart",asize(pa),pa) &&
-         opt2parg_bSet("-ahxend",asize(pa),pa));
-                       
-  top=read_top(ftp2fn(efTPX,NFILE,fnm),&ePBC);
-  
-  natoms=read_first_x(oenv,&status,opt2fn("-f",NFILE,fnm),&t,&x,box);
-
-  if (opt2bSet("-to",NFILE,fnm)) {
-    otrj=opt2FILE("-to",NFILE,fnm,"w");
-    strcpy(prop,ppp[0]);
-    fprintf(otrj,"%s Weighted Trajectory: %d atoms, NO box\n",prop,natoms);
-  }
-  else
-    otrj=NULL;
-    
-  if (natoms != top->atoms.nr)
-    gmx_fatal(FARGS,"Sorry can only run when the number of atoms in the run input file (%d) is equal to the number in the trajectory (%d)",
-           top->atoms.nr,natoms);
-           
-  bb=mkbbind(ftp2fn(efNDX,NFILE,fnm),&nres,&nbb,r0,&nall,&allindex,
-            top->atoms.atomname,top->atoms.atom,top->atoms.resinfo);
-  snew(bbindex,natoms);
-  snew(caindex,nres);
-  
-  fprintf(stderr,"nall=%d\n",nall);
-    
-  /* Open output files, default x-axis is time */
-  for(i=0; (i<efhNR); i++) {
-    sprintf(buf,"%s.xvg",xf[i].filenm);
-    remove(buf);
-    xf[i].fp=xvgropen(buf,xf[i].title,
-                      xf[i].xaxis ? xf[i].xaxis : "Time (ps)",
-                     xf[i].yaxis,oenv);
-    if (xf[i].bfp2) {
-      sprintf(buf,"%s.out",xf[i].filenm);
-      remove(buf);
-      xf[i].fp2=ffopen(buf,"w");
+    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);
+
+    bRange = (opt2parg_bSet("-ahxstart", asize(pa), pa) &&
+              opt2parg_bSet("-ahxend", asize(pa), pa));
+
+    top = read_top(ftp2fn(efTPX, NFILE, fnm), &ePBC);
+
+    natoms = read_first_x(oenv, &status, opt2fn("-f", NFILE, fnm), &t, &x, box);
+
+    if (opt2bSet("-to", NFILE, fnm))
+    {
+        otrj = opt2FILE("-to", NFILE, fnm, "w");
+        strcpy(prop, ppp[0]);
+        fprintf(otrj, "%s Weighted Trajectory: %d atoms, NO box\n", prop, natoms);
     }
-  }
-
-  /* Read reference frame from tpx file to compute helix length */
-  snew(xref,top->atoms.nr);
-  read_tpx(ftp2fn(efTPX,NFILE,fnm),
-          NULL,NULL,&natoms,xref,NULL,NULL,NULL);
-  calc_hxprops(nres,bb,xref,box);
-  do_start_end(nres,bb,xref,&nbb,bbindex,&nca,caindex,bRange,rStart,rEnd);
-  sfree(xref);
-  if (bDBG) {
-    fprintf(stderr,"nca=%d, nbb=%d\n",nca,nbb);
-    pr_bb(stdout,nres,bb);
-  }
-  
-  gpbc = gmx_rmpbc_init(&top->idef,ePBC,natoms,box);
-
-  snew(xav,natoms);
-  teller=0;
-  do {
-    if ((teller++ % 10) == 0)
-      fprintf(stderr,"\rt=%.2f",t);
-    gmx_rmpbc(gpbc,natoms,box,x);
-
-    
-    calc_hxprops(nres,bb,x,box);
-    if (bCheck)
-      do_start_end(nres,bb,x,&nbb,bbindex,&nca,caindex,FALSE,0,0);
-    
-    if (nca >= 5) {
-      rms=fit_ahx(nres,bb,natoms,nall,allindex,x,nca,caindex,box,bFit);
-      
-      if (teller == 1) {
-       write_sto_conf(opt2fn("-cz",NFILE,fnm),"Helix fitted to Z-Axis",
-                      &(top->atoms),x,NULL,ePBC,box);
-      }
-            
-      xf[efhRAD].val   = radius(xf[efhRAD].fp2,nca,caindex,x);
-      xf[efhTWIST].val = twist(xf[efhTWIST].fp2,nca,caindex,x);
-      xf[efhRISE].val  = rise(nca,caindex,x);
-      xf[efhLEN].val   = ahx_len(nca,caindex,x,box);
-      xf[efhCD222].val = ellipticity(nres,bb);
-      xf[efhDIP].val   = dip(nbb,bbindex,x,top->atoms.atom);
-      xf[efhRMS].val   = rms;
-      xf[efhCPHI].val  = ca_phi(nca,caindex,x,box);
-      xf[efhPPRMS].val = pprms(xf[efhPPRMS].fp2,nres,bb);
-      
-      for(j=0; (j<=efhCPHI); j++)
-       fprintf(xf[j].fp,   "%10g  %10g\n",t,xf[j].val);
-      
-      av_phipsi(xf[efhPHI].fp,xf[efhPSI].fp,xf[efhPHI].fp2,xf[efhPSI].fp2,
-               t,nres,bb);
-      av_hblen(xf[efhHB3].fp,xf[efhHB3].fp2,
-              xf[efhHB4].fp,xf[efhHB4].fp2,
-              xf[efhHB5].fp,xf[efhHB5].fp2,
-              t,nres,bb);
-      
-      if (otrj) 
-       dump_otrj(otrj,nall,allindex,x,xf[nSel].val,xav);
+    else
+    {
+        otrj = NULL;
     }
-  } while (read_next_x(oenv,status,&t,natoms,x,box));
-  fprintf(stderr,"\n");
-  
-  gmx_rmpbc_done(gpbc);
-
-  close_trj(status);
-
-  if (otrj) {
-    ffclose(otrj);
-    fac=1.0/teller;
-    for(i=0; (i<nall); i++) {
-      ai=allindex[i];
-      for(m=0; (m<DIM); m++)
-       xav[ai][m]*=fac;
+
+    if (natoms != top->atoms.nr)
+    {
+        gmx_fatal(FARGS, "Sorry can only run when the number of atoms in the run input file (%d) is equal to the number in the trajectory (%d)",
+                  top->atoms.nr, natoms);
+    }
+
+    bb = mkbbind(ftp2fn(efNDX, NFILE, fnm), &nres, &nbb, r0, &nall, &allindex,
+                 top->atoms.atomname, top->atoms.atom, top->atoms.resinfo);
+    snew(bbindex, natoms);
+    snew(caindex, nres);
+
+    fprintf(stderr, "nall=%d\n", nall);
+
+    /* Open output files, default x-axis is time */
+    for (i = 0; (i < efhNR); i++)
+    {
+        sprintf(buf, "%s.xvg", xf[i].filenm);
+        remove(buf);
+        xf[i].fp = xvgropen(buf, xf[i].title,
+                            xf[i].xaxis ? xf[i].xaxis : "Time (ps)",
+                            xf[i].yaxis, oenv);
+        if (xf[i].bfp2)
+        {
+            sprintf(buf, "%s.out", xf[i].filenm);
+            remove(buf);
+            xf[i].fp2 = ffopen(buf, "w");
+        }
     }
-    write_sto_conf_indexed(opt2fn("-co",NFILE,fnm),
-                          "Weighted and Averaged conformation",
-                          &(top->atoms),xav,NULL,ePBC,box,nall,allindex);
-  }
-  
-  for(i=0; (i<nres); i++) {
-    if (bb[i].nrms > 0) {
-      fprintf(xf[efhRMSA].fp,"%10d  %10g\n",r0+i,bb[i].rmsa/bb[i].nrms);
+
+    /* Read reference frame from tpx file to compute helix length */
+    snew(xref, top->atoms.nr);
+    read_tpx(ftp2fn(efTPX, NFILE, fnm),
+             NULL, NULL, &natoms, xref, NULL, NULL, NULL);
+    calc_hxprops(nres, bb, xref, box);
+    do_start_end(nres, bb, xref, &nbb, bbindex, &nca, caindex, bRange, rStart, rEnd);
+    sfree(xref);
+    if (bDBG)
+    {
+        fprintf(stderr, "nca=%d, nbb=%d\n", nca, nbb);
+        pr_bb(stdout, nres, bb);
     }
-    fprintf(xf[efhAHX].fp,"%10d  %10g\n",r0+i,(bb[i].nhx*100.0)/(real )teller);
-    fprintf(xf[efhJCA].fp,"%10d  %10g\n",
-           r0+i,140.3+(bb[i].jcaha/(double)teller));
-  }
-  
-  for(i=0; (i<efhNR); i++) {
-    ffclose(xf[i].fp);
-    if (xf[i].bfp2)
-      ffclose(xf[i].fp2);
-    do_view(oenv,xf[i].filenm,"-nxy");
-  }
-  
-  thanx(stderr);
-  
-  return 0;
-}
 
+    gpbc = gmx_rmpbc_init(&top->idef, ePBC, natoms, box);
+
+    snew(xav, natoms);
+    teller = 0;
+    do
+    {
+        if ((teller++ % 10) == 0)
+        {
+            fprintf(stderr, "\rt=%.2f", t);
+        }
+        gmx_rmpbc(gpbc, natoms, box, x);
+
+
+        calc_hxprops(nres, bb, x, box);
+        if (bCheck)
+        {
+            do_start_end(nres, bb, x, &nbb, bbindex, &nca, caindex, FALSE, 0, 0);
+        }
+
+        if (nca >= 5)
+        {
+            rms = fit_ahx(nres, bb, natoms, nall, allindex, x, nca, caindex, box, bFit);
+
+            if (teller == 1)
+            {
+                write_sto_conf(opt2fn("-cz", NFILE, fnm), "Helix fitted to Z-Axis",
+                               &(top->atoms), x, NULL, ePBC, box);
+            }
+
+            xf[efhRAD].val   = radius(xf[efhRAD].fp2, nca, caindex, x);
+            xf[efhTWIST].val = twist(xf[efhTWIST].fp2, nca, caindex, x);
+            xf[efhRISE].val  = rise(nca, caindex, x);
+            xf[efhLEN].val   = ahx_len(nca, caindex, x, box);
+            xf[efhCD222].val = ellipticity(nres, bb);
+            xf[efhDIP].val   = dip(nbb, bbindex, x, top->atoms.atom);
+            xf[efhRMS].val   = rms;
+            xf[efhCPHI].val  = ca_phi(nca, caindex, x, box);
+            xf[efhPPRMS].val = pprms(xf[efhPPRMS].fp2, nres, bb);
+
+            for (j = 0; (j <= efhCPHI); j++)
+            {
+                fprintf(xf[j].fp,   "%10g  %10g\n", t, xf[j].val);
+            }
+
+            av_phipsi(xf[efhPHI].fp, xf[efhPSI].fp, xf[efhPHI].fp2, xf[efhPSI].fp2,
+                      t, nres, bb);
+            av_hblen(xf[efhHB3].fp, xf[efhHB3].fp2,
+                     xf[efhHB4].fp, xf[efhHB4].fp2,
+                     xf[efhHB5].fp, xf[efhHB5].fp2,
+                     t, nres, bb);
+
+            if (otrj)
+            {
+                dump_otrj(otrj, nall, allindex, x, xf[nSel].val, xav);
+            }
+        }
+    }
+    while (read_next_x(oenv, status, &t, natoms, x, box));
+    fprintf(stderr, "\n");
+
+    gmx_rmpbc_done(gpbc);
+
+    close_trj(status);
+
+    if (otrj)
+    {
+        ffclose(otrj);
+        fac = 1.0/teller;
+        for (i = 0; (i < nall); i++)
+        {
+            ai = allindex[i];
+            for (m = 0; (m < DIM); m++)
+            {
+                xav[ai][m] *= fac;
+            }
+        }
+        write_sto_conf_indexed(opt2fn("-co", NFILE, fnm),
+                               "Weighted and Averaged conformation",
+                               &(top->atoms), xav, NULL, ePBC, box, nall, allindex);
+    }
+
+    for (i = 0; (i < nres); i++)
+    {
+        if (bb[i].nrms > 0)
+        {
+            fprintf(xf[efhRMSA].fp, "%10d  %10g\n", r0+i, bb[i].rmsa/bb[i].nrms);
+        }
+        fprintf(xf[efhAHX].fp, "%10d  %10g\n", r0+i, (bb[i].nhx*100.0)/(real )teller);
+        fprintf(xf[efhJCA].fp, "%10d  %10g\n",
+                r0+i, 140.3+(bb[i].jcaha/(double)teller));
+    }
+
+    for (i = 0; (i < efhNR); i++)
+    {
+        ffclose(xf[i].fp);
+        if (xf[i].bfp2)
+        {
+            ffclose(xf[i].fp2);
+        }
+        do_view(oenv, xf[i].filenm, "-nxy");
+    }
+
+    thanx(stderr);
+
+    return 0;
+}