fix compact annotation array routine
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index 0f2a423..87c113f 100755 (executable)
@@ -54,6 +54,15 @@ public class AlignmentAnnotation
   /** DOCUMENT ME!! */
   public float graphMax;
 
+  /**
+   * Score associated with label and description.
+   */
+  public double score= Double.NaN;
+  /**
+   * flag indicating if annotation has a score.
+   */
+  public boolean hasScore=false;
+
   public GraphLine threshold;
 
   // Graphical hints and tips
@@ -79,7 +88,7 @@ public class AlignmentAnnotation
 
   public int graphHeight = 40;
 
-  public boolean padGaps = true;
+  public boolean padGaps = false;
 
   public static final int NO_GRAPH = 0;
 
@@ -87,6 +96,9 @@ public class AlignmentAnnotation
 
   public static final int LINE_GRAPH = 2;
 
+  public boolean belowAlignment = true;
+
+
   public static int getGraphValueFromString(String string)
   {
     if (string.equalsIgnoreCase("BAR_GRAPH"))
@@ -108,7 +120,8 @@ public class AlignmentAnnotation
    *
    * @param label DOCUMENT ME!
    * @param description DOCUMENT ME!
-   * @param annotations DOCUMENT ME!
+   * @param annotations DOCUMENT ME!about:blank
+Loading...
    */
   public AlignmentAnnotation(String label, String description,
                              Annotation[] annotations)
@@ -129,14 +142,17 @@ public class AlignmentAnnotation
     {
       if (annotations[i] == null)
       {
-        padGaps = false;
         continue;
       }
-
       if (annotations[i].secondaryStructure == 'H' ||
           annotations[i].secondaryStructure == 'E')
       {
-        hasIcons = true;
+          hasIcons = true;
+      }
+
+      if(annotations[i].displayCharacter==null)
+      {
+        continue;
       }
 
       if (annotations[i].displayCharacter.length() == 1
@@ -144,22 +160,19 @@ public class AlignmentAnnotation
           && !annotations[i].displayCharacter.equals("E")
           && !annotations[i].displayCharacter.equals("-")
           && !annotations[i].displayCharacter.equals("."))
-      {
-        if (jalview.schemes.ResidueProperties.aaIndex
-            [annotations[i].displayCharacter.charAt(0)] < 23)
         {
-          nonSSLabel = true;
+          if (jalview.schemes.ResidueProperties.aaIndex
+                  [annotations[i].displayCharacter.charAt(0)] < 23)
+          {
+            nonSSLabel = true;
+          }
         }
-      }
 
-      if (annotations[i].displayCharacter.length() > 0)
-      {
-        hasText = true;
+        if (annotations[i].displayCharacter.length() > 0)
+        {
+          hasText = true;
+        }
       }
-      else
-        padGaps = false;
-    }
-
 
     if (nonSSLabel)
     {
@@ -211,6 +224,13 @@ public class AlignmentAnnotation
    * if appropriate.
    */
   private void validateRangeAndDisplay() {
+
+    if (annotations==null)
+    {
+      visible=false; // try to prevent renderer from displaying.
+      return; // this is a non-annotation row annotation - ie a sequence score.
+    }
+
     int graphType = graph;
     float min = graphMin;
     float max = graphMax;
@@ -226,7 +246,9 @@ public class AlignmentAnnotation
           continue;
         }
 
-        if (drawValues && annotations[i].displayCharacter.length() > 1)
+        if (drawValues
+            && annotations[i].displayCharacter!=null
+            && annotations[i].displayCharacter.length() > 1)
         {
           drawValues = false;
         }
@@ -281,6 +303,12 @@ public class AlignmentAnnotation
     this.hasText = annotation.hasText;
     this.height = annotation.height;
     this.label = annotation.label;
+    this.padGaps = annotation.padGaps;
+    this.visible = annotation.visible;
+    if (this.hasScore = annotation.hasScore)
+    {
+      this.score = annotation.score;
+    }
     if (threshold!=null) {
       threshold = new GraphLine(annotation.threshold);
     }
@@ -307,8 +335,8 @@ public class AlignmentAnnotation
             }
             for (int i=0; i<ann.length; i++)
             {
-              if (ann[i]==a) 
-              { 
+              if (ann[i]==a)
+              {
                 sequenceMapping.put(p, annotations[i]);
               }
             }
@@ -329,8 +357,19 @@ public class AlignmentAnnotation
    */
   public void restrict(int startRes, int endRes)
   {
+    if (startRes<0)
+      startRes=0;
+    if (startRes>=annotations.length)
+      startRes = annotations.length-1;
+    if (endRes>=annotations.length)
+      endRes = annotations.length-1;
+    if (annotations==null)
+      return;
     Annotation[] temp = new Annotation[endRes-startRes+1];
-    System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
+    if (startRes<annotations.length)
+    {
+      System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
+    }
     if (sequenceRef!=null) {
       // Clip the mapping, if it exists.
       int spos = sequenceRef.findPosition(startRes);
@@ -361,8 +400,7 @@ public class AlignmentAnnotation
   public boolean padAnnotation(int length) {
     if (annotations==null)
     {
-      annotations = new Annotation[length];
-      return true;
+      return true; // annotation row is correct - null == not visible and undefined length
     }
     if (annotations.length<length)
     {
@@ -372,7 +410,7 @@ public class AlignmentAnnotation
       return true;
     }
     return annotations.length>length;
-    
+
   }
 
   /**
@@ -448,10 +486,13 @@ public class AlignmentAnnotation
     {
       return;
     }
-
+    sequenceRef=seqRef;
+    if (annotations==null)
+    {
+      return;
+    }
     sequenceMapping = new java.util.Hashtable();
 
-    sequenceRef = seqRef;
     int seqPos;
 
     for (int i = 0; i < annotations.length; i++)
@@ -478,6 +519,11 @@ public class AlignmentAnnotation
     if (sequenceRef==null)
       return;
 
+    if (annotations==null)
+    {
+      return;
+    }
+
     int a = 0, aSize = sequenceRef.getLength();
 
     if (aSize == 0)
@@ -508,18 +554,23 @@ public class AlignmentAnnotation
    * number of non-null annotation elements.
    * @return
    */
-  private int compactAnnotationArray() {
-    int j=0;
-    for (int i=0;i<annotations.length; i++) {
-      if (annotations[i]!=null && j!=i) {
-        annotations[j++] = annotations[i];
+  public int compactAnnotationArray() {
+    int i=0,iSize=annotations.length;
+    while (i<iSize)
+    {
+      if (annotations[i]==null) {
+        if (i+1<iSize)
+          System.arraycopy(annotations, i+1, annotations, i, iSize-i-1);
+        iSize--;
+      } else {
+        i++;
       }
     }
     Annotation[] ann = annotations;
-    annotations = new Annotation[j];
-    System.arraycopy(ann, 0, annotations, 0, j);
+    annotations = new Annotation[i];
+    System.arraycopy(ann, 0, annotations, 0, i);
     ann = null;
-    return j;
+    return iSize;
   }
 
   /**
@@ -569,4 +620,56 @@ public class AlignmentAnnotation
       sequenceRef = null;
     }
   }
+
+  /**
+   * @return the score
+   */
+  public double getScore()
+  {
+    return score;
+  }
+
+  /**
+   * @param score the score to set
+   */
+  public void setScore(double score)
+  {
+    hasScore=true;
+    this.score = score;
+  }
+  /**
+   *
+   * @return true if annotation has an associated score
+   */
+  public boolean hasScore()
+  {
+    return hasScore || !Double.isNaN(score);
+  }
+  /**
+   * Score only annotation
+   * @param label
+   * @param description
+   * @param score
+   */
+  public AlignmentAnnotation(String label, String description, double score)
+  {
+    this(label, description, null);
+    setScore(score);
+  }
+
+  public void setPadGaps(boolean padgaps, char gapchar)
+  {
+    this.padGaps = padgaps;
+    if(padgaps)
+    {
+      hasText = true;
+      for(int i=0; i<annotations.length; i++)
+      {
+        if(annotations[i]==null)
+          annotations[i] = new Annotation(String.valueOf(gapchar),null,' ',0f);
+        else if(annotations[i].displayCharacter==null ||annotations[i].displayCharacter.equals(" "))
+          annotations[i].displayCharacter=String.valueOf(gapchar);
+      }
+    }
+  }
 }