File: | gromacs/gmxana/gmx_disre.c |
Location: | line 218, column 9 |
Description: | Value stored to 'ener' is never read |
1 | /* |
2 | * This file is part of the GROMACS molecular simulation package. |
3 | * |
4 | * Copyright (c) 1991-2000, University of Groningen, The Netherlands. |
5 | * Copyright (c) 2001-2004, The GROMACS development team. |
6 | * Copyright (c) 2013,2014, by the GROMACS development team, led by |
7 | * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, |
8 | * and including many others, as listed in the AUTHORS file in the |
9 | * top-level source directory and at http://www.gromacs.org. |
10 | * |
11 | * GROMACS is free software; you can redistribute it and/or |
12 | * modify it under the terms of the GNU Lesser General Public License |
13 | * as published by the Free Software Foundation; either version 2.1 |
14 | * of the License, or (at your option) any later version. |
15 | * |
16 | * GROMACS is distributed in the hope that it will be useful, |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
19 | * Lesser General Public License for more details. |
20 | * |
21 | * You should have received a copy of the GNU Lesser General Public |
22 | * License along with GROMACS; if not, see |
23 | * http://www.gnu.org/licenses, or write to the Free Software Foundation, |
24 | * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
25 | * |
26 | * If you want to redistribute modifications to GROMACS, please |
27 | * consider that scientific software is very special. Version |
28 | * control is crucial - bugs must be traceable. We will be happy to |
29 | * consider code for inclusion in the official distribution, but |
30 | * derived work must not be called official GROMACS. Details are found |
31 | * in the README & COPYING files - if they are missing, get the |
32 | * official version at http://www.gromacs.org. |
33 | * |
34 | * To help us fund GROMACS development, we humbly ask that you cite |
35 | * the research papers on the package. Check out http://www.gromacs.org. |
36 | */ |
37 | #ifdef HAVE_CONFIG_H1 |
38 | #include <config.h> |
39 | #endif |
40 | |
41 | #include <math.h> |
42 | #include <stdlib.h> |
43 | #include <string.h> |
44 | |
45 | #include "typedefs.h" |
46 | #include "macros.h" |
47 | #include "mshift.h" |
48 | #include "gromacs/fileio/xvgr.h" |
49 | #include "viewit.h" |
50 | #include "gromacs/math/vec.h" |
51 | #include "gromacs/fileio/confio.h" |
52 | #include "gromacs/utility/smalloc.h" |
53 | #include "nrnb.h" |
54 | #include "disre.h" |
55 | #include "gromacs/commandline/pargs.h" |
56 | #include "force.h" |
57 | #include "gstat.h" |
58 | #include "main.h" |
59 | #include "gromacs/fileio/pdbio.h" |
60 | #include "index.h" |
61 | #include "mdatoms.h" |
62 | #include "gromacs/fileio/tpxio.h" |
63 | #include "gromacs/fileio/trxio.h" |
64 | #include "mdrun.h" |
65 | #include "names.h" |
66 | #include "gromacs/fileio/matio.h" |
67 | #include "mtop_util.h" |
68 | #include "gmx_ana.h" |
69 | |
70 | #include "gromacs/math/do_fit.h" |
71 | #include "gromacs/utility/fatalerror.h" |
72 | |
73 | typedef struct { |
74 | int n; |
75 | real v; |
76 | } t_toppop; |
77 | |
78 | t_toppop *top = NULL((void*)0); |
79 | int ntop = 0; |
80 | |
81 | typedef struct { |
82 | int nv, nframes; |
83 | real sumv, averv, maxv; |
84 | real *aver1, *aver2, *aver_3, *aver_6; |
85 | } t_dr_result; |
86 | |
87 | static void init5(int n) |
88 | { |
89 | ntop = n; |
90 | snew(top, ntop)(top) = save_calloc("top", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 90, (ntop), sizeof(*(top))); |
91 | } |
92 | |
93 | static void reset5(void) |
94 | { |
95 | int i; |
96 | |
97 | for (i = 0; (i < ntop); i++) |
98 | { |
99 | top[i].n = -1; |
100 | top[i].v = 0; |
101 | } |
102 | } |
103 | |
104 | int tpcomp(const void *a, const void *b) |
105 | { |
106 | t_toppop *tpa; |
107 | t_toppop *tpb; |
108 | |
109 | tpa = (t_toppop *)a; |
110 | tpb = (t_toppop *)b; |
111 | |
112 | return (1e7*(tpb->v-tpa->v)); |
113 | } |
114 | |
115 | static void add5(int ndr, real viol) |
116 | { |
117 | int i, mini; |
118 | |
119 | mini = 0; |
120 | for (i = 1; (i < ntop); i++) |
121 | { |
122 | if (top[i].v < top[mini].v) |
123 | { |
124 | mini = i; |
125 | } |
126 | } |
127 | if (viol > top[mini].v) |
128 | { |
129 | top[mini].v = viol; |
130 | top[mini].n = ndr; |
131 | } |
132 | } |
133 | |
134 | static void print5(FILE *fp) |
135 | { |
136 | int i; |
137 | |
138 | qsort(top, ntop, sizeof(top[0]), tpcomp); |
139 | fprintf(fp, "Index:"); |
140 | for (i = 0; (i < ntop); i++) |
141 | { |
142 | fprintf(fp, " %6d", top[i].n); |
143 | } |
144 | fprintf(fp, "\nViol: "); |
145 | for (i = 0; (i < ntop); i++) |
146 | { |
147 | fprintf(fp, " %6.3f", top[i].v); |
148 | } |
149 | fprintf(fp, "\n"); |
150 | } |
151 | |
152 | static void check_viol(FILE *log, |
153 | t_ilist *disres, t_iparams forceparams[], |
154 | rvec x[], rvec f[], |
155 | t_pbc *pbc, t_graph *g, t_dr_result dr[], |
156 | int clust_id, int isize, atom_id index[], real vvindex[], |
157 | t_fcdata *fcd) |
158 | { |
159 | t_iatom *forceatoms; |
160 | int i, j, nat, n, type, nviol, ndr, label; |
161 | real ener, rt, mviol, tviol, viol, lam, dvdl, drt; |
162 | rvec *fshift; |
163 | static gmx_bool bFirst = TRUE1; |
164 | |
165 | lam = 0; |
166 | dvdl = 0; |
167 | tviol = 0; |
168 | nviol = 0; |
169 | mviol = 0; |
170 | ndr = 0; |
171 | if (ntop) |
172 | { |
173 | reset5(); |
174 | } |
175 | forceatoms = disres->iatoms; |
176 | for (j = 0; (j < isize); j++) |
177 | { |
178 | vvindex[j] = 0; |
179 | } |
180 | nat = interaction_function[F_DISRES].nratoms+1; |
181 | for (i = 0; (i < disres->nr); ) |
182 | { |
183 | type = forceatoms[i]; |
184 | n = 0; |
185 | label = forceparams[type].disres.label; |
186 | if (debug) |
187 | { |
188 | fprintf(debug, "DISRE: ndr = %d, label = %d i=%d, n =%d\n", |
189 | ndr, label, i, n); |
190 | } |
191 | if (ndr != label) |
192 | { |
193 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 193, "tpr inconsistency. ndr = %d, label = %d\n", ndr, label); |
194 | } |
195 | do |
196 | { |
197 | n += nat; |
198 | } |
199 | while (((i+n) < disres->nr) && |
200 | (forceparams[forceatoms[i+n]].disres.label == label)); |
201 | |
202 | calc_disres_R_6(n, &forceatoms[i], forceparams, |
203 | (const rvec*)x, pbc, fcd, NULL((void*)0)); |
204 | |
205 | if (fcd->disres.Rt_6[0] <= 0) |
206 | { |
207 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 207, "ndr = %d, rt_6 = %f", ndr, fcd->disres.Rt_6[0]); |
208 | } |
209 | |
210 | rt = pow(fcd->disres.Rt_6[0], -1.0/6.0); |
211 | dr[clust_id].aver1[ndr] += rt; |
212 | dr[clust_id].aver2[ndr] += sqr(rt); |
213 | drt = pow(rt, -3.0); |
214 | dr[clust_id].aver_3[ndr] += drt; |
215 | dr[clust_id].aver_6[ndr] += fcd->disres.Rt_6[0]; |
216 | |
217 | snew(fshift, SHIFTS)(fshift) = save_calloc("fshift", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 217, (((2*1 +1)*(2*1 +1)*(2*2 +1))), sizeof(*(fshift))); |
218 | ener = interaction_function[F_DISRES].ifunc(n, &forceatoms[i], forceparams, |
Value stored to 'ener' is never read | |
219 | (const rvec*)x, f, fshift, |
220 | pbc, g, lam, &dvdl, NULL((void*)0), fcd, NULL((void*)0)); |
221 | sfree(fshift)save_free("fshift", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 221, (fshift)); |
222 | viol = fcd->disres.sumviol; |
223 | |
224 | if (viol > 0) |
225 | { |
226 | nviol++; |
227 | if (ntop) |
228 | { |
229 | add5(forceparams[type].disres.label, viol); |
230 | } |
231 | if (viol > mviol) |
232 | { |
233 | mviol = viol; |
234 | } |
235 | tviol += viol; |
236 | for (j = 0; (j < isize); j++) |
237 | { |
238 | if (index[j] == forceparams[type].disres.label) |
239 | { |
240 | vvindex[j] = pow(fcd->disres.Rt_6[0], -1.0/6.0); |
241 | } |
242 | } |
243 | } |
244 | ndr++; |
245 | i += n; |
246 | } |
247 | dr[clust_id].nv = nviol; |
248 | dr[clust_id].maxv = mviol; |
249 | dr[clust_id].sumv = tviol; |
250 | dr[clust_id].averv = tviol/ndr; |
251 | dr[clust_id].nframes++; |
252 | |
253 | if (bFirst) |
254 | { |
255 | fprintf(stderrstderr, "\nThere are %d restraints and %d pairs\n", |
256 | ndr, disres->nr/nat); |
257 | bFirst = FALSE0; |
258 | } |
259 | if (ntop) |
260 | { |
261 | print5(log); |
262 | } |
263 | } |
264 | |
265 | typedef struct { |
266 | int index; |
267 | gmx_bool bCore; |
268 | real up1, r, rT3, rT6, viol, violT3, violT6; |
269 | } t_dr_stats; |
270 | |
271 | static int drs_comp(const void *a, const void *b) |
272 | { |
273 | t_dr_stats *da, *db; |
274 | |
275 | da = (t_dr_stats *)a; |
276 | db = (t_dr_stats *)b; |
277 | |
278 | if (da->viol > db->viol) |
279 | { |
280 | return -1; |
281 | } |
282 | else if (da->viol < db->viol) |
283 | { |
284 | return 1; |
285 | } |
286 | else |
287 | { |
288 | return 0; |
289 | } |
290 | } |
291 | |
292 | static void dump_dump(FILE *log, int ndr, t_dr_stats drs[]) |
293 | { |
294 | static const char *core[] = { "All restraints", "Core restraints" }; |
295 | static const char *tp[] = { "linear", "third power", "sixth power" }; |
296 | real viol_tot, viol_max, viol = 0; |
297 | gmx_bool bCore; |
298 | int nviol, nrestr; |
299 | int i, kkk; |
300 | |
301 | for (bCore = FALSE0; (bCore <= TRUE1); bCore++) |
302 | { |
303 | for (kkk = 0; (kkk < 3); kkk++) |
304 | { |
305 | viol_tot = 0; |
306 | viol_max = 0; |
307 | nviol = 0; |
308 | nrestr = 0; |
309 | for (i = 0; (i < ndr); i++) |
310 | { |
311 | if (!bCore || (bCore && drs[i].bCore)) |
312 | { |
313 | switch (kkk) |
314 | { |
315 | case 0: |
316 | viol = drs[i].viol; |
317 | break; |
318 | case 1: |
319 | viol = drs[i].violT3; |
320 | break; |
321 | case 2: |
322 | viol = drs[i].violT6; |
323 | break; |
324 | default: |
325 | gmx_incons("Dumping violations")_gmx_error("incons", "Dumping violations", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 325); |
326 | } |
327 | viol_max = max(viol_max, viol)(((viol_max) > (viol)) ? (viol_max) : (viol) ); |
328 | if (viol > 0) |
329 | { |
330 | nviol++; |
331 | } |
332 | viol_tot += viol; |
333 | nrestr++; |
334 | } |
335 | } |
336 | if ((nrestr > 0) || (bCore && (nrestr < ndr))) |
337 | { |
338 | fprintf(log, "\n"); |
339 | fprintf(log, "+++++++ %s ++++++++\n", core[bCore]); |
340 | fprintf(log, "+++++++ Using %s averaging: ++++++++\n", tp[kkk]); |
341 | fprintf(log, "Sum of violations: %8.3f nm\n", viol_tot); |
342 | if (nrestr > 0) |
343 | { |
344 | fprintf(log, "Average violation: %8.3f nm\n", viol_tot/nrestr); |
345 | } |
346 | fprintf(log, "Largest violation: %8.3f nm\n", viol_max); |
347 | fprintf(log, "Number of violated restraints: %d/%d\n", nviol, nrestr); |
348 | } |
349 | } |
350 | } |
351 | } |
352 | |
353 | static void dump_viol(FILE *log, int ndr, t_dr_stats *drs, gmx_bool bLinear) |
354 | { |
355 | int i; |
356 | |
357 | fprintf(log, "Restr. Core Up1 <r> <rT3> <rT6> <viol><violT3><violT6>\n"); |
358 | for (i = 0; (i < ndr); i++) |
359 | { |
360 | if (bLinear && (drs[i].viol == 0)) |
361 | { |
362 | break; |
363 | } |
364 | fprintf(log, "%6d%5s%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f%8.3f\n", |
365 | drs[i].index, yesno_names[drs[i].bCore], |
366 | drs[i].up1, drs[i].r, drs[i].rT3, drs[i].rT6, |
367 | drs[i].viol, drs[i].violT3, drs[i].violT6); |
368 | } |
369 | } |
370 | |
371 | static gmx_bool is_core(int i, int isize, atom_id index[]) |
372 | { |
373 | int kk; |
374 | gmx_bool bIC = FALSE0; |
375 | |
376 | for (kk = 0; !bIC && (kk < isize); kk++) |
377 | { |
378 | bIC = (index[kk] == i); |
379 | } |
380 | |
381 | return bIC; |
382 | } |
383 | |
384 | static void dump_stats(FILE *log, int nsteps, int ndr, t_ilist *disres, |
385 | t_iparams ip[], t_dr_result *dr, |
386 | int isize, atom_id index[], t_atoms *atoms) |
387 | { |
388 | int i, j, nra; |
389 | t_dr_stats *drs; |
390 | |
391 | fprintf(log, "\n"); |
392 | fprintf(log, "++++++++++++++ STATISTICS ++++++++++++++++++++++++\n"); |
393 | snew(drs, ndr)(drs) = save_calloc("drs", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 393, (ndr), sizeof(*(drs))); |
394 | j = 0; |
395 | nra = interaction_function[F_DISRES].nratoms+1; |
396 | for (i = 0; (i < ndr); i++) |
397 | { |
398 | /* Search for the appropriate restraint */ |
399 | for (; (j < disres->nr); j += nra) |
400 | { |
401 | if (ip[disres->iatoms[j]].disres.label == i) |
402 | { |
403 | break; |
404 | } |
405 | } |
406 | drs[i].index = i; |
407 | drs[i].bCore = is_core(i, isize, index); |
408 | drs[i].up1 = ip[disres->iatoms[j]].disres.up1; |
409 | drs[i].r = dr->aver1[i]/nsteps; |
410 | drs[i].rT3 = pow(dr->aver_3[i]/nsteps, -1.0/3.0); |
411 | drs[i].rT6 = pow(dr->aver_6[i]/nsteps, -1.0/6.0); |
412 | drs[i].viol = max(0, drs[i].r-drs[i].up1)(((0) > (drs[i].r-drs[i].up1)) ? (0) : (drs[i].r-drs[i].up1 ) ); |
413 | drs[i].violT3 = max(0, drs[i].rT3-drs[i].up1)(((0) > (drs[i].rT3-drs[i].up1)) ? (0) : (drs[i].rT3-drs[i ].up1) ); |
414 | drs[i].violT6 = max(0, drs[i].rT6-drs[i].up1)(((0) > (drs[i].rT6-drs[i].up1)) ? (0) : (drs[i].rT6-drs[i ].up1) ); |
415 | if (atoms) |
416 | { |
417 | int j1 = disres->iatoms[j+1]; |
418 | int j2 = disres->iatoms[j+2]; |
419 | atoms->pdbinfo[j1].bfac += drs[i].violT3*5; |
420 | atoms->pdbinfo[j2].bfac += drs[i].violT3*5; |
421 | } |
422 | } |
423 | dump_viol(log, ndr, drs, FALSE0); |
424 | |
425 | fprintf(log, "+++ Sorted by linear averaged violations: +++\n"); |
426 | qsort(drs, ndr, sizeof(drs[0]), drs_comp); |
427 | dump_viol(log, ndr, drs, TRUE1); |
428 | |
429 | dump_dump(log, ndr, drs); |
430 | |
431 | sfree(drs)save_free("drs", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 431, (drs)); |
432 | } |
433 | |
434 | static void dump_clust_stats(FILE *fp, int ndr, t_ilist *disres, |
435 | t_iparams ip[], t_blocka *clust, t_dr_result dr[], |
436 | char *clust_name[], int isize, atom_id index[]) |
437 | { |
438 | int i, j, k, nra, mmm = 0; |
439 | double sumV, maxV, sumVT3, sumVT6, maxVT3, maxVT6; |
440 | t_dr_stats *drs; |
441 | |
442 | fprintf(fp, "\n"); |
443 | fprintf(fp, "++++++++++++++ STATISTICS ++++++++++++++++++++++\n"); |
444 | fprintf(fp, "Cluster NFrames SumV MaxV SumVT MaxVT SumVS MaxVS\n"); |
445 | |
446 | snew(drs, ndr)(drs) = save_calloc("drs", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 446, (ndr), sizeof(*(drs))); |
447 | |
448 | for (k = 0; (k < clust->nr); k++) |
449 | { |
450 | if (dr[k].nframes == 0) |
451 | { |
452 | continue; |
453 | } |
454 | if (dr[k].nframes != (clust->index[k+1]-clust->index[k])) |
455 | { |
456 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 456, "Inconsistency in cluster %s.\n" |
457 | "Found %d frames in trajectory rather than the expected %d\n", |
458 | clust_name[k], dr[k].nframes, |
459 | clust->index[k+1]-clust->index[k]); |
460 | } |
461 | if (!clust_name[k]) |
462 | { |
463 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 463, "Inconsistency with cluster %d. Invalid name", k); |
464 | } |
465 | j = 0; |
466 | nra = interaction_function[F_DISRES].nratoms+1; |
467 | sumV = sumVT3 = sumVT6 = maxV = maxVT3 = maxVT6 = 0; |
468 | for (i = 0; (i < ndr); i++) |
469 | { |
470 | /* Search for the appropriate restraint */ |
471 | for (; (j < disres->nr); j += nra) |
472 | { |
473 | if (ip[disres->iatoms[j]].disres.label == i) |
474 | { |
475 | break; |
476 | } |
477 | } |
478 | drs[i].index = i; |
479 | drs[i].bCore = is_core(i, isize, index); |
480 | drs[i].up1 = ip[disres->iatoms[j]].disres.up1; |
481 | drs[i].r = dr[k].aver1[i]/dr[k].nframes; |
482 | if ((dr[k].aver_3[i] <= 0) || (dr[k].aver_3[i] != dr[k].aver_3[i])) |
483 | { |
484 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 484, "dr[%d].aver_3[%d] = %f", k, i, dr[k].aver_3[i]); |
485 | } |
486 | drs[i].rT3 = pow(dr[k].aver_3[i]/dr[k].nframes, -1.0/3.0); |
487 | drs[i].rT6 = pow(dr[k].aver_6[i]/dr[k].nframes, -1.0/6.0); |
488 | drs[i].viol = max(0, drs[i].r-drs[i].up1)(((0) > (drs[i].r-drs[i].up1)) ? (0) : (drs[i].r-drs[i].up1 ) ); |
489 | drs[i].violT3 = max(0, drs[i].rT3-drs[i].up1)(((0) > (drs[i].rT3-drs[i].up1)) ? (0) : (drs[i].rT3-drs[i ].up1) ); |
490 | drs[i].violT6 = max(0, drs[i].rT6-drs[i].up1)(((0) > (drs[i].rT6-drs[i].up1)) ? (0) : (drs[i].rT6-drs[i ].up1) ); |
491 | sumV += drs[i].viol; |
492 | sumVT3 += drs[i].violT3; |
493 | sumVT6 += drs[i].violT6; |
494 | maxV = max(maxV, drs[i].viol)(((maxV) > (drs[i].viol)) ? (maxV) : (drs[i].viol) ); |
495 | maxVT3 = max(maxVT3, drs[i].violT3)(((maxVT3) > (drs[i].violT3)) ? (maxVT3) : (drs[i].violT3) ); |
496 | maxVT6 = max(maxVT6, drs[i].violT6)(((maxVT6) > (drs[i].violT6)) ? (maxVT6) : (drs[i].violT6) ); |
497 | } |
498 | if (strcmp(clust_name[k], "1000")__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (clust_name[k]) && __builtin_constant_p ("1000") && (__s1_len = strlen (clust_name[k]), __s2_len = strlen ("1000" ), (!((size_t)(const void *)((clust_name[k]) + 1) - (size_t)( const void *)(clust_name[k]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("1000") + 1) - (size_t)(const void *)("1000") == 1) || __s2_len >= 4)) ? __builtin_strcmp (clust_name [k], "1000") : (__builtin_constant_p (clust_name[k]) && ((size_t)(const void *)((clust_name[k]) + 1) - (size_t)(const void *)(clust_name[k]) == 1) && (__s1_len = strlen ( clust_name[k]), __s1_len < 4) ? (__builtin_constant_p ("1000" ) && ((size_t)(const void *)(("1000") + 1) - (size_t) (const void *)("1000") == 1) ? __builtin_strcmp (clust_name[k ], "1000") : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) ("1000"); int __result = ((( const unsigned char *) (const char *) (clust_name[k]))[0] - __s2 [0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (clust_name[k]))[ 1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (clust_name [k]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (clust_name [k]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("1000") && ((size_t)(const void *)(("1000") + 1) - ( size_t)(const void *)("1000") == 1) && (__s2_len = strlen ("1000"), __s2_len < 4) ? (__builtin_constant_p (clust_name [k]) && ((size_t)(const void *)((clust_name[k]) + 1) - (size_t)(const void *)(clust_name[k]) == 1) ? __builtin_strcmp (clust_name[k], "1000") : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (clust_name [k]); int __result = (((const unsigned char *) (const char *) ("1000"))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( "1000"))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( "1000"))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ("1000" ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (clust_name [k], "1000")))); }) == 0) |
499 | { |
500 | mmm++; |
501 | } |
502 | fprintf(fp, "%-10s%6d%8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n", |
503 | clust_name[k], |
504 | dr[k].nframes, sumV, maxV, sumVT3, maxVT3, sumVT6, maxVT6); |
505 | |
506 | } |
507 | fflush(fp); |
508 | sfree(drs)save_free("drs", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 508, (drs)); |
509 | } |
510 | |
511 | static void init_dr_res(t_dr_result *dr, int ndr) |
512 | { |
513 | snew(dr->aver1, ndr+1)(dr->aver1) = save_calloc("dr->aver1", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 513, (ndr+1), sizeof(*(dr->aver1))); |
514 | snew(dr->aver2, ndr+1)(dr->aver2) = save_calloc("dr->aver2", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 514, (ndr+1), sizeof(*(dr->aver2))); |
515 | snew(dr->aver_3, ndr+1)(dr->aver_3) = save_calloc("dr->aver_3", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 515, (ndr+1), sizeof(*(dr->aver_3))); |
516 | snew(dr->aver_6, ndr+1)(dr->aver_6) = save_calloc("dr->aver_6", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 516, (ndr+1), sizeof(*(dr->aver_6))); |
517 | dr->nv = 0; |
518 | dr->nframes = 0; |
519 | dr->sumv = 0; |
520 | dr->maxv = 0; |
521 | dr->averv = 0; |
522 | } |
523 | |
524 | static void dump_disre_matrix(const char *fn, t_dr_result *dr, int ndr, |
525 | int nsteps, t_idef *idef, gmx_mtop_t *mtop, |
526 | real max_dr, int nlevels, gmx_bool bThird) |
527 | { |
528 | FILE *fp; |
529 | int *resnr; |
530 | int n_res, a_offset, mb, mol, a; |
531 | t_atoms *atoms; |
532 | int iii, i, j, nra, nratoms, tp, ri, rj, index, nlabel, label; |
533 | atom_id ai, aj, *ptr; |
534 | real **matrix, *t_res, hi, *w_dr, rav, rviol; |
535 | t_rgb rlo = { 1, 1, 1 }; |
536 | t_rgb rhi = { 0, 0, 0 }; |
537 | if (fn == NULL((void*)0)) |
538 | { |
539 | return; |
540 | } |
541 | |
542 | snew(resnr, mtop->natoms)(resnr) = save_calloc("resnr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 542, (mtop->natoms), sizeof(*(resnr))); |
543 | n_res = 0; |
544 | a_offset = 0; |
545 | for (mb = 0; mb < mtop->nmolblock; mb++) |
546 | { |
547 | atoms = &mtop->moltype[mtop->molblock[mb].type].atoms; |
548 | for (mol = 0; mol < mtop->molblock[mb].nmol; mol++) |
549 | { |
550 | for (a = 0; a < atoms->nr; a++) |
551 | { |
552 | resnr[a_offset+a] = n_res + atoms->atom[a].resind; |
553 | } |
554 | n_res += atoms->nres; |
555 | a_offset += atoms->nr; |
556 | } |
557 | } |
558 | |
559 | snew(t_res, n_res)(t_res) = save_calloc("t_res", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 559, (n_res), sizeof(*(t_res))); |
560 | for (i = 0; (i < n_res); i++) |
561 | { |
562 | t_res[i] = i+1; |
563 | } |
564 | snew(matrix, n_res)(matrix) = save_calloc("matrix", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 564, (n_res), sizeof(*(matrix))); |
565 | for (i = 0; (i < n_res); i++) |
566 | { |
567 | snew(matrix[i], n_res)(matrix[i]) = save_calloc("matrix[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 567, (n_res), sizeof(*(matrix[i]))); |
568 | } |
569 | nratoms = interaction_function[F_DISRES].nratoms; |
570 | nra = (idef->il[F_DISRES].nr/(nratoms+1)); |
571 | snew(ptr, nra+1)(ptr) = save_calloc("ptr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 571, (nra+1), sizeof(*(ptr))); |
572 | index = 0; |
573 | nlabel = 0; |
574 | ptr[0] = 0; |
575 | snew(w_dr, ndr)(w_dr) = save_calloc("w_dr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 575, (ndr), sizeof(*(w_dr))); |
576 | for (i = 0; (i < idef->il[F_DISRES].nr); i += nratoms+1) |
577 | { |
578 | tp = idef->il[F_DISRES].iatoms[i]; |
579 | label = idef->iparams[tp].disres.label; |
580 | |
581 | if (label != index) |
582 | { |
583 | /* Set index pointer */ |
584 | ptr[index+1] = i; |
585 | if (nlabel <= 0) |
586 | { |
587 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 587, "nlabel is %d, label = %d", nlabel, label); |
588 | } |
589 | if (index >= ndr) |
590 | { |
591 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 591, "ndr = %d, index = %d", ndr, index); |
592 | } |
593 | /* Update the weight */ |
594 | w_dr[index] = 1.0/nlabel; |
595 | index = label; |
596 | nlabel = 1; |
597 | } |
598 | else |
599 | { |
600 | nlabel++; |
601 | } |
602 | } |
603 | printf("nlabel = %d, index = %d, ndr = %d\n", nlabel, index, ndr); |
604 | hi = 0; |
605 | for (i = 0; (i < ndr); i++) |
606 | { |
607 | for (j = ptr[i]; (j < ptr[i+1]); j += nratoms+1) |
608 | { |
609 | tp = idef->il[F_DISRES].iatoms[j]; |
610 | ai = idef->il[F_DISRES].iatoms[j+1]; |
611 | aj = idef->il[F_DISRES].iatoms[j+2]; |
612 | |
613 | ri = resnr[ai]; |
614 | rj = resnr[aj]; |
615 | if (bThird) |
616 | { |
617 | rav = pow(dr->aver_3[i]/nsteps, -1.0/3.0); |
618 | } |
619 | else |
620 | { |
621 | rav = dr->aver1[i]/nsteps; |
622 | } |
623 | if (debug) |
624 | { |
625 | fprintf(debug, "DR %d, atoms %d, %d, distance %g\n", i, ai, aj, rav); |
626 | } |
627 | rviol = max(0, rav-idef->iparams[tp].disres.up1)(((0) > (rav-idef->iparams[tp].disres.up1)) ? (0) : (rav -idef->iparams[tp].disres.up1) ); |
628 | matrix[ri][rj] += w_dr[i]*rviol; |
629 | matrix[rj][ri] += w_dr[i]*rviol; |
630 | hi = max(hi, matrix[ri][rj])(((hi) > (matrix[ri][rj])) ? (hi) : (matrix[ri][rj]) ); |
631 | hi = max(hi, matrix[rj][ri])(((hi) > (matrix[rj][ri])) ? (hi) : (matrix[rj][ri]) ); |
632 | } |
633 | } |
634 | |
635 | sfree(resnr)save_free("resnr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 635, (resnr)); |
636 | |
637 | if (max_dr > 0) |
638 | { |
639 | if (hi > max_dr) |
640 | { |
641 | printf("Warning: the maxdr that you have specified (%g) is smaller than\nthe largest value in your simulation (%g)\n", max_dr, hi); |
642 | } |
643 | hi = max_dr; |
644 | } |
645 | printf("Highest level in the matrix will be %g\n", hi); |
646 | fp = gmx_ffopen(fn, "w"); |
647 | write_xpm(fp, 0, "Distance Violations", "<V> (nm)", "Residue", "Residue", |
648 | n_res, n_res, t_res, t_res, matrix, 0, hi, rlo, rhi, &nlevels); |
649 | gmx_ffclose(fp); |
650 | } |
651 | |
652 | int gmx_disre(int argc, char *argv[]) |
653 | { |
654 | const char *desc[] = { |
655 | "[THISMODULE] computes violations of distance restraints.", |
656 | "If necessary, all protons can be added to a protein molecule ", |
657 | "using the [gmx-protonate] program.[PAR]", |
658 | "The program always", |
659 | "computes the instantaneous violations rather than time-averaged,", |
660 | "because this analysis is done from a trajectory file afterwards", |
661 | "it does not make sense to use time averaging. However,", |
662 | "the time averaged values per restraint are given in the log file.[PAR]", |
663 | "An index file may be used to select specific restraints for", |
664 | "printing.[PAR]", |
665 | "When the optional [TT]-q[tt] flag is given a [TT].pdb[tt] file coloured by the", |
666 | "amount of average violations.[PAR]", |
667 | "When the [TT]-c[tt] option is given, an index file will be read", |
668 | "containing the frames in your trajectory corresponding to the clusters", |
669 | "(defined in another manner) that you want to analyze. For these clusters", |
670 | "the program will compute average violations using the third power", |
671 | "averaging algorithm and print them in the log file." |
672 | }; |
673 | static int ntop = 0; |
674 | static int nlevels = 20; |
675 | static real max_dr = 0; |
676 | static gmx_bool bThird = TRUE1; |
677 | t_pargs pa[] = { |
678 | { "-ntop", FALSE0, etINT, {&ntop}, |
679 | "Number of large violations that are stored in the log file every step" }, |
680 | { "-maxdr", FALSE0, etREAL, {&max_dr}, |
681 | "Maximum distance violation in matrix output. If less than or equal to 0 the maximum will be determined by the data." }, |
682 | { "-nlevels", FALSE0, etINT, {&nlevels}, |
683 | "Number of levels in the matrix output" }, |
684 | { "-third", FALSE0, etBOOL, {&bThird}, |
685 | "Use inverse third power averaging or linear for matrix output" } |
686 | }; |
687 | |
688 | FILE *out = NULL((void*)0), *aver = NULL((void*)0), *numv = NULL((void*)0), *maxxv = NULL((void*)0), *xvg = NULL((void*)0); |
689 | t_tpxheader header; |
690 | t_inputrec ir; |
691 | gmx_mtop_t mtop; |
692 | rvec *xtop; |
693 | gmx_localtop_t *top; |
694 | t_atoms *atoms = NULL((void*)0); |
695 | t_fcdata fcd; |
696 | t_nrnb nrnb; |
697 | t_graph *g; |
698 | int ntopatoms, natoms, i, j, kkk; |
699 | t_trxstatus *status; |
700 | real t; |
701 | rvec *x, *f, *xav = NULL((void*)0); |
702 | matrix box; |
703 | gmx_bool bPDB; |
704 | int isize; |
705 | atom_id *index = NULL((void*)0), *ind_fit = NULL((void*)0); |
706 | char *grpname; |
707 | t_cluster_ndx *clust = NULL((void*)0); |
708 | t_dr_result dr, *dr_clust = NULL((void*)0); |
709 | char **leg; |
710 | real *vvindex = NULL((void*)0), *w_rls = NULL((void*)0); |
711 | t_mdatoms *mdatoms; |
712 | t_pbc pbc, *pbc_null; |
713 | int my_clust; |
714 | FILE *fplog; |
715 | output_env_t oenv; |
716 | gmx_rmpbc_t gpbc = NULL((void*)0); |
717 | |
718 | t_filenm fnm[] = { |
719 | { efTPX, NULL((void*)0), NULL((void*)0), ffREAD1<<1 }, |
720 | { efTRX, "-f", NULL((void*)0), ffREAD1<<1 }, |
721 | { efXVG, "-ds", "drsum", ffWRITE1<<2 }, |
722 | { efXVG, "-da", "draver", ffWRITE1<<2 }, |
723 | { efXVG, "-dn", "drnum", ffWRITE1<<2 }, |
724 | { efXVG, "-dm", "drmax", ffWRITE1<<2 }, |
725 | { efXVG, "-dr", "restr", ffWRITE1<<2 }, |
726 | { efLOG, "-l", "disres", ffWRITE1<<2 }, |
727 | { efNDX, NULL((void*)0), "viol", ffOPTRD(1<<1 | 1<<3) }, |
728 | { efPDB, "-q", "viol", ffOPTWR(1<<2| 1<<3) }, |
729 | { efNDX, "-c", "clust", ffOPTRD(1<<1 | 1<<3) }, |
730 | { efXPM, "-x", "matrix", ffOPTWR(1<<2| 1<<3) } |
731 | }; |
732 | #define NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))) asize(fnm)((int)(sizeof(fnm)/sizeof((fnm)[0]))) |
733 | |
734 | if (!parse_common_args(&argc, argv, PCA_CAN_TIME((1<<6) | (1<<7) | (1<<14)) | PCA_CAN_VIEW(1<<5) | PCA_BE_NICE(1<<13), |
735 | NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm, asize(pa)((int)(sizeof(pa)/sizeof((pa)[0]))), pa, asize(desc)((int)(sizeof(desc)/sizeof((desc)[0]))), desc, 0, NULL((void*)0), &oenv)) |
736 | { |
737 | return 0; |
738 | } |
739 | |
740 | fplog = ftp2FILE(efLOG, NFILE, fnm, "w")gmx_ffopen(ftp2fn(efLOG, ((int)(sizeof(fnm)/sizeof((fnm)[0])) ), fnm), "w"); |
741 | |
742 | if (ntop) |
743 | { |
744 | init5(ntop); |
745 | } |
746 | |
747 | read_tpxheader(ftp2fn(efTPX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), &header, FALSE0, NULL((void*)0), NULL((void*)0)); |
748 | snew(xtop, header.natoms)(xtop) = save_calloc("xtop", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 748, (header.natoms), sizeof(*(xtop))); |
749 | read_tpx(ftp2fn(efTPX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), &ir, box, &ntopatoms, xtop, NULL((void*)0), NULL((void*)0), &mtop); |
750 | bPDB = opt2bSet("-q", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
751 | if (bPDB) |
752 | { |
753 | snew(xav, ntopatoms)(xav) = save_calloc("xav", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 753, (ntopatoms), sizeof(*(xav))); |
754 | snew(ind_fit, ntopatoms)(ind_fit) = save_calloc("ind_fit", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 754, (ntopatoms), sizeof(*(ind_fit))); |
755 | snew(w_rls, ntopatoms)(w_rls) = save_calloc("w_rls", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 755, (ntopatoms), sizeof(*(w_rls))); |
756 | for (kkk = 0; (kkk < ntopatoms); kkk++) |
757 | { |
758 | w_rls[kkk] = 1; |
759 | ind_fit[kkk] = kkk; |
760 | } |
761 | |
762 | snew(atoms, 1)(atoms) = save_calloc("atoms", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 762, (1), sizeof(*(atoms))); |
763 | *atoms = gmx_mtop_global_atoms(&mtop); |
764 | |
765 | if (atoms->pdbinfo == NULL((void*)0)) |
766 | { |
767 | snew(atoms->pdbinfo, atoms->nr)(atoms->pdbinfo) = save_calloc("atoms->pdbinfo", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 767, (atoms->nr), sizeof(*(atoms->pdbinfo))); |
768 | } |
769 | } |
770 | |
771 | top = gmx_mtop_generate_local_top(&mtop, &ir); |
772 | |
773 | g = NULL((void*)0); |
774 | pbc_null = NULL((void*)0); |
775 | if (ir.ePBC != epbcNONE) |
776 | { |
777 | if (ir.bPeriodicMols) |
778 | { |
779 | pbc_null = &pbc; |
780 | } |
781 | else |
782 | { |
783 | g = mk_graph(fplog, &top->idef, 0, mtop.natoms, FALSE0, FALSE0); |
784 | } |
785 | } |
786 | |
787 | if (ftp2bSet(efNDX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm)) |
788 | { |
789 | rd_index(ftp2fn(efNDX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), 1, &isize, &index, &grpname); |
790 | xvg = xvgropen(opt2fn("-dr", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "Individual Restraints", "Time (ps)", |
791 | "nm", oenv); |
792 | snew(vvindex, isize)(vvindex) = save_calloc("vvindex", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 792, (isize), sizeof(*(vvindex))); |
793 | snew(leg, isize)(leg) = save_calloc("leg", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 793, (isize), sizeof(*(leg))); |
794 | for (i = 0; (i < isize); i++) |
795 | { |
796 | index[i]++; |
797 | snew(leg[i], 12)(leg[i]) = save_calloc("leg[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 797, (12), sizeof(*(leg[i]))); |
798 | sprintf(leg[i], "index %d", index[i]); |
799 | } |
800 | xvgr_legend(xvg, isize, (const char**)leg, oenv); |
801 | } |
802 | else |
803 | { |
804 | isize = 0; |
805 | } |
806 | |
807 | ir.dr_tau = 0.0; |
808 | init_disres(fplog, &mtop, &ir, NULL((void*)0), &fcd, NULL((void*)0), FALSE0); |
809 | |
810 | natoms = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), &t, &x, box); |
811 | snew(f, 5*natoms)(f) = save_calloc("f", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 811, (5*natoms), sizeof(*(f))); |
812 | |
813 | init_dr_res(&dr, fcd.disres.nres); |
814 | if (opt2bSet("-c", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm)) |
815 | { |
816 | clust = cluster_index(fplog, opt2fn("-c", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm)); |
817 | snew(dr_clust, clust->clust->nr+1)(dr_clust) = save_calloc("dr_clust", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 817, (clust->clust->nr+1), sizeof(*(dr_clust))); |
818 | for (i = 0; (i <= clust->clust->nr); i++) |
819 | { |
820 | init_dr_res(&dr_clust[i], fcd.disres.nres); |
821 | } |
822 | } |
823 | else |
824 | { |
825 | out = xvgropen(opt2fn("-ds", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
826 | "Sum of Violations", "Time (ps)", "nm", oenv); |
827 | aver = xvgropen(opt2fn("-da", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
828 | "Average Violation", "Time (ps)", "nm", oenv); |
829 | numv = xvgropen(opt2fn("-dn", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
830 | "# Violations", "Time (ps)", "#", oenv); |
831 | maxxv = xvgropen(opt2fn("-dm", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
832 | "Largest Violation", "Time (ps)", "nm", oenv); |
833 | } |
834 | |
835 | mdatoms = init_mdatoms(fplog, &mtop, ir.efep != efepNO); |
836 | atoms2md(&mtop, &ir, 0, NULL((void*)0), mtop.natoms, mdatoms); |
837 | update_mdatoms(mdatoms, ir.fepvals->init_lambda); |
838 | init_nrnb(&nrnb); |
839 | if (ir.ePBC != epbcNONE) |
840 | { |
841 | gpbc = gmx_rmpbc_init(&top->idef, ir.ePBC, natoms); |
842 | } |
843 | |
844 | j = 0; |
845 | do |
846 | { |
847 | if (ir.ePBC != epbcNONE) |
848 | { |
849 | if (ir.bPeriodicMols) |
850 | { |
851 | set_pbc(&pbc, ir.ePBC, box); |
852 | } |
853 | else |
854 | { |
855 | gmx_rmpbc(gpbc, natoms, box, x); |
856 | } |
857 | } |
858 | |
859 | if (clust) |
860 | { |
861 | if (j > clust->maxframe) |
862 | { |
863 | gmx_fatal(FARGS0, "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 863, "There are more frames in the trajectory than in the cluster index file. t = %8f\n", t); |
864 | } |
865 | my_clust = clust->inv_clust[j]; |
866 | range_check(my_clust, 0, clust->clust->nr)_range_check(my_clust, 0, clust->clust->nr, ((void*)0), "my_clust", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_disre.c" , 866); |
867 | check_viol(fplog, &(top->idef.il[F_DISRES]), |
868 | top->idef.iparams, |
869 | x, f, pbc_null, g, dr_clust, my_clust, isize, index, vvindex, &fcd); |
870 | } |
871 | else |
872 | { |
873 | check_viol(fplog, &(top->idef.il[F_DISRES]), |
874 | top->idef.iparams, |
875 | x, f, pbc_null, g, &dr, 0, isize, index, vvindex, &fcd); |
876 | } |
877 | if (bPDB) |
878 | { |
879 | reset_x(atoms->nr, ind_fit, atoms->nr, NULL((void*)0), x, w_rls); |
880 | do_fit(atoms->nr, w_rls, x, x); |
881 | if (j == 0) |
882 | { |
883 | /* Store the first frame of the trajectory as 'characteristic' |
884 | * for colouring with violations. |
885 | */ |
886 | for (kkk = 0; (kkk < atoms->nr); kkk++) |
887 | { |
888 | copy_rvec(x[kkk], xav[kkk]); |
889 | } |
890 | } |
891 | } |
892 | if (!clust) |
893 | { |
894 | if (isize > 0) |
895 | { |
896 | fprintf(xvg, "%10g", t); |
897 | for (i = 0; (i < isize); i++) |
898 | { |
899 | fprintf(xvg, " %10g", vvindex[i]); |
900 | } |
901 | fprintf(xvg, "\n"); |
902 | } |
903 | fprintf(out, "%10g %10g\n", t, dr.sumv); |
904 | fprintf(aver, "%10g %10g\n", t, dr.averv); |
905 | fprintf(maxxv, "%10g %10g\n", t, dr.maxv); |
906 | fprintf(numv, "%10g %10d\n", t, dr.nv); |
907 | } |
908 | j++; |
909 | } |
910 | while (read_next_x(oenv, status, &t, x, box)); |
911 | close_trj(status); |
912 | if (ir.ePBC != epbcNONE) |
913 | { |
914 | gmx_rmpbc_done(gpbc); |
915 | } |
916 | |
917 | if (clust) |
918 | { |
919 | dump_clust_stats(fplog, fcd.disres.nres, &(top->idef.il[F_DISRES]), |
920 | top->idef.iparams, clust->clust, dr_clust, |
921 | clust->grpname, isize, index); |
922 | } |
923 | else |
924 | { |
925 | dump_stats(fplog, j, fcd.disres.nres, &(top->idef.il[F_DISRES]), |
926 | top->idef.iparams, &dr, isize, index, |
927 | bPDB ? atoms : NULL((void*)0)); |
928 | if (bPDB) |
929 | { |
930 | write_sto_conf(opt2fn("-q", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
931 | "Coloured by average violation in Angstrom", |
932 | atoms, xav, NULL((void*)0), ir.ePBC, box); |
933 | } |
934 | dump_disre_matrix(opt2fn_null("-x", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), &dr, fcd.disres.nres, |
935 | j, &top->idef, &mtop, max_dr, nlevels, bThird); |
936 | gmx_ffclose(out); |
937 | gmx_ffclose(aver); |
938 | gmx_ffclose(numv); |
939 | gmx_ffclose(maxxv); |
940 | if (isize > 0) |
941 | { |
942 | gmx_ffclose(xvg); |
943 | do_view(oenv, opt2fn("-dr", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "-nxy"); |
944 | } |
945 | do_view(oenv, opt2fn("-dn", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "-nxy"); |
946 | do_view(oenv, opt2fn("-da", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "-nxy"); |
947 | do_view(oenv, opt2fn("-ds", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "-nxy"); |
948 | do_view(oenv, opt2fn("-dm", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "-nxy"); |
949 | } |
950 | |
951 | gmx_log_close(fplog); |
952 | |
953 | return 0; |
954 | } |