Merge branch 'develop' into bug/JAL-2346annotationChoice
[jalview.git] / src / jalview / analysis / AAFrequency.java
index 17874e6..ee16f94 100755 (executable)
  */
 package jalview.analysis;
 
+import java.util.Arrays;
+import java.util.Hashtable;
+import java.util.List;
+
 import jalview.datamodel.AlignedCodonFrame;
 import jalview.datamodel.AlignmentAnnotation;
 import jalview.datamodel.AlignmentI;
@@ -37,10 +41,6 @@ import jalview.util.Format;
 import jalview.util.MappingUtils;
 import jalview.util.QuickSort;
 
-import java.util.Arrays;
-import java.util.Hashtable;
-import java.util.List;
-
 /**
  * Takes in a vector or array of sequences and column start and column end and
  * returns a new Hashtable[] of size maxSeqLength, if Hashtable not supplied.
@@ -67,8 +67,8 @@ public class AAFrequency
     }
   }
 
-  public static final ProfilesI calculate(List<SequenceI> list,
-          int start, int end)
+  public static final ProfilesI calculate(List<SequenceI> list, int start,
+          int end)
   {
     return calculate(list, start, end, false);
   }
@@ -289,6 +289,56 @@ public class AAFrequency
   }
 
   /**
+   * Derive the gap count annotation row.
+   * 
+   * @param gaprow
+   *          the annotation row to add annotations to
+   * @param profiles
+   *          the source consensus data
+   * @param startCol
+   *          start column (inclusive)
+   * @param endCol
+   *          end column (exclusive)
+   */
+  public static void completeGapAnnot(AlignmentAnnotation gaprow,
+          ProfilesI profiles, int startCol, int endCol, long nseq)
+  {
+    if (gaprow == null || gaprow.annotations == null
+            || gaprow.annotations.length < endCol)
+    {
+      /*
+       * called with a bad alignment annotation row 
+       * wait for it to be initialised properly
+       */
+      return;
+    }
+    // always set ranges again
+    gaprow.graphMax = nseq;
+    gaprow.graphMin = 0;
+    for (int i = startCol; i < endCol; i++)
+    {
+      ProfileI profile = profiles.get(i);
+      if (profile == null)
+      {
+        /*
+         * happens if sequences calculated over were 
+         * shorter than alignment width
+         */
+        gaprow.annotations[i] = null;
+        return;
+      }
+
+      final int gapped = profile.getNonGapped();
+
+      String description = String.valueOf(gapped);
+
+      gaprow.annotations[i] = new Annotation(description, description,
+              '\0',
+              gapped);
+    }
+  }
+
+  /**
    * Returns a tooltip showing either
    * <ul>
    * <li>the full profile (percentages of all residues present), if
@@ -357,8 +407,7 @@ public class AAFrequency
    *          calculations
    * @return
    */
-  public static int[] extractProfile(ProfileI profile,
-          boolean ignoreGaps)
+  public static int[] extractProfile(ProfileI profile, boolean ignoreGaps)
   {
     int[] rtnval = new int[64];
     ResidueCount counts = profile.getCounts();