Katzlab dd76ab1d12 Added PTL2 Scripts
These are PTL2 files from Auden 2/9
2023-02-14 11:20:52 -05:00

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;
}