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,
78 void get_gquad_pattern_mfe(
short *S,
86 get_gquad_pattern_exhaustive(
short *S,
94 void get_gquad_pattern_pf(
short *S,
101 plist *get_plist_gquad_from_pr(
short *S,
108 plist *get_plist_gquad_from_pr_max(
short *S,
118 plist *get_plist_gquad_from_db(
const char *structure,
121 int get_gquad_count(
short *S,
125 int get_gquad_layer_count(
short *S,
140 int parse_gquad(
const char *struc,
int *L,
int l[3]);
172 int energy,
dangles, k, l, maxl, minl, c0, l1;
181 energy += P->mismatchI[type][si][sj];
184 energy += P->TerminalAU;
188 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
189 minl = j - i + k -
MAXLOOP - 2;
190 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
191 minl =
MAX2(c0, minl);
193 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
194 maxl =
MIN2(c0, maxl);
195 for(l = minl; l < maxl; l++){
196 if(S[l] != 3)
continue;
197 if(c == energy + ggg[index[l] + k] + P->internal_loop[j - l - 1]){
206 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
210 if(S[k] != 3)
continue;
211 minl = j - i + k -
MAXLOOP - 2;
212 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
213 minl =
MAX2(c0, minl);
215 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
216 maxl =
MIN2(c0, maxl);
217 for(l = minl; l < maxl; l++){
218 if(S[l] != 3)
continue;
219 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1 + j - l - 1]){
229 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
233 if(S[k] != 3)
continue;
234 if(c == energy + ggg[index[l] + k] + P->internal_loop[l1]){
270 int energy,
dangles, k, l, maxl, minl, c0, l1;
279 energy += P->mismatchI[type][si][sj];
282 energy += P->TerminalAU;
286 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
287 minl = j - i + k -
MAXLOOP - 2;
288 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
289 minl =
MAX2(c0, minl);
291 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
292 maxl =
MIN2(c0, maxl);
293 for(l = minl; l < maxl; l++){
294 if(S[l] != 3)
continue;
295 if(c == energy + ggg[k][l - k] + P->internal_loop[j - l - 1]){
304 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
308 if(S[k] != 3)
continue;
309 minl = j - i + k -
MAXLOOP - 2;
310 c0 = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
311 minl =
MAX2(c0, minl);
313 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
314 maxl =
MIN2(c0, maxl);
315 for(l = minl; l < maxl; l++){
316 if(S[l] != 3)
continue;
317 if(c == energy + ggg[k][l - k] + P->internal_loop[l1 + j - l - 1]){
327 k < j - VRNA_GQUAD_MIN_BOX_SIZE;
331 if(S[k] != 3)
continue;
332 if(c == energy + ggg[k][l - k] + P->internal_loop[l1]){
343 E_GQuad_IntLoop(
int i,
351 int energy, ge, en1, en2,
dangles, p, q, l1, minq, maxq;
352 int c0, c1, c2, c3, up, d53, d5, d3;
361 energy += P->mismatchI[type][si][sj];
364 energy += P->TerminalAU;
370 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
371 minq = j - i + p -
MAXLOOP - 2;
372 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
373 minq =
MAX2(c0, minq);
375 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
376 maxq =
MIN2(c0, maxq);
377 for(q = minq; q < maxq; q++){
378 if(S[q] != 3)
continue;
379 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
386 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
389 if(l1>MAXLOOP)
break;
390 if(S[p] != 3)
continue;
391 minq = j - i + p - MAXLOOP - 2;
392 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
393 minq =
MAX2(c0, minq);
395 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
396 maxq =
MIN2(c0, maxq);
397 for(q = minq; q < maxq; q++){
398 if(S[q] != 3)
continue;
399 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
407 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
410 if(l1>MAXLOOP)
break;
411 if(S[p] != 3)
continue;
412 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
419 en1 = energy + P->dangle5[type][si];
420 en2 = energy + P->dangle5[type][sj];
421 en3 = energy + P->mismatchI[type][si][sj];
426 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
427 minq = j - i + p - MAXLOOP - 2;
428 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
429 minq =
MAX2(c0, minq);
431 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
432 maxq =
MIN2(c0, maxq);
433 for(q = minq; q < maxq; q++){
434 if(S[q] != 3)
continue;
435 c0 = en1 + ggg[index[q] + p] + P->internal_loop[j - q - 1];
441 for(p = i + 2; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
443 if(l1>MAXLOOP)
break;
444 if(S[p] != 3)
continue;
445 minq = j - i + p - MAXLOOP - 2;
446 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
447 minq =
MAX2(c0, minq);
449 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
450 maxq =
MIN2(c0, maxq);
451 for(q = minq; q < maxq; q++){
452 if(S[q] != 3)
continue;
453 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
460 for(p = i + 4; p < j - VRNA_GQUAD_MIN_BOX_SIZE; p++){
462 if(l1>MAXLOOP)
break;
463 if(S[p] != 3)
continue;
464 c0 = en1 + ggg[index[q] + p] + P->internal_loop[l1 + 1];
477 E_GQuad_IntLoop_exhaustive(
int i,
488 int energy, *ge, en1, en2, dangles, p, q, l1, minq, maxq;
489 int c0, c1, c2, c3, up, d53, d5, d3;
499 energy += P->mismatchI[type][si][sj];
502 energy += P->TerminalAU;
505 *p_p = (
int *)
space(
sizeof(
int) * 256);
506 *q_p = (
int *)
space(
sizeof(
int) * 256);
507 ge = (
int *)
space(
sizeof(
int) * 256);
511 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
512 minq = j - i + p - MAXLOOP - 2;
513 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
514 minq =
MAX2(c0, minq);
516 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
517 maxq =
MIN2(c0, maxq);
518 for(q = minq; q < maxq; q++){
519 if(S[q] != 3)
continue;
520 c0 = energy + ggg[index[q] + p] + P->internal_loop[j - q - 1];
522 ge[cnt] = energy + P->internal_loop[j - q - 1];
531 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
534 if(l1>MAXLOOP)
break;
535 if(S[p] != 3)
continue;
536 minq = j - i + p - MAXLOOP - 2;
537 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
538 minq =
MAX2(c0, minq);
540 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
541 maxq =
MIN2(c0, maxq);
542 for(q = minq; q < maxq; q++){
543 if(S[q] != 3)
continue;
544 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1 + j - q - 1];
546 ge[cnt] = energy + P->internal_loop[l1 + j - q - 1];
556 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
559 if(l1>MAXLOOP)
break;
560 if(S[p] != 3)
continue;
561 c0 = energy + ggg[index[q] + p] + P->internal_loop[l1];
563 ge[cnt] = energy + P->internal_loop[l1];
577 E_GQuad_IntLoop_L(
int i,
585 int energy, ge, en1, en2, dangles, p, q, l1, minq, maxq;
586 int c0, c1, c2, c3, up, d53, d5, d3;
595 energy += P->mismatchI[type][si][sj];
598 energy += P->TerminalAU;
604 if(p < j - VRNA_GQUAD_MIN_BOX_SIZE){
605 minq = j - i + p - MAXLOOP - 2;
606 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
607 minq =
MAX2(c0, minq);
609 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
610 maxq =
MIN2(c0, maxq);
611 for(q = minq; q < maxq; q++){
612 if(S[q] != 3)
continue;
613 c0 = energy + ggg[p][q-p] + P->internal_loop[j - q - 1];
620 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
623 if(l1>MAXLOOP)
break;
624 if(S[p] != 3)
continue;
625 minq = j - i + p - MAXLOOP - 2;
626 c0 = p + VRNA_GQUAD_MIN_BOX_SIZE - 1;
627 minq =
MAX2(c0, minq);
629 maxq = p + VRNA_GQUAD_MAX_BOX_SIZE + 1;
630 maxq =
MIN2(c0, maxq);
631 for(q = minq; q < maxq; q++){
632 if(S[q] != 3)
continue;
633 c0 = energy + ggg[p][q - p] + P->internal_loop[l1 + j - q - 1];
641 p < j - VRNA_GQUAD_MIN_BOX_SIZE;
644 if(l1>MAXLOOP)
break;
645 if(S[p] != 3)
continue;
646 c0 = energy + ggg[p][q - p] + P->internal_loop[l1];
655 exp_E_GQuad_IntLoop(
int i,
663 int k, l, minl, maxl, u, r;
664 FLT_OR_DBL q, qe, *expintern;
670 qe = pf->expmismatchI[type][si][sj];
671 expintern = pf->expinternal;
678 if(k < j - VRNA_GQUAD_MIN_BOX_SIZE){
679 minl = j - i + k - MAXLOOP - 2;
680 u = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
681 minl =
MAX2(u, minl);
683 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
684 maxl =
MIN2(u, maxl);
685 for(l = minl; l < maxl; l++){
686 if(S[l] != 3)
continue;
687 if(G[index[k]-l] == 0.)
continue;
688 q += qe * G[index[k]-l] * expintern[j - l - 1];
695 k <= j - VRNA_GQUAD_MIN_BOX_SIZE;
698 if(u > MAXLOOP)
break;
699 if(S[k] != 3)
continue;
700 minl = j - i + k - MAXLOOP - 2;
701 r = k + VRNA_GQUAD_MIN_BOX_SIZE - 1;
702 minl =
MAX2(r, minl);
703 maxl = k + VRNA_GQUAD_MAX_BOX_SIZE + 1;
705 maxl =
MIN2(r, maxl);
706 for(l = minl; l < maxl; l++){
707 if(S[l] != 3)
continue;
708 if(G[index[k]-l] == 0.)
continue;
709 q += qe * G[index[k]-l] * expintern[u + j - l - 1];
715 for(k = i + 4; k < j - VRNA_GQUAD_MIN_BOX_SIZE; k++){
718 if(S[k] != 3)
continue;
719 if(G[index[k]-l] == 0.)
continue;
720 q += qe * G[index[k]-l] * expintern[u];