File: | gromacs/gmxana/gmx_rmsdist.c |
Location: | line 790, column 5 |
Description: | Value stored to 'natom' 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 | |
43 | #include "macros.h" |
44 | #include "gromacs/utility/smalloc.h" |
45 | #include "typedefs.h" |
46 | #include "names.h" |
47 | #include "gromacs/commandline/pargs.h" |
48 | #include "gromacs/fileio/tpxio.h" |
49 | #include "gromacs/fileio/trxio.h" |
50 | #include "gromacs/fileio/strdb.h" |
51 | #include "gromacs/math/vec.h" |
52 | #include "macros.h" |
53 | #include "index.h" |
54 | #include "pbc.h" |
55 | #include "gromacs/fileio/xvgr.h" |
56 | #include "viewit.h" |
57 | #include "gromacs/utility/futil.h" |
58 | #include "gromacs/fileio/matio.h" |
59 | #include "gmx_ana.h" |
60 | |
61 | |
62 | static void calc_dist(int nind, atom_id index[], rvec x[], int ePBC, matrix box, |
63 | real **d) |
64 | { |
65 | int i, j; |
66 | real *xi; |
67 | rvec dx; |
68 | real temp2; |
69 | t_pbc pbc; |
70 | |
71 | set_pbc(&pbc, ePBC, box); |
72 | for (i = 0; (i < nind-1); i++) |
73 | { |
74 | xi = x[index[i]]; |
75 | for (j = i+1; (j < nind); j++) |
76 | { |
77 | pbc_dx(&pbc, xi, x[index[j]], dx); |
78 | temp2 = norm2(dx); |
79 | d[i][j] = sqrt(temp2); |
80 | } |
81 | } |
82 | } |
83 | |
84 | static void calc_dist_tot(int nind, atom_id index[], rvec x[], |
85 | int ePBC, matrix box, |
86 | real **d, real **dtot, real **dtot2, |
87 | gmx_bool bNMR, real **dtot1_3, real **dtot1_6) |
88 | { |
89 | int i, j; |
90 | real *xi; |
91 | real temp, temp2, temp1_3; |
92 | rvec dx; |
93 | t_pbc pbc; |
94 | |
95 | set_pbc(&pbc, ePBC, box); |
96 | for (i = 0; (i < nind-1); i++) |
97 | { |
98 | xi = x[index[i]]; |
99 | for (j = i+1; (j < nind); j++) |
100 | { |
101 | pbc_dx(&pbc, xi, x[index[j]], dx); |
102 | temp2 = norm2(dx); |
103 | temp = sqrt(temp2); |
104 | d[i][j] = temp; |
105 | dtot[i][j] += temp; |
106 | dtot2[i][j] += temp2; |
107 | if (bNMR) |
108 | { |
109 | temp1_3 = 1.0/(temp*temp2); |
110 | dtot1_3[i][j] += temp1_3; |
111 | dtot1_6[i][j] += temp1_3*temp1_3; |
112 | } |
113 | } |
114 | } |
115 | } |
116 | |
117 | static void calc_nmr(int nind, int nframes, real **dtot1_3, real **dtot1_6, |
118 | real *max1_3, real *max1_6) |
119 | { |
120 | int i, j; |
121 | real temp1_3, temp1_6; |
122 | |
123 | for (i = 0; (i < nind-1); i++) |
124 | { |
125 | for (j = i+1; (j < nind); j++) |
126 | { |
127 | temp1_3 = pow(dtot1_3[i][j]/nframes, -1.0/3.0); |
128 | temp1_6 = pow(dtot1_6[i][j]/nframes, -1.0/6.0); |
129 | if (temp1_3 > *max1_3) |
130 | { |
131 | *max1_3 = temp1_3; |
132 | } |
133 | if (temp1_6 > *max1_6) |
134 | { |
135 | *max1_6 = temp1_6; |
136 | } |
137 | dtot1_3[i][j] = temp1_3; |
138 | dtot1_6[i][j] = temp1_6; |
139 | dtot1_3[j][i] = temp1_3; |
140 | dtot1_6[j][i] = temp1_6; |
141 | } |
142 | } |
143 | } |
144 | |
145 | static char Hnum[] = "123"; |
146 | |
147 | typedef struct { |
148 | int nr; |
149 | real r_3; |
150 | real r_6; |
151 | real i_3; |
152 | real i_6; |
153 | } t_noe; |
154 | |
155 | typedef struct { |
156 | int anr; |
157 | int ianr; |
158 | int rnr; |
159 | char *aname; |
160 | char *rname; |
161 | } t_noe_gr; |
162 | |
163 | typedef struct { |
164 | int rnr; |
165 | char *nname; |
166 | char *rname; |
167 | char *aname; |
168 | } t_equiv; |
169 | |
170 | static int read_equiv(const char *eq_fn, t_equiv ***equivptr) |
171 | { |
172 | FILE *fp; |
173 | char line[STRLEN4096], resname[10], atomname[10], *lp; |
174 | int neq, na, n, resnr; |
175 | t_equiv **equiv; |
176 | |
177 | fp = gmx_ffopen(eq_fn, "r"); |
178 | neq = 0; |
179 | equiv = NULL((void*)0); |
180 | while (get_a_line(fp, line, STRLEN4096)) |
181 | { |
182 | lp = line; |
183 | /* this is not efficient, but I'm lazy */ |
184 | srenew(equiv, neq+1)(equiv) = save_realloc("equiv", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 184, (equiv), (neq+1), sizeof(*(equiv))); |
185 | equiv[neq] = NULL((void*)0); |
186 | na = 0; |
187 | if (sscanf(lp, "%s %n", atomname, &n) == 1) |
188 | { |
189 | lp += n; |
190 | snew(equiv[neq], 1)(equiv[neq]) = save_calloc("equiv[neq]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 190, (1), sizeof(*(equiv[neq]))); |
191 | equiv[neq][0].nname = strdup(atomname)(__extension__ (__builtin_constant_p (atomname) && (( size_t)(const void *)((atomname) + 1) - (size_t)(const void * )(atomname) == 1) ? (((const char *) (atomname))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (atomname) + 1; char *__retval = (char *) malloc (__len ); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval , atomname, __len); __retval; })) : __strdup (atomname))); |
192 | while (sscanf(lp, "%d %s %s %n", &resnr, resname, atomname, &n) == 3) |
193 | { |
194 | /* this is not efficient, but I'm lazy (again) */ |
195 | srenew(equiv[neq], na+1)(equiv[neq]) = save_realloc("equiv[neq]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 195, (equiv[neq]), (na+1), sizeof(*(equiv[neq]))); |
196 | equiv[neq][na].rnr = resnr-1; |
197 | equiv[neq][na].rname = strdup(resname)(__extension__ (__builtin_constant_p (resname) && ((size_t )(const void *)((resname) + 1) - (size_t)(const void *)(resname ) == 1) ? (((const char *) (resname))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (resname ) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval, resname , __len); __retval; })) : __strdup (resname))); |
198 | equiv[neq][na].aname = strdup(atomname)(__extension__ (__builtin_constant_p (atomname) && (( size_t)(const void *)((atomname) + 1) - (size_t)(const void * )(atomname) == 1) ? (((const char *) (atomname))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (atomname) + 1; char *__retval = (char *) malloc (__len ); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval , atomname, __len); __retval; })) : __strdup (atomname))); |
199 | if (na > 0) |
200 | { |
201 | equiv[neq][na].nname = NULL((void*)0); |
202 | } |
203 | na++; |
204 | lp += n; |
205 | } |
206 | } |
207 | /* make empty element as flag for end of array */ |
208 | srenew(equiv[neq], na+1)(equiv[neq]) = save_realloc("equiv[neq]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 208, (equiv[neq]), (na+1), sizeof(*(equiv[neq]))); |
209 | equiv[neq][na].rnr = NOTSET-12345; |
210 | equiv[neq][na].rname = NULL((void*)0); |
211 | equiv[neq][na].aname = NULL((void*)0); |
212 | |
213 | /* next */ |
214 | neq++; |
215 | } |
216 | gmx_ffclose(fp); |
217 | |
218 | *equivptr = equiv; |
219 | |
220 | return neq; |
221 | } |
222 | |
223 | static void dump_equiv(FILE *out, int neq, t_equiv **equiv) |
224 | { |
225 | int i, j; |
226 | |
227 | fprintf(out, "Dumping equivalent list\n"); |
228 | for (i = 0; i < neq; i++) |
229 | { |
230 | fprintf(out, "%s", equiv[i][0].nname); |
231 | for (j = 0; equiv[i][j].rnr != NOTSET-12345; j++) |
232 | { |
233 | fprintf(out, " %d %s %s", |
234 | equiv[i][j].rnr, equiv[i][j].rname, equiv[i][j].aname); |
235 | } |
236 | fprintf(out, "\n"); |
237 | } |
238 | } |
239 | |
240 | static gmx_bool is_equiv(int neq, t_equiv **equiv, char **nname, |
241 | int rnr1, char *rname1, char *aname1, |
242 | int rnr2, char *rname2, char *aname2) |
243 | { |
244 | int i, j; |
245 | gmx_bool bFound; |
246 | |
247 | bFound = FALSE0; |
248 | /* we can terminate each loop when bFound is true! */ |
249 | for (i = 0; i < neq && !bFound; i++) |
250 | { |
251 | /* find first atom */ |
252 | for (j = 0; equiv[i][j].rnr != NOTSET-12345 && !bFound; j++) |
253 | { |
254 | bFound = ( equiv[i][j].rnr == rnr1 && |
255 | strcmp(equiv[i][j].rname, rname1)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (equiv[i][j].rname) && __builtin_constant_p (rname1) && (__s1_len = strlen (equiv[i][j].rname), __s2_len = strlen (rname1), (!((size_t)(const void *)((equiv[i][j].rname ) + 1) - (size_t)(const void *)(equiv[i][j].rname) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((rname1) + 1) - (size_t)(const void *)(rname1) == 1) || __s2_len >= 4)) ? __builtin_strcmp (equiv[i][j].rname, rname1) : (__builtin_constant_p (equiv[i][j].rname) && ((size_t)(const void *)((equiv [i][j].rname) + 1) - (size_t)(const void *)(equiv[i][j].rname ) == 1) && (__s1_len = strlen (equiv[i][j].rname), __s1_len < 4) ? (__builtin_constant_p (rname1) && ((size_t )(const void *)((rname1) + 1) - (size_t)(const void *)(rname1 ) == 1) ? __builtin_strcmp (equiv[i][j].rname, rname1) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (rname1); int __result = (((const unsigned char *) ( const char *) (equiv[i][j].rname))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].rname))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].rname))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (equiv[i][j].rname) )[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ( rname1) && ((size_t)(const void *)((rname1) + 1) - (size_t )(const void *)(rname1) == 1) && (__s2_len = strlen ( rname1), __s2_len < 4) ? (__builtin_constant_p (equiv[i][j ].rname) && ((size_t)(const void *)((equiv[i][j].rname ) + 1) - (size_t)(const void *)(equiv[i][j].rname) == 1) ? __builtin_strcmp (equiv[i][j].rname, rname1) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (equiv[i ][j].rname); int __result = (((const unsigned char *) (const char *) (rname1))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( rname1))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( rname1))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (rname1 ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (equiv [i][j].rname, rname1)))); }) == 0 && |
256 | strcmp(equiv[i][j].aname, aname1)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (equiv[i][j].aname) && __builtin_constant_p (aname1) && (__s1_len = strlen (equiv[i][j].aname), __s2_len = strlen (aname1), (!((size_t)(const void *)((equiv[i][j].aname ) + 1) - (size_t)(const void *)(equiv[i][j].aname) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((aname1) + 1) - (size_t)(const void *)(aname1) == 1) || __s2_len >= 4)) ? __builtin_strcmp (equiv[i][j].aname, aname1) : (__builtin_constant_p (equiv[i][j].aname) && ((size_t)(const void *)((equiv [i][j].aname) + 1) - (size_t)(const void *)(equiv[i][j].aname ) == 1) && (__s1_len = strlen (equiv[i][j].aname), __s1_len < 4) ? (__builtin_constant_p (aname1) && ((size_t )(const void *)((aname1) + 1) - (size_t)(const void *)(aname1 ) == 1) ? __builtin_strcmp (equiv[i][j].aname, aname1) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (aname1); int __result = (((const unsigned char *) ( const char *) (equiv[i][j].aname))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].aname))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].aname))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (equiv[i][j].aname) )[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ( aname1) && ((size_t)(const void *)((aname1) + 1) - (size_t )(const void *)(aname1) == 1) && (__s2_len = strlen ( aname1), __s2_len < 4) ? (__builtin_constant_p (equiv[i][j ].aname) && ((size_t)(const void *)((equiv[i][j].aname ) + 1) - (size_t)(const void *)(equiv[i][j].aname) == 1) ? __builtin_strcmp (equiv[i][j].aname, aname1) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (equiv[i ][j].aname); int __result = (((const unsigned char *) (const char *) (aname1))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( aname1))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( aname1))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (aname1 ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (equiv [i][j].aname, aname1)))); }) == 0 ); |
257 | } |
258 | if (bFound) |
259 | { |
260 | /* find second atom */ |
261 | bFound = FALSE0; |
262 | for (j = 0; equiv[i][j].rnr != NOTSET-12345 && !bFound; j++) |
263 | { |
264 | bFound = ( equiv[i][j].rnr == rnr2 && |
265 | strcmp(equiv[i][j].rname, rname2)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (equiv[i][j].rname) && __builtin_constant_p (rname2) && (__s1_len = strlen (equiv[i][j].rname), __s2_len = strlen (rname2), (!((size_t)(const void *)((equiv[i][j].rname ) + 1) - (size_t)(const void *)(equiv[i][j].rname) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((rname2) + 1) - (size_t)(const void *)(rname2) == 1) || __s2_len >= 4)) ? __builtin_strcmp (equiv[i][j].rname, rname2) : (__builtin_constant_p (equiv[i][j].rname) && ((size_t)(const void *)((equiv [i][j].rname) + 1) - (size_t)(const void *)(equiv[i][j].rname ) == 1) && (__s1_len = strlen (equiv[i][j].rname), __s1_len < 4) ? (__builtin_constant_p (rname2) && ((size_t )(const void *)((rname2) + 1) - (size_t)(const void *)(rname2 ) == 1) ? __builtin_strcmp (equiv[i][j].rname, rname2) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (rname2); int __result = (((const unsigned char *) ( const char *) (equiv[i][j].rname))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].rname))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].rname))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (equiv[i][j].rname) )[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ( rname2) && ((size_t)(const void *)((rname2) + 1) - (size_t )(const void *)(rname2) == 1) && (__s2_len = strlen ( rname2), __s2_len < 4) ? (__builtin_constant_p (equiv[i][j ].rname) && ((size_t)(const void *)((equiv[i][j].rname ) + 1) - (size_t)(const void *)(equiv[i][j].rname) == 1) ? __builtin_strcmp (equiv[i][j].rname, rname2) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (equiv[i ][j].rname); int __result = (((const unsigned char *) (const char *) (rname2))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( rname2))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( rname2))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (rname2 ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (equiv [i][j].rname, rname2)))); }) == 0 && |
266 | strcmp(equiv[i][j].aname, aname2)__extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (equiv[i][j].aname) && __builtin_constant_p (aname2) && (__s1_len = strlen (equiv[i][j].aname), __s2_len = strlen (aname2), (!((size_t)(const void *)((equiv[i][j].aname ) + 1) - (size_t)(const void *)(equiv[i][j].aname) == 1) || __s1_len >= 4) && (!((size_t)(const void *)((aname2) + 1) - (size_t)(const void *)(aname2) == 1) || __s2_len >= 4)) ? __builtin_strcmp (equiv[i][j].aname, aname2) : (__builtin_constant_p (equiv[i][j].aname) && ((size_t)(const void *)((equiv [i][j].aname) + 1) - (size_t)(const void *)(equiv[i][j].aname ) == 1) && (__s1_len = strlen (equiv[i][j].aname), __s1_len < 4) ? (__builtin_constant_p (aname2) && ((size_t )(const void *)((aname2) + 1) - (size_t)(const void *)(aname2 ) == 1) ? __builtin_strcmp (equiv[i][j].aname, aname2) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (aname2); int __result = (((const unsigned char *) ( const char *) (equiv[i][j].aname))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].aname))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (equiv[i][j].aname))[2] - __s2 [2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (equiv[i][j].aname) )[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ( aname2) && ((size_t)(const void *)((aname2) + 1) - (size_t )(const void *)(aname2) == 1) && (__s2_len = strlen ( aname2), __s2_len < 4) ? (__builtin_constant_p (equiv[i][j ].aname) && ((size_t)(const void *)((equiv[i][j].aname ) + 1) - (size_t)(const void *)(equiv[i][j].aname) == 1) ? __builtin_strcmp (equiv[i][j].aname, aname2) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (equiv[i ][j].aname); int __result = (((const unsigned char *) (const char *) (aname2))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) ( aname2))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) ( aname2))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) (aname2 ))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (equiv [i][j].aname, aname2)))); }) == 0 ); |
267 | } |
268 | } |
269 | } |
270 | if (bFound) |
271 | { |
272 | *nname = strdup(equiv[i-1][0].nname)(__extension__ (__builtin_constant_p (equiv[i-1][0].nname) && ((size_t)(const void *)((equiv[i-1][0].nname) + 1) - (size_t )(const void *)(equiv[i-1][0].nname) == 1) ? (((const char *) (equiv[i-1][0].nname))[0] == '\0' ? (char *) calloc ((size_t ) 1, (size_t) 1) : ({ size_t __len = strlen (equiv[i-1][0].nname ) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval, equiv[i -1][0].nname, __len); __retval; })) : __strdup (equiv[i-1][0] .nname))); |
273 | } |
274 | |
275 | return bFound; |
276 | } |
277 | |
278 | static int analyze_noe_equivalent(const char *eq_fn, |
279 | t_atoms *atoms, int isize, atom_id *index, |
280 | gmx_bool bSumH, |
281 | atom_id *noe_index, t_noe_gr *noe_gr) |
282 | { |
283 | FILE *fp; |
284 | int i, j, anmil, anmjl, rnri, rnrj, gi, groupnr, neq; |
285 | char *anmi, *anmj, **nnm; |
286 | gmx_bool bMatch, bEquiv; |
287 | t_equiv **equiv; |
288 | |
289 | snew(nnm, isize)(nnm) = save_calloc("nnm", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 289, (isize), sizeof(*(nnm))); |
290 | if (bSumH) |
291 | { |
292 | if (eq_fn) |
293 | { |
294 | neq = read_equiv(eq_fn, &equiv); |
295 | if (debug) |
296 | { |
297 | dump_equiv(debug, neq, equiv); |
298 | } |
299 | } |
300 | else |
301 | { |
302 | neq = 0; |
303 | equiv = NULL((void*)0); |
304 | } |
305 | |
306 | groupnr = 0; |
307 | for (i = 0; i < isize; i++) |
308 | { |
309 | if (equiv && i < isize-1) |
310 | { |
311 | /* check explicit list of equivalent atoms */ |
312 | do |
313 | { |
314 | j = i+1; |
315 | rnri = atoms->atom[index[i]].resind; |
316 | rnrj = atoms->atom[index[j]].resind; |
317 | bEquiv = |
318 | is_equiv(neq, equiv, &nnm[i], |
319 | rnri, *atoms->resinfo[rnri].name, *atoms->atomname[index[i]], |
320 | rnrj, *atoms->resinfo[rnrj].name, *atoms->atomname[index[j]]); |
321 | if (nnm[i] && bEquiv) |
322 | { |
323 | nnm[j] = strdup(nnm[i])(__extension__ (__builtin_constant_p (nnm[i]) && ((size_t )(const void *)((nnm[i]) + 1) - (size_t)(const void *)(nnm[i] ) == 1) ? (((const char *) (nnm[i]))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (nnm[i]) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval, nnm[i], __len ); __retval; })) : __strdup (nnm[i]))); |
324 | } |
325 | if (bEquiv) |
326 | { |
327 | /* set index for matching atom */ |
328 | noe_index[j] = groupnr; |
329 | /* skip matching atom */ |
330 | i = j; |
331 | } |
332 | } |
333 | while (bEquiv && i < isize-1); |
334 | } |
335 | else |
336 | { |
337 | bEquiv = FALSE0; |
338 | } |
339 | if (!bEquiv) |
340 | { |
341 | /* look for triplets of consecutive atoms with name XX?, |
342 | X are any number of letters or digits and ? goes from 1 to 3 |
343 | This is supposed to cover all CH3 groups and the like */ |
344 | anmi = *atoms->atomname[index[i]]; |
345 | anmil = strlen(anmi); |
346 | bMatch = i < isize-3 && anmi[anmil-1] == '1'; |
347 | if (bMatch) |
348 | { |
349 | for (j = 1; j < 3; j++) |
350 | { |
351 | anmj = *atoms->atomname[index[i+j]]; |
352 | anmjl = strlen(anmj); |
353 | bMatch = bMatch && ( anmil == anmjl && anmj[anmjl-1] == Hnum[j] && |
354 | strncmp(anmi, anmj, anmil-1)(__extension__ (__builtin_constant_p (anmil-1) && ((__builtin_constant_p (anmi) && strlen (anmi) < ((size_t) (anmil-1))) || (__builtin_constant_p (anmj) && strlen (anmj) < ( (size_t) (anmil-1)))) ? __extension__ ({ size_t __s1_len, __s2_len ; (__builtin_constant_p (anmi) && __builtin_constant_p (anmj) && (__s1_len = strlen (anmi), __s2_len = strlen (anmj), (!((size_t)(const void *)((anmi) + 1) - (size_t)(const void *)(anmi) == 1) || __s1_len >= 4) && (!((size_t )(const void *)((anmj) + 1) - (size_t)(const void *)(anmj) == 1) || __s2_len >= 4)) ? __builtin_strcmp (anmi, anmj) : ( __builtin_constant_p (anmi) && ((size_t)(const void * )((anmi) + 1) - (size_t)(const void *)(anmi) == 1) && (__s1_len = strlen (anmi), __s1_len < 4) ? (__builtin_constant_p (anmj) && ((size_t)(const void *)((anmj) + 1) - (size_t )(const void *)(anmj) == 1) ? __builtin_strcmp (anmi, anmj) : (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (anmj); int __result = (((const unsigned char *) (const char *) (anmi))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (anmi))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (anmi))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((const unsigned char * ) (const char *) (anmi))[3] - __s2[3]); } } __result; }))) : ( __builtin_constant_p (anmj) && ((size_t)(const void * )((anmj) + 1) - (size_t)(const void *)(anmj) == 1) && (__s2_len = strlen (anmj), __s2_len < 4) ? (__builtin_constant_p (anmi) && ((size_t)(const void *)((anmi) + 1) - (size_t )(const void *)(anmi) == 1) ? __builtin_strcmp (anmi, anmj) : (- (__extension__ ({ const unsigned char *__s2 = (const unsigned char *) (const char *) (anmi); int __result = (((const unsigned char *) (const char *) (anmj))[0] - __s2[0]); if (__s2_len > 0 && __result == 0) { __result = (((const unsigned char *) (const char *) (anmj))[1] - __s2[1]); if (__s2_len > 1 && __result == 0) { __result = (((const unsigned char *) (const char *) (anmj))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char * ) (const char *) (anmj))[3] - __s2[3]); } } __result; })))) : __builtin_strcmp (anmi, anmj)))); }) : strncmp (anmi, anmj, anmil -1))) == 0 ); |
355 | } |
356 | } |
357 | /* set index for this atom */ |
358 | noe_index[i] = groupnr; |
359 | if (bMatch) |
360 | { |
361 | /* set index for next two matching atoms */ |
362 | for (j = 1; j < 3; j++) |
363 | { |
364 | noe_index[i+j] = groupnr; |
365 | } |
366 | /* skip matching atoms */ |
367 | i += 2; |
368 | } |
369 | } |
370 | groupnr++; |
371 | } |
372 | } |
373 | else |
374 | { |
375 | /* make index without looking for equivalent atoms */ |
376 | for (i = 0; i < isize; i++) |
377 | { |
378 | noe_index[i] = i; |
379 | } |
380 | groupnr = isize; |
381 | } |
382 | noe_index[isize] = groupnr; |
383 | |
384 | if (debug) |
385 | { |
386 | /* dump new names */ |
387 | for (i = 0; i < isize; i++) |
388 | { |
389 | rnri = atoms->atom[index[i]].resind; |
390 | fprintf(debug, "%s %s %d -> %s\n", *atoms->atomname[index[i]], |
391 | *atoms->resinfo[rnri].name, rnri, nnm[i] ? nnm[i] : ""); |
392 | } |
393 | } |
394 | |
395 | for (i = 0; i < isize; i++) |
396 | { |
397 | gi = noe_index[i]; |
398 | if (!noe_gr[gi].aname) |
399 | { |
400 | noe_gr[gi].ianr = i; |
401 | noe_gr[gi].anr = index[i]; |
402 | if (nnm[i]) |
403 | { |
404 | noe_gr[gi].aname = strdup(nnm[i])(__extension__ (__builtin_constant_p (nnm[i]) && ((size_t )(const void *)((nnm[i]) + 1) - (size_t)(const void *)(nnm[i] ) == 1) ? (((const char *) (nnm[i]))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (nnm[i]) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval, nnm[i], __len ); __retval; })) : __strdup (nnm[i]))); |
405 | } |
406 | else |
407 | { |
408 | noe_gr[gi].aname = strdup(*atoms->atomname[index[i]])(__extension__ (__builtin_constant_p (*atoms->atomname[index [i]]) && ((size_t)(const void *)((*atoms->atomname [index[i]]) + 1) - (size_t)(const void *)(*atoms->atomname [index[i]]) == 1) ? (((const char *) (*atoms->atomname[index [i]]))[0] == '\0' ? (char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (*atoms->atomname[index[i]]) + 1 ; char *__retval = (char *) malloc (__len); if (__retval != ( (void*)0)) __retval = (char *) memcpy (__retval, *atoms->atomname [index[i]], __len); __retval; })) : __strdup (*atoms->atomname [index[i]]))); |
409 | if (noe_index[i] == noe_index[i+1]) |
410 | { |
411 | noe_gr[gi].aname[strlen(noe_gr[gi].aname)-1] = '*'; |
412 | } |
413 | } |
414 | noe_gr[gi].rnr = atoms->atom[index[i]].resind; |
415 | noe_gr[gi].rname = strdup(*atoms->resinfo[noe_gr[gi].rnr].name)(__extension__ (__builtin_constant_p (*atoms->resinfo[noe_gr [gi].rnr].name) && ((size_t)(const void *)((*atoms-> resinfo[noe_gr[gi].rnr].name) + 1) - (size_t)(const void *)(* atoms->resinfo[noe_gr[gi].rnr].name) == 1) ? (((const char *) (*atoms->resinfo[noe_gr[gi].rnr].name))[0] == '\0' ? ( char *) calloc ((size_t) 1, (size_t) 1) : ({ size_t __len = strlen (*atoms->resinfo[noe_gr[gi].rnr].name) + 1; char *__retval = (char *) malloc (__len); if (__retval != ((void*)0)) __retval = (char *) memcpy (__retval, *atoms->resinfo[noe_gr[gi].rnr ].name, __len); __retval; })) : __strdup (*atoms->resinfo[ noe_gr[gi].rnr].name))); |
416 | /* dump group definitions */ |
417 | if (debug) |
418 | { |
419 | fprintf(debug, "%d %d %d %d %s %s %d\n", i, gi, |
420 | noe_gr[gi].ianr, noe_gr[gi].anr, noe_gr[gi].aname, |
421 | noe_gr[gi].rname, noe_gr[gi].rnr); |
422 | } |
423 | } |
424 | } |
425 | for (i = 0; i < isize; i++) |
426 | { |
427 | sfree(nnm[i])save_free("nnm[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 427, (nnm[i])); |
428 | } |
429 | sfree(nnm)save_free("nnm", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 429, (nnm)); |
430 | |
431 | return groupnr; |
432 | } |
433 | |
434 | /* #define NSCALE 3 */ |
435 | /* static char *noe_scale[NSCALE+1] = { */ |
436 | /* "strong", "medium", "weak", "none" */ |
437 | /* }; */ |
438 | #define NSCALE6 6 |
439 | |
440 | static char *noe2scale(real r3, real r6, real rmax) |
441 | { |
442 | int i, s3, s6; |
443 | static char buf[NSCALE6+1]; |
444 | |
445 | /* r goes from 0 to rmax |
446 | NSCALE*r/rmax goes from 0 to NSCALE |
447 | NSCALE - NSCALE*r/rmax goes from NSCALE to 0 */ |
448 | s3 = NSCALE6 - min(NSCALE, (int)(NSCALE*r3/rmax))(((6) < ((int)(6*r3/rmax))) ? (6) : ((int)(6*r3/rmax)) ); |
449 | s6 = NSCALE6 - min(NSCALE, (int)(NSCALE*r6/rmax))(((6) < ((int)(6*r6/rmax))) ? (6) : ((int)(6*r6/rmax)) ); |
450 | |
451 | for (i = 0; i < s3; i++) |
452 | { |
453 | buf[i] = '='; |
454 | } |
455 | for (; i < s6; i++) |
456 | { |
457 | buf[i] = '-'; |
458 | } |
459 | buf[i] = '\0'; |
460 | |
461 | return buf; |
462 | } |
463 | |
464 | static void calc_noe(int isize, atom_id *noe_index, |
465 | real **dtot1_3, real **dtot1_6, int gnr, t_noe **noe) |
466 | { |
467 | int i, j, gi, gj; |
468 | |
469 | /* make half matrix of noe-group distances from atom distances */ |
470 | for (i = 0; i < isize; i++) |
471 | { |
472 | gi = noe_index[i]; |
473 | for (j = i; j < isize; j++) |
474 | { |
475 | gj = noe_index[j]; |
476 | noe[gi][gj].nr++; |
477 | noe[gi][gj].i_3 += pow(dtot1_3[i][j], -3); |
478 | noe[gi][gj].i_6 += pow(dtot1_6[i][j], -6); |
479 | } |
480 | } |
481 | |
482 | /* make averages */ |
483 | for (i = 0; i < gnr; i++) |
484 | { |
485 | for (j = i+1; j < gnr; j++) |
486 | { |
487 | noe[i][j].r_3 = pow(noe[i][j].i_3/noe[i][j].nr, -1.0/3.0); |
488 | noe[i][j].r_6 = pow(noe[i][j].i_6/noe[i][j].nr, -1.0/6.0); |
489 | noe[j][i] = noe[i][j]; |
490 | } |
491 | } |
492 | } |
493 | |
494 | static void write_noe(FILE *fp, int gnr, t_noe **noe, t_noe_gr *noe_gr, real rmax) |
495 | { |
496 | int i, j; |
497 | real r3, r6, min3, min6; |
498 | char buf[10], b3[10], b6[10]; |
499 | t_noe_gr gri, grj; |
500 | |
501 | min3 = min6 = 1e6; |
502 | fprintf(fp, |
503 | ";%4s %3s %4s %4s%3s %4s %4s %4s %4s%3s %5s %5s %8s %2s %2s %s\n", |
504 | "ianr", "anr", "anm", "rnm", "rnr", "ianr", "anr", "anm", "rnm", "rnr", |
505 | "1/r^3", "1/r^6", "intnsty", "Dr", "Da", "scale"); |
506 | for (i = 0; i < gnr; i++) |
507 | { |
508 | gri = noe_gr[i]; |
509 | for (j = i+1; j < gnr; j++) |
510 | { |
511 | grj = noe_gr[j]; |
512 | r3 = noe[i][j].r_3; |
513 | r6 = noe[i][j].r_6; |
514 | min3 = min(r3, min3)(((r3) < (min3)) ? (r3) : (min3) ); |
515 | min6 = min(r6, min6)(((r6) < (min6)) ? (r6) : (min6) ); |
516 | if (r3 < rmax || r6 < rmax) |
517 | { |
518 | if (grj.rnr == gri.rnr) |
519 | { |
520 | sprintf(buf, "%2d", grj.anr-gri.anr); |
521 | } |
522 | else |
523 | { |
524 | buf[0] = '\0'; |
525 | } |
526 | if (r3 < rmax) |
527 | { |
528 | sprintf(b3, "%-5.3f", r3); |
529 | } |
530 | else |
531 | { |
532 | strcpy(b3, "-"); |
533 | } |
534 | if (r6 < rmax) |
535 | { |
536 | sprintf(b6, "%-5.3f", r6); |
537 | } |
538 | else |
539 | { |
540 | strcpy(b6, "-"); |
541 | } |
542 | fprintf(fp, |
543 | "%4d %4d %4s %4s%3d %4d %4d %4s %4s%3d %5s %5s %8d %2d %2s %s\n", |
544 | gri.ianr+1, gri.anr+1, gri.aname, gri.rname, gri.rnr+1, |
545 | grj.ianr+1, grj.anr+1, grj.aname, grj.rname, grj.rnr+1, |
546 | b3, b6, (int)(noe[i][j].i_6+0.5), grj.rnr-gri.rnr, buf, |
547 | noe2scale(r3, r6, rmax)); |
548 | } |
549 | } |
550 | } |
551 | #define MINI ((i == 3) ? min3 : min6) |
552 | for (i = 3; i <= 6; i += 3) |
553 | { |
554 | if (MINI > rmax) |
555 | { |
556 | fprintf(stdoutstdout, "NOTE: no 1/r^%d averaged distances found below %g, " |
557 | "smallest was %g\n", i, rmax, MINI ); |
558 | } |
559 | else |
560 | { |
561 | fprintf(stdoutstdout, "Smallest 1/r^%d averaged distance was %g\n", i, MINI ); |
562 | } |
563 | } |
564 | #undef MINI |
565 | } |
566 | |
567 | static void calc_rms(int nind, int nframes, |
568 | real **dtot, real **dtot2, |
569 | real **rmsmat, real *rmsmax, |
570 | real **rmscmat, real *rmscmax, |
571 | real **meanmat, real *meanmax) |
572 | { |
573 | int i, j; |
574 | real mean, mean2, rms, rmsc; |
575 | /* N.B. dtot and dtot2 contain the total distance and the total squared |
576 | * distance respectively, BUT they return RMS and the scaled RMS resp. |
577 | */ |
578 | |
579 | *rmsmax = -1000; |
580 | *rmscmax = -1000; |
581 | *meanmax = -1000; |
582 | |
583 | for (i = 0; (i < nind-1); i++) |
584 | { |
585 | for (j = i+1; (j < nind); j++) |
586 | { |
587 | mean = dtot[i][j]/nframes; |
588 | mean2 = dtot2[i][j]/nframes; |
589 | rms = sqrt(max(0, mean2-mean*mean)(((0) > (mean2-mean*mean)) ? (0) : (mean2-mean*mean) )); |
590 | rmsc = rms/mean; |
591 | if (mean > *meanmax) |
592 | { |
593 | *meanmax = mean; |
594 | } |
595 | if (rms > *rmsmax) |
596 | { |
597 | *rmsmax = rms; |
598 | } |
599 | if (rmsc > *rmscmax) |
600 | { |
601 | *rmscmax = rmsc; |
602 | } |
603 | meanmat[i][j] = meanmat[j][i] = mean; |
604 | rmsmat[i][j] = rmsmat[j][i] = rms; |
605 | rmscmat[i][j] = rmscmat[j][i] = rmsc; |
606 | } |
607 | } |
608 | } |
609 | |
610 | real rms_diff(int natom, real **d, real **d_r) |
611 | { |
612 | int i, j; |
613 | real r, r2; |
614 | |
615 | r2 = 0.0; |
616 | for (i = 0; (i < natom-1); i++) |
617 | { |
618 | for (j = i+1; (j < natom); j++) |
619 | { |
620 | r = d[i][j]-d_r[i][j]; |
621 | r2 += r*r; |
622 | } |
623 | } |
624 | r2 /= (natom*(natom-1))/2; |
625 | |
626 | return sqrt(r2); |
627 | } |
628 | |
629 | int gmx_rmsdist(int argc, char *argv[]) |
630 | { |
631 | const char *desc[] = { |
632 | "[THISMODULE] computes the root mean square deviation of atom distances,", |
633 | "which has the advantage that no fit is needed like in standard RMS", |
634 | "deviation as computed by [gmx-rms].", |
635 | "The reference structure is taken from the structure file.", |
636 | "The RMSD at time t is calculated as the RMS", |
637 | "of the differences in distance between atom-pairs in the reference", |
638 | "structure and the structure at time t.[PAR]", |
639 | "[THISMODULE] can also produce matrices of the rms distances, rms distances", |
640 | "scaled with the mean distance and the mean distances and matrices with", |
641 | "NMR averaged distances (1/r^3 and 1/r^6 averaging). Finally, lists", |
642 | "of atom pairs with 1/r^3 and 1/r^6 averaged distance below the", |
643 | "maximum distance ([TT]-max[tt], which will default to 0.6 in this case)", |
644 | "can be generated, by default averaging over equivalent hydrogens", |
645 | "(all triplets of hydrogens named *[123]). Additionally a list of", |
646 | "equivalent atoms can be supplied ([TT]-equiv[tt]), each line containing", |
647 | "a set of equivalent atoms specified as residue number and name and", |
648 | "atom name; e.g.:[PAR]", |
649 | "[TT]3 SER HB1 3 SER HB2[tt][PAR]", |
650 | "Residue and atom names must exactly match those in the structure", |
651 | "file, including case. Specifying non-sequential atoms is undefined." |
652 | |
653 | }; |
654 | |
655 | int natom, i, j, teller, gi, gj; |
656 | real t; |
657 | |
658 | t_topology top; |
659 | int ePBC; |
660 | t_atoms *atoms; |
661 | matrix box; |
662 | rvec *x; |
663 | FILE *fp; |
664 | |
665 | t_trxstatus *status; |
666 | int isize, gnr = 0; |
667 | atom_id *index, *noe_index; |
668 | char *grpname; |
669 | real **d_r, **d, **dtot, **dtot2, **mean, **rms, **rmsc, *resnr; |
670 | real **dtot1_3 = NULL((void*)0), **dtot1_6 = NULL((void*)0); |
671 | real rmsnow, meanmax, rmsmax, rmscmax; |
672 | real max1_3, max1_6; |
673 | t_noe_gr *noe_gr = NULL((void*)0); |
674 | t_noe **noe = NULL((void*)0); |
675 | t_rgb rlo, rhi; |
676 | char buf[255]; |
677 | gmx_bool bRMS, bScale, bMean, bNOE, bNMR3, bNMR6, bNMR; |
678 | |
679 | static int nlevels = 40; |
680 | static real scalemax = -1.0; |
681 | static gmx_bool bSumH = TRUE1; |
682 | static gmx_bool bPBC = TRUE1; |
683 | output_env_t oenv; |
684 | |
685 | t_pargs pa[] = { |
686 | { "-nlevels", FALSE0, etINT, {&nlevels}, |
687 | "Discretize RMS in this number of levels" }, |
688 | { "-max", FALSE0, etREAL, {&scalemax}, |
689 | "Maximum level in matrices" }, |
690 | { "-sumh", FALSE0, etBOOL, {&bSumH}, |
691 | "Average distance over equivalent hydrogens" }, |
692 | { "-pbc", FALSE0, etBOOL, {&bPBC}, |
693 | "Use periodic boundary conditions when computing distances" } |
694 | }; |
695 | t_filenm fnm[] = { |
696 | { efTRX, "-f", NULL((void*)0), ffREAD1<<1 }, |
697 | { efTPS, NULL((void*)0), NULL((void*)0), ffREAD1<<1 }, |
698 | { efNDX, NULL((void*)0), NULL((void*)0), ffOPTRD(1<<1 | 1<<3) }, |
699 | { efDAT, "-equiv", "equiv", ffOPTRD(1<<1 | 1<<3) }, |
700 | { efXVG, NULL((void*)0), "distrmsd", ffWRITE1<<2 }, |
701 | { efXPM, "-rms", "rmsdist", ffOPTWR(1<<2| 1<<3) }, |
702 | { efXPM, "-scl", "rmsscale", ffOPTWR(1<<2| 1<<3) }, |
703 | { efXPM, "-mean", "rmsmean", ffOPTWR(1<<2| 1<<3) }, |
704 | { efXPM, "-nmr3", "nmr3", ffOPTWR(1<<2| 1<<3) }, |
705 | { efXPM, "-nmr6", "nmr6", ffOPTWR(1<<2| 1<<3) }, |
706 | { efDAT, "-noe", "noe", ffOPTWR(1<<2| 1<<3) }, |
707 | }; |
708 | #define NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))) asize(fnm)((int)(sizeof(fnm)/sizeof((fnm)[0]))) |
709 | |
710 | if (!parse_common_args(&argc, argv, PCA_CAN_VIEW(1<<5) | PCA_CAN_TIME((1<<6) | (1<<7) | (1<<14)) | PCA_BE_NICE(1<<13), |
711 | 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)) |
712 | { |
713 | return 0; |
714 | } |
715 | |
716 | bRMS = opt2bSet("-rms", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
717 | bScale = opt2bSet("-scl", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
718 | bMean = opt2bSet("-mean", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
719 | bNOE = opt2bSet("-noe", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
720 | bNMR3 = opt2bSet("-nmr3", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
721 | bNMR6 = opt2bSet("-nmr6", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm); |
722 | bNMR = bNMR3 || bNMR6 || bNOE; |
723 | |
724 | max1_3 = 0; |
725 | max1_6 = 0; |
726 | |
727 | /* check input */ |
728 | if (bNOE && scalemax < 0) |
729 | { |
730 | scalemax = 0.6; |
731 | fprintf(stderrstderr, "WARNING: using -noe without -max " |
732 | "makes no sense, setting -max to %g\n\n", scalemax); |
733 | } |
734 | |
735 | /* get topology and index */ |
736 | read_tps_conf(ftp2fn(efTPS, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), buf, &top, &ePBC, &x, NULL((void*)0), box, FALSE0); |
737 | |
738 | if (!bPBC) |
739 | { |
740 | ePBC = epbcNONE; |
741 | } |
742 | atoms = &(top.atoms); |
743 | |
744 | get_index(atoms, ftp2fn_null(efNDX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), 1, &isize, &index, &grpname); |
745 | |
746 | /* initialize arrays */ |
747 | snew(d, isize)(d) = save_calloc("d", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 747, (isize), sizeof(*(d))); |
748 | snew(dtot, isize)(dtot) = save_calloc("dtot", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 748, (isize), sizeof(*(dtot))); |
749 | snew(dtot2, isize)(dtot2) = save_calloc("dtot2", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 749, (isize), sizeof(*(dtot2))); |
750 | if (bNMR) |
751 | { |
752 | snew(dtot1_3, isize)(dtot1_3) = save_calloc("dtot1_3", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 752, (isize), sizeof(*(dtot1_3))); |
753 | snew(dtot1_6, isize)(dtot1_6) = save_calloc("dtot1_6", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 753, (isize), sizeof(*(dtot1_6))); |
754 | } |
755 | snew(mean, isize)(mean) = save_calloc("mean", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 755, (isize), sizeof(*(mean))); |
756 | snew(rms, isize)(rms) = save_calloc("rms", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 756, (isize), sizeof(*(rms))); |
757 | snew(rmsc, isize)(rmsc) = save_calloc("rmsc", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 757, (isize), sizeof(*(rmsc))); |
758 | snew(d_r, isize)(d_r) = save_calloc("d_r", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 758, (isize), sizeof(*(d_r))); |
759 | snew(resnr, isize)(resnr) = save_calloc("resnr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 759, (isize), sizeof(*(resnr))); |
760 | for (i = 0; (i < isize); i++) |
761 | { |
762 | snew(d[i], isize)(d[i]) = save_calloc("d[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 762, (isize), sizeof(*(d[i]))); |
763 | snew(dtot[i], isize)(dtot[i]) = save_calloc("dtot[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 763, (isize), sizeof(*(dtot[i]))); |
764 | snew(dtot2[i], isize)(dtot2[i]) = save_calloc("dtot2[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 764, (isize), sizeof(*(dtot2[i]))); |
765 | if (bNMR) |
766 | { |
767 | snew(dtot1_3[i], isize)(dtot1_3[i]) = save_calloc("dtot1_3[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 767, (isize), sizeof(*(dtot1_3[i]))); |
768 | snew(dtot1_6[i], isize)(dtot1_6[i]) = save_calloc("dtot1_6[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 768, (isize), sizeof(*(dtot1_6[i]))); |
769 | } |
770 | snew(mean[i], isize)(mean[i]) = save_calloc("mean[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 770, (isize), sizeof(*(mean[i]))); |
771 | snew(rms[i], isize)(rms[i]) = save_calloc("rms[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 771, (isize), sizeof(*(rms[i]))); |
772 | snew(rmsc[i], isize)(rmsc[i]) = save_calloc("rmsc[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 772, (isize), sizeof(*(rmsc[i]))); |
773 | snew(d_r[i], isize)(d_r[i]) = save_calloc("d_r[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 773, (isize), sizeof(*(d_r[i]))); |
774 | resnr[i] = i+1; |
775 | } |
776 | |
777 | /*set box type*/ |
778 | calc_dist(isize, index, x, ePBC, box, d_r); |
779 | sfree(x)save_free("x", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 779, (x)); |
780 | |
781 | /*open output files*/ |
782 | fp = xvgropen(ftp2fn(efXVG, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), "RMS Deviation", "Time (ps)", "RMSD (nm)", |
783 | oenv); |
784 | if (output_env_get_print_xvgr_codes(oenv)) |
785 | { |
786 | fprintf(fp, "@ subtitle \"of distances between %s atoms\"\n", grpname); |
787 | } |
788 | |
789 | /*do a first step*/ |
790 | natom = read_first_x(oenv, &status, ftp2fn(efTRX, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), &t, &x, box); |
Value stored to 'natom' is never read | |
791 | |
792 | do |
793 | { |
794 | calc_dist_tot(isize, index, x, ePBC, box, d, dtot, dtot2, bNMR, dtot1_3, dtot1_6); |
795 | |
796 | rmsnow = rms_diff(isize, d, d_r); |
797 | fprintf(fp, "%g %g\n", t, rmsnow); |
798 | } |
799 | while (read_next_x(oenv, status, &t, x, box)); |
800 | fprintf(stderrstderr, "\n"); |
801 | |
802 | gmx_ffclose(fp); |
803 | |
804 | teller = nframes_read(status); |
805 | |
806 | close_trj(status); |
807 | |
808 | calc_rms(isize, teller, dtot, dtot2, mean, &meanmax, rms, &rmsmax, rmsc, &rmscmax); |
809 | fprintf(stderrstderr, "rmsmax = %g, rmscmax = %g\n", rmsmax, rmscmax); |
810 | |
811 | if (bNMR) |
812 | { |
813 | calc_nmr(isize, teller, dtot1_3, dtot1_6, &max1_3, &max1_6); |
814 | } |
815 | |
816 | if (scalemax > -1.0) |
817 | { |
818 | rmsmax = scalemax; |
819 | rmscmax = scalemax; |
820 | meanmax = scalemax; |
821 | max1_3 = scalemax; |
822 | max1_6 = scalemax; |
823 | } |
824 | |
825 | if (bNOE) |
826 | { |
827 | /* make list of noe atom groups */ |
828 | snew(noe_index, isize+1)(noe_index) = save_calloc("noe_index", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 828, (isize+1), sizeof(*(noe_index))); |
829 | snew(noe_gr, isize)(noe_gr) = save_calloc("noe_gr", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 829, (isize), sizeof(*(noe_gr))); |
830 | gnr = analyze_noe_equivalent(opt2fn_null("-equiv", NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), |
831 | atoms, isize, index, bSumH, noe_index, noe_gr); |
832 | fprintf(stdoutstdout, "Found %d non-equivalent atom-groups in %d atoms\n", |
833 | gnr, isize); |
834 | /* make half matrix of of noe-group distances from atom distances */ |
835 | snew(noe, gnr)(noe) = save_calloc("noe", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 835, (gnr), sizeof(*(noe))); |
836 | for (i = 0; i < gnr; i++) |
837 | { |
838 | snew(noe[i], gnr)(noe[i]) = save_calloc("noe[i]", "/home/alexxy/Develop/gromacs/src/gromacs/gmxana/gmx_rmsdist.c" , 838, (gnr), sizeof(*(noe[i]))); |
839 | } |
840 | calc_noe(isize, noe_index, dtot1_3, dtot1_6, gnr, noe); |
841 | } |
842 | |
843 | rlo.r = 1.0, rlo.g = 1.0, rlo.b = 1.0; |
844 | rhi.r = 0.0, rhi.g = 0.0, rhi.b = 0.0; |
845 | |
846 | if (bRMS) |
847 | { |
848 | write_xpm(opt2FILE("-rms", NFILE, fnm, "w")gmx_ffopen(opt2fn("-rms", ((int)(sizeof(fnm)/sizeof((fnm)[0]) )), fnm), "w"), 0, |
849 | "RMS of distance", "RMS (nm)", "Atom Index", "Atom Index", |
850 | isize, isize, resnr, resnr, rms, 0.0, rmsmax, rlo, rhi, &nlevels); |
851 | } |
852 | |
853 | if (bScale) |
854 | { |
855 | write_xpm(opt2FILE("-scl", NFILE, fnm, "w")gmx_ffopen(opt2fn("-scl", ((int)(sizeof(fnm)/sizeof((fnm)[0]) )), fnm), "w"), 0, |
856 | "Relative RMS", "RMS", "Atom Index", "Atom Index", |
857 | isize, isize, resnr, resnr, rmsc, 0.0, rmscmax, rlo, rhi, &nlevels); |
858 | } |
859 | |
860 | if (bMean) |
861 | { |
862 | write_xpm(opt2FILE("-mean", NFILE, fnm, "w")gmx_ffopen(opt2fn("-mean", ((int)(sizeof(fnm)/sizeof((fnm)[0] ))), fnm), "w"), 0, |
863 | "Mean Distance", "Distance (nm)", "Atom Index", "Atom Index", |
864 | isize, isize, resnr, resnr, mean, 0.0, meanmax, rlo, rhi, &nlevels); |
865 | } |
866 | |
867 | if (bNMR3) |
868 | { |
869 | write_xpm(opt2FILE("-nmr3", NFILE, fnm, "w")gmx_ffopen(opt2fn("-nmr3", ((int)(sizeof(fnm)/sizeof((fnm)[0] ))), fnm), "w"), 0, "1/r^3 averaged distances", |
870 | "Distance (nm)", "Atom Index", "Atom Index", |
871 | isize, isize, resnr, resnr, dtot1_3, 0.0, max1_3, rlo, rhi, &nlevels); |
872 | } |
873 | if (bNMR6) |
874 | { |
875 | write_xpm(opt2FILE("-nmr6", NFILE, fnm, "w")gmx_ffopen(opt2fn("-nmr6", ((int)(sizeof(fnm)/sizeof((fnm)[0] ))), fnm), "w"), 0, "1/r^6 averaged distances", |
876 | "Distance (nm)", "Atom Index", "Atom Index", |
877 | isize, isize, resnr, resnr, dtot1_6, 0.0, max1_6, rlo, rhi, &nlevels); |
878 | } |
879 | |
880 | if (bNOE) |
881 | { |
882 | write_noe(opt2FILE("-noe", NFILE, fnm, "w")gmx_ffopen(opt2fn("-noe", ((int)(sizeof(fnm)/sizeof((fnm)[0]) )), fnm), "w"), gnr, noe, noe_gr, scalemax); |
883 | } |
884 | |
885 | do_view(oenv, ftp2fn(efXVG, NFILE((int)(sizeof(fnm)/sizeof((fnm)[0]))), fnm), NULL((void*)0)); |
886 | |
887 | return 0; |
888 | } |