1 /* BuildPolyNucleicAcid.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 
21 #include "../../Config.h"
22 #include <gtk/gtk.h>
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <math.h>
28 
29 #include "../Common/Global.h"
30 #include "../Utils/Constants.h"
31 #include "../Utils/Utils.h"
32 #include "../Utils/UtilsInterface.h"
33 #include "../Utils/AtomsProp.h"
34 #include "../Geometry/GeomGlobal.h"
35 #include "../Geometry/Fragments.h"
36 #include "../Geometry/DrawGeom.h"
37 #include "../Geometry/GeomXYZ.h"
38 #include "../Geometry/InterfaceGeom.h"
39 #include "../Geometry/FragmentsPNA.h"
40 #include "../Geometry/RotFragments.h"
41 #include "../Geometry/MenuToolBarGeom.h"
42 #include "../Utils/Matrix3D.h"
43 #include "../MolecularMechanics/PDBTemplate.h"
44 
45 void define_good_factor();
46 void create_GeomXYZ_from_draw_grometry();
47 
48 gchar* tlabels[] = {
49 	"Tip","Inclination","Opening","Propeller twist",
50 	"Buckle","Twist","Roll","Tilt",
51 
52 	"X-Displacement","Y-Displacement","Shear (Sx)",
53 	"Stretch (Sy)","Stagger (Sz)","Shift (Dx)",
54 	"Slide (Dy)","Rise (Dz)",
55 
56 	"Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Chi"
57 };
58 
59 static gint numberSugarList = 10;
60 static gchar* sugarList[] = {
61 		"C3'-endo","C4'-exo","O4'-endo","C1'-exo",
62 		"C2'-endo","C3'-exo","C4'-endo","O4'-exo",
63 		"C1'-endo","C2'-exo"
64 };
65 static gchar* tbuttons[] = {
66 	"A - (T)","A - (U)","C - (G)","G - (C)",
67 	"T - (A)","U - (A)","5'-CAP","3'-CAP",
68 	"Custom",
69 };
70 
71 static gint numberDNATypeList = 4;
72 static gchar* typeDNAList[] = {
73 "ADE","CYT","GUA","THY"
74 };
75 
76 static gint numberRNATypeList = 16;
77 static gchar* typeRNAList[] = {
78 "ADE","CYT","GUA","URA","1MA","1MG","2MG","5MC",
79 "7MG","H2U"," I ","M2G","OMC","OMG","PSU"," Y "
80 };
81 
82 static gint numberDNAFormList = 11;
83 static gchar* formDNAList[] = {
84 "a-form","b-form","b'-form","c-form","c'-form","c''-form",
85 "d-form","e-form","t-form","z-form","custom"
86 };
87 
88 static gint numberRNAFormList = 3;
89 static gchar* formRNAList[] = {
90 "a-form","a'-form","custom"
91 };
92 
93 #define NENTRYS 23
94 typedef enum
95 {
96 	E_TIP				= 0,
97 	E_INCLINATION		= 1,
98 	E_OPENNING			= 2,
99 	E_PROPELLERTWIST	= 3,
100 	E_BUCKLE			= 4,
101 	E_TWIST				= 5,
102 	E_ROLL				= 6,
103 	E_TILT				= 7,
104 	E_XDISPLACEMENT		= 8,
105 	E_YDISPLACEMENT		= 9,
106 	E_SHEARSX			= 10,
107 	E_STRETCHSY			= 11,
108 	E_STAGGERSZ			= 12,
109 	E_SHIFTDX			= 13,
110 	E_SLIDEDY			= 14,
111 	E_RISEDZ			= 15,
112 	E_ALPHA				= 16,
113 	E_BETA				= 17,
114 	E_GAMMA				= 18,
115 	E_DELTA				= 19,
116 	E_EPSILON			= 20,
117 	E_ZETA				= 21,
118 	E_CHI				= 22,
119 } EntryNumbers;
120 
121 static gchar* aformDNA[]={
122 "11.0","20.0","0.0","-8.3","-2.4","32.7","0.0","0.0",
123 "-4.1","0.0","0.0","0.0","0.0","0.0","0.0","2.56",
124 "130.15","-158.0","109.0","127.0","-59.05","130.15","-154.0"
125 };
126 static gchar* aformRNA[]={
127 "0.0","17.5","0.0","0.0","0.0","32.7","0.0","0.0",
128 "-4.4","0.0","0.0","0.0","0.0","0.0","0.0","2.8",
129 "-160.9","-158.0","109.0","127.0","-133.4","-154.0","-158.0"
130 };
131 static gchar* apformRNA[]={
132 "0.0","10.0","0.0","0.0","0.0","30.0","0.0","0.0",
133 "-4.4","0.0","0.0","0.0","0.0","0.0","0.0","3.0",
134 "-152.0","-158.0","109.0","127.0","-134.7","-157.4","-158.0",
135 };
136 static gchar* bformDNA[]={
137 "0.6","-5.9","0.0","-11.1","-0.2","36.1","0.0","0.0",
138 "0.14","0.1","0.0","0.0","0.0","0.0","0.0","3.36",
139 "-149.7","-80.0","50.0","139.0","58.13","-6.4","-102.0"
140 };
141 static gchar* bpformDNA[]={
142 "0.0","-7.9","0.0","-1.0","-0.2","36.0","0.0","0.0",
143 "0.02","0.0","0.0","0.0","0.0","0.0","0.0","3.29",
144 "-141.8","-80.0","50.0","139.0","80.28","-22.73","-96.0"
145 };
146 static gchar* cformDNA[]={
147 "0.6","-8.0","0.0","1.0","-0.2","38.6","0.0","0.0",
148 "1.0","0.4","0.0","0.0","0.0","0.0","0.0","3.31",
149 "49.78","90.0","-10.0","139.0","-147.7","163.8","-97.0"
150 };
151 static gchar* cpformDNA[]={
152 "0.6","-8.0","0.0","1.0","-0.2","40.0","0.0","0.0",
153 "1.0","0.4","0.0","0.0","0.0","0.0","0.0","3.28",
154 "49.60","90.0","-10.0","139.0","-142.9","160.4","-97.0"
155 };
156 static gchar* csformDNA[]={
157 "0.6","-8.0","0.0","1.0","-0.2","40.0","0.0","0.0",
158 "1.0","0.4","0.0","0.0","0.0","0.0","0.0","3.23",
159 "47.76","90.0","-10.0","139.0","-138.7","156.4","-97.0"
160 };
161 
162 static gchar* dformDNA[]={
163 "-16.0","-1.5","0.0","-10.0","0.0","45.0","0.0","0.0",
164 "1.8","0.0","0.0","0.0","0.0","0.0","0.0","3.03",
165 "-125.9","-120.0","117.0","139.0","146.2","-128.5","-110.0"
166 };
167 static gchar* eformDNA[]={
168 "0.0","0.0","0.0","1.0","-0.2","48.0","0.0","0.0","1.0",
169 "0.4","0.0","0.0","0.0","0.0","0.0","3.04",
170 "-157.3","-80.0","90.0","139.0","77.4","-47.9","-97.0"
171 };
172 static gchar* tformDNA[]={
173 "0.0","-6.0","0.0","4.0","0.0","45.0","0.0","0.0",
174 "1.43","0.0","0.0","0.0","0.0","0.0","0.0","3.40",
175 "-135.4","-90.0","107.0","120.0","61.0","-60.6","-97.0"
176 };
177 static gchar* z1formDNA[]={
178 "2.9","-6.2","0.0","-1.3","-6.2","-9.4","0.0","0.0",
179 "3.0","-2.3","0.0","0.0","0.0","0.0","0.0","3.92",
180 "-176.2","-139.0","-30.0","138.0","4.92","-65.57","-159.0"
181 };
182 static gchar* z2formDNA[]={
183 "-2.9","-6.2","0.0","-1.3","6.2","-50.6","0.0","0.0",
184 "3.0","2.3","0.0","0.0","0.0","0.0","0.0","3.51",
185 "164.57","160.0","150.0","140.0","-142.1","8.55","68.0"
186 };
187 
188 #define NBUTTONS 9
189 typedef enum
190 {
191 	B_AT				= 0,
192 	B_AU				= 1,
193 	B_CG                = 2,
194 	B_GC     			= 3,
195 	B_TA            	= 4,
196 	B_UA            	= 5,
197 	B_5CAP	    		= 6,
198 	B_3CAP				= 7,
199 	B_ALL				= 8
200 } ButtonNumbers;
201 
202 static GtkWidget* Entrys[NENTRYS];
203 static GtkWidget* Buttons[NBUTTONS];
204 
205 static GtkWidget* buttonDNA = NULL;
206 static GtkWidget* buttonRNA = NULL;
207 
208 static GtkWidget* buttonBuild35 = NULL;
209 static GtkWidget* buttonBuild53 = NULL;
210 
211 static GtkWidget* buttonSingle = NULL;
212 static GtkWidget* buttonDouble = NULL;
213 static GtkWidget* buttonCounterIon = NULL;
214 
215 static GtkWidget* comboForm = NULL;
216 static GtkWidget* comboSugar = NULL;
217 static GtkWidget* comboLeftButton = NULL;
218 static GtkWidget* comboRightButton = NULL;
219 static GtkWidget* entryFragList = NULL;
220 static GtkWidget* hboxCustom = NULL;
221 static GtkWidget* WinPNADlg = NULL;
222 /********************************************************************************/
223 static gint lastSenseFrag = -1;
224 static gint lastAntiFrag = -1;
225 static gint lastFrag = -1;
226 static GeomDef* G=NULL;
227 static gint Nb = 0;
228 static gboolean zform = FALSE;
229 static gboolean oddBasepair  = TRUE;
230 static gdouble opening = 0.0;
231 static gdouble xOffset =  2.485/BOHR_TO_ANG;
232 static gdouble stretch = 0.0/BOHR_TO_ANG;
233 static gdouble tip = 0.0;
234 static gdouble propellerTwist = 0.0;
235 static gdouble inclination = 0.0;
236 static gdouble buckle = 0.0;
237 static gdouble Dx = 0.0/BOHR_TO_ANG;
238 static gdouble Dy = 0.0/BOHR_TO_ANG;
239 static gdouble shear = 0.0/BOHR_TO_ANG;
240 static gdouble stagger = 0.0/BOHR_TO_ANG;
241 static gdouble totalRise = 0.0/BOHR_TO_ANG;
242 static gdouble totalTwist = 0.0;
243 static gdouble twist = 0.0;
244 static gdouble roll  = 0.0;
245 static gdouble tilt  = 0.0;
246 static gdouble shift = 0.0/BOHR_TO_ANG;
247 static gdouble slide = 0.0/BOHR_TO_ANG;
248 static gdouble rise  = 0.0/BOHR_TO_ANG;
249 static gdouble previousTip  = 0.0;
250 static gdouble previousInclination  = 0.0;
251 static gdouble previousDy  = 0.0/BOHR_TO_ANG;
252 static gdouble previousDx  = 0.0/BOHR_TO_ANG;
253 
254 static gdouble  alpha = 0.0;
255 static gdouble  beta = 0.0;
256 static gdouble  gammalocal = 0.0;
257 static gdouble  delta = 0.0;
258 static gdouble  epsilon = 0.0;
259 static gdouble  zeta = 0.0;
260 static gdouble  chi = 0.0;
261 
262 static gchar* custom5Value = NULL;
263 static gchar* custom3Value = NULL;
264 static gboolean capped3End = FALSE;
265 static gboolean capped5End = FALSE;
266 /*************************************************************************************/
getTorsion(GeomDef * geom,gint a1,gint a2,gint a3,gint a4)267 static gdouble getTorsion(GeomDef* geom, gint a1, gint a2, gint a3,gint a4)
268 {
269 	gdouble C1[3]={geom[a1].X,geom[a1].Y,geom[a1].Z};
270 	gdouble C2[3]={geom[a2].X,geom[a2].Y,geom[a2].Z};
271 	gdouble C3[3]={geom[a3].X,geom[a3].Y,geom[a3].Z};
272 	gdouble C4[3]={geom[a4].X,geom[a4].Y,geom[a4].Z};
273 	return TorsionToAtoms(C4,C1,C2,C3);
274 }
275 /********************************************************************************/
setCoord(gdouble A[],gint n)276 static void setCoord(gdouble A[],gint n)
277 {
278 	A[0] = G[n].X;
279 	A[1] = G[n].Y;
280 	A[2] = G[n].Z;
281 }
282 /********************************************************************************/
deleteLastAtom()283 static void deleteLastAtom()
284 {
285 	Nb--;
286 	if(Nb>0)
287 		G = g_realloc(G,(Nb)*sizeof(GeomDef));
288 	else
289 	{
290 		g_free(G);
291 		G = NULL;
292 	}
293 
294 	Ddef = FALSE;
295 }
296 /********************************************************************************/
addAtom(gdouble c[],gchar * symb,gchar * pdbtype,gchar * residue,gdouble charge,gint fragmentNumber)297 static void addAtom(gdouble c[],gchar *symb, gchar* pdbtype, gchar* residue,
298 		gdouble charge, gint fragmentNumber)
299 {
300 	gint j;
301 	gchar* mmType;
302 
303 	if(Nb>0)
304 		G = g_realloc(G,(Nb+1)*sizeof(GeomDef));
305 	else
306 		G = g_malloc((1)*sizeof(GeomDef));
307 
308 	Ddef = FALSE;
309 
310 	j=Nb;
311 	G[j].X=c[0];
312 	G[j].Y=c[1];
313 	G[j].Z=c[2];
314 	G[j].Charge=charge;
315 	G[j].pdbType=g_strdup(pdbtype);
316 	mmType = getMMTypeFromPDBTpl(residue,pdbtype,&charge);
317 	if(!strcmp(mmType,"UNK"))
318 	{
319 		g_free(mmType);
320 		G[j].mmType=g_strdup(pdbtype);
321 	}
322 	else G[j].mmType=mmType;
323 
324 	G[j].Residue=g_strdup(residue);
325 	G[j].ResidueNumber=fragmentNumber;
326 
327 	G[j].Prop = prop_atom_get(symb);
328 	G[j].N = j+1;
329 	Nb++;
330 }
331 /********************************************************************************/
addFragment(Fragment Frag)332 static void addFragment(Fragment Frag)
333 {
334 	gint i;
335 	gint j;
336 
337 	if(Nb>0)
338 		G = g_realloc(G,(Nb+Frag.NAtoms+1)*sizeof(GeomDef));
339 	else
340 		G = g_malloc((Frag.NAtoms+1)*sizeof(GeomDef));
341 
342 	Ddef = FALSE;
343 
344 	j=Nb-1;
345 	for(i=0;i<Frag.NAtoms;i++)
346 	{
347 		j++;
348 		G[j].X=Frag.Atoms[i].Coord[0];
349 		G[j].Y=Frag.Atoms[i].Coord[1];
350 		G[j].Z=Frag.Atoms[i].Coord[2];
351 		G[j].Charge=Frag.Atoms[i].Charge;
352 		G[j].mmType=g_strdup(Frag.Atoms[i].mmType);
353 		G[j].pdbType=g_strdup(Frag.Atoms[i].pdbType);
354 		G[j].Residue=g_strdup(Frag.Atoms[i].Residue);
355 		G[j].ResidueNumber=lastFrag+1;
356 
357 		G[j].Prop = prop_atom_get(Frag.Atoms[i].Symb);
358 		G[j].N = j+1;
359 	}
360 	Nb += Frag.NAtoms;
361 }
362 /********************************************************************************/
setTorsionAngles(gint fragNumber,gboolean sense)363 static void setTorsionAngles( gint fragNumber, gboolean sense )
364 {
365 	gint P = -1, O1P = -1, O2P = -1, O5P = -1, C5P = -1, H5P1 = -1, H5P2 = -1;
366 	gint C4P = -1, H4P = -1, O4P = -1, C1P = -1, H1P = -1, N9 = -1, C2 = -1;
367 	gint C4 = -1, C3P = -1, H3P = -1, C2P = -1, H2P1 = -1, H2P2 = -1, O2 = -1;
368 	gint HO2 = -1, N1 = -1, O3P = -1;
369 	gint chiArray[20];
370 	gint nu1Array[20];
371 	gint nu2Array[20];
372 	gint C1PArray[20];
373 	gint C2PArray[20];
374 	gint C3PArray[20];
375 	gint C4PArray[20];
376 	gint O4PArray[20];
377 	gint alphaArray[20];
378 	gint deltaArray1[20];
379 	gint deltaArray2[20];
380 	gint gammaArray[20];
381 	gint betaArray[20];
382 	gint chiArrayCounter = 0, nu1ArrayCounter = 0, nu2ArrayCounter = 0;
383 	gint C1PArrayCounter = 0, C2PArrayCounter = 0, C3PArrayCounter = 0;
384 	gint C4PArrayCounter = 0, O4PArrayCounter = 0, deltaArray1Counter = 0;
385 	gint deltaArray2Counter = 0, gammaArrayCounter = 0, betaArrayCounter = 0;
386 	gint alphaArrayCounter = 0;
387 	gint i;
388 	GtkWidget* entrySugar = GTK_BIN (comboSugar)->child;
389 	G_CONST_RETURN gchar* sugar = gtk_entry_get_text(GTK_ENTRY(entrySugar));
390 	gchar* Name;
391 	gint number = -1;
392 	gdouble C1PAtom[3];
393 	gdouble C2PAtom[3];
394 	gdouble C3PAtom[3];
395 	gdouble C4PAtom[3];
396 	gdouble O4PAtom[3];
397 	gdouble pseudoAtom[3] = { 0.0, 0.0, 0.0 };
398 	gint pseudoNum = -1;
399 	gint sugarIndex = -1;
400 	gdouble sugarPucker = 20.0;
401 
402 
403 	/* Name = G[ i ].pdbType;*/
404 	for ( i = 0; i < Nb; i++ )
405 	{
406 		if(G[i].ResidueNumber != fragNumber)
407 			continue;
408 
409 		Name = G[ i ].pdbType;
410 		number = i;
411 
412 		if ( ( strstr(Name,"'" ) != NULL ) || ( strstr(Name, "T" ) != NULL ) ||
413 		( strstr(Name, "P" ) != NULL ) || (strstr(Name, "HO2" ) != NULL ) )
414 		{
415 			if ( !strcmp(Name, "P" ) )
416 			{
417 				P = number;
418 				nu1Array[ nu1ArrayCounter++ ] = number;
419 				nu2Array[ nu2ArrayCounter++ ] = number;
420 				C4PArray[ C4PArrayCounter++ ] = number;
421 				deltaArray2[ deltaArray2Counter++ ] = number;
422 				gammaArray[ gammaArrayCounter++ ] = number;
423 			}
424 			else if ( !strcmp(Name, "O1P" ) )
425 			{
426 				O1P = number;
427 				nu1Array[ nu1ArrayCounter++ ] = number;
428 				nu2Array[ nu2ArrayCounter++ ] = number;
429 				C4PArray[ C4PArrayCounter++ ] = number;
430 				deltaArray2[ deltaArray2Counter++ ] = number;
431 				gammaArray[ gammaArrayCounter++ ] = number;
432 				betaArray[ betaArrayCounter++ ] = number;
433 				alphaArray[ alphaArrayCounter++ ] = number;
434 			}
435 			else if ( !strcmp(Name, "O2P" ) )
436 			{
437 				O2P = number;
438 				nu1Array[ nu1ArrayCounter++ ] = number;
439 				nu2Array[ nu2ArrayCounter++ ] = number;
440 				C4PArray[ C4PArrayCounter++ ] = number;
441 				deltaArray2[ deltaArray2Counter++ ] = number;
442 				gammaArray[ gammaArrayCounter++ ] = number;
443 				betaArray[ betaArrayCounter++ ] = number;
444 				alphaArray[ alphaArrayCounter++ ] = number;
445 			}
446 			else if ( !strcmp(Name, "O5'" ) )
447 			{
448 				O5P = number;
449 				nu1Array[ nu1ArrayCounter++ ] = number;
450 				nu2Array[ nu2ArrayCounter++ ] = number;
451 				C4PArray[ C4PArrayCounter++ ] = number;
452 				deltaArray2[ deltaArray2Counter++ ] = number;
453 			}
454 			else if ( !strcmp(Name, "C5'" ) )
455 			{
456 				C5P = number;
457 				nu1Array[ nu1ArrayCounter++ ] = number;
458 				nu2Array[ nu2ArrayCounter++ ] = number;
459 				C4PArray[ C4PArrayCounter++ ] = number;
460 				deltaArray2[ deltaArray2Counter++ ] = number;
461 			}
462 			else if ( !strcmp(Name, "H5'1" ) )
463 			{
464 				H5P1 = number;
465 				nu1Array[ nu1ArrayCounter++ ] = number;
466 				nu2Array[ nu2ArrayCounter++ ] = number;
467 				C4PArray[ C4PArrayCounter++ ] = number;
468 				deltaArray2[ deltaArray2Counter++ ] = number;
469 				gammaArray[ gammaArrayCounter++ ] = number;
470 			}
471 			else if ( !strcmp(Name, "H5'2" ) )
472 			{
473 				H5P2 = number;
474 				nu1Array[ nu1ArrayCounter++ ] = number;
475 				nu2Array[ nu2ArrayCounter++ ] = number;
476 				C4PArray[ C4PArrayCounter++ ] = number;
477 				deltaArray2[ deltaArray2Counter++ ] = number;
478 				gammaArray[ gammaArrayCounter++ ] = number;
479 			}
480 			else if ( !strcmp(Name, "C4'" ) )
481 			{
482 				C4P = number;
483 				nu1Array[ nu1ArrayCounter++ ] = number;
484 				nu2Array[ nu2ArrayCounter++ ] = number;
485 				C4PArray[ C4PArrayCounter++ ] = number;
486 			}
487 			else if ( !strcmp(Name, "H4'" ) )
488 			{
489 				H4P = number;
490 				nu1Array[ nu1ArrayCounter++ ] = number;
491 				nu2Array[ nu2ArrayCounter++ ] = number;
492 				C4PArray[ C4PArrayCounter++ ] = number;
493 				deltaArray2[ deltaArray2Counter++ ] = number;
494 			}
495 			else if ( !strcmp(Name, "O4'" ) )
496 			{
497 				O4P = number;
498 			}
499 			else if ( !strcmp(Name, "C1'" ) )
500 			{
501 				C1P = number;
502 				C1PArray[ C1PArrayCounter++ ] = number;
503 			}
504 			else if ( !strcmp(Name, "H1'" ) )
505 			{
506 				H1P = number;
507 				C1PArray[ C1PArrayCounter++ ] = number;
508 				if ( zform )
509 					chiArray[ chiArrayCounter++ ] = number;
510 			}
511 			else if ( !strcmp(Name, "C3'" ) )
512 			{
513 				C3P = number;
514 				nu1Array[ nu1ArrayCounter++ ] = number;
515 				C3PArray[ C3PArrayCounter++ ] = number;
516 			}
517 			else if ( !strcmp(Name, "H3'" ) )
518 			{
519 				H3P = number;
520 				nu1Array[ nu1ArrayCounter++ ] = number;
521 				C3PArray[ C3PArrayCounter++ ] = number;
522 				deltaArray1[ deltaArray1Counter++ ] = number;
523 			}
524 			else if ( !strcmp(Name, "C2'" ) )
525 			{
526 				C2P = number;
527 				C2PArray[ C2PArrayCounter++ ] = number;
528 			}
529 			else if ( !strcmp(Name, "H2'1" ) )
530 			{
531 				H2P1 = number;
532 				C2PArray[ C2PArrayCounter++ ] = number;
533 			}
534 			else if ( !strcmp(Name, "H2'2" ) )
535 			{
536 				H2P2 = number;
537 				C2PArray[ C2PArrayCounter++ ] = number;
538 			}
539 			else if ( !strcmp(Name, "O2'" ) )
540 			{
541 				O2 = number;
542 				C2PArray[ C2PArrayCounter++ ] = number;
543 			}
544 			else if ( !strcmp(Name, "HO2" ) )
545 			{
546 				HO2 = number;
547 				C2PArray[ C2PArrayCounter++ ] = number;
548 			}
549 			else if ( !strcmp(Name, "O3'" ) )
550 			{
551 				O3P = number;
552 				nu1Array[ nu1ArrayCounter++ ] = number;
553 				C3PArray[ C3PArrayCounter++ ] = number;
554 			}
555 			if ( !( !strcmp(Name, "H1'" ) ) )
556 				chiArray[ chiArrayCounter++ ] = number;
557 		}
558 		else
559 		{
560 			if ( !strcmp(Name, "N1" ) )
561 				N1 = i;
562 			else if ( !strcmp(Name, "N9" ) )
563 				N9 = i;
564 			else if ( !strcmp(Name, "C2" ) )
565 				C2 = i;
566 			else if ( !strcmp(Name, "C4" ) )
567 				C4 = i;
568 		}
569 	}
570 	if(O4P != -1 &&  C1P != -1 && C2P != -1 && C3P !=-1)
571 		SetTorsion( Nb,G,O4P, C1P, C2P, C3P, 0, nu1Array, nu1ArrayCounter );
572 	if(C1P != -1 &&  C2P != -1 && C3P != -1 && C4P !=-1)
573 		SetTorsion( Nb,G,C1P, C2P, C3P, C4P, 0, nu2Array, nu2ArrayCounter );
574 
575 	setCoord(C1PAtom,C1P);
576 	setCoord(C2PAtom,C2P);
577 	setCoord(C3PAtom,C3P);
578 	setCoord(C4PAtom,C4P);
579 	setCoord(O4PAtom,O4P);
580 
581 	if ( zform )
582 	{
583 		if ( oddBasepair )
584 		{
585 			if ( sense )
586 				gtk_entry_set_text(GTK_ENTRY(entrySugar),sugarList[4]);
587 			else
588 				gtk_entry_set_text(GTK_ENTRY(entrySugar),sugarList[3]);
589 		}
590 		else
591 		{
592 			if ( sense )
593 				gtk_entry_set_text(GTK_ENTRY(entrySugar),sugarList[3]);
594 			else
595 				gtk_entry_set_text(GTK_ENTRY(entrySugar),sugarList[4]);
596 		}
597 	}
598 	sugarIndex = -1;
599 	for(i=0;i<numberSugarList;i++)
600 		if(!strcmp(sugar,sugarList[i]))
601 		{
602 			sugarIndex = i;
603 		}
604 	switch( sugarIndex )
605 	{
606 		case 0:	/* C3'-endo*/
607 		for(i=0;i<3;i++)
608 			pseudoAtom[ i ] = (gdouble)( ( O4PAtom[ i ] + C1PAtom[ i ] ) / 2.0 );
609 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
610 		pseudoNum = Nb-1;
611 		SetTorsion( Nb,G,C2P, C1P, pseudoNum, C3P, sugarPucker, C3PArray,C3PArrayCounter );
612 		break;
613 		case 1:	/* C4'-exo*/
614 		for(i=0;i<3;i++)
615 			pseudoAtom[ i ] = (gdouble)( ( C2PAtom[ i ] + C1PAtom[ i ] ) / 2.0 );
616 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
617 		pseudoNum = Nb-1;
618 		SetTorsion( Nb,G, C3P, C2P, pseudoNum, C4P, -sugarPucker, C4PArray,C4PArrayCounter );
619 		break;
620 		case 2:	/* O4'-endo*/
621 		for(i=0;i<3;i++)
622 			pseudoAtom[ i ] = (gdouble)( ( C3PAtom[ i ] + C2PAtom[ i ] ) / 2.0 );
623 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
624 		pseudoNum = Nb-1;
625 		SetTorsion( Nb,G, C4P, C3P, pseudoNum, O4P, sugarPucker, O4PArray, O4PArrayCounter );
626 		break;
627 		case 3:	/* C1'-exo*/
628 		for(i=0;i<3;i++)
629 			pseudoAtom[ i ] = (gdouble)( ( C4PAtom[ i ] + C3PAtom[ i ] ) / 2.0 );
630 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
631 		pseudoNum = Nb-1;
632 		SetTorsion( Nb,G, C2P, C3P, pseudoNum, C1P, sugarPucker, C1PArray, C1PArrayCounter );
633 		break;
634 		case 4:	/* C2'-endo*/
635 		for(i=0;i<3;i++)
636 			pseudoAtom[ i ] = (gdouble)( ( O4PAtom[ i ] + C4PAtom[ i ] ) / 2.0 );
637 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
638 		pseudoNum = Nb-1;
639 		SetTorsion( Nb,G, C3P, C4P, pseudoNum, C2P, -sugarPucker, C2PArray, C2PArrayCounter );
640 		break;
641 		case 5:	/* C3'-exo*/
642 		for(i=0;i<3;i++)
643 			pseudoAtom[ i ] = (gdouble)( ( O4PAtom[ i ] + C1PAtom[ i ] ) / 2.0 );
644 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
645 		pseudoNum = Nb-1;
646 		SetTorsion( Nb,G,C2P, C1P, pseudoNum, C3P, -sugarPucker, C3PArray, C3PArrayCounter );
647 		break;
648 		case 6:	/* C4'-endo*/
649 		for(i=0;i<3;i++)
650 			pseudoAtom[ i ] = (gdouble)( ( C2PAtom[ i ] + C1PAtom[ i ] ) / 2.0 );
651 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
652 		pseudoNum = Nb-1;
653 		SetTorsion( Nb,G,C3P, C2P, pseudoNum, C4P, sugarPucker, C4PArray,C4PArrayCounter );
654 		break;
655 		case 7:	/* O4'-exo*/
656 		for(i=0;i<3;i++)
657 			pseudoAtom[ i ] = (gdouble)( ( C3PAtom[ i ] + C2PAtom[ i ] ) / 2.0 );
658 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
659 		pseudoNum = Nb-1;
660 		SetTorsion( Nb,G,C4P, C3P, pseudoNum, O4P, -sugarPucker, O4PArray, C4PArrayCounter );
661 		break;
662 		case 8:	/* C1'-endo*/
663 		for(i=0;i<3;i++)
664 			pseudoAtom[ i ] = (gdouble)( ( C4PAtom[ i ] + C3PAtom[ i ] ) / 2.0 );
665 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
666 		pseudoNum = Nb-1;
667 		SetTorsion( Nb,G,C2P, C3P, pseudoNum, C1P, -sugarPucker, C1PArray, C1PArrayCounter );
668 		break;
669 		case 9:	/* C2'-exo*/
670 		for(i=0;i<3;i++)
671 			pseudoAtom[ i ] = (gdouble)( ( O4PAtom[ i ] + C4PAtom[ i ] ) / 2.0 );
672 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
673 		pseudoNum = Nb-1;
674 		SetTorsion( Nb,G, C3P, C4P, pseudoNum, C2P, sugarPucker, C2PArray, C2PArrayCounter );
675 		break;
676 		default:
677 		addAtom( pseudoAtom,"H","H","H",0.0,lastFrag);
678 		pseudoNum = Nb-1;
679 	}
680 	/* delete pseudo atom */
681 	deleteLastAtom();
682 	/* set chi*/
683 	if ( zform )
684 	{
685 		if ( oddBasepair )
686 		{
687 			if ( sense )
688 			{
689 				chi = atof(z2formDNA[E_CHI]);
690 				beta =  atof(z2formDNA[E_BETA]);
691 				gammalocal =  atof(z2formDNA[E_GAMMA]);
692 				delta =  atof(z2formDNA[E_DELTA]);
693 			}
694 			else
695 			{
696 				chi = atof(z1formDNA[E_CHI]);
697 				beta =  atof(z1formDNA[E_BETA]);
698 				gammalocal =  atof(z1formDNA[E_GAMMA]);
699 				delta =  atof(z1formDNA[E_DELTA]);
700 			}
701 		}
702 		else
703 		{
704 			if ( sense )
705 			{
706 				chi = atof(z1formDNA[E_CHI]);
707 				beta =  atof(z1formDNA[E_BETA]);
708 				gammalocal =  atof(z1formDNA[E_GAMMA]);
709 				delta =  atof(z1formDNA[E_DELTA]);
710 			}
711 			else
712 			{
713 				chi = atof(z2formDNA[E_CHI]);
714 				beta =  atof(z2formDNA[E_BETA]);
715 				gammalocal =  atof(z2formDNA[E_GAMMA]);
716 				delta =  atof(z2formDNA[E_DELTA]);
717 			}
718 		}
719 	}
720 	if ( ( C4 >= 0 ) && ( N9 >= 0 ) && ( C1P >=0) && (O4P>=0))
721 	{
722 		SetTorsion( Nb,G, C4, N9, C1P, O4P, chi, chiArray, chiArrayCounter );
723 		if ( zform )
724 		{
725 			if ( ( C1P >= 0 ) && ( C2P >= 0 ) && ( C3P >=0) && (O3P>=0))
726 				SetTorsion( Nb,G,C1P, C2P, C3P, O3P, 50.0, NULL, 0 );
727 		}
728 		else
729 		{
730 			if ( ( H1P >= 0 ) && ( C1P >= 0 ) && ( C3P >=0) && (O3P>=0))
731 				SetTorsion( Nb,G,  H1P, C1P, C3P, O3P, 0, NULL, 0 );
732 		}
733 	}
734 	else if ( ( C2 >= 0 ) && ( N1 >= 0 ) && (C1P>=0) &&( O4P>=0))
735 	{
736 		SetTorsion( Nb,G,  C2, N1, C1P, O4P, chi, chiArray, chiArrayCounter );
737 		if ( zform )
738 		{
739 			if ( ( C1P >= 0 ) && ( C2P >= 0 ) && ( C3P >=0) && (O3P>=0))
740 				SetTorsion( Nb,G, C1P, C2P, C3P, O3P, 50.0, NULL, 0 );
741 		}
742 		else
743 		{
744 			if ( ( H1P >= 0 ) && ( C1P >= 0 ) && ( C3P >=0) && (O3P>=0))
745 				SetTorsion( Nb,G, H1P, C1P, C3P, O3P, 0, NULL, 0 );
746 		}
747 	}
748 	/* set delta*/
749 	if( (O3P >= 0 ) && ( C3P >= 0 ) && ( C4P >=0) && (C5P>=0))
750 		SetTorsion( Nb,G,  O3P, C3P, C4P, C5P, delta, deltaArray2, deltaArray2Counter );
751 	if( (C3P >= 0 ) && ( C4P >= 0 ) && ( C5P >=0) && (O5P>=0))
752 		SetTorsion( Nb,G,  C3P, C4P, C5P, O5P, gammalocal, gammaArray, gammaArrayCounter );
753 	if( (C4P >= 0 ) && ( C5P >= 0 ) && ( O5P >=0) && (P>=0))
754 		SetTorsion( Nb,G,  C4P, C5P, O5P, P, beta, betaArray, betaArrayCounter );
755 }
756 /********************************************************************************/
fixBackbone(gint previousFragNumber,gint currentFragNumber)757 static void fixBackbone( gint previousFragNumber, gint currentFragNumber )
758 {
759 	gint O3P = -1, O5P = -1, O1P = -1, O2P = -1, P = -1;
760 	gdouble pseudo[3] = { 0.0, 0.0, 0.0};
761 	gint i;
762 	gchar* Name;
763 
764 	for( i = 0; i < Nb; i++ )
765 	{
766 		if(previousFragNumber != G[i].ResidueNumber) continue;
767 		Name = G[i].pdbType;
768 
769 		if ( !strcmp(Name, "O3'" ) ) O3P = i;
770 	}
771 	for( i = 0; i < Nb; i++ )
772 	{
773 		if(currentFragNumber != G[i].ResidueNumber)
774 			continue;
775 		Name = G[i].pdbType;
776 		if ( !strcmp(Name, "O1P" ) ) O1P = i;
777 		else if ( !strcmp(Name, "O2P" ) ) O2P = i;
778 		else if ( !strcmp(Name, "P" ) ) P = i;
779 		else if ( !strcmp(Name, "O5'" ) ) O5P = i;
780 	}
781 	if ( ( O3P == -1 ) || ( O1P == -1 ) || ( O2P == -1 ) || ( P == -1 ) ||
782 		( O5P == -1 ) )
783 		return;
784 	pseudo[ 0 ] = (gdouble)( ( G[O3P].X + G[O5P].X ) / 2.0 );
785 	pseudo[ 1 ] = (gdouble)( ( G[O3P].Y + G[O5P].Y ) / 2.0 );
786 	pseudo[ 2 ] = (gdouble)( ( G[O3P].Z + G[O5P].Z ) / 2.0 );
787 	addAtom( pseudo,"H","H","H",0.0,lastFrag);
788 	SetAngle( Nb,G,  Nb-1, P, O1P, 122.5, NULL,0 );
789 	SetTorsion( Nb,G,  O3P, Nb-1, P, O1P, 90.0, NULL,0);
790 
791 	SetAngle( Nb,G,  Nb-1, P, O2P, 122.5, NULL, 0 );
792 	SetTorsion( Nb,G,  O3P, Nb-1, P, O2P, -90.0, NULL,0);
793 	deleteLastAtom();
794 }
795 /********************************************************************************/
addCounterIons(gint fragNumber)796 static void addCounterIons(gint fragNumber )
797 {
798 	gint C5P = -1, O5P = -1, P = -1, O1P = -1, O2P = -1;
799 	gint i;
800 	gchar* Name;
801 	gdouble pseudo[3] = {0.0, 0.0, 0.0};
802 	gdouble naTorsion = 0.0;
803 	gdouble bondLength;
804 	gdouble distance;
805 	gdouble lengthFactor;
806 	gint ifrag = -1;
807 
808 	for ( i = 0; i < Nb; i++ )
809 	{
810 		if(fragNumber != G[i].ResidueNumber)
811 			continue;
812 		ifrag = i;
813 		Name = G[i].pdbType;
814 		if ( !strcmp(Name, "P" ) )
815 			P = i;
816 		else if (  !strcmp(Name, "O5'" ) )
817 			O5P = i;
818 		else if (  !strcmp(Name, "C5'" ) )
819 			C5P = i;
820 		else if (  !strcmp(Name, "O1P" ) )
821 			O1P = i;
822 		else if (  !strcmp(Name, "O2P" ) )
823 			O2P = i;
824 		else if (  !strcmp(Name, "Na" ) )
825 				return;
826 	}
827 	if ( ( P == -1 ) || ( O5P == -1 ) || ( C5P == -1 ) || ( O1P == -1 ) || ( O2P == -1 ) )
828 			return;
829 
830 	addAtom( pseudo,"Na","Na",G[ifrag].Residue,0.0,lastFrag);
831 	/* set Bond Distance */
832 	bondLength = 1.88/BOHR_TO_ANG;
833 	pseudo[0] = G[P].X - G[O5P].X;
834 	pseudo[1] = G[P].Y - G[O5P].Y;
835 	pseudo[2] = G[P].Z - G[O5P].Z;
836 	distance = sqrt(pseudo[0]*pseudo[0]+pseudo[1]*pseudo[1]+pseudo[2]*pseudo[2]);
837 	lengthFactor = bondLength / distance;
838 	G[Nb-1].X =  (gdouble)( pseudo[0] * lengthFactor + G[P].X);
839 	G[Nb-1].Y =  (gdouble)( pseudo[1] * lengthFactor + G[P].Y);
840 	G[Nb-1].Z =  (gdouble)( pseudo[2] * lengthFactor + G[P].Z);
841 	/* end set bond */
842 	SetAngle( Nb,G, O5P, P, Nb-1 , 122.5, NULL,0 );
843 	naTorsion = (getTorsion(G, C5P, O5P, P, O1P) + getTorsion(G, C5P, O5P, P , O2P) )/2.0;
844 	SetTorsion( Nb,G, C5P, O5P, P, Nb-1, naTorsion, NULL,0);
845 }
846 /*****************************************************************************/
defineGeometryToDraw()847 static void defineGeometryToDraw()
848 {
849 	gint i;
850 	gdouble C[3] = {0.0,0.0,0.0};
851 	gint n;
852 
853 	Free_One_Geom(geometry0,Natoms);
854 	Free_One_Geom(geometry ,Natoms);
855 	Natoms = 0;
856 	geometry0 = NULL;
857 	geometry  = NULL;
858 	reset_origine_molecule_drawgeom();
859 
860 	Natoms = Nb;
861 	geometry0 = g_malloc((Natoms)*sizeof(GeomDef));
862 	geometry  = g_malloc((Natoms)*sizeof(GeomDef));
863 	n = 0;
864 	for(i=0;i<Nb;i++)
865 	{
866 		if(G[i].N == 0)
867 			continue;
868 		geometry0[n].X = G[i].X;
869 		geometry0[n].Y = G[i].Y;
870 		geometry0[n].Z = G[i].Z;
871 		geometry0[n].Charge = G[i].Charge;
872 		geometry0[n].Prop = prop_atom_get(G[i].Prop.symbol);
873 		geometry0[n].mmType = g_strdup(G[i].mmType);
874 		geometry0[n].pdbType = g_strdup(G[i].pdbType);
875 		geometry0[n].Residue = g_strdup(G[i].Residue);
876 		geometry0[n].ResidueNumber = G[i].ResidueNumber;
877 		geometry0[n].show = TRUE;
878 		geometry0[n].Layer = HIGH_LAYER;
879 		geometry0[n].Variable = TRUE;
880 
881 		geometry0[n].N = n+1;
882 		geometry0[n].typeConnections = NULL;
883 
884 		geometry[n].X = G[i].X;
885 		geometry[n].Y = G[i].Y;
886 		geometry[n].Z = G[i].Z;
887 		geometry[n].Charge = G[i].Charge;
888 		geometry[n].Prop = prop_atom_get(G[i].Prop.symbol);
889 		geometry[n].mmType = g_strdup(geometry0[n].mmType);
890 		geometry[n].pdbType = g_strdup(geometry0[n].pdbType);
891 		geometry[n].Residue = g_strdup(geometry0[n].Residue);
892 		geometry[n].ResidueNumber = geometry0[n].ResidueNumber;
893 		geometry[n].show = geometry0[n].show;
894 		geometry[n].N = n+1;
895 		geometry[n].typeConnections = NULL;
896 		geometry[n].Layer = HIGH_LAYER;
897 		geometry[n].Variable = TRUE;
898 		C[0] +=  G[i].X;
899 		C[1] +=  G[i].Y;
900 		C[2] +=  G[i].Z;
901 		n++;
902 	}
903 	if(n>0)
904 	for(i=0;i<3;i++)
905 		C[i] /= n;
906 	/* center */
907 	for(i=0;i<n;i++)
908 	{
909 		geometry0[i].X -= C[0];
910 		geometry0[i].Y -= C[1];
911 		geometry0[i].Z -= C[2];
912 
913 		geometry[i].X -= C[0];
914 		geometry[i].Y -= C[1];
915 		geometry[i].Z -= C[2];
916 	}
917 	Natoms = n;
918 	if(n>0)
919 	{
920 		geometry0 = g_realloc(geometry0,(Natoms)*sizeof(GeomDef));
921 		geometry  = g_realloc(geometry,(Natoms)*sizeof(GeomDef));
922 	}
923 	RebuildGeom = TRUE;
924 
925 }
926 /*****************************************************************************/
cap(gboolean fiveToThree,gboolean doubleStranded,gboolean fiveEnd)927 static gboolean cap(gboolean fiveToThree, gboolean doubleStranded, gboolean fiveEnd )
928 {
929 	gint P = -1, O1P = -1, O2P = -1, O3P = -1, C3P = -1, O5P = -1, C4P = -1, C5P = -1;
930 	gint i;
931 	gchar* t;
932 	gchar* name;
933 	gdouble O3TAtom[] = {  0.0, 0.0, 0.0 };
934 	gdouble H3TAtom[] = {  0.0, 0.0, 0.0 };
935 	gdouble HT3Atom[] = {  0.0, 0.0, 0.0 };
936 	gdouble bondLength, lengthFactor, distance;
937 	gdouble O3TTorsion = 180.0;
938 	gdouble H3TTorsion = 180.0;
939 	gdouble HT3Torsion = 180.0;
940 	gint O3T = -1;
941 	gint H3T = -1;
942 	gint HT3 = -1;
943 	gint firstFrag  = -1;
944 	gint secondFrag = -1;
945 	GtkWidget* w;
946 	gint ifrag = -1;
947 	/* first fragment  is fragment to be P-capped
948 	   second fragment is fragment to be H-capped
949 	*/
950 	if(lastFrag == -1)
951 	{
952 		t = g_strdup(_("There are no residues to cap!\n"
953 			     "You must first create a nucleic acid mono-/polymer."));
954 		w = Message(t,_("Error"),TRUE);
955 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
956   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
957 		g_free(t);
958 		return FALSE;
959 	}
960 	else if(lastFrag == 0 && doubleStranded)
961 	{
962 		t = g_strdup(_("There are not enough residues to cap!\n"
963 			     "There is only one residue in the molecule,"
964 			     "yet \"Double Stranded\" has been selected."));
965 		w = Message(t,_("Error"),TRUE);
966 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
967   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
968 		g_free(t);
969 		return FALSE;
970 	}
971 	if ( fiveToThree )
972 	{
973 		if ( fiveEnd )
974 		{
975 			firstFrag = 0;
976 			if ( doubleStranded )
977 				secondFrag = 1;
978 		}
979 		else
980 		{
981 			secondFrag = lastFrag;
982 			if ( doubleStranded )
983 			{
984 				firstFrag  = lastFrag;
985 				secondFrag = lastFrag-1;
986 			}
987 		}
988 	}
989 	else
990 	{
991 		if ( fiveEnd )
992 		{
993 			firstFrag = lastFrag;
994 			if ( doubleStranded )
995 			{
996 				firstFrag  = lastFrag-1;
997 				secondFrag = lastFrag;
998 			}
999 		}
1000 		else
1001 		{
1002 			secondFrag = 0;
1003 			if ( doubleStranded )
1004 			{
1005 				firstFrag = 1;
1006 			}
1007 		}
1008 	}
1009 	if ( firstFrag != -1 )
1010 	{
1011 		for ( i = 0; i < Nb; i++ )
1012 		{
1013 			if(firstFrag != G[i].ResidueNumber)
1014 				continue;
1015 			ifrag = i;
1016 			name = G[i].pdbType;
1017 			if ( !strcmp(name,"P" ) )
1018 				P = i;
1019 			else if ( !strcmp(name, "O1P" ) )
1020 				O1P = i;
1021 			else if ( !strcmp(name, "O2P" ) )
1022 				O2P = i;
1023 			else if ( !strcmp(name, "O5'" ) )
1024 				O5P = i;
1025 			else if ( !strcmp(name, "C5'" ) )
1026 				C5P = i;
1027 			else if ( !strcmp(name, "O3T" ) )
1028 			{
1029 				t = g_strdup(_("This residue is already capped(O3T)!"));
1030 				w = Message(t,_("Error"),TRUE);
1031 				gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1032   				gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1033 				g_free(t);
1034 				return FALSE;
1035 			}
1036 		}
1037 		if ( ( O5P == -1 ) || ( P == -1 ) || ( C5P == -1 ) ||
1038 		( O1P == -1 ) || ( O2P == -1 ) )
1039 		{
1040 			t = g_strdup(_("Unable to cap(first) residue."));
1041 			w = Message(t,_("Error"),TRUE);
1042 			gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1043   			gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1044 			g_free(t);
1045 		}
1046 		else
1047 		{
1048 
1049 			addAtom( O3TAtom,"O","O3T",G[ifrag].Residue,0.0,firstFrag);
1050 			O3T = Nb-1;
1051 			/* set Bond Distance */
1052 			bondLength = 1.48/BOHR_TO_ANG;
1053 			O3TAtom[0] = G[P].X - G[O5P].X;
1054 			O3TAtom[1] = G[P].Y - G[O5P].Y;
1055 			O3TAtom[2] = G[P].Z - G[O5P].Z;
1056 			distance = sqrt(O3TAtom[0]*O3TAtom[0]+
1057 					O3TAtom[1]*O3TAtom[1]+
1058 					O3TAtom[2]*O3TAtom[2]);
1059 			lengthFactor = bondLength / distance;
1060 			G[O3T].X =  (gdouble)( O3TAtom[0] * lengthFactor + G[P].X);
1061 			G[O3T].Y =  (gdouble)( O3TAtom[1] * lengthFactor + G[P].Y);
1062 			G[O3T].Z =  (gdouble)( O3TAtom[2] * lengthFactor + G[P].Z);
1063 			/* end set bond */
1064 			SetAngle( Nb,G, O5P, P, O3T , 109.5, NULL,0 );
1065 			O3TTorsion = (getTorsion(G, C5P, O5P, P, O1P) +
1066 					getTorsion(G, C5P, O5P, P , O2P) )/2.0;
1067 			SetTorsion( Nb,G, C5P, O5P, P, O3T, O3TTorsion, NULL,0);
1068 
1069 			addAtom( H3TAtom,"H","H3T",G[ifrag].Residue,0.0,firstFrag);
1070 			H3T = Nb -1;
1071 			/* set Bond Distance */
1072 			bondLength = 0.9/BOHR_TO_ANG;
1073 			H3TAtom[0] = G[O3T].X - G[P].X;
1074 			H3TAtom[1] = G[O3T].Y - G[P].Y;
1075 			H3TAtom[2] = G[O3T].Z - G[P].Z;
1076 			distance = sqrt(H3TAtom[0]*H3TAtom[0]+
1077 					H3TAtom[1]*H3TAtom[1]+
1078 					H3TAtom[2]*H3TAtom[2]);
1079 			lengthFactor = bondLength / distance;
1080 			G[H3T].X =  (gdouble)( H3TAtom[0] * lengthFactor + G[P].X);
1081 			G[H3T].Y =  (gdouble)( H3TAtom[1] * lengthFactor + G[P].Y);
1082 			G[H3T].Z =  (gdouble)( H3TAtom[2] * lengthFactor + G[P].Z);
1083 			/* end set bond */
1084 			SetAngle( Nb,G, P, O3T, H3T , 109.5, NULL,0 );
1085 			SetTorsion( Nb,G, O5P, P, O3T, H3T, H3TTorsion, NULL,0);
1086 		}
1087 	}
1088 	if ( secondFrag != -1 )
1089 	{
1090 		ifrag = -1;
1091 		for ( i = 0; i < Nb; i++ )
1092 		{
1093 			if(secondFrag != G[i].ResidueNumber)
1094 				continue;
1095 			ifrag = i;
1096 			name = G[i].pdbType;
1097 			if ( !strcmp(name, "C3'" ) )
1098 				C3P = i;
1099 			else if ( !strcmp(name, "O3'" ) )
1100 				O3P = i;
1101 			else if ( !strcmp(name, "C4'" ) )
1102 				C4P = i;
1103 			else if ( !strcmp(name, "HT3" ) )
1104 			{
1105 				t = g_strdup(_("This residue is already capped(HT3)!"));
1106 				w = Message(t,_("Error"),TRUE);
1107 				gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1108   				gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1109 				g_free(t);
1110 				return FALSE;
1111 			}
1112 		}
1113 		if ( ( C3P == -1 ) || ( O3P == -1 ) || ( C4P == -1 ) )
1114 		{
1115 			t = g_strdup(_("Unable to cap residue."));
1116 			w = Message(t,_("Error"),TRUE);
1117 			gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1118   			gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1119 			g_free(t);
1120 			return FALSE;
1121 		}
1122 			addAtom( HT3Atom,"H","HT3",G[ifrag].Residue,0.0,secondFrag);
1123 			HT3 = Nb-1;
1124 			/* set Bond Distance */
1125 			bondLength = 0.9/BOHR_TO_ANG;
1126 			HT3Atom[0] = G[O3P].X - G[C3P].X;
1127 			HT3Atom[1] = G[O3P].Y - G[C3P].Y;
1128 			HT3Atom[2] = G[O3P].Z - G[C3P].Z;
1129 			distance = sqrt(HT3Atom[0]*HT3Atom[0]+
1130 					HT3Atom[1]*HT3Atom[1]+
1131 					HT3Atom[2]*HT3Atom[2]);
1132 			lengthFactor = bondLength / distance;
1133 			G[HT3].X =  (gdouble)( HT3Atom[0] * lengthFactor + G[O3P].X);
1134 			G[HT3].Y =  (gdouble)( HT3Atom[1] * lengthFactor + G[O3P].Y);
1135 			G[HT3].Z =  (gdouble)( HT3Atom[2] * lengthFactor + G[O3P].Z);
1136 			/* end set bond */
1137 			SetAngle( Nb,G, C3P, O3P, HT3 , 109.5, NULL,0 );
1138 			SetTorsion( Nb,G, C4P, C3P, O3P, HT3, HT3Torsion, NULL,0);
1139 	}
1140 	return TRUE;
1141 }
1142 /********************************************************************************/
makeBasepair(gchar * sense,gchar * anti,gdouble senseAngle,gdouble antiAngle,gdouble separation)1143 static void makeBasepair( gchar* sense, gchar* anti, gdouble senseAngle, gdouble antiAngle, gdouble separation )
1144 {
1145 	gboolean fiveToThree = FALSE;
1146 	GtkWidget* entry = GTK_BIN (comboForm)->child;
1147 	G_CONST_RETURN gchar* form = gtk_entry_get_text(GTK_ENTRY(entry));
1148 	gdouble** aM=g_malloc(3*sizeof(gdouble*));/* Matrix 3D */
1149 	gdouble** sM=g_malloc(3*sizeof(gdouble*));/* Matrix 3D */
1150 	gdouble** aTmp = NULL;
1151 	gdouble** sTmp = NULL;
1152 	gint aNAtoms;
1153 	gint sNAtoms;
1154 	gdouble sFragC1P[2];
1155 	gdouble aFragC1P[2];
1156 	gdouble slideVector[2];
1157 	gdouble slideVectorLength;
1158 	gint j;
1159 	gint i;
1160        	Fragment sFrag;
1161        	Fragment aFrag;
1162 
1163 
1164 	for(j=0;j<3;j++)
1165 	{
1166 		aM[j] = g_malloc(4*sizeof(gdouble));
1167 		sM[j] = g_malloc(4*sizeof(gdouble));
1168 	}
1169 
1170        	sFrag = GetFragmentPNA( anti );
1171        	aFrag = GetFragmentPNA( sense );
1172 
1173 	if ( GTK_TOGGLE_BUTTON (buttonBuild53)->active )
1174 	{
1175 		Fragment temp = aFrag;
1176 		fiveToThree = TRUE;
1177 		aFrag = sFrag;
1178 		sFrag = temp;
1179 	}
1180 	if ( !strcmp(form,"z-form" ) )
1181 	{
1182 		Fragment temp = aFrag;
1183 		zform = TRUE;
1184 		aFrag = sFrag;
1185 		sFrag = temp;
1186 	}
1187 	else
1188 		zform = FALSE;
1189 
1190 	aNAtoms = aFrag.NAtoms;
1191 	sNAtoms = sFrag.NAtoms;
1192 	if(aNAtoms<=0)
1193 		return;
1194 	if(sNAtoms<=0)
1195 		return;
1196 
1197 	aTmp = g_malloc(aNAtoms*sizeof(gdouble*));
1198 	for(j=0;j<aNAtoms;j++)
1199 	{
1200 		aTmp[j] = g_malloc(3*sizeof(gdouble));
1201 		for(i=0;i<3;i++)
1202 			aTmp[j][i] = aFrag.Atoms[j].Coord[i];
1203 	}
1204 
1205 	sTmp = g_malloc(sNAtoms*sizeof(gdouble*));
1206 	for(j=0;j<sNAtoms;j++)
1207 	{
1208 		sTmp[j] = g_malloc(3*sizeof(gdouble));
1209 		for(i=0;i<3;i++)
1210 			sTmp[j][i] = sFrag.Atoms[j].Coord[i];
1211 	}
1212 
1213 
1214 
1215 	UnitMat3D(aM);
1216 	UnitMat3D(sM);/* transform to helical axis */
1217 	RotMat3D(aM, 180.0 ,0);
1218 	RotMat3D(sM, senseAngle ,2);
1219 	RotMat3D(aM, -antiAngle ,2);
1220 
1221 	TranslatMat3D(sM,0.0f, -(separation/2.0f), 0.0f );
1222 	TranslatMat3D(aM,0.0f,  (separation/2.0f), 0.0f );
1223 
1224 	TransformMat3D(sM, sTmp, sNAtoms);
1225 	TransformMat3D(aM, aTmp, aNAtoms);
1226 
1227 	UnitMat3D(aM);
1228 	UnitMat3D(sM);
1229 	RotMat3D(sM, -opening/2.0f ,2);
1230 	RotMat3D(aM, opening/2.0f ,2);
1231 	TransformMat3D(sM, sTmp, sNAtoms);
1232 	TransformMat3D(aM, aTmp, aNAtoms);
1233 
1234 	UnitMat3D(aM);
1235 	UnitMat3D(sM);
1236 	TranslatMat3D(sM, -xOffset, -stretch, 0.0f );
1237 	TranslatMat3D(aM, -xOffset, stretch, 0.0f );
1238 	TransformMat3D(sM, sTmp, sNAtoms);
1239 	TransformMat3D(aM, aTmp, aNAtoms);
1240 
1241 	UnitMat3D(aM);
1242 	UnitMat3D(sM);
1243 	RotMat3D(sM,  -tip + (propellerTwist/2.0f) ,1);
1244 	RotMat3D(aM, -tip - (propellerTwist/2.0f)  ,1);
1245 	RotMat3D(sM, -inclination + buckle  ,0);
1246 	RotMat3D(aM,  -inclination - buckle ,0);
1247 
1248 	TranslatMat3D(sM,  Dx - shear, 0.0f, stagger - totalRise );
1249 	TranslatMat3D(aM, Dx + shear, 0.0f, -stagger - totalRise );
1250 
1251 	RotMat3D(sM, totalTwist ,2);
1252 	RotMat3D(aM, totalTwist ,2);
1253 
1254 	TransformMat3D(sM, sTmp, sNAtoms);
1255 	TransformMat3D(aM, aTmp, aNAtoms);
1256 
1257 	sFragC1P[ 0 ] = sTmp[0][0];
1258 	sFragC1P[ 1 ] = sTmp[0][1];
1259 	for ( i = 0; i < sNAtoms; i++ )
1260 	{
1261 		gchar* Name = sFrag.Atoms[ i ].pdbType;
1262 		if ( !strcmp(Name, "C1'" ) )
1263 		{
1264 			sFragC1P[ 0 ] = sTmp[i][0];
1265 			sFragC1P[ 1 ] = sTmp[i][1];
1266 			break;
1267 		}
1268 	}
1269 	aFragC1P[ 0 ] = aTmp[0][0];
1270 	aFragC1P[ 1 ] = aTmp[0][1];
1271 	for ( i = 0; i < aNAtoms; i++ )
1272 	{
1273 		gchar* Name = aFrag.Atoms[ i ].pdbType;
1274 		if ( !strcmp(Name, "C1'" ) )
1275 		{
1276 			aFragC1P[ 0 ] = aTmp[i][0];
1277 			aFragC1P[ 1 ] = aTmp[i][1];
1278 			break;
1279 		}
1280 	}
1281 
1282 	slideVector[ 0 ] = sFragC1P[ 0 ] - aFragC1P[ 0 ];
1283 	slideVector[ 1 ] = sFragC1P[ 1 ] - aFragC1P[ 1 ];
1284 
1285 	slideVectorLength = (gdouble)sqrt(
1286 			slideVector[ 0 ] * slideVector[ 0 ] +
1287 			slideVector[ 1 ] * slideVector[ 1 ]
1288 			);
1289 	slideVector[ 0 ] = Dy * slideVector[ 0 ] / slideVectorLength;
1290 	slideVector[ 1 ] = Dy * slideVector[ 1 ] / slideVectorLength;
1291 
1292 	UnitMat3D(aM);
1293 	UnitMat3D(sM);
1294 	TranslatMat3D(sM,  slideVector[ 0 ], slideVector[ 1 ], 0.0f );
1295 	TranslatMat3D(aM,  slideVector[ 0 ], slideVector[ 1 ], 0.0f );
1296 	TransformMat3D(sM, sTmp, sNAtoms);
1297 	TransformMat3D(aM, aTmp, aNAtoms);
1298 
1299 	for(j=0;j<sNAtoms;j++)
1300 		for(i=0;i<3;i++)
1301 			sFrag.Atoms[j].Coord[i] = sTmp[j][i];
1302 
1303 	for(j=0;j<aNAtoms;j++)
1304 		for(i=0;i<3;i++)
1305 			aFrag.Atoms[j].Coord[i] = aTmp[j][i];
1306 
1307 	if ( GTK_TOGGLE_BUTTON (buttonSingle)->active )
1308 	{
1309 		if ( fiveToThree )
1310 		{
1311 			addFragment(sFrag);
1312 			setTorsionAngles( lastFrag+1, TRUE );
1313 			if ( lastSenseFrag != -1 )
1314 			{
1315 				gint fragmentDistance = abs( lastFrag+1- lastSenseFrag);
1316 				if ( fragmentDistance == 1 )
1317 				{
1318 					if ( zform )
1319 					{
1320 						fixBackbone( lastFrag+1, lastSenseFrag);
1321 					}
1322 					else
1323 					{
1324 						fixBackbone( lastSenseFrag,lastFrag+1 );
1325 					}
1326 				}
1327 			}
1328 			if ( GTK_TOGGLE_BUTTON (buttonCounterIon)->active )
1329 				addCounterIons(lastFrag+1 );
1330 			lastSenseFrag++;
1331 		}
1332 		else
1333 		{
1334 			addFragment(aFrag);
1335 			setTorsionAngles(  lastFrag+1, TRUE );
1336 			if ( lastAntiFrag != -1 )
1337 			{
1338 				gint fragmentDistance = abs( lastFrag+1 - lastAntiFrag);
1339 				if ( fragmentDistance == 1 )
1340 				{
1341 					if ( zform )
1342 					{
1343 						fixBackbone( lastAntiFrag, lastFrag+1 );
1344 					}
1345 					else
1346 					{
1347 						fixBackbone( lastFrag+1, lastAntiFrag );
1348 					}
1349 				}
1350 			}
1351 			if ( GTK_TOGGLE_BUTTON (buttonCounterIon)->active )
1352 				addCounterIons(lastFrag+1 );
1353 			lastAntiFrag++;
1354 		}
1355 	}
1356 	else
1357 	{
1358 		addFragment(sFrag);
1359 		setTorsionAngles( lastFrag+1, TRUE );
1360 		if ( GTK_TOGGLE_BUTTON (buttonCounterIon)->active )
1361 				addCounterIons(lastFrag+1 );
1362 		lastFrag++;
1363 		addFragment(aFrag );
1364 		setTorsionAngles(  lastFrag+1, FALSE );
1365 		if ( GTK_TOGGLE_BUTTON (buttonCounterIon)->active ) addCounterIons(lastFrag+1 );
1366 		if ( lastSenseFrag != -1 )
1367 		{
1368 			int fragmentDistance = abs( lastFrag - lastSenseFrag );
1369 			if ( fragmentDistance == 2 )
1370 			{
1371 				if ( zform )
1372 				{
1373 					fixBackbone( lastFrag, lastSenseFrag );
1374 				}
1375 				else
1376 				{
1377 					fixBackbone( lastSenseFrag, lastFrag );
1378 				}
1379 			}
1380 		}
1381 		if ( lastAntiFrag != -1 )
1382 		{
1383 			gint fragmentDistance = abs( lastFrag+1 - lastAntiFrag );
1384 			if ( fragmentDistance == 2 )
1385 			{
1386 				if ( zform )
1387 				{
1388 					fixBackbone( lastAntiFrag, lastFrag+1 );
1389 				}
1390 				else
1391 				{
1392 					fixBackbone( lastFrag+1, lastAntiFrag );
1393 				}
1394 			}
1395 		}
1396 		 lastSenseFrag = lastFrag;
1397 		 lastAntiFrag = lastFrag+1;
1398 	}
1399 	lastFrag++;
1400 	if ( oddBasepair )
1401 		oddBasepair = FALSE;
1402 	else
1403 		oddBasepair = TRUE;
1404 
1405 }
1406 /********************************************************************************/
getOneValue(gdouble * value,G_CONST_RETURN gchar * strValue,G_CONST_RETURN gchar * name)1407 static gboolean getOneValue(gdouble* value, G_CONST_RETURN gchar* strValue, G_CONST_RETURN gchar* name)
1408 {
1409 	gchar* t;
1410 	gchar* realSuggestion = N_("Suggestion: See if you put an O ( oh ) in instead of a 0 ( zero ) or l ( ell ) instead of 1 ( one ).");
1411 	GtkWidget* w;
1412 
1413 	if(!isFloat(strValue))
1414 	{
1415 		t = g_strdup_printf( _("The value for '%s' must be a number.\n%s"),name,realSuggestion);
1416 		w = Message(t,_("Error"),TRUE);
1417 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1418   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1419 		g_free(t);
1420 		return FALSE;
1421 	}
1422 	else
1423 		*value = atof(strValue);
1424 	return TRUE;
1425 }
1426 /********************************************************************************/
getParameters()1427 static gboolean getParameters()
1428 {
1429 	gboolean build53 = GTK_TOGGLE_BUTTON (buttonBuild53)->active;
1430 	G_CONST_RETURN gchar* tBeta = gtk_entry_get_text(GTK_ENTRY(Entrys[E_BETA]));
1431 	G_CONST_RETURN gchar* tGamma = gtk_entry_get_text(GTK_ENTRY(Entrys[E_GAMMA]));
1432 	G_CONST_RETURN gchar* tDelta = gtk_entry_get_text(GTK_ENTRY(Entrys[E_DELTA]));
1433 	G_CONST_RETURN gchar* tChi = gtk_entry_get_text(GTK_ENTRY(Entrys[E_CHI]));
1434 	G_CONST_RETURN gchar* tTip = gtk_entry_get_text(GTK_ENTRY(Entrys[E_TIP]));
1435 	G_CONST_RETURN gchar* tInclination = gtk_entry_get_text(GTK_ENTRY(Entrys[E_INCLINATION]));
1436 	G_CONST_RETURN gchar* tOpening = gtk_entry_get_text(GTK_ENTRY(Entrys[E_OPENNING]));
1437 	G_CONST_RETURN gchar* tPropellerTwist = gtk_entry_get_text(GTK_ENTRY(Entrys[E_PROPELLERTWIST]));
1438 	G_CONST_RETURN gchar* tBuckle = gtk_entry_get_text(GTK_ENTRY(Entrys[E_BUCKLE]));
1439 	G_CONST_RETURN gchar* tTwist = gtk_entry_get_text(GTK_ENTRY(Entrys[E_TWIST]));
1440 	G_CONST_RETURN gchar* tRoll = gtk_entry_get_text(GTK_ENTRY(Entrys[E_ROLL]));
1441 	G_CONST_RETURN gchar* tDx = gtk_entry_get_text(GTK_ENTRY(Entrys[E_XDISPLACEMENT]));
1442 	G_CONST_RETURN gchar* tDy = gtk_entry_get_text(GTK_ENTRY(Entrys[E_YDISPLACEMENT]));
1443 	G_CONST_RETURN gchar* tShear = gtk_entry_get_text(GTK_ENTRY(Entrys[E_SHEARSX]));
1444 	G_CONST_RETURN gchar* tStagger = gtk_entry_get_text(GTK_ENTRY(Entrys[E_STAGGERSZ]));
1445 	G_CONST_RETURN gchar* tStretch = gtk_entry_get_text(GTK_ENTRY(Entrys[E_STRETCHSY]));
1446 	G_CONST_RETURN gchar* tShift = gtk_entry_get_text(GTK_ENTRY(Entrys[E_SHIFTDX]));
1447 	G_CONST_RETURN gchar* tSlide = gtk_entry_get_text(GTK_ENTRY(Entrys[E_SLIDEDY]));
1448 	G_CONST_RETURN gchar* tRise = gtk_entry_get_text(GTK_ENTRY(Entrys[E_RISEDZ]));
1449 	G_CONST_RETURN gchar* tTilt = gtk_entry_get_text(GTK_ENTRY(Entrys[E_TILT]));
1450 	gchar* t;
1451 	GtkWidget* w;
1452 	GtkWidget* entryLeft = GTK_BIN (comboLeftButton)->child;
1453 	GtkWidget* entryRight = GTK_BIN (comboRightButton)->child;
1454 	gboolean DNA = GTK_TOGGLE_BUTTON (buttonDNA)->active;
1455 
1456 	if(custom5Value)
1457 		g_free(custom5Value);
1458 	if(custom3Value)
1459 		g_free(custom3Value);
1460 
1461 	if(DNA)
1462 	{
1463 		custom5Value = g_strdup_printf("d%s",gtk_entry_get_text(GTK_ENTRY(entryLeft)));
1464 		custom3Value = g_strdup_printf("d%s",gtk_entry_get_text(GTK_ENTRY(entryRight)));
1465 	}
1466 	else
1467 	{
1468 		custom5Value = g_strdup_printf("r%s",gtk_entry_get_text(GTK_ENTRY(entryLeft)));
1469 		custom3Value = g_strdup_printf("r%s",gtk_entry_get_text(GTK_ENTRY(entryRight)));
1470 	}
1471 	delete_all_spaces(custom5Value);
1472 	delete_all_spaces(custom3Value);
1473 
1474 	if ( ( capped3End ) && ( build53 ) )
1475 	{
1476 		t = g_strdup( _("The 3' end of the polynucleotide is already capped.  You cannot add more residues once you have capped the end.\nSuggestion: Don't cap the ends of the polynucleotide until you have finished building the entire sequence.") );
1477 		w = Message(t,_("Error"),TRUE);
1478 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1479   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1480 		g_free(t);
1481 		return FALSE;
1482 	}
1483 	if ( ( capped5End ) && ( !build53 ) )
1484 	{
1485 		t = g_strdup( _("The 5' end of the polynucleotide is already capped.  You cannot add more residues once you have capped the end.\nSuggestion: Don't cap the ends of the polynucleotide until you have finished building the entire sequence.") );
1486 		w = Message(t,_("Error"),TRUE);
1487 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1488   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1489 		g_free(t);
1490 		return FALSE;
1491 	}
1492 	if(!getOneValue(&beta,tBeta,"beta")) return FALSE;
1493 	if(!getOneValue(&gammalocal,tGamma,"gamma")) return FALSE;
1494 	if(!getOneValue(&delta,tDelta,"delta")) return FALSE;
1495 	if(!getOneValue(&chi,tChi,"chi")) return FALSE;
1496 	if(!getOneValue(&tip,tTip,"tip")) return FALSE;
1497 	if(!getOneValue(&inclination,tInclination,"inclination")) return FALSE;
1498 	if(!getOneValue(&opening,tOpening,"opening")) return FALSE;
1499 	if(!getOneValue(&propellerTwist,tPropellerTwist,"propellerTwist")) return FALSE;
1500 	if(!getOneValue(&buckle,tBuckle,"buckle")) return FALSE;
1501 	if(!getOneValue(&twist,tTwist,"twist")) return FALSE;
1502 	if(!getOneValue(&roll,tRoll,"roll")) return FALSE;
1503 	if(!getOneValue(&tilt,tTilt,"tilt")) return FALSE;
1504 	if(!getOneValue(&Dx,tDx,"Dx")) return FALSE;
1505 	if(!getOneValue(&Dy,tDy,"Dy")) return FALSE;
1506 	if(!getOneValue(&shear,tShear,"shear")) return FALSE;
1507 	if(!getOneValue(&stagger,tStagger,"stagger")) return FALSE;
1508 	if(!getOneValue(&stretch,tStretch,"stretch")) return FALSE;
1509 	if(!getOneValue(&shift,tShift,"shift")) return FALSE;
1510 	if(!getOneValue(&slide,tSlide,"slide")) return FALSE;
1511 	if(!getOneValue(&rise,tRise,"rise")) return FALSE;
1512 	Dx      /= BOHR_TO_ANG;
1513 	Dy      /= BOHR_TO_ANG;
1514 	shear   /= BOHR_TO_ANG;
1515 	stagger /= BOHR_TO_ANG;
1516 	stretch /= BOHR_TO_ANG;
1517 	rise    /= BOHR_TO_ANG;
1518 	shift   /= BOHR_TO_ANG;
1519 	slide   /= BOHR_TO_ANG;
1520 
1521 	if ( tip == 0 ){
1522 		tip = roll + previousTip;
1523 	}
1524 	else if ( ( roll != 0 ) && ( roll != tip - previousTip ) )
1525 	{
1526 		t = g_strdup( _("Your choices for tip and roll do not correlate.  Roll should equal the difference of tip and the previous tip.\nThis check is performed only when tip and roll are both set to nonzero values.  Suggestion:  make either roll = 0 and control the rotation about the y-axis using only tip or make tip = 0 and control the rotation with roll." ));
1527 		w = Message(t,_("Error"),TRUE);
1528 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1529   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1530 		g_free(t);
1531 		return FALSE;
1532 	}
1533 	if ( inclination == 0.0 ){
1534 		inclination = tilt + previousInclination;
1535 	}
1536 	else if ( ( tilt != 0 ) && ( tilt != inclination - previousInclination ) )
1537 	{
1538 		t = g_strdup(_("Your choices for tilt and inclination do not correlate.  Tilt should equal the difference of inclination and the previous inclination.\nThis check is performed only when tilt and inclination are both set to nonzero values.  Suggestion:  make either tilt = 0 and control the rotation about the x-axis using only inclination or make inclination = 0 and control the rotation with tilt.") );
1539 		w = Message(t,_("Error"),TRUE);
1540 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1541   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1542 		g_free(t);
1543 		return FALSE;
1544 	}
1545 	if ( Dy == 0.0 ){
1546 		Dy = slide + previousDy;
1547 	}
1548 	else if ( ( slide != 0 ) && ( slide != Dy - previousDy ) )
1549 	{
1550 		t = g_strdup(_("Your choices for dy and slide do not correlate.  Slide should equal the difference of dy and the previous dy.\nThis check is performed only when dy and slide are both set to nonzero values.  Suggestion:  make either dy = 0 and control the translation along the y-axis using only slide or make slide = 0 and control the translation with dy.") );
1551 		w = Message(t,_("Error"),TRUE);
1552 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1553   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1554 		g_free(t);
1555 		return FALSE;
1556 	}
1557 	if ( Dx == 0.0 ){
1558 		Dx = shift + previousDx;
1559 	}
1560 	else if ( ( shift != 0 ) && ( shift != Dx - previousDx ) ){
1561 		t = g_strdup(_("Your choices for dx and shift do not correlate.  Shift should equal the difference of dx and the previous dx.\nThis check is performed only when dx and shift are both set to nonzero values.  Suggestion:  make either dx = 0 and control the translation along the x-axis using only shift or make shift = 0 and control the translation with dx.") );
1562 		w = Message(t,_("Error"),TRUE);
1563 		gtk_window_set_modal(GTK_WINDOW(w),TRUE);
1564   		gtk_window_set_transient_for(GTK_WINDOW(w),GTK_WINDOW(WinPNADlg));
1565 		g_free(t);
1566 		return FALSE;
1567 	}
1568 	previousTip = tip;
1569 	previousInclination = inclination;
1570 	previousDx = Dx;
1571 	previousDy = Dy;
1572 	totalRise += rise;
1573 	totalTwist -= twist;
1574 	return TRUE;
1575 }
1576 /********************************************************************************/
buildNucleicAcid(GtkWidget * w,gpointer data)1577 static void buildNucleicAcid(GtkWidget *w,gpointer data)
1578 {
1579 	static gdouble AT_SEPARATION = 10.44/BOHR_TO_ANG, CG_SEPARATION = 10.72/BOHR_TO_ANG;
1580 	static gdouble CYT_ANGLE = 34.3, GUA_ANGLE = 35.6, THY_ANGLE = 32.6, ADE_ANGLE = 33.8;
1581 	gchar* tbutton = (gchar*)data;
1582 	gboolean DNA = GTK_TOGGLE_BUTTON (buttonDNA)->active;
1583 	gboolean build53 = GTK_TOGGLE_BUTTON (buttonBuild53)->active;
1584 	gboolean Single = GTK_TOGGLE_BUTTON (buttonSingle)->active;
1585 
1586 	if(!getParameters())
1587 		return;
1588 	if ( !strcmp(tbutton,"A - (T)") )
1589 	{
1590 		if ( DNA)
1591 			makeBasepair( "dADE","dTHY", ADE_ANGLE, THY_ANGLE,  AT_SEPARATION );
1592 		else
1593 			makeBasepair( "rADE", "rTHY", ADE_ANGLE, THY_ANGLE,  AT_SEPARATION );
1594 	}
1595 	else if ( !strcmp(tbutton, "A - (U)") )
1596 	{
1597 		if ( DNA )
1598 			makeBasepair( "dADE", "dURA", ADE_ANGLE, THY_ANGLE,  AT_SEPARATION );
1599 		else
1600 			makeBasepair( "rADE", "rURA", ADE_ANGLE, THY_ANGLE,  AT_SEPARATION );
1601 	}
1602 	else if ( !strcmp(tbutton, "C - (G)") )
1603 	{
1604 		if ( DNA )
1605 			makeBasepair( "dCYT", "dGUA", CYT_ANGLE, GUA_ANGLE, CG_SEPARATION );
1606 		else
1607 			makeBasepair( "rCYT", "rGUA", CYT_ANGLE, GUA_ANGLE, CG_SEPARATION );
1608 	}
1609 	else if ( !strcmp(tbutton,"G - (C)") )
1610 	{
1611 		if ( DNA )
1612 			makeBasepair( "dGUA", "dCYT", GUA_ANGLE, CYT_ANGLE, CG_SEPARATION );
1613 		else
1614 			makeBasepair( "rGUA", "rCYT", GUA_ANGLE, CYT_ANGLE, CG_SEPARATION );
1615 	}
1616 	else if (  !strcmp(tbutton, "T - (A)") )
1617 	{
1618 		if ( DNA )
1619 			makeBasepair( "dTHY", "dADE", THY_ANGLE, ADE_ANGLE,  AT_SEPARATION );
1620 		else
1621 			makeBasepair( "rTHY", "rADE", THY_ANGLE, ADE_ANGLE,  AT_SEPARATION );
1622 	}
1623 	else if (  !strcmp(tbutton, "U - (A)") )
1624 	{
1625 		if ( DNA )
1626 			makeBasepair( "dURA", "dADE", THY_ANGLE, ADE_ANGLE,  AT_SEPARATION );
1627 		else
1628 			makeBasepair( "rURA", "rADE", THY_ANGLE, ADE_ANGLE,  AT_SEPARATION );
1629 	}
1630 	else if (  !strcmp(tbutton, "3'-CAP") )
1631 	{
1632 		gboolean fiveToThree = FALSE;
1633 		gboolean doubleStranded = FALSE;
1634 		capped3End = FALSE;
1635 		if ( build53 )
1636 			fiveToThree = TRUE;
1637 		if ( !Single )
1638 			doubleStranded = TRUE;
1639 		if( cap(fiveToThree, doubleStranded, FALSE ) )
1640 		{
1641 			gint i;
1642 			capped3End = TRUE;
1643 			gtk_widget_set_sensitive(Buttons[B_3CAP], FALSE);
1644 			if(capped5End)
1645 			{
1646 				for(i=0;i<NBUTTONS;i++)
1647 					gtk_widget_set_sensitive(Buttons[i], FALSE);
1648 			}
1649 		}
1650 	}
1651 	else if (  !strcmp(tbutton, "5'-CAP") )
1652 	{
1653 		gboolean fiveToThree = FALSE;
1654 		gboolean doubleStranded = FALSE;
1655 		capped5End = FALSE;
1656 		if ( build53)
1657 			fiveToThree = TRUE;
1658 		if ( !Single)
1659 			doubleStranded = TRUE;
1660 		if( cap(fiveToThree, doubleStranded, TRUE ) )
1661 		{
1662 			gint i;
1663 			capped5End = TRUE;
1664 			gtk_widget_set_sensitive(Buttons[B_5CAP], FALSE);
1665 			if(capped3End)
1666 			{
1667 				for(i=0;i<NBUTTONS;i++)
1668 					gtk_widget_set_sensitive(Buttons[i], FALSE);
1669 			}
1670 		}
1671 	}
1672 	else if (  !strcmp(tbutton,"Custom"))
1673 	{
1674 		makeBasepair( custom5Value, custom3Value, THY_ANGLE, ADE_ANGLE,  AT_SEPARATION );
1675 	}
1676 
1677 	if(Nb>0)
1678 	{
1679 		defineGeometryToDraw();
1680 		reset_all_connections();
1681 		define_good_factor();
1682 		create_GeomXYZ_from_draw_grometry();
1683 		unselect_all_atoms();
1684 		reset_charges_multiplicities();
1685 		drawGeom();
1686 	}
1687 }
1688 /********************************************************************************/
resetSensitivitieButtons(GtkWidget * win,gpointer data)1689 static void resetSensitivitieButtons(GtkWidget* win, gpointer data)
1690 {
1691 	gboolean Ok = FALSE;
1692 
1693 	if(GTK_TOGGLE_BUTTON (buttonDNA)->active)
1694 		Ok = TRUE;
1695 
1696 	gtk_widget_set_sensitive(Buttons[B_AU], !Ok);
1697 	gtk_widget_set_sensitive(Buttons[B_UA], !Ok);
1698 	gtk_widget_set_sensitive(Buttons[B_AT], Ok);
1699 	gtk_widget_set_sensitive(Buttons[B_TA], Ok);
1700 }
1701 /********************************************************************************/
resetFormList(GtkWidget * win,gpointer data)1702 static void resetFormList(GtkWidget* win, gpointer data)
1703 {
1704 	gint i;
1705 	GList *list=NULL;
1706 
1707 	if(GTK_TOGGLE_BUTTON (buttonDNA)->active)
1708 	{
1709 		for (i=0;i<numberDNAFormList;i++)
1710 			list=g_list_append(list,formDNAList[i]);
1711 		gtk_combo_box_entry_set_popdown_strings(comboForm,list);
1712 		gtk_entry_set_text(GTK_ENTRY(GTK_BIN(comboForm)->child),formDNAList[1]);
1713 	}
1714 	else
1715 	{
1716 		for (i=0;i<numberRNAFormList;i++)
1717 			list=g_list_append(list,formRNAList[i]);
1718 		gtk_combo_box_entry_set_popdown_strings(comboForm,list);
1719 	}
1720 }
1721 /********************************************************************************/
resetSensitivitieEntrys(GtkWidget * win,gpointer data)1722 static void resetSensitivitieEntrys(GtkWidget* win, gpointer data)
1723 {
1724 	gint i;
1725 	GtkWidget* entry = GTK_BIN(comboForm)->child;
1726 	G_CONST_RETURN gchar* form = gtk_entry_get_text(GTK_ENTRY(entry));
1727 
1728 	for(i=0;i<NENTRYS;i++)
1729 	{
1730 		if(!strcmp(form,"custom"))
1731 			gtk_widget_set_sensitive(Entrys[i], TRUE);
1732 		else
1733 			gtk_widget_set_sensitive(Entrys[i], FALSE);
1734 	}
1735 	gtk_widget_set_sensitive(Entrys[E_ALPHA], FALSE);
1736 	gtk_widget_set_sensitive(Entrys[E_EPSILON], FALSE);
1737 	gtk_widget_set_sensitive(Entrys[E_ZETA], FALSE);
1738 }
1739 /********************************************************************************/
resetValueEntrys(GtkWidget * win,gpointer data)1740 static void resetValueEntrys(GtkWidget* win, gpointer data)
1741 {
1742 	gint i;
1743 	GtkWidget* entry = GTK_BIN(comboForm)->child;
1744 	G_CONST_RETURN gchar* form = gtk_entry_get_text(GTK_ENTRY(entry));
1745 	gchar** values = NULL;
1746 	if(!strcmp(form,"a-form"))
1747 	{
1748 		if(GTK_TOGGLE_BUTTON (buttonDNA)->active)
1749 			values = aformDNA;
1750 		else
1751 			values = aformRNA;
1752 
1753 	}
1754 	else
1755 	if(!strcmp(form,"a'-form"))
1756 			values = apformRNA;
1757 	else
1758 	if(!strcmp(form,"b-form"))
1759 			values = bformDNA;
1760 	else
1761 	if(!strcmp(form,"b'-form"))
1762 			values = bpformDNA;
1763 	else
1764 	if(!strcmp(form,"c-form"))
1765 			values = cformDNA;
1766 	else
1767 	if(!strcmp(form,"c'-form"))
1768 			values = cpformDNA;
1769 	else
1770 	if(!strcmp(form,"c''-form"))
1771 			values = csformDNA;
1772 	else
1773 	if(!strcmp(form,"d-form"))
1774 			values = dformDNA;
1775 	else
1776 	if(!strcmp(form,"e-form"))
1777 			values = eformDNA;
1778 	else
1779 	if(!strcmp(form,"t-form"))
1780 			values = tformDNA;
1781 	else
1782 	if(!strcmp(form,"z-form"))
1783 			values = z2formDNA;
1784 
1785 	if(!values)
1786 		return;
1787 
1788 	for(i=0;i<NENTRYS;i++)
1789 		gtk_entry_set_text(GTK_ENTRY(Entrys[i]), values[i]);
1790 }
1791 /********************************************************************************/
resetZFormDNA(GtkWidget * win,gpointer data)1792 static void resetZFormDNA(GtkWidget* win, gpointer data)
1793 {
1794 	GtkWidget* entryForm = GTK_BIN(comboForm)->child;
1795 	G_CONST_RETURN gchar* form = gtk_entry_get_text(GTK_ENTRY(entryForm));
1796 	G_CONST_RETURN gchar* tip = gtk_entry_get_text(GTK_ENTRY(Entrys[E_TIP]));
1797 	GtkWidget* entrySugar = GTK_BIN(comboSugar)->child;
1798 	gint i;
1799 
1800 	if(strcmp(form,"z-form")!=0)
1801 		return;
1802 	gtk_entry_set_text(GTK_ENTRY(entrySugar),sugarList[0]);
1803 	if(strcmp(tip,z1formDNA[E_TIP])==0)
1804 	{
1805 		for(i=0;i<NENTRYS;i++)
1806 			gtk_entry_set_text(GTK_ENTRY(Entrys[i]), z2formDNA[i]);
1807 	}
1808 	else
1809 	{
1810 		for(i=0;i<NENTRYS;i++)
1811 			gtk_entry_set_text(GTK_ENTRY(Entrys[i]), z1formDNA[i]);
1812 	}
1813 
1814 
1815 }
1816 /********************************************************************************/
resetSugarEntry(GtkWidget * win,gpointer data)1817 static void resetSugarEntry(GtkWidget* win, gpointer data)
1818 {
1819 	GtkWidget* entryForm = GTK_BIN(comboForm)->child;
1820 	GtkWidget* entrySugar = GTK_BIN(comboSugar)->child;
1821 	G_CONST_RETURN gchar* form = gtk_entry_get_text(GTK_ENTRY(entryForm));
1822 	gchar* value = NULL;
1823 	if(!strcmp(form,"a-form"))
1824 		value = g_strdup("C3'-endo");
1825 	else
1826 	if(!strcmp(form,"a'-form"))
1827 			value = g_strdup("C3'-endo");
1828 	else
1829 	if(!strcmp(form,"b-form"))
1830 			value = g_strdup("C2'-endo");
1831 	else
1832 	if(!strcmp(form,"b'-form"))
1833 			value = g_strdup("C3'-exo");
1834 	else
1835 	if(!strcmp(form,"c-form"))
1836 			value = g_strdup("C3'-exo");
1837 	else
1838 	if(!strcmp(form,"c'-form"))
1839 			value = g_strdup("C3'-exo");
1840 	else
1841 	if(!strcmp(form,"c''-form"))
1842 			value = g_strdup("C3'-exo");
1843 	else
1844 	if(!strcmp(form,"d-form"))
1845 			value = g_strdup("C3'-exo");
1846 	else
1847 	if(!strcmp(form,"e-form"))
1848 			value = g_strdup("C3'-exo");
1849 	else
1850 	if(!strcmp(form,"t-form"))
1851 			value = g_strdup("C2'-endo");
1852 	else
1853 	if(!strcmp(form,"z-form"))
1854 			value = g_strdup("C3'-endo");
1855 
1856 	if(!value)
1857 		return;
1858 
1859 	gtk_entry_set_text(GTK_ENTRY(entrySugar), value);
1860 }
1861 
1862 /********************************************************************************/
resetTypeList(GtkWidget * win,gpointer data)1863 static void resetTypeList(GtkWidget* win, gpointer data)
1864 {
1865 	gint i;
1866 	GList *list=NULL;
1867 
1868 	if(GTK_TOGGLE_BUTTON (buttonDNA)->active)
1869 	{
1870 		for (i=0;i<numberDNATypeList;i++)
1871 			list=g_list_append(list,typeDNAList[i]);
1872 	}
1873 	else
1874 	{
1875 		for (i=0;i<numberRNATypeList;i++)
1876 			list=g_list_append(list,typeRNAList[i]);
1877 	}
1878 	gtk_combo_box_entry_set_popdown_strings(comboLeftButton,list);
1879 	gtk_combo_box_entry_set_popdown_strings(comboRightButton,list);
1880 }
1881 /********************************************************************************/
resetFragList(GtkWidget * button,gpointer data)1882 static void resetFragList(GtkWidget* button, gpointer data)
1883 {
1884 	G_CONST_RETURN gchar* tbutton;
1885 	G_CONST_RETURN gchar* oldFragList;
1886 	gchar* fragList;
1887 
1888 	if(!data)
1889 		return;
1890 	tbutton = (gchar*) data;
1891 	oldFragList = gtk_entry_get_text(GTK_ENTRY(entryFragList));
1892 
1893 	if(strcmp(tbutton,"Custom")!=0)
1894 	{
1895 		if(tbutton[0] != '3' && tbutton[0] != '5')
1896 			fragList = g_strdup_printf("%s%c",oldFragList,tbutton[0]);
1897 		else
1898 			fragList = g_strdup(oldFragList);
1899 	}
1900 	else
1901 	{
1902 		GtkWidget* entry = GTK_BIN(comboLeftButton)->child;
1903 		tbutton = gtk_entry_get_text(GTK_ENTRY(entry));
1904 
1905 		if ( !strcmp(tbutton,"ADE" ) ||
1906 			 !strcmp(tbutton,"CYT" ) ||
1907 			 !strcmp(tbutton,"GUA" ) ||
1908 			 !strcmp(tbutton,"THY" ) ||
1909 			 !strcmp(tbutton,"URA" ) ||
1910 			 !strcmp(tbutton," I " ) ||
1911 			 !strcmp(tbutton," Y " )
1912 			)
1913 		{
1914 
1915 			if(tbutton[0] != ' ')
1916 				fragList = g_strdup_printf("%s%c",oldFragList,tbutton[0]);
1917 			else
1918 				fragList = g_strdup_printf("%s%c",oldFragList,tbutton[1]);
1919 		}
1920 		else
1921 			fragList = g_strdup_printf("%s(%s)",oldFragList,tbutton);
1922 	}
1923 
1924 	gtk_entry_set_text(GTK_ENTRY(entryFragList),fragList);
1925 }
1926 /********************************************************************************/
resetButtonCustom(GtkWidget * win,gpointer data)1927 static void resetButtonCustom(GtkWidget* win, gpointer data)
1928 {
1929 	GtkWidget* entryLeft = GTK_BIN(comboLeftButton)->child;
1930 	GtkWidget* entryRight = GTK_BIN(comboRightButton)->child;
1931 	G_CONST_RETURN gchar* textLeft = gtk_entry_get_text(GTK_ENTRY(entryLeft));
1932 	G_CONST_RETURN gchar* textRight = gtk_entry_get_text(GTK_ENTRY(entryRight));
1933 	GtkWidget* button;
1934 	gchar* tbutton = g_strdup_printf("%s-(%s)",textLeft,textRight);
1935 
1936 	button = gtk_button_new_with_label(tbutton);
1937 	gtk_widget_destroy(Buttons[B_ALL]);
1938 	Buttons[B_ALL] = button;
1939 	gtk_box_pack_start (GTK_BOX (hboxCustom), Buttons[B_ALL], TRUE, TRUE, 0);
1940 	gtk_widget_show (button);
1941 	g_signal_connect(G_OBJECT(button), "clicked",(GCallback)resetFragList,tbuttons[B_ALL]);
1942 	g_signal_connect(G_OBJECT(button), "clicked",(GCallback)buildNucleicAcid,tbuttons[B_ALL]);
1943 }
1944 /********************************************************************************/
newCombo(gchar ** tlist,gint nlist,gboolean edit)1945 static GtkWidget*  newCombo(gchar **tlist,gint nlist, gboolean edit)
1946 {
1947 	GtkWidget* combo;
1948 	GList *list=NULL;
1949 	gint i;
1950 	combo = gtk_combo_box_entry_new_text();
1951 	for (i=0;i<nlist;i++)
1952 		list=g_list_append(list,tlist[i]);
1953 	gtk_combo_box_entry_set_popdown_strings(combo,list);
1954 
1955  	gtk_editable_set_editable((GtkEditable*) GTK_BIN(combo)->child,edit);
1956 	return combo;
1957 }
1958 /********************************************************************************/
newLeftEntry()1959 static GtkWidget* newLeftEntry()
1960 {
1961 	GtkWidget* entry;
1962 	entry = gtk_entry_new();
1963 	gtk_widget_set_size_request(GTK_WIDGET(entry),(gint)(ScreenHeight*0.1),-1);
1964 	return entry;
1965 }
1966 /********************************************************************************/
newLeftLabel(gchar * tlabel)1967 static GtkWidget* newLeftLabel(gchar* tlabel)
1968 {
1969 	GtkWidget* label;
1970 	GtkWidget* hbox;
1971 	label = gtk_label_new(tlabel);
1972 	gtk_label_set_justify(GTK_LABEL(label),GTK_JUSTIFY_LEFT);
1973 	hbox = gtk_hbox_new (FALSE, 5);
1974 	gtk_widget_show (hbox);
1975 	gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 2);
1976 	return hbox;
1977 }
1978 /********************************************************************************/
newLabelEntry(GtkWidget * table,EntryNumbers entryNum,gint l,gint c)1979 static void newLabelEntry(GtkWidget* table,EntryNumbers entryNum,gint l, gint c)
1980 {
1981 	GtkWidget* label1;
1982 	GtkWidget* label2;
1983 	label1 = newLeftLabel(tlabels[entryNum]);
1984 	label2 = newLeftLabel(" : ");
1985 	Entrys [entryNum] = newLeftEntry();
1986 	gtk_table_attach(GTK_TABLE(table),label1,c,c+1,l,l+1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
1987 	gtk_table_attach(GTK_TABLE(table),label2,c+1,c+2,l,l+1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
1988 	gtk_table_attach(GTK_TABLE(table),Entrys [entryNum],c+2,c+3,l,l+1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
1989 }
1990 /********************************************************************************/
initVariables()1991 static void initVariables()
1992 {
1993 	gint i;
1994 
1995 	for(i=0;i<NENTRYS;i++) Entrys[i] = NULL;
1996 
1997 	lastSenseFrag = -1;
1998 	lastAntiFrag = -1;
1999 	lastFrag = -1;
2000 	zform = FALSE;
2001 	oddBasepair  = TRUE;
2002 	opening = 0.0;
2003 	xOffset =  2.485/BOHR_TO_ANG;
2004 	stretch = 0.0/BOHR_TO_ANG;
2005 	tip = 0.0;
2006 	propellerTwist = 0.0;
2007 	inclination = 0.0;
2008 	buckle = 0.0;
2009 	Dx = 0.0/BOHR_TO_ANG;
2010 	Dy = 0.0/BOHR_TO_ANG;
2011 	shear = 0.0/BOHR_TO_ANG;
2012 	stagger = 0.0/BOHR_TO_ANG;
2013 	totalRise = 0.0/BOHR_TO_ANG;
2014 	totalTwist = 0.0;
2015 	twist = 0.0;
2016 	roll  = 0.0;
2017 	tilt  = 0.0;
2018 	shift = 0.0/BOHR_TO_ANG;
2019 	slide = 0.0/BOHR_TO_ANG;
2020 	rise  = 0.0/BOHR_TO_ANG;
2021 	previousTip  = 0.0;
2022 	previousInclination  = 0.0;
2023 	previousDy  = 0.0/BOHR_TO_ANG;
2024 	previousDx  = 0.0/BOHR_TO_ANG;
2025 
2026 	alpha = 0.0;
2027 	beta = 0.0;
2028 	gammalocal = 0.0;
2029 	delta = 0.0;
2030 	epsilon = 0.0;
2031 	zeta = 0.0;
2032 	chi = 0.0;
2033 
2034 	capped3End = FALSE;
2035 	capped5End = FALSE;
2036 	if(Nb>0)
2037 	{
2038 		gint i;
2039                 for (i=0;i<Nb;i++)
2040 		{
2041 			g_free(G[i].Prop.name);
2042 			g_free(G[i].Prop.symbol);
2043 			g_free(G[i].mmType);
2044 			g_free(G[i].pdbType);
2045 			g_free(G[i].Residue);
2046 		}
2047 
2048 		if(G) g_free(G);
2049 	}
2050 	Nb=0;
2051 	G = NULL;
2052 
2053 	if(custom5Value) g_free(custom5Value);
2054 	custom5Value = NULL;
2055 
2056 	if(custom3Value) g_free(custom3Value);
2057 	custom3Value = NULL;
2058 }
2059 /*****************************************************************************/
destroyDlg(GtkWidget * Dlg,gpointer data)2060 static void destroyDlg(GtkWidget* Dlg,gpointer data)
2061 {
2062 	delete_child(Dlg);
2063 
2064 	activate_rotation();
2065 }
2066 /*****************************************************************************/
addGeneral(GtkWidget * Dlg,GtkWidget * box)2067 static void addGeneral(GtkWidget* Dlg,GtkWidget *box)
2068 {
2069 	GtkWidget* combo;
2070 	GtkWidget* frame;
2071 	GtkWidget* vbox;
2072 	GtkWidget* table;
2073 	GtkWidget* label;
2074 	GtkWidget* entry;
2075 	GtkWidget* table2;
2076 	GtkWidget *hseparator = gtk_hseparator_new ();
2077 	GtkWidget *hseparator1 = gtk_hseparator_new ();
2078 	GtkWidget *hseparator2 = gtk_hseparator_new ();
2079 	GtkWidget *vseparator = gtk_vseparator_new ();
2080 	GtkWidget *vseparator1 = gtk_vseparator_new ();
2081 	GtkWidget *vseparator2 = gtk_vseparator_new ();
2082 
2083 	frame = gtk_frame_new (NULL);
2084 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
2085 	gtk_container_set_border_width (GTK_CONTAINER (frame), 5);
2086 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
2087 	gtk_widget_show (frame);
2088 
2089 	vbox= create_vbox(frame);
2090 
2091 	table = gtk_table_new(2,5,FALSE);
2092 	gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 3);
2093 
2094 
2095 	buttonDNA = gtk_radio_button_new_with_label(NULL,_("DNA      "));
2096 	gtk_table_attach(GTK_TABLE(table),buttonDNA,0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2097 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonDNA ), TRUE);
2098 
2099 	buttonRNA = gtk_radio_button_new_with_label(
2100 			   gtk_radio_button_get_group (GTK_RADIO_BUTTON (buttonDNA)),
2101 				"RNA      ");
2102 	gtk_table_attach(GTK_TABLE(table),buttonRNA,0,1,1,2,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2103 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonRNA), FALSE);
2104 
2105 	gtk_table_attach(GTK_TABLE(table),vseparator1,1,2,0,2,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2106 
2107 	buttonBuild35 = gtk_radio_button_new_with_label(NULL,_("Build 3' to 5'"));
2108 	gtk_table_attach(GTK_TABLE(table),buttonBuild35,2,3,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2109 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonBuild35), FALSE);
2110 
2111 	buttonBuild53 = gtk_radio_button_new_with_label(
2112 			   gtk_radio_button_get_group (GTK_RADIO_BUTTON (buttonBuild35)),
2113 				"Build 5' to 3'");
2114 	gtk_table_attach(GTK_TABLE(table),buttonBuild53,2,3,1,2,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2115 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonBuild53), TRUE);
2116 
2117 	gtk_table_attach(GTK_TABLE(table),vseparator2,3,4,0,2,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2118 
2119 	buttonSingle = gtk_radio_button_new_with_label(NULL,_("Single Stranded"));
2120 	gtk_table_attach(GTK_TABLE(table),buttonSingle,4,5,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2121 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonSingle), FALSE);
2122 
2123 	buttonDouble= gtk_radio_button_new_with_label(
2124 			   gtk_radio_button_get_group (GTK_RADIO_BUTTON (buttonSingle)),
2125 				_("Double Stranded"));
2126 	gtk_table_attach(GTK_TABLE(table),buttonDouble,4,5,1,2,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2127 	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (buttonDouble), TRUE);
2128 
2129 	gtk_box_pack_start (GTK_BOX (vbox), hseparator, TRUE, TRUE, 3);
2130 
2131 	table2 = gtk_table_new(1,7,FALSE);
2132 	gtk_box_pack_start (GTK_BOX (vbox), table2, TRUE, TRUE, 3);
2133 
2134 	label = newLeftLabel(_("Form"));
2135     gtk_table_attach(GTK_TABLE(table2),label,0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2136 	label = newLeftLabel(" : ");
2137     gtk_table_attach(GTK_TABLE(table2),label,1,2,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2138 	combo = newCombo(formDNAList,numberDNAFormList ,FALSE);
2139 	entry = GTK_BIN (combo)->child;
2140 	gtk_entry_set_text(GTK_ENTRY(entry),formDNAList[1]);
2141 	gtk_widget_set_size_request(GTK_WIDGET(entry),(gint)(ScreenHeight*0.1),-1);
2142 	gtk_table_attach(GTK_TABLE(table2),combo,2,3,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2143 	comboForm = combo;
2144 
2145 	gtk_table_attach(GTK_TABLE(table2),vseparator,3,4,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),5,1);
2146 
2147 	label = newLeftLabel(_("Sugar Pucker"));
2148     gtk_table_attach(GTK_TABLE(table2),label,4,5,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2149 	label = newLeftLabel(" : ");
2150     gtk_table_attach(GTK_TABLE(table2),label,5,6,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2151 	combo  = newCombo(sugarList,numberSugarList,FALSE);
2152 	entry = GTK_BIN (combo)->child;
2153 	gtk_widget_set_size_request(GTK_WIDGET(entry),(gint)(ScreenHeight*0.1),-1);
2154 	gtk_table_attach(GTK_TABLE(table2),combo,6,7,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2155 	comboSugar = combo;
2156 
2157 	gtk_box_pack_start (GTK_BOX (vbox), hseparator1, TRUE, TRUE, 3);
2158 
2159 	buttonCounterIon = gtk_check_button_new_with_label (_("Add Counter Ion"));
2160 	gtk_box_pack_start (GTK_BOX (vbox), buttonCounterIon, FALSE, TRUE, 1);
2161 
2162 	gtk_box_pack_start (GTK_BOX (vbox), hseparator2, TRUE, TRUE, 0);
2163 
2164 	entry = gtk_entry_new();
2165 	gtk_box_pack_start (GTK_BOX (vbox), entry, TRUE, TRUE, 0);
2166 	gtk_widget_set_sensitive(entry, FALSE);
2167 	entryFragList = entry;
2168 
2169 }
2170 /******************************************************************************/
addButtons(GtkWidget * Dlg,GtkWidget * box)2171 static void addButtons(GtkWidget *Dlg,GtkWidget* box)
2172 {
2173 	GtkWidget* frame;
2174 	GtkWidget* vbox;
2175 	GtkWidget* table;
2176 	GtkWidget* combo;
2177 	GtkWidget* entry;
2178 	GtkWidget *hseparator = gtk_hseparator_new ();
2179 	gint i;
2180 
2181 #define NLIGNES		7
2182 #define NCOLONNS	2
2183 
2184 	frame = gtk_frame_new (NULL);
2185 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
2186 	gtk_container_set_border_width (GTK_CONTAINER (frame), 5);
2187 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
2188 	gtk_widget_show (frame);
2189 
2190 	vbox= create_vbox(frame);
2191 
2192 	table = gtk_table_new(NLIGNES,NCOLONNS,FALSE);
2193 	gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 3);
2194 
2195 	Buttons[B_AT] = gtk_button_new_with_label(tbuttons[B_AT]);
2196 	gtk_table_attach(GTK_TABLE(table),Buttons[B_AT],0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2197 
2198 	Buttons[B_AU] = gtk_button_new_with_label(tbuttons[B_AU]);
2199 	gtk_table_attach(GTK_TABLE(table),Buttons[B_AU],1,2,0,1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2200 
2201 	Buttons[B_CG] = gtk_button_new_with_label(tbuttons[B_CG]);
2202 	gtk_table_attach(GTK_TABLE(table),Buttons[B_CG],0,1,1,2,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2203 
2204 	Buttons[B_GC] = gtk_button_new_with_label(tbuttons[B_GC]);
2205 	gtk_table_attach(GTK_TABLE(table),Buttons[B_GC],1,2,1,2,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2206 
2207 	Buttons[B_TA] = gtk_button_new_with_label(tbuttons[B_TA]);
2208 	gtk_table_attach(GTK_TABLE(table),Buttons[B_TA],0,1,2,3,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2209 
2210 	Buttons[B_UA] = gtk_button_new_with_label(tbuttons[B_UA]);
2211 	gtk_table_attach(GTK_TABLE(table),Buttons[B_UA],1,2,2,3,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2212 
2213 	Buttons[B_5CAP] = gtk_button_new_with_label(tbuttons[B_5CAP]);
2214 	gtk_table_attach(GTK_TABLE(table),Buttons[B_5CAP],0,1,3,4,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2215 
2216 	Buttons[B_3CAP] = gtk_button_new_with_label(tbuttons[B_3CAP]);
2217 	gtk_table_attach(GTK_TABLE(table),Buttons[B_3CAP],1,2,3,4,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2218 
2219 	gtk_table_attach(GTK_TABLE(table),hseparator,0,2,4,5,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,5);
2220 
2221 	combo  = newCombo(typeDNAList,numberDNATypeList ,FALSE);
2222 	entry = GTK_BIN (combo)->child;
2223 	gtk_widget_set_size_request(GTK_WIDGET(entry),(gint)(ScreenHeight*0.05),-1);
2224 	gtk_table_attach(GTK_TABLE(table),combo,0,1,5,6,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2225 	comboLeftButton = combo;
2226 
2227 	combo  = newCombo(typeDNAList,numberDNATypeList ,FALSE);
2228 	entry = GTK_BIN (combo)->child;
2229 	gtk_widget_set_size_request(GTK_WIDGET(entry),(gint)(ScreenHeight*0.05),-1);
2230 	gtk_table_attach(GTK_TABLE(table),combo,1,2,5,6,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),1,1);
2231 	comboRightButton = combo;
2232 
2233 
2234 	hboxCustom = gtk_hbox_new (FALSE, 5);
2235 	Buttons[B_ALL] = gtk_button_new_with_label(tbuttons[B_ALL]);
2236 	gtk_box_pack_start (GTK_BOX (hboxCustom), Buttons[B_ALL], TRUE, TRUE, 0);
2237 	gtk_widget_show (hboxCustom);
2238 	gtk_table_attach(GTK_TABLE(table),hboxCustom,0,2,6,7,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),1,1);
2239 
2240 	for(i=0;i<NBUTTONS;i++)
2241 	{
2242 		g_signal_connect(G_OBJECT(Buttons[i]), "clicked",(GCallback)resetFragList,tbuttons[i]);
2243 		g_signal_connect(G_OBJECT(Buttons[i]), "clicked",(GCallback)buildNucleicAcid,tbuttons[i]);
2244 	}
2245 	g_signal_connect(G_OBJECT(Buttons[B_AT]), "clicked",(GCallback)resetZFormDNA,NULL);
2246 	g_signal_connect(G_OBJECT(Buttons[B_CG]), "clicked",(GCallback)resetZFormDNA,NULL);
2247 	g_signal_connect(G_OBJECT(Buttons[B_GC]), "clicked",(GCallback)resetZFormDNA,NULL);
2248 	g_signal_connect(G_OBJECT(Buttons[B_TA]), "clicked",(GCallback)resetZFormDNA,NULL);
2249 
2250 #undef NLIGNES
2251 #undef NCOLONNS
2252 }
2253 /******************************************************************************/
addTorsionAngles(GtkWidget * Dlg,GtkWidget * box)2254 static void addTorsionAngles(GtkWidget *Dlg,GtkWidget* box)
2255 {
2256 
2257 	GtkWidget* frame;
2258 	GtkWidget* vbox;
2259 	GtkWidget* table;
2260 #define NLIGNES		7
2261 #define NCOLONNS	3
2262 
2263 	frame = gtk_frame_new (_("Torsion Angles"));
2264 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
2265 	gtk_container_set_border_width (GTK_CONTAINER (frame), 1);
2266 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
2267 	gtk_widget_show (frame);
2268 
2269 	vbox= create_vbox(frame);
2270 
2271 	table = gtk_table_new(NLIGNES,NCOLONNS,FALSE);
2272 	gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 1);
2273 
2274 	newLabelEntry(table,E_ALPHA   ,0,0);
2275 	newLabelEntry(table,E_BETA    ,1,0);
2276 	newLabelEntry(table,E_GAMMA   ,2,0);
2277 	newLabelEntry(table,E_DELTA   ,3,0);
2278 
2279 	newLabelEntry(table,E_EPSILON ,4,0);
2280 	newLabelEntry(table,E_ZETA    ,5,0);
2281 	newLabelEntry(table,E_CHI     ,6,0);
2282 
2283 #undef NLIGNES
2284 #undef NCOLONNS
2285 }
2286 /******************************************************************************/
addGeneralButtons(GtkWidget * Dlg,GtkWidget * box)2287 static void addGeneralButtons(GtkWidget *Dlg,GtkWidget* box)
2288 {
2289 	GtkWidget* vbox;
2290 	GtkWidget* table;
2291 
2292 	table = gtk_table_new(1,2,FALSE);
2293 	gtk_box_pack_start (GTK_BOX (box), table, TRUE, TRUE, 5);
2294 
2295 	vbox = gtk_vbox_new (FALSE, 5);
2296 	gtk_widget_show (vbox);
2297 	gtk_table_attach(GTK_TABLE(table),vbox,0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),3,3);
2298 	addGeneral(Dlg,vbox);
2299 
2300 	vbox = gtk_vbox_new (FALSE, 5);
2301 	gtk_widget_show (vbox);
2302 	gtk_table_attach(GTK_TABLE(table),vbox,1,2,0,1,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND) ,(GtkAttachOptions)(GTK_FILL|GTK_EXPAND),3,3);
2303 	addButtons(Dlg,vbox);
2304 }
2305 /******************************************************************************/
addTranslationalHelicalParameters(GtkWidget * Dlg,GtkWidget * box)2306 static void addTranslationalHelicalParameters(GtkWidget *Dlg,GtkWidget* box)
2307 {
2308 
2309 	GtkWidget* frame;
2310 	GtkWidget* vbox;
2311 	GtkWidget* table;
2312 #define NLIGNES		8
2313 #define NCOLONNS	3
2314 
2315 	frame = gtk_frame_new (_("Translational Helical Parameters"));
2316 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
2317 	gtk_container_set_border_width (GTK_CONTAINER (frame), 1);
2318 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
2319 	gtk_widget_show (frame);
2320 
2321 	vbox= create_vbox(frame);
2322 
2323 	table = gtk_table_new(NLIGNES,NCOLONNS,FALSE);
2324 	gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 1);
2325 
2326 
2327 	newLabelEntry(table,E_XDISPLACEMENT   ,0,0);
2328 	newLabelEntry(table,E_YDISPLACEMENT   ,1,0);
2329 
2330 	newLabelEntry(table,E_SHEARSX         ,2,0);
2331 	newLabelEntry(table,E_STRETCHSY       ,3,0);
2332 	newLabelEntry(table,E_STAGGERSZ       ,4,0);
2333 
2334 	newLabelEntry(table,E_SHIFTDX         ,5,0);
2335 	newLabelEntry(table,E_SLIDEDY         ,6,0);
2336 	newLabelEntry(table,E_RISEDZ          ,7,0);
2337 
2338 #undef NLIGNES
2339 #undef NCOLONNS
2340 }
2341 /******************************************************************************/
addRotationalHelicalParameters(GtkWidget * Dlg,GtkWidget * box)2342 static void addRotationalHelicalParameters(GtkWidget *Dlg,GtkWidget* box)
2343 {
2344 	GtkWidget* frame;
2345 	GtkWidget* vbox;
2346 	GtkWidget* table;
2347 #define NLIGNES		8
2348 #define NCOLONNS	3
2349 
2350 	frame = gtk_frame_new (_("Rotational Helical Parameters"));
2351 	gtk_frame_set_shadow_type( GTK_FRAME(frame),GTK_SHADOW_ETCHED_OUT);
2352 	gtk_container_set_border_width (GTK_CONTAINER (frame), 1);
2353 	gtk_box_pack_start(GTK_BOX(box), frame,TRUE,TRUE,0);
2354 	gtk_widget_show (frame);
2355 
2356 	vbox= create_vbox(frame);
2357 
2358 	table = gtk_table_new(NLIGNES,NCOLONNS,FALSE);
2359 	gtk_box_pack_start (GTK_BOX (vbox), table, TRUE, TRUE, 1);
2360 
2361 	newLabelEntry(table,E_TIP            ,0,0);
2362 	newLabelEntry(table,E_INCLINATION    ,1,0);
2363 	newLabelEntry(table,E_OPENNING       ,2,0);
2364 	newLabelEntry(table,E_PROPELLERTWIST ,3,0);
2365 
2366 	newLabelEntry(table,E_BUCKLE         ,4,0);
2367 	newLabelEntry(table,E_TWIST          ,5,0);
2368 	newLabelEntry(table,E_ROLL           ,6,0);
2369 	newLabelEntry(table,E_TILT           ,7,0);
2370 
2371 #undef NLIGNES
2372 #undef NCOLONNS
2373 }
2374 /******************************************************************************/
addHelicalParametersTorsionAngles(GtkWidget * Dlg,GtkWidget * box)2375 static void addHelicalParametersTorsionAngles(GtkWidget *Dlg,GtkWidget* box)
2376 {
2377 	GtkWidget* vbox;
2378 	GtkWidget* table;
2379 
2380 	table = gtk_table_new(1,3,FALSE);
2381 	gtk_box_pack_start (GTK_BOX (box), table, TRUE, TRUE, 3);
2382 
2383 	vbox = gtk_vbox_new (FALSE, 0);
2384 	gtk_widget_show (vbox);
2385 	gtk_table_attach(GTK_TABLE(table),vbox,0,1,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),3,3);
2386 	addRotationalHelicalParameters(Dlg,vbox);
2387 
2388 	vbox = gtk_vbox_new (FALSE, 0);
2389 	gtk_widget_show (vbox);
2390 	gtk_table_attach(GTK_TABLE(table),vbox,1,2,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),3,3);
2391 	addTranslationalHelicalParameters(Dlg,vbox);
2392 
2393 	vbox = gtk_vbox_new (FALSE, 0);
2394 	gtk_widget_show (vbox);
2395 	gtk_table_attach(GTK_TABLE(table),vbox,2,3,0,1,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK) ,(GtkAttachOptions)(GTK_FILL|GTK_SHRINK),3,3);
2396 	addTorsionAngles(Dlg,vbox);
2397 
2398 
2399 }
2400 
2401 /***********************************************************************/
AddNoteBookDlg(GtkWidget * Dlg,GtkWidget * NoteBook,gchar * title,void (* func)(GtkWidget *,GtkWidget *))2402 void AddNoteBookDlg(GtkWidget *Dlg,GtkWidget *NoteBook,gchar* title,void (*func)(GtkWidget *,GtkWidget *))
2403 {
2404 
2405 	GtkWidget *frame;
2406 	GtkWidget *LabelOnglet;
2407 	GtkWidget *LabelMenu;
2408 	GtkWidget *vbox;
2409 
2410 	frame = gtk_frame_new(NULL);
2411 	gtk_container_set_border_width(GTK_CONTAINER(frame), 5);
2412 
2413 	LabelOnglet = gtk_label_new(title);
2414 	LabelMenu = gtk_label_new(title);
2415 	gtk_notebook_append_page_menu(GTK_NOTEBOOK(NoteBook),
2416 			  frame,LabelOnglet, LabelMenu);
2417 	g_object_set_data(G_OBJECT (frame), "frame", frame);
2418 
2419 	vbox = gtk_vbox_new (FALSE, 2);
2420 	gtk_widget_show (vbox);
2421 	gtk_container_add (GTK_CONTAINER (frame), vbox);
2422 
2423 	func(Dlg,vbox);
2424 
2425 }
2426 /**********************************************************************/
build_polynucleicacid_dlg()2427 void build_polynucleicacid_dlg()
2428 {
2429   GtkWidget *Dlg;
2430   GtkWidget *Button;
2431   GtkWidget *NoteBook;
2432 
2433   initVariables();
2434   Dlg = gtk_dialog_new();
2435   gtk_window_set_title(GTK_WINDOW(Dlg),_("Build PolyNucleicAcid molecule"));
2436   gtk_window_set_modal (GTK_WINDOW (Dlg), TRUE);
2437   gtk_window_set_transient_for(GTK_WINDOW(Dlg),GTK_WINDOW(GeomDlg));
2438 
2439   add_child(GeomDlg,Dlg,gtk_widget_destroy,_(" Build PolyNuc"));
2440   g_signal_connect(G_OBJECT(Dlg),"delete_event",(GCallback)destroyDlg,NULL);
2441 
2442   NoteBook = gtk_notebook_new();
2443   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(Dlg)->vbox), NoteBook,TRUE, TRUE, 0);
2444 
2445   AddNoteBookDlg(Dlg,NoteBook,_("Build"),addGeneralButtons);
2446 
2447   AddNoteBookDlg(Dlg,NoteBook,_("Parameters"),addHelicalParametersTorsionAngles);
2448 
2449   g_signal_connect_swapped(G_OBJECT(buttonDNA), "clicked",(GCallback)resetSensitivitieButtons,NULL);
2450   g_signal_connect_swapped(G_OBJECT(buttonDNA), "clicked",(GCallback)resetFormList,NULL);
2451   g_signal_connect_swapped(G_OBJECT(buttonDNA), "clicked",(GCallback)resetTypeList,NULL);
2452 
2453   g_signal_connect_swapped(G_OBJECT(buttonRNA), "clicked",(GCallback)resetSensitivitieButtons,NULL);
2454   g_signal_connect_swapped(G_OBJECT(buttonRNA), "clicked",(GCallback)resetFormList,NULL);
2455   g_signal_connect_swapped(G_OBJECT(buttonRNA), "clicked",(GCallback)resetTypeList,NULL);
2456   resetSensitivitieButtons(NULL,NULL);
2457   resetFormList(NULL,NULL);
2458   resetSensitivitieEntrys(NULL,NULL);
2459   g_signal_connect(G_OBJECT(GTK_BIN(comboForm)->child), "changed",G_CALLBACK(resetSensitivitieEntrys),NULL);
2460   g_signal_connect(G_OBJECT(GTK_BIN(comboForm)->child), "changed",G_CALLBACK(resetValueEntrys),NULL);
2461   g_signal_connect(G_OBJECT(GTK_BIN(comboForm)->child), "changed",G_CALLBACK(resetSugarEntry),NULL);
2462   resetValueEntrys(NULL, NULL);
2463   resetSugarEntry(NULL,NULL);
2464   resetButtonCustom(NULL,NULL);
2465   g_signal_connect(G_OBJECT(GTK_BIN(comboLeftButton)->child), "changed",G_CALLBACK(resetButtonCustom),NULL);
2466   g_signal_connect(G_OBJECT(GTK_BIN(comboRightButton)->child), "changed",G_CALLBACK(resetButtonCustom),NULL);
2467 
2468   /* The "Close" button */
2469   gtk_box_set_homogeneous (GTK_BOX( GTK_DIALOG(Dlg)->action_area), FALSE);
2470   gtk_widget_realize(Dlg);
2471   Button = create_button(Dlg,_("Close"));
2472   gtk_box_pack_end (GTK_BOX( GTK_DIALOG(Dlg)->action_area), Button, FALSE, TRUE, 5);
2473   g_signal_connect_swapped(G_OBJECT(Button), "clicked",(GCallback)destroyDlg,GTK_OBJECT(Dlg));
2474 
2475   GTK_WIDGET_SET_FLAGS(Button, GTK_CAN_DEFAULT);
2476   gtk_widget_grab_default(Button);
2477 
2478   WinPNADlg = Dlg;
2479   gtk_widget_show_all(GTK_DIALOG(Dlg)->vbox);
2480   gtk_widget_show_all(GTK_DIALOG(Dlg)->action_area);
2481   gtk_widget_show_now(Dlg);
2482 
2483   /* fit_windows_position(GeomDlg, Dlg);*/
2484 
2485 }
2486 
2487