1 #ifndef VIENNA_RNA_PACKAGE_LOOPS_INTERNAL_H
2 #define VIENNA_RNA_PACKAGE_LOOPS_INTERNAL_H
5 #include <ViennaRNA/params/default.h>
12 #ifdef VRNA_WARN_DEPRECATED
13 # if defined(DEPRECATED)
16 # if defined(__clang__)
17 # define DEPRECATED(func, msg) func __attribute__ ((deprecated("", msg)))
18 # elif defined(__GNUC__)
19 # define DEPRECATED(func, msg) func __attribute__ ((deprecated(msg)))
21 # define DEPRECATED(func, msg) func
24 # define DEPRECATED(func, msg) func
28 # define INLINE inline
155 #ifndef VRNA_DISABLE_BACKWARD_COMPATIBILITY
162 #ifdef ON_SAME_STRAND
163 #undef ON_SAME_STRAND
166 #define ON_SAME_STRAND(I, J, C) (((I) >= (C)) || ((J) < (C)))
253 PRIVATE INLINE
int E_IntLoop_Co(
int type,
279 ubf_eval_int_loop(
int i,
292 unsigned char type_2,
304 if ((cp < 0) || (ON_SAME_STRAND(i, p, cp) && ON_SAME_STRAND(q, j, cp))) {
306 energy =
E_IntLoop(u1, u2, type, type_2, si, sj, sp, sq, P);
310 Si = ON_SAME_STRAND(i, i1, cp) ? si : -1;
311 Sj = ON_SAME_STRAND(j1, j, cp) ? sj : -1;
312 energy = E_IntLoop_Co(rtype[type], rtype[type_2],
348 ubf_eval_int_loop2(
int i,
361 unsigned char type_2,
374 if ((sn[i] == sn[p]) && (sn[q] == sn[j])) {
376 energy =
E_IntLoop(u1, u2, type, type_2, si, sj, sp, sq, P);
380 Si = (sn[i1] == sn[i]) ? si : -1;
381 Sj = (sn[j] == sn[j1]) ? sj : -1;
382 energy = E_IntLoop_Co(rtype[type], rtype[type_2],
428 ubf_eval_ext_int_loop(
int i,
441 unsigned char type_2,
446 int energy, u1, u2, u3;
452 energy =
E_IntLoop(u2, u1 + u3, type, type_2, si, sj, sp, sq, P);
463 if (u1 + u2 + u3 == 0)
489 int nl, ns, u, energy;
500 return P->stack[type][type_2];
504 energy = (nl <=
MAXLOOP) ? P->bulge[nl] :
505 (P->bulge[30] + (
int)(P->lxc * log(nl / 30.)));
507 energy += P->stack[type][type_2];
510 energy += P->TerminalAU;
513 energy += P->TerminalAU;
521 return P->int11[type][type_2][si1][sj1];
526 energy = P->int21[type][type_2][si1][sq1][sj1];
528 energy = P->int21[type_2][type][sq1][si1][sp1];
535 MAXLOOP) ? (P->internal_loop[nl + 1]) : (P->internal_loop[30] +
536 (int)(P->lxc * log((nl + 1) / 30.)));
537 energy +=
MIN2(MAX_NINIO, (nl - ns) * P->ninio[2]);
538 energy += P->mismatch1nI[type][si1][sj1] + P->mismatch1nI[type_2][sq1][sp1];
541 }
else if (ns == 2) {
544 return P->int22[type][type_2][si1][sp1][sq1][sj1];
545 }
else if (nl == 3) {
547 energy = P->internal_loop[5] + P->ninio[2];
548 energy += P->mismatch23I[type][si1][sj1] + P->mismatch23I[type_2][sq1][sp1];
558 MAXLOOP) ? (P->internal_loop[u]) : (P->internal_loop[30] + (int)(P->lxc * log((u) / 30.)));
560 energy +=
MIN2(MAX_NINIO, (nl - ns) * P->ninio[2]);
562 energy += P->mismatchI[type][si1][sj1] + P->mismatchI[type_2][sq1][sp1];
581 int ul, us, no_close = 0;
585 if ((noGUclosure) && ((type2 == 3) || (type2 == 4) || (type == 3) || (type == 4)))
598 z = P->expstack[type][type2];
599 }
else if (!no_close) {
604 z *= P->expstack[type][type2];
614 }
else if (us == 1) {
616 return (
FLT_OR_DBL)(P->expint11[type][type2][si1][sj1]);
621 return (
FLT_OR_DBL)(P->expint21[type][type2][si1][sq1][sj1]);
623 return (
FLT_OR_DBL)(P->expint21[type2][type][sq1][si1][sp1]);
626 z = P->expinternal[ul + us] * P->expmismatch1nI[type][si1][sj1] *
627 P->expmismatch1nI[type2][sq1][sp1];
628 return (
FLT_OR_DBL)(z * P->expninio[2][ul - us]);
630 }
else if (us == 2) {
633 return (
FLT_OR_DBL)(P->expint22[type][type2][si1][sp1][sq1][sj1]);
634 }
else if (ul == 3) {
636 z = P->expinternal[5] * P->expmismatch23I[type][si1][sj1] *
637 P->expmismatch23I[type2][sq1][sp1];
643 z = P->expinternal[ul + us] * P->expmismatchI[type][si1][sj1] *
644 P->expmismatchI[type2][sq1][sp1];
645 return (
FLT_OR_DBL)(z * P->expninio[2][ul - us]);
653 E_IntLoop_Co(
int type,
667 int e, energy, ci, cj, cp, cq, d3, d5, d5_2, d3_2, tmm, tmm_2;
671 energy += P->TerminalAU;
674 energy += P->TerminalAU;
679 ci = ON_SAME_STRAND(i, i + 1, cutpoint);
680 cj = ON_SAME_STRAND(j - 1, j, cutpoint);
681 cp = ON_SAME_STRAND(p - 1, p, cutpoint);
682 cq = ON_SAME_STRAND(q, q + 1, cutpoint);
684 d3 = ci ? P->dangle3[type][si1] : 0;
685 d5 = cj ? P->dangle5[type][sj1] : 0;
686 d5_2 = cp ? P->dangle5[type_2][sp1] : 0;
687 d3_2 = cq ? P->dangle3[type_2][sq1] : 0;
689 tmm = (cj && ci) ? P->mismatchExt[type][sj1][si1] : d5 + d3;
690 tmm_2 = (cp && cq) ? P->mismatchExt[type_2][sp1][sq1] : d5_2 + d3_2;
693 return energy + tmm + tmm_2;
702 e =
MIN2(tmm_2, d5_2);
705 }
else if (j - q == 2) {
707 e =
MIN2(tmm + d5_2, d3 + d5_2);
708 e =
MIN2(e, d5 + d5_2);
709 e =
MIN2(e, d3 + tmm_2);
710 e =
MIN2(e, d3 + d3_2);
719 }
else if (p - i == 2) {
722 e =
MIN2(tmm + d3_2, d5 + d3_2);
723 e =
MIN2(e, d5 + d3_2);
724 e =
MIN2(e, d3 + d3_2);
725 e =
MIN2(e, d5 + tmm_2);
730 }
else if (j - q == 2) {
732 e =
MIN2(tmm, tmm_2);
737 e =
MIN2(e, d3 + d3_2);
738 e =
MIN2(e, d5 + d5_2);
742 energy +=
MIN2(d3, d5_2);
749 }
else if (j - q == 2) {
751 energy +=
MIN2(d5, d3_2);
#define MAXLOOP
Definition: constants.h:29
Various data structures and pre-processor macros.
The Basic Fold Compound API.
#define VRNA_DECOMP_PAIR_IL
Indicator for interior loop decomposition step.
Definition: basic.h:144
double FLT_OR_DBL
Typename for floating point number in partition function computations.
Definition: basic.h:43
Base pair stack element.
Definition: basic.h:143
vrna_md_t model_details
Model details to be used in the recursions.
Definition: basic.h:96
vrna_md_t model_details
Model details to be used in the recursions.
Definition: basic.h:154
The data structure that contains temperature scaled Boltzmann weights of the energy parameters.
Definition: basic.h:103
The datastructure that contains temperature scaled energy parameters.
Definition: basic.h:57
PRIVATE FLT_OR_DBL exp_E_IntLoop(int u1, int u2, int type, int type2, short si1, short sj1, short sp1, short sq1, vrna_exp_param_t *P)
Definition: internal.h:571
PRIVATE int E_IntLoop(int n1, int n2, int type, int type_2, int si1, int sj1, int sp1, int sq1, vrna_param_t *P)
Definition: internal.h:478
int vrna_eval_int_loop(vrna_fold_compound_t *fc, int i, int j, int k, int l)
Evaluate the free energy contribution of an interior loop with delimiting base pairs and .
The most basic data structure required by many functions throughout the RNAlib.
Definition: fold_compound.h:137
int vrna_BT_stack(vrna_fold_compound_t *fc, int *i, int *j, int *en, vrna_bp_stack_t *bp_stack, int *stack_count)
Backtrack a stacked pair closed by .
int vrna_BT_int_loop(vrna_fold_compound_t *fc, int *i, int *j, int en, vrna_bp_stack_t *bp_stack, int *stack_count)
Backtrack an interior loop closed by .
int noGUclosure
Do not allow loops to be closed by GU pair.
Definition: model.h:211
int dangles
Specifies the dangle model used in any energy evaluation (0,1,2 or 3)
Definition: model.h:184
int dangles
Switch the energy model for dangling end contributions (0, 1, 2, 3)
vrna_callback_sc_energy * f
A function pointer used for pseudo energy contribution in MFE calculations.
Definition: soft.h:207
int ** energy_up
Energy contribution for stretches of unpaired nucleotides.
Definition: soft.h:177
void * data
A pointer to the data object provided for for pseudo energy contribution functions of the generic sof...
Definition: soft.h:224
int * energy_stack
Pseudo Energy contribution per base pair involved in a stack.
Definition: soft.h:203
int * energy_bp
Energy contribution for base pairs.
Definition: soft.h:188
The soft constraints data structure.
Definition: soft.h:171
#define MIN2(A, B)
Get the minimum of two comparable values.
Definition: basic.h:106
Functions and data structures for handling of secondary structure hard constraints.
Functions to deal with sets of energy parameters.
Functions and data structures for secondary structure soft constraints.
General utility- and helper-functions used throughout the ViennaRNA Package.