{
if (sequences[row] == null)
{
- System.err
- .println("WARNING: Consensus skipping null sequence - possible race condition.");
+ System.err.println(
+ "WARNING: Consensus skipping null sequence - possible race condition.");
continue;
}
- char[] seq = sequences[row].getSequence();
- if (seq.length > column)
+ if (sequences[row].getLength() > column)
{
- char c = seq[column];
+ char c = sequences[row].getCharAt(column);
residueCounts.add(c);
if (Comparison.isNucleotide(c))
{
// System.out.println(elapsed);
}
- public static ProfilesI calculateInformation(final HiddenMarkovModel hmm,
+ /**
+ * Returns the full set of profiles for a hidden Markov model. The underlying
+ * data is the raw probabilities of a residue being emitted at each node,
+ * however the profiles returned by this function contain the percentage
+ * chance of a residue emission.
+ *
+ * @param hmm
+ * @param width
+ * The width of the Profile array (Profiles) to be returned.
+ * @param start
+ * The alignment column on which the first profile is based.
+ * @param end
+ * The alignment column on which the last profile is based.
+ * @param saveFullProfile
+ * Flag for saving the counts for each profile
+ * @param removeBelowBackground
+ * Flag for removing any characters with a match emission probability
+ * less than its background frequency
+ * @return
+ */
+ public static ProfilesI calculateHMMProfiles(final HiddenMarkovModel hmm,
int width, int start, int end, boolean saveFullProfile,
- boolean removeBelowBackground)
+ boolean removeBelowBackground, boolean infoLetterHeight)
{
ProfileI[] result = new ProfileI[width];
int symbolCount = hmm.getNumberOfSymbols();
- String alph = hmm.getAlphabetType();
for (int column = start; column < end; column++)
{
ResidueCount counts = new ResidueCount();
for (char symbol : hmm.getSymbols())
{
- int value = getAnalogueCount(hmm, column, removeBelowBackground,
- alph, symbol);
+ int value = getAnalogueCount(hmm, column, symbol,
+ removeBelowBackground, infoLetterHeight);
counts.put(symbol, value);
}
int maxCount = counts.getModalCount();
* @param nseq
* number of sequences
*/
- public static void completeInformation(AlignmentAnnotation information,
- ProfilesI profiles, int startCol, int endCol,
- boolean ignoreBelowBackground,
- boolean showSequenceLogo, long nseq)
+ public static float completeInformation(AlignmentAnnotation information,
+ ProfilesI profiles, int startCol, int endCol, long nseq,
+ Float currentMax)
{
// long now = System.currentTimeMillis();
if (information == null || information.annotations == null
* called with a bad alignment annotation row
* wait for it to be initialised properly
*/
- return;
+ return 0;
}
Float max = 0f;
* shorter than alignment width
*/
information.annotations[i] = null;
- return;
+ return 0;
}
HiddenMarkovModel hmm;
}
String description = value + " bits";
-
- information.annotations[i] = new Annotation(" ", description,
- ' ', value);
+ information.annotations[i] = new Annotation(
+ Character.toString(Character
+ .toUpperCase(hmm.getConsensusAtAlignColumn(i))),
+ description, ' ', value);
+ }
+ if (max > currentMax)
+ {
+ information.graphMax = max;
+ return max;
+ }
+ else
+ {
+ information.graphMax = currentMax;
+ return currentMax;
}
- information.graphMax = max;
- // long elapsed = System.currentTimeMillis() - now;
- // System.out.println(-elapsed);
}
/**
// always set ranges again
gaprow.graphMax = nseq;
gaprow.graphMin = 0;
- double scale = 0.8/nseq;
+ double scale = 0.8 / nseq;
for (int i = startCol; i < endCol; i++)
{
ProfileI profile = profiles.get(i);
String description = "" + gapped;
- gaprow.annotations[i] = new Annotation("", description,
- '\0', gapped, jalview.util.ColorUtils.bleachColour(
- Color.DARK_GRAY, (float) scale * gapped));
+ gaprow.annotations[i] = new Annotation("", description, '\0', gapped,
+ jalview.util.ColorUtils.bleachColour(Color.DARK_GRAY,
+ (float) scale * gapped));
}
}
* <ul>
* <li>the full profile (percentages of all residues present), if
* showSequenceLogo is true, or</li>
- * <li>just the modal (most common) residue(s), if showSequenceLogo is false</li>
+ * <li>just the modal (most common) residue(s), if showSequenceLogo is
+ * false</li>
* </ul>
* Percentages are as a fraction of all sequence, or only ungapped sequences
* if ignoreGaps is true.
String description = null;
if (counts != null && showSequenceLogo)
{
- int normaliseBy = ignoreGaps ? profile.getNonGapped() : profile
- .getHeight();
+ int normaliseBy = ignoreGaps ? profile.getNonGapped()
+ : profile.getHeight();
description = counts.getTooltip(normaliseBy, dp);
}
else
QuickSort.sort(values, symbols);
int nextArrayPos = 2;
int totalPercentage = 0;
- final int divisor = ignoreGaps ? profile.getNonGapped() : profile
- .getHeight();
+ final int divisor = ignoreGaps ? profile.getNonGapped()
+ : profile.getHeight();
/*
* traverse the arrays in reverse order (highest counts first)
{
continue;
}
- List<char[]> codons = MappingUtils
- .findCodonsFor(seq, col, mappings);
+ List<char[]> codons = MappingUtils.findCodonsFor(seq, col,
+ mappings);
for (char[] codon : codons)
{
int codonEncoded = CodingUtils.encodeCodon(codon);
int modalCodonEncoded = codons[codons.length - 1];
int modalCodonCount = sortedCodonCounts[codons.length - 1];
- String modalCodon = String.valueOf(CodingUtils
- .decodeCodon(modalCodonEncoded));
- if (sortedCodonCounts.length > 1
- && sortedCodonCounts[codons.length - 2] == sortedCodonCounts[codons.length - 1])
+ String modalCodon = String
+ .valueOf(CodingUtils.decodeCodon(modalCodonEncoded));
+ if (sortedCodonCounts.length > 1 && sortedCodonCounts[codons.length
+ - 2] == sortedCodonCounts[codons.length - 1])
{
/*
* two or more codons share the modal count
{
if (samePercent.length() > 0)
{
- mouseOver.append(samePercent).append(": ")
- .append(lastPercent).append("% ");
+ mouseOver.append(samePercent).append(": ").append(lastPercent)
+ .append("% ");
}
samePercent.setLength(0);
samePercent.append(codon);
* @return
*/
public static int[] extractHMMProfile(HiddenMarkovModel hmm, int column,
- boolean removeBelowBackground)
+ boolean removeBelowBackground, boolean infoHeight)
{
if (hmm != null)
{
- String alph = hmm.getAlphabetType();
int size = hmm.getNumberOfSymbols();
char symbols[] = new char[size];
int values[] = new int[size];
{
char symbol = charList.get(i);
symbols[i] = symbol;
- int value = getAnalogueCount(hmm, column, removeBelowBackground,
- alph, symbol);
+ int value = getAnalogueCount(hmm, column, symbol,
+ removeBelowBackground, infoHeight);
values[i] = value;
totalCount += value;
}
return null;
}
- private static int getAnalogueCount(HiddenMarkovModel hmm, int column,
- boolean removeBelowBackground, String alph, char symbol)
+ /**
+ * Converts the emission probability of a residue at a column in the alignment
+ * to a 'count' to allow for processing by the annotation renderer.
+ *
+ * @param hmm
+ * @param column
+ * @param removeBelowBackground
+ * When true, this method returns 0 for any symbols with a match
+ * emission probability less than the background frequency.
+ * @param symbol
+ * @return
+ */
+ static int getAnalogueCount(HiddenMarkovModel hmm, int column,
+ char symbol, boolean removeBelowBackground, boolean infoHeight)
{
Double value;
value = hmm.getMatchEmissionProbability(column, symbol);
double freq;
- freq = ResidueProperties.backgroundFrequencies.get(alph).get(symbol);
+ freq = ResidueProperties.backgroundFrequencies
+ .get(hmm.getAlphabetType()).get(symbol);
if (value < freq && removeBelowBackground)
{
return 0;
}
+ if (infoHeight)
+ {
+ value = value * (Math.log(value / freq) / Math.log(2));
+ }
+
value = value * 10000;
return Math.round(value.floatValue());
}