diff --git a/java/src/org/broadinstitute/sting/secondarybase/FourProb.java b/java/src/org/broadinstitute/sting/secondarybase/FourProb.java new file mode 100755 index 000000000..dbc0259f3 --- /dev/null +++ b/java/src/org/broadinstitute/sting/secondarybase/FourProb.java @@ -0,0 +1,100 @@ +package org.broadinstitute.sting.secondarybase; + +import org.broadinstitute.sting.utils.Utils; +import org.broadinstitute.sting.utils.QualityUtils; + +/** + * FourProb represents four base hypotheses, their probabilities, and the ranking among one another. + * + * @author Kiran Garimella + */ +public class FourProb { + private double[] baseProbs; + private int[] baseIndices; + + /** + * Constructor for FourProb. + * + * @param baseLikes the unsorted base hypothesis probabilities (in ACGT order). + */ + public FourProb(double[][] baseLikes) { + double[] baseProbs = new double[4]; + for (int baseCurIndex = 0; baseCurIndex < 4; baseCurIndex++) { + for (int basePrevIndex = 0; basePrevIndex < baseLikes.length; basePrevIndex++) { + baseProbs[baseCurIndex] += baseLikes[basePrevIndex][baseCurIndex]; + } + } + + int[] baseIndices = {0, 1, 2, 3}; + + Integer[] perm = Utils.SortPermutation(baseProbs); + double[] ascendingBaseProbs = Utils.PermuteArray(baseProbs, perm); + int[] ascendingBaseIndices = Utils.PermuteArray(baseIndices, perm); + + this.baseProbs = new double[4]; + this.baseIndices = new int[4]; + + for (int i = 0; i < 4; i++) { + this.baseProbs[i] = ascendingBaseProbs[3 - i]; + this.baseIndices[i] = ascendingBaseIndices[3 - i]; + } + } + + /** + * Returns the index of the base at the specified rank. + * + * @param rank (0 = best, 3 = worst) the rank of the base whose index should be returned + * @return the index (0, 1, 2, 3). + */ + public int indexAtRank(int rank) { return baseIndices[rank]; } + + /** + * Returns the base label of the base at the specified rank. + * @param rank (0 = best, 3 = worst) the rank of the base whose index should be returned + * @return the base label (A, C, G, T). + */ + public char baseAtRank(int rank) { return baseIndexToBase(indexAtRank(rank)); } + + /** + * Returns the probability of the base at the specified rank. + * @param rank (0 = best, 3 = worst) the rank of the base whose index should be returned + * @return the probability of the base (0.0-1.0) + */ + public double probAtRank(int rank) { return baseProbs[rank]; } + + /** + * Returns the quality score of the base at the specified rank. + * @param rank (0 = best, 3 = worst) the rank of the base whose index should be returned + * @return the quality score of the base (0-40) + */ + public byte qualAtRank(int rank) { return QualityUtils.probToQual(probAtRank(rank)); } + + /** + * A utility method to convert a base index into a base label. + * @param baseIndex the index of the base (0, 1, 2, 3). + * @return A, C, G, T, or '.' if the base index can't be understood. + */ + private char baseIndexToBase(int baseIndex) { + switch (baseIndex) { + case 0: return 'A'; + case 1: return 'C'; + case 2: return 'G'; + case 3: return 'T'; + default: return '.'; + } + } + + /** + * Prettily formats the FourProb info. + * + * @return a prettily formatted Sting containing the base and quality score in rank order. + */ + public String toString() { + return ( + "[" + baseAtRank(0) + ":" + qualAtRank(0) + " " + + baseAtRank(1) + ":" + qualAtRank(1) + " " + + baseAtRank(2) + ":" + qualAtRank(2) + " " + + baseAtRank(3) + ":" + qualAtRank(3) + "]" + ); + } +}