1 | |
---|
2 | #ifndef MCCAKILL_H |
---|
3 | #define MCCAKILL_H |
---|
4 | |
---|
5 | //#define NDEBUG |
---|
6 | |
---|
7 | #include <string> |
---|
8 | #include <iostream> |
---|
9 | #include "nrutil.h" |
---|
10 | #include <cassert> |
---|
11 | #include "Util.hpp" |
---|
12 | #include "Beta.hpp" |
---|
13 | |
---|
14 | #include "energy_param.hpp" |
---|
15 | //#include "energy_param3.hpp" |
---|
16 | |
---|
17 | #include "ScoreType.hpp" |
---|
18 | |
---|
19 | |
---|
20 | using namespace std; |
---|
21 | using namespace ProbCons; |
---|
22 | |
---|
23 | namespace MXSCARNA { |
---|
24 | class McCaskill { |
---|
25 | char *seq; |
---|
26 | int *numSeq; |
---|
27 | int n_seq; |
---|
28 | static energy_param energyParam; |
---|
29 | |
---|
30 | Trimat<float> a, q1, ab, am, am1, p; |
---|
31 | TriVertMat<float> q1v, abv, amv, am1v, pv; |
---|
32 | Trimat<int> typeMat; |
---|
33 | |
---|
34 | void printExpEnergy(); |
---|
35 | void initParameter(); |
---|
36 | void Inside(); |
---|
37 | void Outside(); |
---|
38 | void convertProbability(); |
---|
39 | |
---|
40 | inline float expHairpinEnergy(const int type, const int l, const int i, const int j); |
---|
41 | inline float expLoopEnergy(int u1, int u2, int type, int type2, |
---|
42 | int si1, int sj1, int sp1, int sq1); |
---|
43 | |
---|
44 | inline float compQb(int i, int j, int tmpType); |
---|
45 | inline float compQm1(int i, int j, int tmpType); |
---|
46 | inline float compQm(int i, int j); |
---|
47 | inline float compQ1(int i, int j, int tmpType); |
---|
48 | inline float compQ(int i, int j); |
---|
49 | inline float compP(int h, int l, int tmpType); |
---|
50 | inline float compPm(int i, int l); |
---|
51 | inline float compPm1(int i, int l); |
---|
52 | inline float beginStemScore(const int i, const int j) const; |
---|
53 | inline float endStemScore(const int i, const int j) const; |
---|
54 | |
---|
55 | static const float GASCONST; |
---|
56 | static const float T; |
---|
57 | static const int MAXLOOP; |
---|
58 | static const int TETRA_ENTH37; |
---|
59 | static const int NBPAIRS; |
---|
60 | static const int SCALE; |
---|
61 | static const int TURN; |
---|
62 | static float *exphairpin; |
---|
63 | static float expninio[5][32]; |
---|
64 | static float expdangle5[6][4]; |
---|
65 | static float expdangle3[6][4]; |
---|
66 | static float expinternalLoop[31]; |
---|
67 | static float expbulge[31]; |
---|
68 | static char exptriLoop[2][6]; |
---|
69 | static float exptriLoopEnergy[2]; |
---|
70 | static char exptetraLoop[30][7]; |
---|
71 | static float exptetraLoopEnergy[30]; |
---|
72 | static float expStack[6][6]; |
---|
73 | static float expTstackH[6][16]; |
---|
74 | static float expTstackI[6][16]; |
---|
75 | static float expint11[6][6][16]; |
---|
76 | static float expint21[6][6][16][4]; |
---|
77 | static float expint22[6][6][16][16]; |
---|
78 | static float expMLclosing; |
---|
79 | static float expMLintern[8]; |
---|
80 | static float expTermAU; |
---|
81 | static float expMLbase[31]; |
---|
82 | |
---|
83 | public: |
---|
84 | |
---|
85 | McCaskill(int n, const char *mySeq) { |
---|
86 | seq = new char[n + 1]; |
---|
87 | numSeq = new int[n + 1]; |
---|
88 | n_seq = 0; |
---|
89 | |
---|
90 | |
---|
91 | for(int i = 0; i < n; i++) { |
---|
92 | if (mySeq[i] == 'a' || mySeq[i] == 'A') { seq[n_seq] = 'A'; numSeq[n_seq] = Beta::A_CODE; n_seq++; } |
---|
93 | else if(mySeq[i] == 't' || mySeq[i] == 'T' || |
---|
94 | mySeq[i] == 'u' || mySeq[i] == 'U') { seq[n_seq] = 'U'; numSeq[n_seq] = Beta::U_CODE; n_seq++; } |
---|
95 | else if(mySeq[i] == 'g' || mySeq[i] == 'G') { seq[n_seq] = 'G'; numSeq[n_seq] = Beta::G_CODE; n_seq++; } |
---|
96 | else if(mySeq[i] == 'c' || mySeq[i] == 'C') { seq[n_seq] = 'C'; numSeq[n_seq] = Beta::C_CODE; n_seq++; } |
---|
97 | else if(mySeq[i] == 'n' || mySeq[i] == 'N') { seq[n_seq] = 'N'; numSeq[n_seq] = Beta::N_CODE; n_seq++; } |
---|
98 | else if(mySeq[i] == '.' || mySeq[i] == '-') { seq[n_seq] = '-'; numSeq[n_seq] = Beta::GAP_CODE; n_seq++; } |
---|
99 | else { seq[n_seq] = mySeq[i]; numSeq[n_seq] = Beta::INVALID_CODE; n_seq++; } |
---|
100 | } |
---|
101 | seq[n_seq] = '\0'; |
---|
102 | a.Allocator(n_seq); |
---|
103 | q1.Allocator(n_seq); |
---|
104 | ab.Allocator(n_seq); |
---|
105 | am.Allocator(n_seq); |
---|
106 | am1.Allocator(n_seq); |
---|
107 | p.Allocator(n_seq); |
---|
108 | q1v.Allocator(n_seq); |
---|
109 | abv.Allocator(n_seq); |
---|
110 | amv.Allocator(n_seq); |
---|
111 | am1v.Allocator(n_seq); |
---|
112 | pv.Allocator(n_seq); |
---|
113 | typeMat.Allocator(n_seq); |
---|
114 | |
---|
115 | if(n_seq > 31) { |
---|
116 | exphairpin = new float[n_seq + 1]; |
---|
117 | } |
---|
118 | else { |
---|
119 | exphairpin = new float[31]; |
---|
120 | } |
---|
121 | |
---|
122 | for(int i = 0; i < n_seq; i++) { |
---|
123 | for(int j = i; j < n_seq; j++) { |
---|
124 | a.ref(i,j) = q1.ref(i,j) = IMPOSSIBLE; |
---|
125 | q1v.ref(i,j) = IMPOSSIBLE; |
---|
126 | } |
---|
127 | } |
---|
128 | |
---|
129 | for(int i = 0; i < n_seq; i++) { |
---|
130 | a.ref(i,i) = 0.0; |
---|
131 | q1.ref(i,i) = IMPOSSIBLE; |
---|
132 | q1v.ref(i,i) = IMPOSSIBLE; |
---|
133 | } |
---|
134 | |
---|
135 | for(int i = 0; i < n_seq-1; i++) { |
---|
136 | a.ref(i,i+1) = 0.0; |
---|
137 | q1.ref(i,i+1) = IMPOSSIBLE; |
---|
138 | q1v.ref(i,i+1) = IMPOSSIBLE; |
---|
139 | } |
---|
140 | |
---|
141 | for(int i = 0; i < n_seq-2; i++) { |
---|
142 | a.ref(i,i+2) = 0.0; |
---|
143 | q1.ref(i,i+2) = IMPOSSIBLE; |
---|
144 | q1v.ref(i,i+2) = IMPOSSIBLE; |
---|
145 | } |
---|
146 | |
---|
147 | for(int i = 0; i < n_seq-3; i++) { |
---|
148 | a.ref(i,i+3) = 0.0; |
---|
149 | q1.ref(i,i+3) = IMPOSSIBLE; |
---|
150 | q1v.ref(i,i+3) = IMPOSSIBLE; |
---|
151 | |
---|
152 | } |
---|
153 | |
---|
154 | for(int i = 0; i < n_seq; i++) { |
---|
155 | for(int j = i; j < n_seq; j++) { |
---|
156 | ab.ref(i,j) = am.ref(i,j) = am1.ref(i,j) = p.ref(i,j) = IMPOSSIBLE; |
---|
157 | abv.ref(i,j) = amv.ref(i,j) = am1v.ref(i,j) = pv.ref(i,j) = IMPOSSIBLE; |
---|
158 | } |
---|
159 | } |
---|
160 | |
---|
161 | /* the type of base pair */ |
---|
162 | /* C <-> G : type 1 */ |
---|
163 | /* G <-> C : type 2 */ |
---|
164 | /* G <-> U : type 3 */ |
---|
165 | /* U <-> G : type 5 */ |
---|
166 | /* A <-> U : type 0 */ |
---|
167 | /* U <-> A : type 4 */ |
---|
168 | /* ? <-> ? : type 6 */ |
---|
169 | for(int i = 0; i < n_seq; i++) { |
---|
170 | for(int j = i; j < n_seq; j++) { |
---|
171 | typeMat.ref(i,j) = Beta::getReducedPairCode(numSeq[i], numSeq[j]); |
---|
172 | } |
---|
173 | } |
---|
174 | |
---|
175 | } |
---|
176 | |
---|
177 | /*------------------------------------------------------------------------*/ |
---|
178 | /* dangling ends should never be destabilizing, i.e. expdangle>=1 */ |
---|
179 | /* specific heat needs smooth function (2nd derivative) */ |
---|
180 | /* we use a*(sin(x+b)+1)^2, with a=2/(3*sqrt(3)), b=Pi/6-sqrt(3)/2, */ |
---|
181 | /* in the interval b<x<sqrt(3)/2 */ |
---|
182 | float SMOOTH(float X) { |
---|
183 | return ((X)/SCALE<-1.2283697)?0:(((X)/SCALE>0.8660254)?(X): |
---|
184 | SCALE*0.38490018*(sin((X)/SCALE-0.34242663)+1)*(sin((X)/SCALE-0.34242663)+1)); |
---|
185 | } |
---|
186 | |
---|
187 | ~McCaskill() { |
---|
188 | delete[] seq; |
---|
189 | delete[] numSeq; |
---|
190 | delete[] exphairpin; |
---|
191 | } |
---|
192 | |
---|
193 | void calcPartitionFunction(); |
---|
194 | void printProbMat(); |
---|
195 | |
---|
196 | inline float getProb(const int i, const int j) const { |
---|
197 | // 0 origin : 0..(n-1) |
---|
198 | return p.ref(i, j); |
---|
199 | } |
---|
200 | }; |
---|
201 | } |
---|
202 | #endif // MCCASKILL_H |
---|