safer retrieval of groovy scripts from URLs
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index acb02b1..40d2b7e 100755 (executable)
@@ -57,7 +57,7 @@ public class AlignmentAnnotation
   /**
    * Score associated with label and description.
    */
-  public float score= Float.NaN;
+  public double score= Double.NaN;
   /**
    * flag indicating if annotation has a score.
    */
@@ -88,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;
 
@@ -118,10 +118,9 @@ public class AlignmentAnnotation
   /**
    * Creates a new AlignmentAnnotation object.
    *
-   * @param label DOCUMENT ME!
-   * @param description DOCUMENT ME!
-   * @param annotations DOCUMENT ME!about:blank
-Loading...
+   * @param label short label shown under sequence labels
+   * @param description text displayed on mouseover
+   * @param annotations set of positional annotation elements
    */
   public AlignmentAnnotation(String label, String description,
                              Annotation[] annotations)
@@ -138,11 +137,11 @@ Loading...
   void areLabelsSecondaryStructure()
   {
     boolean nonSSLabel = false;
+    char firstChar=0;
     for (int i = 0; i < annotations.length; i++)
     {
       if (annotations[i] == null)
       {
-        padGaps = false;
         continue;
       }
       if (annotations[i].secondaryStructure == 'H' ||
@@ -152,29 +151,35 @@ Loading...
       }
 
       if(annotations[i].displayCharacter==null)
+      {
         continue;
-
-
-      if (annotations[i].displayCharacter.length() == 1
-          && !annotations[i].displayCharacter.equals("H")
-          && !annotations[i].displayCharacter.equals("E")
-          && !annotations[i].displayCharacter.equals("-")
-          && !annotations[i].displayCharacter.equals("."))
+      }
+      if (annotations[i].displayCharacter.length() == 1)
+      {      
+        firstChar = annotations[i].displayCharacter.charAt(0);
+        // check to see if it looks like a sequence or is secondary structure labelling.
+        if (
+                // Uncomment to only catch case where displayCharacter==secondary Structure 
+              // to correctly redisplay SS annotation imported from Stockholm, exported to JalviewXML and read back in again.
+          // && annotations[i].displayCharacter.charAt(0)==annotations[i].secondaryStructure
+          firstChar!='H'
+          && firstChar!='E'
+          && firstChar!='-'
+          && firstChar!='-' && firstChar<jalview.schemes.ResidueProperties.aaIndex.length)
         {
           if (jalview.schemes.ResidueProperties.aaIndex
-                  [annotations[i].displayCharacter.charAt(0)] < 23)
+                  [firstChar] < 23)
           {
             nonSSLabel = true;
           }
         }
+      }
 
-        if (annotations[i].displayCharacter.length() > 0)
-        {
-          hasText = true;
-        }
-        else
-          padGaps = false;
+      if (annotations[i].displayCharacter.length() > 0)
+      {
+        hasText = true;
       }
+    }
 
     if (nonSSLabel)
     {
@@ -360,11 +365,22 @@ Loading...
   public void restrict(int startRes, int endRes)
   {
     if (annotations==null)
+    {
+      // non-positional
+      return;
+    }
+    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];
     if (startRes<annotations.length)
     {
-      System.arraycopy(annotations, startRes, temp, 0, Math.min(endRes, annotations.length-1)-startRes+1);
+      System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
     }
     if (sequenceRef!=null) {
       // Clip the mapping, if it exists.
@@ -396,8 +412,7 @@ Loading...
   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)
     {
@@ -483,13 +498,13 @@ Loading...
     {
       return;
     }
+    sequenceRef=seqRef;
     if (annotations==null)
     {
       return;
     }
     sequenceMapping = new java.util.Hashtable();
 
-    sequenceRef = seqRef;
     int seqPos;
 
     for (int i = 0; i < annotations.length; i++)
@@ -551,18 +566,23 @@ Loading...
    * 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;
   }
 
   /**
@@ -616,7 +636,7 @@ Loading...
   /**
    * @return the score
    */
-  public float getScore()
+  public double getScore()
   {
     return score;
   }
@@ -624,8 +644,9 @@ Loading...
   /**
    * @param score the score to set
    */
-  public void setScore(float score)
+  public void setScore(double score)
   {
+    hasScore=true;
     this.score = score;
   }
   /**
@@ -634,6 +655,48 @@ Loading...
    */
   public boolean hasScore()
   {
-    return 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);
+  }
+  /**
+   * copy constructor with edit based on the hidden columns marked in colSel
+   * @param alignmentAnnotation
+   * @param colSel
+   */
+  public AlignmentAnnotation(AlignmentAnnotation alignmentAnnotation,
+          ColumnSelection colSel)
+  {
+    this(alignmentAnnotation);
+    if (annotations==null)
+    {
+      return;
+    }
+    colSel.makeVisibleAnnotation(this);
+  }
+
+  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);
+      }
+    }
   }
 }