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