12 #include "energy_par.h"
13 #include "fold_vars.h"
19 *** This file provides functions that return temperature scaled energy parameters and
20 *** Boltzmann weights packed in datastructures
25 static char rcsid[] UNUSED = "$Id: params.c,v 1.9 2008/07/04 14:29:14 ivo Exp $";
29 /* variables for partition function */
34 #pragma omp threadprivate(id, pf_id)
37 PUBLIC paramT *scale_parameters(void){
39 set_model_details(&md);
40 return get_scaled_parameters(temperature, md);
43 PUBLIC paramT *get_scaled_parameters( double temp,
50 params = (paramT *)space(sizeof(paramT));
52 /* store the model details */
53 params->model_details = md;
54 params->temperature = temp;
55 tempf = ((params->temperature+K0)/Tmeasure);
57 for(i = VRNA_GQUAD_MIN_STACK_SIZE; i <= VRNA_GQUAD_MAX_STACK_SIZE; i++)
58 for(j = 3*VRNA_GQUAD_MIN_LINKER_LENGTH; j <= 3*VRNA_GQUAD_MAX_LINKER_LENGTH; j++){
59 double GQuadAlpha_T = (double)GQuadAlphadH - (double)(GQuadAlphadH - GQuadAlpha37) * tempf;
60 double GQuadBeta_T = (double)GQuadBetadH - (double)(GQuadBetadH - GQuadBeta37) * tempf;
61 params->gquad[i][j] = (int)GQuadAlpha_T*(i-1) + (int)(((double)GQuadBeta_T)*log(j - 2));
65 params->hairpin[i] = hairpindH[i] - (hairpindH[i] - hairpin37[i])*tempf;
66 for (i=0; i<=MIN2(30,MAXLOOP); i++) {
67 params->bulge[i] = bulgedH[i] - (bulgedH[i] - bulge37[i]) * tempf;
68 params->internal_loop[i] = internal_loopdH[i] - (internal_loopdH[i] - internal_loop37[i]) * tempf;
70 params->lxc = lxc37*tempf;
71 for (; i<=MAXLOOP; i++) {
72 params->bulge[i] = params->bulge[30]+(int)(params->lxc*log((double)(i)/30.));
73 params->internal_loop[i] = params->internal_loop[30]+(int)(params->lxc*log((double)(i)/30.));
76 params->ninio[2] = niniodH - (niniodH - ninio37) * tempf;
78 params->TripleC = TripleCdH - (TripleCdH - TripleC37) * tempf;
79 params->MultipleCA = MultipleCAdH - (MultipleCAdH - MultipleCA37) * tempf;
80 params->MultipleCB = MultipleCBdH - (MultipleCBdH - MultipleCB37) * tempf;
82 for (i=0; (i*7)<strlen(Tetraloops); i++)
83 params->Tetraloop_E[i] = TetraloopdH[i] - (TetraloopdH[i]-Tetraloop37[i])*tempf;
84 for (i=0; (i*5)<strlen(Triloops); i++)
85 params->Triloop_E[i] = TriloopdH[i] - (TriloopdH[i]-Triloop37[i])*tempf;
86 for (i=0; (i*9)<strlen(Hexaloops); i++)
87 params->Hexaloop_E[i] = HexaloopdH[i] - (HexaloopdH[i]-Hexaloop37[i])*tempf;
89 params->TerminalAU = TerminalAUdH - (TerminalAUdH - TerminalAU37) * tempf;
91 params->DuplexInit = DuplexInitdH - (DuplexInitdH - DuplexInit37) *tempf;
93 params->MLbase = ML_BASEdH - (ML_BASEdH - ML_BASE37) * tempf;
95 for (i=0; i<=NBPAIRS; i++)
96 params->MLintern[i] = ML_interndH - (ML_interndH - ML_intern37) * tempf;
98 params->MLclosing = ML_closingdH - (ML_closingdH - ML_closing37) * tempf;
101 /* stacks G(T) = H - [H - G(T0)]*T/T0 */
102 for (i=0; i<=NBPAIRS; i++)
103 for (j=0; j<=NBPAIRS; j++)
104 params->stack[i][j] = stackdH[i][j] - (stackdH[i][j] - stack37[i][j])*tempf;
107 for (i=0; i<=NBPAIRS; i++)
109 for (k=0; k<5; k++) {
111 params->mismatchI[i][j][k] = mismatchIdH[i][j][k] - (mismatchIdH[i][j][k] - mismatchI37[i][j][k])*tempf;
112 params->mismatchH[i][j][k] = mismatchHdH[i][j][k] - (mismatchHdH[i][j][k] - mismatchH37[i][j][k])*tempf;
113 params->mismatch1nI[i][j][k] = mismatch1nIdH[i][j][k]-(mismatch1nIdH[i][j][k]-mismatch1nI37[i][j][k])*tempf;/* interior nx1 loops */
114 params->mismatch23I[i][j][k] = mismatch23IdH[i][j][k]-(mismatch23IdH[i][j][k]-mismatch23I37[i][j][k])*tempf;/* interior 2x3 loops */
116 mm = mismatchMdH[i][j][k] - (mismatchMdH[i][j][k] - mismatchM37[i][j][k])*tempf;
117 params->mismatchM[i][j][k] = (mm > 0) ? 0 : mm;
118 mm = mismatchExtdH[i][j][k] - (mismatchExtdH[i][j][k] - mismatchExt37[i][j][k])*tempf;
119 params->mismatchExt[i][j][k] = (mm > 0) ? 0 : mm;
122 params->mismatchM[i][j][k] = params->mismatchExt[i][j][k] = 0;
127 for (i=0; i<=NBPAIRS; i++)
128 for (j=0; j<5; j++) {
130 dd = dangle5_dH[i][j] - (dangle5_dH[i][j] - dangle5_37[i][j])*tempf;
131 params->dangle5[i][j] = (dd>0) ? 0 : dd; /* must be <= 0 */
132 dd = dangle3_dH[i][j] - (dangle3_dH[i][j] - dangle3_37[i][j])*tempf;
133 params->dangle3[i][j] = (dd>0) ? 0 : dd; /* must be <= 0 */
135 /* interior 1x1 loops */
136 for (i=0; i<=NBPAIRS; i++)
137 for (j=0; j<=NBPAIRS; j++)
140 params->int11[i][j][k][l] = int11_dH[i][j][k][l] - (int11_dH[i][j][k][l] - int11_37[i][j][k][l])*tempf;
142 /* interior 2x1 loops */
143 for (i=0; i<=NBPAIRS; i++)
144 for (j=0; j<=NBPAIRS; j++)
146 for (l=0; l<5; l++) {
149 params->int21[i][j][k][l][m] = int21_dH[i][j][k][l][m] - (int21_dH[i][j][k][l][m] - int21_37[i][j][k][l][m])*tempf;
151 /* interior 2x2 loops */
152 for (i=0; i<=NBPAIRS; i++)
153 for (j=0; j<=NBPAIRS; j++)
155 for (l=0; l<5; l++) {
159 params->int22[i][j][k][l][m][n] = int22_dH[i][j][k][l][m][n] - (int22_dH[i][j][k][l][m][n]-int22_37[i][j][k][l][m][n])*tempf;
162 strncpy(params->Tetraloops, Tetraloops, 281);
163 strncpy(params->Triloops, Triloops, 241);
164 strncpy(params->Hexaloops, Hexaloops, 361);
171 /*------------------------------------------------------------------------*/
174 *** dangling ends should never be destabilizing, i.e. expdangle>=1<BR>
175 *** specific heat needs smooth function (2nd derivative)<BR>
176 *** we use a*(sin(x+b)+1)^2, with a=2/(3*sqrt(3)), b=Pi/6-sqrt(3)/2,
177 *** in the interval b<x<sqrt(3)/2
179 #define SMOOTH(X) ((X)/SCALE<-1.2283697)?0:(((X)/SCALE>0.8660254)?(X):\
180 SCALE*0.38490018*(sin((X)/SCALE-0.34242663)+1)*(sin((X)/SCALE-0.34242663)+1))
182 /* #define SMOOTH(X) ((X)<0 ? 0 : (X)) */
185 PUBLIC pf_paramT *get_scaled_pf_parameters(void){
187 set_model_details(&md);
188 return get_boltzmann_factors(temperature, 1.0, md, pf_scale);
191 PUBLIC pf_paramT *get_boltzmann_factors(double temp,
196 unsigned int i, j, k, l;
201 pf = (pf_paramT *)space(sizeof(pf_paramT));
202 pf->model_details = md;
203 pf->temperature = temp;
204 pf->alpha = betaScale;
205 pf->kT = kT = betaScale*(temp+K0)*GASCONST; /* kT in cal/mol */
206 pf->pf_scale = pf_scale;
207 TT = (temp+K0)/(Tmeasure);
209 for(i = VRNA_GQUAD_MIN_STACK_SIZE; i <= VRNA_GQUAD_MAX_STACK_SIZE; i++)
210 for(j = 3*VRNA_GQUAD_MIN_LINKER_LENGTH; j <= 3*VRNA_GQUAD_MAX_LINKER_LENGTH; j++){
211 double GQuadAlpha_T = (double)GQuadAlphadH - (double)(GQuadAlphadH - GQuadAlpha37) * TT;
212 double GQuadBeta_T = (double)GQuadBetadH - (double)(GQuadBetadH - GQuadBeta37) * TT;
213 GT = ((double)GQuadAlpha_T)*((double)(i-1)) + ((double)GQuadBeta_T)*log(((double)j) - 2.);
214 pf->expgquad[i][j] = exp( -GT*10./kT);
217 /* loop energies: hairpins, bulges, interior, mulit-loops */
218 for (i=0; i<31; i++){
219 GT = hairpindH[i] - (hairpindH[i] - hairpin37[i])*TT;
220 pf->exphairpin[i] = exp( -GT*10./kT);
223 for (i=0; i<=MIN2(30, MAXLOOP); i++) {
224 GT = bulgedH[i]- (bulgedH[i] - bulge37[i])*TT;
225 pf->expbulge[i] = exp( -GT*10./kT);
226 GT = internal_loopdH[i] - (internal_loopdH[i] - internal_loop37[i])*TT;
227 pf->expinternal[i] = exp( -GT*10./kT);
229 /* special case of size 2 interior loops (single mismatch) */
230 if (james_rule) pf->expinternal[2] = exp ( -80*10./kT);
234 GT = DuplexInitdH - (DuplexInitdH - DuplexInit37)*TT;
235 pf->expDuplexInit = exp( -GT*10./kT);
237 for (i=31; i<=MAXLOOP; i++) {
238 GT = bulge37[30]*TT + (pf->lxc*log( i/30.));
239 pf->expbulge[i] = exp( -GT*10./kT);
240 GT = internal_loop37[30]*TT + (pf->lxc*log( i/30.));
241 pf->expinternal[i] = exp( -GT*10./kT);
244 GT = niniodH - (niniodH - ninio37)*TT;
245 for (j=0; j<=MAXLOOP; j++)
246 pf->expninio[2][j]=exp(-MIN2(MAX_NINIO,j*GT)*10./kT);
248 for (i=0; (i*7)<strlen(Tetraloops); i++) {
249 GT = TetraloopdH[i] - (TetraloopdH[i]-Tetraloop37[i])*TT;
250 pf->exptetra[i] = exp( -GT*10./kT);
252 for (i=0; (i*5)<strlen(Triloops); i++) {
253 GT = TriloopdH[i] - (TriloopdH[i]-Triloop37[i])*TT;
254 pf->exptri[i] = exp( -GT*10./kT);
256 for (i=0; (i*9)<strlen(Hexaloops); i++) {
257 GT = HexaloopdH[i] - (HexaloopdH[i]-Hexaloop37[i])*TT;
258 pf->exphex[i] = exp( -GT*10./kT);
260 GT = ML_closingdH - (ML_closingdH - ML_closing37)*TT;
261 pf->expMLclosing = exp( -GT*10./kT);
263 for (i=0; i<=NBPAIRS; i++) {
264 GT = ML_interndH - (ML_interndH - ML_intern37)*TT;
265 /* if (i>2) GT += TerminalAU; */
266 pf->expMLintern[i] = exp( -GT*10./kT);
268 GT = TerminalAUdH - (TerminalAUdH - TerminalAU37)*TT;
269 pf->expTermAU = exp(-GT*10./kT);
271 GT = ML_BASEdH - (ML_BASEdH - ML_BASE37)*TT;
273 pf->expMLbase=exp(-10.*GT/kT);
276 /* if dangles==0 just set their energy to 0,
277 don't let dangle energies become > 0 (at large temps),
278 but make sure go smoothly to 0 */
279 for (i=0; i<=NBPAIRS; i++)
280 for (j=0; j<=4; j++) {
282 GT = dangle5_dH[i][j] - (dangle5_dH[i][j] - dangle5_37[i][j])*TT;
283 pf->expdangle5[i][j] = exp(SMOOTH(-GT)*10./kT);
284 GT = dangle3_dH[i][j] - (dangle3_dH[i][j] - dangle3_37[i][j])*TT;
285 pf->expdangle3[i][j] = exp(SMOOTH(-GT)*10./kT);
287 pf->expdangle3[i][j] = pf->expdangle5[i][j] = 1;
290 /* stacking energies */
291 for (i=0; i<=NBPAIRS; i++)
292 for (j=0; j<=NBPAIRS; j++) {
293 GT = stackdH[i][j] - (stackdH[i][j] - stack37[i][j])*TT;
294 pf->expstack[i][j] = exp( -GT*10./kT);
297 /* mismatch energies */
298 for (i=0; i<=NBPAIRS; i++)
300 for (k=0; k<5; k++) {
301 GT = mismatchIdH[i][j][k] - ( mismatchIdH[i][j][k] - mismatchI37[i][j][k])*TT;
302 pf->expmismatchI[i][j][k] = exp(-GT*10.0/kT);
303 GT = mismatch1nIdH[i][j][k] - (mismatch1nIdH[i][j][k] - mismatch1nI37[i][j][k])*TT;
304 pf->expmismatch1nI[i][j][k] = exp(-GT*10.0/kT);
305 GT = mismatchHdH[i][j][k] - (mismatchHdH[i][j][k] - mismatchH37[i][j][k])*TT;
306 pf->expmismatchH[i][j][k] = exp(-GT*10.0/kT);
308 GT = mismatchMdH[i][j][k] - (mismatchMdH[i][j][k] - mismatchM37[i][j][k])*TT;
309 pf->expmismatchM[i][j][k] = exp(SMOOTH(-GT)*10.0/kT);
310 GT = mismatchExtdH[i][j][k] - (mismatchExtdH[i][j][k] - mismatchExt37[i][j][k])*TT;
311 pf->expmismatchExt[i][j][k] = exp(SMOOTH(-GT)*10.0/kT);
314 pf->expmismatchM[i][j][k] = pf->expmismatchExt[i][j][k] = 1.;
316 GT = mismatch23IdH[i][j][k] - (mismatch23IdH[i][j][k] - mismatch23I37[i][j][k])*TT;
317 pf->expmismatch23I[i][j][k] = exp(-GT*10.0/kT);
320 /* interior lops of length 2 */
321 for (i=0; i<=NBPAIRS; i++)
322 for (j=0; j<=NBPAIRS; j++)
324 for (l=0; l<5; l++) {
325 GT = int11_dH[i][j][k][l] -
326 (int11_dH[i][j][k][l] - int11_37[i][j][k][l])*TT;
327 pf->expint11[i][j][k][l] = exp(-GT*10./kT);
329 /* interior 2x1 loops */
330 for (i=0; i<=NBPAIRS; i++)
331 for (j=0; j<=NBPAIRS; j++)
333 for (l=0; l<5; l++) {
335 for (m=0; m<5; m++) {
336 GT = int21_dH[i][j][k][l][m] -
337 (int21_dH[i][j][k][l][m] - int21_37[i][j][k][l][m])*TT;
338 pf->expint21[i][j][k][l][m] = exp(-GT*10./kT);
342 /* interior 2x2 loops */
343 for (i=0; i<=NBPAIRS; i++)
344 for (j=0; j<=NBPAIRS; j++)
346 for (l=0; l<5; l++) {
349 for (n=0; n<5; n++) {
350 GT = int22_dH[i][j][k][l][m][n] -
351 (int22_dH[i][j][k][l][m][n]-int22_37[i][j][k][l][m][n])*TT;
352 pf->expint22[i][j][k][l][m][n] = exp(-GT*10./kT);
356 strncpy(pf->Tetraloops, Tetraloops, 281);
357 strncpy(pf->Triloops, Triloops, 241);
358 strncpy(pf->Hexaloops, Hexaloops, 361);
363 PUBLIC pf_paramT *get_scaled_alipf_parameters(unsigned int n_seq){
365 set_model_details(&md);
366 return get_boltzmann_factors_ali(n_seq, temperature, 1.0, md, pf_scale);
369 PUBLIC pf_paramT *get_boltzmann_factors_ali(unsigned int n_seq,
375 /* scale energy parameters and pre-calculate Boltzmann weights */
376 unsigned int i, j, k, l;
381 pf = (pf_paramT *)space(sizeof(pf_paramT));
382 pf->model_details = md;
383 pf->alpha = betaScale;
384 pf->temperature = temperature;
385 pf->pf_scale = pf_scale;
386 pf->kT = kTn = ((double)n_seq)*betaScale*(temperature+K0)*GASCONST; /* kT in cal/mol */
387 TT = (temperature+K0)/(Tmeasure);
390 /* loop energies: hairpins, bulges, interior, mulit-loops */
391 for (i=0; i<31; i++) {
392 GT = hairpindH[i] - (hairpindH[i] - hairpin37[i])*TT;
393 pf->exphairpin[i] = exp( -GT*10./kTn);
395 /*add penalty for too short hairpins*/
396 for (i=0; i<3; i++) {
397 GT= 600/*Penalty*/*TT;
398 pf->exphairpin[i] = exp( -GT*10./kTn);
401 for (i=0; i<=MIN2(30, MAXLOOP); i++) {
402 GT = bulgedH[i]- (bulgedH[i] - bulge37[i])*TT;
403 pf->expbulge[i] = exp( -GT*10./kTn);
404 GT = internal_loopdH[i] - (internal_loopdH[i] - internal_loop37[i])*TT;
405 pf->expinternal[i] = exp( -GT*10./kTn);
407 /* special case of size 2 interior loops (single mismatch) */
408 if (james_rule) pf->expinternal[2] = exp ( -80*10./kTn);
412 GT = DuplexInitdH - (DuplexInitdH - DuplexInit37)*TT;
413 pf->expDuplexInit = exp( -GT*10./kTn);
415 for (i=31; i<=MAXLOOP; i++) {
416 GT = bulge37[30]*TT + (pf->lxc*log( i/30.));
417 pf->expbulge[i] = exp( -GT*10./kTn);
418 GT = internal_loop37[30]*TT + (pf->lxc*log( i/30.));
419 pf->expinternal[i] = exp( -GT*10./kTn);
422 GT = niniodH - (niniodH - ninio37)*TT;
423 for (j=0; j<=MAXLOOP; j++)
424 pf->expninio[2][j]=exp(-MIN2(MAX_NINIO,j*GT)*10./kTn);
426 for (i=0; (i*7)<strlen(Tetraloops); i++) {
427 GT = TetraloopdH[i] - (TetraloopdH[i]-Tetraloop37[i])*TT;
428 pf->exptetra[i] = exp( -GT*10./kTn);
430 for (i=0; (i*5)<strlen(Triloops); i++) {
431 GT = TriloopdH[i] - (TriloopdH[i]-Triloop37[i])*TT;
432 pf->exptri[i] = exp( -GT*10./kTn);
434 for (i=0; (i*9)<strlen(Hexaloops); i++) {
435 GT = HexaloopdH[i] - (HexaloopdH[i]-Hexaloop37[i])*TT;
436 pf->exphex[i] = exp( -GT*10./kTn);
438 GT = ML_closingdH - (ML_closingdH - ML_closing37)*TT;
439 pf->expMLclosing = exp( -GT*10./kTn);
441 for (i=0; i<=NBPAIRS; i++) { /* includes AU penalty */
442 GT = ML_interndH - (ML_interndH - ML_intern37)*TT;
443 /* if (i>2) GT += TerminalAU; */
444 pf->expMLintern[i] = exp( -GT*10./kTn);
446 GT = TerminalAUdH - (TerminalAUdH - TerminalAU37)*TT;
447 pf->expTermAU = exp(-GT*10./kTn);
449 GT = ML_BASEdH - (ML_BASEdH - ML_BASE37)*TT;
450 pf->expMLbase=exp(-10.*GT/(kTn/n_seq));
453 /* if dangle_model==0 just set their energy to 0,
454 don't let dangle energies become > 0 (at large temps),
455 but make sure go smoothly to 0 */
456 for (i=0; i<=NBPAIRS; i++)
457 for (j=0; j<=4; j++) {
459 GT = dangle5_dH[i][j] - (dangle5_dH[i][j] - dangle5_37[i][j])*TT;
460 pf->expdangle5[i][j] = exp(SMOOTH(-GT)*10./kTn);
461 GT = dangle3_dH[i][j] - (dangle3_dH[i][j] - dangle3_37[i][j])*TT;
462 pf->expdangle3[i][j] = exp(SMOOTH(-GT)*10./kTn);
464 pf->expdangle3[i][j] = pf->expdangle5[i][j] = 1;
467 /* stacking energies */
468 for (i=0; i<=NBPAIRS; i++)
469 for (j=0; j<=NBPAIRS; j++) {
470 GT = stackdH[i][j] - (stackdH[i][j] - stack37[i][j])*TT;
471 pf->expstack[i][j] = exp( -GT*10./kTn);
474 /* mismatch energies */
475 for (i=0; i<=NBPAIRS; i++)
477 for (k=0; k<5; k++) {
478 GT = mismatchIdH[i][j][k] - ( mismatchIdH[i][j][k] - mismatchI37[i][j][k])*TT;
479 pf->expmismatchI[i][j][k] = exp(-GT*10.0/kTn);
480 GT = mismatch1nIdH[i][j][k] - (mismatch1nIdH[i][j][k] - mismatch1nI37[i][j][k])*TT;
481 pf->expmismatch1nI[i][j][k] = exp(-GT*10.0/kTn);
482 GT = mismatchHdH[i][j][k] - (mismatchHdH[i][j][k] - mismatchH37[i][j][k])*TT;
483 pf->expmismatchH[i][j][k] = exp(-GT*10.0/kTn);
485 GT = mismatchMdH[i][j][k] - (mismatchMdH[i][j][k] - mismatchM37[i][j][k])*TT;
486 pf->expmismatchM[i][j][k] = exp(SMOOTH(-GT)*10.0/kTn);
487 GT = mismatchExtdH[i][j][k] - (mismatchExtdH[i][j][k] - mismatchExt37[i][j][k])*TT;
488 pf->expmismatchExt[i][j][k] = exp(SMOOTH(-GT)*10.0/kTn);
491 pf->expmismatchM[i][j][k] = pf->expmismatchExt[i][j][k] = 1.;
493 GT = mismatch23IdH[i][j][k] - (mismatch23IdH[i][j][k] - mismatch23I37[i][j][k])*TT;
494 pf->expmismatch23I[i][j][k] = exp(-GT*10.0/kTn);
498 /* interior lops of length 2 */
499 for (i=0; i<=NBPAIRS; i++)
500 for (j=0; j<=NBPAIRS; j++)
502 for (l=0; l<5; l++) {
503 GT = int11_dH[i][j][k][l] -
504 (int11_dH[i][j][k][l] - int11_37[i][j][k][l])*TT;
505 pf->expint11[i][j][k][l] = exp(-GT*10./kTn);
507 /* interior 2x1 loops */
508 for (i=0; i<=NBPAIRS; i++)
509 for (j=0; j<=NBPAIRS; j++)
511 for (l=0; l<5; l++) {
513 for (m=0; m<5; m++) {
514 GT = int21_dH[i][j][k][l][m] -
515 (int21_dH[i][j][k][l][m] - int21_37[i][j][k][l][m])*TT;
516 pf->expint21[i][j][k][l][m] = exp(-GT*10./kTn);
520 /* interior 2x2 loops */
521 for (i=0; i<=NBPAIRS; i++)
522 for (j=0; j<=NBPAIRS; j++)
524 for (l=0; l<5; l++) {
527 for (n=0; n<5; n++) {
528 GT = int22_dH[i][j][k][l][m][n] -
529 (int22_dH[i][j][k][l][m][n]-int22_37[i][j][k][l][m][n])*TT;
530 pf->expint22[i][j][k][l][m][n] = exp(-GT*10./kTn);
534 strncpy(pf->Tetraloops, Tetraloops, 281);
535 strncpy(pf->Triloops, Triloops, 241);
536 strncpy(pf->Hexaloops, Hexaloops, 361);
541 PUBLIC pf_paramT *get_boltzmann_factor_copy(pf_paramT *par){
542 pf_paramT *copy = NULL;
544 copy = (pf_paramT *) space(sizeof(pf_paramT));
545 memcpy(copy, par, sizeof(pf_paramT));
550 PUBLIC paramT *get_parameter_copy(paramT *par){
553 copy = (paramT *) space(sizeof(paramT));
554 memcpy(copy, par, sizeof(paramT));
559 /*###########################################*/
560 /*# deprecated functions below #*/
561 /*###########################################*/
563 PUBLIC paramT *copy_parameters(void){
565 if (p.id != id) scale_parameters();
566 copy = (paramT *) space(sizeof(paramT));
567 memcpy(copy, &p, sizeof(paramT));
571 PUBLIC paramT *set_parameters(paramT *dest){
572 memcpy(&p, dest, sizeof(paramT));
576 PUBLIC pf_paramT *copy_pf_param(void){
578 if (pf.id != pf_id) scale_pf_parameters();
579 copy = (pf_paramT *) space(sizeof(pf_paramT));
580 memcpy(copy, &pf, sizeof(pf_paramT));
584 PUBLIC pf_paramT *set_pf_param(paramT *dest){
585 memcpy(&pf, dest, sizeof(pf_paramT));
589 PUBLIC pf_paramT *scale_pf_parameters(void){
590 return get_scaled_pf_parameters();
592 /* scale energy parameters and pre-calculate Boltzmann weights */
593 unsigned int i, j, k, l;
597 /* scale pf_params() in partfunc.c is only a wrapper, that calls
600 pf.temperature = temperature;
601 kT = (pf.temperature+K0)*GASCONST; /* kT in cal/mol */
602 TT = (pf.temperature+K0)/(Tmeasure);
604 /* loop energies: hairpins, bulges, interior, mulit-loops */
605 for (i=0; i<31; i++) {
606 GT = hairpin37[i]*TT;
607 pf.exphairpin[i] = exp( -GT*10./kT);
609 for (i=0; i<=MIN2(30, MAXLOOP); i++) {
611 pf.expbulge[i] = exp( -GT*10./kT);
612 GT = internal_loop37[i]*TT;
613 pf.expinternal[i] = exp( -GT*10./kT);
615 /* special case of size 2 interior loops (single mismatch) */
616 if (james_rule) pf.expinternal[2] = exp ( -80*10./kT);
620 GT = DuplexInitdH - (DuplexInitdH - DuplexInit37)*TT;
621 pf.expDuplexInit = exp( -GT*10./kT);
623 for (i=31; i<=MAXLOOP; i++) {
624 GT = bulge37[30]*TT + (pf.lxc*log( i/30.));
625 pf.expbulge[i] = exp( -GT*10./kT);
626 GT = internal_loop37[30]*TT + (pf.lxc*log( i/30.));
627 pf.expinternal[i] = exp( -GT*10./kT);
630 GT = niniodH - (niniodH - ninio37)*TT;
631 for (j=0; j<=MAXLOOP; j++)
632 pf.expninio[2][j]=exp(-MIN2(MAX_NINIO,j*GT)*10./kT);
634 for (i=0; (i*7)<strlen(Tetraloops); i++) {
635 GT = TetraloopdH[i] - (TetraloopdH[i]-Tetraloop37[i])*TT;
636 pf.exptetra[i] = exp( -GT*10./kT);
638 for (i=0; (i*5)<strlen(Triloops); i++) {
639 GT = TriloopdH[i] - (TriloopdH[i]-Triloop37[i])*TT;
640 pf.exptri[i] = exp( -GT*10./kT);
642 for (i=0; (i*9)<strlen(Hexaloops); i++) {
643 GT = HexaloopdH[i] - (HexaloopdH[i]-Hexaloop37[i])*TT;
644 pf.exphex[i] = exp( -GT*10./kT);
646 GT = ML_closing37*TT;
647 pf.expMLclosing = exp( -GT*10./kT);
649 for (i=0; i<=NBPAIRS; i++) { /* includes AU penalty */
651 /* if (i>2) GT += TerminalAU; */
652 pf.expMLintern[i] = exp( -GT*10./kT);
654 GT = TerminalAUdH - (TerminalAUdH - TerminalAU37)*TT;
655 pf.expTermAU = exp(-GT*10./kT);
658 pf.expMLbase=exp(-10.*GT/kT);
661 /* if dangle_model==0 just set their energy to 0,
662 don't let dangle energies become > 0 (at large temps),
663 but make sure go smoothly to 0 */
664 for (i=0; i<=NBPAIRS; i++)
665 for (j=0; j<=4; j++) {
667 GT = dangle5_dH[i][j] - (dangle5_dH[i][j] - dangle5_37[i][j])*TT;
668 pf.expdangle5[i][j] = exp(SMOOTH(-GT)*10./kT);
669 GT = dangle3_dH[i][j] - (dangle3_dH[i][j] - dangle3_37[i][j])*TT;
670 pf.expdangle3[i][j] = exp(SMOOTH(-GT)*10./kT);
672 pf.expdangle3[i][j] = pf.expdangle5[i][j] = 1;
673 if (i>2) /* add TermAU penalty into dangle3 */
674 pf.expdangle3[i][j] *= pf.expTermAU;
677 /* stacking energies */
678 for (i=0; i<=NBPAIRS; i++)
679 for (j=0; j<=NBPAIRS; j++) {
680 GT = stackdH[i][j] - (stackdH[i][j] - stack37[i][j])*TT;
681 pf.expstack[i][j] = exp( -GT*10./kT);
684 /* mismatch energies */
685 for (i=0; i<=NBPAIRS; i++)
687 for (k=0; k<5; k++) {
688 GT = mismatchIdH[i][j][k] - ( mismatchIdH[i][j][k] - mismatchI37[i][j][k])*TT;
689 pf.expmismatchI[i][j][k] = exp(-GT*10./kT);
690 GT = mismatch1nIdH[i][j][k] - (mismatch1nIdH[i][j][k] - mismatch1nI37[i][j][k])*TT;
691 pf.expmismatch1nI[i][j][k] = exp(-GT*10./kT);
692 GT = mismatchHdH[i][j][k] - (mismatchHdH[i][j][k] - mismatchH37[i][j][k])*TT;
693 pf.expmismatchH[i][j][k] = exp(-GT*10./kT);
694 GT = mismatch23IdH[i][j][k] - (mismatch23IdH[i][j][k] - mismatch23I37[i][j][k])*TT;
695 pf.expmismatch23I[i][j][k] = exp(-GT*10./kT);
697 GT = mismatchMdH[i][j][k] - (mismatchMdH[i][j][k] - mismatchM37[i][j][k])*TT;
698 pf.expmismatchM[i][j][k] = exp(-GT*10./kT);
699 GT = mismatchExtdH[i][j][k] - ( mismatchExtdH[i][j][k] - mismatchExt37[i][j][k])*TT;
700 pf.expmismatchExt[i][j][k] = exp(-GT*10./kT);
703 pf.expmismatchM[i][j][k] = pf.expmismatchExt[i][j][k] = 1.;
708 /* interior lops of length 2 */
709 for (i=0; i<=NBPAIRS; i++)
710 for (j=0; j<=NBPAIRS; j++)
712 for (l=0; l<5; l++) {
713 GT = int11_dH[i][j][k][l] -
714 (int11_dH[i][j][k][l] - int11_37[i][j][k][l])*TT;
715 pf.expint11[i][j][k][l] = exp(-GT*10./kT);
717 /* interior 2x1 loops */
718 for (i=0; i<=NBPAIRS; i++)
719 for (j=0; j<=NBPAIRS; j++)
721 for (l=0; l<5; l++) {
723 for (m=0; m<5; m++) {
724 GT = int21_dH[i][j][k][l][m] -
725 (int21_dH[i][j][k][l][m] - int21_37[i][j][k][l][m])*TT;
726 pf.expint21[i][j][k][l][m] = exp(-GT*10./kT);
730 /* interior 2x2 loops */
731 for (i=0; i<=NBPAIRS; i++)
732 for (j=0; j<=NBPAIRS; j++)
734 for (l=0; l<5; l++) {
737 for (n=0; n<5; n++) {
738 GT = int22_dH[i][j][k][l][m][n] -
739 (int22_dH[i][j][k][l][m][n]-int22_37[i][j][k][l][m][n])*TT;
740 pf.expint22[i][j][k][l][m][n] = exp(-GT*10./kT);
744 strncpy(pf.Tetraloops, Tetraloops, 281);
745 strncpy(pf.Triloops, Triloops, 241);
746 strncpy(pf.Hexaloops, Hexaloops, 361);