3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * Green Red Orange Magenta Azure Cyan Skyblue
42 #include "gmx_fatal.h"
64 void dump_otrj(FILE *otrj, int natoms, atom_id all_index[], rvec x[],
67 static FILE *fp = NULL;
68 static real fac0 = 1.0;
75 fp = ffopen("WEDGAMMA10.DAT", "w");
80 fprintf(fp, "%10g\n", fac);
82 for (i = 0; (i < natoms); i++)
85 for (m = 0; (m < DIM); m++)
93 write_gms_ndx(otrj, natoms, all_index, x, NULL);
96 int gmx_helix(int argc, char *argv[])
98 const char *desc[] = {
99 "[TT]g_helix[tt] computes all kinds of helix properties. First, the peptide",
100 "is checked to find the longest helical part, as determined by",
101 "hydrogen bonds and [GRK]phi[grk]/[GRK]psi[grk] angles.",
102 "That bit is fitted",
103 "to an ideal helix around the [IT]z[it]-axis and centered around the origin.",
104 "Then the following properties are computed:[PAR]",
105 "[BB]1.[bb] Helix radius (file [TT]radius.xvg[tt]). This is merely the",
106 "RMS deviation in two dimensions for all C[GRK]alpha[grk] atoms.",
107 "it is calculated as [SQRT]([SUM][sum][SUB]i[sub] (x^2(i)+y^2(i)))/N[sqrt] where N is the number",
108 "of backbone atoms. For an ideal helix the radius is 0.23 nm[BR]",
109 "[BB]2.[bb] Twist (file [TT]twist.xvg[tt]). The average helical angle per",
110 "residue is calculated. For an [GRK]alpha[grk]-helix it is 100 degrees,",
111 "for 3-10 helices it will be smaller, and ",
112 "for 5-helices it will be larger.[BR]",
113 "[BB]3.[bb] Rise per residue (file [TT]rise.xvg[tt]). The helical rise per",
114 "residue is plotted as the difference in [IT]z[it]-coordinate between C[GRK]alpha[grk]",
115 "atoms. For an ideal helix, this is 0.15 nm[BR]",
116 "[BB]4.[bb] Total helix length (file [TT]len-ahx.xvg[tt]). The total length",
118 "helix in nm. This is simply the average rise (see above) times the",
119 "number of helical residues (see below).[BR]",
120 "[BB]5.[bb] Helix dipole, backbone only (file [TT]dip-ahx.xvg[tt]).[BR]",
121 "[BB]6.[bb] RMS deviation from ideal helix, calculated for the C[GRK]alpha[grk]",
122 "atoms only (file [TT]rms-ahx.xvg[tt]).[BR]",
123 "[BB]7.[bb] Average C[GRK]alpha[grk] - C[GRK]alpha[grk] dihedral angle (file [TT]phi-ahx.xvg[tt]).[BR]",
124 "[BB]8.[bb] Average [GRK]phi[grk] and [GRK]psi[grk] angles (file [TT]phipsi.xvg[tt]).[BR]",
125 "[BB]9.[bb] Ellipticity at 222 nm according to Hirst and Brooks.",
128 static const char *ppp[efhNR+2] = {
129 NULL, "RAD", "TWIST", "RISE", "LEN", "NHX", "DIP", "RMS", "CPHI",
130 "RMSA", "PHI", "PSI", "HB3", "HB4", "HB5", "CD222", NULL
132 static gmx_bool bCheck = FALSE, bFit = TRUE, bDBG = FALSE, bEV = FALSE;
133 static int rStart = 0, rEnd = 0, r0 = 1;
135 { "-r0", FALSE, etINT, {&r0},
136 "The first residue number in the sequence" },
137 { "-q", FALSE, etBOOL, {&bCheck},
138 "Check at every step which part of the sequence is helical" },
139 { "-F", FALSE, etBOOL, {&bFit},
140 "Toggle fit to a perfect helix" },
141 { "-db", FALSE, etBOOL, {&bDBG},
142 "Print debug info" },
143 { "-prop", FALSE, etENUM, {ppp},
144 "Select property to weight eigenvectors with. WARNING experimental stuff" },
145 { "-ev", FALSE, etBOOL, {&bEV},
146 "Write a new 'trajectory' file for ED" },
147 { "-ahxstart", FALSE, etINT, {&rStart},
148 "First residue in helix" },
149 { "-ahxend", FALSE, etINT, {&rEnd},
150 "Last residue in helix" }
163 t_xvgrfile xf[efhNR] = {
164 { NULL, NULL, TRUE, "radius", "Helix radius", NULL, "r (nm)", 0.0 },
165 { NULL, NULL, TRUE, "twist", "Twist per residue", NULL, "Angle (deg)", 0.0 },
166 { NULL, NULL, TRUE, "rise", "Rise per residue", NULL, "Rise (nm)", 0.0 },
167 { NULL, NULL, FALSE, "len-ahx", "Length of the Helix", NULL, "Length (nm)", 0.0 },
168 { NULL, NULL, FALSE, "dip-ahx", "Helix Backbone Dipole", NULL, "rq (nm e)", 0.0 },
169 { NULL, NULL, TRUE, "rms-ahx", "RMS Deviation from Ideal Helix", NULL, "RMS (nm)", 0.0 },
170 { NULL, NULL, FALSE, "rmsa-ahx", "Average RMSD per Residue", "Residue", "RMS (nm)", 0.0 },
171 { NULL, NULL, FALSE, "cd222", "Ellipticity at 222 nm", NULL, "nm", 0.0 },
172 { NULL, NULL, TRUE, "pprms", "RMS Distance from \\8a\\4-helix", NULL, "deg", 0.0 },
173 { NULL, NULL, TRUE, "caphi", "Average Ca-Ca Dihedral", NULL, "\\8F\\4(deg)", 0.0 },
174 { NULL, NULL, TRUE, "phi", "Average \\8F\\4 angles", NULL, "deg", 0.0 },
175 { NULL, NULL, TRUE, "psi", "Average \\8Y\\4 angles", NULL, "deg", 0.0 },
176 { NULL, NULL, TRUE, "hb3", "Average n-n+3 hbond length", NULL, "nm", 0.0 },
177 { NULL, NULL, TRUE, "hb4", "Average n-n+4 hbond length", NULL, "nm", 0.0 },
178 { NULL, NULL, TRUE, "hb5", "Average n-n+5 hbond length", NULL, "nm", 0.0 },
179 { NULL, NULL, FALSE, "JCaHa", "J-Coupling Values", "Residue", "Hz", 0.0 },
180 { NULL, NULL, FALSE, "helicity", "Helicity per Residue", "Residue", "% of time", 0.0 }
185 char buf[54], prop[256];
187 int natoms, nre, nres;
189 int i, j, ai, m, nall, nbb, nca, teller, nSel = 0;
190 atom_id *bbindex, *caindex, *allindex;
193 rvec *x, *xref, *xav;
197 gmx_rmpbc_t gpbc = NULL;
200 { efTPX, NULL, NULL, ffREAD },
201 { efNDX, NULL, NULL, ffREAD },
202 { efTRX, "-f", NULL, ffREAD },
203 { efG87, "-to", NULL, ffOPTWR },
204 { efSTO, "-cz", "zconf", ffWRITE },
205 { efSTO, "-co", "waver", ffWRITE }
207 #define NFILE asize(fnm)
209 if (!parse_common_args(&argc, argv, PCA_CAN_VIEW | PCA_CAN_TIME | PCA_BE_NICE,
210 NFILE, fnm, asize(pa), pa, asize(desc), desc, 0, NULL, &oenv))
215 bRange = (opt2parg_bSet("-ahxstart", asize(pa), pa) &&
216 opt2parg_bSet("-ahxend", asize(pa), pa));
218 top = read_top(ftp2fn(efTPX, NFILE, fnm), &ePBC);
220 natoms = read_first_x(oenv, &status, opt2fn("-f", NFILE, fnm), &t, &x, box);
222 if (opt2bSet("-to", NFILE, fnm))
224 otrj = opt2FILE("-to", NFILE, fnm, "w");
225 strcpy(prop, ppp[0]);
226 fprintf(otrj, "%s Weighted Trajectory: %d atoms, NO box\n", prop, natoms);
233 if (natoms != top->atoms.nr)
235 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)",
236 top->atoms.nr, natoms);
239 bb = mkbbind(ftp2fn(efNDX, NFILE, fnm), &nres, &nbb, r0, &nall, &allindex,
240 top->atoms.atomname, top->atoms.atom, top->atoms.resinfo);
241 snew(bbindex, natoms);
244 fprintf(stderr, "nall=%d\n", nall);
246 /* Open output files, default x-axis is time */
247 for (i = 0; (i < efhNR); i++)
249 sprintf(buf, "%s.xvg", xf[i].filenm);
251 xf[i].fp = xvgropen(buf, xf[i].title,
252 xf[i].xaxis ? xf[i].xaxis : "Time (ps)",
256 sprintf(buf, "%s.out", xf[i].filenm);
258 xf[i].fp2 = ffopen(buf, "w");
262 /* Read reference frame from tpx file to compute helix length */
263 snew(xref, top->atoms.nr);
264 read_tpx(ftp2fn(efTPX, NFILE, fnm),
265 NULL, NULL, &natoms, xref, NULL, NULL, NULL);
266 calc_hxprops(nres, bb, xref);
267 do_start_end(nres, bb, &nbb, bbindex, &nca, caindex, bRange, rStart, rEnd);
271 fprintf(stderr, "nca=%d, nbb=%d\n", nca, nbb);
272 pr_bb(stdout, nres, bb);
275 gpbc = gmx_rmpbc_init(&top->idef, ePBC, natoms);
281 if ((teller++ % 10) == 0)
283 fprintf(stderr, "\rt=%.2f", t);
285 gmx_rmpbc(gpbc, natoms, box, x);
288 calc_hxprops(nres, bb, x);
291 do_start_end(nres, bb, &nbb, bbindex, &nca, caindex, FALSE, 0, 0);
296 rms = fit_ahx(nres, bb, natoms, nall, allindex, x, nca, caindex, bFit);
300 write_sto_conf(opt2fn("-cz", NFILE, fnm), "Helix fitted to Z-Axis",
301 &(top->atoms), x, NULL, ePBC, box);
304 xf[efhRAD].val = radius(xf[efhRAD].fp2, nca, caindex, x);
305 xf[efhTWIST].val = twist(nca, caindex, x);
306 xf[efhRISE].val = rise(nca, caindex, x);
307 xf[efhLEN].val = ahx_len(nca, caindex, x);
308 xf[efhCD222].val = ellipticity(nres, bb);
309 xf[efhDIP].val = dip(nbb, bbindex, x, top->atoms.atom);
310 xf[efhRMS].val = rms;
311 xf[efhCPHI].val = ca_phi(nca, caindex, x);
312 xf[efhPPRMS].val = pprms(xf[efhPPRMS].fp2, nres, bb);
314 for (j = 0; (j <= efhCPHI); j++)
316 fprintf(xf[j].fp, "%10g %10g\n", t, xf[j].val);
319 av_phipsi(xf[efhPHI].fp, xf[efhPSI].fp, xf[efhPHI].fp2, xf[efhPSI].fp2,
321 av_hblen(xf[efhHB3].fp, xf[efhHB3].fp2,
322 xf[efhHB4].fp, xf[efhHB4].fp2,
323 xf[efhHB5].fp, xf[efhHB5].fp2,
328 dump_otrj(otrj, nall, allindex, x, xf[nSel].val, xav);
332 while (read_next_x(oenv, status, &t, x, box));
333 fprintf(stderr, "\n");
335 gmx_rmpbc_done(gpbc);
343 for (i = 0; (i < nall); i++)
346 for (m = 0; (m < DIM); m++)
351 write_sto_conf_indexed(opt2fn("-co", NFILE, fnm),
352 "Weighted and Averaged conformation",
353 &(top->atoms), xav, NULL, ePBC, box, nall, allindex);
356 for (i = 0; (i < nres); i++)
360 fprintf(xf[efhRMSA].fp, "%10d %10g\n", r0+i, bb[i].rmsa/bb[i].nrms);
362 fprintf(xf[efhAHX].fp, "%10d %10g\n", r0+i, (bb[i].nhx*100.0)/(real )teller);
363 fprintf(xf[efhJCA].fp, "%10d %10g\n",
364 r0+i, 140.3+(bb[i].jcaha/(double)teller));
367 for (i = 0; (i < efhNR); i++)
374 do_view(oenv, xf[i].filenm, "-nxy");