Merge branch 'develop' into features/JAL-845splitPaneMergeDevelop
[jalview.git] / src / jalview / analysis / AAFrequency.java
index b96bf8e..ded1eb6 100755 (executable)
  */
 package jalview.analysis;
 
-import java.util.*;
-
+import jalview.datamodel.AlignmentAnnotation;
+import jalview.datamodel.Annotation;
+import jalview.datamodel.SequenceI;
 import jalview.util.Format;
-import jalview.datamodel.*;
+
+import java.util.Hashtable;
+import java.util.List;
 
 /**
  * Takes in a vector or array of sequences and column start and column end and
@@ -36,8 +39,8 @@ import jalview.datamodel.*;
  */
 public class AAFrequency
 {
-  // No need to store 1000s of strings which are not
-  // visible to the user.
+  private static final int TO_UPPER_CASE = 'A' - 'a'; // -32
+
   public static final String MAXCOUNT = "C";
 
   public static final String MAXRESIDUE = "R";
@@ -48,6 +51,19 @@ public class AAFrequency
 
   public static final String PROFILE = "P";
 
+  /*
+   * Quick look-up of String value of char 'A' to 'Z'
+   */
+  private static final String[] CHARS = new String['Z' - 'A' + 1];
+
+  static
+  {
+    for (char c = 'A'; c <= 'Z'; c++)
+    {
+      CHARS[c - 'A'] = String.valueOf(c);
+    }
+  }
+
   public static final Hashtable[] calculate(List<SequenceI> list,
           int start, int end)
   {
@@ -83,16 +99,11 @@ public class AAFrequency
   }
 
   public static final void calculate(SequenceI[] sequences, int start,
-          int end, Hashtable[] result)
-  {
-    calculate(sequences, start, end, result, false);
-  }
-
-  public static final void calculate(SequenceI[] sequences, int start,
           int end, Hashtable[] result, boolean profile)
   {
     Hashtable residueHash;
-    int maxCount, nongap, i, j, v, jSize = sequences.length;
+    int maxCount, nongap, i, j, v;
+    int jSize = sequences.length;
     String maxResidue;
     char c = '-';
     float percentage;
@@ -134,7 +145,7 @@ public class AAFrequency
           }
           else if ('a' <= c && c <= 'z')
           {
-            c -= 32; // ('a' - 'A');
+            c += TO_UPPER_CASE;
           }
 
           nongap++;
@@ -153,7 +164,7 @@ public class AAFrequency
       }
       else
       {
-        for (v = 'A'; v < 'Z'; v++)
+        for (v = 'A'; v <= 'Z'; v++)
         {
           if (values[v] < 2 || values[v] < maxCount)
           {
@@ -162,11 +173,11 @@ public class AAFrequency
 
           if (values[v] > maxCount)
           {
-            maxResidue = String.valueOf((char) v);
+            maxResidue = CHARS[v - 'A'];
           }
           else if (values[v] == maxCount)
           {
-            maxResidue += String.valueOf((char) v);
+            maxResidue += CHARS[v - 'A'];
           }
           maxCount = values[v];
         }
@@ -218,9 +229,7 @@ public class AAFrequency
   {
     completeConsensus(consensus, hconsensus, iStart, width,
             ignoreGapsInConsensusCalculation, includeAllConsSymbols, null,
-            nseq); // new
-    // char[]
-    // { 'A', 'C', 'G', 'T', 'U' });
+            nseq);
   }
 
   public static void completeConsensus(AlignmentAnnotation consensus,
@@ -356,8 +365,10 @@ public class AAFrequency
     int[] rtnval = new int[64];
     int[][] profile = (int[][]) hconsensus.get(AAFrequency.PROFILE);
     if (profile == null)
+    {
       return null;
-    Object[] ca = new Object[profile[0].length];
+    }
+    char[][] ca = new char[profile[0].length][];
     float[] vl = new float[profile[0].length];
     for (int c = 0; c < ca.length; c++)
     {
@@ -365,16 +376,15 @@ public class AAFrequency
       { (char) c };
       vl[c] = profile[0][c];
     }
-    ;
     jalview.util.QuickSort.sort(vl, ca);
     rtnval[0] = 2;
     rtnval[1] = 0;
-    for (int c = ca.length - 1; profile[0][((char[]) ca[c])[0]] > 0; c--)
+    for (int c = ca.length - 1; profile[0][ca[c][0]] > 0; c--)
     {
-      if (((char[]) ca[c])[0] != '-')
+      if (ca[c][0] != '-')
       {
-        rtnval[rtnval[0]++] = ((char[]) ca[c])[0];
-        rtnval[rtnval[0]] = (int) (profile[0][((char[]) ca[c])[0]] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1
+        rtnval[rtnval[0]++] = ca[c][0];
+        rtnval[rtnval[0]] = (int) (profile[0][ca[c][0]] * 100f / profile[1][ignoreGapsInConsensusCalculation ? 1
                 : 0]);
         rtnval[1] += rtnval[rtnval[0]++];
       }