WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / H / data_structures.h
diff --git a/binaries/src/ViennaRNA/H/data_structures.h b/binaries/src/ViennaRNA/H/data_structures.h
new file mode 100644 (file)
index 0000000..02dad6b
--- /dev/null
@@ -0,0 +1,774 @@
+#ifndef __VIENNA_RNA_PACKAGE_DATA_STRUCTURES_H__
+#define __VIENNA_RNA_PACKAGE_DATA_STRUCTURES_H__
+
+#include "energy_const.h"
+/**
+ *  \file data_structures.h
+ *  \brief All datastructures and typedefs shared among the Vienna RNA Package can be found here
+ */
+
+/* to use floats instead of doubles in pf_fold() comment next line */
+#define LARGE_PF
+#ifdef  LARGE_PF
+#define FLT_OR_DBL double
+#else
+#define FLT_OR_DBL float
+#endif
+
+#ifndef NBASES
+#define NBASES 8
+#endif
+
+#ifndef MAXALPHA
+/**
+ *  \brief Maximal length of alphabet
+ */
+#define MAXALPHA              20
+#endif
+
+/**
+ *  \brief Maximum density of states discretization for subopt
+ */
+#define MAXDOS                1000
+
+#define   VRNA_GQUAD_MAX_STACK_SIZE     7
+#define   VRNA_GQUAD_MIN_STACK_SIZE     2
+#define   VRNA_GQUAD_MAX_LINKER_LENGTH  15
+#define   VRNA_GQUAD_MIN_LINKER_LENGTH  1
+#define   VRNA_GQUAD_MIN_BOX_SIZE       ((4*VRNA_GQUAD_MIN_STACK_SIZE)+(3*VRNA_GQUAD_MIN_LINKER_LENGTH))
+#define   VRNA_GQUAD_MAX_BOX_SIZE       ((4*VRNA_GQUAD_MAX_STACK_SIZE)+(3*VRNA_GQUAD_MAX_LINKER_LENGTH))
+
+
+/*
+* ############################################################
+* Here are the type definitions of various datastructures
+* shared among the Vienna RNA Package
+* ############################################################
+*/
+
+/**
+ *  \brief this datastructure is used as input parameter in functions of PS_dot.h and others
+ */
+typedef struct plist {
+  int i;
+  int j;
+  float p;
+  int type;
+} plist;
+
+/**
+ *  \brief this datastructure is used as input parameter in functions of PS_dot.c
+ */
+typedef struct cpair {
+  int i,j,mfe;
+  float p, hue, sat;
+} cpair;
+
+/**
+ *  \brief this is a workarround for the SWIG Perl Wrapper RNA plot function
+ *  that returns an array of type COORDINATE
+ */
+typedef struct {
+  float X; /* X coords */
+  float Y; /* Y coords */
+} COORDINATE;
+
+/**
+ *  \brief  Stack of partial structures for backtracking
+ */
+typedef struct sect {
+  int  i;
+  int  j;
+  int ml;
+} sect;
+
+/**
+ *  \brief  Base pair
+ */
+typedef struct bondT {
+   unsigned int i;
+   unsigned int j;
+} bondT;
+
+/**
+ *  \brief  Base pair with associated energy
+ */
+typedef struct bondTEn {
+   int i;
+   int j;
+   int energy;
+} bondTEn;
+
+/**
+ *  \brief The data structure that contains the complete model details used throughout the calculations
+ *
+ */
+typedef struct{
+  int     dangles;      /**<  \brief  Specifies the dangle model used in any energy evaluation (0,1,2 or 3)
+                              \note   Some function do not implement all dangle model but only a subset of
+                                      (0,1,2,3). Read the documentaion of the particular recurrences or
+                                      energy evaluation function for information about the provided dangle
+                                      model.
+                        */
+  int     special_hp;   /**<  \brief  Include special hairpin contributions for tri, tetra and hexaloops */
+  int     noLP;         /**<  \brief  Only consider canonical structures, i.e. no 'lonely' base pairs */
+  int     noGU;         /**<  \brief  Do not allow GU pairs */
+  int     noGUclosure;  /**<  \brief  Do not allow loops to be closed by GU pair */
+  int     logML;        /**<  \brief  Use logarithmic scaling for multi loops */
+  int     circ;         /**<  \brief  Assume molecule to be circular */
+  int     gquad;        /**<  \brief  Include G-quadruplexes in structure prediction */
+} model_detailsT;
+
+/**
+ *  \brief The datastructure that contains temperature scaled energy parameters.
+ */
+typedef struct{
+  int id;
+  int stack[NBPAIRS+1][NBPAIRS+1];
+  int hairpin[31];
+  int bulge[MAXLOOP+1];
+  int internal_loop[MAXLOOP+1];
+  int mismatchExt[NBPAIRS+1][5][5];
+  int mismatchI[NBPAIRS+1][5][5];
+  int mismatch1nI[NBPAIRS+1][5][5];
+  int mismatch23I[NBPAIRS+1][5][5];
+  int mismatchH[NBPAIRS+1][5][5];
+  int mismatchM[NBPAIRS+1][5][5];
+  int dangle5[NBPAIRS+1][5];
+  int dangle3[NBPAIRS+1][5];
+  int int11[NBPAIRS+1][NBPAIRS+1][5][5];
+  int int21[NBPAIRS+1][NBPAIRS+1][5][5][5];
+  int int22[NBPAIRS+1][NBPAIRS+1][5][5][5][5];
+  int ninio[5];
+  double  lxc;
+  int     MLbase;
+  int     MLintern[NBPAIRS+1];
+  int     MLclosing;
+  int     TerminalAU;
+  int     DuplexInit;
+  int     Tetraloop_E[200];
+  char    Tetraloops[1401];
+  int     Triloop_E[40];
+  char    Triloops[241];
+  int     Hexaloop_E[40];
+  char    Hexaloops[1801];
+  int     TripleC;
+  int     MultipleCA;
+  int     MultipleCB;
+  int     gquad [VRNA_GQUAD_MAX_STACK_SIZE + 1]
+                [3*VRNA_GQUAD_MAX_LINKER_LENGTH + 1];
+
+  double  temperature;            /**<  \brief  Temperature used for loop contribution scaling */
+
+  model_detailsT model_details;   /**<  \brief  Model details to be used in the recursions */
+
+}  paramT;
+
+/**
+ *  \brief  The datastructure that contains temperature scaled Boltzmann weights of the energy parameters.
+ */
+typedef struct{
+  int     id;
+  double  expstack[NBPAIRS+1][NBPAIRS+1];
+  double  exphairpin[31];
+  double  expbulge[MAXLOOP+1];
+  double  expinternal[MAXLOOP+1];
+  double  expmismatchExt[NBPAIRS+1][5][5];
+  double  expmismatchI[NBPAIRS+1][5][5];
+  double  expmismatch23I[NBPAIRS+1][5][5];
+  double  expmismatch1nI[NBPAIRS+1][5][5];
+  double  expmismatchH[NBPAIRS+1][5][5];
+  double  expmismatchM[NBPAIRS+1][5][5];
+  double  expdangle5[NBPAIRS+1][5];
+  double  expdangle3[NBPAIRS+1][5];
+  double  expint11[NBPAIRS+1][NBPAIRS+1][5][5];
+  double  expint21[NBPAIRS+1][NBPAIRS+1][5][5][5];
+  double  expint22[NBPAIRS+1][NBPAIRS+1][5][5][5][5];
+  double  expninio[5][MAXLOOP+1];
+  double  lxc;
+  double  expMLbase;
+  double  expMLintern[NBPAIRS+1];
+  double  expMLclosing;
+  double  expTermAU;
+  double  expDuplexInit;
+  double  exptetra[40];
+  double  exptri[40];
+  double  exphex[40];
+  char    Tetraloops[1401];
+  double  expTriloop[40];
+  char    Triloops[241];
+  char    Hexaloops[1801];
+  double  expTripleC;
+  double  expMultipleCA;
+  double  expMultipleCB;
+  double  expgquad[VRNA_GQUAD_MAX_STACK_SIZE + 1]
+                  [3*VRNA_GQUAD_MAX_LINKER_LENGTH + 1];
+
+  double  kT;
+  double  pf_scale;     /**<  \brief    Scaling factor to avoid over-/underflows */
+
+  double  temperature;  /**<  \brief    Temperature used for loop contribution scaling */
+  double  alpha;        /**<  \brief    Scaling factor for the thermodynamic temperature
+                              \details  This allows for temperature scaling in Boltzmann
+                                        factors independently from the energy contributions.
+                                        The resulting Boltzmann factors are then computed by
+                                        \f$ e^{-E/(\alpha \cdot K \cdot T)} \f$
+                        */
+
+  model_detailsT model_details; /**<  \brief  Model details to be used in the recursions */
+
+}  pf_paramT;
+
+
+
+/*
+* ############################################################
+* SUBOPT data structures
+* ############################################################
+*/
+
+
+/**
+ *  \brief  Base pair data structure used in subopt.c
+ */
+typedef struct {
+  int i;
+  int j;
+} PAIR;
+
+/**
+ *  \brief  Sequence interval stack element used in subopt.c
+ */
+typedef struct {
+    int i;
+    int j;
+    int array_flag;
+} INTERVAL;
+
+/**
+ *  \brief  Solution element from subopt.c
+ */
+typedef struct {
+  float energy;       /**< \brief Free Energy of structure in kcal/mol */
+  char *structure;    /**< \brief Structure in dot-bracket notation */
+} SOLUTION;
+
+/*
+* ############################################################
+* COFOLD data structures
+* ############################################################
+*/
+
+/**
+ *  \brief  
+ */
+typedef struct cofoldF {
+  /* free energies for: */
+  double F0AB;  /**< \brief Null model without DuplexInit */
+  double FAB;   /**< \brief all states with DuplexInit correction */
+  double FcAB;  /**< \brief true hybrid states only */
+  double FA;    /**< \brief monomer A */
+  double FB;    /**< \brief monomer B */
+} cofoldF;
+
+/**
+ *  \brief  
+ */
+typedef struct ConcEnt {
+  double A0;    /**< \brief start concentration A */
+  double B0;    /**< \brief start concentration B */
+  double ABc;   /**< \brief End concentration AB */
+  double AAc;
+  double BBc;
+  double Ac;
+  double Bc;
+} ConcEnt;
+
+/**
+ *  \brief  
+ */
+typedef struct pairpro{
+  struct plist *AB;
+  struct plist *AA;
+  struct plist *A;
+  struct plist *B;
+  struct plist *BB;
+}pairpro;
+
+/**
+ *  \brief A base pair info structure
+ *
+ *  For each base pair (i,j) with i,j in [0, n-1] the structure lists:
+ *  - its probability 'p'
+ *  - an entropy-like measure for its well-definedness 'ent'
+ *  - the frequency of each type of pair in 'bp[]'
+ *    + 'bp[0]' contains the number of non-compatible sequences
+ *    + 'bp[1]' the number of CG pairs, etc.
+ */
+typedef struct {
+   unsigned i;    /**<  \brief  nucleotide position i */ 
+   unsigned j;    /**<  \brief  nucleotide position j */
+   float p;       /**< \brief  Probability */
+   float ent;     /**< \brief  Pseudo entropy for \f$ p(i,j) = S_i + S_j - p_ij*ln(p_ij) \f$ */
+   short bp[8];   /**< \brief  Frequencies of pair_types */
+   char comp;     /**< \brief  1 iff pair is in mfe structure */
+} pair_info;
+
+
+/*
+* ############################################################
+* FINDPATH data structures
+* ############################################################
+*/
+
+/**
+ *  \brief  
+ */
+typedef struct move {
+  int i;  /* i,j>0 insert; i,j<0 delete */
+  int j;
+  int when;  /* 0 if still available, else resulting distance from start */
+  int E;
+} move_t;
+
+/**
+ *  \brief  
+ */
+typedef struct intermediate {
+  short *pt;      /**<  \brief  pair table */
+  int Sen;        /**<  \brief  saddle energy so far */
+  int curr_en;    /**<  \brief  current energy */
+  move_t *moves;  /**<  \brief  remaining moves to target */
+} intermediate_t;
+
+/**
+ *  \brief  
+ */
+typedef struct path {
+  double en;
+  char *s;
+} path_t;
+
+/*
+* ############################################################
+* RNAup data structures
+* ############################################################
+*/
+
+/**
+ *  \brief contributions to p_u
+ */
+typedef struct pu_contrib {
+  double **H; /**<  \brief  hairpin loops */
+  double **I; /**<  \brief  interior loops */
+  double **M; /**<  \brief  multi loops */
+  double **E; /**<  \brief  exterior loop */
+  int length; /**<  \brief  length of the input sequence */
+  int w;      /**<  \brief  longest unpaired region */
+} pu_contrib;
+
+/**
+ *  \brief  
+ */
+typedef struct interact {
+  double *Pi;       /**<  \brief  probabilities of interaction */
+  double *Gi;       /**<  \brief  free energies of interaction */
+  double Gikjl;     /**<  \brief  full free energy for interaction between [k,i] k<i
+                                  in longer seq and [j,l] j<l in shorter seq */
+  double Gikjl_wo;  /**<  \brief  Gikjl without contributions for prob_unpaired */
+  int i;            /**<  \brief  k<i in longer seq */
+  int k;            /**<  \brief  k<i in longer seq */
+  int j;            /**<  \brief  j<l in shorter seq */
+  int l;            /**<  \brief  j<l in shorter seq */
+  int length;       /**<  \brief  length of longer sequence */
+} interact;
+
+/**
+ *  \brief  Collection of all free_energy of beeing unpaired values for output
+ */
+typedef struct pu_out {
+  int len;            /**<  \brief  sequence length */
+  int u_vals;         /**<  \brief  number of different -u values */
+  int contribs;       /**<  \brief  [-c "SHIME"] */
+  char **header;      /**<  \brief  header line */
+  double **u_values;  /**<  \brief  (the -u values * [-c "SHIME"]) * seq len */
+} pu_out;
+
+/**
+ *  \brief  constraints for cofolding 
+ */
+typedef struct constrain{
+  int *indx;
+  char *ptype;
+} constrain;
+
+/*
+* ############################################################
+* RNAduplex data structures
+* ############################################################
+*/
+
+/**
+ *  \brief  
+ */
+typedef struct {
+  int i;
+  int j;
+  int end;
+  char *structure;
+  double energy;
+  double energy_backtrack;
+  double opening_backtrack_x;
+  double opening_backtrack_y;
+  int offset;
+  double dG1;
+  double dG2;
+  double ddG;
+  int tb;
+  int te;
+  int qb;
+  int qe;
+} duplexT;
+
+/*
+* ############################################################
+* RNAsnoop data structures
+* ############################################################
+*/
+
+/**
+ *  \brief  
+ */
+typedef struct node {
+  int k;
+  int energy;
+  struct node *next;
+} folden;
+
+/**
+ *  \brief  
+ */
+typedef struct {
+  int i;
+  int j;
+  int u;
+  char *structure;
+  float energy;
+  float Duplex_El;
+  float Duplex_Er;
+  float Loop_E;
+  float Loop_D;
+  float pscd;
+  float psct;
+  float pscg;
+  float Duplex_Ol;
+  float Duplex_Or;
+  float Duplex_Ot;
+  float fullStemEnergy;
+} snoopT;
+
+
+
+
+
+
+
+/*
+* ############################################################
+* PKplex data structures
+* ############################################################
+*/
+
+/**
+ *  \brief  
+ */
+typedef struct dupVar{
+  int i;
+  int j;
+  int end;
+  char *pk_helix;
+  char *structure;
+  double energy;
+  int offset;
+  double dG1;
+  double dG2;
+  double ddG;
+  int tb;
+  int te;
+  int qb;
+  int qe;
+  int inactive;
+  int processed;
+} dupVar;
+
+
+
+/*
+* ############################################################
+* 2Dfold data structures
+* ############################################################
+*/
+
+/**
+ *  \brief Solution element returned from TwoDfoldList
+ *
+ *  This element contains free energy and structure for the appropriate
+ *  kappa (k), lambda (l) neighborhood
+ *  The datastructure contains two integer attributes 'k' and 'l'
+ *  as well as an attribute 'en' of type float representing the free energy
+ *  in kcal/mol and an attribute 's' of type char* containg the secondary
+ *  structure representative,
+ *
+ *  A value of #INF in k denotes the end of a list
+ *
+ *  \see  TwoDfoldList()
+ */
+typedef struct{
+  int k;          /**<  \brief  Distance to first reference */
+  int l;          /**<  \brief  Distance to second reference */
+  float en;       /**<  \brief  Free energy in kcal/mol */
+  char *s;        /**<  \brief  MFE representative structure in dot-bracket notation */
+} TwoDfold_solution;
+
+/**
+ *  \brief Variables compound for 2Dfold MFE folding
+ *
+ *  \see get_TwoDfold_variables(), destroy_TwoDfold_variables(), TwoDfoldList()
+ */
+typedef struct{
+  paramT          *P;             /**<  \brief  Precomputed energy parameters and model details */
+  int             do_backtrack;   /**<  \brief  Flag whether to do backtracing of the structure(s) or not */
+  char            *ptype;         /**<  \brief  Precomputed array of pair types */
+  char            *sequence;      /**<  \brief  The input sequence  */
+  short           *S, *S1;        /**<  \brief  The input sequences in numeric form */
+  unsigned int    maxD1;          /**<  \brief  Maximum allowed base pair distance to first reference */
+  unsigned int    maxD2;          /**<  \brief  Maximum allowed base pair distance to second reference */
+
+
+  unsigned int    *mm1;           /**<  \brief  Maximum matching matrix, reference struct 1 disallowed */
+  unsigned int    *mm2;           /**<  \brief  Maximum matching matrix, reference struct 2 disallowed */
+
+  int             *my_iindx;      /**<  \brief  Index for moving in quadratic distancy dimensions */
+
+  double          temperature;
+
+  unsigned int    *referenceBPs1; /**<  \brief  Matrix containing number of basepairs of reference structure1 in interval [i,j] */
+  unsigned int    *referenceBPs2; /**<  \brief  Matrix containing number of basepairs of reference structure2 in interval [i,j] */
+  unsigned int    *bpdist;        /**<  \brief  Matrix containing base pair distance of reference structure 1 and 2 on interval [i,j] */
+
+  short           *reference_pt1;
+  short           *reference_pt2;
+  int             circ;
+  int             dangles;
+  unsigned int    seq_length;
+
+  int             ***E_F5;
+  int             ***E_F3;
+  int             ***E_C;
+  int             ***E_M;
+  int             ***E_M1;
+  int             ***E_M2;
+
+  int             **E_Fc;
+  int             **E_FcH;
+  int             **E_FcI;
+  int             **E_FcM;
+
+  int             **l_min_values;
+  int             **l_max_values;
+  int             *k_min_values;
+  int             *k_max_values;
+
+  int             **l_min_values_m;
+  int             **l_max_values_m;
+  int             *k_min_values_m;
+  int             *k_max_values_m;
+
+  int             **l_min_values_m1;
+  int             **l_max_values_m1;
+  int             *k_min_values_m1;
+  int             *k_max_values_m1;
+
+  int             **l_min_values_f;
+  int             **l_max_values_f;
+  int             *k_min_values_f;
+  int             *k_max_values_f;
+
+  int             **l_min_values_f3;
+  int             **l_max_values_f3;
+  int             *k_min_values_f3;
+  int             *k_max_values_f3;
+
+  int             **l_min_values_m2;
+  int             **l_max_values_m2;
+  int             *k_min_values_m2;
+  int             *k_max_values_m2;
+
+  int             *l_min_values_fc;
+  int             *l_max_values_fc;
+  int             k_min_values_fc;
+  int             k_max_values_fc;
+
+  int             *l_min_values_fcH;
+  int             *l_max_values_fcH;
+  int             k_min_values_fcH;
+  int             k_max_values_fcH;
+
+  int             *l_min_values_fcI;
+  int             *l_max_values_fcI;
+  int             k_min_values_fcI;
+  int             k_max_values_fcI;
+
+  int             *l_min_values_fcM;
+  int             *l_max_values_fcM;
+  int             k_min_values_fcM;
+  int             k_max_values_fcM;
+
+  /* auxilary arrays for remaining set of coarse graining (k,l) > (k_max, l_max) */
+  int             *E_F5_rem;
+  int             *E_F3_rem;
+  int             *E_C_rem;
+  int             *E_M_rem;
+  int             *E_M1_rem;
+  int             *E_M2_rem;
+
+  int             E_Fc_rem;
+  int             E_FcH_rem;
+  int             E_FcI_rem;
+  int             E_FcM_rem;
+
+#ifdef COUNT_STATES
+  unsigned long             ***N_F5;
+  unsigned long             ***N_C;
+  unsigned long             ***N_M;
+  unsigned long             ***N_M1;
+#endif
+} TwoDfold_vars;
+
+/**
+ *  \brief Solution element returned from TwoDpfoldList
+ *
+ *  This element contains the partition function for the appropriate
+ *  kappa (k), lambda (l) neighborhood
+ *  The datastructure contains two integer attributes 'k' and 'l'
+ *  as well as an attribute 'q' of type #FLT_OR_DBL
+ *
+ *  A value of #INF in k denotes the end of a list
+ *
+ *  \see  TwoDpfoldList()
+ */
+typedef struct{
+  int k;          /**<  \brief  Distance to first reference */
+  int l;          /**<  \brief  Distance to second reference */
+  FLT_OR_DBL  q;  /**<  \brief  partition function */
+} TwoDpfold_solution;
+
+/**
+ *  \brief  Variables compound for 2Dfold partition function folding
+ *
+ *  \see    get_TwoDpfold_variables(), get_TwoDpfold_variables_from_MFE(),
+ *          destroy_TwoDpfold_variables(), TwoDpfoldList()
+ */
+typedef struct{
+
+  unsigned int    alloc;
+  char            *ptype;         /**<  \brief  Precomputed array of pair types */
+  char            *sequence;      /**<  \brief  The input sequence  */
+  short           *S, *S1;        /**<  \brief  The input sequences in numeric form */
+  unsigned int    maxD1;          /**<  \brief  Maximum allowed base pair distance to first reference */
+  unsigned int    maxD2;          /**<  \brief  Maximum allowed base pair distance to second reference */
+
+  double          temperature;    /* temperature in last call to scale_pf_params */
+  double          init_temp;      /* temperature in last call to scale_pf_params */
+  FLT_OR_DBL      *scale;
+  FLT_OR_DBL      pf_scale;
+  pf_paramT       *pf_params;     /* holds all [unscaled] pf parameters */
+
+  int             *my_iindx;      /**<  \brief  Index for moving in quadratic distancy dimensions */
+  int             *jindx;         /**<  \brief  Index for moving in the triangular matrix qm1 */
+
+  short           *reference_pt1;
+  short           *reference_pt2;
+
+  unsigned int    *referenceBPs1; /**<  \brief  Matrix containing number of basepairs of reference structure1 in interval [i,j] */
+  unsigned int    *referenceBPs2; /**<  \brief  Matrix containing number of basepairs of reference structure2 in interval [i,j] */
+  unsigned int    *bpdist;        /**<  \brief  Matrix containing base pair distance of reference structure 1 and 2 on interval [i,j] */
+
+  unsigned int    *mm1;           /**<  \brief  Maximum matching matrix, reference struct 1 disallowed */
+  unsigned int    *mm2;           /**<  \brief  Maximum matching matrix, reference struct 2 disallowed */
+
+  int             circ;
+  int             dangles;
+  unsigned int    seq_length;
+
+  FLT_OR_DBL      ***Q;
+  FLT_OR_DBL      ***Q_B;
+  FLT_OR_DBL      ***Q_M;
+  FLT_OR_DBL      ***Q_M1;
+  FLT_OR_DBL      ***Q_M2;
+
+  FLT_OR_DBL      **Q_c;
+  FLT_OR_DBL      **Q_cH;
+  FLT_OR_DBL      **Q_cI;
+  FLT_OR_DBL      **Q_cM;
+
+  int             **l_min_values;
+  int             **l_max_values;
+  int             *k_min_values;
+  int             *k_max_values;
+
+  int             **l_min_values_b;
+  int             **l_max_values_b;
+  int             *k_min_values_b;
+  int             *k_max_values_b;
+
+  int             **l_min_values_m;
+  int             **l_max_values_m;
+  int             *k_min_values_m;
+  int             *k_max_values_m;
+
+  int             **l_min_values_m1;
+  int             **l_max_values_m1;
+  int             *k_min_values_m1;
+  int             *k_max_values_m1;
+
+  int             **l_min_values_m2;
+  int             **l_max_values_m2;
+  int             *k_min_values_m2;
+  int             *k_max_values_m2;
+
+  int             *l_min_values_qc;
+  int             *l_max_values_qc;
+  int             k_min_values_qc;
+  int             k_max_values_qc;
+
+  int             *l_min_values_qcH;
+  int             *l_max_values_qcH;
+  int             k_min_values_qcH;
+  int             k_max_values_qcH;
+
+  int             *l_min_values_qcI;
+  int             *l_max_values_qcI;
+  int             k_min_values_qcI;
+  int             k_max_values_qcI;
+
+  int             *l_min_values_qcM;
+  int             *l_max_values_qcM;
+  int             k_min_values_qcM;
+  int             k_max_values_qcM;
+
+  /* auxilary arrays for remaining set of coarse graining (k,l) > (k_max, l_max) */
+  FLT_OR_DBL      *Q_rem;
+  FLT_OR_DBL      *Q_B_rem;
+  FLT_OR_DBL      *Q_M_rem;
+  FLT_OR_DBL      *Q_M1_rem;
+  FLT_OR_DBL      *Q_M2_rem;
+
+  FLT_OR_DBL      Q_c_rem;
+  FLT_OR_DBL      Q_cH_rem;
+  FLT_OR_DBL      Q_cI_rem;
+  FLT_OR_DBL      Q_cM_rem;
+
+} TwoDpfold_vars;
+
+#endif