private static void computeLofK( final ExactACset set, final List<double[]> genotypeLikelihoods, final double[] log10AlleleFrequencyPriors, final StateTracker stateTracker) { set.getLog10Likelihoods()[0] = 0.0; // the zero case final int totalK = set.getACsum(); // special case for k = 0 over all k if (totalK == 0) { for (int j = 1; j < set.getLog10Likelihoods().length; j++) { set.getLog10Likelihoods()[j] = set.getLog10Likelihoods()[j - 1] + genotypeLikelihoods.get(j)[HOM_REF_INDEX]; } final double log10Lof0 = set.getLog10Likelihoods()[set.getLog10Likelihoods().length - 1]; stateTracker.setLog10LikelihoodOfAFzero(log10Lof0); stateTracker.setLog10PosteriorOfAFzero(log10Lof0 + log10AlleleFrequencyPriors[0]); return; } // if we got here, then k > 0 for at least one k. // the non-AA possible conformations were already dealt with by pushes from dependent sets; // now deal with the AA case (which depends on previous cells in this column) and then update // the L(j,k) value for (int j = 1; j < set.getLog10Likelihoods().length; j++) { if (totalK < 2 * j - 1) { final double[] gl = genotypeLikelihoods.get(j); final double conformationValue = MathUtils.log10(2 * j - totalK) + MathUtils.log10(2 * j - totalK - 1) + set.getLog10Likelihoods()[j - 1] + gl[HOM_REF_INDEX]; set.getLog10Likelihoods()[j] = MathUtils.approximateLog10SumLog10(set.getLog10Likelihoods()[j], conformationValue); } final double logDenominator = MathUtils.log10(2 * j) + MathUtils.log10(2 * j - 1); set.getLog10Likelihoods()[j] = set.getLog10Likelihoods()[j] - logDenominator; } double log10LofK = set.getLog10Likelihoods()[set.getLog10Likelihoods().length - 1]; // update the MLE if necessary stateTracker.updateMLEifNeeded(log10LofK, set.getACcounts().getCounts()); // apply the priors over each alternate allele for (final int ACcount : set.getACcounts().getCounts()) { if (ACcount > 0) { log10LofK += log10AlleleFrequencyPriors[ACcount]; } } stateTracker.updateMAPifNeeded(log10LofK, set.getACcounts().getCounts()); }