VinaLC: Parallel Molecular Docking Program

Biochemical and Biophysical Systems Group
VinaLC version: 1.1.2

atom_constants.h
Go to the documentation of this file.
1 /*
2 
3  Copyright (c) 2006-2010, The Scripps Research Institute
4 
5  Licensed under the Apache License, Version 2.0 (the "License");
6  you may not use this file except in compliance with the License.
7  You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11  Unless required by applicable law or agreed to in writing, software
12  distributed under the License is distributed on an "AS IS" BASIS,
13  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  See the License for the specific language governing permissions and
15  limitations under the License.
16 
17  Author: Dr. Oleg Trott <ot14@columbia.edu>,
18  The Olson Lab,
19  The Scripps Research Institute
20 
21 */
22 
23 #ifndef VINA_ATOM_CONSTANTS_H
24 #define VINA_ATOM_CONSTANTS_H
25 
26 #include "common.h"
27 
28 // based on SY_TYPE_* but includes H
29 const sz EL_TYPE_H = 0;
30 const sz EL_TYPE_C = 1;
31 const sz EL_TYPE_N = 2;
32 const sz EL_TYPE_O = 3;
33 const sz EL_TYPE_S = 4;
34 const sz EL_TYPE_P = 5;
35 const sz EL_TYPE_F = 6;
36 const sz EL_TYPE_Cl = 7;
37 const sz EL_TYPE_Br = 8;
38 const sz EL_TYPE_I = 9;
39 const sz EL_TYPE_Met = 10;
40 const sz EL_TYPE_SIZE = 11;
41 
42 // AutoDock4
43 const sz AD_TYPE_C = 0;
44 const sz AD_TYPE_A = 1;
45 const sz AD_TYPE_N = 2;
46 const sz AD_TYPE_O = 3;
47 const sz AD_TYPE_P = 4;
48 const sz AD_TYPE_S = 5;
49 const sz AD_TYPE_H = 6; // non-polar hydrogen
50 const sz AD_TYPE_F = 7;
51 const sz AD_TYPE_I = 8;
52 const sz AD_TYPE_NA = 9;
53 const sz AD_TYPE_OA = 10;
54 const sz AD_TYPE_SA = 11;
55 const sz AD_TYPE_HD = 12;
56 const sz AD_TYPE_Mg = 13;
57 const sz AD_TYPE_Mn = 14;
58 const sz AD_TYPE_Zn = 15;
59 const sz AD_TYPE_Ca = 16;
60 const sz AD_TYPE_Fe = 17;
61 const sz AD_TYPE_Cl = 18;
62 const sz AD_TYPE_Br = 19;
63 const sz AD_TYPE_SIZE = 20;
64 
65 // X-Score
66 const sz XS_TYPE_C_H = 0;
67 const sz XS_TYPE_C_P = 1;
68 const sz XS_TYPE_N_P = 2;
69 const sz XS_TYPE_N_D = 3;
70 const sz XS_TYPE_N_A = 4;
71 const sz XS_TYPE_N_DA = 5;
72 const sz XS_TYPE_O_P = 6;
73 const sz XS_TYPE_O_D = 7;
74 const sz XS_TYPE_O_A = 8;
75 const sz XS_TYPE_O_DA = 9;
76 const sz XS_TYPE_S_P = 10;
77 const sz XS_TYPE_P_P = 11;
78 const sz XS_TYPE_F_H = 12;
79 const sz XS_TYPE_Cl_H = 13;
80 const sz XS_TYPE_Br_H = 14;
81 const sz XS_TYPE_I_H = 15;
82 const sz XS_TYPE_Met_D = 16;
83 const sz XS_TYPE_SIZE = 17;
84 
85 // DrugScore-CSD
86 const sz SY_TYPE_C_3 = 0;
87 const sz SY_TYPE_C_2 = 1;
88 const sz SY_TYPE_C_ar = 2;
89 const sz SY_TYPE_C_cat = 3;
90 const sz SY_TYPE_N_3 = 4;
91 const sz SY_TYPE_N_ar = 5;
92 const sz SY_TYPE_N_am = 6;
93 const sz SY_TYPE_N_pl3 = 7;
94 const sz SY_TYPE_O_3 = 8;
95 const sz SY_TYPE_O_2 = 9;
96 const sz SY_TYPE_O_co2 = 10;
97 const sz SY_TYPE_S = 11;
98 const sz SY_TYPE_P = 12;
99 const sz SY_TYPE_F = 13;
100 const sz SY_TYPE_Cl = 14;
101 const sz SY_TYPE_Br = 15;
102 const sz SY_TYPE_I = 16;
103 const sz SY_TYPE_Met = 17;
104 const sz SY_TYPE_SIZE = 18;
105 
106 struct atom_kind {
107  std::string name;
112  fl covalent_radius; // from http://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page)
113 };
114 
115 // generated from edited AD4_parameters.data using a script,
116 // then covalent radius added from en.wikipedia.org/wiki/Atomic_radii_of_the_elements_(data_page)
117 const atom_kind atom_kind_data[] = { // name, radius, depth, solvation parameter, volume, covalent radius
118  { "C", 2.00000, 0.15000, -0.00143, 33.51030, 0.77}, // 0
119  { "A", 2.00000, 0.15000, -0.00052, 33.51030, 0.77}, // 1
120  { "N", 1.75000, 0.16000, -0.00162, 22.44930, 0.75}, // 2
121  { "O", 1.60000, 0.20000, -0.00251, 17.15730, 0.73}, // 3
122  { "P", 2.10000, 0.20000, -0.00110, 38.79240, 1.06}, // 4
123  { "S", 2.00000, 0.20000, -0.00214, 33.51030, 1.02}, // 5
124  { "H", 1.00000, 0.02000, 0.00051, 0.00000, 0.37}, // 6
125  { "F", 1.54500, 0.08000, -0.00110, 15.44800, 0.71}, // 7
126  { "I", 2.36000, 0.55000, -0.00110, 55.05850, 1.33}, // 8
127  {"NA", 1.75000, 0.16000, -0.00162, 22.44930, 0.75}, // 9
128  {"OA", 1.60000, 0.20000, -0.00251, 17.15730, 0.73}, // 10
129  {"SA", 2.00000, 0.20000, -0.00214, 33.51030, 1.02}, // 11
130  {"HD", 1.00000, 0.02000, 0.00051, 0.00000, 0.37}, // 12
131  {"Mg", 0.65000, 0.87500, -0.00110, 1.56000, 1.30}, // 13
132  {"Mn", 0.65000, 0.87500, -0.00110, 2.14000, 1.39}, // 14
133  {"Zn", 0.74000, 0.55000, -0.00110, 1.70000, 1.31}, // 15
134  {"Ca", 0.99000, 0.55000, -0.00110, 2.77000, 1.74}, // 16
135  {"Fe", 0.65000, 0.01000, -0.00110, 1.84000, 1.25}, // 17
136  {"Cl", 2.04500, 0.27600, -0.00110, 35.82350, 0.99}, // 18
137  {"Br", 2.16500, 0.38900, -0.00110, 42.56610, 1.14} // 19
138 };
139 
140 const fl metal_solvation_parameter = -0.00110;
141 
142 const fl metal_covalent_radius = 1.75; // for metals not on the list // FIXME this info should be moved to non_ad_metals
143 
144 const sz atom_kinds_size = sizeof(atom_kind_data) / sizeof(const atom_kind);
145 
147  std::string name;
148  std::string to;
149 };
150 
152  {"Se", "S"}
153 };
154 
156 
161 };
162 
163 const acceptor_kind acceptor_kind_data[] = { // ad_type, optimal length, depth
164  {AD_TYPE_NA, 1.9, 5.0},
165  {AD_TYPE_OA, 1.9, 5.0},
166  {AD_TYPE_SA, 2.5, 1.0}
167 };
168 
170 
171 inline bool ad_is_hydrogen(sz ad) {
172  return ad == AD_TYPE_H || ad == AD_TYPE_HD;
173 }
174 
175 inline bool ad_is_heteroatom(sz ad) { // returns false for ad >= AD_TYPE_SIZE
176  return ad != AD_TYPE_A && ad != AD_TYPE_C &&
177  ad != AD_TYPE_H && ad != AD_TYPE_HD &&
178  ad < AD_TYPE_SIZE;
179 }
180 
182  switch(t) {
183  case AD_TYPE_C : return EL_TYPE_C;
184  case AD_TYPE_A : return EL_TYPE_C;
185  case AD_TYPE_N : return EL_TYPE_N;
186  case AD_TYPE_O : return EL_TYPE_O;
187  case AD_TYPE_P : return EL_TYPE_P;
188  case AD_TYPE_S : return EL_TYPE_S;
189  case AD_TYPE_H : return EL_TYPE_H;
190  case AD_TYPE_F : return EL_TYPE_F;
191  case AD_TYPE_I : return EL_TYPE_I;
192  case AD_TYPE_NA : return EL_TYPE_N;
193  case AD_TYPE_OA : return EL_TYPE_O;
194  case AD_TYPE_SA : return EL_TYPE_S;
195  case AD_TYPE_HD : return EL_TYPE_H;
196  case AD_TYPE_Mg : return EL_TYPE_Met;
197  case AD_TYPE_Mn : return EL_TYPE_Met;
198  case AD_TYPE_Zn : return EL_TYPE_Met;
199  case AD_TYPE_Ca : return EL_TYPE_Met;
200  case AD_TYPE_Fe : return EL_TYPE_Met;
201  case AD_TYPE_Cl : return EL_TYPE_Cl;
202  case AD_TYPE_Br : return EL_TYPE_Br;
203  case AD_TYPE_SIZE : return EL_TYPE_SIZE;
204  default: VINA_CHECK(false);
205  }
206  return EL_TYPE_SIZE; // to placate the compiler in case of warnings - it should never get here though
207 }
208 
209 const fl xs_vdw_radii[] = {
210  1.9, // C_H
211  1.9, // C_P
212  1.8, // N_P
213  1.8, // N_D
214  1.8, // N_A
215  1.8, // N_DA
216  1.7, // O_P
217  1.7, // O_D
218  1.7, // O_A
219  1.7, // O_DA
220  2.0, // S_P
221  2.1, // P_P
222  1.5, // F_H
223  1.8, // Cl_H
224  2.0, // Br_H
225  2.2, // I_H
226  1.2 // Met_D
227 };
228 
229 inline fl xs_radius(sz t) {
230  const sz n = sizeof(xs_vdw_radii) / sizeof(const fl);
231  assert(n == XS_TYPE_SIZE);
232  assert(t < n);
233  return xs_vdw_radii[t];
234 }
235 
236 const std::string non_ad_metal_names[] = { // expand as necessary
237  "Cu", "Fe", "Na", "K", "Hg", "Co", "U", "Cd", "Ni"
238 };
239 
240 inline bool is_non_ad_metal_name(const std::string& name) {
241  const sz s = sizeof(non_ad_metal_names) / sizeof(const std::string);
242  VINA_FOR(i, s)
243  if(non_ad_metal_names[i] == name)
244  return true;
245  return false;
246 }
247 
248 inline bool xs_is_hydrophobic(sz xs) {
249  return xs == XS_TYPE_C_H ||
250  xs == XS_TYPE_F_H ||
251  xs == XS_TYPE_Cl_H ||
252  xs == XS_TYPE_Br_H ||
253  xs == XS_TYPE_I_H;
254 }
255 
256 inline bool xs_is_acceptor(sz xs) {
257  return xs == XS_TYPE_N_A ||
258  xs == XS_TYPE_N_DA ||
259  xs == XS_TYPE_O_A ||
260  xs == XS_TYPE_O_DA;
261 }
262 
263 inline bool xs_is_donor(sz xs) {
264  return xs == XS_TYPE_N_D ||
265  xs == XS_TYPE_N_DA ||
266  xs == XS_TYPE_O_D ||
267  xs == XS_TYPE_O_DA ||
268  xs == XS_TYPE_Met_D;
269 }
270 
271 inline bool xs_donor_acceptor(sz t1, sz t2) {
272  return xs_is_donor(t1) && xs_is_acceptor(t2);
273 }
274 
275 inline bool xs_h_bond_possible(sz t1, sz t2) {
276  return xs_donor_acceptor(t1, t2) || xs_donor_acceptor(t2, t1);
277 }
278 
279 inline const atom_kind& ad_type_property(sz i) {
280  assert(AD_TYPE_SIZE == atom_kinds_size);
281  assert(i < atom_kinds_size);
282  return atom_kind_data[i];
283 }
284 
285 inline sz string_to_ad_type(const std::string& name) { // returns AD_TYPE_SIZE if not found (no exceptions thrown, because metals unknown to AD4 are not exceptional)
287  if(atom_kind_data[i].name == name)
288  return i;
289  VINA_FOR(i, atom_equivalences_size)
290  if(atom_equivalence_data[i].name == name)
291  return string_to_ad_type(atom_equivalence_data[i].to);
292  return AD_TYPE_SIZE;
293 }
294 
296  fl tmp = 0;
298  if(atom_kind_data[i].covalent_radius > tmp)
299  tmp = atom_kind_data[i].covalent_radius;
300  return tmp;
301 }
302 
303 #endif