X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAAFrequency.java;h=1fef08ecbc8e8014ca392d86f171816a494d8882;hb=refs%2Fheads%2Fmerge%2FJAL-3285_mchmmer_with_211_develop;hp=f77517c66e66a5524924ea1bedcca2ea9e4df27b;hpb=7d950017bb9262f2eff563192071b5ed9ccc76b4;p=jalview.git diff --git a/src/jalview/analysis/AAFrequency.java b/src/jalview/analysis/AAFrequency.java index f77517c..1fef08e 100755 --- a/src/jalview/analysis/AAFrequency.java +++ b/src/jalview/analysis/AAFrequency.java @@ -193,23 +193,22 @@ public class AAFrequency * 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 + * if true, symbols with a match emission probability less than + * background frequency are ignored * @return */ public static ProfilesI calculateHMMProfiles(final HiddenMarkovModel hmm, - int width, int start, int end, boolean saveFullProfile, - boolean removeBelowBackground, boolean infoLetterHeight) + int width, int start, int end, boolean removeBelowBackground, + boolean infoLetterHeight) { ProfileI[] result = new ProfileI[width]; - int symbolCount = hmm.getNumberOfSymbols(); + char[] symbols = hmm.getSymbols().toCharArray(); + int symbolCount = symbols.length; for (int column = start; column < end; column++) { ResidueCount counts = new ResidueCount(); - for (char symbol : hmm.getSymbols()) + for (char symbol : symbols) { int value = getAnalogueCount(hmm, column, symbol, removeBelowBackground, infoLetterHeight); @@ -220,11 +219,7 @@ public class AAFrequency int gapCount = counts.getGapCount(); ProfileI profile = new Profile(symbolCount, gapCount, maxCount, maxResidue); - - if (saveFullProfile) - { - profile.setCounts(counts); - } + profile.setCounts(counts); result[column] = profile; } @@ -343,20 +338,16 @@ public class AAFrequency * @param endCol * end column (exclusive) * @param ignoreGaps - * if true, normalise residue percentages + * if true, normalise residue percentages * @param showSequenceLogo * if true include all information symbols, else just show modal * residue - * @param nseq - * number of sequences */ public static float completeInformation(AlignmentAnnotation information, - ProfilesI profiles, int startCol, int endCol, long nseq, - Float currentMax) + ProfilesI profiles, int startCol, int endCol) { // long now = System.currentTimeMillis(); - if (information == null || information.annotations == null - || information.annotations.length < endCol) + if (information == null || information.annotations == null) { /* * called with a bad alignment annotation row @@ -365,54 +356,48 @@ public class AAFrequency return 0; } - Float max = 0f; + float max = 0f; + SequenceI hmmSeq = information.sequenceRef; - for (int i = startCol; i < endCol; i++) + int seqLength = hmmSeq.getLength(); + if (information.annotations.length < seqLength) { - ProfileI profile = profiles.get(i); - if (profile == null) + return 0; + } + + HiddenMarkovModel hmm = hmmSeq.getHMM(); + + for (int column = startCol; column < endCol; column++) + { + if (column >= seqLength) { - /* - * happens if sequences calculated over were - * shorter than alignment width - */ - information.annotations[i] = null; - return 0; + // hmm consensus sequence is shorter than the alignment + break; } - SequenceI hmmSeq = information.sequenceRef; - - HiddenMarkovModel hmm = hmmSeq.getHMM(); - - float value = hmm.getInformationContent(i); - - if (value > max) + float value = hmm.getInformationContent(column); + boolean isNaN = Float.isNaN(value); + if (!isNaN) { - max = value; + max = Math.max(max, value); } - String description = value + " bits"; - information.annotations[i] = new Annotation( - Character.toString(Character - .toUpperCase(hmm.getConsensusAtAlignColumn(i))), + String description = isNaN ? null + : String.format("%.4f bits", value); + information.annotations[column] = new Annotation( + Character.toString( + Character.toUpperCase(hmmSeq.getCharAt(column))), description, ' ', value); } - if (max > currentMax) - { - information.graphMax = max; - return max; - } - else - { - information.graphMax = currentMax; - return currentMax; - } + + information.graphMax = max; + return max; } /** - * Derive the gap count annotation row. + * Derive the occupancy count annotation * - * @param gaprow + * @param occupancy * the annotation row to add annotations to * @param profiles * the source consensus data @@ -421,11 +406,11 @@ public class AAFrequency * @param endCol * end column (exclusive) */ - public static void completeGapAnnot(AlignmentAnnotation gaprow, + public static void completeGapAnnot(AlignmentAnnotation occupancy, ProfilesI profiles, int startCol, int endCol, long nseq) { - if (gaprow == null || gaprow.annotations == null - || gaprow.annotations.length < endCol) + if (occupancy == null || occupancy.annotations == null + || occupancy.annotations.length < endCol) { /* * called with a bad alignment annotation row @@ -434,8 +419,8 @@ public class AAFrequency return; } // always set ranges again - gaprow.graphMax = nseq; - gaprow.graphMin = 0; + occupancy.graphMax = nseq; + occupancy.graphMin = 0; double scale = 0.8 / nseq; for (int i = startCol; i < endCol; i++) { @@ -446,7 +431,7 @@ public class AAFrequency * happens if sequences calculated over were * shorter than alignment width */ - gaprow.annotations[i] = null; + occupancy.annotations[i] = null; return; } @@ -454,7 +439,8 @@ public class AAFrequency String description = "" + gapped; - gaprow.annotations[i] = new Annotation("", description, '\0', gapped, + occupancy.annotations[i] = new Annotation("", description, '\0', + gapped, jalview.util.ColorUtils.bleachColour(Color.DARK_GRAY, (float) scale * gapped)); } @@ -867,15 +853,15 @@ public class AAFrequency { return null; } - int size = hmm.getNumberOfSymbols(); + String alphabet = hmm.getSymbols(); + int size = alphabet.length(); char symbols[] = new char[size]; int values[] = new int[size]; - List charList = hmm.getSymbols(); int totalCount = 0; for (int i = 0; i < size; i++) { - char symbol = charList.get(i); + char symbol = alphabet.charAt(i); symbols[i] = symbol; int value = getAnalogueCount(hmm, column, symbol, removeBelowBackground, infoHeight);