Merge branch 'feature/JAL-674_dssp' into features/JAL-1264_showHideAnnotations
[jalview.git] / src / jalview / datamodel / AlignmentAnnotation.java
index 601339a..012ecb3 100755 (executable)
@@ -28,6 +28,8 @@ import jalview.analysis.WUSSParseException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.Hashtable;
+import java.util.Map;
+import java.util.Map.Entry;
 
 import fr.orsay.lri.varna.models.rna.RNA;
 
@@ -105,7 +107,7 @@ public class AlignmentAnnotation
     // System.out.println("featuregroup " + _rnasecstr[0].getFeatureGroup());
   }
 
-  public java.util.Hashtable sequenceMapping;
+  public java.util.Hashtable<Integer, Annotation> sequenceMapping;
 
   /** DOCUMENT ME!! */
   public float graphMin;
@@ -947,10 +949,14 @@ public class AlignmentAnnotation
     {
       if (sequenceRef != null)
       {
+        boolean rIsDs=sequenceRef.getDatasetSequence()==null,tIsDs=sequenceI.getDatasetSequence()==null;
         if (sequenceRef != sequenceI
-                && !sequenceRef.equals(sequenceI)
-                && sequenceRef.getDatasetSequence() != sequenceI
+                && (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
           // throw away old mapping and reconstruct.
@@ -1117,4 +1123,50 @@ public class AlignmentAnnotation
   {
     return isrna;
   }
+
+  /**
+   * transfer annotation to the given sequence using the given mapping from the
+   * current positions or an existing sequence mapping
+   * 
+   * @param sq
+   * @param sp2sq
+   *          map involving sq as To or From
+   */
+  public void liftOver(SequenceI sq, Mapping sp2sq)
+  {
+    if (sp2sq.getMappedWidth() != sp2sq.getWidth())
+    {
+      // TODO: employ getWord/MappedWord to transfer annotation between cDNA and Protein reference frames
+      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;
+
+    // TODO build a better annotation element map and get rid of annotations[]
+    Hashtable<Integer, Annotation> mapForsq = new Hashtable();
+    if (sequenceMapping != null)
+    {
+      if (sp2sq != null)
+      {
+        for (Entry<Integer, Annotation> ie : sequenceMapping.entrySet())
+        {
+          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());
+          }
+        }
+        sequenceMapping = mapForsq;
+        sequenceRef = sq;
+        adjustForAlignment();
+      }
+      else
+      {
+        // trim positions
+      }
+    }
+
+  }
 }