1 /* CreatePersonalMMFile.c */
2 /**********************************************************************************************************
3 Copyright (c) 2002-2013 Abdul-Rahman Allouche. All rights reserved
4
5 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
6 documentation files (the Gabedit), to deal in the Software without restriction, including without limitation
7 the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
8 and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
9
10 The above copyright notice and this permission notice shall be included in all copies or substantial portions
11 of the Software.
12
13 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
14 TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
15 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
16 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17 DEALINGS IN THE SOFTWARE.
18 ************************************************************************************************************/
19 #include "../../Config.h"
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <math.h>
23
24 #include "../Common/Global.h"
25 #include "../Utils/AtomsProp.h"
26 #include "../Utils/Utils.h"
27 #include "../Geometry/Fragments.h"
28 #include "../Geometry/DrawGeom.h"
29 #include "Atom.h"
30 #include "Molecule.h"
31 #include "ForceField.h"
32 #include "MolecularMechanics.h"
33
34 static gchar atomTypesTitle[] = "Begin INPUT FOR ATOM TYPES, MASSE AND POLARISABILITIES";
35 static gchar bondStretchTitle[] = "Begin INPUT FOR BOND LENGTH PARAMETERS";
36 static gchar angleBendTitle[] = "Begin INPUT FOR BOND ANGLE PARAMETERS";
37 static gchar hydrogenBondedTitle[] = "Begin INPUT FOR H-BOND 10-12 POTENTIAL PARAMETERS";
38 static gchar improperTorsionTitle[] ="Begin INPUT FOR IMPROPER DIHEDRAL PARAMETERS";
39 static gchar nonBondedTitle[] ="Begin INPUT FOR THE NON-BONDED 6-12 POTENTIAL PARAMETERS";
40 static gchar dihedralAngleTitle[] = "Begin INPUT FOR DIHEDRAL PARAMETERS";
41 static gchar pairWiseTitle[] = "Begin INPUT FOR PAIR WISE PARAMETERS";
42
43 /**********************************************************************/
saveParametersPairWise(FILE * file,AmberParameters * amberParameters)44 static void saveParametersPairWise(FILE* file,AmberParameters* amberParameters)
45 {
46 gint n;
47 fprintf(file,"%s\n",pairWiseTitle);
48
49 for(n=0;n<amberParameters->numberOfPairWise;n++)
50 {
51 fprintf(file,"%d\t%d\t%8.4f\t%8.4f\t%8.4f\t%8.4f\t%8.4f\t%8.4f\n",
52 amberParameters->pairWiseTerms[n].numbers[0]+1,
53 amberParameters->pairWiseTerms[n].numbers[1]+1,
54 amberParameters->pairWiseTerms[n].a,
55 amberParameters->pairWiseTerms[n].beta,
56 amberParameters->pairWiseTerms[n].c6,
57 amberParameters->pairWiseTerms[n].c8,
58 amberParameters->pairWiseTerms[n].c10,
59 amberParameters->pairWiseTerms[n].b
60 );
61 }
62 fprintf(file,"End\n");
63 }
64 /**********************************************************************/
saveParametersBond(FILE * file,AmberParameters * amberParameters)65 static void saveParametersBond(FILE* file,AmberParameters* amberParameters)
66 {
67 gint i;
68 fprintf(file,"%s\n",bondStretchTitle);
69
70 for(i=0;i<amberParameters->numberOfStretchTerms;i++)
71 {
72 fprintf(file,"%d\t%d\t%6.1f\t%7.4f\n",
73 amberParameters->bondStretchTerms[i].numbers[0]+1,
74 amberParameters->bondStretchTerms[i].numbers[1]+1,
75 amberParameters->bondStretchTerms[i].forceConstant,
76 amberParameters->bondStretchTerms[i].equilibriumDistance
77 );
78 }
79 fprintf(file,"End\n");
80 }
81 /**********************************************************************/
saveParametersBend(FILE * file,AmberParameters * amberParameters)82 static void saveParametersBend(FILE* file,AmberParameters* amberParameters)
83 {
84 gint n;
85 fprintf(file,"%s\n",angleBendTitle);
86
87 for(n=0;n<amberParameters->numberOfBendTerms;n++)
88 {
89 fprintf(file,"%d\t%d\t%d\t%6.3f\t%6.2f\n",
90 amberParameters->angleBendTerms[n].numbers[0]+1,
91 amberParameters->angleBendTerms[n].numbers[1]+1,
92 amberParameters->angleBendTerms[n].numbers[2]+1,
93 amberParameters->angleBendTerms[n].forceConstant,
94 amberParameters->angleBendTerms[n].equilibriumAngle
95 );
96 }
97
98 fprintf(file,"End\n");
99 }
100 /**********************************************************************/
saveParametersHydrogenBonded(FILE * file,AmberParameters * amberParameters)101 static void saveParametersHydrogenBonded(FILE* file,AmberParameters* amberParameters)
102 {
103 gint n;
104 fprintf(file,"%s\n",hydrogenBondedTitle);
105 for(n=0;n<amberParameters->numberOfHydrogenBonded;n++)
106 {
107 fprintf(file,"%d\t%d\t%8.1f\t%8.1f\n",
108 amberParameters->hydrogenBondedTerms[n].numbers[0]+1,
109 amberParameters->hydrogenBondedTerms[n].numbers[1]+1,
110 amberParameters->hydrogenBondedTerms[n].c,
111 amberParameters->hydrogenBondedTerms[n].d
112 );
113 }
114
115 fprintf(file,"End\n");
116 }
117 /**********************************************************************/
saveParametersimproperTorsion(FILE * file,AmberParameters * amberParameters)118 static void saveParametersimproperTorsion(FILE* file,AmberParameters* amberParameters)
119 {
120 gint n;
121 fprintf(file,"%s\n",improperTorsionTitle);
122 for(n=0;n<amberParameters->numberOfImproperTorsionTerms;n++)
123 {
124 fprintf(file,"%d\t%d\t%d\t%d\t%6.3f\t%6.2f\t%4.1f\n",
125 amberParameters->improperTorsionTerms[n].numbers[0]+1,
126 amberParameters->improperTorsionTerms[n].numbers[1]+1,
127 amberParameters->improperTorsionTerms[n].numbers[2]+1,
128 amberParameters->improperTorsionTerms[n].numbers[3]+1,
129 amberParameters->improperTorsionTerms[n].barrier,
130 amberParameters->improperTorsionTerms[n].phase,
131 amberParameters->improperTorsionTerms[n].n
132 );
133 }
134
135 fprintf(file,"End\n");
136 }
137 /**********************************************************************/
saveParametersNonBonded(FILE * file,AmberParameters * amberParameters)138 static void saveParametersNonBonded(FILE* file,AmberParameters* amberParameters)
139 {
140 gint n;
141 fprintf(file,"%s\n",nonBondedTitle);
142
143 for(n=0;n<amberParameters->numberOfNonBonded;n++)
144 {
145 fprintf(file,"%d\t%8.4f\t%8.4f\n",
146 amberParameters->nonBondedTerms[n].number+1,
147 amberParameters->nonBondedTerms[n].r,
148 amberParameters->nonBondedTerms[n].epsilon
149 );
150 }
151
152
153
154 fprintf(file,"End\n");
155 }
156
157
158 /**********************************************************************/
saveParametersDihedralAngle(FILE * file,AmberParameters * amberParameters)159 static void saveParametersDihedralAngle(FILE* file,AmberParameters* amberParameters)
160 {
161 gint n;
162 gdouble nn;
163
164 fprintf(file,"%s\n",dihedralAngleTitle);
165 for(n=0;n<amberParameters->numberOfDihedralTerms;n++)
166 {
167 gint j;
168 for(j=0;j<amberParameters->dihedralAngleTerms[n].nSomme;j++)
169 {
170 if(j==amberParameters->dihedralAngleTerms[n].nSomme-1)
171 nn = amberParameters->dihedralAngleTerms[n].n[j];
172 else
173 nn = -amberParameters->dihedralAngleTerms[n].n[j];
174
175 fprintf(file,"%d\t%d\t%d\t%d\t%4.1f\t%6.3f\t%6.2f\t%4.1f\n",
176 amberParameters->dihedralAngleTerms[n].numbers[0]+1,
177 amberParameters->dihedralAngleTerms[n].numbers[1]+1,
178 amberParameters->dihedralAngleTerms[n].numbers[2]+1,
179 amberParameters->dihedralAngleTerms[n].numbers[3]+1,
180 amberParameters->dihedralAngleTerms[n].divisor[j],
181 amberParameters->dihedralAngleTerms[n].barrier[j],
182 amberParameters->dihedralAngleTerms[n].phase[j],
183 nn
184
185 );
186 }
187 }
188 fprintf(file,"End\n");
189 }
190 /**********************************************************************/
saveParametersAtomTypes(FILE * file,AmberParameters * amberParameters)191 static void saveParametersAtomTypes(FILE* file,AmberParameters* amberParameters)
192 {
193 gint i;
194 fprintf(file,"%s\n",atomTypesTitle);
195
196 for(i=0;i<amberParameters->numberOfTypes;i++)
197 {
198 fprintf(file,"%s\t%s\t%d\t%6.3f\t%6.3f\t%s\n",
199 amberParameters->atomTypes[i].name,
200 amberParameters->atomTypes[i].symbol,
201 amberParameters->atomTypes[i].number+1,
202 amberParameters->atomTypes[i].masse,
203 amberParameters->atomTypes[i].polarisability,
204 amberParameters->atomTypes[i].description
205 );
206 }
207
208 fprintf(file,"End\n");
209 }
210
211 /**********************************************************************/
saveParametersTitle(FILE * file)212 static void saveParametersTitle(FILE* file)
213 {
214 fprintf(file,"Begin Title\n");
215 fprintf(file,"\tAtom Types : Ty(Type) Symbol Numero Masse(C12 UMA) Polarisablities(Ang**3) \n");
216 fprintf(file,"\tBond Length : N1-N2 Force(Kcal/mol/A**2) Re\n");
217 fprintf(file,"\tBond Angle : N1-N2-N3 Force(Kcal/mol/rad**2) Angle(Deg) \n");
218 fprintf(file,"\tDihedral : N1-N2-N3-N4 Idiv Pk Phase(Deg) Pn \n");
219 fprintf(file,"\t E = Pk/Idiv*(1 + cos(P,*Phi - Phase)\n");
220 fprintf(file,"\t Pk = Barrier/2 Kcal/mol\n");
221 fprintf(file,"\t Idiv barrier is divised by Idiv\n");
222 fprintf(file,"\t Pn = periodicity fo the torional barrier\n");
223 fprintf(file,"\t if Pn<0 the tosional potential is \n");
224 fprintf(file,"\t assumed to have more than one term\n");
225 fprintf(file,"\t if Ni=0 => N is a number for any one Type\n");
226 fprintf(file,"\tImproper Dihedral : N1-N2-N3-N4 Idiv Pk Phase(Deg) Pn \n");
227 fprintf(file,"\tH-Bond : N1-N2 A(coef. 1/r**12) B(coef. -B/r**10)\n");
228 fprintf(file,"\tPair Wise :N1-N2 A(kcal/mol) B(Ang-1) C6(kcal*Ang**6) C8 C10 b(Ang-1)\n");
229 fprintf(file,"\t V(r) = A*exp(-B*r) -Somme(C2n*f2n/r**(2*n))[n=3,4,5]\n");
230 fprintf(file,"\t f2n = 1- exp(-b*r)*Somme((b*r)**k/k!,k=1..2*n)\n");
231 fprintf(file,"End\n");
232 }
233 /**********************************************************************/
saveParameters(AmberParameters * amberParameters,gchar * filename)234 static void saveParameters(AmberParameters* amberParameters,gchar* filename)
235 {
236 FILE* file;
237 file = FOpen(filename,"w");
238 if(!file)
239 {
240 printf("I can not open \"%s\" file\n",filename);
241 return;
242 }
243 saveParametersTitle(file);
244 saveParametersAtomTypes(file,amberParameters);
245 saveParametersBond(file,amberParameters);
246 saveParametersBend(file,amberParameters);
247 saveParametersDihedralAngle(file,amberParameters);
248 saveParametersimproperTorsion(file,amberParameters);
249 saveParametersHydrogenBonded(file,amberParameters);
250 saveParametersNonBonded(file,amberParameters);
251 saveParametersPairWise(file,amberParameters);
252 fclose(file);
253 }
254 /**********************************************************************/
createPersonalParametersFile(AmberParameters * amberParameters)255 void createPersonalParametersFile(AmberParameters* amberParameters)
256 {
257 gchar* filename = g_strdup_printf("%s%sPersonalMM.prm",gabedit_directory(), G_DIR_SEPARATOR_S);
258 saveParameters(amberParameters,filename);
259 g_free(filename);
260 }
261