void FONSEModel::calculateLogLikelihoodRatioPerGroupingPerCategory(std::string grouping, Genome& genome, std::vector<double> &logAcceptanceRatioForAllMixtures) { int numGenes = genome.getGenomeSize(); //int numCodons = SequenceSummary::GetNumCodonsForAA(grouping); double likelihood = 0.0; double likelihood_proposed = 0.0; double mutation[5]; double selection[5]; double mutation_proposed[5]; double selection_proposed[5]; std::string curAA; Gene *gene; SequenceSummary *sequenceSummary; unsigned aaIndex = SequenceSummary::AAToAAIndex(grouping); #ifdef _OPENMP //#ifndef __APPLE__ #pragma omp parallel for private(mutation, selection, mutation_proposed, selection_proposed, curAA, gene, sequenceSummary) reduction(+:likelihood,likelihood_proposed) #endif for (unsigned i = 0u; i < numGenes; i++) { gene = &genome.getGene(i); sequenceSummary = gene->getSequenceSummary(); if (sequenceSummary->getAACountForAA(aaIndex) == 0) continue; // which mixture element does this gene belong to unsigned mixtureElement = parameter->getMixtureAssignment(i); // how is the mixture element defined. Which categories make it up unsigned mutationCategory = parameter->getMutationCategory(mixtureElement); unsigned selectionCategory = parameter->getSelectionCategory(mixtureElement); unsigned expressionCategory = parameter->getSynthesisRateCategory(mixtureElement); // get phi value, calculate likelihood conditional on phi double phiValue = parameter->getSynthesisRate(i, expressionCategory, false); // get current mutation and selection parameter parameter->getParameterForCategory(mutationCategory, FONSEParameter::dM, grouping, false, mutation); parameter->getParameterForCategory(selectionCategory, FONSEParameter::dOmega, grouping, false, selection); // get proposed mutation and selection parameter parameter->getParameterForCategory(mutationCategory, FONSEParameter::dM, grouping, true, mutation_proposed); parameter->getParameterForCategory(selectionCategory, FONSEParameter::dOmega, grouping, true, selection_proposed); likelihood += calculateLogLikelihoodRatioPerAA(*gene, grouping, mutation, selection, phiValue); likelihood_proposed += calculateLogLikelihoodRatioPerAA(*gene, grouping, mutation_proposed, selection_proposed, phiValue); } //likelihood_proposed = likelihood_proposed + calculateMutationPrior(grouping, true); //likelihood = likelihood + calculateMutationPrior(grouping, false); logAcceptanceRatioForAllMixtures[0] = (likelihood_proposed - likelihood); }
void FONSEModel::calculateLogLikelihoodRatioPerGene(Gene& gene, unsigned geneIndex, unsigned k, double* logProbabilityRatio) { double likelihood = 0.0; double likelihood_proposed = 0.0; std::string curAA; std::vector <unsigned> positions; double mutation[5]; double selection[5]; SequenceSummary *seqsum = gene.getSequenceSummary(); // get correct index for everything unsigned mutationCategory = parameter->getMutationCategory(k); unsigned selectionCategory = parameter->getSelectionCategory(k); unsigned expressionCategory = parameter->getSynthesisRateCategory(k); double phiValue = parameter->getSynthesisRate(geneIndex, expressionCategory, false); double phiValue_proposed = parameter->getSynthesisRate(geneIndex, expressionCategory, true); /* This loop causes a compiler warning because i is an int, but openMP won't compile if I change i to unsigned. Maybe worth looking into? */ #ifndef __APPLE__ #pragma omp parallel for private(mutation, selection, positions, curAA) reduction(+:likelihood,likelihood_proposed) #endif for (int i = 0; i < getGroupListSize(); i++) { curAA = getGrouping(i); parameter->getParameterForCategory(mutationCategory, FONSEParameter::dM, curAA, false, mutation); parameter->getParameterForCategory(selectionCategory, FONSEParameter::dOmega, curAA, false, selection); likelihood += calculateLogLikelihoodRatioPerAA(gene, curAA, mutation, selection, phiValue); likelihood_proposed += calculateLogLikelihoodRatioPerAA(gene, curAA, mutation, selection, phiValue_proposed); } //std::cout << logLikelihood << " " << logLikelihood_proposed << std::endl; double stdDevSynthesisRate = parameter->getStdDevSynthesisRate(false); double logPhiProbability = Parameter::densityLogNorm(phiValue, (-(stdDevSynthesisRate * stdDevSynthesisRate) / 2), stdDevSynthesisRate, true); double logPhiProbability_proposed = Parameter::densityLogNorm(phiValue_proposed, (-(stdDevSynthesisRate * stdDevSynthesisRate) / 2), stdDevSynthesisRate, true); double currentLogLikelihood = (likelihood + logPhiProbability); double proposedLogLikelihood = (likelihood_proposed + logPhiProbability_proposed); if (phiValue == 0) { std::cout << "phiValue is 0\n"; } if (phiValue_proposed == 0) { std::cout << "phiValue_prop is 0\n"; } logProbabilityRatio[0] = (proposedLogLikelihood - currentLogLikelihood) - (std::log(phiValue) - std::log(phiValue_proposed)); logProbabilityRatio[1] = currentLogLikelihood - std::log(phiValue_proposed); if (std::isinf(logProbabilityRatio[1])) { std::cout << "logprob1 inf\n"; } logProbabilityRatio[2] = proposedLogLikelihood - std::log(phiValue); if (std::isinf(logProbabilityRatio[2])) { std::cout << "logprob2 inf\n"; } //------------NOTE: Jeremy, Cedric changed the reverse jump to where we DON'T include it. I had my RFP //LogLikelihood go to 0 because of now missing terms. I have added the code underneath to where we calculate it---/ logProbabilityRatio[3] = currentLogLikelihood; logProbabilityRatio[4] = proposedLogLikelihood; }