// $Id: goldmanYangModel.cpp 962 2006-11-07 15:13:34Z privmane $ #include "goldmanYangModel.h" #include "codon.h" #include "readDatMatrix.h" // for the normalizeQ function. goldmanYangModel::goldmanYangModel(const MDOUBLE inV, const MDOUBLE inK,codon & inCodonAlph, const bool globalV): _v(inV),_k(inK),_globalV(_globalV),_codonAlph(inCodonAlph){ homogenousFreq(); _Q.resize(_codonAlph.size()); for (int z=0; z < _Q.size();++z) _Q[z].resize(_codonAlph.size(),0); updateQ(); } goldmanYangModel::goldmanYangModel(const MDOUBLE inV, const MDOUBLE inK, codon & inCodonAlph,const Vdouble& freq,const bool globalV): _freq(freq),_v(inV),_k(inK),_globalV(_globalV),_codonAlph(inCodonAlph){ _Q.resize(_codonAlph.size()); for (int z=0; z < _Q.size();++z) _Q[z].resize(_codonAlph.size(),0); updateQ(); } void goldmanYangModel::updateQ() { // building q. int i,j; MDOUBLE sum=0.0; MDOUBLE epsilon=0.00000001;//0.00000000001; MDOUBLE factor = 1000.0; for (i=0; i < _Q.size();++i) { sum=0; for (j=0; j < _Q.size();++j) { if (j==i) continue; //same codon if (codonUtility::codonDiff(i,j,_codonAlph) == codonUtility::tr) { _Q[i][j] = _k*exp(-(1/factor)*_gcd.getGranthamDistance(codonUtility::aaOf(i,_codonAlph),codonUtility::aaOf(j,_codonAlph))*_v); if (_Q[i][j]