1 #ifndef VIENNA_RNA_PACKAGE_GQUAD_H
2 #define VIENNA_RNA_PACKAGE_GQUAD_H
29 FLT_OR_DBL exp_E_gquad(
int L,
33 int E_gquad_ali(
int i,
41 void E_gquad_ali_en(
int i,
67 int *get_gquad_ali_matrix(
short *S_cons,
72 FLT_OR_DBL *get_gquad_pf_matrix(
short *S,
76 int **get_gquad_L_matrix(
short *S,
82 void get_gquad_pattern_mfe(
short *S,
90 get_gquad_pattern_exhaustive(
short *S,
98 void get_gquad_pattern_pf(
short *S,
105 plist *get_plist_gquad_from_pr(
short *S,
112 plist *get_plist_gquad_from_pr_max(
short *S,
122 plist *get_plist_gquad_from_db(
const char *structure,
125 int get_gquad_count(
short *S,
129 int get_gquad_layer_count(
short *S,
144 int parse_gquad(
const char *struc,
int *L,
int l[3]);
176 int energy,
dangles, k, l, maxl, minl, c0, l1;
185 energy += P->mismatchI[type][si][sj];
188 energy += P->TerminalAU;
192 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
193 minl = j - i + k -
MAXLOOP - 2;
194 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
195 minl =
MAX2(c0, minl);
197 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
198 maxl =
MIN2(c0, maxl);
199 for(l = minl; l < maxl; l++){
200 if(S[l] != 3)
continue;
201 if(c == energy + ggg[index[l] + k] + P->internal_loop[j - l - 1]){
210 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
214 if(S[k] != 3)
continue;
215 minl = j - i + k -
MAXLOOP - 2;
216 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
217 minl =
MAX2(c0, minl);
219 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
220 maxl =
MIN2(c0, maxl);
221 for(l = minl; l < maxl; l++){
222 if(S[l] != 3)
continue;
223 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1 + j - l - 1]){
233 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
237 if(S[k] != 3)
continue;
238 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1]){
274 int energy,
dangles, k, l, maxl, minl, c0, l1;
283 energy += P->mismatchI[type][si][sj];
286 energy += P->TerminalAU;
290 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
291 minl = j - i + k -
MAXLOOP - 2;
292 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
293 minl =
MAX2(c0, minl);
295 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
296 maxl =
MIN2(c0, maxl);
297 for(l = minl; l < maxl; l++){
298 if(S[l] != 3)
continue;
299 if(c == energy + ggg[k][l - k] + P->internal_loop[j - l - 1]){
308 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
312 if(S[k] != 3)
continue;
313 minl = j - i + k -
MAXLOOP - 2;
314 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
315 minl =
MAX2(c0, minl);
317 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
318 maxl =
MIN2(c0, maxl);
319 for(l = minl; l < maxl; l++){
320 if(S[l] != 3)
continue;
321 if(c == energy + ggg[k][l - k] + P->internal_loop[l1 + j - l - 1]){
331 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
335 if(S[k] != 3)
continue;
336 if(c == energy + ggg[k][l - k] + P->internal_loop[l1]){
347 E_GQuad_IntLoop(
int i,
355 int energy, ge,
dangles, p, q, l1, minq, maxq, c0;
364 energy += P->mismatchI[type][si][sj];
367 energy += P->TerminalAU;
373 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
374 minq = j - i + p -
MAXLOOP - 2;
375 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
376 minq =
MAX2(c0, minq);
378 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
379 maxq =
MIN2(c0, maxq);
380 for(q = minq; q < maxq; q++){
381 if(S[q] != 3)
continue;
382 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
389 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
392 if(l1>MAXLOOP)
break;
393 if(S[p] != 3)
continue;
394 minq = j - i + p - MAXLOOP - 2;
395 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
396 minq =
MAX2(c0, minq);
398 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
399 maxq =
MIN2(c0, maxq);
400 for(q = minq; q < maxq; q++){
401 if(S[q] != 3)
continue;
402 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
410 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
413 if(l1>MAXLOOP)
break;
414 if(S[p] != 3)
continue;
415 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
422 en1 = energy + P->dangle5[type][si];
423 en2 = energy + P->dangle5[type][sj];
424 en3 = energy + P->mismatchI[type][si][sj];
429 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
430 minq = j - i + p - MAXLOOP - 2;
431 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
432 minq =
MAX2(c0, minq);
434 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
435 maxq =
MIN2(c0, maxq);
436 for(q = minq; q < maxq; q++){
437 if(S[q] != 3)
continue;
438 c0 = en1 + ggg[index[q] + p] + P->internal_loop[j - q - 1];
444 for(p = i + 2; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
446 if(l1>MAXLOOP)
break;
447 if(S[p] != 3)
continue;
448 minq = j - i + p - MAXLOOP - 2;
449 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
450 minq =
MAX2(c0, minq);
452 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
453 maxq =
MIN2(c0, maxq);
454 for(q = minq; q < maxq; q++){
455 if(S[q] != 3)
continue;
456 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
463 for(p = i + 4; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
465 if(l1>MAXLOOP)
break;
466 if(S[p] != 3)
continue;
467 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + 1];
480 E_GQuad_IntLoop_exhaustive(
int i,
491 int energy, *ge,
dangles, p, q, l1, minq, maxq, c0;
501 energy += P->mismatchI[type][si][sj];
504 energy += P->TerminalAU;
513 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
514 minq = j - i + p - MAXLOOP - 2;
515 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
516 minq =
MAX2(c0, minq);
518 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
519 maxq =
MIN2(c0, maxq);
520 for(q = minq; q < maxq; q++){
521 if(S[q] != 3)
continue;
522 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
524 ge[cnt] = energy + P->internal_loop[j - q - 1];
533 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
536 if(l1>MAXLOOP)
break;
537 if(S[p] != 3)
continue;
538 minq = j - i + p - MAXLOOP - 2;
539 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
540 minq =
MAX2(c0, minq);
542 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
543 maxq =
MIN2(c0, maxq);
544 for(q = minq; q < maxq; q++){
545 if(S[q] != 3)
continue;
546 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
548 ge[cnt] = energy + P->internal_loop[l1 + j - q - 1];
558 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
561 if(l1>MAXLOOP)
break;
562 if(S[p] != 3)
continue;
563 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
565 ge[cnt] = energy + P->internal_loop[l1];
579 E_GQuad_IntLoop_L(
int i,
587 int energy, ge,
dangles, p, q, l1, minq, maxq, c0;
596 energy += P->mismatchI[type][si][sj];
599 energy += P->TerminalAU;
605 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
606 minq = j - i + p - MAXLOOP - 2;
607 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
608 minq =
MAX2(c0, minq);
610 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
611 maxq =
MIN2(c0, maxq);
612 for(q = minq; q < maxq; q++){
613 if(S[q] != 3)
continue;
614 c0 = energy + ggg[p][q-p] + P->internal_loop[j - q - 1];
621 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
624 if(l1>MAXLOOP)
break;
625 if(S[p] != 3)
continue;
626 minq = j - i + p - MAXLOOP - 2;
627 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
628 minq =
MAX2(c0, minq);
630 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
631 maxq =
MIN2(c0, maxq);
632 for(q = minq; q < maxq; q++){
633 if(S[q] != 3)
continue;
634 c0 = energy + ggg[p][q - p] + P->internal_loop[l1 + j - q - 1];
642 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
645 if(l1>MAXLOOP)
break;
646 if(S[p] != 3)
continue;
647 c0 = energy + ggg[p][q - p] + P->internal_loop[l1];
656 exp_E_GQuad_IntLoop(
int i,
664 int k, l, minl, maxl, u, r;
665 FLT_OR_DBL q, qe, *expintern;
671 qe = pf->expmismatchI[type][si][sj];
672 expintern = pf->expinternal;
679 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
680 minl = j - i + k - MAXLOOP - 2;
681 u = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
682 minl =
MAX2(u, minl);
684 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
685 maxl =
MIN2(u, maxl);
686 for(l = minl; l < maxl; l++){
687 if(S[l] != 3)
continue;
688 if(G[index[k]-l] == 0.)
continue;
689 q += qe * G[index[k]-l] * expintern[j - l - 1];
696 k <= j - VRNA_GQUAD_MIN_BOX_SIZE;
699 if(u > MAXLOOP)
break;
700 if(S[k] != 3)
continue;
701 minl = j - i + k - MAXLOOP - 2;
702 r = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
703 minl =
MAX2(r, minl);
704 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
706 maxl =
MIN2(r, maxl);
707 for(l = minl; l < maxl; l++){
708 if(S[l] != 3)
continue;
709 if(G[index[k]-l] == 0.)
continue;
710 q += qe * G[index[k]-l] * expintern[u + j - l - 1];
716 for(k = i + 4; k < j - VRNA_GQUAD_MIN_BOX_SIZE; k++){
719 if(S[k] != 3)
continue;
720 if(G[index[k]-l] == 0.)
continue;
721 q += qe * G[index[k]-l] * expintern[u];
void * vrna_alloc(unsigned size)
Allocate space safely.
#define MAXLOOP
Definition: energy_const.h:28
int dangles
Switch the energy model for dangling end contributions (0, 1, 2, 3)
#define MIN2(A, B)
Get the minimum of two comparable values.
Definition: utils.h:118
vrna_md_t model_details
Model details to be used in the recursions.
Definition: params.h:79
PRIVATE int backtrack_GQuad_IntLoop_L(int c, int i, int j, int type, short *S, int **ggg, int maxdist, int *p, int *q, vrna_param_t *P)
Definition: gquad.h:263
this datastructure is used as input parameter in functions of PS_dot.h and others ...
Definition: data_structures.h:45
#define INF
Definition: energy_const.h:16
#define MAX2(A, B)
Get the maximum of two comparable values.
Definition: utils.h:123
int dangles
Specifies the dangle model used in any energy evaluation (0,1,2 or 3)
Definition: model.h:172
int * get_gquad_matrix(short *S, vrna_param_t *P)
Get a triangular matrix prefilled with minimum free energy contributions of G-quadruplexes.
The datastructure that contains temperature scaled energy parameters.
Definition: params.h:41
FLT_OR_DBL * pr
A pointer to the base pair probability matrix.
int parse_gquad(const char *struc, int *L, int l[3])
PRIVATE int backtrack_GQuad_IntLoop(int c, int i, int j, int type, short *S, int *ggg, int *index, int *p, int *q, vrna_param_t *P)
Definition: gquad.h:165
The datastructure that contains temperature scaled Boltzmann weights of the energy parameters...
Definition: params.h:86