#ifndef __VIENNA_RNA_PACKAGE_PART_FUNC_CO_H__
#define __VIENNA_RNA_PACKAGE_PART_FUNC_CO_H__
#include "data_structures.h"
#ifdef __GNUC__
#define DEPRECATED(func) func __attribute__ ((deprecated))
#else
#define DEPRECATED(func) func
#endif
/**
* \addtogroup pf_cofold
* \brief Partition Function Cofolding
*
* To simplify the implementation the partition function computation is done
* internally in a null model that does not include the duplex initiation
* energy, i.e. the entropic penalty for producing a dimer from two
* monomers). The resulting free energies and pair probabilities are initially
* relative to that null model. In a second step the free energies can be
* corrected to include the dimerization penalty, and the pair probabilities
* can be divided into the conditional pair probabilities given that a re
* dimer is formed or not formed. See \cite bernhart:2006 for further details.
* @{
* \file part_func_co.h
*
* \brief Partition function for two RNA sequences
*
* As for folding one RNA molecule, this computes the partition function
* of all possible structures and the base pair probabilities. Uses the
* same global #pf_scale variable to avoid overflows.
*
* To simplify the implementation the partition function computation is done
* internally in a null model that does not include the duplex initiation
* energy, i.e. the entropic penalty for producing a dimer from two
* monomers). The resulting free energies and pair probabilities are initially
* relative to that null model. In a second step the free energies can be
* corrected to include the dimerization penalty, and the pair probabilities
* can be divided into the conditional pair probabilities given that a re
* dimer is formed or not formed.
*
* After computing the partition functions of all possible dimeres one
* can compute the probabilities of base pairs, the concentrations out of
* start concentrations and sofar and soaway.
*
* Dimer formation is inherently concentration dependent. Given the free
* energies of the monomers A and B and dimers AB, AA, and BB one can compute
* the equilibrium concentrations, given input concentrations of A and B, see
* e.g. Dimitrov & Zuker (2004)
*/
/**
* \brief Toggles no intrabp in 2nd mol
*/
extern int mirnatog;
/**
* \brief Free energies of the two monomers
*/
extern double F_monomer[2];
/**
* \brief Calculate partition function and base pair probabilities
*
* This is the cofold partition function folding. The second molecule starts
* at the #cut_point nucleotide.
*
* \note OpenMP: Since this function relies on the global parameters
* #do_backtrack, #dangles, #temperature and #pf_scale it is not
* threadsafe according to concurrent changes in these variables!
* Use co_pf_fold_par() instead to circumvent this issue.
*
* \see co_pf_fold_par()
*
* \param sequence Concatenated RNA sequences
* \param structure Will hold the structure or constraints
* \return cofoldF structure containing a set of energies needed for
* concentration computations.
*/
cofoldF co_pf_fold( char *sequence,
char *structure);
/**
* \brief Calculate partition function and base pair probabilities
*
* This is the cofold partition function folding. The second molecule starts
* at the #cut_point nucleotide.
*
* \see get_boltzmann_factors(), co_pf_fold()
*
* \param sequence Concatenated RNA sequences
* \param structure Pointer to the structure constraint
* \param parameters Data structure containing the precalculated Boltzmann factors
* \param calculate_bppm Switch to turn Base pair probability calculations on/off (0==off)
* \param is_constrained Switch to indicate that a structure contraint is passed via the
* structure argument (0==off)
* \return cofoldF structure containing a set of energies needed for
* concentration computations.
*/
cofoldF co_pf_fold_par( char *sequence,
char *structure,
pf_paramT *parameters,
int calculate_bppm,
int is_constrained);
/**
* \brief Get a pointer to the base pair probability array
*
* Accessing the base pair probabilities for a pair (i,j) is achieved by
* \verbatim FLT_OR_DBL *pr = export_bppm(); pr_ij = pr[iindx[i]-j]; \endverbatim
*
* \see get_iindx()
* \return A pointer to the base pair probability array
*/
FLT_OR_DBL *export_co_bppm(void);
/**
* \brief Free the memory occupied by co_pf_fold()
*/
void free_co_pf_arrays(void);
/**
* \brief Recalculate energy parameters
*
* This function recalculates all energy parameters given
* the current model settings.
*
* \note This function relies on the global variables #pf_scale, #dangles and
* #temperature. Thus it might not be threadsafe in certain situations.
* Use update_co_pf_params_par() instead.
*
* \see get_boltzmann_factors(), update_co_pf_params_par()
*
* \param length Length of the current RNA sequence
*/
void update_co_pf_params(int length);
/**
* \brief Recalculate energy parameters
*
* This function recalculates all energy parameters given
* the current model settings.
* It's second argument can either be NULL or a data structure
* containing the precomputed Boltzmann factors. In the first
* scenario, the necessary data structure will be created automatically
* according to the current global model settings, i.e. this
* mode might not be threadsafe.
* However, if the provided data structure is not NULL, threadsafety
* for the model parameters #dangles, #pf_scale and #temperature is regained, since their
* values are taken from this data structure during subsequent calculations.
*
* \see get_boltzmann_factors(), update_co_pf_params()
*
* \param length Length of the current RNA sequence
* \param parameters data structure containing the precomputed Boltzmann factors
*/
void update_co_pf_params_par(int length,
pf_paramT *parameters);
/**
* \brief Compute Boltzmann probabilities of dimerization without homodimers
*
* Given the pair probabilities and free energies (in the null model) for a
* dimer AB and the two constituent monomers A and B, compute the conditional pair
* probabilities given that a dimer AB actually forms.
* Null model pair probabilities are given as a list as produced by
* assign_plist_from_pr(), the dimer probabilities 'prAB' are modified in place.
*
* \param FAB free energy of dimer AB
* \param FEA free energy of monomer A
* \param FEB free energy of monomer B
* \param prAB pair probabilities for dimer
* \param prA pair probabilities monomer
* \param prB pair probabilities monomer
* \param Alength Length of molecule A
*/
void compute_probabilities(double FAB,
double FEA,
double FEB,
struct plist *prAB,
struct plist *prA,
struct plist *prB,
int Alength);
/**
* \brief Given two start monomer concentrations a and b, compute the
* concentrations in thermodynamic equilibrium of all dimers and the monomers.
*
* This function takes an array 'startconc' of input concentrations with alternating
* entries for the initial concentrations of molecules A and B (terminated by
* two zeroes), then computes the resulting equilibrium concentrations
* from the free energies for the dimers. Dimer free energies should be the
* dimer-only free energies, i.e. the FcAB entries from the #cofoldF struct.
*
* \param FEAB Free energy of AB dimer (FcAB entry)
* \param FEAA Free energy of AA dimer (FcAB entry)
* \param FEBB Free energy of BB dimer (FcAB entry)
* \param FEA Free energy of monomer A
* \param FEB Free energy of monomer B
* \param startconc List of start concentrations [a0],[b0],[a1],[b1],...,[an][bn],[0],[0]
* \return ConcEnt array containing the equilibrium energies and start concentrations
*/
ConcEnt *get_concentrations(double FEAB,
double FEAA,
double FEBB,
double FEA,
double FEB,
double *startconc);
/**
* @}
*/
/*
#################################################
# DEPRECATED FUNCTIONS #
#################################################
*/
/**
* DO NOT USE THIS FUNCTION ANYMORE
* \deprecated{ This function is deprecated and will be removed soon!}
* use \ref assign_plist_from_pr() instead!
*/
DEPRECATED(plist *get_plist( struct plist *pl,
int length,
double cut_off));
/**
* DO NOT USE THIS FUNCTION ANYMORE
* \deprecated{ This function is deprecated and will be removed soon!}
*/
DEPRECATED(void init_co_pf_fold(int length));
#endif