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