RNAlib-2.3.2
pair_mat.h
1 #ifndef VIENNA_RNA_PACKAGE_PAIR_MAT_H
2 #define VIENNA_RNA_PACKAGE_PAIR_MAT_H
3 
4 #include <ctype.h>
5 #include <ViennaRNA/utils.h>
6 #include <ViennaRNA/fold_vars.h>
7 
8 #define NBASES 8
9 /*@notnull@*/
10 
11 static const char Law_and_Order[] = "_ACGUTXKI";
12 static int BP_pair[NBASES][NBASES]=
13 /* _ A C G U X K I */
14 {{ 0, 0, 0, 0, 0, 0, 0, 0},
15  { 0, 0, 0, 0, 5, 0, 0, 5},
16  { 0, 0, 0, 1, 0, 0, 0, 0},
17  { 0, 0, 2, 0, 3, 0, 0, 0},
18  { 0, 6, 0, 4, 0, 0, 0, 6},
19  { 0, 0, 0, 0, 0, 0, 2, 0},
20  { 0, 0, 0, 0, 0, 1, 0, 0},
21  { 0, 6, 0, 0, 5, 0, 0, 0}};
22 
23 #define MAXALPHA 20 /* maximal length of alphabet */
24 
25 static short alias[MAXALPHA+1];
26 static int pair[MAXALPHA+1][MAXALPHA+1];
27 /* rtype[pair[i][j]]:=pair[j][i] */
28 static int rtype[8] = {0, 2, 1, 4, 3, 6, 5, 7};
29 
30 #ifdef _OPENMP
31 #pragma omp threadprivate(Law_and_Order, BP_pair, alias, pair, rtype)
32 #endif
33 
34 /* for backward compatibility */
35 #define ENCODE(c) encode_char(c)
36 
37 static int encode_char(char c) {
38  /* return numerical representation of base used e.g. in pair[][] */
39  int code;
40  if (energy_set>0) code = (int) (c-'A')+1;
41  else {
42  const char *pos;
43  pos = strchr(Law_and_Order, c);
44  if (pos==NULL) code=0;
45  else code = (int) (pos-Law_and_Order);
46  if (code>5) code = 0;
47  if (code>4) code--; /* make T and U equivalent */
48  }
49  return code;
50 }
51 
52 /*@+boolint +charint@*/
53 /*@null@*/
54 extern char *nonstandards;
55 
56 static void make_pair_matrix(void)
57 {
58  int i,j;
59 
60  if (energy_set==0) {
61  for (i=0; i<5; i++) alias[i] = (short) i;
62  alias[5] = 3; /* X <-> G */
63  alias[6] = 2; /* K <-> C */
64  alias[7] = 0; /* I <-> default base '@' */
65  for (i=0; i<NBASES; i++) {
66  for (j=0; j<NBASES; j++)
67  pair[i][j] = BP_pair[i][j];
68  }
69  if (noGU) pair[3][4] = pair[4][3] =0;
70  if (nonstandards!=NULL) { /* allow nonstandard bp's */
71  for (i=0; i<(int)strlen(nonstandards); i+=2)
72  pair[encode_char(nonstandards[i])]
73  [encode_char(nonstandards[i+1])]=7;
74  }
75  for (i=0; i<NBASES; i++) {
76  for (j=0; j<NBASES; j++)
77  rtype[pair[i][j]] = pair[j][i];
78  }
79  } else {
80  for (i=0; i<=MAXALPHA; i++) {
81  for (j=0; j<=MAXALPHA; j++)
82  pair[i][j] = 0;
83  }
84  if (energy_set==1) {
85  for (i=1; i<MAXALPHA;) {
86  alias[i++] = 3; /* A <-> G */
87  alias[i++] = 2; /* B <-> C */
88  }
89  for (i=1; i<MAXALPHA; i++) {
90  pair[i][i+1] = 2; /* AB <-> GC */
91  i++;
92  pair[i][i-1] = 1; /* BA <-> CG */
93  }
94  }
95  else if (energy_set==2) {
96  for (i=1; i<MAXALPHA;) {
97  alias[i++] = 1; /* A <-> A*/
98  alias[i++] = 4; /* B <-> U */
99  }
100  for (i=1; i<MAXALPHA; i++) {
101  pair[i][i+1] = 5; /* AB <-> AU */
102  i++;
103  pair[i][i-1] = 6; /* BA <-> UA */
104  }
105  }
106  else if (energy_set==3) {
107  for (i=1; i<MAXALPHA-2; ) {
108  alias[i++] = 3; /* A <-> G */
109  alias[i++] = 2; /* B <-> C */
110  alias[i++] = 1; /* C <-> A */
111  alias[i++] = 4; /* D <-> U */
112  }
113  for (i=1; i<MAXALPHA-2; i++) {
114  pair[i][i+1] = 2; /* AB <-> GC */
115  i++;
116  pair[i][i-1] = 1; /* BA <-> CG */
117  i++;
118  pair[i][i+1] = 5; /* CD <-> AU */
119  i++;
120  pair[i][i-1] = 6; /* DC <-> UA */
121  }
122  }
123  else vrna_message_error("What energy_set are YOU using??");
124  for (i=0; i<=MAXALPHA; i++) {
125  for (j=0; j<=MAXALPHA; j++)
126  rtype[pair[i][j]] = pair[j][i];
127  }
128  }
129 }
130 
131 static short *encode_sequence(const char *sequence, short how){
132  unsigned int i,l = (unsigned int)strlen(sequence);
133  short *S = (short *) vrna_alloc(sizeof(short)*(l+2));
134 
135  switch(how){
136  /* standard encoding as always used for S */
137  case 0: for(i=1; i<=l; i++) /* make numerical encoding of sequence */
138  S[i]= (short) encode_char(toupper(sequence[i-1]));
139  S[l+1] = S[1];
140  S[0] = (short) l;
141  break;
142  /* encoding for mismatches of nostandard bases (normally used for S1) */
143  case 1: for(i=1; i<=l; i++)
144  S[i] = alias[(short) encode_char(toupper(sequence[i-1]))];
145  S[l+1] = S[1];
146  S[0] = S[l];
147  break;
148  }
149 
150  return S;
151 }
152 
153 #endif /* VIENNA_RNA_PACKAGE_PAIR_MAT_H */
void * vrna_alloc(unsigned size)
Allocate space safely.
int energy_set
0 = BP; 1=any with GC; 2=any with AU-parameter
void vrna_message_error(const char *format,...)
Print an error message and die.
int noGU
Global switch to forbid/allow GU base pairs at all.
char * nonstandards
contains allowed non standard base pairs
General utility- and helper-functions used throughout the ViennaRNA Package.
#define MAXALPHA
Maximal length of alphabet.
Definition: model.h:177
Here all all declarations of the global variables used throughout RNAlib.