1#ifndef VIENNA_RNA_PACKAGE_LOOPS_INTERNAL_H
2#define VIENNA_RNA_PACKAGE_LOOPS_INTERNAL_H
7#include <ViennaRNA/params/default.h>
14#ifdef VRNA_WARN_DEPRECATED
15# if defined(DEPRECATED)
18# if defined(__clang__)
19# define DEPRECATED(func, msg) func __attribute__ ((deprecated("", msg)))
20# elif defined(__GNUC__)
21# define DEPRECATED(func, msg) func __attribute__ ((deprecated(msg)))
23# define DEPRECATED(func, msg) func
26# define DEPRECATED(func, msg) func
157#ifndef VRNA_DISABLE_BACKWARD_COMPATIBILITY
168#define ON_SAME_STRAND(I, J, C) (((I) >= (C)) || ((J) < (C)))
255PRIVATE INLINE
int E_IntLoop_Co(
int type,
281ubf_eval_int_loop(
int i,
294 unsigned char type_2,
306 if ((cp < 0) || (ON_SAME_STRAND(i, p, cp) && ON_SAME_STRAND(q, j, cp))) {
308 energy =
E_IntLoop(u1, u2, type, type_2, si, sj, sp, sq, P);
312 Si = ON_SAME_STRAND(i, i1, cp) ? si : -1;
313 Sj = ON_SAME_STRAND(j1, j, cp) ? sj : -1;
314 energy = E_IntLoop_Co(rtype[type], rtype[type_2],
350ubf_eval_int_loop2(
int i,
363 unsigned char type_2,
376 if ((sn[i] == sn[p]) && (sn[q] == sn[j])) {
378 energy =
E_IntLoop(u1, u2, type, type_2, si, sj, sp, sq, P);
382 Si = (sn[i1] == sn[i]) ? si : -1;
383 Sj = (sn[j] == sn[j1]) ? sj : -1;
384 energy = E_IntLoop_Co(rtype[type], rtype[type_2],
430ubf_eval_ext_int_loop(
int i,
443 unsigned char type_2,
448 int energy, u1, u2, u3;
454 energy =
E_IntLoop(u2, u1 + u3, type, type_2, si, sj, sp, sq, P);
465 if (u1 + u2 + u3 == 0)
491 int nl, ns, u, energy;
502 return P->stack[type][type_2];
506 energy = (nl <=
MAXLOOP) ? P->bulge[nl] :
507 (P->bulge[30] + (
int)(P->lxc * log(nl / 30.)));
509 energy += P->stack[type][type_2];
512 energy += P->TerminalAU;
515 energy += P->TerminalAU;
523 return P->int11[type][type_2][si1][sj1];
528 energy = P->int21[type][type_2][si1][sq1][sj1];
530 energy = P->int21[type_2][type][sq1][si1][sp1];
537 MAXLOOP) ? (P->internal_loop[nl + 1]) : (P->internal_loop[30] +
538 (int)(P->lxc * log((nl + 1) / 30.)));
539 energy +=
MIN2(MAX_NINIO, (nl - ns) * P->ninio[2]);
540 energy += P->mismatch1nI[type][si1][sj1] + P->mismatch1nI[type_2][sq1][sp1];
543 }
else if (ns == 2) {
546 return P->int22[type][type_2][si1][sp1][sq1][sj1];
547 }
else if (nl == 3) {
549 energy = P->internal_loop[5] + P->ninio[2];
550 energy += P->mismatch23I[type][si1][sj1] + P->mismatch23I[type_2][sq1][sp1];
560 MAXLOOP) ? (P->internal_loop[u]) : (P->internal_loop[30] + (int)(P->lxc * log((u) / 30.)));
562 energy +=
MIN2(MAX_NINIO, (nl - ns) * P->ninio[2]);
564 energy += P->mismatchI[type][si1][sj1] + P->mismatchI[type_2][sq1][sp1];
583 int ul, us, no_close = 0;
587 if ((noGUclosure) && ((type2 == 3) || (type2 == 4) || (type == 3) || (type == 4)))
600 z = P->expstack[type][type2];
601 }
else if (!no_close) {
606 z *= P->expstack[type][type2];
616 }
else if (us == 1) {
618 return (
FLT_OR_DBL)(P->expint11[type][type2][si1][sj1]);
623 return (
FLT_OR_DBL)(P->expint21[type][type2][si1][sq1][sj1]);
625 return (
FLT_OR_DBL)(P->expint21[type2][type][sq1][si1][sp1]);
628 z = P->expinternal[ul + us] * P->expmismatch1nI[type][si1][sj1] *
629 P->expmismatch1nI[type2][sq1][sp1];
630 return (
FLT_OR_DBL)(z * P->expninio[2][ul - us]);
632 }
else if (us == 2) {
635 return (
FLT_OR_DBL)(P->expint22[type][type2][si1][sp1][sq1][sj1]);
636 }
else if (ul == 3) {
638 z = P->expinternal[5] * P->expmismatch23I[type][si1][sj1] *
639 P->expmismatch23I[type2][sq1][sp1];
645 z = P->expinternal[ul + us] * P->expmismatchI[type][si1][sj1] *
646 P->expmismatchI[type2][sq1][sp1];
647 return (
FLT_OR_DBL)(z * P->expninio[2][ul - us]);
655E_IntLoop_Co(
int type,
669 int e, energy, ci, cj, cp, cq, d3, d5, d5_2, d3_2, tmm, tmm_2;
673 energy += P->TerminalAU;
676 energy += P->TerminalAU;
681 ci = ON_SAME_STRAND(i, i + 1, cutpoint);
682 cj = ON_SAME_STRAND(j - 1, j, cutpoint);
683 cp = ON_SAME_STRAND(p - 1, p, cutpoint);
684 cq = ON_SAME_STRAND(q, q + 1, cutpoint);
686 d3 = ci ? P->dangle3[type][si1] : 0;
687 d5 = cj ? P->dangle5[type][sj1] : 0;
688 d5_2 = cp ? P->dangle5[type_2][sp1] : 0;
689 d3_2 = cq ? P->dangle3[type_2][sq1] : 0;
691 tmm = (cj && ci) ? P->mismatchExt[type][sj1][si1] : d5 + d3;
692 tmm_2 = (cp && cq) ? P->mismatchExt[type_2][sp1][sq1] : d5_2 + d3_2;
695 return energy + tmm + tmm_2;
704 e =
MIN2(tmm_2, d5_2);
707 }
else if (j - q == 2) {
709 e =
MIN2(tmm + d5_2, d3 + d5_2);
710 e =
MIN2(e, d5 + d5_2);
711 e =
MIN2(e, d3 + tmm_2);
712 e =
MIN2(e, d3 + d3_2);
721 }
else if (p - i == 2) {
724 e =
MIN2(tmm + d3_2, d5 + d3_2);
725 e =
MIN2(e, d5 + d3_2);
726 e =
MIN2(e, d3 + d3_2);
727 e =
MIN2(e, d5 + tmm_2);
732 }
else if (j - q == 2) {
734 e =
MIN2(tmm, tmm_2);
739 e =
MIN2(e, d3 + d3_2);
740 e =
MIN2(e, d5 + d5_2);
744 energy +=
MIN2(d3, d5_2);
751 }
else if (j - q == 2) {
753 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:573
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:480
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:148
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.