1 #ifndef __VIENNA_RNA_PACKAGE_GQUAD_H__
2 #define __VIENNA_RNA_PACKAGE_GQUAD_H__
24 FLT_OR_DBL exp_E_gquad(
int L,
28 int E_gquad_ali(
int i,
36 void E_gquad_ali_en(
int i,
62 int *get_gquad_ali_matrix(
short *S_cons,
67 FLT_OR_DBL *get_gquad_pf_matrix(
short *S,
71 int **get_gquad_L_matrix(
short *S,
77 void get_gquad_pattern_mfe(
short *S,
85 get_gquad_pattern_exhaustive(
short *S,
93 void get_gquad_pattern_pf(
short *S,
100 plist *get_plist_gquad_from_pr(
short *S,
107 plist *get_plist_gquad_from_pr_max(
short *S,
117 plist *get_plist_gquad_from_db(
const char *structure,
120 int get_gquad_count(
short *S,
124 int get_gquad_layer_count(
short *S,
139 int parse_gquad(
const char *struc,
int *L,
int l[3]);
171 int energy,
dangles, k, l, maxl, minl, c0, l1;
180 energy += P->mismatchI[type][si][sj];
183 energy += P->TerminalAU;
187 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
188 minl = j - i + k -
MAXLOOP - 2;
189 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
190 minl =
MAX2(c0, minl);
192 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
193 maxl =
MIN2(c0, maxl);
194 for(l = minl; l < maxl; l++){
195 if(S[l] != 3)
continue;
196 if(c == energy + ggg[index[l] + k] + P->internal_loop[j - l - 1]){
205 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
209 if(S[k] != 3)
continue;
210 minl = j - i + k -
MAXLOOP - 2;
211 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
212 minl =
MAX2(c0, minl);
214 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
215 maxl =
MIN2(c0, maxl);
216 for(l = minl; l < maxl; l++){
217 if(S[l] != 3)
continue;
218 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1 + j - l - 1]){
228 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
232 if(S[k] != 3)
continue;
233 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1]){
269 int energy,
dangles, k, l, maxl, minl, c0, l1;
278 energy += P->mismatchI[type][si][sj];
281 energy += P->TerminalAU;
285 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
286 minl = j - i + k -
MAXLOOP - 2;
287 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
288 minl =
MAX2(c0, minl);
290 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
291 maxl =
MIN2(c0, maxl);
292 for(l = minl; l < maxl; l++){
293 if(S[l] != 3)
continue;
294 if(c == energy + ggg[k][l - k] + P->internal_loop[j - l - 1]){
303 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
307 if(S[k] != 3)
continue;
308 minl = j - i + k -
MAXLOOP - 2;
309 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
310 minl =
MAX2(c0, minl);
312 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
313 maxl =
MIN2(c0, maxl);
314 for(l = minl; l < maxl; l++){
315 if(S[l] != 3)
continue;
316 if(c == energy + ggg[k][l - k] + P->internal_loop[l1 + j - l - 1]){
326 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
330 if(S[k] != 3)
continue;
331 if(c == energy + ggg[k][l - k] + P->internal_loop[l1]){
342 E_GQuad_IntLoop(
int i,
350 int energy, ge, en1, en2,
dangles, p, q, l1, minq, maxq;
351 int c0, c1, c2, c3, up, d53, d5, d3;
360 energy += P->mismatchI[type][si][sj];
363 energy += P->TerminalAU;
369 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
370 minq = j - i + p -
MAXLOOP - 2;
371 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
372 minq =
MAX2(c0, minq);
374 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
375 maxq =
MIN2(c0, maxq);
376 for(q = minq; q < maxq; q++){
377 if(S[q] != 3)
continue;
378 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
385 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
388 if(l1>MAXLOOP)
break;
389 if(S[p] != 3)
continue;
390 minq = j - i + p - MAXLOOP - 2;
391 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
392 minq =
MAX2(c0, minq);
394 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
395 maxq =
MIN2(c0, maxq);
396 for(q = minq; q < maxq; q++){
397 if(S[q] != 3)
continue;
398 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
406 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
409 if(l1>MAXLOOP)
break;
410 if(S[p] != 3)
continue;
411 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
418 en1 = energy + P->dangle5[type][si];
419 en2 = energy + P->dangle5[type][sj];
420 en3 = energy + P->mismatchI[type][si][sj];
425 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
426 minq = j - i + p - MAXLOOP - 2;
427 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
428 minq =
MAX2(c0, minq);
430 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
431 maxq =
MIN2(c0, maxq);
432 for(q = minq; q < maxq; q++){
433 if(S[q] != 3)
continue;
434 c0 = en1 + ggg[index[q] + p] + P->internal_loop[j - q - 1];
440 for(p = i + 2; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
442 if(l1>MAXLOOP)
break;
443 if(S[p] != 3)
continue;
444 minq = j - i + p - MAXLOOP - 2;
445 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
446 minq =
MAX2(c0, minq);
448 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
449 maxq =
MIN2(c0, maxq);
450 for(q = minq; q < maxq; q++){
451 if(S[q] != 3)
continue;
452 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
459 for(p = i + 4; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
461 if(l1>MAXLOOP)
break;
462 if(S[p] != 3)
continue;
463 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + 1];
476 E_GQuad_IntLoop_exhaustive(
int i,
487 int energy, *ge, en1, en2,
dangles, p, q, l1, minq, maxq;
488 int c0, c1, c2, c3, up, d53, d5, d3;
498 energy += P->mismatchI[type][si][sj];
501 energy += P->TerminalAU;
504 *p_p = (
int *)
space(
sizeof(
int) * 256);
505 *q_p = (
int *)
space(
sizeof(
int) * 256);
506 ge = (
int *)
space(
sizeof(
int) * 256);
510 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
511 minq = j - i + p - MAXLOOP - 2;
512 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
513 minq =
MAX2(c0, minq);
515 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
516 maxq =
MIN2(c0, maxq);
517 for(q = minq; q < maxq; q++){
518 if(S[q] != 3)
continue;
519 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
521 ge[cnt] = energy + P->internal_loop[j - q - 1];
530 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
533 if(l1>MAXLOOP)
break;
534 if(S[p] != 3)
continue;
535 minq = j - i + p - MAXLOOP - 2;
536 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
537 minq =
MAX2(c0, minq);
539 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
540 maxq =
MIN2(c0, maxq);
541 for(q = minq; q < maxq; q++){
542 if(S[q] != 3)
continue;
543 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
545 ge[cnt] = energy + P->internal_loop[l1 + j - q - 1];
555 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
558 if(l1>MAXLOOP)
break;
559 if(S[p] != 3)
continue;
560 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
562 ge[cnt] = energy + P->internal_loop[l1];
576 E_GQuad_IntLoop_L(
int i,
584 int energy, ge, en1, en2,
dangles, p, q, l1, minq, maxq;
585 int c0, c1, c2, c3, up, d53, d5, d3;
594 energy += P->mismatchI[type][si][sj];
597 energy += P->TerminalAU;
603 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
604 minq = j - i + p - MAXLOOP - 2;
605 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
606 minq =
MAX2(c0, minq);
608 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
609 maxq =
MIN2(c0, maxq);
610 for(q = minq; q < maxq; q++){
611 if(S[q] != 3)
continue;
612 c0 = energy + ggg[p][q-p] + P->internal_loop[j - q - 1];
619 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
622 if(l1>MAXLOOP)
break;
623 if(S[p] != 3)
continue;
624 minq = j - i + p - MAXLOOP - 2;
625 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
626 minq =
MAX2(c0, minq);
628 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
629 maxq =
MIN2(c0, maxq);
630 for(q = minq; q < maxq; q++){
631 if(S[q] != 3)
continue;
632 c0 = energy + ggg[p][q - p] + P->internal_loop[l1 + j - q - 1];
640 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
643 if(l1>MAXLOOP)
break;
644 if(S[p] != 3)
continue;
645 c0 = energy + ggg[p][q - p] + P->internal_loop[l1];
654 exp_E_GQuad_IntLoop(
int i,
662 int k, l, minl, maxl, u, r;
663 FLT_OR_DBL q, qe, *expintern;
669 qe = pf->expmismatchI[type][si][sj];
670 expintern = pf->expinternal;
677 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
678 minl = j - i + k - MAXLOOP - 2;
679 u = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
680 minl =
MAX2(u, minl);
682 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
683 maxl =
MIN2(u, maxl);
684 for(l = minl; l < maxl; l++){
685 if(S[l] != 3)
continue;
686 if(G[index[k]-l] == 0.)
continue;
687 q += qe * G[index[k]-l] * expintern[j - l - 1];
694 k <= j - VRNA_GQUAD_MIN_BOX_SIZE;
697 if(u > MAXLOOP)
break;
698 if(S[k] != 3)
continue;
699 minl = j - i + k - MAXLOOP - 2;
700 r = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
701 minl =
MAX2(r, minl);
702 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
704 maxl =
MIN2(r, maxl);
705 for(l = minl; l < maxl; l++){
706 if(S[l] != 3)
continue;
707 if(G[index[k]-l] == 0.)
continue;
708 q += qe * G[index[k]-l] * expintern[u + j - l - 1];
714 for(k = i + 4; k < j - VRNA_GQUAD_MIN_BOX_SIZE; k++){
717 if(S[k] != 3)
continue;
718 if(G[index[k]-l] == 0.)
continue;
719 q += qe * G[index[k]-l] * expintern[u];
#define MIN2(A, B)
Definition: utils.h:134
void * space(unsigned size)
Allocate space safely.
#define MAXLOOP
Definition: energy_const.h:28
double * pr
A pointer to the base pair probability matrix.
The datastructure that contains temperature scaled energy parameters.
Definition: data_structures.h:126
model_detailsT model_details
Model details to be used in the recursions.
Definition: data_structures.h:164
The datastructure that contains temperature scaled Boltzmann weights of the energy parameters...
Definition: data_structures.h:171
All datastructures and typedefs shared among the Vienna RNA Package can be found here.
int parse_gquad(const char *struc, int *L, int l[3])
this datastructure is used as input parameter in functions of PS_dot.h and others ...
Definition: data_structures.h:52
#define INF
Definition: energy_const.h:16
int dangles
Specifies the dangle model used in any energy evaluation (0,1,2 or 3)
Definition: data_structures.h:107
PRIVATE int backtrack_GQuad_IntLoop_L(int c, int i, int j, int type, short *S, int **ggg, int maxdist, int *p, int *q, paramT *P)
Definition: gquad.h:258
PRIVATE int backtrack_GQuad_IntLoop(int c, int i, int j, int type, short *S, int *ggg, int *index, int *p, int *q, paramT *P)
Definition: gquad.h:160
int * get_gquad_matrix(short *S, paramT *P)
Get a triangular matrix prefilled with minimum free energy contributions of G-quadruplexes.
int dangles
Switch the energy model for dangling end contributions (0, 1, 2, 3)
#define MAX2(A, B)
Definition: utils.h:138