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,
dangles, p, q, l1, minq, maxq, c0;
359 energy += P->mismatchI[type][si][sj];
362 energy += P->TerminalAU;
368 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
369 minq = j - i + p -
MAXLOOP - 2;
370 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
371 minq =
MAX2(c0, minq);
373 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
374 maxq =
MIN2(c0, maxq);
375 for(q = minq; q < maxq; q++){
376 if(S[q] != 3)
continue;
377 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
384 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
387 if(l1>MAXLOOP)
break;
388 if(S[p] != 3)
continue;
389 minq = j - i + p - MAXLOOP - 2;
390 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
391 minq =
MAX2(c0, minq);
393 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
394 maxq =
MIN2(c0, maxq);
395 for(q = minq; q < maxq; q++){
396 if(S[q] != 3)
continue;
397 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
405 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
408 if(l1>MAXLOOP)
break;
409 if(S[p] != 3)
continue;
410 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
417 en1 = energy + P->dangle5[type][si];
418 en2 = energy + P->dangle5[type][sj];
419 en3 = energy + P->mismatchI[type][si][sj];
424 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
425 minq = j - i + p - MAXLOOP - 2;
426 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
427 minq =
MAX2(c0, minq);
429 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
430 maxq =
MIN2(c0, maxq);
431 for(q = minq; q < maxq; q++){
432 if(S[q] != 3)
continue;
433 c0 = en1 + ggg[index[q] + p] + P->internal_loop[j - q - 1];
439 for(p = i + 2; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
441 if(l1>MAXLOOP)
break;
442 if(S[p] != 3)
continue;
443 minq = j - i + p - MAXLOOP - 2;
444 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
445 minq =
MAX2(c0, minq);
447 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
448 maxq =
MIN2(c0, maxq);
449 for(q = minq; q < maxq; q++){
450 if(S[q] != 3)
continue;
451 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
458 for(p = i + 4; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
460 if(l1>MAXLOOP)
break;
461 if(S[p] != 3)
continue;
462 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + 1];
475 E_GQuad_IntLoop_exhaustive(
int i,
486 int energy, *ge,
dangles, p, q, l1, minq, maxq, c0;
496 energy += P->mismatchI[type][si][sj];
499 energy += P->TerminalAU;
502 *p_p = (
int *)
space(
sizeof(
int) * 256);
503 *q_p = (
int *)
space(
sizeof(
int) * 256);
504 ge = (
int *)
space(
sizeof(
int) * 256);
508 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
509 minq = j - i + p - MAXLOOP - 2;
510 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
511 minq =
MAX2(c0, minq);
513 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
514 maxq =
MIN2(c0, maxq);
515 for(q = minq; q < maxq; q++){
516 if(S[q] != 3)
continue;
517 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
519 ge[cnt] = energy + P->internal_loop[j - q - 1];
528 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
531 if(l1>MAXLOOP)
break;
532 if(S[p] != 3)
continue;
533 minq = j - i + p - MAXLOOP - 2;
534 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
535 minq =
MAX2(c0, minq);
537 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
538 maxq =
MIN2(c0, maxq);
539 for(q = minq; q < maxq; q++){
540 if(S[q] != 3)
continue;
541 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
543 ge[cnt] = energy + P->internal_loop[l1 + j - q - 1];
553 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
556 if(l1>MAXLOOP)
break;
557 if(S[p] != 3)
continue;
558 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
560 ge[cnt] = energy + P->internal_loop[l1];
574 E_GQuad_IntLoop_L(
int i,
582 int energy, ge,
dangles, p, q, l1, minq, maxq, c0;
591 energy += P->mismatchI[type][si][sj];
594 energy += P->TerminalAU;
600 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
601 minq = j - i + p - MAXLOOP - 2;
602 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
603 minq =
MAX2(c0, minq);
605 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
606 maxq =
MIN2(c0, maxq);
607 for(q = minq; q < maxq; q++){
608 if(S[q] != 3)
continue;
609 c0 = energy + ggg[p][q-p] + P->internal_loop[j - q - 1];
616 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
619 if(l1>MAXLOOP)
break;
620 if(S[p] != 3)
continue;
621 minq = j - i + p - MAXLOOP - 2;
622 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
623 minq =
MAX2(c0, minq);
625 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
626 maxq =
MIN2(c0, maxq);
627 for(q = minq; q < maxq; q++){
628 if(S[q] != 3)
continue;
629 c0 = energy + ggg[p][q - p] + P->internal_loop[l1 + j - q - 1];
637 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
640 if(l1>MAXLOOP)
break;
641 if(S[p] != 3)
continue;
642 c0 = energy + ggg[p][q - p] + P->internal_loop[l1];
651 exp_E_GQuad_IntLoop(
int i,
659 int k, l, minl, maxl, u, r;
660 FLT_OR_DBL q, qe, *expintern;
666 qe = pf->expmismatchI[type][si][sj];
667 expintern = pf->expinternal;
674 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
675 minl = j - i + k - MAXLOOP - 2;
676 u = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
677 minl =
MAX2(u, minl);
679 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
680 maxl =
MIN2(u, maxl);
681 for(l = minl; l < maxl; l++){
682 if(S[l] != 3)
continue;
683 if(G[index[k]-l] == 0.)
continue;
684 q += qe * G[index[k]-l] * expintern[j - l - 1];
691 k <= j - VRNA_GQUAD_MIN_BOX_SIZE;
694 if(u > MAXLOOP)
break;
695 if(S[k] != 3)
continue;
696 minl = j - i + k - MAXLOOP - 2;
697 r = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
698 minl =
MAX2(r, minl);
699 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
701 maxl =
MIN2(r, maxl);
702 for(l = minl; l < maxl; l++){
703 if(S[l] != 3)
continue;
704 if(G[index[k]-l] == 0.)
continue;
705 q += qe * G[index[k]-l] * expintern[u + j - l - 1];
711 for(k = i + 4; k < j - VRNA_GQUAD_MIN_BOX_SIZE; k++){
714 if(S[k] != 3)
continue;
715 if(G[index[k]-l] == 0.)
continue;
716 q += qe * G[index[k]-l] * expintern[u];
#define MIN2(A, B)
Definition: utils.h:150
void * space(unsigned size)
Allocate space safely.
int dangles
Switch the energy model for dangling end contributions (0, 1, 2, 3)
#define MAXLOOP
Definition: energy_const.h:28
The datastructure that contains temperature scaled energy parameters.
Definition: data_structures.h:180
model_detailsT model_details
Model details to be used in the recursions.
Definition: data_structures.h:218
The datastructure that contains temperature scaled Boltzmann weights of the energy parameters...
Definition: data_structures.h:225
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:94
#define INF
Definition: energy_const.h:16
int dangles
Specifies the dangle model used in any energy evaluation (0,1,2 or 3)
Definition: model.h:209
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
FLT_OR_DBL * pr
A pointer to the base pair probability matrix.
int * get_gquad_matrix(short *S, paramT *P)
Get a triangular matrix prefilled with minimum free energy contributions of G-quadruplexes.
#define MAX2(A, B)
Definition: utils.h:154