Merge branch 'develop' into alpha/JAL-3362_Jalview_212_alpha
[jalview.git] / src / jalview / analysis / AlignmentAnnotationUtils.java
index 9a49ba4..5c2d936 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9.0b2)
- * Copyright (C) 2015 The Jalview Authors
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
  * 
  * This file is part of Jalview.
  * 
@@ -75,11 +75,11 @@ public class AlignmentAnnotationUtils
      * Build a lookup, by calcId (annotation source), of all annotation types in
      * each graph group.
      */
-    Map<String, Map<Integer, List<String>>> groupLabels = new HashMap<String, Map<Integer, List<String>>>();
+    Map<String, Map<Integer, List<String>>> groupLabels = new HashMap<>();
 
     // trackers for which calcId!label combinations we have dealt with
-    List<String> addedToShown = new ArrayList<String>();
-    List<String> addedToHidden = new ArrayList<String>();
+    List<String> addedToShown = new ArrayList<>();
+    List<String> addedToHidden = new ArrayList<>();
 
     for (AlignmentAnnotation aa : annotations)
     {
@@ -91,16 +91,15 @@ public class AlignmentAnnotationUtils
       {
         continue;
       }
-      if (forSequences != null
-              && (aa.sequenceRef != null && forSequences
-                      .contains(aa.sequenceRef)))
+      if (forSequences != null && (aa.sequenceRef != null
+              && forSequences.contains(aa.sequenceRef)))
       {
         String calcId = aa.getCalcId();
 
         /*
          * Build a 'composite label' for types in line graph groups.
          */
-        final List<String> labelAsList = new ArrayList<String>();
+        final List<String> labelAsList = new ArrayList<>();
         final String displayLabel = aa.label;
         labelAsList.add(displayLabel);
         if (aa.graph == AlignmentAnnotation.LINE_GRAPH
@@ -114,8 +113,8 @@ public class AlignmentAnnotationUtils
                   .get(calcId);
           if (groupLabelsForCalcId.containsKey(aa.graphGroup))
           {
-            if (!groupLabelsForCalcId.get(aa.graphGroup).contains(
-                    displayLabel))
+            if (!groupLabelsForCalcId.get(aa.graphGroup)
+                    .contains(displayLabel))
             {
               groupLabelsForCalcId.get(aa.graphGroup).add(displayLabel);
             }
@@ -240,4 +239,42 @@ public class AlignmentAnnotationUtils
     return (anns == null ? Collections.<AlignmentAnnotation> emptyList()
             : Arrays.asList(anns));
   }
+
+  /**
+   * replace an existing sequence associated annotation with another, creating
+   * association as necessary.
+   * 
+   * @param newAnnot
+   *          - annotation row associated with a sequence to be propagated to
+   *          its reference annotation
+   * @param typeName
+   *          - label used to match existing row
+   * @param calcId
+   *          - calcId for existing row
+   */
+  public static void replaceAnnotationOnAlignmentWith(
+          AlignmentAnnotation newAnnot, String typeName, String calcId)
+  {
+    if (newAnnot.sequenceRef != null)
+    {
+      SequenceI dsseq = newAnnot.sequenceRef;
+      while (dsseq.getDatasetSequence() != null)
+      {
+        dsseq = dsseq.getDatasetSequence();
+      }
+      // look for same annotation on dataset and lift this one over
+      List<AlignmentAnnotation> dsan = dsseq.getAlignmentAnnotations(calcId,
+              typeName);
+      if (dsan != null && dsan.size() > 0)
+      {
+        for (AlignmentAnnotation dssan : dsan)
+        {
+          dsseq.removeAlignmentAnnotation(dssan);
+        }
+      }
+      AlignmentAnnotation dssan = new AlignmentAnnotation(newAnnot);
+      dsseq.addAlignmentAnnotation(dssan);
+      dssan.adjustForAlignment();
+    }
+  }
 }