JAL-1894 update year/version in copyright
[jalview.git] / src / jalview / analysis / AAFrequency.java
index 69c39df..d94befb 100755 (executable)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
- * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b1)
+ * Copyright (C) 2015 The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -198,9 +198,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 +368,7 @@ public class AAFrequency
                 .append("%");
       }
       consensus.annotations[i] = new Annotation(maxRes,
-              mouseOver.toString(), ' ',
-              value);
+              mouseOver.toString(), ' ', value);
     }
   }
 
@@ -462,7 +460,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 +506,7 @@ public class AAFrequency
     result[1] = distinctValuesCount;
     return Arrays.copyOfRange(result, 0, j);
   }
-    
+
   /**
    * Compute a consensus for the cDNA coding for a protein alignment.
    * 
@@ -596,7 +595,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
@@ -636,26 +634,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;
         }
       }