mirror of
http://43.156.76.180:8026/YuuMJ/EukPhylo.git
synced 2025-12-28 06:50:25 +08:00
97 lines
2.4 KiB
C++
97 lines
2.4 KiB
C++
#include "wYangModel.h"
|
|
#include "codon.h"
|
|
#include "readDatMatrix.h" // for the normalizeQ function.
|
|
|
|
wYangModel::wYangModel(const MDOUBLE inW, const MDOUBLE inK,bool globalW, codon * coAlph):
|
|
_w(inW),_k(inK),_globalW(globalW),_coAlpha(NULL){
|
|
_coAlpha = (codon*)(coAlph->clone());
|
|
codonUtility::initSubMatrices(*_coAlpha);
|
|
homogenousFreq();
|
|
_Q.resize(alphabetSize());
|
|
for (int z=0; z < _Q.size();++z) _Q[z].resize(alphabetSize(),0.0);
|
|
updateQ();
|
|
}
|
|
|
|
wYangModel::wYangModel(const MDOUBLE inW, const MDOUBLE inK, const Vdouble& freq,bool globalW, codon * coAlph):
|
|
_w(inW),_k(inK),_globalW(globalW),_freq(freq),_coAlpha(NULL){
|
|
_coAlpha = (codon*)(coAlph->clone());
|
|
_Q.resize(alphabetSize());
|
|
codonUtility::initSubMatrices(*_coAlpha);
|
|
for (int z=0; z < _Q.size();++z) _Q[z].resize(alphabetSize(),0.0);
|
|
updateQ();
|
|
}
|
|
|
|
|
|
wYangModel& wYangModel::operator=(const wYangModel &other) {
|
|
_w = other._w;
|
|
_k = other._k;
|
|
_q2pt = other._q2pt;
|
|
_Q = other._Q;
|
|
_globalW = other._globalW;
|
|
_freq = other._freq;
|
|
if (_coAlpha) delete _coAlpha;
|
|
if (other._coAlpha)
|
|
_coAlpha = (codon*)(other._coAlpha->clone());
|
|
else
|
|
_coAlpha = NULL;
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
void wYangModel::updateQ() {
|
|
int i,j;
|
|
MDOUBLE sum=0.0;
|
|
for (i=0; i < _Q.size();++i) {
|
|
for (j=i+1; j < _Q.size();++j) {
|
|
MDOUBLE val;
|
|
if (codonUtility::codonReplacement(i,j) == codonUtility::non_synonymous) {
|
|
if (codonUtility::codonDiff(i,j) == codonUtility::tr) val = _k*_w;
|
|
else if (codonUtility::codonDiff(i,j) == codonUtility::tv) val = _w;
|
|
else val = 0;//more than one substitution.
|
|
}
|
|
else {//synonymous
|
|
if (codonUtility::codonDiff(i,j) == codonUtility::tr) val = _k;
|
|
else if (codonUtility::codonDiff(i,j) == codonUtility::tv) val = 1;
|
|
else val = 0;//more than one substitution.
|
|
}
|
|
_Q[i][j] = val * _freq[j];
|
|
_Q[j][i] = val * _freq[i];
|
|
}
|
|
_Q[i][i] = 0.0; //temporary value
|
|
}
|
|
// filling the diagonal
|
|
for (i=0; i < _Q.size(); ++i){
|
|
sum = 0.0;
|
|
for (j=0; j < _Q.size(); ++j) {
|
|
sum += _Q[i][j];
|
|
}
|
|
_Q[i][i] = -sum;
|
|
}
|
|
if (_globalW == true) // w is not distributed, only one Q matrix
|
|
normalizeQ(_Q,_freq);
|
|
|
|
_q2pt.fillFromRateMatrix(_freq,_Q);
|
|
}
|
|
|
|
|
|
void wYangModel::norm(MDOUBLE scale){
|
|
for (int i=0; i < _Q.size(); ++i) {
|
|
for (int j=0; j < _Q.size(); ++j) {
|
|
_Q[i][j] *=scale;
|
|
|
|
}
|
|
}
|
|
_q2pt.fillFromRateMatrix(_freq,_Q);
|
|
}
|
|
|
|
|
|
MDOUBLE wYangModel::sumPijQij(){
|
|
MDOUBLE sum=0.0;
|
|
for (int i=0; i < _Q.size(); ++i) {
|
|
sum -= (_Q[i][i])*_freq[i];
|
|
}
|
|
return sum;
|
|
}
|