WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / H / alifold.h
diff --git a/binaries/src/ViennaRNA/H/alifold.h b/binaries/src/ViennaRNA/H/alifold.h
new file mode 100644 (file)
index 0000000..ee03092
--- /dev/null
@@ -0,0 +1,378 @@
+#ifndef __VIENNA_RNA_PACKAGE_ALIFOLD_H__
+#define __VIENNA_RNA_PACKAGE_ALIFOLD_H__
+
+#include "data_structures.h"
+
+/**
+ *  \addtogroup consensus_fold
+ *  \brief compute various properties (consensus MFE structures, partition function,
+ *  Boltzmann distributed stochastic samples, ...) for RNA sequence alignments
+ *
+ *  Consensus structures can be predicted by a modified version of the
+ *  fold() algorithm that takes a set of aligned sequences instead
+ *  of a single sequence. The energy function consists of the mean energy
+ *  averaged over the sequences, plus a covariance term that favors pairs
+ *  with consistent and compensatory mutations and penalizes pairs that
+ *  cannot be formed by all structures. For details see \cite hofacker:2002 and
+ *  \cite bernhart:2008.
+ *  @{
+ *    \file alifold.h
+ *    \brief compute various properties (consensus MFE structures, partition function, Boltzmann
+ *    distributed stochastic samples, ...) for RNA sequence alignments
+ *
+ *  @}
+ */
+
+
+/**
+ *  \addtogroup consensus_mfe_fold
+ *  \ingroup consensus_fold
+ *  @{
+ *
+ *  @}
+ */
+
+/**
+ *  \brief This variable controls the weight of the covariance term in the
+ *  energy function of alignment folding algorithms
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  Default is 1.
+ */
+extern  double  cv_fact;
+/**
+ *  \brief This variable controls the magnitude of the penalty for non-compatible sequences in
+ *  the covariance term of alignment folding algorithms.
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  Default is 1.
+ */
+extern  double  nc_fact;
+
+/*
+##############################################
+# MFE VARIANTS OF THE ALIFOLD IMPLEMENTATION #
+##############################################
+*/
+
+/**
+ *  \brief Update the energy parameters for alifold function
+ * 
+ *  Call this to recalculate the pair matrix and energy parameters after a
+ *  change in folding parameters like #temperature
+ */
+void update_alifold_params(void);
+
+
+/**
+ *  \brief Compute MFE and according consensus structure of an alignment of sequences
+ * 
+ *  This function predicts the consensus structure for the aligned 'sequences'
+ *  and returns the minimum free energy; the mfe structure in bracket
+ *  notation is returned in 'structure'.
+ * 
+ *  Sufficient space must be allocated for 'structure' before calling
+ *  alifold().
+ * 
+ *  \ingroup consensus_mfe_fold
+ * 
+ *  \param strings    A pointer to a NULL terminated array of character arrays
+ *  \param structure  A pointer to a character array that may contain a constraining consensus structure
+ *                    (will be overwritten by a consensus structure that exhibits the MFE)
+ *  \return           The free energy score in kcal/mol
+ */
+float  alifold( const char **strings,
+                char *structure);
+
+
+/**
+ *  \brief Compute MFE and according structure of an alignment of sequences assuming the sequences are circular instead of linear
+ * 
+ *  \ingroup consensus_mfe_fold
+ * 
+ *  \param strings    A pointer to a NULL terminated array of character arrays
+ *  \param structure  A pointer to a character array that may contain a constraining consensus structure
+ *                    (will be overwritten by a consensus structure that exhibits the MFE)
+ *  \return           The free energy score in kcal/mol
+ */
+float  circalifold( const char **strings,
+                    char *structure);
+
+/**
+ *  \brief Free the memory occupied by MFE alifold functions
+ * 
+ *  \ingroup consensus_mfe_fold
+ * 
+ */
+void    free_alifold_arrays(void);
+
+/**
+ *  \brief Get the mean pairwise identity in steps from ?to?(ident)
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  \param Alseq
+ *  \param n_seq  The number of sequences in the alignment
+ *  \param length The length of the alignment
+ *  \param mini
+ *  \return       The mean pairwise identity
+ */
+int get_mpi(char *Alseq[],
+            int n_seq,
+            int length,
+            int *mini);
+
+/**
+ *  \brief Read a ribosum or other user-defined scoring matrix
+ * 
+ *  \ingroup consensus_fold
+ * 
+ */
+float   **readribosum(char *name);
+
+/**
+ *  \brief Calculate the free energy of a consensus structure given a set of aligned sequences
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  \param  sequences   The NULL terminated array of sequences
+ *  \param  structure   The consensus structure
+ *  \param  n_seq       The number of sequences in the alignment
+ *  \param  energy      A pointer to an array of at least two floats that will hold the free energies
+ *                      (energy[0] will contain the free energy, energy[1] will be filled with the covariance energy term)
+ *  \returns free energy in kcal/mol
+ * 
+ */
+float   energy_of_alistruct(const char **sequences,
+                            const char *structure,
+                            int n_seq,
+                            float *energy);
+
+float   energy_of_ali_gquad_structure(const char **sequences,
+                                      const char *structure,
+                                      int n_seq,
+                                      float *energy);
+
+/*
+#############################################################
+# some helper functions that might be useful in the library #
+#############################################################
+*/
+
+/**
+ *  \brief Get arrays with encoded sequence of the alignment
+ *
+ *  this function assumes that in S, S5, s3, ss and as enough
+ *  space is already allocated (size must be at least sequence length+2)
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  \param sequence The gapped sequence from the alignment
+ *  \param S        pointer to an array that holds encoded sequence
+ *  \param s5      pointer to an array that holds the next base 5' of alignment position i
+ *  \param s3      pointer to an array that holds the next base 3' of alignment position i
+ *  \param ss
+ *  \param as
+ *  \param circ    assume the molecules to be circular instead of linear (circ=0)
+ */
+void encode_ali_sequence( const char *sequence,
+                          short *S,
+                          short *s5,
+                          short *s3,
+                          char *ss,
+                          unsigned short *as,
+                          int circ);
+
+/**
+ *  \brief Allocate memory for sequence array used to deal with aligned sequences
+ * 
+ *  Note that these arrays will also be initialized according to the sequence alignment given
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  \see free_sequence_arrays()
+ * 
+ *  \param sequences  The aligned sequences
+ *  \param S          A pointer to the array of encoded sequences
+ *  \param S5         A pointer to the array that contains the next 5' nucleotide of a sequence position
+ *  \param S3         A pointer to the array that contains the next 3' nucleotide of a sequence position
+ *  \param a2s        A pointer to the array that contains the alignment to sequence position mapping
+ *  \param Ss         A pointer to the array that contains the ungapped sequence
+ *  \param circ       assume the molecules to be circular instead of linear (circ=0)
+ */
+void  alloc_sequence_arrays(const char **sequences,
+                            short ***S,
+                            short ***S5,
+                            short ***S3,
+                            unsigned short ***a2s,
+                            char ***Ss,
+                            int circ);
+
+/**
+ *  \brief Free the memory of the sequence arrays used to deal with aligned sequences
+ * 
+ *  This function frees the memory previously allocated with alloc_sequence_arrays()
+ * 
+ *  \ingroup consensus_fold
+ * 
+ *  \see alloc_sequence_arrays()
+ * 
+ *  \param n_seq      The number of aligned sequences
+ *  \param S          A pointer to the array of encoded sequences
+ *  \param S5         A pointer to the array that contains the next 5' nucleotide of a sequence position
+ *  \param S3         A pointer to the array that contains the next 3' nucleotide of a sequence position
+ *  \param a2s        A pointer to the array that contains the alignment to sequence position mapping
+ *  \param Ss         A pointer to the array that contains the ungapped sequence
+ */
+void  free_sequence_arrays( unsigned int n_seq,
+                            short ***S,
+                            short ***S5,
+                            short ***S3,
+                            unsigned short ***a2s,
+                            char ***Ss);
+
+/*
+#############################################################
+# PARTITION FUNCTION VARIANTS OF THE ALIFOLD IMPLEMENTATION #
+#############################################################
+*/
+
+
+/**
+ *  \addtogroup consensus_pf_fold
+ *  \ingroup consensus_fold
+ *  @{
+ *
+ *  @}
+ */
+
+/**
+ *  \brief
+ * 
+ *  \ingroup consensus_pf_fold
+ * 
+ *  \param  sequences
+ *  \param  structure
+ *  \param  pl
+ *  \param  parameters
+ *  \param  calculate_bppm
+ *  \param  is_constrained
+ *  \param  is_circular
+ *  \return
+ */
+float alipf_fold_par( const char **sequences,
+                      char *structure,
+                      plist **pl,
+                      pf_paramT *parameters,
+                      int calculate_bppm,
+                      int is_constrained,
+                      int is_circular);
+
+/**
+ *  \brief
+ * 
+ *  The partition function version of alifold() works in analogy to
+ *  pf_fold(). Pair probabilities and information about sequence
+ *  covariations are returned via the 'pi' variable as a list of
+ *  #pair_info structs. The list is terminated by the first entry with
+ *  pi.i = 0.
+ * 
+ *  \ingroup consensus_pf_fold
+ * 
+ *  \param sequences
+ *  \param structure
+ *  \param pl
+ *  \return
+ */
+float alipf_fold( const char **sequences,
+                  char *structure,
+                  plist **pl);
+
+/**
+ *  \brief
+ * 
+ *  \ingroup consensus_pf_fold
+ * 
+ *  \param sequences
+ *  \param structure
+ *  \param pl
+ *  \return
+ */
+float alipf_circ_fold(const char **sequences,
+                      char *structure,
+                      plist **pl);
+
+
+/**
+ *  \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
+ * 
+ *  \ingroup consensus_pf_fold
+ * 
+ *  \see get_iindx()
+ *  \return A pointer to the base pair probability array
+ */
+FLT_OR_DBL *export_ali_bppm(void);
+
+/**
+ *  \brief
+ *
+ *  \ingroup consensus_pf_fold
+ * 
+ */
+void  free_alipf_arrays(void);
+
+/**
+ *  \addtogroup consensus_stochbt
+ *  @{
+ *
+ *  @}
+ */
+
+/**
+ *  \brief Sample a consensus secondary structure from the Boltzmann ensemble according its probability\n
+ * 
+ *  \ingroup consensus_stochbt
+ * 
+ *  \param  prob  to be described (berni)
+ *  \return       A sampled consensus secondary structure in dot-bracket notation
+ */
+char  *alipbacktrack(double *prob);
+
+
+/**
+ *  \brief Get pointers to (almost) all relavant arrays used in alifold's partition function computation
+ *
+ *  \ingroup consensus_fold
+ *
+ *  \note To obtain meaningful pointers, call alipf_fold first!
+ *
+ *  \see pf_alifold(), alipf_circ_fold()
+ *
+ *  \param S_p      A pointer to the 'S' array (integer representation of nucleotides)
+ *  \param S5_p     A pointer to the 'S5' array
+ *  \param S3_p     A pointer to the 'S3' array
+ *  \param a2s_p    A pointer to the pair type matrix
+ *  \param Ss_p     A pointer to the 'Ss' array
+ *  \param qb_p     A pointer to the Q<sup>B</sup> matrix
+ *  \param qm_p     A pointer to the Q<sup>M</sup> matrix
+ *  \param q1k_p    A pointer to the 5' slice of the Q matrix (\f$q1k(k) = Q(1, k)\f$)
+ *  \param qln_p    A pointer to the 3' slice of the Q matrix (\f$qln(l) = Q(l, n)\f$)
+ *  \return         Non Zero if everything went fine, 0 otherwise
+ */
+int get_alipf_arrays(short ***S_p,
+                    short ***S5_p,
+                    short ***S3_p,
+                    unsigned short ***a2s_p,
+                    char ***Ss_p,
+                    FLT_OR_DBL **qb_p,
+                    FLT_OR_DBL **qm_p,
+                    FLT_OR_DBL **q1k_p,
+                    FLT_OR_DBL **qln_p,
+                    short **pscore);
+
+#endif