JAL-3070 JAL-3066 AlignmentI.findOrAddAnnotation(AlignmentAnnotation ala) - calls...
[jalview.git] / src / jalview / analysis / AlignmentAnnotationUtils.java
index 5cf7f08..194ef80 100644 (file)
@@ -91,9 +91,8 @@ 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();
 
@@ -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 an alignment sequence to be
+   *          propagated to its dataset sequence.
+   * @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.getDatasetSequence();
+      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();
+    }
+  }
 }