1 /* PDBTemplate.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
20 #include "../../Config.h"
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <math.h>
24
25 #include "../Common/Global.h"
26 #include "../Utils/Utils.h"
27 #include "../Utils/UtilsInterface.h"
28 #include "../MolecularMechanics/PDBTemplate.h"
29 #include "../MolecularMechanics/LoadPDBTemplate.h"
30 #include "../MolecularMechanics/CreateDefaultPDBTpl.h"
31 #include "../MolecularMechanics/SavePDBTemplate.h"
32 static PDBTemplate* staticPDBTemplate = NULL;
33 /************************************************************/
freePDBTpl(PDBTemplate * pdbTemplate)34 PDBTemplate* freePDBTpl(PDBTemplate* pdbTemplate)
35 {
36 gint i;
37 gint j;
38 if(!pdbTemplate)
39 return NULL;
40 for(i=0;i<pdbTemplate->numberOfResidues;i++)
41 {
42 if(pdbTemplate->residueTemplates[i].residueName)
43 g_free(pdbTemplate->residueTemplates[i].residueName);
44
45 for(j=0;j<pdbTemplate->residueTemplates[i].numberOfTypes;j++)
46 {
47 if(pdbTemplate->residueTemplates[i].typeTemplates[j].pdbType)
48 g_free(pdbTemplate->residueTemplates[i].typeTemplates[j].pdbType);
49 if(pdbTemplate->residueTemplates[i].typeTemplates[j].mmType)
50 g_free(pdbTemplate->residueTemplates[i].typeTemplates[j].mmType);
51 }
52 if(pdbTemplate->residueTemplates[i].typeTemplates)
53 g_free(pdbTemplate->residueTemplates[i].typeTemplates);
54 }
55 if(pdbTemplate->residueTemplates)
56 g_free(pdbTemplate->residueTemplates);
57 g_free(pdbTemplate);
58 return NULL;
59 }
60 /************************************************************/
LoadPersonalPDBTpl()61 PDBTemplate* LoadPersonalPDBTpl()
62 {
63 gchar* filename = g_strdup_printf("%s%sPersonalPDBTemplate.tpl",
64 gabedit_directory(), G_DIR_SEPARATOR_S);
65 PDBTemplate* pdbTemplate = NULL;
66
67 pdbTemplate = g_malloc(sizeof(PDBTemplate));
68 if(!readPDBTemplate(pdbTemplate,filename))
69 {
70 g_free(pdbTemplate);
71 pdbTemplate = NULL;
72 }
73
74 g_free(filename);
75 return pdbTemplate;
76 }
77 /************************************************************/
LoadDefaultPDBTpl()78 PDBTemplate* LoadDefaultPDBTpl()
79 {
80 PDBTemplate* pdbTemplate = NULL;
81 gchar* filename = g_strdup_printf("%s%sDefaultPDBTemplate.tpl",
82 gabedit_directory(), G_DIR_SEPARATOR_S);
83
84 pdbTemplate = g_malloc(sizeof(PDBTemplate));
85 if(!readPDBTemplate(pdbTemplate,filename))
86 {
87 g_free(pdbTemplate);
88 pdbTemplate = NULL;
89 }
90
91 g_free(filename);
92 return pdbTemplate;
93 }
94 /************************************************************/
LoadPDBTpl()95 void LoadPDBTpl()
96 {
97 if(staticPDBTemplate)
98 staticPDBTemplate = freePDBTpl(staticPDBTemplate);
99 staticPDBTemplate = LoadPersonalPDBTpl();
100 if(!staticPDBTemplate)
101 {
102 staticPDBTemplate = LoadDefaultPDBTpl();
103 if(!staticPDBTemplate)
104 {
105
106 if(CreateDefaultPDBTpl())
107 staticPDBTemplate = LoadDefaultPDBTpl();
108 }
109 }
110 }
111 /************************************************************/
getResiduePDBTplNumber(gchar * residueName)112 static gint getResiduePDBTplNumber(gchar* residueName)
113 {
114 gint i;
115 if(!staticPDBTemplate)
116 return -1;
117
118 for(i=0;i<staticPDBTemplate->numberOfResidues;i++)
119 {
120 if(!strcmp(staticPDBTemplate->residueTemplates[i].residueName,residueName))
121 return i;
122 }
123 return -1;
124 }
125 /************************************************************/
getmmType(gint residueNumber,gchar * pdbType,gdouble * charge)126 static gchar* getmmType(gint residueNumber, gchar* pdbType,gdouble* charge)
127 {
128 gint j;
129 PDBTypeTemplate* typeTemplates =
130 staticPDBTemplate->residueTemplates[residueNumber].typeTemplates;
131 gint numberOfTypes = staticPDBTemplate->residueTemplates[residueNumber].numberOfTypes;
132 gchar* mmType = g_strdup("UNK");
133 for(j=0;j<numberOfTypes;j++)
134 {
135 if(!strcmp(pdbType,typeTemplates[j].pdbType))
136 {
137 g_free(mmType);
138 mmType = g_strdup(typeTemplates[j].mmType);
139 *charge = typeTemplates[j].charge;
140 return mmType;
141 }
142 }
143 return mmType;
144 }
145 /************************************************************/
getMMTypeFromPDBTpl(gchar * residueName,gchar * pdbType,gdouble * charge)146 gchar* getMMTypeFromPDBTpl(gchar* residueName,gchar* pdbType,gdouble* charge)
147 {
148 gchar* mmType = g_strdup("UNK");
149 gint residueNumber = -1;
150 *charge = 0;
151
152 if(!staticPDBTemplate)
153 return mmType;
154 residueNumber = getResiduePDBTplNumber(residueName);
155 if(residueNumber==-1)
156 {
157 residueNumber = getResiduePDBTplNumber("ALLRESIDUE");
158 if(residueNumber==-1)
159 return mmType;
160 else
161 return getmmType(residueNumber,pdbType,charge);
162 }
163 else
164 {
165 mmType = getmmType(residueNumber,pdbType,charge);
166 if(!strcmp(mmType,"UNK"))
167 {
168 residueNumber = getResiduePDBTplNumber("ALLRESIDUE");
169 if(residueNumber==-1)
170 return mmType;
171 else
172 return getmmType(residueNumber,pdbType,charge);
173 }
174 else
175 return mmType;
176 }
177 }
178 /************************************************************/
getHydrogens(gint residueNumber,gchar * pdbType,gchar ** hAtoms)179 static gint getHydrogens(gint residueNumber, gchar* pdbType, gchar** hAtoms)
180 {
181 gint j;
182 gint k;
183 PDBTypeTemplate* typeTemplates =
184 staticPDBTemplate->residueTemplates[residueNumber].typeTemplates;
185 gint numberOfTypes = staticPDBTemplate->residueTemplates[residueNumber].numberOfTypes;
186 gint nH = 0;
187 for(j=0;j<numberOfTypes;j++)
188 {
189 if(!strcmp(pdbType,typeTemplates[j].pdbType))
190 {
191 for(k=j+1;k<numberOfTypes;k++)
192 {
193 if(!typeTemplates[k].pdbType) break;
194 if(typeTemplates[k].pdbType[0]!='H') break;
195 sprintf(hAtoms[nH],"%s",typeTemplates[k].pdbType);
196 nH++;
197 if(nH>10) break;
198 }
199 return nH;
200 }
201 }
202 return nH;
203 }
204 /************************************************************/
getHydrogensFromPDBTpl(gchar * residueName,gchar * pdbType,gchar ** hAtoms)205 gint getHydrogensFromPDBTpl(gchar* residueName,gchar* pdbType, gchar** hAtoms)
206 {
207 gint nH = 0;
208 gint residueNumber = -1;
209
210 if(!pdbType) return nH;
211 if(pdbType && (pdbType[0]=='H' || pdbType[0]=='h')) return nH;
212 if(!staticPDBTemplate) return nH;
213 residueNumber = getResiduePDBTplNumber(residueName);
214 if(residueNumber==-1)
215 {
216 residueNumber = getResiduePDBTplNumber("ALLRESIDUE");
217 if(residueNumber==-1)
218 return nH;
219 else
220 return getHydrogens(residueNumber,pdbType, hAtoms);
221 }
222 else
223 {
224 nH = getHydrogens(residueNumber,pdbType, hAtoms);
225 if(nH == 0)
226 {
227 residueNumber = getResiduePDBTplNumber("ALLRESIDUE");
228 if(residueNumber==-1)
229 return nH;
230 else
231 return getHydrogens(residueNumber,pdbType, hAtoms);
232 }
233 else
234 return nH;
235 }
236 return nH;
237 }
238 /************************************************************/
getPointerPDBTemplate()239 PDBTemplate* getPointerPDBTemplate()
240 {
241 return staticPDBTemplate;
242 }
243 /************************************************************/
setPointerPDBTemplate(PDBTemplate * ptr)244 void setPointerPDBTemplate(PDBTemplate* ptr)
245 {
246 staticPDBTemplate = ptr;
247 }
248 /************************************************************/
savePersonalPDBTpl(GtkWidget * win)249 void savePersonalPDBTpl(GtkWidget* win)
250 {
251 gchar* filename = g_strdup_printf("%s%sPersonalPDBTemplate.tpl",
252 gabedit_directory(), G_DIR_SEPARATOR_S);
253
254
255 if(!savePDBTemplate(staticPDBTemplate,filename) && win)
256 {
257 gchar* t = g_strdup_printf("Sorry, I can not create \"%s\" file",filename);
258 GtkWidget* w = Message(t,"Error",TRUE);
259 gtk_window_set_modal(GTK_WINDOW(w),TRUE);
260 gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(win));
261 g_free(t);
262 return;
263 }
264 g_free(filename);
265 }
266 /************************************************************/
getListPDBTypes(gchar * residueName,gint * nlist)267 gchar** getListPDBTypes(gchar* residueName, gint* nlist)
268 {
269 gchar** t = NULL;
270 gint j;
271 gint residueNumber = getResiduePDBTplNumber(residueName);
272 PDBTypeTemplate* typeTemplates = NULL;
273 gint numberOfTypes = 0;
274
275 *nlist = 0;
276
277 if(residueNumber==-1) residueNumber = getResiduePDBTplNumber("ALLRESIDUE");
278 if(residueNumber==-1) return NULL;
279
280 typeTemplates = staticPDBTemplate->residueTemplates[residueNumber].typeTemplates;
281 numberOfTypes = staticPDBTemplate->residueTemplates[residueNumber].numberOfTypes;
282 t = g_malloc(numberOfTypes*sizeof(gchar*));
283 for(j=0;j<numberOfTypes;j++)
284 t[j] = g_strdup(typeTemplates[j].pdbType);
285 *nlist = numberOfTypes;
286 return t;
287 }
288 /********************************************************************************/
289
290