JAL-2069 spike updated with latest (FeatureTypeSettings)
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index bbd3ce4..f7bf4d8 100755 (executable)
@@ -24,6 +24,7 @@ import jalview.analysis.Rna;
 import jalview.analysis.SecStrConsensus.SimpleBP;
 import jalview.analysis.WUSSParseException;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -96,14 +97,13 @@ public class AlignmentAnnotation
    * Updates the _rnasecstr field Determines the positions that base pair and
    * the positions of helices based on secondary structure from a Stockholm file
    * 
-   * @param RNAannot
+   * @param rnaAnnotation
    */
-  private void _updateRnaSecStr(CharSequence RNAannot)
+  private void _updateRnaSecStr(CharSequence rnaAnnotation)
   {
     try
     {
-      bps = Rna.getModeleBP(RNAannot);
-      _rnasecstr = Rna.getBasePairs(bps);
+      _rnasecstr = Rna.getHelixMap(rnaAnnotation);
       invalidrnastruc = -1;
     } catch (WUSSParseException px)
     {
@@ -114,8 +114,6 @@ public class AlignmentAnnotation
     {
       return;
     }
-    Rna.HelixMap(_rnasecstr);
-    // setRNAStruc(RNAannot);
 
     if (_rnasecstr != null && _rnasecstr.length > 0)
     {
@@ -244,19 +242,6 @@ public class AlignmentAnnotation
 
   private boolean isrna;
 
-  /*
-   * (non-Javadoc)
-   * 
-   * @see java.lang.Object#finalize()
-   */
-  @Override
-  protected void finalize() throws Throwable
-  {
-    sequenceRef = null;
-    groupRef = null;
-    super.finalize();
-  }
-
   public static int getGraphValueFromString(String string)
   {
     if (string.equalsIgnoreCase("BAR_GRAPH"))
@@ -273,12 +258,6 @@ public class AlignmentAnnotation
     }
   }
 
-  // JBPNote: what does this do ?
-  public void ConcenStru(CharSequence RNAannot) throws WUSSParseException
-  {
-    bps = Rna.getModeleBP(RNAannot);
-  }
-
   /**
    * Creates a new AlignmentAnnotation object.
    * 
@@ -379,49 +358,25 @@ public class AlignmentAnnotation
         firstChar = annotations[i].displayCharacter.charAt(0);
         // check to see if it looks like a sequence or is secondary structure
         // labelling.
-        if (annotations[i].secondaryStructure != ' '
-                && !hasIcons
-                &&
-                // 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 != ' '
-                && firstChar != '$'
-                && firstChar != 0xCE
-                && firstChar != '('
-                && firstChar != '['
-                && firstChar != '>'
-                && firstChar != '{'
-                && firstChar != 'A'
-                && firstChar != 'B'
-                && firstChar != 'C'
-                && firstChar != 'D'
-                && firstChar != 'E'
-                && firstChar != 'F'
-                && firstChar != 'G'
-                && firstChar != 'H'
-                && firstChar != 'I'
-                && firstChar != 'J'
-                && firstChar != 'K'
-                && firstChar != 'L'
-                && firstChar != 'M'
-                && firstChar != 'N'
-                && firstChar != 'O'
-                && firstChar != 'P'
-                && firstChar != 'Q'
-                && firstChar != 'R'
-                && firstChar != 'S'
-                && firstChar != 'T'
-                && firstChar != 'U'
-                && firstChar != 'V'
-                && firstChar != 'W'
-                && firstChar != 'X'
-                && firstChar != 'Y'
-                && firstChar != 'Z'
+        if (annotations[i].secondaryStructure != ' ' && !hasIcons &&
+        // 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 != ' ' && firstChar != '$' && firstChar != 0xCE
+                && firstChar != '(' && firstChar != '[' && firstChar != '>'
+                && firstChar != '{' && firstChar != 'A' && firstChar != 'B'
+                && firstChar != 'C' && firstChar != 'D' && firstChar != 'E'
+                && firstChar != 'F' && firstChar != 'G' && firstChar != 'H'
+                && firstChar != 'I' && firstChar != 'J' && firstChar != 'K'
+                && firstChar != 'L' && firstChar != 'M' && firstChar != 'N'
+                && firstChar != 'O' && firstChar != 'P' && firstChar != 'Q'
+                && firstChar != 'R' && firstChar != 'S' && firstChar != 'T'
+                && firstChar != 'U' && firstChar != 'V' && firstChar != 'W'
+                && firstChar != 'X' && firstChar != 'Y' && firstChar != 'Z'
                 && firstChar != '-'
                 && firstChar < jalview.schemes.ResidueProperties.aaIndex.length)
         {
@@ -512,12 +467,17 @@ public class AlignmentAnnotation
     {
       return ((index + offset < 0) || (index + offset) >= max
               || annotations[index + offset] == null
-              || (annotations[index + offset].secondaryStructure <= ' ') ? ' '
-              : annotations[index + offset].displayCharacter == null
-                      || annotations[index + offset].displayCharacter
-                              .length() == 0 ? annotations[index + offset].secondaryStructure
-                      : annotations[index + offset].displayCharacter
-                              .charAt(0));
+              || (annotations[index + offset].secondaryStructure <= ' ')
+                      ? ' '
+                      : annotations[index + offset].displayCharacter == null
+                              || annotations[index
+                                      + offset].displayCharacter
+                                              .length() == 0
+                                                      ? annotations[index
+                                                              + offset].secondaryStructure
+                                                      : annotations[index
+                                                              + offset].displayCharacter
+                                                                      .charAt(0));
     }
 
     @Override
@@ -528,10 +488,15 @@ public class AlignmentAnnotation
 
       for (int i = offset; i < mx; i++)
       {
-        string[i] = (annotations[i] == null || (annotations[i].secondaryStructure <= 32)) ? ' '
-                : (annotations[i].displayCharacter == null
-                        || annotations[i].displayCharacter.length() == 0 ? annotations[i].secondaryStructure
-                        : annotations[i].displayCharacter.charAt(0));
+        string[i] = (annotations[i] == null
+                || (annotations[i].secondaryStructure <= 32))
+                        ? ' '
+                        : (annotations[i].displayCharacter == null
+                                || annotations[i].displayCharacter
+                                        .length() == 0
+                                                ? annotations[i].secondaryStructure
+                                                : annotations[i].displayCharacter
+                                                        .charAt(0));
       }
       return new String(string);
     }
@@ -807,8 +772,8 @@ public class AlignmentAnnotation
     Annotation[] temp = new Annotation[endRes - startRes + 1];
     if (startRes < annotations.length)
     {
-      System.arraycopy(annotations, startRes, temp, 0, endRes - startRes
-              + 1);
+      System.arraycopy(annotations, startRes, temp, 0,
+              endRes - startRes + 1);
     }
     if (sequenceRef != null)
     {
@@ -867,6 +832,10 @@ public class AlignmentAnnotation
   @Override
   public String toString()
   {
+    if (annotations == null)
+    {
+      return "";
+    }
     StringBuilder buffer = new StringBuilder(256);
 
     for (int i = 0; i < annotations.length; i++)
@@ -1024,8 +993,8 @@ public class AlignmentAnnotation
       {
         if (i + 1 < iSize)
         {
-          System.arraycopy(annotations, i + 1, annotations, i, iSize - i
-                  - 1);
+          System.arraycopy(annotations, i + 1, annotations, i,
+                  iSize - i - 1);
         }
         iSize--;
       }
@@ -1057,14 +1026,16 @@ public class AlignmentAnnotation
     {
       if (sequenceRef != null)
       {
-        boolean rIsDs = sequenceRef.getDatasetSequence() == null, tIsDs = sequenceI
-                .getDatasetSequence() == null;
+        boolean rIsDs = sequenceRef.getDatasetSequence() == null,
+                tIsDs = sequenceI.getDatasetSequence() == null;
         if (sequenceRef != sequenceI
-                && (rIsDs && !tIsDs && sequenceRef != sequenceI
-                        .getDatasetSequence())
-                && (!rIsDs && tIsDs && sequenceRef.getDatasetSequence() != sequenceI)
-                && (!rIsDs && !tIsDs && sequenceRef.getDatasetSequence() != sequenceI
-                        .getDatasetSequence())
+                && (rIsDs && !tIsDs
+                        && sequenceRef != sequenceI.getDatasetSequence())
+                && (!rIsDs && tIsDs
+                        && sequenceRef.getDatasetSequence() != sequenceI)
+                && (!rIsDs && !tIsDs
+                        && sequenceRef.getDatasetSequence() != sequenceI
+                                .getDatasetSequence())
                 && !sequenceRef.equals(sequenceI))
         {
           // if sequenceRef isn't intersecting with sequenceI
@@ -1146,14 +1117,14 @@ public class AlignmentAnnotation
    * @param colSel
    */
   public AlignmentAnnotation(AlignmentAnnotation alignmentAnnotation,
-          ColumnSelection colSel)
+          HiddenColumns hidden)
   {
     this(alignmentAnnotation);
     if (annotations == null)
     {
       return;
     }
-    colSel.makeVisibleAnnotation(this);
+    hidden.makeVisibleAnnotation(this);
   }
 
   public void setPadGaps(boolean padgaps, char gapchar)
@@ -1259,8 +1230,10 @@ public class AlignmentAnnotation
       throw new Error(
               "liftOver currently not implemented for transfer of annotation between different types of seqeunce");
     }
-    boolean mapIsTo = (sp2sq != null) ? (sp2sq.getTo() == sq || sp2sq
-            .getTo() == sq.getDatasetSequence()) : false;
+    boolean mapIsTo = (sp2sq != null)
+            ? (sp2sq.getTo() == sq
+                    || sp2sq.getTo() == sq.getDatasetSequence())
+            : false;
 
     // TODO build a better annotation element map and get rid of annotations[]
     Map<Integer, Annotation> mapForsq = new HashMap<Integer, Annotation>();
@@ -1270,9 +1243,9 @@ public class AlignmentAnnotation
       {
         for (Entry<Integer, Annotation> ie : sequenceMapping.entrySet())
         {
-          Integer mpos = Integer.valueOf(mapIsTo ? sp2sq
-                  .getMappedPosition(ie.getKey()) : sp2sq.getPosition(ie
-                  .getKey()));
+          Integer mpos = Integer
+                  .valueOf(mapIsTo ? sp2sq.getMappedPosition(ie.getKey())
+                          : sp2sq.getPosition(ie.getKey()));
           if (mpos >= sq.getStart() && mpos <= sq.getEnd())
           {
             mapForsq.put(mpos, ie.getValue());
@@ -1459,8 +1432,8 @@ public class AlignmentAnnotation
        * up to and excluding the target column; if the count is less
        * than 1, the opening bracket is unmatched, so return its match
        */
-      String closer = String.valueOf(Rna
-              .getMatchingClosingParenthesis(symbol));
+      String closer = String
+              .valueOf(Rna.getMatchingClosingParenthesis(symbol));
       String opener = String.valueOf(symbol);
       int count = 0;
       for (int j = col + 1; j < column; j++)
@@ -1490,4 +1463,80 @@ public class AlignmentAnnotation
   {
     return counter++;
   }
+
+  /**
+   * 
+   * @return true for rows that have a range of values in their annotation set
+   */
+  public boolean isQuantitative()
+  {
+    return graphMin < graphMax;
+  }
+
+  public static Iterable<AlignmentAnnotation> findAnnotations(
+          Iterable<AlignmentAnnotation> list, SequenceI seq, String calcId,
+          String label)
+  {
+
+    ArrayList<AlignmentAnnotation> aa = new ArrayList<>();
+    for (AlignmentAnnotation ann : list)
+    {
+      if ((calcId == null || (ann.getCalcId() != null
+              && ann.getCalcId().equals(calcId)))
+              && (seq == null || (ann.sequenceRef != null
+                      && ann.sequenceRef == seq))
+              && (label == null
+                      || (ann.label != null && ann.label.equals(label))))
+      {
+        aa.add(ann);
+      }
+    }
+    return aa;
+  }
+
+  /**
+   * Answer true if any annotation matches the calcId passed in (if not null).
+   * 
+   * @param list
+   *          annotation to search
+   * @param calcId
+   * @return
+   */
+  public static boolean hasAnnotation(List<AlignmentAnnotation> list,
+          String calcId)
+  {
+
+    if (calcId != null && !"".equals(calcId))
+    {
+      for (AlignmentAnnotation a : list)
+      {
+        if (a.getCalcId() == calcId)
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  public static Iterable<AlignmentAnnotation> findAnnotation(
+          List<AlignmentAnnotation> list, String calcId)
+  {
+
+    List<AlignmentAnnotation> aa = new ArrayList<>();
+    if (calcId == null)
+    {
+      return aa;
+    }
+    for (AlignmentAnnotation a : list)
+    {
+
+      if (a.getCalcId() == calcId || (a.getCalcId() != null
+              && calcId != null && a.getCalcId().equals(calcId)))
+      {
+        aa.add(a);
+      }
+    }
+    return aa;
+  }
 }