mirror of
http://43.156.76.180:8026/YuuMJ/EukPhylo.git
synced 2025-12-28 07:10:24 +08:00
211 lines
5.2 KiB
C++
211 lines
5.2 KiB
C++
#include "gtrModel.h"
|
|
#include "readDatMatrix.h" // for the normalizeQ function.
|
|
#include "matrixUtils.h"
|
|
|
|
gtrModel::gtrModel(const Vdouble& freq,
|
|
const MDOUBLE a2c,
|
|
const MDOUBLE a2g,
|
|
const MDOUBLE a2t,
|
|
const MDOUBLE c2g,
|
|
const MDOUBLE c2t,
|
|
const MDOUBLE g2t)
|
|
:_a2c(a2c),_a2g(a2g),_a2t(a2t),_c2g(c2g),_c2t(c2t),_g2t(g2t),_freq(freq)
|
|
{
|
|
_Q.resize(alphabetSize());
|
|
for (int z=0; z < _Q.size();++z) _Q[z].resize(alphabetSize(),0.0);
|
|
updateQ(a2c,a2g,a2t,c2g,c2t,g2t);
|
|
}
|
|
|
|
|
|
gtrModel& gtrModel::operator=(const gtrModel &other)
|
|
{
|
|
_Q = other._Q;
|
|
_freq = other._freq;
|
|
_q2pt = other._q2pt;
|
|
_a2c = other._a2c;
|
|
_a2g = other._a2g;
|
|
_a2t = other._a2t;
|
|
_c2g = other._c2g;
|
|
_c2t = other._c2t;
|
|
_g2t = other._g2t;
|
|
return *this;
|
|
}
|
|
|
|
gtrModel::gtrModel(const gtrModel &other)
|
|
{
|
|
_Q = other._Q;
|
|
_freq = other._freq;
|
|
_q2pt = other._q2pt;
|
|
_a2c = other._a2c;
|
|
_a2g = other._a2g;
|
|
_a2t = other._a2t;
|
|
_c2g = other._c2g;
|
|
_c2t = other._c2t;
|
|
_g2t = other._g2t;
|
|
}
|
|
|
|
void gtrModel::norm(const MDOUBLE scale)
|
|
{
|
|
for (int i=0; i < _Q.size(); ++i) {
|
|
for (int j=0; j < _Q.size(); ++j) {
|
|
_Q[i][j] *= scale;
|
|
}
|
|
}
|
|
}
|
|
|
|
MDOUBLE gtrModel::sumPijQij(){
|
|
MDOUBLE sum=0.0;
|
|
for (int i=0; i < _Q.size(); ++i) {
|
|
sum -= (_Q[i][i])*_freq[i];
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
void gtrModel::updateQ(const MDOUBLE a2c,const MDOUBLE a2g,const MDOUBLE a2t,const MDOUBLE c2g,const MDOUBLE c2t,const MDOUBLE g2t)
|
|
{
|
|
_a2c = a2c;
|
|
_Q[a][c] = (_a2c);
|
|
_Q[c][a] = (_freq[a]*_a2c/_freq[c]);
|
|
_a2g = a2g;
|
|
_Q[a][g] = (_a2g);
|
|
_Q[g][a] = (_freq[a]*_a2g/_freq[g]);
|
|
_a2t = a2t;
|
|
_Q[a][t] = (_a2t);
|
|
_Q[t][a] = (_freq[a]*_a2t/_freq[t]);
|
|
_c2g = c2g;
|
|
_Q[c][g] = (_c2g);
|
|
_Q[g][c] = (_freq[c]*_c2g/_freq[g]);
|
|
_c2t = c2t;
|
|
_Q[c][t] = (_c2t);
|
|
_Q[t][c] = (_freq[c]*_c2t/_freq[t]);
|
|
_g2t = g2t;
|
|
_Q[g][t] = (_g2t);
|
|
_Q[t][g] = (_freq[g]*_g2t/_freq[t]);
|
|
_Q[a][a] = -1.0*(_Q[a][c]+_Q[a][g]+_Q[a][t]);
|
|
_Q[c][c] = -1.0*(_Q[c][a]+_Q[c][g]+_Q[c][t]);
|
|
_Q[g][g] = -1.0*(_Q[g][a]+_Q[g][c]+_Q[g][t]);
|
|
_Q[t][t] = -1.0*(_Q[t][a]+_Q[t][c]+_Q[t][g]);
|
|
norm(1.0/sumPijQij());
|
|
_q2pt.fillFromRateMatrix(_freq,_Q);
|
|
}
|
|
|
|
void gtrModel::set_a2c(const MDOUBLE a2c)
|
|
{
|
|
_a2c = a2c;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
void gtrModel::set_a2g(const MDOUBLE a2g)
|
|
{
|
|
_a2g = a2g;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
void gtrModel::set_a2t(const MDOUBLE a2t)
|
|
{
|
|
_a2t = a2t;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
void gtrModel::set_c2g(const MDOUBLE c2g)
|
|
{
|
|
_c2g = c2g;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
void gtrModel::set_c2t(const MDOUBLE c2t)
|
|
{
|
|
_c2t = c2t;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
void gtrModel::set_g2t(const MDOUBLE g2t)
|
|
{
|
|
_g2t = g2t;
|
|
updateQ(_a2c,_a2g,_a2t,_c2g,_c2t,_g2t);
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_a2c() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_a2c");
|
|
else{
|
|
if((_Q[a].size() < alphabetSize())||(_Q[c].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_a2c");
|
|
else
|
|
result = _a2c;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_a2g() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_a2g");
|
|
else{
|
|
if((_Q[a].size() < alphabetSize())||(_Q[g].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_a2g");
|
|
else
|
|
result = _a2g;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_a2t() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_a2t");
|
|
else{
|
|
if((_Q[a].size() < alphabetSize())||(_Q[t].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_a2t");
|
|
else
|
|
result = _a2t;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_c2g() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_c2g");
|
|
else{
|
|
if((_Q[c].size() < alphabetSize())||(_Q[g].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_c2g");
|
|
else
|
|
result = _c2g;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_c2t() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_c2t");
|
|
else{
|
|
if((_Q[c].size() < alphabetSize())||(_Q[t].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_c2t");
|
|
else
|
|
result = _c2t;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MDOUBLE gtrModel::get_g2t() const
|
|
{
|
|
MDOUBLE result;
|
|
if(_Q.size() < alphabetSize())
|
|
errorMsg::reportError("Attempting to reach an uninitiallized Q matrix in gtrModel::get_g2t");
|
|
else{
|
|
if((_Q[g].size() < alphabetSize())||(_Q[t].size() < alphabetSize()))
|
|
errorMsg::reportError("Attempting to reach an uninitiallzed Q matrix element in Model::get_g2t");
|
|
else
|
|
result = _g2t;
|
|
}
|
|
return result;
|
|
}
|