ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/freemol/trunk/smi23d/src/mengine/xlogp.c
Revision: 3
Committed: Mon Jun 9 21:38:26 2008 UTC (11 years, 4 months ago) by tjod
File size: 16072 byte(s)
Log Message:
test

Line File contents
1 #define EXTERN extern
2
3 #include "pcwin.h"
4 #include "pcmod.h"
5
6 int get_hybrid(int);
7 void message_alert(char *,char *);
8 int check_ring1(int);
9
10 void xlogp(float *result)
11 {
12 int i,j,k,ia;
13 int iz,nh,nx,npi,nc,itype,dbond,nox,ndouble,nf;
14 int npi_c,npi_x;
15 int nhydrophobic, namino_acid, nhbond, n13FX, n13XX;
16 int atype[100];
17 long int pi_mask;
18 float total;
19 // char astring[60];
20 float datype[] = {
21 0.000, 0.484, 0.168,-0.181, 0.358, 0.009,-0.344,-0.439, 0.051,-0.138,
22 -0.417,-0.454,-0.378, 0.223,-0.598,-0.396,-0.699,-0.362, 0.395, 0.236,
23 -0.166, 1.726, 0.098,-0.108, 1.637, 1.774, 0.281, 0.142, 0.715, 0.302,
24 -0.064, 0.079, 0.200, 0.869, 0.316, 0.054, 0.347, 0.046,-0.399,-0.029,
25 -0.330, 0.397, 0.068, 0.327,-2.057, 0.218,-0.582,-0.449,-0.774, 0.040,
26 -0.381, 0.443,-0.117,-2.052,-1.716, 0.321,-0.921,-0.704, 0.119, 1.192,
27 0.434, 0.587, 0.668,-0.791,-0.212, 0.016, 0.752, 1.071, 0.964,-1.817,
28 -1.214,-0.778, 0.493, 1.010, 1.187, 1.489,-0.802,-0.256, 1.626, 0.077,
29 0.264, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000,
30 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000 };
31
32 pi_mask = (1L << PI_MASK);
33 for (i=0;i < 100; i++)
34 atype[i] = 0;
35 //
36 // loop through atoms and classify
37 for (i=1; i <= natom; i++)
38 {
39 if (atom[i].atomnum == 6) // carbon
40 {
41 iz = get_hybrid(i);
42 nh = nx = npi = nc = 0;
43 for (j=0; j < MAXIAT; j++)
44 {
45 if (atom[i].iat[j] != 0)
46 {
47 if (atom[atom[i].iat[j]].atomnum == 1) nh++;
48 if (atom[atom[i].iat[j]].flags & pi_mask) npi++;
49 itype = atom[atom[i].iat[j]].atomnum;
50 if (itype == 6) nc++;
51 if (itype == 7 || itype == 8 || itype == 15 || itype == 16) nx++;
52 itype = atom[atom[i].iat[j]].mmx_type;
53 if (itype == 11 || itype == 12 || itype == 13 || itype == 14) nx++;
54 }
55 }
56 if (iz == 1) // sp3
57 {
58 if (nh == 3 && nc == 1 && npi == 0)
59 atype[1]++;
60 else if (nh == 3 && nc == 1 && npi > 0)
61 atype[2]++;
62 else if (nh == 3 && nx == 1)
63 atype[3]++;
64 else if (nh == 2 && nc == 2 && npi == 0)
65 atype[4]++;
66 else if (nh == 2 && nc == 2 && npi > 0)
67 atype[5]++;
68 else if (nh == 2 && nc == 1 && nx == 1)
69 atype[6]++;
70 else if (nh == 2 && nx == 2)
71 atype[7]++;
72 else if (nh == 1 && nc == 3 && npi == 0)
73 atype[8]++;
74 else if (nh == 1 && nc == 3 && npi > 0)
75 atype[9]++;
76 else if (nh == 1 && nc == 2 && nx == 1)
77 atype[10]++;
78 else if (nh == 1 && nc == 1 && nx == 2)
79 atype[11]++;
80 else if (nh == 1 && nx == 3)
81 atype[11]++;
82 else if (nh == 0 && nc == 4 && npi == 0)
83 atype[12]++;
84 else if (nh == 0 && nc == 4 && npi > 0)
85 atype[13]++;
86 else if (nh == 0 && nc == 3 && nx == 1)
87 atype[14]++;
88 else if (nh == 0 && nc == 2 && nx == 2)
89 atype[15]++;
90 else if (nh == 0 && nc == 1 && nx == 3)
91 atype[16]++;
92 else if (nh == 0 && nc == 0 && nx == 4)
93 atype[17]++;
94 } else if (iz == 2) // sp2
95 {
96 dbond = 0;
97 // find double bond atom
98 for (j=0; j < 4; j++)
99 {
100 if (atom[i].iat[j] != 0 && atom[i].bo[j] == 2)
101 {
102 dbond = atom[i].iat[j];
103 break;
104 }
105 }
106 if (dbond == 0) goto L_10; // bad atoms
107 if (nh == 2 && nc == 1)
108 {
109 atype[18]++;
110 goto L_10;
111 }
112 // if not a pi atom
113 if (!(atom[i].flags & pi_mask)) // non pi atoms
114 {
115 if (atom[dbond].atomnum == 6) // c=c
116 {
117 if (nh == 1 & nc == 2)
118 {
119 atype[19]++;
120 goto L_10;
121 } else if (nh == 1 && nx == 1)
122 {
123 atype[20]++;
124 goto L_10;
125 } else if (nh == 0 && nc == 3)
126 {
127 atype[22]++;
128 goto L_10;
129 } else if (nh == 0 && nx >= 1)
130 {
131 atype[23]++;
132 goto L_10;
133 }
134 }else // c=x
135 {
136 if (nh == 1)
137 {
138 atype[21]++;
139 goto L_10;
140 } else if (nc >= 1)
141 {
142 atype[24]++;
143 goto L_10;
144 } else if (nx == 3)
145 {
146 atype[25]++;
147 goto L_10;
148 }
149 }
150 } else // pi conjugated systems
151 {
152 nh = nc = nx = npi = 0;
153 npi_c = 0;
154 npi_x = 0;
155 for (j = 0; j < 3; j++)
156 {
157 if (atom[atom[i].iat[j]].atomnum == 1)
158 nh++;
159 if (atom[atom[i].iat[j]].atomnum == 6)
160 {
161 nc++;
162 if (atom[atom[i].iat[j]].flags & pi_mask)
163 {
164 npi++;
165 npi_c++;
166 }
167 }
168 if (atom[atom[i].iat[j]].atomnum >= 6)
169 {
170 nx++;
171 if (atom[atom[i].iat[j]].flags & pi_mask)
172 {
173 npi++;
174 npi_x++;
175 }
176 }
177 }
178 if (nh == 1 && nc == 2)
179 atype[26]++;
180 else if (nh == 1 && nc ==1 && nx == 1)
181 atype[27]++;
182 else if (nh == 1 && nx == 2)
183 atype[28]++;
184 else if (nc == 3 && npi == 2)
185 atype[29]++;
186 else if (nc == 2 && npi_x == 2 && nx == 1)
187 atype[30]++;
188 else if (nc == 2 && npi_x == 1 && nx == 1 && npi_x == 1)
189 atype[31]++;
190 else if (nc == 1 && nx == 2 && npi_x == 1 && npi_c == 1)
191 atype[32]++;
192 else if (nc == 1 && nx == 2 && npi_x == 2)
193 atype[33]++;
194 else if (npi == 3)
195 atype[34]++;
196 }
197 } else if (iz == 3)
198 {
199 for (j=0; j < 4; j++)
200 {
201 if (atom[i].iat[j] != 0 && atom[i].bo[j] == 3)
202 {
203 if (atom[atom[i].iat[j]].atomnum == 7)
204 {
205 atype[77]++;
206 goto L_10;
207 }
208 }
209 }
210 if (nh == 1)
211 atype[35]++;
212 else if (nc == 1)
213 atype[36]++;
214 }
215 } else if (atom[i].atomnum == 1) // hydrogen
216 {
217 atype[37]++;
218 } else if (atom[i].atomnum == 8) // oxygen
219 {
220 nh = npi = nx = nc = 0;
221 for (j=0; j < 4; j++)
222 {
223 if (atom[atom[i].iat[j]].atomnum == 1)
224 nh++;
225 if (atom[atom[i].iat[j]].atomnum == 6)
226 {
227 nc++;
228 if (atom[atom[i].iat[j]].flags & pi_mask) npi++;
229 }
230 if (atom[atom[i].iat[j]].atomnum > 6)
231 {
232 nx++;
233 if (atom[atom[i].iat[j]].flags & pi_mask) npi++;
234 }
235 }
236 if (atom[i].mmx_type == 6)
237 {
238 if (nh == 1 && nc == 1 && npi == 0)
239 atype[38]++;
240 else if (nh == 1 && nc == 1 && npi == 1)
241 atype[39]++;
242 else if (nh == 1 && nx == 1)
243 atype[40]++;
244 else if (nc == 2 && npi < 2)
245 atype[41]++;
246 else if ( (nc == 1 && nx == 1) || nx == 2)
247 atype[42]++;
248 else if (nc == 2 && npi == 2)
249 atype[43]++;
250 } else if (atom[i].mmx_type == 7)
251 {
252 if (nc == 1)
253 atype[44]++;
254 else if (nx == 1)
255 atype[45]++;
256 }
257 } else if (atom[i].atomnum == 7) // nitrogen
258 {
259 nh = nx = nc = npi = 0;
260 for (j=0; j < MAXIAT; j++)
261 {
262 if (atom[i].iat[j] != 0)
263 {
264 if (atom[atom[i].iat[j]].atomnum == 1) nh++;
265 if (atom[atom[i].iat[j]].atomnum == 6) nc++;
266 if (atom[atom[i].iat[j]].atomnum > 6) nx++;
267 if (atom[atom[i].iat[j]].flags & pi_mask) npi++;
268 }
269 }
270 if (atom[i].mmx_type == 8)
271 {
272 if (nh == 2 && nc == 1 && npi == 0) atype[46]++;
273 else if (nh == 2 && nc == 1 && npi > 1) atype[47]++;
274 else if (nh == 2 && nx == 1) atype[48]++;
275 else if (nh == 1 && nc == 2) atype[49]++;
276 else if (nh == 1 && nc == 1 && nx == 1) atype[50]++;
277 else if (nh == 1 && nx == 2) atype[50]++;
278 else if (nh == 0 && nc == 3) atype[51]++;
279 else if (nh == 0 && nx >= 1) atype[52]++;
280 } else if (atom[i].mmx_type == 9)
281 {
282 for (j=0; j < 4; j++)
283 {
284 if (atom[i].iat[j] != 0 )
285 {
286 if (atom[i].bo[j] == 2) // imine type
287 {
288 if (atom[atom[i].iat[j]].atomnum == 6)
289 {
290 if (nx == 0)
291 atype[53]++;
292 else
293 atype[54]++;
294 goto L_10;
295 } else if (atom[atom[i].iat[j]].atomnum > 6)
296 {
297 if (nc == 1)
298 atype[55]++;
299 else
300 atype[56]++;
301 goto L_10;
302 }
303 }
304 }
305 }
306 for (j=0; j < 4; j++) // amides
307 {
308 if (atom[i].iat[j] != 0 && atom[atom[i].iat[j]].atomnum == 6)
309 {
310 ia = atom[i].iat[j];
311 for (k=0; k < 4; k++)
312 {
313 if (atom[ia].iat[k] != 0 && atom[ia].bo[k] == 2)
314 {
315 if (atom[atom[ia].iat[k]].atomnum == 8) // amide
316 {
317 if (nh == 2 && nc == 1) atype[63]++;
318 else if (nh == 1) atype[64]++;
319 else atype[65]++;
320 goto L_10;
321 }
322 }
323 }
324 }
325 }
326 // picked up amides and imines - everything else must be aromatic
327 if (nh == 1 && nc == 2) atype[58]++;
328 else if (nh == 1 && nx >= 1) atype[59]++;
329 else if (nc == 3) atype[61]++;
330 goto L_10;
331 }
332 } else if (atom[i].atomnum == 16) // sulfur
333 {
334 nh = 0;
335 nox = 0;
336 ndouble = 0;
337 for (j=0; j < MAXIAT; j++)
338 {
339 if (atom[i].iat[j] != 0)
340 {
341 if (atom[atom[i].iat[j]].atomnum == 1) nh++;
342 if (atom[atom[i].iat[j]].atomnum == 8) nox++;
343 if (atom[i].bo[j] == 2) ndouble++;
344 }
345 }
346 if (nox == 2)
347 {
348 atype[71]++;
349 goto L_10;
350 } else if (nox == 1)
351 {
352 atype[70]++;
353 goto L_10;
354 }
355 if (nox == 0 && ndouble == 1)
356 {
357 atype[69]++;
358 goto L_10;
359 }
360 if (nh == 1)
361 {
362 atype[66]++;
363 goto L_10;
364 } else
365 {
366 if (check_ring1(i))
367 {
368 if ((atom[atom[i].iat[0]].flags & pi_mask) && (atom[atom[i].iat[1]].flags & pi_mask))
369 {
370 atype[68]++;
371 goto L_10;
372 }
373 } else
374 {
375 atype[67]++;
376 goto L_10;
377 }
378 }
379 } else if (atom[i].atomnum == 15) // phosphorus
380 {
381 atype[76]++;
382 } else if (atom[i].atomnum == 11) // fluorine
383 {
384 atype[72]++;
385 } else if (atom[i].atomnum == 17) // chlorine
386 {
387 atype[73]++;
388 } else if (atom[i].atomnum == 35) // bromine
389 {
390 atype[74]++;
391 } else if (atom[i].atomnum == 53) // iodine
392 {
393 atype[75]++;
394 } else if (atom[i].mmx_type == 20)
395 {
396 atype[0]++;
397 } else
398 {
399 // sprintf(astring,"Atom %d type %d not supported\0",i,atom[i].type);
400 // message_alert(astring,"Error in LogP");
401 }
402 L_10:
403 continue;
404 }
405 // done assigning types = compute logP
406 total = 0.0;
407 for (i=0; i < 100; i++)
408 total += atype[i]*datype[i];
409
410 // now do correction factors
411 nhydrophobic = namino_acid = nhbond = n13FX = n13XX = 0;
412
413 nhydrophobic = atype[1] + atype[2] + atype[4] + atype[5] + atype[8] + atype[9] + atype[12] + atype[13] + atype[18] +
414 atype[19] + atype[22];
415
416 // 1,3 halogens
417 for (i=1; i <= natom; i++)
418 {
419 nf = 0;
420 nx = 0;
421 if (atom[i].atomnum == 6)
422 {
423 for (j=0; j < MAXIAT; j++)
424 {
425 if (atom[atom[i].iat[j]].atomnum == 9)
426 nf++;
427 if (atom[atom[i].iat[j]].atomnum == 17)
428 nx++;
429 if (atom[atom[i].iat[j]].atomnum == 35)
430 nx++;
431 if (atom[atom[i].iat[j]].atomnum == 53)
432 nx++;
433 }
434 if ((nf >= 1 && nx >= 1) || nf >= 2)
435 n13FX++;
436 if (nx >=2 && nf == 0)
437 n13XX++;
438 }
439 }
440 // amino acids
441 // hydrogen bonds
442
443
444 *result = total + nhydrophobic*0.19F + n13FX*0.08 + n13XX*(-0.26F);
445 }