X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FAAFrequency.java;h=fb495419d2573bbf56ade3e0c21ca46c42ad933e;hb=7789821ca9dad74daf9bc189a882dc6c31ce12a4;hp=69c39df86c654190868b86ec300a72423b7e0d1a;hpb=797f8de3bc7ec7f84ac643bb1d961eae1a0b0824;p=jalview.git diff --git a/src/jalview/analysis/AAFrequency.java b/src/jalview/analysis/AAFrequency.java index 69c39df..fb49541 100755 --- a/src/jalview/analysis/AAFrequency.java +++ b/src/jalview/analysis/AAFrequency.java @@ -32,7 +32,6 @@ import jalview.util.QuickSort; import java.util.Arrays; import java.util.Hashtable; import java.util.List; -import java.util.Set; /** * Takes in a vector or array of sequences and column start and column end and @@ -198,9 +197,8 @@ public class AAFrequency if (profile) { // TODO use a 1-dimensional array with jSize, nongap in [0] and [1] - residueHash.put(PROFILE, new int[][] - { values, new int[] - { jSize, nongap } }); + residueHash.put(PROFILE, new int[][] { values, + new int[] { jSize, nongap } }); } residueHash.put(MAXCOUNT, new Integer(maxCount)); residueHash.put(MAXRESIDUE, maxResidue); @@ -369,8 +367,7 @@ public class AAFrequency .append("%"); } consensus.annotations[i] = new Annotation(maxRes, - mouseOver.toString(), ' ', - value); + mouseOver.toString(), ' ', value); } } @@ -462,7 +459,8 @@ public class AAFrequency * @param hashtable * @return */ - public static int[] extractCdnaProfile(Hashtable hashtable, boolean ignoreGaps) + public static int[] extractCdnaProfile(Hashtable hashtable, + boolean ignoreGaps) { // this holds #seqs, #ungapped, and then codon count, indexed by encoded // codon triplet @@ -507,7 +505,7 @@ public class AAFrequency result[1] = distinctValuesCount; return Arrays.copyOfRange(result, 0, j); } - + /** * Compute a consensus for the cDNA coding for a protein alignment. * @@ -521,7 +519,7 @@ public class AAFrequency Hashtable[] hconsensus) { final char gapCharacter = alignment.getGapCharacter(); - Set mappings = alignment.getCodonFrames(); + List mappings = alignment.getCodonFrames(); if (mappings == null || mappings.isEmpty()) { return; @@ -542,12 +540,16 @@ public class AAFrequency { continue; } - char[] codon = MappingUtils.findCodonFor(seq, col, mappings); - int codonEncoded = CodingUtils.encodeCodon(codon); - if (codonEncoded >= 0) + List codons = MappingUtils + .findCodonsFor(seq, col, mappings); + for (char[] codon : codons) { - codonCounts[codonEncoded + 2]++; - ungappedCount++; + int codonEncoded = CodingUtils.encodeCodon(codon); + if (codonEncoded >= 0) + { + codonCounts[codonEncoded + 2]++; + ungappedCount++; + } } } codonCounts[1] = ungappedCount; @@ -596,7 +598,6 @@ public class AAFrequency // array holds #seqs, #ungapped, then codon counts indexed by codon final int[] codonCounts = (int[]) hci.get(PROFILE); int totalCount = 0; - StringBuilder mouseOver = new StringBuilder(32); /* * First pass - get total count and find the highest @@ -623,8 +624,11 @@ public class AAFrequency String modalCodon = String.valueOf(CodingUtils .decodeCodon(modalCodonEncoded)); if (sortedCodonCounts.length > 1 - && sortedCodonCounts[codons.length - 2] == modalCodonEncoded) + && sortedCodonCounts[codons.length - 2] == sortedCodonCounts[codons.length - 1]) { + /* + * two or more codons share the modal count + */ modalCodon = "+"; } float pid = sortedCodonCounts[sortedCodonCounts.length - 1] * 100 @@ -636,26 +640,54 @@ public class AAFrequency */ /* - * Scan sorted array backwards for most frequent values first. + * Scan sorted array backwards for most frequent values first. Show + * repeated values compactly. */ + StringBuilder mouseOver = new StringBuilder(32); + StringBuilder samePercent = new StringBuilder(); + String percent = null; + String lastPercent = null; + Format fmt = getPercentageFormat(nseqs); + for (int j = codons.length - 1; j >= 0; j--) { int codonCount = sortedCodonCounts[j]; if (codonCount == 0) { + /* + * remaining codons are 0% - ignore, but finish off the last one if + * necessary + */ + if (samePercent.length() > 0) + { + mouseOver.append(samePercent).append(": ").append(percent) + .append("% "); + } break; } int codonEncoded = codons[j]; final int pct = codonCount * 100 / totalCount; String codon = String .valueOf(CodingUtils.decodeCodon(codonEncoded)); - Format fmt = getPercentageFormat(nseqs); - String formatted = fmt == null ? Integer.toString(pct) : fmt - .form(pct); + percent = fmt == null ? Integer.toString(pct) : fmt.form(pct); if (showProfileLogo || codonCount == modalCodonCount) { - mouseOver.append(codon).append(": ").append(formatted) - .append("% "); + if (percent.equals(lastPercent) && j > 0) + { + samePercent.append(samePercent.length() == 0 ? "" : ", "); + samePercent.append(codon); + } + else + { + if (samePercent.length() > 0) + { + mouseOver.append(samePercent).append(": ") + .append(lastPercent).append("% "); + } + samePercent.setLength(0); + samePercent.append(codon); + } + lastPercent = percent; } }