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

Line User Rev File contents
1 tjod 3 #define EXTERN extern
2     #include "pcwin.h"
3     #include "pcmod.h"
4     #include "substr.h"
5     #include "field.h"
6     #include "atom_k.h"
7     #include "pot.h"
8     #include "energies.h"
9     #include "solv.h"
10     #include "fix.h"
11    
12     EXTERN int ncol[];
13    
14     struct t_residues {
15     int nchain, ichainstart[10];
16     int ngroup, iresnum[200], irestype[200], istartatom[200];
17     } residues;
18    
19     EXTERN struct t_minim_values {
20     int iprint, ndc, nconst;
21     float dielc;
22     } minim_values;
23     EXTERN struct t_units {
24     double bndunit, cbnd, qbnd;
25     double angunit, cang, qang, pang, sang, aaunit;
26     double stbnunit, ureyunit, torsunit, storunit, v14scale;
27     double aterm, bterm, cterm, dielec, chgscale;
28     } units;
29     EXTERN struct t_minim_control {
30     int type, method, field, added_const;
31     char added_path[256],added_name[256];
32     } minim_control;
33     EXTERN struct t_dmomv {
34     float xn,yn,zn,xp,yp,zp;
35     } dmomv;
36     EXTERN struct t_dipolemom {
37     double total, xdipole, ydipole, zdipole;
38     } dipolemom;
39     EXTERN struct t_vdw1 {
40     int nvdw;
41     float rad[MAXVDWCONST], eps[MAXVDWCONST];
42     int lpd[MAXVDWCONST], ihtyp[MAXVDWCONST], ihdon[MAXVDWCONST];
43     float alpha[MAXVDWCONST],n[MAXVDWCONST],a[MAXVDWCONST],g[MAXVDWCONST];
44     char da[MAXVDWCONST][2];
45     } vdw1;
46    
47     EXTERN struct {
48     int mm3, mmff, amber, opls;
49     } AtomTypes[];
50    
51     EXTERN struct ElementType { char symbol[3];
52     int atomnum;
53     float weight, covradius, vdwradius;
54     int s,p,d,f, type;
55     } Elements[];
56    
57     EXTERN struct t_centroid {
58     int ncentroid, numsel[10];
59     int isel[10][10];
60     double x[10], y[10], z[10];
61     } centroid;
62    
63     void InitialTransform(void);
64     int make_atom(int , float , float , float,char * );
65     void make_bond(int , int , int );
66     void generate_bonds(void);
67     void deleteatom(int);
68     void deletebond(int, int);
69     void set_atomtype(int,int,int,int,int,int);
70     void set_atomdata(int,int,int,int,int,int);
71     extern void matrotat(float (*)[4], int, float);
72     extern void matxform(float (*)[4], int);
73     void message_alert(char *, char *);
74     void charge_dipole(void);
75     int isangle(int,int);
76     int mm3_mmxtype(int);
77     int mmff_mmxtype(int);
78    
79     // ===============================================
80     void set_atomdata(int ia, int mmxtype, int mm3type, int mmfftype,int ambertype,int oplstype)
81     {
82     int type;
83    
84     if (mmxtype > 0)
85     atom[ia].mmx_type = mmxtype;
86     if (mm3type > 0)
87     atom[ia].mm3_type = mm3type;
88     if (mmfftype > 0)
89     atom[ia].mmff_type = mmfftype;
90     if (ambertype > 0)
91     atom[ia].amber_type = ambertype;
92     if (oplstype > 0)
93     atom[ia].opls_type = oplstype;
94    
95     if (field.type == MMX || field.type == MM2)
96     {
97     type = mmxtype;
98     } else if (field.type == MM3)
99     {
100     type = mm3type;
101     }else if (field.type == AMBER)
102     {
103     type = ambertype;
104     } else if (field.type == MMFF94)
105     {
106     type = mmfftype;
107     } else if (field.type == OPLSAA)
108     {
109     type = oplstype;
110     }
111    
112     if ( type < 300)
113     {
114     atom[ia].tclass = atom_k.tclass[type];
115     atom[ia].atomnum = atom_k.number[type];
116     atom[ia].atomwt = atom_k.weight[type];
117     strcpy(atom[ia].name, atom_k.symbol[type]);
118     }
119    
120     if ( field.type == MMX && mmxtype == LPTYPE)
121     atom[ia].color = 1;
122     else if ( type < 300 && mmxtype != LPTYPE )
123     atom[ia].color = ncol[atom[ia].atomnum-1];
124     else
125     atom[ia].color = 7;
126    
127     }
128     // ===============================================
129     void set_atomtype(int ia, int mmxtype, int mm3type, int mmfftype,int ambertype,int oplstype)
130     {
131     if (mmxtype > 0)
132     atom[ia].mmx_type = mmxtype;
133     if (mm3type > 0)
134     atom[ia].mm3_type = mm3type;
135     if (mmfftype > 0)
136     atom[ia].mmff_type = mmfftype;
137     if (ambertype > 0)
138     atom[ia].amber_type = ambertype;
139     if (oplstype > 0)
140     atom[ia].opls_type = oplstype;
141    
142     }
143     // ======================================================
144     int make_atom(int type, float x, float y, float z,char *name)
145     {
146     int i,iz;
147     int mmxtype, mm3type, mmfftype,ambertype,oplstype;
148    
149     natom++;
150     if (natom >= MAXATOM - 10)
151     {
152     natom--;
153     message_alert("Max atoms exceeded in makeatom","PCMODEL Error");
154     return -1;
155     }
156     iz = strlen(name);
157     if (iz > 0) // got an atom name use it
158     {
159     for (i=1; i <= atom_k.natomtype; i++)
160     {
161     if (strcmp(name,atom_k.symbol[i]) == 0) // names match
162     {
163     strcpy(atom[natom].name,name);
164     atom[natom].tclass = atom_k.tclass[i];
165     atom[natom].atomwt = atom_k.weight[i];
166     atom[natom].atomnum = atom_k.number[i];
167     atom[natom].type = atom_k.type[i];
168     if (type == 0)
169     {
170     type = atom[natom].type; // this is an mmff type
171     mmxtype = mmff_mmxtype(type);
172     mm3type = 0;
173     mmfftype = type;
174     ambertype = 0;
175     oplstype = 0;
176     set_atomtype(natom,mmxtype,mm3type,mmfftype,ambertype,oplstype);
177     if (mmfftype == 0) return -1;
178     } else if (field.type == MMX || field.type == MM2)
179     {
180     atom[natom].mmx_type = type;
181     mmxtype = type;
182     mm3type = AtomTypes[type-1].mm3;
183     mmfftype = AtomTypes[type-1].mmff;
184     ambertype = AtomTypes[type-1].amber;
185     oplstype = AtomTypes[type-1].opls;
186     set_atomtype(natom,mmxtype,mm3type,mmfftype,ambertype,oplstype);
187     } else if (field.type == MM3)
188     {
189     atom[natom].mm3_type = type;
190     mmxtype = mm3_mmxtype(type);
191     mm3type = type;
192     mmfftype = AtomTypes[mmxtype-1].mmff;
193     ambertype = AtomTypes[mmxtype-1].amber;
194     oplstype = AtomTypes[mmxtype-1].opls;
195     set_atomtype(natom,mmxtype,mm3type,mmfftype,ambertype,oplstype);
196     } else if (field.type == MMFF94)
197     {
198     atom[natom].mmff_type = type;
199     mmxtype = mmff_mmxtype(type);
200     mm3type = AtomTypes[mmxtype-1].mm3;
201     mmfftype = type;
202     ambertype = AtomTypes[mmxtype-1].amber;
203     oplstype = AtomTypes[mmxtype-1].opls;
204     set_atomtype(natom,mmxtype,mm3type,mmfftype,ambertype,oplstype);
205     }
206    
207     atom[natom].color = ncol[atom[natom].atomnum-1];
208     atom[natom].x = x; atom[natom].y = y; atom[natom].z = z;
209     atom[natom].vdw_radius = Elements[atom[natom].atomnum-1].covradius;
210     atom[natom].substr[0] = (1L << 0);
211     atom[natom].flags = 0;
212     substr.istract[0] = TRUE;
213     return natom;
214     }
215     }
216     for( i = 0; i < 103; i++ )
217     {
218     if( strcasecmp(Elements[i].symbol,name) == 0 )
219     {
220     strcpy(atom[natom].name,Elements[i].symbol);
221     atom[natom].atomwt = Elements[i].weight;
222     atom[natom].atomnum = Elements[i].atomnum;
223     atom[natom].type = Elements[i].type; // set generic type
224     atom[natom].tclass = Elements[i].type; // set generic type
225     atom[natom].mmx_type = Elements[i].type; // set generic type
226     if (type > 0)
227     {
228     atom[natom].type = type; // overwrite type if type is passed in
229     if (field.type == MMX || field.type == MM2)
230     atom[natom].mmx_type = type;
231     else if (field.type == MM3)
232     atom[natom].mm3_type = type;
233     else if (field.type == MMFF94)
234     atom[natom].mmff_type = type;
235     else if (field.type == AMBER)
236     atom[natom].amber_type = type;
237     else if (field.type == OPLSAA)
238     atom[natom].opls_type = type;
239     }
240     if (type != 0) atom[natom].type = type;
241     atom[natom].color = ncol[atom[natom].atomnum-1];
242     atom[natom].x = x; atom[natom].y = y; atom[natom].z = z;
243     atom[natom].vdw_radius = Elements[i].covradius;
244     atom[natom].substr[0] = (1L << 0);
245     substr.istract[0] = TRUE;
246     if (type > 299)
247     return -1;
248     else if (atom[natom].mmff_type == 0)
249     return -1;
250     else
251     return natom;
252     }
253     }
254     } else
255     {
256     message_alert("Input atom does not have valid atomic symbol or atom type","Error");
257     return -1;
258     }
259     return -1;
260     }
261     // ====================================================
262     void make_bond(int ia1, int ia2, int bo)
263     {
264     int loop,loop1;
265    
266     if (ia1 < 1 || ia1 > MAXATOM) return;
267     if (ia2 < 1 || ia2 > MAXATOM) return;
268     /* find if bond exists */
269     for (loop = 0; loop < MAXIAT; loop++)
270     {
271     if (atom[ia1].iat[loop] == ia2)
272     {
273     if (bo == 1)
274     atom[ia1].bo[loop] += bo;
275     else
276     atom[ia1].bo[loop] = bo;
277    
278     for (loop1 = 0; loop1 < MAXIAT; loop1++)
279     {
280     if (atom[ia2].iat[loop1] == ia1)
281     {
282     if ( bo == 1)
283     {
284     atom[ia2].bo[loop1] += bo; /* bond exists return */
285     return;
286     } else
287     {
288     atom[ia2].bo[loop1] = bo; /* bond exists return */
289     return;
290     }
291     }
292     }
293     }
294     }
295     /* bond does not exist create it */
296     for (loop = 0; loop < MAXIAT; loop++)
297     {
298     if (atom[ia1].iat[loop] == 0)
299     {
300     atom[ia1].iat[loop] = ia2;
301     atom[ia1].bo[loop] = bo;
302     break;
303     }
304     }
305     for (loop = 0; loop < MAXIAT; loop++)
306     {
307     if (atom[ia2].iat[loop] == 0)
308     {
309     atom[ia2].iat[loop] = ia1;
310     atom[ia2].bo[loop] = bo;
311     break;
312     }
313     }
314     }
315     // ===============================================
316     void deleteatom(int i)
317     {
318     int j,k, ibo;
319     atom[i].type = 0;
320     atom[i].x = 0.0F;
321     atom[i].y = 0.0F;
322     atom[i].z = 0.0F;
323     atom[i].flags = 0;
324     for (j=0; j < MAXSSCLASS; j++)
325     atom[i].substr[j] = 0;
326     for (j=0; j<MAXIAT; j++)
327     {
328     if (atom[i].iat[j] != 0 )
329     {
330     if (atom[atom[i].iat[j]].atomnum == 1 || atom[atom[i].iat[j]].atomnum == 0 )
331     {
332     atom[atom[i].iat[j]].type = 0;
333     atom[atom[i].iat[j]].x = 0.0F;
334     atom[atom[i].iat[j]].y = 0.0F;
335     atom[atom[i].iat[j]].z = 0.0F;
336     atom[atom[i].iat[j]].flags = 0;
337     }
338     ibo = atom[i].bo[j];
339     for (k=1; k <= ibo; k++)
340     deletebond(i,atom[i].iat[j]);
341     atom[i].iat[j] = 0;
342     }
343     }
344     natom--;
345     }
346     // ==================================================
347     void deletebond(int i, int j)
348     {
349     int i1,j1;
350     for (i1=0; i1 < MAXIAT; i1++)
351     {
352     if (atom[i].iat[i1] == j)
353     {
354     if (atom[i].bo[i1] == 9) /* if deleting a coordinated bond - delete it completely */
355     {
356     atom[i].bo[i1] = 0;
357     atom[i].iat[i1] = 0;
358     }
359     atom[i].bo[i1] -= 1;
360     if (atom[i].bo[i1] <= 0 )
361     atom[i].iat[i1] = 0;
362     break;
363     }
364     }
365     for (j1=0; j1 < MAXIAT; j1++)
366     {
367     if (atom[j].iat[j1] == i)
368     {
369     if (atom[j].bo[j1] == 9) /* if deleting a coordinated bond - delete it completely */
370     {
371     atom[j].bo[j1] = 0;
372     atom[j].iat[j1] = 0;
373     }
374     atom[j].bo[j1] -= 1;
375     if (atom[j].bo[j1] <= 0)
376     atom[j].iat[j1] = 0;
377     break;
378     }
379     }
380     }
381     /* --------------------------- */
382     void generate_bonds(void)
383     {
384     int i,j;
385    
386     bonds.numbonds = 0;
387     for (i= 0; i <= natom; i++)
388     {
389     bonds.ia1[i] = 0;
390     bonds.ia2[i] = 0;
391     bonds.bondorder[i] = 0;
392     }
393    
394     for (i = 1; i <= natom; i++)
395     {
396     for (j = 0; j < MAXIAT; j++)
397     {
398     if (atom[i].iat[j] > i && atom[i].iat[j] != 0)
399     {
400     bonds.ia1[bonds.numbonds] = i;
401     bonds.ia2[bonds.numbonds] = atom[i].iat[j];
402     bonds.bondorder[bonds.numbonds] = atom[i].bo[j];
403     bonds.numbonds++;
404     }
405     }
406     }
407     }