void SetAAModel(int theAAModel) { aaModel = theAAModel; switch (aaModel) { case AA_JTT: SetRelativeRates(jttRelativeRates); break; case AA_WAG: SetRelativeRates(wagRelativeRates); break; case AA_DAYHOFF78: SetRelativeRates(dayhoffRelativeRates); break; case AA_BLOSUM62: SetRelativeRates(blosumRelativeRates); break; case AA_MTREV24: SetRelativeRates(mtrevRelativeRates); break; case AA_CPREV45: SetRelativeRates(cprevRelativeRates); break; case AA_GENERAL: // relative rates set by user break; } if (!aaFreqSet) { switch (aaModel) { case AA_JTT: SetFrequencies(jttFrequencies); break; case AA_WAG: SetFrequencies(wagFrequencies); break; case AA_DAYHOFF78: SetFrequencies(dayhoffFrequencies); break; case AA_BLOSUM62: SetFrequencies(blosumFrequencies); break; case AA_MTREV24: SetFrequencies(mtrevFrequencies); break; case AA_CPREV45: SetFrequencies(cprevFrequencies); break; case AA_GENERAL: // frequencies set by user break; } } else { // User set or equal frequencies CheckAAFrequencies(); } SetupAAMatrix(); }
void RateMatrix::SetAAFreqs(int theModel, inClade *branch) { switch (theModel) { case AA_JTT: SetFrequencies(jttFrequencies, branch); break; case AA_WAG: SetFrequencies(wagFrequencies, branch); break; case AA_DAYHOFF78: SetFrequencies(dayhoffFrequencies, branch); break; case AA_BLOSUM62: SetFrequencies(blosumFrequencies, branch); break; case AA_MTREV24: SetFrequencies(mtrevFrequencies, branch); break; case AA_CPREV45: SetFrequencies(cprevFrequencies, branch); break; default: cerr << "You cannot set the general matrix in lineages." << endl; exit(EXIT_FAILURE); } }
void RateMatrix::SetModel( inClade *branch ) { int i; bool freqSet = true; double a, b, c, d, e, f, a_, b_, c_, d_, e_, f_, kappa1, kappa2, alpha, beta, gamma, delta; double sum_freq = 0; cerr << "Point-> RateMatrix::SetModel(inClade *branch) IN" << endl; if (isNucModel) stateCharacters = nucleotides; else stateCharacters = aminoAcids; ////////// /// freqSet does not matter for nucleotides. It should always be set for nuc models that do /// not require equal frequencies. For amino acid models, though, need to know if the freqs /// are set, otherwise they can be overwritten by model-specific pi values. ////////// if (branch != NULL) { if ( !(branch->values2Export2Freq.empty()) ) { for (int j = 0; j < numStates; j++) pi.at(j) = branch->values2Export2Freq.at(j); } else freqSet = false; } else freqSet = false; for (vector<double>::iterator it = pi.begin(); it != pi.end(); ++it) sum_freq += (*it); for (vector<double>::iterator it = pi.begin(); it != pi.end(); ++it) (*it) /= sum_freq; ////////// /// Putting model parameters explicitly, easier to understand. ////////// switch (substitution_model) { case NUC_JC69: ////////// OK /// | * 1 1 1 | /// Q = | 1 * 1 1 | /// | 1 1 * 1 | /// | 1 1 1 * | ////////// a=b=c=d=e=f=a_=b_=c_=d_=e_=f_=1; pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; break; case NUC_K80: ////////// OK /// | * 1 K 1 | /// Q = | 1 * 1 K | /// | K 1 * 1 | /// | 1 K 1 * | ////////// kappa1 = kappa.front(); b = b_ = e = e_ = kappa1; a = a_ = c = c_ = d = d_ = f = f_ = 1.0; pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; break; case NUC_K81: pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; case NUC_K81ne: ////////// OK /// | * 1 K A | /// Q = | 1 * A K | /// | K A * 1 | /// | A K 1 * | ////////// kappa1 = kappa.at(0); alpha = kappa.at(1); a = 1; b = kappa1; c = alpha; // *fA a_ = 1; d = alpha; e = kappa1; // *fC b_ = kappa1; d_ = alpha; f = 1; // *fG c_ = alpha; e_ = kappa1; f_ = 1; // *fT break; case NUC_F81: ////////// OK /// | * fA fA fA | /// Q = | fC * fC fC | /// | fG fG * fG | /// | fT fT fT * | ////////// a=b=c=d=e=f=a_=b_=c_=d_=e_=f_=1; break; case NUC_HKY: ////////// OK /// | * fA KfA fA | /// Q = | fC * fC KfC | /// | KfG fG * fG | /// | fT KfT fT * | ////////// kappa1 = kappa.at(0); a = c = 1; b = kappa1; // *fA a_ = d = 1; e = kappa1; // *fC b_ = kappa1; d_ = f = 1; // *fG c_ = f_ = 1; e_ = kappa1; // *fT break; case NUC_F84: ////////// OK /// INPUT: kappa /// | * fA (1+K/(fA+fG))fA fA | /// Q = | fC * fC (1+K/(fC+fT))fC | /// | (1+K/(fA+fG))fG fG * fG | /// | fT (1+K/(fC+fT))fT fT * | ////////// kappa1 = kappa.at(0); a = c = 1; b = (1.0+kappa1/(pi.at(A)+pi.at(G))); // *fA a_ = d = 1; e = (1.0+kappa1/(pi.at(C)+pi.at(T))); // *fC b_ = (1.0+kappa1/(pi.at(A)+pi.at(G))); d_ = f = 1; // *fG c_ = f_ = 1; e_ = (1.0+kappa1/(pi.at(C)+pi.at(T))); // *fT break; case NUC_T92: ////////// /// INPUT: kappa /// | * (1-(fG+fC))/2 K(1-(fG+fC))/2 (1-(fG+fC))/2 | /// Q = | (fG+fC)/2 * (fG+fC)/2 K(fG+fC)/2 | /// | K(fG+fC)/2 (fG+fC)/2 * (fG+fC)/2 | /// | (1-(fG+fC))/2 K(1-(fG+fC))/2 (1-(fG+fC))/2 * | ////////// break; case NUC_TN93eq: pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; case NUC_TN93: ////////// /// INPUT: kappa, kappa2; /// | * fA K1fA fA | /// Q = | fC * fC K2fC | /// | K1fG fG * fG | /// | fT K2fT fT * | ////////// kappa1 = kappa.at(0); kappa2 = kappa.at(1); a = c = 1; b = kappa1; // *fA a_ = d = 1; e = kappa2; // *fC b_ = kappa1; d_ = f = 1; // *fG c_ = f_ = 1; e_ = kappa2; // *fT break; case NUC_TIMeq: pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; case NUC_TIM: ////////// /// INPUT: alpha, beta, gamma /// | * fA AfA BfA | /// Q = | fC * BfC GfC | /// | AfG BfG * fG | /// | BfT GfT fT * | /////////// alpha = kappa.at(0); beta = kappa.at(1); gamma = kappa.at(2); a = 1; b = alpha; c = beta; // *fA a_ = 1; d = beta; e = gamma; // *fC b_ = alpha; d_ = beta; f = 1; // *fG c_ = beta; e_ = gamma; f_ = 1; // *fT break; case NUC_TVMeq: pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; case NUC_TVM: ////////// /// INPUT: alpha, beta, gamma, delta /// | * fA AfA BfA | /// Q = | fC * GfC AfC | /// | AfG GfG * DfG | /// | BfT AfT DfT * | /////////// alpha = kappa.at(0); beta = kappa.at(1); gamma = kappa.at(2); delta = kappa.at(3); a = 1; b = alpha; c = beta; // *fA a_ = 1; c = gamma; d = alpha; // *fC b_ = alpha; d_ = gamma; f = delta; // *fG c_ = beta; e_ = alpha; f_ = delta; // *fT break; case NUC_SYM: pi.at(A) = pi.at(C) = pi.at(G) = pi.at(T) = 0.25; /// SYM and GTR are same, except SYM has equal nucleotide frequencies. No break. case NUC_GTR: ////////// /// INPUT: relative rates abcdef /// | * rACfC rAGfA rATfA | /// Q = | rACfC * rCGfG rCTfC | /// | rAGfG rCGfG * rGTfG | /// | rATfT rCTfT rGTfT * | ////////// a = Sij.at(0); b = Sij.at(1); c = Sij.at(2); // *fA a_ = Sij.at(0); d = Sij.at(3); e = Sij.at(4); // *fC b_ = Sij.at(1); d_ = Sij.at(3); f = Sij.at(5); // *fG c_ = Sij.at(2); e_ = Sij.at(4); d_ = Sij.at(5); // *fT break; case AA_JTT: SetRelativeRates(jttRelativeRates); if (!freqSet) SetFrequencies(jttFrequencies); break; case AA_WAG: SetRelativeRates(wagRelativeRates); if (!freqSet) SetFrequencies(wagFrequencies); break; case AA_DAYHOFF78: SetRelativeRates(dayhoffRelativeRates); if (!freqSet) SetFrequencies(dayhoffFrequencies); break; case AA_BLOSUM62: SetRelativeRates(blosumRelativeRates); if (!freqSet) SetFrequencies(blosumFrequencies); break; case AA_MTREV24: SetRelativeRates(mtrevRelativeRates); if (!freqSet) SetFrequencies(mtrevFrequencies); break; case AA_CPREV45: SetRelativeRates(cprevRelativeRates); if (!freqSet) SetFrequencies(cprevFrequencies); break; default: cerr << "Do not know what to do with your model." << endl; exit(EXIT_FAILURE); } if (numStates == NUM_NUC) { Sij.at(0) = a; Sij.at(1) = b; Sij.at(2) = c; Sij.at(3) = d; Sij.at(4) = e; Sij.at(5) = f; } SetupMatrix(true); }