source: trunk/GDE/MAFFT/mafft-7.055-with-extensions/extensions/mxscarna_src/McCaskill.hpp

Last change on this file was 10371, checked in by aboeckma, 11 years ago

updated mafft version. Added extensions (no svn ignore, yet)

File size: 5.7 KB
Line 
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
20using namespace std;
21using namespace ProbCons;
22
23namespace MXSCARNA {
24class 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
Note: See TracBrowser for help on using the repository browser.