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<Character, Map<String, Double>> probabilities;
+ private Map<Character, Map<Integer, Map<String, Double>>> probabilities;
+
+ private List<Integer> ranges;
+
+ private static double binSize;
public class MatchProbReader
{
new FileReader("resources/ProbabilityOfMatch"));
}
+ /*
public Map<Character, Map<String, Double>> getProbabilities() throws IOException
{
Map<Character, Map<String, Double>> probabilities = new HashMap<>();
.valueOf(contents[i].replaceAll("\\ ", "")));
}
line = reader.readLine();
-
+
}
reader.close();
return probabilities;
}
+ */
+ public Map<Character, Map<Integer, Map<String, Double>>> getProbabilities()
+ throws IOException
+ {
+
+ Map<Character, Map<Integer, Map<String, Double>>> 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;
+ }
}
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:
* <ul>
* @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))
{
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
{
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;
+
}
/**
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;
+ }
}