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