atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
force_fields.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
22
23/*
24* This file: 'force_fields.c'
25*
26* Contains:
27*
28
29 - The functions to prepare the force field XML files from the sources in atomes
30 - The functions to read the force field XML files
31
32*
33* List of functions:
34
35 int get_pdim(int fid, int prop, int col);
36 int get_fkey(int fid, int prop, int col);
37 int find_atom_id (int print, char * keyw);
38 int find_atom_z (char * keyw);
39 int get_z (int faid);
40 int get_atoms (int z);
41 int get_bond (int faid, int bid);
42 int get_angle (int faid, int aid);
43 int get_apex (int faid, int aid);
44 int get_torsion (int faid, int tid, int a, int b);
45 int get_improper (int faid, int a, int b);
46 int get_vdw (int faid);
47 int get_bi (int faid);
48 int field_find_atoms ();
49
50 float get_force_field_atom_mass (int sp, int num);
51
52 gboolean not_done (int eid, int a, int b);
53 gboolean not_done_an (int eid, int a, int b, int c);
54 gboolean is_a_match (int * data, int num, int val[4]);
55
56 gchar * find_atom_key (int fid, int prop, char * keyw);
57 gchar * open_field_file (int field);
58
59 void associate_pointers_to_field_data (int id);
60 void print_object_dim_and_key_tables (int fid);
61 void set_data (int pid, int obj, int oid, int faid);
62 void field_has_element (int aid);
63 void print_atom_table (int fid);
64 void print_this_bond (int eid, int h, int fid, int inum, char * at_a, char * at_b, char ** the_bond);
65 void print_bond_table (int fid, int inum);
66 void print_this_angle (int eid, int h, int fid, int inum, int ub, char * at_a, char * at_b, char * at_c, char ** the_angle);
67 void print_angle_table (int fid, int inum);
68 void print_dihedral_table (int fid, int inum);
69 void print_improper_table (int fid, int inum);
70 void print_inversion_table (int fid, int inum);
71 void print_vdw_table (int fid, int inum);
72 void find_object_ijkl (int hid, int foid, int oid, int sa, int za, int sb, int zb, int sc, int zc, int sd, int zd);
73 void field_find_bonds ();
74 void field_find_angles ();
75 void field_find_dihedrals (int id);
76 void field_find_vdw ();
77 void print_all (int oid);
78 void clean_this_field_data (xmlDoc * doc, xmlTextReaderPtr reader);
79
80 G_MODULE_EXPORT void setup_this_force_field (int id);
81
82*/
83
84#include "global.h"
85#include "interface.h"
86#include "dlp_field.h"
87#include "force_fields.h"
88#include <libxml/xmlreader.h>
89
90extern xmlNodePtr findnode (xmlNodePtr startnode, char * nname);
91extern int clean_xml_data (xmlDoc * doc, xmlTextReaderPtr reader);
92
93#define N_FIELDS 21
94#define N_PARAMS
95#define ALL_PARAMS 9
96
97// Define Fields order and id
98
99#define FATS 0
100#define FEQI 1
101#define FBDS 2
102#define FANG 3
103#define FDIH 4
104#define FIMP 5
105#define FINV 6
106#define FNBD 7
107#define FINC 8
108
109#define USE_ATOMS
110
111/*
112
113AMBER*: In atoms check label (1 letter only)
114
115CHARMM*: In atoms check label (1 letter only)
116
117CVFF/CVFF_aug/CFF91/PCFF:
118 - Bonds: 'c=_' in 'c=', 'n=_' in 'n=', 'd_' in 'dw', 'ci_' in 'ci', 'ni_' in 'ni'
119 - Quadratic angles: 's3m_' in 's3e_', 's4m_' in 's4e_', 'o4m_' in 'o4e_', '*?' in '*'
120
121CVFF:
122 - Atoms: 'mg' in 'Mg'
123
124CVFF_aug:
125 - Non-bonded : 'Al' in 'al'
126
127Compass :
128
129OPLSAA?:
130 - In atoms : 'NA' to 'Na', 'CLA' to 'Cl', 'MG' to 'Mg'
131
132*/
133
134char * field_keyw[N_FIELDS] = {"amber94",
135 "amber96",
136 "amber98",
137 "amber99",
138 "prot_22",
139 "prot_metals_22",
140 "ethers_35",
141 "carb_36",
142 "cgenff_36",
143 "lipid_36",
144 "na_36",
145 "prot_36",
146 "prot_metals_36",
147 "silicates",
148 "CVFF",
149 "CVFF_Aug",
150 "CFF91",
151 "PCFF",
152 "Compass",
153 "OPLSAAP",
154 "OPLSAAR"};
155
156char * field_ffl[N_FIELDS] = {"amber94",
157 "amber96",
158 "amber98",
159 "amber99",
160 "charmm-prot_22",
161 "charmm-prot_metals_22",
162 "charmm-ethers_35",
163 "charmm-carb_36",
164 "charmm-cgenff_36",
165 "charmm-lipid_36",
166 "charmm-na_36",
167 "charmm-prot_36",
168 "charmm-prot_metals_36",
169 "charmm-silicates",
170 "cvff",
171 "cvff_aug",
172 "cff91",
173 "pcff",
174 "compass",
175 "oplsaap",
176 "oplsaar"};
177
178char * field_name[N_FIELDS] = {"Assisted Model Building with Energy Refinement 94",
179 "Assisted Model Building with Energy Refinement 96",
180 "Assisted Model Building with Energy Refinement 98",
181 "Assisted Model Building with Energy Refinement 99",
182 "Chemistry at HARvard Macromolecular Mechanics 22 Proteins",
183 "Chemistry at HARvard Macromolecular Mechanics 22 Proteins and metals",
184 "Chemistry at HARvard Macromolecular Mechanics 35 Ethers",
185 "Chemistry at HARvard Macromolecular Mechanics 36 Carbohydrates",
186 "Chemistry at HARvard Macromolecular Mechanics 36 General",
187 "Chemistry at HARvard Macromolecular Mechanics 36 Lipids",
188 "Chemistry at HARvard Macromolecular Mechanics 36 Nucleid acids",
189 "Chemistry at HARvard Macromolecular Mechanics 36 Proteins",
190 "Chemistry at HARvard Macromolecular Mechanics 36 proteins and metals",
191 "Chemistry at HARvard Macromolecular Mechanics Silicates",
192 "Consistent Valence Force Field",
193 "Consistent Valence Force Field Augmented",
194 "Consistent Force Field 91",
195 "Polymer Consistent Force Field",
196 "Condensed-phase Optimized Molecular Potentials for Atomistic Simulation Studies",
197 "Optimized Potentials for Liquid Simulation All-atoms for Proteins",
198 "Optimized Potentials for Liquid Simulation All-atoms for Proteins, Nucleosides, and Nucleotides"};
199
200char * field_acro[N_FIELDS] = {"AMBER 94",
201 "AMBER 96",
202 "AMBER 98",
203 "AMBER 99",
204 "CHARMM 22 Proteins",
205 "CHARMM 22 Proteins and metals",
206 "CHARMM 35 Ethers",
207 "CHARMM 36 Carbohydrates",
208 "CHARMM 36 General",
209 "CHARMM 36 Lipids",
210 "CHARMM 36 Nucleid acids",
211 "CHARMM 36 Proteins",
212 "CHARMM 36 Proteins and metals",
213 "CHARMM Silicates",
214 "CVFF",
215 "CVFF Augmented",
216 "CFF 91",
217 "PCFF",
218 "COMPASS",
219 "OPLS All-atoms for proteins",
220 "OPLS All-atoms for RNA"};
221
222char *** field_atoms;
223char *** field_equi[2];
224// 0 = Quadratic, 1 = Quartic, 2 = Morse
225char *** field_bonds[3];
226// 0 = Quadratic, 1 = Quartic
227char *** field_angles[2];
228char *** field_dihedrals[2];
231char *** field_vdw;
232
235
236gboolean is_99;
237
241
242FILE * fp;
243
244gchar * ffo_file[21]={"parm94.dat", "parm96.dat", "parm98.dat", "parm99.dat",
245 "par_all22_prot.prm", "par_all22_prot_metals.prm", "par_all35_ethers.prm",
246 "par_all36_carb.prm", "par_all36_cgenff.prm", "par_all36_lipid.prm", "par_all36_na.prm",
247 "par_all36_prot.prm", "par_all36m_prot.prm", "par_all_silicates.prm",
248 "CVFF.frc", "CVFF_aug.frc", "CFF91.frc", "PCFF.frc", "compass.frc", "par_opls_aam.inp", "par_opls_rna.inp"};
249
250gchar * prop_name[11]= {"Quadratic bonds", "Quartic bonds", "Morse bonds", "Quadratic angles", "Quartic angles",
251 "Dihedrals", "Torsions 3", "Inversions", "Impropers", "Non-bonded", "Bond increments"};
252
253gchar * table_name[11]= {"qbonds", "sbonds", "mbonds", "qangles", "sangles", "dih", "tor", "inv", "imp", "vdw", "bdi"};
254
255int ffdim[14][2] = {{1, 0}, {1, 1}, {1, 1}, {2, 2}, {2, 4}, {2, 3}, {3, 2}, {3, 4}, {4, 3}, {4, 4}, {4, 2}, {4, 3}, {1, 2}, {2, 0}};
256// Pot +1 ou (-Pot+1) si special
257int ffpot[N_FIELDS][10]={{1, 0, 0, 1, 0, 1, 0, 1, 0, 1},
258 {1, 0, 0, 1, 0, 1, 0, 1, 0, 1},
259 {1, 0, 0, 1, 0, 1, 0, 1, 0, 1},
260 {1, 0, 0, 1, 0, 1, 0, 1, 0, 1},
261 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
262 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
263 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
264 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
265 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
266 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
267 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
268 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
269 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
270 {1, 0, 0, -1, 0, 1, 0, 2, 0, -1},
271 {1, 0, 2, 1, 0, 1, -4, 1, 0, 1},
272 {1, 0, 2, 1, 0, 1, -4, 1, 0, 0},
273 {1, 6, 0, 0, 2, 1, -4, 0, 2, 0},
274 {1, 6, 0, 1, 2, 1, -4, 0, 2, 0},
275 {0, 6, 0, 0, 2, 0, -4, 0, 2, -2},
276 {1, 0, 0, 1, 0, 1, 0, 1, 0, 1},
277 {1, 0, 0, 1, 0, 1, 0, 1, 0, 1}};
278
279
289int get_pdim(int fid, int prop, int col)
290{
291 if (prop == 0) return field_dim[0];
292 if (field_dim[prop] == 0) return 0;
293 if (prop == 6 && col == 1 && (fid >= CHARMM22P && fid <= CHARMMSI)) return 4;
294 if (prop == 12 && col == 1 && ((fid >= CHARMM22P && fid <= CHARMMSI) || (fid >= OPLSAAP))) return 4;
295 return ffdim[prop][col];
296}
297
307int get_fkey(int fid, int prop, int col)
308{
309 return ffdim[prop][col];
310}
311
312#ifndef USE_ATOMS
313void allocate_field_data (int * objects, int * dim,
314 char * atoms[objects[0]][dim[0]], char * equi_a[objects[1]][dim[1]], char * equi_b[objects[2]][dim[2]],
315 char * bonds[objects[3]][dim[3]], char * q_bonds[objects[4]][dim[4]], char * m_bonds[objects[5]][dim[5]],
316 char * angles[objects[6]][dim[6]], char * q_angles[objects[7]][dim[7]],
317 char * dihedrals[objects[8]][dim[8]], char * q_dihedrals[objects[9]][dim[9]],
318 char * inversions[objects[10]][dim[10]], char * impropers[objects[11]][dim[11]],
319 char * vdw[objects[12]][dim[12]], char * bond_inc[objects[13]][dim[13]])
320
321{
322 int h, i;
324 field_dim = dim;
325 field_atoms = g_malloc0(field_objects[0]*sizeof*field_atoms);
326 for (i=0; i<field_objects[0]; i++)
327 {
328 field_atoms[i] = g_malloc0(field_dim[0]*sizeof*field_atoms[i]);
329 field_atoms[i] = atoms[i];
330 }
331 for (h=0; h<2; h++)
332 {
333 if (field_objects[1+h])
334 {
335 field_equi[h] = g_malloc0(field_objects[1+h]*sizeof*field_equi[h]);
336 for (i=0; i<field_objects[1+h]; i++)
337 {
338 field_equi[h][i] = g_malloc0(field_dim[h+1]*sizeof*field_equi[h][i]);
339 switch (h)
340 {
341 case 0:
342 field_equi[h][i] = equi_a[i];
343 break;
344 case 1:
345 field_equi[h][i] = equi_b[i];
346 break;
347 }
348 }
349 }
350 }
351 for (h=0; h<3; h++)
352 {
353 if (field_objects[3+h])
354 {
355 field_bonds[h] = g_malloc0(field_objects[3+h]*sizeof*field_bonds[h]);
356 for (i=0; i<field_objects[3+h]; i++)
357 {
358 field_bonds[h][i] = g_malloc0(field_dim[3+h]*sizeof*field_bonds[h][i]);
359 switch (h)
360 {
361 case 0:
362 field_bonds[h][i] = bonds[i];
363 break;
364 case 1:
365 field_bonds[h][i] = q_bonds[i];
366 break;
367 case 2:
368 field_bonds[h][i] = m_bonds[i];
369 break;
370 }
371 }
372 }
373 else
374 {
375 field_bonds[h] = NULL;
376 }
377 }
378 for (h=0; h<2; h++)
379 {
380 if (field_objects[6+h])
381 {
382 field_angles[h] = g_malloc0(field_objects[6+h]*sizeof*field_angles[h]);
383 for (i=0; i<field_objects[6+h]; i++)
384 {
385 field_angles[h][i] = g_malloc0(field_dim[6+h]*sizeof*field_angles[h][i]);
386 switch (h)
387 {
388 case 0:
389 field_angles[h][i] = angles[i];
390 break;
391 case 1:
392 field_angles[h][i] = q_angles[i];
393 break;
394 }
395 }
396 }
397 else
398 {
399 field_angles[h] = NULL;
400 }
401 }
402 for (h=0; h<2; h++)
403 {
404 if (field_objects[8+h])
405 {
406 field_dihedrals[h] = g_malloc0(field_objects[8+h]*sizeof*field_dihedrals[h]);
407 for (i=0; i<field_objects[8+h]; i++)
408 {
409 field_dihedrals[h][i] = g_malloc0(field_dim[8+h]*sizeof*field_dihedrals[h][i]);
410 switch (h)
411 {
412 case 0:
413 field_dihedrals[h][i] = dihedrals[i];
414 break;
415 case 1:
416 field_dihedrals[h][i] = q_dihedrals[i];
417 break;
418 }
419 }
420 }
421 else
422 {
423 field_dihedrals[h] = NULL;
424 }
425 }
426
427 if (field_objects[10])
428 {
429 field_inversions = g_malloc0(field_objects[10]*sizeof*field_inversions);
430 for (i=0; i<field_objects[10]; i++)
431 {
432 field_inversions[i] = g_malloc0(field_dim[10]*sizeof*field_inversions[i]);
433 field_inversions[i] = inversions[i];
434 }
435 }
436 else
437 {
438 field_inversions = NULL;
439 }
440
441
442 if (field_objects[11])
443 {
444 field_impropers = g_malloc0(field_objects[11]*sizeof*field_impropers);
445 for (i=0; i<field_objects[11]; i++)
446 {
447 field_impropers[i] = g_malloc0(field_dim[11]*sizeof*field_impropers[i]);
448 field_impropers[i] = impropers[i];
449 }
450 }
451 else
452 {
453 field_impropers = NULL;
454 }
455
456
457 if (field_objects[12])
458 {
459 field_vdw = g_malloc0(field_objects[12]*sizeof*field_vdw);
460 for (i=0; i<field_objects[12]; i++)
461 {
462 field_vdw[i] = g_malloc0(field_dim[12]*sizeof*field_vdw[i]);
463 field_vdw[i] = vdw[i];
464 }
465 }
466 else
467 {
468 field_vdw = NULL;
469 }
470}
471
479void associate_pointers_to_field_data (int id)
480{
481 switch (id)
482 {
483 case AMBER94:
484 allocate_field_data ((int *)amber94_objects, (int *)amber94_dim, amber94_atoms, amber94_equi, NULL,
485 amber94_bonds, NULL, NULL, amber94_angles, NULL,
487 break;
488 case AMBER96:
489 allocate_field_data ((int *)amber96_objects, (int *)amber96_dim, amber96_atoms, amber96_equi, NULL,
490 amber96_bonds, NULL, NULL, amber96_angles, NULL,
492 break;
493 case AMBER98:
494 allocate_field_data ((int *)amber98_objects, (int *)amber98_dim, amber98_atoms, amber98_equi, NULL,
495 amber98_bonds, NULL, NULL, amber98_angles, NULL,
497 break;
498 case AMBER99:
499 allocate_field_data ((int *)amber99_objects, (int *)amber99_dim, amber99_atoms, amber99_equi, NULL,
500 amber99_bonds, NULL, NULL, amber99_angles, NULL,
502 break;
503 case CHARMM22P:
504 allocate_field_data ((int *)charmm22_prot_objects, (int *)charmm22_prot_dim, charmm22_prot_atoms, NULL, NULL,
505 charmm22_prot_bonds, NULL, NULL, charmm22_prot_angles, NULL,
507 break;
508 case CHARMM22M:
509 allocate_field_data ((int *)charmm22_prot_metals_objects, (int *)charmm22_prot_metals_dim, charmm22_prot_metals_atoms, NULL, NULL,
512 break;
513 case CHARMM35E:
514 // No impropers
515 allocate_field_data ((int *)charmm35_ethers_objects, (int *)charmm35_ethers_dim, charmm35_ethers_atoms, NULL, NULL,
517 charmm35_ethers_dihedrals, NULL, NULL, NULL, charmm35_ethers_vdw, NULL);
518 break;
519 case CHARMM36C:
520 allocate_field_data ((int *)charmm36_carb_objects, (int *)charmm36_carb_dim, charmm36_carb_atoms, NULL, NULL,
521 charmm36_carb_bonds, NULL, NULL, charmm36_carb_angles, NULL,
523 break;
524 case CHARMM36G:
525 allocate_field_data ((int *)charmm36_cgenff_objects, (int *)charmm36_cgenff_dim, charmm36_cgenff_atoms, NULL, NULL,
528 break;
529 case CHARMM36L:
530 allocate_field_data ((int *)charmm36_lipid_objects, (int *)charmm36_lipid_dim, charmm36_lipid_atoms, NULL, NULL,
533 break;
534 case CHARMM36N:
535 allocate_field_data ((int *)charmm36_na_objects, (int *)charmm36_na_dim, charmm36_na_atoms, NULL, NULL,
536 charmm36_na_bonds, NULL, NULL, charmm36_na_angles, NULL,
538 break;
539 case CHARMM36P:
540 allocate_field_data ((int *)charmm36_prot_objects, (int *)charmm36_prot_dim, charmm36_prot_atoms, NULL, NULL,
541 charmm36_prot_bonds, NULL, NULL, charmm36_prot_angles, NULL,
543 break;
544 case CHARMM36M:
545 allocate_field_data ((int *)charmm36m_prot_objects, (int *)charmm36m_prot_dim, charmm36m_prot_atoms, NULL, NULL,
548 break;
549 case CHARMMSI:
550 // No impropers
551 allocate_field_data ((int *)charmm_silicates_objects, (int *)charmm_silicates_dim, charmm_silicates_atoms, NULL, NULL,
553 charmm_silicates_dihedrals, NULL, NULL, NULL, charmm_silicates_vdw, NULL);
554 break;
555 case CVFF:
556 allocate_field_data ((int *)CVFF_objects, (int *)CVFF_dim, CVFF_atoms, CVFF_equivalence_auto, CVFF_equivalence,
558 CVFF_torsions_auto, NULL, NULL, CVFF_impropers, CVFF_vdw, NULL);
559 break;
560 case CVFF_AUG:
564 break;
565 case CFF91:
566 allocate_field_data ((int *)CFF91_objects, (int *)CFF91_dim, CFF91_atoms, CFF91_equivalence_auto, CFF91_equivalence,
569 break;
570 case PCFF:
571 allocate_field_data ((int *)PCFF_objects, (int *)PCFF_dim, PCFF_atoms, PCFF_equivalence_auto, PCFF_equivalence,
574 break;
575 case COMPASS:
576 allocate_field_data ((int *)Compass_objects, (int *)Compass_dim, Compass_atoms, NULL, Compass_equivalence,
577 NULL, Compass_bonds, NULL, NULL, Compass_angles,
579 break;
580 case OPLSAAP:
581 allocate_field_data ((int *)OPLSAAM_objects, (int *)OPLSAAM_dim, OPLSAAM_atoms, NULL, NULL,
582 OPLSAAM_bonds, NULL, NULL, OPLSAAM_angles, NULL,
584 break;
585 case OPLSAAR:
586 allocate_field_data ((int *)OPLSAAR_objects, (int *)OPLSAAR_dim, OPLSAAR_atoms, NULL, NULL,
587 OPLSAAR_bonds, NULL, NULL, OPLSAAR_angles, NULL,
589 break;
590 default:
591 field_objects = NULL;
592 field_atoms = NULL;
593 field_bonds[0] = field_bonds[1] = field_bonds[2]= NULL;
594 field_angles[0] = field_angles[1] = NULL;
595 field_dihedrals[0] = field_dihedrals[1] = NULL;
596 field_inversions = NULL;
597 field_impropers = NULL;
598 field_vdw = NULL;
599 break;
600 }
601}
602#endif
603
612int find_atom_id (int print, char * keyw)
613{
614 int i;
615 for (i=0; i<field_objects[0]; i++)
616 {
617 if (g_strcmp0 (keyw, field_atoms[i][2]) == 0) return i;
618 }
619 if (g_strcmp0 (keyw, "X") == 0) return -1;
620 if (g_strcmp0 (keyw, "*") == 0) return -1;
621#ifdef DEBUG
622 if (print) g_debug ("ID:: -10:: key= '%s'", keyw);
623#endif
624 return -10;
625}
626
636gchar * find_atom_key (int fid, int prop, char * keyw)
637{
638 if (fid > CHARMMSI && fid < OPLSAAP)
639 {
640 if (find_atom_id(0, keyw) == -10)
641 {
642 int i;
643 for (i=0; i<field_objects[2]; i++)
644 {
645 if (g_strcmp0 (keyw, field_equi[1][i][prop]) == 0) return field_equi[1][i][0];
646 }
647 for (i=0; i<field_objects[1]; i++)
648 {
649 if (g_strcmp0 (keyw, field_equi[0][i][prop+prop/2+prop/5]) == 0) return field_equi[0][i][0];
650 }
651 if (prop > 2)
652 {
653 for (i=0; i<field_objects[1]; i++)
654 {
655 if (g_strcmp0 (keyw, field_equi[0][i][prop+prop/2+prop/5+1]) == 0) return field_equi[0][i][0];
656 }
657 }
658#ifdef DEBUG
659 g_debug ("Nothing found in equi:: prop= %d, keyw= %s", prop, keyw);
660#endif
661 }
662 return keyw;
663 }
664 else
665 {
666 return keyw;
667 }
668}
669
677int find_atom_z (char * keyw)
678{
679 int i, j;
680 for (i=0; i<field_objects[0]; i++)
681 {
682 if (g_strcmp0 (keyw, field_atoms[i][2]) == 0)
683 {
684 for (j=1; j<120; j++)
685 {
686 if (g_strcmp0 (periodic_table_info[j].lab, field_atoms[i][0]) == 0) return periodic_table_info[j].Z;
687 //if (g_strcmp0 (exact_name(periodic_table_info[j].lab), exact_name(field_atoms[i][0])) == 0) return periodic_table_info[j].Z;
688 }
689 }
690 }
691 if (g_strcmp0 (keyw, "X") == 0) return -1;
692 if (g_strcmp0 (keyw, "*") == 0) return -1;
693 if (g_strcmp0 (keyw, "L") == 0 || g_strcmp0 (keyw, "lp") == 0 || g_strcmp0 (keyw, "LP") == 0 || g_strcmp0 (keyw, "LPH") == 0) return -2;
694 if (g_strcmp0 (keyw, "EP") == 0) return -3;
695 if (g_strcmp0 (keyw, "DUM") == 0) return -4;
696#ifdef DEBUG
697 g_debug ("Z:: -10:: key= '%s'", keyw);
698#endif
699 return -10;
700}
701
710{
711 gchar * nodes[11]={"atoms", "bonds-h", "bonds-q", "bonds-m", "angles-h", "angles-q",
712 "dihedrals-c", "dihedrals-ccc", "impropers", "inversions", "non-bonded"};
713 fprintf (fp, " <ff-data>\n");
714 int i, j, k, l, n, m;
715 k = -1;
716 for (i=0; i<13; i++)
717 {
718 if (i != 1 && i != 2)
719 {
720 k ++;
721 j = (i == 10) ? 11 : (i == 11) ? 10 : i;
722 if (i == 0)
723 {
724 fprintf (fp, " <%s dim=\"%d\">%d</%s>\n", nodes[k], (field_objects[j]) ? get_pdim(fid, j, 1) : 0, field_objects[j], nodes[k]);
725 }
726 else if (i < 12)
727 {
728 fprintf (fp, " <%s dim=\"%d\" pot=\"%d\">%d</%s>\n", nodes[k], (field_objects[j]) ? get_pdim(fid, j, 1) : 0, ffpot[fid][k-1], field_objects[j], nodes[k]);
729 }
730 else
731 {
732 l = 0;
733 if (fid <= AMBER99)
734 {
735 for (n=0; n<field_objects[1]; n++)
736 {
737 for (m=1; m<field_dim[1]; m++)
738 {
739 if(g_strcmp0 (field_equi[0][n][m], " ") != 0)
740 {
741 l ++;
742 }
743 }
744 }
745 }
746 fprintf (fp, " <%s dim=\"%d\" pot=\"%d\">%d</%s>\n", nodes[k], (field_objects[j]) ? get_pdim(fid, j, 1) : 0, ffpot[fid][k-1], field_objects[j]+l, nodes[k]);
747 }
748 }
749 }
750 fprintf (fp, " </ff-data>\n");
751}
752
755
766void set_data (int pid, int obj, int oid, int faid)
767{
768 if (all_data[pid][faid] == NULL)
769 {
770 all_data[pid][faid] = g_malloc0(sizeof*all_data[pid][faid]);
771 om_tmp = all_data[pid][faid];
772 }
773 else
774 {
775 om_tmp -> next = g_malloc0(sizeof*om_tmp -> next);
776 om_tmp -> next -> id = om_tmp -> id + 1;
777 om_tmp -> next -> prev = om_tmp;
778 }
779 om_tmp -> obj = obj;
780 om_tmp -> oid = oid;
781}
782
790int get_z (int faid)
791{
792 int i;
793 for (i=0; i<120; i++)
794 {
795 if (g_strcmp0 (periodic_table_info[i].lab, field_atoms[faid][0]) == 0) return periodic_table_info[i].Z;
796 }
797 return -1;
798}
799
807int get_atoms (int z)
808{
809 int i, j;
810 j = 0;
811 for (i=0; i<field_objects[0]; i++)
812 {
813 if (get_z(i) == z)
814 {
815 set_data (0, 0, j, z);
816 j ++;
817 }
818 }
819 return j;
820}
821
830int get_bond (int faid, int bid)
831{
832 int i, j;
833 j = 0;
834 if (field_objects[3+bid])
835 {
836 for (i=0; i<field_objects[3+bid]; i++)
837 {
838 if ((g_strcmp0 (field_bonds[bid][i][0], field_atoms[faid][2]) == 0) || (g_strcmp0 (field_bonds[bid][i][1], field_atoms[faid][2]) == 0))
839 {
840 set_data (1, bid, i, faid);
841 j ++;
842 }
843 }
844 }
845 return j;
846}
847
856int get_angle (int faid, int aid)
857{
858 int i, j;
859 j = 0;
860 if (field_objects[6+aid])
861 {
862 for (i=0; i<field_objects[6+aid]; i++)
863 {
864 if ((g_strcmp0 (field_angles[aid][i][0], field_atoms[faid][2]) == 0) || (g_strcmp0 (field_angles[aid][i][2], field_atoms[faid][2]) == 0))
865 {
866 set_data (2, aid, i, faid);
867 j ++;
868 }
869 }
870 }
871 return j;
872}
873
882int get_apex (int faid, int aid)
883{
884 int i, j;
885 j = 0;
886 if (field_objects[6+aid])
887 {
888 for (i=0; i<field_objects[6+aid]; i++)
889 {
890 if (g_strcmp0 (field_angles[aid][i][1], field_atoms[faid][2]) == 0)
891 {
892 set_data (3, aid, i, faid);
893 j ++;
894 }
895 }
896 }
897 return j;
898}
899
910int get_torsion (int faid, int tid, int a, int b)
911{
912 int i, j;
913 j = 0;
914 if (field_objects[8+tid])
915 {
916 for (i=0; i<field_objects[8+tid]; i++)
917 {
918 if ((g_strcmp0 (field_dihedrals[tid][i][a], field_atoms[faid][2]) == 0) || (g_strcmp0 (field_dihedrals[tid][i][b], field_atoms[faid][2]) == 0))
919 {
920 set_data (4+a, tid, i, faid);
921 j ++;
922 }
923 }
924 }
925 return j;
926}
927
937int get_improper (int faid, int a, int b)
938{
939 int i, j;
940 j = 0;
941 if (field_objects[11])
942 {
943 for (i=0; i<field_objects[11]; i++)
944 {
945 if ((g_strcmp0 (field_impropers[i][a], field_atoms[faid][2]) == 0) || (g_strcmp0 (field_impropers[i][b], field_atoms[faid][2]) == 0))
946 {
947 set_data (6+a, 0, i, faid);
948 j ++;
949 }
950 }
951 }
952 return j;
953}
954
962int get_vdw (int faid)
963{
964 int i, j;
965 j = 0;
966 if (field_objects[12])
967 {
968 for (i=0; i<field_objects[12]; i++)
969 {
970 if (g_strcmp0 (field_vdw[i][0], field_atoms[faid][2]) == 0)
971 {
972 set_data (8, 0, i, faid);
973 j ++;
974 }
975 }
976 }
977 return j;
978}
979
1005
1013void field_has_element (int aid)
1014{
1015 int h, i, j, k, l, m, n, o, p, q, r, s;
1016 j = k = l = m = n = o = p = q = r = s = 0;
1017 for (i=0; field_objects[0]; i++)
1018 {
1019 if (g_strcmp0 (periodic_table_info[aid].lab, field_atoms[i][0]) == 0)
1020 {
1021 j ++;
1022 for (h=0; h<3; h++) k += get_bond (i, h);
1023 for (h=0; h<2; h++) l += get_angle(i, h);
1024 for (h=0; h<2; h++) m += get_apex(i, h);
1025 for (h=0; h<2; h++) n += get_torsion (i, h, 0, 3);
1026 for (h=0; h<2; h++) o += get_torsion (i, h, 1, 2);
1027 p += get_improper (i, 0, 3);
1028 q += get_improper (i, 1, 2);
1029 r += get_vdw(i);
1030 //s += get_bi(i);
1031 }
1032 }
1033 // Number of objects by atomic number, 10 columns
1034 // 0 = Elem, 1 = Tot bd, 2 = Tot ang AC, 3 = Tot ang apex, 4 = Tot dih 14, 5 Tot dih 23, 6 Tot imp ab, 7 = Tot imp cd, 8 = Tot wdv, 9 = Tot BI
1035 fprintf (fp, "{%3i,%3i,%3i,%3i,%3i,%3i,%3i,%3i,%3i,%3i}", j, k, l, m, n, o, p, q, r, s);
1036}
1037
1045void print_atom_table (int fid)
1046{
1047 int i, j;
1048 gchar * nodes[4]={"label", "mass", "key", "info"};
1049 fprintf (fp, " <atoms>\n");
1050 for (i=0; i<field_objects[0]; i++)
1051 {
1052 fprintf (fp, " <at");
1053 for (j=0; j<4; j++)
1054 {
1055 fprintf (fp, " %s=\"%s\"", nodes[j], field_atoms[i][j]);
1056 }
1057 fprintf (fp, "/>\n");
1058 }
1059 fprintf (fp, " </atoms>\n");
1060}
1061
1062typedef struct f_bond f_bond;
1064{
1065 int a;
1066 int b;
1067 float v[2];
1070};
1071
1074
1084gboolean not_done (int eid, int a, int b)
1085{
1086 tmpbd = the_bonds[eid];
1087 while (tmpbd)
1088 {
1089 if (tmpbd -> a == a && tmpbd -> b == b) return FALSE;
1090 if (tmpbd -> a == b && tmpbd -> b == a) return FALSE;
1091 tmpbd = tmpbd -> next;
1092 }
1093 return TRUE;
1094}
1095
1109void print_this_bond (int eid, int h, int fid, int inum, char * at_a, char * at_b, char ** the_bond)
1110{
1111 int j;
1112 gchar * node[3] = {"bd-h", "bd-q", "bd-m"};
1113 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 2, at_a));
1114 gchar * bbb = g_strdup_printf ("%s", find_atom_key(fid, 2, at_b));
1115 if (eid < 0 || not_done (eid, find_atom_id (1, aaa), find_atom_id (1, bbb)))
1116 {
1117 if (eid > -1)
1118 {
1119 if (the_bonds[eid])
1120 {
1121 tmpbd = the_bonds[eid];
1122 while (tmpbd -> next) tmpbd = tmpbd -> next;
1123 tmpbd -> next = g_malloc0(sizeof*tmpbd -> next);
1124 tmpbd -> next -> prev = tmpbd;
1125 tmpbd = tmpbd -> next;
1126 }
1127 else
1128 {
1129 the_bonds[eid] = g_malloc0(sizeof*the_bonds[eid]);
1130 tmpbd = the_bonds[eid];
1131 }
1132 tmpbd -> a = find_atom_id (0, aaa);
1133 tmpbd -> b = find_atom_id (0, bbb);
1134 tmpbd -> v[0] = string_to_double ((gpointer)the_bond[2]);
1135 tmpbd -> v[1] = string_to_double ((gpointer)the_bond[3]);
1136 }
1137 fprintf (fp, " <%s a=\"%d\" b=\"%d\" z_a=\"%d\" z_b=\"%d\"",
1138 node[h], find_atom_id (0, aaa), find_atom_id (0, bbb),
1139 find_atom_z (aaa), find_atom_z (bbb));
1140 switch (h)
1141 {
1142 case 0:
1143 if (fid == CVFF || fid == CVFF_AUG || fid == CFF91 || fid == PCFF)
1144 {
1145 fprintf (fp, " K=\"%f\" R_zero=\"%f\"", string_to_double ((gpointer)the_bond[3]), string_to_double ((gpointer)the_bond[2]));
1146 }
1147 else
1148 {
1149 fprintf (fp, " K=\"%f\" R_zero=\"%f\"", string_to_double ((gpointer)the_bond[2]), string_to_double ((gpointer)the_bond[3]));
1150 }
1151 j = 4;
1152 break;
1153 case 1:
1154 fprintf (fp, " K=\"%f\" R_zero=\"%f\" KK=\"%f\" KKK=\"%f\"", string_to_double ((gpointer)the_bond[3]), string_to_double ((gpointer)the_bond[2]), string_to_double ((gpointer)the_bond[4]), string_to_double ((gpointer)the_bond[5]));
1155 j = 6;
1156 break;
1157 case 2:
1158 fprintf (fp, " D=\"%f\" R_zero=\"%f\" Alpha=\"%f\"", string_to_double ((gpointer)the_bond[3]), string_to_double ((gpointer)the_bond[2]), string_to_double ((gpointer)the_bond[4]));
1159 j = 5;
1160 break;
1161 }
1162 if (field_dim[inum+h] > j)
1163 {
1164 fprintf (fp, " info=\"%s\"", the_bond[j]);
1165 }
1166 fprintf (fp, "/>\n");
1167 }
1168 else if (eid > -1)
1169 {
1170 g_debug ("Done:: tmpbd -> a= %d, tmpbd -> b= %d, tmpbd -> v[0]= %f, tmpbd -> v[1]= %f, this.v[0]= %f, this.v[1]=%f",
1171 tmpbd -> a, tmpbd -> b, tmpbd -> v[0], tmpbd -> v[1], string_to_double ((gpointer)the_bond[2]), string_to_double ((gpointer)the_bond[3]));
1172 }
1173 g_free (aaa);
1174 g_free (bbb);
1175}
1176
1185void print_bond_table (int fid, int inum)
1186{
1187 int h, i;//, j, k, l, m;
1188 gchar * bode[3] = {"bonds-h", "bonds-q", "bonds-m"};
1189 gchar * desc[3] = {"Quadratic bonds:\n\n V(R) = K x (R - R0)^2\n"
1190 " With:\n - K = spring constant (kcal mol^-1 A^-2)\n - R = bond distance (A)\n - R0 = equilibrium distance (A)\n",
1191 "Quartic bonds:\n\n V(R) = K x (R - R0)^2 + K' x (R - R0)^3 + K'' x (R - R0)^4\n"
1192 " With:\n - K, K' and K'' = nth order spring constants (kcal mol^-1 A^-2)\n"
1193 " - R = bond distance (A)\n - R0 = equilibrium distance (A)",
1194 "Morse bonds:\n\n V(R) = D x (1 - exp(-ALPHA x (R - R0)))^2\n"
1195 " With:\n - D = well depth\n - ALPHA = well width\n - R = bond distance\n - R0 = equilibrium distance (A)"};
1196 for (h=0; h<3; h++)
1197 {
1198 the_bonds[0] = the_bonds[1] = NULL;
1199 if (field_objects[inum+h])
1200 {
1201 fprintf (fp, " <%s>\n", bode[h]);
1202 fprintf (fp, " <!-- %s -->\n", desc[h]);
1203 /*if (fid > CHARMMSI && fid < OPLSAAP)
1204 {
1205 for (i=0; i<field_objects[inum+h]; i++)
1206 {
1207 if (find_atom_id (1, field_bonds[h][i][0]) == -10 && find_atom_id (1, field_bonds[h][i][1]) == -10)
1208 {
1209 for (j=1; j<3; j++)
1210 {
1211 for (k=0; k<field_objects[j]; k++)
1212 {
1213 if (g_strcmp0 (field_equi[j-1][k][4-j], field_bonds[h][i][0]) == 0)
1214 {
1215 l = (g_strcmp0 (field_bonds[h][i][0], field_bonds[h][i][1]) == 0) ? k : 0;
1216 for (m=l; m<field_objects[j]; m++)
1217 {
1218 if (g_strcmp0 (field_equi[j-1][m][4-j], field_bonds[h][i][1]) == 0)
1219 {
1220 print_this_bond (j-1, h, fid, inum, field_equi[j-1][k][0], field_equi[j-1][m][0], field_bonds[h][i]);
1221 }
1222 }
1223 }
1224 }
1225 }
1226 }
1227 else if (find_atom_id (1, field_bonds[h][i][0]) == -10)
1228 {
1229 for (j=1; j<3; j++)
1230 {
1231 for (k=0; k<field_objects[j]; k++)
1232 {
1233 if (g_strcmp0 (field_equi[j-1][k][4-j], field_bonds[h][i][0]) == 0)
1234 {
1235 print_this_bond (j-1, h, fid, inum, field_equi[j-1][k][0], field_bonds[h][i][1], field_bonds[h][i]);
1236 }
1237 }
1238 }
1239 }
1240 else if (find_atom_id (1, field_bonds[h][i][1]) == -10)
1241 {
1242 for (j=1; j<3; j++)
1243 {
1244 for (k=0; k<field_objects[j]; k++)
1245 {
1246 if (g_strcmp0 (field_equi[j-1][k][4-j], field_bonds[h][i][1]) == 0)
1247 {
1248 print_this_bond (j-1, h, fid, inum, field_bonds[h][i][0], field_equi[j-1][k][0], field_bonds[h][i]);
1249 }
1250 }
1251 }
1252 }
1253 else
1254 {
1255 print_this_bond (-1, h, fid, inum, field_bonds[h][i][0], field_bonds[h][i][1], field_bonds[h][i]);
1256 }
1257 for (j=0; j<2; j++)
1258 {
1259 if (the_bonds[j])
1260 {
1261 tmpbd = the_bonds[j];
1262 while (tmpbd -> next)
1263 {
1264 tmpbd = tmpbd -> next;
1265 g_free (tmpbd -> prev);
1266 }
1267 g_free (tmpbd);
1268 the_bonds[j] = NULL;
1269 }
1270 }
1271 }
1272 fprintf (fp, " </%s>\n", bode[h]);
1273 }
1274 else*/
1275 {
1276 for (i=0; i<field_objects[inum+h]; i++)
1277 {
1278 print_this_bond (-1, h, fid, inum, field_bonds[h][i][0], field_bonds[h][i][1], field_bonds[h][i]);
1279 }
1280 fprintf (fp, " </%s>\n", bode[h]);
1281 }
1282 }
1283 /*if (the_bonds[0] || the_bonds[1])
1284 {
1285 for (i=0; i<2; i++)
1286 {
1287 if (the_bonds[i])
1288 {
1289 tmpbd = the_bonds[i];
1290 while (tmpbd -> next)
1291 {
1292 tmpbd = tmpbd -> next;
1293 g_free (tmpbd -> prev);
1294 }
1295 g_free (tmpbd);
1296 }
1297 }
1298 }*/
1299 }
1300}
1301
1302typedef struct f_angl f_angl;
1304{
1305 int a;
1306 int b;
1307 int c;
1308 float v[2];
1311};
1312
1315
1326gboolean not_done_an (int eid, int a, int b, int c)
1327{
1328 tmpan = the_angles[eid];
1329 while (tmpan)
1330 {
1331 if (tmpan -> a == a && tmpan -> b == b && tmpan -> c == c) return FALSE;
1332 if (tmpan -> a == c && tmpan -> b == b && tmpan -> c == a) return FALSE;
1333 tmpan = tmpan -> next;
1334 }
1335 return TRUE;
1336}
1337
1353void print_this_angle (int eid, int h, int fid, int inum, int ub, char * at_a, char * at_b, char * at_c, char ** the_angle)
1354{
1355 int j;
1356 gchar * node[2] = {"ang-h", "ang-q"};
1357 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 3, at_a));
1358 gchar * bbb = g_strdup_printf ("%s", find_atom_key(fid, 3, at_b));
1359 gchar * ccc = g_strdup_printf ("%s", find_atom_key(fid, 3, at_c));
1360 if (eid < 0 || not_done_an (eid, find_atom_id (1, aaa), find_atom_id (1, bbb), find_atom_id (1, ccc)))
1361 {
1362 if (eid > -1)
1363 {
1364 if (the_angles[eid])
1365 {
1366 tmpan = the_angles[eid];
1367 while (tmpan -> next) tmpan = tmpan -> next;
1368 tmpan -> next = g_malloc0(sizeof*tmpan -> next);
1369 tmpan -> next -> prev = tmpan;
1370 tmpan = tmpan -> next;
1371 }
1372 else
1373 {
1374 the_angles[eid] = g_malloc0(sizeof*the_angles[eid]);
1375 tmpan = the_angles[eid];
1376 }
1377 tmpan -> a = find_atom_id (0, aaa);
1378 tmpan -> b = find_atom_id (0, bbb);
1379 tmpan -> c = find_atom_id (0, ccc);
1380 tmpan -> v[0] = string_to_double ((gpointer)the_angle[3]);
1381 tmpan -> v[1] = string_to_double ((gpointer)the_angle[4]);
1382 }
1383 fprintf (fp, " <%s a=\"%d\" b=\"%d\" c=\"%d\" z_a=\"%d\" z_b=\"%d\" z_c=\"%d\"",
1384 node[h], find_atom_id (0, aaa), find_atom_id (0, bbb), find_atom_id (0, ccc),
1385 find_atom_z (aaa), find_atom_z (bbb), find_atom_z (ccc));
1386 switch (h)
1387 {
1388 case 0:
1389 if (fid >= CVFF && fid < COMPASS)
1390 {
1391 fprintf (fp, " K=\"%f\" Theta_zero=\"%f\"", string_to_double ((gpointer)the_angle[4]), string_to_double ((gpointer)the_angle[3]));
1392 }
1393 else
1394 {
1395 fprintf (fp, " K=\"%f\" Theta_zero=\"%f\"", string_to_double ((gpointer)the_angle[3]), string_to_double ((gpointer)the_angle[4]));
1396 }
1397 if (ub)
1398 {
1399 fprintf (fp, " Kub=\"%f\" S_zero=\"%f\"", string_to_double ((gpointer)the_angle[5]), string_to_double ((gpointer)the_angle[6]));
1400 }
1401 j = (ub) ? 7 : 5;
1402 break;
1403 case 1:
1404 fprintf (fp, " K=\"%f\" Theta_zero=\"%f\" KK=\"%f\" KKK=\"%f\"", string_to_double ((gpointer)the_angle[4]), string_to_double ((gpointer)the_angle[3]),
1405 string_to_double ((gpointer)the_angle[5]), string_to_double ((gpointer)the_angle[6]));
1406 j = 7;
1407 break;
1408 }
1409 if (field_dim[inum+h] > j)
1410 {
1411 fprintf (fp, " info=\"%s\"", the_angle[j]);
1412 }
1413 fprintf (fp, "/>\n");
1414 }
1415 else if (eid > -1)
1416 {
1417 g_debug ("Done:: tmpan -> a= %d, tmpan -> b= %d, tmpan -> c= %d, tmpan -> v[0]= %f, tmpan -> v[1]= %f, this.v[0]= %f, this.v[1]=%f",
1418 tmpan -> a, tmpan -> b, tmpan -> c, tmpan -> v[0], tmpan -> v[1], string_to_double ((gpointer)the_angle[3]), string_to_double ((gpointer)the_angle[4]));
1419 }
1420 g_free (aaa);
1421 g_free (bbb);
1422 g_free (ccc);
1423}
1424
1433void print_angle_table (int fid, int inum)
1434{
1435 int h, i;//, j, k, l;
1436 int ub = (fid > AMBER99 && fid <= CHARMMSI) ? 2 : 0; // Urey-Bradley parameter for the CHARMM FF
1437 gchar * aode[2] = {"angles-h", "angles-q"};
1438
1439 gchar * desc[3] = {"Quadratic angles:\n\n V(Theta) = K x (Theta - Theta0)^2\n"
1440 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Theta = angle (°)\n - Theta0 = equilibrium angle (°)",
1441 "Quartic angles:\n\n V(Theta) = K x (Theta - Theta0)^2 + K' x (Theta - Theta0)^3 + K' x (Theta - Theta0)^4\n"
1442 " With:\n - K, K' and K'' = nth order spring constant (kcal mol^-1 rad^-nth)\n - Theta = angle (°)\n - Theta0 = equilibrium angle (°)",
1443 "Quadratic angles + Urey-Bradley (UB) parameters:\n\n V(Theta) = K x (Theta - Theta0)^2\n"
1444 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Theta = angle (°)\n - Theta0 = equilibrium angle(°)\n"
1445 " V(S) = Kub x (R - Rub)^2\n"
1446 " With:\n - Kub = spring constant (kcal mol^-1 A^-2)\n - S = distance 1-3 (A)\n - S0 = equilibrium distance 1-3 (A)"};
1447 for (h=0; h<2; h++)
1448 {
1449 the_angles[0] = the_angles[1] = NULL;
1450 if (field_objects[inum+h])
1451 {
1452 fprintf (fp, " <%s>\n", aode[h]);
1453 fprintf (fp, " <!-- %s -->\n", desc[h+ub]);
1454 /*if (fid > CHARMMSI && fid < OPLSAAP)
1455 {
1456 for (i=0; i<field_objects[inum+h]; i++)
1457 {
1458 if (find_atom_id (1, field_angles[h][i][0]) == -10 && find_atom_id (1, field_angles[h][i][1]) == -10 && find_atom_id (1, field_angles[h][i][2]) == -10)
1459 {
1460 for (j=0; j<field_objects[2]; j++)
1461 {
1462 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][0]) == 0)
1463 {
1464 for (k=0; k<field_objects[2]; k++)
1465 {
1466 if (g_strcmp0 (field_equi[1][k][3], field_angles[h][i][1]) == 0)
1467 {
1468 for (l=0; l<field_objects[2]; l++)
1469 {
1470 if (g_strcmp0 (field_equi[1][l][3], field_angles[h][i][2]) == 0)
1471 {
1472 print_this_angle (1, h, fid, inum, ub, field_equi[1][j][0], field_equi[1][k][0], field_equi[1][l][0], field_angles[h][i]);
1473 }
1474 }
1475 }
1476 }
1477 }
1478 }
1479 for (j=0; j<field_objects[1]; j++)
1480 {
1481 if (g_strcmp0 (field_equi[0][j][4], field_angles[h][i][0]) == 0)
1482 {
1483 for (k=0; k<field_objects[1]; k++)
1484 {
1485 if (g_strcmp0 (field_equi[0][k][5], field_angles[h][i][1]) == 0)
1486 {
1487 for (l=0; l<field_objects[1]; l++)
1488 {
1489 if (g_strcmp0 (field_equi[0][l][4], field_angles[h][i][2]) == 0)
1490 {
1491 print_this_angle (0, h, fid, inum, ub, field_equi[0][j][0], field_equi[0][k][0], field_equi[0][l][0], field_angles[h][i]);
1492 }
1493 }
1494 }
1495 }
1496 }
1497 }
1498 }
1499 else if (find_atom_id (1, field_angles[h][i][0]) == -10 && find_atom_id (1, field_angles[h][i][1]) == -10)
1500 {
1501 for (j=0; j<field_objects[2]; j++)
1502 {
1503 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][0]) == 0)
1504 {
1505 for (k=0; k<field_objects[2]; k++)
1506 {
1507 if (g_strcmp0 (field_equi[1][k][3], field_angles[h][i][1]) == 0)
1508 {
1509 print_this_angle (1, h, fid, inum, ub, field_equi[1][j][0], field_equi[1][k][0], field_angles[h][i][2], field_angles[h][i]);
1510 }
1511 }
1512 }
1513 }
1514 // End - Appex
1515 for (j=0; j<field_objects[1]; j++)
1516 {
1517 if (g_strcmp0 (field_equi[0][j][4], field_angles[h][i][0]) == 0)
1518 {
1519 for (k=0; k<field_objects[1]; k++)
1520 {
1521 if (g_strcmp0 (field_equi[0][k][5], field_angles[h][i][1]) == 0)
1522 {
1523 print_this_angle (0, h, fid, inum, ub, field_equi[0][j][0], field_equi[0][k][0], field_angles[h][i][2], field_angles[h][i]);
1524 }
1525 }
1526 }
1527 }
1528 }
1529 else if (find_atom_id (1, field_angles[h][i][0]) == -10 && find_atom_id (1, field_angles[h][i][2]) == -10)
1530 {
1531 for (j=0; j<field_objects[2]; j++)
1532 {
1533 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][0]) == 0)
1534 {
1535 for (k=0; k<field_objects[2]; k++)
1536 {
1537 if (g_strcmp0 (field_equi[1][k][3], field_angles[h][i][2]) == 0)
1538 {
1539 print_this_angle (1, h, fid, inum, ub, field_equi[1][j][0], field_angles[h][i][1], field_equi[1][k][0], field_angles[h][i]);
1540 }
1541 }
1542 }
1543 }
1544 // End - End
1545 for (j=0; j<field_objects[1]; j++)
1546 {
1547 if (g_strcmp0 (field_equi[0][j][4], field_angles[h][i][0]) == 0)
1548 {
1549 for (k=0; k<field_objects[1]; k++)
1550 {
1551 if (g_strcmp0 (field_equi[0][k][4], field_angles[h][i][2]) == 0)
1552 {
1553 print_this_angle (0, h, fid, inum, ub, field_equi[0][j][0], field_angles[h][i][1], field_equi[0][k][0], field_angles[h][i]);
1554 }
1555 }
1556 }
1557 }
1558 }
1559 else if (find_atom_id (1, field_angles[h][i][1]) == -10 && find_atom_id (1, field_angles[h][i][2]) == -10)
1560 {
1561 for (j=0; j<field_objects[2]; j++)
1562 {
1563 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][1]) == 0)
1564 {
1565 for (k=0; k<field_objects[2]; k++)
1566 {
1567 if (g_strcmp0 (field_equi[1][k][3], field_angles[h][i][2]) == 0)
1568 {
1569 print_this_angle (1, h, fid, inum, ub, field_angles[h][i][0], field_equi[1][j][0], field_equi[1][k][0], field_angles[h][i]);
1570 }
1571 }
1572 }
1573 }
1574 // Appex - End
1575 for (j=0; j<field_objects[1]; j++)
1576 {
1577 if (g_strcmp0 (field_equi[0][j][5], field_angles[h][i][1]) == 0)
1578 {
1579 for (k=0; k<field_objects[1]; k++)
1580 {
1581 if (g_strcmp0 (field_equi[0][k][4], field_angles[h][i][2]) == 0)
1582 {
1583 print_this_angle (0, h, fid, inum, ub, field_angles[h][i][0], field_equi[0][j][0], field_equi[0][k][0], field_angles[h][i]);
1584 }
1585 }
1586 }
1587 }
1588 }
1589 else if (find_atom_id (1, field_angles[h][i][0]) == -10)
1590 {
1591 for (j=0; j<field_objects[2]; j++)
1592 {
1593 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][0]) == 0)
1594 {
1595 print_this_angle (1, h, fid, inum, ub, field_equi[1][j][0], field_angles[h][i][1], field_angles[h][i][2], field_angles[h][i]);
1596 }
1597 }
1598 // End
1599 for (j=0; j<field_objects[1]; j++)
1600 {
1601 if (g_strcmp0 (field_equi[0][j][4], field_angles[h][i][0]) == 0)
1602 {
1603 print_this_angle (0, h, fid, inum, ub, field_equi[0][j][0], field_angles[h][i][1], field_angles[h][i][2], field_angles[h][i]);
1604 }
1605 }
1606 }
1607 else if (find_atom_id (1, field_angles[h][i][1]) == -10)
1608 {
1609 for (j=0; j<field_objects[2]; j++)
1610 {
1611 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][1]) == 0)
1612 {
1613 print_this_angle (1, h, fid, inum, ub, field_angles[h][i][0], field_equi[1][j][0], field_angles[h][i][2], field_angles[h][i]);
1614 }
1615 }
1616 // Appex
1617 for (j=0; j<field_objects[1]; j++)
1618 {
1619 if (g_strcmp0 (field_equi[0][j][5], field_angles[h][i][1]) == 0)
1620 {
1621 print_this_angle (0, h, fid, inum, ub, field_angles[h][i][0], field_equi[0][j][0], field_angles[h][i][2], field_angles[h][i]);
1622 }
1623 }
1624 }
1625 else if (find_atom_id (1, field_angles[h][i][2]) == -10)
1626 {
1627 for (j=0; j<field_objects[2]; j++)
1628 {
1629 if (g_strcmp0 (field_equi[1][j][3], field_angles[h][i][2]) == 0)
1630 {
1631 print_this_angle (1, h, fid, inum, ub, field_angles[h][i][0], field_angles[h][i][1], field_equi[1][j][0], field_angles[h][i]);
1632 }
1633 }
1634 // End
1635 for (j=0; j<field_objects[1]; j++)
1636 {
1637 if (g_strcmp0 (field_equi[0][j][4], field_angles[h][i][2]) == 0)
1638 {
1639 print_this_angle (0, h, fid, inum, ub, field_angles[h][i][0], field_angles[h][i][1], field_equi[0][j][0], field_angles[h][i]);
1640 }
1641 }
1642 }
1643 else
1644 {
1645 print_this_angle (-1, h, fid, inum, ub, field_angles[h][i][0], field_angles[h][i][1], field_angles[h][i][2], field_angles[h][i]);
1646 }
1647 for (j=0; j<2; j++)
1648 {
1649 if (the_angles[j])
1650 {
1651 tmpan = the_angles[j];
1652 while (tmpan -> next)
1653 {
1654 tmpan = tmpan -> next;
1655 g_free (tmpan -> prev);
1656 }
1657 g_free (tmpan);
1658 the_angles[j] = NULL;
1659 }
1660 }
1661 }
1662 }
1663 else*/
1664 {
1665 for (i=0; i<field_objects[inum+h]; i++)
1666 {
1667 print_this_angle (-1, h, fid, inum, ub, field_angles[h][i][0], field_angles[h][i][1], field_angles[h][i][2], field_angles[h][i]);
1668 }
1669 }
1670 fprintf (fp, " </%s>\n", aode[h]);
1671 }
1672 }
1673}
1674
1683void print_dihedral_table (int fid, int inum)
1684{
1685 int h, i, j;
1686 gchar * dode[2] = {"dihedrals-c", "dihedrals-ccc"};
1687 gchar * node[2] = {"dih-c", "dih-ccc"};
1688 gchar * desc[2] = {"Dihedrals / torsions:\n\n V(Phi) = K x (1 + cos(n x Phi - Phi0))\n"
1689 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Phi = dihedral angle (°)\n - n = multiplicity\n - Phi0 = phase shift angle (°)",
1690 "Dihedrals / torsions\n\n V(Phi) = K x (Phi - Phi0)^2 + K' x (Phi - Phi0)^3 + K'' x (Phi - Phi0)^4\n"
1691 " With:\n - K, K' and K'' = nth order spring constant (kcal mol^-1 rad^-nth)\n - Phi = dihedral angle (°)\n - Phi0 = phase shift angle (°)"};
1692 for (h=0; h<2; h++)
1693 {
1694 if (field_objects[inum+h])
1695 {
1696 fprintf (fp, " <%s>\n", dode[h]);
1697 fprintf (fp, " <!-- %s -->\n", desc[h]);
1698 for (i=0; i<field_objects[inum+h]; i++)
1699 {
1700 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 4, field_dihedrals[h][i][0]));
1701 gchar * bbb = g_strdup_printf ("%s", find_atom_key(fid, 4, field_dihedrals[h][i][1]));
1702 gchar * ccc = g_strdup_printf ("%s", find_atom_key(fid, 4, field_dihedrals[h][i][2]));
1703 gchar * ddd = g_strdup_printf ("%s", find_atom_key(fid, 4, field_dihedrals[h][i][3]));
1704 fprintf (fp, " <%s a=\"%d\" b=\"%d\" c=\"%d\" d=\"%d\" z_a=\"%d\" z_b=\"%d\" z_c=\"%d\" z_d=\"%d\"",
1705 node[h], find_atom_id (1, aaa), find_atom_id (1, bbb), find_atom_id (1, ccc), find_atom_id (1, ddd),
1706 find_atom_z (aaa), find_atom_z (bbb), find_atom_z (ccc), find_atom_z (ddd));
1707 g_free (aaa);
1708 g_free (bbb);
1709 g_free (ccc);
1710 g_free (ddd);
1711 switch (h)
1712 {
1713 case 0:
1714 if (fid < 4)
1715 {
1716 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\" n=\"%f\"", string_to_double ((gpointer)field_dihedrals[h][i][5]) / string_to_double ((gpointer)field_dihedrals[h][i][4]),
1717 string_to_double ((gpointer)field_dihedrals[h][i][6]), string_to_double ((gpointer)field_dihedrals[h][i][7]));
1718 j = 8;
1719 }
1720 else
1721 {
1722 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\" n=\"%f\"", string_to_double ((gpointer)field_dihedrals[h][i][4]), string_to_double ((gpointer)field_dihedrals[h][i][6]),
1723 string_to_double ((gpointer)field_dihedrals[h][i][5]));
1724 j = 7;
1725 }
1726 break;
1727 case 1:
1728 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\" KK=\"%f\" KKK=\"%f\"", string_to_double ((gpointer)field_dihedrals[h][i][4]), string_to_double ((gpointer)field_dihedrals[h][i][5]),
1729 string_to_double ((gpointer)field_dihedrals[h][i][6]), string_to_double ((gpointer)field_dihedrals[h][i][8]));
1730 j = 10;
1731 break;
1732 }
1733 if (field_dim[inum+h] > j)
1734 {
1735 fprintf (fp, " info=\"%s\"", field_dihedrals[h][i][j]);
1736 }
1737 fprintf (fp, "/>\n");
1738 }
1739 fprintf (fp, " </%s>\n", dode[h]);
1740 }
1741 }
1742}
1743
1752void print_improper_table (int fid, int inum)
1753{
1754 int i, j;
1755 gchar * desc[2] = {"Impropers:\n\n V(Phi) = K x (1 + cos(n x Phi - Phi0))\n"
1756 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Phi = angle (°)\n - n = multiplicity\n - Phi0 = equilibrium angle (°)",
1757 "Impropers: V(Phi) = K x (Phi - Phi0)^2\n\n"
1758 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Phi = angle (°)\n - Phi0 = equilibrium angle (°)"};
1759 int wid = (fid < 4 || fid == OPLSAAP || fid == OPLSAAR) ? 3 : 2;
1760 if (field_objects[inum])
1761 {
1762 fprintf (fp, " <impropers>\n");
1763 fprintf (fp, " <!-- %s -->\n", desc[wid == 3 ? 0 : 1]);
1764 for (i=0; i<field_objects[inum]; i++)
1765 {
1766 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 5, (fid > AMBER99 && fid < CVFF) ? field_impropers[i][0]: field_impropers[i][1]));
1767 gchar * bbb = g_strdup_printf ("%s", find_atom_key(fid, 5, (fid > AMBER99 && fid < CVFF) ? field_impropers[i][1]: field_impropers[i][0]));
1768 gchar * ccc = g_strdup_printf ("%s", find_atom_key(fid, 5, field_impropers[i][2]));
1769 gchar * ddd = g_strdup_printf ("%s", find_atom_key(fid, 5, field_impropers[i][3]));
1770 fprintf (fp, " <imp a=\"%d\" b=\"%d\" c=\"%d\" d=\"%d\" z_a=\"%d\" z_b=\"%d\" z_c=\"%d\" z_d=\"%d\"",
1771 find_atom_id (1, aaa), find_atom_id (1, bbb), find_atom_id (1, ccc), find_atom_id (1, ddd),
1772 find_atom_z (aaa), find_atom_z (bbb), find_atom_z (ccc), find_atom_z (ddd));
1773 g_free (aaa);
1774 g_free (bbb);
1775 g_free (ccc);
1776 g_free (ddd);
1777 if (fid < 4)
1778 {
1779 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\" n=\"%f\"", string_to_double ((gpointer)field_impropers[i][4]), string_to_double ((gpointer)field_impropers[i][5]), string_to_double ((gpointer)field_impropers[i][6]));
1780 j = 7;
1781 }
1782 else if (wid == 3)
1783 {
1784 fprintf (fp," K=\"%f\" Phi_zero=\"%f\" n=\"%f\"", string_to_double ((gpointer)field_impropers[i][4]), string_to_double ((gpointer)field_impropers[i][6]), string_to_double ((gpointer)field_impropers[i][5]));
1785 j = 7;
1786 }
1787 else if (fid > AMBER99 && fid < CVFF)
1788 {
1789 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\"", string_to_double ((gpointer)field_impropers[i][4]), string_to_double ((gpointer)field_impropers[i][6]));
1790 j = 7;
1791 }
1792 else
1793 {
1794 fprintf (fp, " K=\"%f\" Phi_zero=\"%f\"", string_to_double ((gpointer)field_impropers[i][4]), string_to_double ((gpointer)field_impropers[i][5]));
1795 j = 6;
1796 }
1797 if (field_dim[inum] > j)
1798 {
1799 fprintf (fp, " info=\"%s\"", field_impropers[i][j]);
1800 }
1801 fprintf (fp, "/>\n");
1802 }
1803 fprintf (fp, " </impropers>\n");
1804 }
1805}
1806
1815void print_inversion_table (int fid, int inum)
1816{
1817 int i;
1818 gchar * desc = {"Inversions\n 0= Key_a, 1= Key_b, 2= Key_c, 3= Key_d, 4= K, 5= Phi0, 7= FF info\n\n V(φ) = K x (Phi - Phi0)^2\n"
1819 " With:\n - K = spring constant (kcal mol^-1 rad^-2)\n - Phi = angle (°)\n - Phi0 = equilibrium angle (°)"};
1820 if (field_objects[inum])
1821 {
1822 fprintf (fp, " <inversions>\n");
1823 fprintf (fp, " <!-- %s -->\n", desc);
1824 for (i=0; i<field_objects[inum]; i++)
1825 {
1826 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 5, field_inversions[i][1]));
1827 gchar * bbb = g_strdup_printf ("%s", find_atom_key(fid, 5, field_inversions[i][0]));
1828 gchar * ccc = g_strdup_printf ("%s", find_atom_key(fid, 5, field_inversions[i][2]));
1829 gchar * ddd = g_strdup_printf ("%s", find_atom_key(fid, 5, field_inversions[i][3]));
1830 fprintf (fp, " <inv a=\"%d\" b=\"%d\" c=\"%d\" d=\"%d\" z_a=\"%d\" z_b=\"%d\" z_c=\"%d\" z_d=\"%d\" K=\"%f\" Phi_zero=\"%f\"",
1831 find_atom_id (1, aaa), find_atom_id (1, bbb), find_atom_id (1, ccc), find_atom_id (1, ddd),
1832 find_atom_z (aaa), find_atom_z (bbb), find_atom_z (ccc), find_atom_z (ddd),
1833 string_to_double ((gpointer)field_inversions[i][4]), string_to_double ((gpointer)field_inversions[i][5]));
1834 g_free (aaa);
1835 g_free (bbb);
1836 g_free (ccc);
1837 g_free (ddd);
1838 if (field_dim[inum] > 6)
1839 {
1840 fprintf (fp, " info=\"%s\"", field_inversions[i][6]);
1841 }
1842 fprintf (fp, "/>\n");
1843 }
1844 fprintf (fp, " </inversions>\n");
1845 }
1846}
1847
1856void print_vdw_table (int fid, int inum)
1857{
1858 int i, j, k, l;
1859 gchar * desc[3] = {"Non-bonded 12-6\n 0= Key_a, 1= Epslion, 2= R0 (A), 3= FF info\n\n Non-bonded (12-6): V(rij) = Epslion(ij) x [(R0(ij)/rij)^12 - 2 x (R0(ij)/rij)^6]\n"
1860 " With:\n"
1861 " Epslion(ij) = sqrt(Epslion(i) x Epslion(j)) and Epslion(i) (kcal mol^-1)\n"
1862 " R0(ij)= (R0(i) + R0(j))/2 and R0(i) (A)\n",
1863 "Non-bonded 12-6\n 0= Key_a, 1= A, 2= B, 3= FF info\n\n Non-bonded (12-6): V(rij) = A(ij)/rij^12 - B(ij)/rij^6\n"
1864 " With:\n"
1865 " A(ij) = sqrt(Ai x Aj)\n"
1866 " B(ij) = sqrt(Bi x Bj)\n",
1867 "Non-bonded 9-6\n 0= Key_a, 1= Epslion, 2= R0 (A), 3= FF info\n\n Non-bonded (9-6): V(rij) = Epslion(ij) x [2 x (R0(ij)/rij)^9 - 3 x (R0(ij)/rij)^6]\n"
1868 " With:\n"
1869 " Epslion(ij) = 2 x sqrt(Epslion(i) x Epslion(j)) x R0(i)^3 x R0(j)^3 / [ R0(i)^6 + R0(j)^6 ] and Epslion(i) (kcal mol^-1)\n"
1870 " R0(ij)= ((R0(i)^6 + R0(j)^6)/2) ^ 1/6 and R0(i) (A)\n"};
1871
1872 int wid = ((fid >= CHARMM22P && fid <= CHARMMSI) || (fid >= OPLSAAP)) ? 1 : 0;
1873 int did = (fid <= CHARMMSI || fid >= OPLSAAP) ? 0 : (fid == CVFF || fid == CVFF_AUG) ? 1 : 2;
1874 int cid = (fid > COMPASS) ? 1 : 0;
1875 int wdi[2] = {2, 4};
1876 if (field_objects[inum])
1877 {
1878 fprintf (fp, " <non-bonded>\n");
1879 fprintf (fp, " <!-- %s -->\n", desc[did]);
1880 for (i=0; i<field_objects[inum]; i++)
1881 {
1882 gchar * aaa = g_strdup_printf ("%s", find_atom_key(fid, 1, field_vdw[i][0]));
1883 fprintf (fp, " <non-bd a=\"%d\" z_a=\"%d\"", find_atom_id (0, aaa), find_atom_z (aaa));
1884 g_free (aaa);
1885 if (did == 1)
1886 {
1887 fprintf (fp, " A=\"%f\" B= \"%f\"", string_to_double ((gpointer)field_vdw[i][1]), string_to_double ((gpointer)field_vdw[i][2]));
1888 }
1889 else
1890 {
1891 if (fid <= AMBER99)
1892 {
1893 fprintf (fp, " Ei=\"%f\" Ri=\"%f\"", string_to_double ((gpointer)field_vdw[i][2]), string_to_double ((gpointer)field_vdw[i][1]));
1894 }
1895 else
1896 {
1897 fprintf (fp, " Ei=\"%f\" Ri=\"%f\"", string_to_double ((gpointer)field_vdw[i][1+cid]), string_to_double ((gpointer)field_vdw[i][2+cid]));
1898 }
1899 if ((fid >= CHARMM22P && fid <= CHARMMSI) || fid > COMPASS)
1900 {
1901 fprintf (fp, " Eii=\"%f\" Rii=\"%f\"", string_to_double ((gpointer)field_vdw[i][3+2*cid]), string_to_double ((gpointer)field_vdw[i][4+2*cid]));
1902 }
1903 }
1904 j = wdi[wid]+1+2*cid;
1905
1906 if (field_dim[inum] > j)
1907 {
1908 fprintf (fp, " info=\"%s\"", field_vdw[i][j]);
1909 }
1910 fprintf (fp, "/>\n");
1911 if (fid <= AMBER99)
1912 {
1913 for (k=0; k<field_objects[1]; k++)
1914 {
1915 if (g_strcmp0 (field_equi[0][k][0], field_vdw[i][0]) == 0)
1916 {
1917 for (l=1; l<field_dim[1]; l++)
1918 {
1919 if(g_strcmp0 (field_equi[0][k][l], " ") != 0)
1920 {
1921 fprintf (fp, " <non-bd a=\"%d\" z_a=\"%d\"", find_atom_id (0, field_equi[0][k][l]), find_atom_z (field_vdw[i][0]));
1922 fprintf (fp, " Ei=\"%f\" Ri=\"%f\"", string_to_double ((gpointer)field_vdw[i][2]), string_to_double ((gpointer)field_vdw[i][1]));
1923 if (field_dim[inum] > j)
1924 {
1925 fprintf (fp, " info=\"Equi. to %s\"", field_vdw[i][0]);
1926 }
1927 fprintf (fp, "/>\n");
1928 }
1929 }
1930 }
1931 }
1932 }
1933 }
1934 fprintf (fp, " </non-bonded>\n");
1935 }
1936}
1937
1938
1939field_object_match * field_objects_id[6] = {NULL, NULL, NULL, NULL, NULL, NULL};
1941
1942char *** ff_atoms;
1943// 0 = Quadratic, 1 = Quartic, 2 = Morse
1944
1951
1957
1964{
1965 int i, j, k, l;
1966 atoms_id = allocint (tmp_proj -> nspec);
1967 extraz_id = allocdint (5, tmp_proj -> nspec);
1968 atoms_id_list = g_malloc0(tmp_proj -> nspec*sizeof*atoms_id_list);
1969 k = 0;
1970 for (i=0; i<tmp_proj -> nspec; i++)
1971 {
1972 atoms_id[i] = 0;
1973#ifdef DEBUG
1974 g_debug ("Searching field atoms for spec: %d, label= %s, z= %d", i, tmp_proj -> chemistry -> label[i], (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i]);
1975#endif
1976 for (j=0; j<ff_objects[0]; j++)
1977 {
1978 if (g_strcmp0 (exact_name(tmp_proj -> chemistry -> label[i]), exact_name(ff_atoms[j][0])) == 0)
1979 {
1980 atoms_id[i] ++;
1981 }
1982 }
1983 if (atoms_id[i] > 0) k ++;
1984 }
1985 for (i=0; i<tmp_proj -> nspec; i++)
1986 {
1987#ifdef DEBUG
1988 g_debug ("For spec: %d, number of match = %d", i, atoms_id[i]);
1989#endif
1990 if (atoms_id[i])
1991 {
1992 atoms_id_list[i] = g_malloc0(atoms_id[i]*sizeof*atoms_id_list[i]);
1993 l = 0;
1994 for (j=0; j<ff_objects[0]; j++)
1995 {
1996 if (g_strcmp0 (exact_name(tmp_proj -> chemistry -> label[i]), exact_name(ff_atoms[j][0])) == 0)
1997 {
1998 atoms_id_list[i][l] = j;
1999 l ++;
2000 }
2001 }
2002 }
2003 }
2004 return k;
2005}
2006
2008
2018gboolean is_a_match (int * data, int num, int val[4])
2019{
2020 int i;
2021 for (i=0; i<num; i++)
2022 {
2023 if (data[i] == -1) is_extra = 1;
2024 if (data[i] != val[i] && data[i] != -1) return FALSE;
2025 }
2026 return TRUE;
2027}
2028
2046void find_object_ijkl (int hid, int foid, int oid, int sa, int za, int sb, int zb, int sc, int zc, int sd, int zd)
2047{
2048 int h, i;
2049 int val[4];
2050 val[0] = za;
2051 val[1] = zb;
2052 val[2] = zc;
2053 val[3] = zd;
2054 gboolean do_this_id, save_this_id;
2055 field_object_match * test_obj_id;
2056 for (h=0; h<2+hid; h++)
2057 {
2058 if (ff_objects[h+foid] > 0)
2059 {
2060 for (i=0; i<ff_objects[h+foid]; i++)
2061 {
2062 do_this_id = FALSE;
2063 is_extra = 0;
2064 switch (oid+2)
2065 {
2066 case FBDS:
2067 do_this_id = is_a_match (ff_bonds[h] -> atoms_z[i], 2, val);
2068 break;
2069 case FANG:
2070 do_this_id = is_a_match (ff_angles[h] -> atoms_z[i], 3, val);
2071 break;
2072 case FDIH:
2073 do_this_id = is_a_match (ff_dih[h] -> atoms_z[i], 4, val);
2074 break;
2075 case FIMP:
2076 do_this_id = is_a_match (ff_imp -> atoms_z[i], 4, val);
2077 break;
2078 case FINV:
2079 do_this_id = is_a_match (ff_inv -> atoms_z[i], 4, val);
2080 break;
2081 case FNBD:
2082 do_this_id = is_a_match (ff_vdw -> atoms_z[i], 1, val);
2083 break;
2084 default:
2085 break;
2086 }
2087 if (do_this_id)
2088 {
2089 save_this_id = TRUE;
2090 if (field_objects_id[oid])
2091 {
2092 test_obj_id = field_objects_id[oid];
2093 while (test_obj_id != NULL)
2094 {
2095 if (test_obj_id -> type == h && test_obj_id -> oid == i)
2096 {
2097 save_this_id = FALSE;
2098 break;
2099 }
2100 test_obj_id = test_obj_id -> next;
2101 }
2102 if (save_this_id)
2103 {
2104 tmp_obj_id -> next = g_malloc0(sizeof*tmp_obj_id -> next);
2105 tmp_obj_id -> next -> id = tmp_obj_id -> id + 1;
2106 tmp_obj_id = tmp_obj_id -> next;
2107 }
2108 }
2109 else
2110 {
2111 field_objects_id[oid] = g_malloc0(sizeof*field_objects_id[oid]);
2113 }
2114 if (save_this_id)
2115 {
2116 // if (oid == 3) g_debug ("Saving Impropers, sa= %d, sb= %d, sc= %d, sd= %d", sa, sb, sc, sd);
2117 tmp_obj_id -> obj = oid;
2118 tmp_obj_id -> type = h;
2119 tmp_obj_id -> oid = i;
2120 if (oid < 5)
2121 {
2122 if (sa > -1) extraz_id[oid][sa] += is_extra;
2123 if (sb > -1) extraz_id[oid][sb] += is_extra;
2124 if (sc > -1) extraz_id[oid][sc] += is_extra;
2125 if (sd > -1) extraz_id[oid][sd] += is_extra;
2126 }
2127 }
2128 }
2129 }
2130 }
2131 }
2132}
2133
2140{
2141 int i, j, k, l;
2142 for (i=0; i<tmp_proj -> nspec-1; i++)
2143 {
2144 if (atoms_id[i] > 0)
2145 {
2146 for (j=i+1; j<tmp_proj -> nspec; j++)
2147 {
2148 if (atoms_id[j] > 0)
2149 {
2150 k = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i];
2151 l = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][j];
2152 find_object_ijkl (1, 1, 0, i, k, j, l, -1, -1, -1, -1);
2153 find_object_ijkl (1, 1, 0, j, l, i, k, -1, -1, -1, -1);
2154 }
2155 }
2156 }
2157 }
2158 for (i=0; i<tmp_proj -> nspec; i++)
2159 {
2160 if (atoms_id[i] > 0)
2161 {
2162 k = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i];
2163 find_object_ijkl (1, 1, 0, i, k, i, k, -1, -1, -1, -1);
2164 }
2165 }
2166}
2167
2174{
2175 int i, j, k, l, m, n;
2176 for (i=0; i<tmp_proj -> nspec; i++)
2177 {
2178 if (atoms_id[i] > 0)
2179 {
2180 l = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i];
2181 for (j=0; j<tmp_proj -> nspec; j++)
2182 {
2183 if (atoms_id[j] > 0)
2184 {
2185 m = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][j];
2186 for (k=0; k<tmp_proj -> nspec; k++)
2187 {
2188 if (atoms_id[k] > 0)
2189 {
2190 n = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][k];
2191 find_object_ijkl (0, 4, 1, i, l, j, m, k, n, -1, -1);
2192 }
2193 }
2194 }
2195 }
2196 }
2197 }
2198}
2199
2208{
2209 int i, j, k, l, m, n, o, p, q;
2210 for (i=0; i<tmp_proj -> nspec; i++)
2211 {
2212 if (atoms_id[i] > 0)
2213 {
2214 m = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i];
2215 for (j=0; j<tmp_proj -> nspec; j++)
2216 {
2217 if (atoms_id[j] > 0)
2218 {
2219 n = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][j];
2220 for (k=0; k<tmp_proj -> nspec; k++)
2221 {
2222 if (atoms_id[k] > 0)
2223 {
2224 o = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][k];
2225 for (l=0; l<tmp_proj -> nspec; l++)
2226 {
2227 if (atoms_id[l] > 0)
2228 {
2229 p = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][l];
2230 q = (id) ? 1 : 0;
2231 find_object_ijkl (-q, 6+q*2+q*(id-1), 2+id, i, m, j, n, k, o, l, p);
2232 }
2233 }
2234 }
2235 }
2236 }
2237 }
2238 }
2239 }
2240}
2241
2248{
2249 int i, j;
2250 for (i=0; i<tmp_proj -> nspec; i++)
2251 {
2252 if (atoms_id[i] > 0)
2253 {
2254 j = (int)tmp_proj -> chemistry -> chem_prop[CHEM_Z][i];
2255 find_object_ijkl (-1, 10, 5, i, j, -1, -1, -1, -1, -1, -1);
2256 }
2257 }
2258}
2259
2260
2261#ifdef DEBUG
2269void print_all (int oid)
2270{
2271 gchar * prop[7] = {"atom", "bond", "angle", "dihedral", "improper", "inversion", "vdw"};
2272 g_debug ("Field %s found: %d", prop[oid-1], tmp_obj_id -> id+1);
2273 while (tmp_obj_id != NULL)
2274 {
2275 g_debug (" %s N° %d: h= %d, oid= %d", prop[oid-1], tmp_obj_id -> id+1, tmp_obj_id -> type, tmp_obj_id -> oid);
2276 tmp_obj_id = tmp_obj_id -> next;
2277 }
2278}
2279#endif
2280
2289float get_force_field_atom_mass (int sp, int num)
2290{
2291 g_debug ("sp= %d, atoms_id[%d]= %d, num= %d", sp, sp, atoms_id[sp], num);
2292 if (atoms_id[sp] > 0 && num >= 0 && num <= atoms_id[sp])
2293 {
2294 return string_to_double ((gpointer)ff_atoms[atoms_id_list[sp][num]][1]);
2295 }
2296 else
2297 {
2298 return 0.0;
2299 }
2300}
2301
2302#ifdef USE_ATOMS
2303
2305
2314void clean_this_field_data (xmlDoc * doc, xmlTextReaderPtr reader)
2315{
2316 clean_xml_data (doc, reader);
2317 if (filetoread) g_free (filetoread);
2318 filetoread = NULL;
2319 if (ff_objects) g_free (ff_objects);
2320 ff_objects = NULL;
2321 if (ff_dim) g_free (ff_dim);
2322 ff_dim = NULL;
2323 if (ff_key) g_free (ff_key);
2324 ff_key = NULL;
2325 if (ff_info) g_free (ff_info);
2326 ff_info = NULL;
2327 int i;
2328 for (i=0; i<3; i++)
2329 {
2330 if (i < 2)
2331 {
2332 if (ff_angles[i])
2333 {
2334 g_free (ff_angles[i]);
2335 ff_angles[i] = NULL;
2336 }
2337 if (ff_dih[i])
2338 {
2339 g_free (ff_dih[i]);
2340 ff_dih[i] = NULL;
2341 }
2342 }
2343 if (ff_bonds[i])
2344 {
2345 g_free (ff_bonds[i]);
2346 ff_bonds[i] = NULL;
2347 }
2348 }
2349 if (ff_imp)
2350 {
2351 g_free (ff_imp);
2352 ff_imp = NULL;
2353 }
2354 if (ff_inv)
2355 {
2356 g_free (ff_inv);
2357 ff_inv = NULL;
2358 }
2359 if (ff_vdw)
2360 {
2361 g_free (ff_vdw);
2362 ff_vdw = NULL;
2363 }
2364}
2365
2373gchar * open_field_file (int field)
2374{
2375 int i, j;
2376 xmlDoc * doc;
2377 xmlTextReaderPtr reader;
2378 xmlNodePtr racine, f_node;
2379 xmlNodePtr n_node, m_node, o_node;
2381 xmlAttrPtr prop;
2382 xmlChar * content;
2383 const xmlChar fml[7]="ff-xml";
2384 gchar * data_nodes[11]={"atoms", "bonds-h", "bonds-q", "bonds-m", "angles-h", "angles-q",
2385 "dihedrals-c", "dihedrals-ccc", "impropers", "inversions", "non-bonded"};
2386 gchar * data_n[11]={"at", "bd-h", "bd-q", "bd-m", "ang-h", "ang-q",
2387 "dih-c", "dih-ccc", "imp", "inv", "non-bd"};
2388 gchar * str;
2389 filetoread = NULL;
2390 ff_objects = NULL;
2391 ff_dim = NULL;
2392 ff_key = NULL;
2393 ff_info = NULL;
2394 ff_unit = -1;
2395 gchar * force_field_name;
2396 gboolean setinfo;
2397 int odim[10] = {2, 2, 2, 3, 3, 4, 4, 4, 4, 1};
2398 /*
2399 * build an xmlReader for that file
2400 */
2401
2402#ifdef G_OS_WIN32
2403 filetoread = g_strdup_printf ("%s\\force_fields\\%s.ffl", PACKAGE_LIB_DIR, field_ffl[field]);
2404#else
2405 filetoread = g_strdup_printf ("%s/force_fields/%s.ffl", PACKAGE_LIB_DIR, field_ffl[field]);
2406#endif
2407
2408 reader = xmlReaderForFile(filetoread, NULL, 0);
2409 if (reader == NULL)
2410 {
2411 g_warning ("Error reading FF file %s, reader error ?!", filetoread);
2412 return NULL;
2413 }
2414 else
2415 {
2416 doc = xmlParseFile(filetoread);
2417 if (doc == NULL)
2418 {
2419 g_warning ("Error reading FF file %s, xmlParsing error ?!", filetoread);
2420 clean_this_field_data (doc, reader);
2421 return NULL;
2422 }
2423 racine = xmlDocGetRootElement(doc);
2424 if (racine == NULL)
2425 {
2426 g_warning ("Error reading FF file %s, missing XML root node ?!", filetoread);
2427 clean_this_field_data (doc, reader);
2428 return NULL;
2429 }
2430 if (g_strcmp0 ((char *)(racine -> name), (char *)fml) != 0)
2431 {
2432 g_warning ("Error reading FF file %s, missing ff-xml node ?!", filetoread);
2433 clean_this_field_data (doc, reader);
2434 return NULL;
2435 }
2436 // nodes :: field-name, data, atoms, bonds, angles, dihedrals, impropers, inversons, non-bonded, bond-inc ?
2437 f_node = findnode (racine -> children, "force-field");
2438 if (f_node == NULL)
2439 {
2440 g_warning ("Error reading FF file %s, missing force field node ?!", filetoread);
2441 clean_this_field_data (doc, reader);
2442 return NULL;
2443 }
2444 content = xmlNodeGetContent(f_node);
2445 force_field_name = g_strdup_printf ("%s", content);
2446 xmlFree (content);
2447 f_node = findnode (racine -> children, "units");
2448 if (f_node == NULL)
2449 {
2450 g_warning ("Error reading FF file %s, missing units node ?!", filetoread);
2451 clean_this_field_data (doc, reader);
2452 return NULL;
2453 }
2454 content = xmlNodeGetContent(f_node);
2455 str = g_strdup_printf ("%s", content);
2456 xmlFree (content);
2457 for (i=0; i<4;i++)
2458 {
2459 if (g_strcmp0 (str, fnames[activef][0][i]) == 0)
2460 {
2461 ff_unit = i;
2462 break;
2463 }
2464 }
2465 if (ff_unit < 0)
2466 {
2467 g_warning ("Error reading FF file %s, units, ff_unit = %d < 0 ?!", filetoread, ff_unit);
2468 clean_this_field_data (doc, reader);
2469 return NULL;
2470 }
2471 f_node = findnode (racine -> children, "ff-data");
2472 if (f_node == NULL)
2473 {
2474 g_warning ("Error reading FF file %s, missing ff-data node ?!", filetoread);
2475 clean_this_field_data (doc, reader);
2476 return NULL;
2477 }
2478 ff_objects = g_malloc0(11*sizeof*ff_objects);
2479 ff_dim = g_malloc0(11*sizeof*ff_dim);
2480 //ff_info = g_malloc0(11*sizeof*ff_key);
2481 ff_key = g_malloc0(10*sizeof*ff_key);
2482 for (i=0; i<11; i++)
2483 {
2484 m_node = findnode (f_node -> children, data_nodes[i]);
2485 if (m_node == NULL)
2486 {
2487 g_warning ("Error reading FF file %s, ff-data, i= %d, missing node ?!", filetoread, i);
2488 clean_this_field_data (doc, reader);
2489 return NULL;
2490 }
2491 content = xmlNodeGetContent(m_node);
2492 ff_objects[i] = (int)string_to_double ((gpointer)content);
2493 xmlFree (content);
2494 if (ff_objects[i] < 0)
2495 {
2496 g_warning ("Error reading FF file %s, ff-data, ff_objects[%d] = %d < 0 ?!", filetoread, i, ff_objects[i]);
2497 clean_this_field_data (doc, reader);
2498 return NULL;
2499 }
2500 else if (ff_objects[i])
2501 {
2502 prop = m_node -> properties;
2503 if (prop == NULL)
2504 {
2505 g_warning ("Error reading FF file %s, ff-data, i= %d, missing node prop ?!", filetoread, i);
2506 clean_this_field_data (doc, reader);
2507 return NULL;
2508 }
2509 while (prop)
2510 {
2511 o_node = prop -> children;
2512 if (o_node == NULL)
2513 {
2514 g_warning ("Error reading FF file %s, ff-data, i= %d, missing prop data ?!", filetoread, i);
2515 clean_this_field_data (doc, reader);
2516 return NULL;
2517 }
2518 content = xmlNodeGetContent(o_node);
2519 if (g_strcmp0 ("dim",(char *)prop -> name) == 0)
2520 {
2521 ff_dim[i] = (int) string_to_double ((gpointer)content);
2522 }
2523 /*else if (g_strcmp0 ("info",(char *)prop -> name) == 0)
2524 {
2525 ff_info[i] = (int)string_to_double ((gpointer)content);
2526 }*/
2527 else if (g_strcmp0 ("pot",(char *)prop -> name) == 0)
2528 {
2529 ff_key[i-1] = (int)string_to_double ((gpointer)content);
2530 }
2531 xmlFree (content);
2532 prop = prop -> next;
2533 }
2534 }
2535 }
2536 for (i=0; i<11; i++)
2537 {
2538 if (ff_objects[i])
2539 {
2540 f_node = findnode (racine -> children, data_nodes[i]);
2541 if (f_node == NULL)
2542 {
2543 g_warning ("Error reading FF file %s, i= %d, missing node ?!", filetoread, i);
2544 clean_this_field_data (doc, reader);
2545 return NULL;
2546 }
2547 n_node = f_node -> children;
2548 if (n_node == NULL)
2549 {
2550 g_warning ("Error reading FF file %s, i= %d, missing child node ?!", filetoread, i);
2551 clean_this_field_data (doc, reader);
2552 return NULL;
2553 }
2554 if (i == 0)
2555 {
2556 ff_atoms = g_malloc0(ff_objects[0]*sizeof*ff_atoms);
2557 for (j=0; j<ff_objects[0]; j++)
2558 {
2559 ff_atoms[j] = g_malloc0(ff_dim[0]*sizeof*ff_atoms[j]);
2560 }
2561 }
2562 else if (i < 4)
2563 {
2564 ff_bonds[i-1] = g_malloc0(sizeof*ff_bonds[i-1]);
2565 ff_data = ff_bonds[i-1];
2566 }
2567 else if (i < 6)
2568 {
2569 ff_angles[i-4] = g_malloc0(sizeof*ff_angles[i-4]);
2570 ff_data = ff_angles[i-4];
2571 }
2572 else if (i < 8)
2573 {
2574 ff_dih[i-6] = g_malloc0(sizeof*ff_dih[i-6]);
2575 ff_data = ff_dih[i-6];
2576 }
2577 else if (i == 8)
2578 {
2579 ff_imp = g_malloc0(sizeof*ff_imp);
2580 ff_data = ff_imp;
2581 }
2582 else if (i == 9)
2583 {
2584 ff_inv = g_malloc0(sizeof*ff_inv);
2585 ff_data = ff_inv;
2586 }
2587 else if (i == 10)
2588 {
2589 ff_vdw = g_malloc0(sizeof*ff_vdw);
2590 ff_data = ff_vdw;
2591 }
2592 if (i > 0)
2593 {
2594 ff_data -> atoms_z = g_malloc0(ff_objects[i]*sizeof*ff_data -> atoms_z);
2595 ff_data -> atoms_id = g_malloc0(ff_objects[i]*sizeof*ff_data -> atoms_id);
2596 ff_data -> npar = ff_dim[i];
2597 ff_data -> key = ff_key[i-1];
2598 ff_data -> param = g_malloc0(ff_objects[i]*sizeof*ff_data -> param);
2599 for (j=0; j<ff_objects[i]; j++)
2600 {
2601 ff_data -> atoms_z[j] = g_malloc0(odim[i-1]*sizeof*ff_data -> atoms_z[j]);
2602 ff_data -> atoms_id[j] = g_malloc0(odim[i-1]*sizeof*ff_data -> atoms_id[j]);
2603 ff_data -> param[j] = g_malloc0(ff_dim[i]*sizeof*ff_data -> param[j]);
2604 }
2605 ff_data -> info = g_malloc0(ff_objects[i]*sizeof*ff_data -> info);
2606 }
2607 setinfo = FALSE;
2608 for (j=0; j<ff_objects[i]; j++)
2609 {
2610 n_node = findnode (n_node, data_n[i]);
2611 if (n_node == NULL)
2612 {
2613 g_warning ("Error reading FF file %s, i= %d, j= %d, missing node ?!", filetoread, i, j);
2614 clean_this_field_data (doc, reader);
2615 return NULL;
2616 }
2617 prop = n_node -> properties;
2618 if (prop == NULL)
2619 {
2620 g_warning ("Error reading FF file %s, i= %d, j= %d, missing prop ?!", filetoread, i, j);
2621 clean_this_field_data (doc, reader);
2622 return NULL;
2623 }
2624 while (prop)
2625 {
2626 o_node = prop -> children;
2627 if (o_node == NULL)
2628 {
2629 g_warning ("Error reading FF file %s, i= %d, j= %d, missing prop node ?!", filetoread, i, j);
2630 clean_this_field_data (doc, reader);
2631 return NULL;
2632 }
2633 content = xmlNodeGetContent(o_node);
2634 switch (i)
2635 {
2636 case 0:
2637 if (g_strcmp0 ("label",(char *)prop -> name) == 0)
2638 {
2639 ff_atoms[j][0] = g_strdup_printf ("%s", content);
2640 }
2641 else if (g_strcmp0 ("mass",(char *)prop -> name) == 0)
2642 {
2643 ff_atoms[j][1] = g_strdup_printf ("%s", content);
2644 }
2645 else if (g_strcmp0 ("key",(char *)prop -> name) == 0)
2646 {
2647 ff_atoms[j][2] = g_strdup_printf ("%s", content);
2648 }
2649 else if (g_strcmp0 ("info",(char *)prop -> name) == 0)
2650 {
2651 ff_atoms[j][3] = g_strdup_printf ("%s", content);
2652 }
2653 else
2654 {
2655 g_warning ("Error reading FF file %s, i= %d, j= %d, unexpected node ?!", filetoread, i, j);
2656 clean_this_field_data (doc, reader);
2657 return NULL;
2658 }
2659 break;
2660 default:
2661 if (g_strcmp0 ("a",(char *)prop -> name) == 0)
2662 {
2663 ff_data -> atoms_id[j][0] = (int) string_to_double ((gpointer)content);
2664 }
2665 else if (g_strcmp0 ("b",(char *)prop -> name) == 0)
2666 {
2667 ff_data -> atoms_id[j][1] = (int) string_to_double ((gpointer)content);
2668 }
2669 else if (g_strcmp0 ("c",(char *)prop -> name) == 0)
2670 {
2671 ff_data -> atoms_id[j][2] = (int) string_to_double ((gpointer)content);
2672 }
2673 else if (g_strcmp0 ("d",(char *)prop -> name) == 0)
2674 {
2675 ff_data -> atoms_id[j][3] = (int) string_to_double ((gpointer)content);
2676 }
2677 else if (g_strcmp0 ("z_a",(char *)prop -> name) == 0)
2678 {
2679 ff_data -> atoms_z[j][0] = (int) string_to_double ((gpointer)content);
2680 }
2681 else if (g_strcmp0 ("z_b",(char *)prop -> name) == 0)
2682 {
2683 ff_data -> atoms_z[j][1] = (int) string_to_double ((gpointer)content);
2684 }
2685 else if (g_strcmp0 ("z_c",(char *)prop -> name) == 0)
2686 {
2687 ff_data -> atoms_z[j][2] = (int) string_to_double ((gpointer)content);
2688 }
2689 else if (g_strcmp0 ("z_d",(char *)prop -> name) == 0)
2690 {
2691 ff_data -> atoms_z[j][3] = (int) string_to_double ((gpointer)content);
2692 }
2693 else if (i > 0 && g_strcmp0 ("info",(char *)prop -> name) == 0)
2694 {
2695 ff_data -> info[j] = g_strdup_printf ("%s", content);
2696 setinfo = TRUE;
2697 }
2698 else
2699 {
2700 if (i == 10)
2701 {
2702 // Non-bonded: 12-6: E_i, R_i, E_14, R_14
2703 if (g_strcmp0 ("Ei",(char *)prop -> name) == 0)
2704 {
2705 ff_data -> param[j][0] = string_to_double ((gpointer)content);
2706 }
2707 else if (g_strcmp0 ("Ri",(char *)prop -> name) == 0)
2708 {
2709 ff_data -> param[j][1] = string_to_double ((gpointer)content);
2710 }
2711 else if (g_strcmp0 ("Eii",(char *)prop -> name) == 0)
2712 {
2713 ff_data -> param[j][2] = string_to_double ((gpointer)content);
2714 }
2715 else if (g_strcmp0 ("Rii",(char *)prop -> name) == 0)
2716 {
2717 ff_data -> param[j][3] = string_to_double ((gpointer)content);
2718 }
2719 else if (g_strcmp0 ("A",(char *)prop -> name) == 0)
2720 {
2721 ff_data -> param[j][0] = string_to_double ((gpointer)content);
2722 }
2723 else if (g_strcmp0 ("B",(char *)prop -> name) == 0)
2724 {
2725 ff_data -> param[j][1] = string_to_double ((gpointer)content);
2726 }
2727 else
2728 {
2729 g_warning ("Error reading FF file %s, i= %d, j= %d, unexpected node ?! node name= %s", filetoread, i, j, (char *)prop -> name);
2730 clean_this_field_data (doc, reader);
2731 xmlFree (content);
2732 return NULL;
2733 }
2734 }
2735 else
2736 {
2737 // Bonds: Harm: K, R0
2738 // Bonds: Quartic: K, R_0, K', K''
2739 // Bonds: Morse: D, R_0, Alpha
2740 // Angle: Quartic: K, Theta_0, K', K''
2741 // Dihedral: Cosine: K, Phi_0, n
2742 // Dihedral: Cosine 3: K, Phi_0, K', K''
2743 // Improper: Cosine: K, n, Phi_0 / Harm: K, Phi_0
2744 // Inversion: Harm: K, Phi_0
2745 if (g_strcmp0 ("K",(char *)prop -> name) == 0)
2746 {
2747 ff_data -> param[j][0] = string_to_double ((gpointer)content);
2748 }
2749 else if (g_strcmp0 ("R_zero",(char *)prop -> name) == 0)
2750 {
2751 ff_data -> param[j][1] = string_to_double ((gpointer)content);
2752 }
2753 else if (g_strcmp0 ("Theta_zero",(char *)prop -> name) == 0)
2754 {
2755 ff_data -> param[j][1] = string_to_double ((gpointer)content);
2756 }
2757 else if (g_strcmp0 ("Phi_zero",(char *)prop -> name) == 0)
2758 {
2759 ff_data -> param[j][1] = string_to_double ((gpointer)content);
2760 }
2761 else if (g_strcmp0 ("KK",(char *)prop -> name) == 0)
2762 {
2763 ff_data -> param[j][2] = string_to_double ((gpointer)content);
2764 }
2765 else if (g_strcmp0 ("KKK",(char *)prop -> name) == 0)
2766 {
2767 ff_data -> param[j][3] = string_to_double ((gpointer)content);
2768 }
2769 else if (g_strcmp0 ("Kub",(char *)prop -> name) == 0)
2770 {
2771 ff_data -> param[j][2] = string_to_double ((gpointer)content);
2772 }
2773 else if (g_strcmp0 ("S_zero",(char *)prop -> name) == 0)
2774 {
2775 ff_data -> param[j][3] = string_to_double ((gpointer)content);
2776 }
2777 else if (g_strcmp0 ("n",(char *)prop -> name) == 0)
2778 {
2779 ff_data -> param[j][2] = string_to_double ((gpointer)content);
2780 }
2781 else if (g_strcmp0 ("D",(char *)prop -> name) == 0)
2782 {
2783 ff_data -> param[j][0] = string_to_double ((gpointer)content);
2784 }
2785 else if (g_strcmp0 ("Alpha",(char *)prop -> name) == 0)
2786 {
2787 ff_data -> param[j][2] = string_to_double ((gpointer)content);
2788 }
2789 else
2790 {
2791 g_warning ("Error reading FF file %s, i= %d, j= %d, unexpected node ?! node name= %s", filetoread, i, j, (char *)prop -> name);
2792 xmlFree (content);
2793 clean_this_field_data (doc, reader);
2794 return NULL;
2795 }
2796 }
2797 }
2798 break;
2799 }
2800 xmlFree (content);
2801 prop = prop -> next;
2802 }
2803 n_node = n_node -> next;
2804 }
2805 if (i > 0 && ! setinfo)
2806 {
2807 g_free (ff_data -> info);
2808 ff_data -> info = NULL;
2809 }
2810 /*if (i==0)
2811 {
2812 for (j=0; j<ff_objects[i]; j++)
2813 {
2814 g_debug ("j= %d, ff_atoms[%d][0]= %s, ff_atoms[%d][1]= %s, ff_atoms[%d][2]= %s, ff_atoms[%d][3]= %s",
2815 j, j, ff_atoms[j][0], j, ff_atoms[j][1], j, ff_atoms[j][2], j, ff_atoms[j][3]);
2816 }
2817 }*/
2818 }
2819 }
2820 xmlFreeDoc(doc);
2821 xmlFreeTextReader(reader);
2822 xmlCleanupParser();
2823 return force_field_name;
2824 }
2825}
2826
2827#endif
2828
2836G_MODULE_EXPORT void setup_this_force_field (int id)
2837{
2838#ifdef USE_ATOMS
2839 // associate_new_pointers_to_field_data (id);
2840 // Atoms
2841 int i;
2842 for (i=0; i<6; i++)
2843 {
2844 if (field_objects_id[i])
2845 {
2847 while (tmp_obj_id -> next)
2848 {
2849 tmp_obj_id = tmp_obj_id -> next;
2850 g_free (tmp_obj_id -> prev);
2851 }
2852 g_free (tmp_obj_id);
2853 field_objects_id[i] = NULL;
2854 }
2855 }
2856 gchar * name = open_field_file (id);
2857 if (g_strcmp0 (name, field_acro[id]) != 0)
2858 {
2859 // Error in xml file ?!
2860 tmp_field -> type = -1;
2861 }
2862 else if (name)
2863 {
2864 int spf = field_find_atoms ();
2865 if (spf < tmp_proj -> nspec)
2866 {
2867 // Some atomic species are not described in this force field
2868 // Take action ?
2869 }
2870
2871 int i;
2872 for (i=0; i<6; i++)
2873 {
2874 if (field_objects_id[i])
2875 {
2877 while (tmp_obj_id -> next)
2878 {
2879 tmp_obj_id = tmp_obj_id -> next;
2880 g_free (tmp_obj_id -> prev);
2881 }
2882 g_free (tmp_obj_id);
2883 field_objects_id[i] = NULL;
2884 }
2885 }
2886
2887 // Bonds
2888 tmp_obj_id = NULL;
2890#ifdef DEBUG
2891 if (tmp_obj_id) print_all (FBDS);
2892#endif
2893
2894 // Angles
2895 tmp_obj_id = NULL;
2897#ifdef DEBUG
2898 if (tmp_obj_id) print_all (FANG);
2899#endif
2900 // Dihedrals
2901 tmp_obj_id = NULL;
2903#ifdef DEBUG
2904 if (tmp_obj_id) print_all (FDIH);
2905#endif
2906 // Impropers
2907 tmp_obj_id = NULL;
2909#ifdef DEBUG
2910 if (tmp_obj_id) print_all (FIMP);
2911#endif
2912 // Inversions
2913 tmp_obj_id = NULL;
2915#ifdef DEBUG
2916 if (tmp_obj_id) print_all (FINV);
2917#endif
2918 // Vdw
2919 tmp_obj_id = NULL;
2920 field_find_vdw ();
2921#ifdef DEBUG
2922 if (tmp_obj_id) print_all (FNBD);
2923#endif
2924 }
2925#else
2926 int i;
2927 gchar * str;
2928 //FILE * hp = fopen ("force_fields.h", "w");
2929 for (i=0; i<N_FIELDS; i++)
2930 {
2931 g_debug ("\n\nField id= %d, name= %s", i, field_keyw[i]);
2932 associate_pointers_to_field_data (i);
2933 is_99 = (i==CHARMM22M) ? TRUE : FALSE;
2934 str = g_strdup_printf ("%s/force_fields/%s.ffl", PACKAGE_LIB_DIR, field_ffl[i]);
2935 fp = fopen (str, "w");
2936 fprintf (fp, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
2937 fprintf (fp, "<!-- Force Field Library XML file -->\n");
2938 fprintf (fp, "<ff-xml>\n");
2939 fprintf (fp, " <force-field>%s</force-field>\n", field_acro[i]);
2940 fprintf (fp, " <!-- data adapted from the file: %s -->\n", ffo_file[i]);
2941 fprintf (fp, " <units>k-calories per mol</units>\n");
2942 g_free (str);
2944 print_atom_table (i);
2945 print_bond_table (i, 3);
2946 print_angle_table (i, 6);
2947 print_dihedral_table (i, 8);
2948
2949 print_improper_table (i, 11);
2950 print_inversion_table (i, 10);
2951 print_vdw_table (i, 12);
2952 //print_increment_table (i, 13)
2953 fprintf (fp, "</ff-xml>\n");
2954 fclose (fp);
2955 }
2956 //fclose (hp);
2957
2958#endif
2959}
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
gchar * param[2]
ColRGBA col
Definition d_measures.c:77
int atoms[NUM_STYLES][2]
int bonds[NUM_STYLES][2]
float val
Definition dlp_init.c:117
int ** atoms_id_list
int * atoms_id
char *** ff_atoms
int * field_objects
field_data * ff_data
project * tmp_proj
Definition dlp_field.c:1043
gchar * fnames[2][16][21]
Definition dlp_field.c:308
classical_field * tmp_field
Definition dlp_field.c:1041
Variable declarations for the creation of the DL_POLY input file(s).
#define CHARMM35E
Definition dlp_field.h:126
field_data * ff_angles[2]
#define CHARMMSI
Definition dlp_field.h:133
#define CHARMM36N
Definition dlp_field.h:130
#define COMPASS
Definition dlp_field.h:138
#define CHARMM36G
Definition dlp_field.h:128
#define CFF91
Definition dlp_field.h:136
#define AMBER94
Definition dlp_field.h:120
#define CHARMM22P
Definition dlp_field.h:124
field_data * ff_vdw
field_data * ff_dih[2]
field_data * ff_imp
#define CVFF
Definition dlp_field.h:134
#define OPLSAAR
Definition dlp_field.h:140
#define CVFF_AUG
Definition dlp_field.h:135
char * field_acro[N_FIELDS]
#define AMBER96
Definition dlp_field.h:121
field_object_match * field_objects_id[6]
int ** extraz_id
#define AMBER99
Definition dlp_field.h:123
#define CHARMM36P
Definition dlp_field.h:131
#define PCFF
Definition dlp_field.h:137
field_object_match * tmp_obj_id
#define CHARMM22M
Definition dlp_field.h:125
#define OPLSAAP
Definition dlp_field.h:139
#define CHARMM36M
Definition dlp_field.h:132
#define N_FIELDS
Definition dlp_field.h:39
field_data * ff_bonds[3]
field_data * ff_inv
#define AMBER98
Definition dlp_field.h:122
#define CHARMM36C
Definition dlp_field.h:127
int ff_unit
#define CHARMM36L
Definition dlp_field.h:129
char *** field_equi[2]
void set_data(int pid, int obj, int oid, int faid)
save retrieved force field data
void field_find_dihedrals(int id)
retrieve available dihedral parameters in force field database
int get_z(int faid)
get field atom Z
gboolean is_a_match(int *data, int num, int val[4])
is this a match ?
int get_angle(int faid, int aid)
retrieve all angle parameter(s) for this field atom
int get_bond(int faid, int bid)
retrieve all bonding parameter(s) for this field atom
char *** field_inversions
void print_improper_table(int fid, int inum)
print improper(s) table to file
f_bond * the_bonds[2]
int get_fkey(int fid, int prop, int col)
retrieve key for property in force field database
gchar * find_atom_key(int fid, int prop, char *keyw)
retrieve property key in force field database for atom
void print_this_bond(int eid, int h, int fid, int inum, char *at_a, char *at_b, char **the_bond)
print this bond to file
xmlNodePtr findnode(xmlNodePtr startnode, char *nname)
find XML node
f_bond * tmpbd
void print_dihedral_table(int fid, int inum)
print dihedral(s) table to file
void find_object_ijkl(int hid, int foid, int oid, int sa, int za, int sb, int zb, int sc, int zc, int sd, int zd)
retrieve parameter from force field database
char *** field_bonds[3]
float get_force_field_atom_mass(int sp, int num)
get force field atomic mass
int get_pdim(int fid, int prop, int col)
retrieve number of parameters for property in force field database
gchar * table_name[11]
gchar * prop_name[11]
gchar * open_field_file(int field)
open force field XML file
#define FNBD
void field_find_angles()
retrieve available angle parameters in force field database
char *** field_impropers
void print_atom_table(int fid)
print force field atom data to file
gboolean is_99
G_MODULE_EXPORT void setup_this_force_field(int id)
setup force field parameters
char *** field_vdw
int * ff_key
int find_atom_id(int print, char *keyw)
find atom id in force field database
void clean_this_field_data(xmlDoc *doc, xmlTextReaderPtr reader)
free force field XML file data
int ffdim[14][2]
#define FIMP
int * ff_objects
#define FDIH
void print_this_angle(int eid, int h, int fid, int inum, int ub, char *at_a, char *at_b, char *at_c, char **the_angle)
print this angle to file
void print_inversion_table(int fid, int inum)
print inversion(s) table to file
#define FINV
int get_torsion(int faid, int tid, int a, int b)
retrieve all torsion parameter(s) for this field atom
field_object_match ** all_data[10]
f_angl * tmpan
gchar * ffo_file[21]
void field_has_element(int aid)
retrieve force field parameters for this atom
char * field_ffl[N_FIELDS]
int * ff_info
int * ff_dim
FILE * fp
int ffpot[N_FIELDS][10]
int * field_dim
char *** field_atoms
char * field_name[N_FIELDS]
gboolean not_done(int eid, int a, int b)
was this case already considered ?
void field_find_vdw()
retrieve available VdW parameters in force field database
int get_improper(int faid, int a, int b)
retrieve all improper parameter(s) for this field atom
int clean_xml_data(xmlDoc *doc, xmlTextReaderPtr reader)
free XML data
Definition w_library.c:323
char * field_keyw[N_FIELDS]
void print_object_dim_and_key_tables(int fid)
print tables dimensions and keys to file
void print_angle_table(int fid, int inum)
print angle(s) table to file
field_object_match * om_tmp
void field_find_bonds()
retrieve available bond parameters in force field database
int find_atom_z(char *keyw)
find atom Z
f_angl * the_angles[2]
void print_bond_table(int fid, int inum)
print force field bond table to file
#define FBDS
int get_atoms(int z)
retrieve all field atom(s) with matching Z
int get_apex(int faid, int aid)
retrieve all angle apex parameter(s) for this field atom
int is_extra
char *** field_angles[2]
int field_find_atoms()
retrieve matching atom from force field data base
gboolean not_done_an(int eid, int a, int b, int c)
was this case already considered ?
char *** field_dihedrals[2]
int get_vdw(int faid)
retrieve all VdW parameter(s) for this field atom
#define FANG
gchar * filetoread
void print_vdw_table(int fid, int inum)
print VdW table to file
Variable declarations for the creation of the force field database.
int charmm36_cgenff_objects[14]
int CFF91_objects[14]
char * charmm36_prot_impropers[35][8]
int OPLSAAR_dim[14]
char * amber99_vdw[42][4]
char * charmm_silicates_dihedrals[34][8]
char * CVFF_aug_atoms[172][5]
char * Compass_angles[94][8]
char * charmm_silicates_vdw[13][6]
int charmm35_ethers_dim[14]
char * amber98_atoms[2][4]
char * charmm36m_prot_angles[364][8]
char * amber99_atoms[2][5]
char * CVFF_torsions_auto[295][8]
int charmm36m_prot_objects[14]
char * charmm36_prot_bonds[132][5]
char * PCFF_inversions[83][7]
char * OPLSAAR_dihedrals[2482][7]
char * PCFF_vdw[94][4]
char * charmm22_prot_vdw[47][6]
char * Compass_bonds[54][7]
char * amber94_vdw[34][4]
char * charmm36_prot_vdw[53][6]
int Compass_objects[14]
char * CFF91_inversions[70][7]
char * charmm36_carb_vdw[57][6]
char * OPLSAAR_bonds[242][5]
char * charmm22_prot_metals_bonds[139][5]
char * amber99_bonds[116][5]
int charmm36_na_objects[14]
char * amber94_impropers[31][8]
char * CVFF_aug_angles_auto[640][6]
int amber94_objects[14]
char * charmm36_cgenff_vdw[156][6]
char * Compass_torsions[95][11]
char * charmm36_na_bonds[89][5]
char * charmm36_prot_angles[364][8]
int amber98_dim[14]
int charmm36_na_dim[14]
char * charmm36_na_vdw[42][6]
char * charmm35_ethers_bonds[22][5]
char * CVFF_aug_torsions_auto[342][8]
char * CVFF_impropers[41][8]
char * amber98_bonds[83][5]
char * amber99_equi[2][15]
char * amber98_vdw[35][4]
char * CVFF_aug_equivalence_auto[162][11]
char * charmm36_na_dihedrals[502][8]
int charmm36_prot_dim[14]
char * CFF91_atoms[93][5]
char * charmm36_cgenff_bonds[506][5]
char * charmm36_lipid_atoms[29][5]
int charmm35_ethers_objects[14]
char * PCFF_angles[302][8]
char * charmm35_ethers_atoms[13][5]
int amber96_objects[14]
char * charmm22_prot_dihedrals[445][8]
char * CVFF_aug_impropers[41][8]
char * charmm36_lipid_dihedrals[180][8]
char * charmm36_prot_dihedrals[705][8]
char * charmm36m_prot_dihedrals[706][8]
int CVFF_aug_dim[14]
char * charmm_silicates_bonds[14][5]
char * OPLSAAR_vdw[145][7]
char * charmm36_cgenff_dihedrals[3937][8]
char * charmm36_carb_atoms[59][5]
char * PCFF_angles_auto[329][6]
char * CVFF_equivalence[129][7]
char * amber96_atoms[2][4]
char * CVFF_aug_vdw[86][4]
int charmm36m_prot_dim[14]
char * CVFF_angles_auto[563][6]
char * CFF91_equivalence_auto[97][11]
char * charmm35_ethers_vdw[13][6]
char * charmm36_carb_dihedrals[1354][8]
char * charmm35_ethers_angles[55][8]
int charmm36_carb_dim[14]
int charmm36_prot_objects[14]
char * charmm22_prot_metals_impropers[43][8]
char * charmm22_prot_metals_atoms[98][5]
char * charmm22_prot_metals_dihedrals[452][8]
char * CVFF_equivalence_auto[123][11]
int charmm22_prot_dim[14]
char * PCFF_equivalence[134][7]
char * charmm36_lipid_vdw[29][6]
char * OPLSAAR_impropers[131][7]
char * Compass_equivalence[46][7]
int amber99_dim[14]
char * PCFF_equivalence_auto[108][11]
int amber98_objects[14]
char * charmm36_cgenff_angles[1561][8]
char * OPLSAAM_atoms[78][4]
int CFF91_dim[14]
char * CVFF_aug_equivalence[168][7]
char * CFF91_angles_auto[330][6]
int amber99_objects[14]
char * CFF91_equivalence[95][7]
char * PCFF_torsions[492][11]
char * charmm36_lipid_angles[131][8]
char * OPLSAAR_angles[593][5]
char * amber96_vdw[35][4]
char * CVFF_aug_bonds_auto[798][5]
int OPLSAAM_dim[14]
char * charmm36_prot_atoms[53][5]
int CVFF_aug_objects[14]
char * charmm36m_prot_impropers[35][8]
char * CVFF_bonds_auto[776][5]
char * charmm_silicates_atoms[13][5]
char * amber94_atoms[2][4]
char * CFF91_torsions_auto[216][8]
char * charmm22_prot_angles[324][8]
char * CFF91_angles[155][8]
char * charmm22_prot_atoms[47][5]
char * amber96_equi[2][15]
char * amber99_angles[281][6]
char * PCFF_torsions_auto[216][8]
char * CFF91_bonds_auto[667][5]
char * amber99_impropers[38][8]
int charmm22_prot_metals_dim[14]
char * OPLSAAM_dihedrals[1446][7]
char * CFF91_bonds[58][7]
char * CVFF_atoms[133][5]
char * charmm36_cgenff_atoms[163][5]
int amber96_dim[14]
char * amber98_equi[2][15]
char * amber94_dihedrals[81][9]
char * amber94_equi[2][15]
char * CVFF_aug_morse_bonds[752][6]
int amber94_dim[14]
int Compass_dim[14]
char * amber98_dihedrals[83][9]
int PCFF_objects[14]
int OPLSAAM_objects[14]
char * charmm36_carb_impropers[14][8]
char * CFF91_vdw[40][4]
char * amber96_bonds[83][5]
int CVFF_objects[14]
char * CFF91_torsions[294][11]
int PCFF_dim[14]
char * OPLSAAM_vdw[78][7]
int CVFF_dim[14]
char * amber94_bonds[83][5]
char * charmm35_ethers_dihedrals[106][8]
int charmm22_prot_metals_objects[14]
char * CVFF_morse_bonds[775][6]
char * charmm36_carb_angles[438][8]
char * amber99_dihedrals[164][9]
char * charmm36_na_atoms[42][5]
int charmm36_lipid_objects[14]
char * charmm36m_prot_vdw[53][6]
char * charmm36_lipid_bonds[50][5]
char * charmm36m_prot_atoms[53][5]
int charmm_silicates_objects[14]
char * Compass_vdw[46][4]
char * charmm22_prot_impropers[34][8]
char * charmm36_lipid_impropers[4][8]
char * OPLSAAR_atoms[145][4]
char * OPLSAAM_bonds[159][5]
char * charmm36_cgenff_impropers[125][8]
char * amber96_dihedrals[81][9]
char * charmm_silicates_angles[27][8]
char * charmm36_na_impropers[15][8]
char * amber96_impropers[31][8]
char * PCFF_atoms[133][5]
char * charmm36m_prot_bonds[132][5]
int charmm36_carb_objects[14]
char * charmm22_prot_metals_angles[345][8]
char * charmm22_prot_metals_vdw[98][6]
char * Compass_atoms[45][5]
char * amber98_impropers[31][8]
char * amber98_angles[191][6]
int OPLSAAR_objects[14]
char * OPLSAAM_impropers[105][7]
int charmm36_cgenff_dim[14]
int charmm22_prot_objects[14]
char * OPLSAAM_angles[437][5]
int charmm_silicates_dim[14]
char * amber96_angles[191][6]
char * Compass_inversions[22][7]
int charmm36_lipid_dim[14]
char * PCFF_bonds_auto[627][5]
char * PCFF_bonds[126][7]
char * charmm22_prot_bonds[122][5]
char * charmm36_na_angles[226][8]
char * amber94_angles[191][6]
char * charmm36_carb_bonds[153][5]
char * CVFF_vdw[45][4]
int ** allocdint(int xal, int yal)
allocate an int ** pointer
Definition global.c:317
gchar * PACKAGE_LIB_DIR
Definition global.c:89
int activef
Definition global.c:164
int * allocint(int val)
allocate an int * pointer
Definition global.c:301
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
element_data periodic_table_info[]
Definition w_library.c:71
#define CHEM_Z
Definition global.h:316
int objects[3]
Definition selection.c:212
gchar * exact_name(gchar *name)
short cut to print string without spaces
Definition interface.c:434
Messaging function declarations.
double z
Definition ogl_draw.c:63
f_angl * prev
f_angl * next
float v[2]
f_bond * prev
float v[2]
f_bond * next
GtkWidget * lab
Definition workspace.c:73