X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fschemes%2FHMMMatchScoreColourScheme.java;fp=src%2Fjalview%2Fschemes%2FHMMMatchScoreColourScheme.java;h=0ee83a53b8c4a7df16aca693f04eb4f0243f7cd9;hb=940b13e266be76ac186330c615c39989cce654c7;hp=cc8740bd53140bfe61886bf600886b2acc3ae421;hpb=1beac3545a78d4c5c3274dbb53296708d693efe0;p=jalview.git diff --git a/src/jalview/schemes/HMMMatchScoreColourScheme.java b/src/jalview/schemes/HMMMatchScoreColourScheme.java index cc8740b..0ee83a5 100644 --- a/src/jalview/schemes/HMMMatchScoreColourScheme.java +++ b/src/jalview/schemes/HMMMatchScoreColourScheme.java @@ -12,15 +12,22 @@ import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; + + public class HMMMatchScoreColourScheme extends ResidueColourScheme { - private Map> probabilities; + private Map>> probabilities; + + private List ranges; + + private static double binSize; public class MatchProbReader { @@ -32,6 +39,7 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme new FileReader("resources/ProbabilityOfMatch")); } + /* public Map> getProbabilities() throws IOException { Map> probabilities = new HashMap<>(); @@ -55,12 +63,62 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme .valueOf(contents[i].replaceAll("\\ ", ""))); } line = reader.readLine(); - + } reader.close(); return probabilities; } + */ + public Map>> getProbabilities() + throws IOException + { + + Map>> probabilities = new HashMap<>(); + + ranges = new ArrayList<>(); + ranges.add(0); + + binSize = Double.valueOf((reader.readLine().replaceAll("\\ ", ""))); + String line = reader.readLine(); + char c = line.charAt(0); + + while (line != null) + { + line = reader.readLine(); + while (line != null && line.split("\\,").length != 1) + { + String[] llrs = line.split("\\,"); + String[] counts = reader.readLine().split("\\,"); + int range = Integer.valueOf(llrs[0]); + + if (!ranges.contains(range)) + { + ranges.add(range); + } + if (!probabilities.containsKey(c)) + { + probabilities.put(c, new HashMap<>()); + } + probabilities.get(c).put(range, new HashMap<>()); + + for (int i = 1; i < llrs.length; i++) + { + probabilities.get(c).get(range).put( + llrs[i].replaceAll("\\ ", ""), + Double.valueOf(counts[i].replaceAll("\\ ", ""))); + } + + line = reader.readLine(); + } + if (line != null) + { + c = line.charAt(0); + } + } + + return probabilities; + } } @@ -109,10 +167,14 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme public Color findColour(char symbol, int column, SequenceI seq, String consensusResidue, float pid) { - return findColour(symbol, column); + if (seq == null) + { + return null; + } + return findColour(symbol, column, seq.gapMap().length); } - // TODO change + // TODO change documentation /** * Returns the colour at a particular symbol at a column in the alignment: *
    @@ -126,7 +188,7 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme * @param column * @return */ - private Color findColour(char symbol, int column) + private Color findColour(char symbol, int column, int length) { if (getHmm() == null || Comparison.isGap(symbol)) { @@ -144,16 +206,20 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme double prob = 0; if (hmm.getBackgroundFrequencies().containsKey(symbol)) { + int lengthBin = getLengthBin(length); + double llr = Math .log(getHmm().getMatchEmissionProbability(column, symbol) / hmm.getBackgroundFrequencies().get(symbol)); - if (!probabilities.get(symbol).containsKey(format(llr))) + if (!probabilities.get(symbol).get(lengthBin) + .containsKey(format(llr))) { - return Color.green; + return Color.white; } - prob = probabilities.get(symbol).get(format(llr)); + + prob = probabilities.get(symbol).get(lengthBin).get(format(llr)); } else { @@ -179,12 +245,25 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme public static String format(Double d) { - String formatted = String.format("%.1f", d); + String formatArg = String.valueOf(binSize); + + // if bin size, need format "%.n" where n is number of decimal places + if (binSize < 1) + { + formatArg = "." + formatArg.split("\\.")[1].length(); + } + + Double rounded = Math.round(d / binSize) * binSize; + String formatted = String.format("%" + formatArg + "f", rounded); + + // format sometimes returns a number rounded to 0 as -0 + // this ensures output will always be 0 if (Double.valueOf(formatted) == 0) { formatted = "0"; } return formatted; + } /** @@ -273,7 +352,17 @@ public class HMMMatchScoreColourScheme extends ResidueColourScheme return JalviewColourScheme.HMMMatchScore.toString(); } - + private int getLengthBin(int l) + { + for (int i = 1; i < ranges.size(); i++) + { + if (l >= ranges.get(i - 1) && l < ranges.get(i)) + { + return ranges.get(i); + } + } + return -1; + } }