void RateMatrix::setPij( Site site, double BL, int rateHetero ) { switch (rateHetero) { case GammaRates: BL *= site.returnGamma(); case NoRates: SetMatrix(Pij.at(0), BL); break; case DiscreteGammaRates: for (int j=0; j < num_categories; j++) SetMatrix(Pij.at(j), catRate.at(j)*BL); break; case CodonRates: // for (j=0; j < 3; j++) // SetMatrix(matrix[j], des->nodeEnv->catRate[j]*inlen); // for (i = 0; i < sequence_size; i++) { // if (random_placement) // pos = (double)rndu() * (des->seq_evo.size()-1); // else pos = i; // vector<Site>::iterator posit = des->seq_evo.begin()+pos; // cat=(pos+iTree->codon_offset)%3; // calling_routine.assign("MutateSequence->GONE, CodonRates"); // result=SetState( // matrix[cat]+((*posit).returnState() * numStates), // calling_routine // ); // if ( !(des->seq_evo.at(pos).motif.active_properties.subst->substitution_bitstring.test((*posit).returnState())) ) // do_sub=true; // else if (des->seq_evo.at(pos).motif.active_properties.subst->substitution_bitstring.test(result) ) // do_sub = true; // else rejected++; // // if (do_sub) { // // Check if stop codon is result of substitution. // int codon[3]; // if (pos - (3-iTree->codon_offset) < 0 || pos + (3-iTree->codon_offset) >= des->seq_evo.size()) { // ; // Punt, since I do not keep track of other partitions (what about subsequences??) // } else if ( (pos+iTree->codon_offset) % 3 == 0 ) { // codon[0] = result; // codon[1] = (*(posit+1)).returnState(); // codon[2] = (*(posit+2)).returnState(); // } else if ( (pos+iTree->codon_offset) % 3 == 1 ) { // codon[0] = (*(posit-1)).returnState(); // codon[1] = result; // codon[2] = (*(posit+1)).returnState(); // } else if ( (pos+iTree->codon_offset) % 3 == 2 ) { // codon[0] = (*(posit-2)).returnState(); // codon[1] = (*(posit-1)).returnState(); // codon[2] = result; // } else { // cerr << "Huh?? how can there be more than 3 codon positions?" << endl; // exit(EXIT_FAILURE); // } // if ( !Stop_Codon(codon) ) { // (*posit).setState(result); // } else rejected++; // } // } // break; } }