copying sequenceMapping, restrict(alstart/end) and pad(alwidth) method.
authorjprocter <Jim Procter>
Thu, 19 Apr 2007 14:54:43 +0000 (14:54 +0000)
committerjprocter <Jim Procter>
Thu, 19 Apr 2007 14:54:43 +0000 (14:54 +0000)
src/jalview/datamodel/AlignmentAnnotation.java

index 2577e71..0f2a423 100755 (executable)
@@ -20,7 +20,6 @@ package jalview.datamodel;
 
 import java.util.Enumeration;
 import java.util.Hashtable;
-import java.util.Vector;
 
 /**
  * DOCUMENT ME!
@@ -286,25 +285,34 @@ public class AlignmentAnnotation
       threshold = new GraphLine(annotation.threshold);
     }
     if (annotation.annotations!=null) {
-      Vector anvec = new Vector();
       Annotation[] ann = annotation.annotations;
       this.annotations = new Annotation[ann.length];
       for (int i=0; i<ann.length; i++) {
         annotations[i] = new Annotation(ann[i]);
-        anvec.addElement(ann[i]); // for lookup if sequenceMapping exists.
       };
       if (annotation.sequenceRef!=null) {
         this.sequenceRef = annotation.sequenceRef;
         if (annotation.sequenceMapping!=null)
         {
+          Integer p=null;
           sequenceMapping = new Hashtable();
           Enumeration pos=annotation.sequenceMapping.keys();
           while (pos.hasMoreElements()) {
-            Integer p = (Integer) pos.nextElement();
-            Annotation a = (Annotation) sequenceMapping.get(p);
-            sequenceMapping.put(p, annotations[anvec.indexOf(a)]);
+            // could optimise this!
+            p = (Integer) pos.nextElement();
+            Annotation a = (Annotation) annotation.sequenceMapping.get(p);
+            if (a==null)
+            {
+              continue;
+            }
+            for (int i=0; i<ann.length; i++)
+            {
+              if (ann[i]==a) 
+              { 
+                sequenceMapping.put(p, annotations[i]);
+              }
+            }
           }
-          anvec.removeAllElements();
         } else {
           this.sequenceMapping = null;
         }
@@ -314,6 +322,60 @@ public class AlignmentAnnotation
   }
 
   /**
+   * clip the annotation to the columns given by startRes and endRes (inclusive)
+   * and prune any existing sequenceMapping to just those columns.
+   * @param startRes
+   * @param endRes
+   */
+  public void restrict(int startRes, int endRes)
+  {
+    Annotation[] temp = new Annotation[endRes-startRes+1];
+    System.arraycopy(annotations, startRes, temp, 0, endRes-startRes+1);
+    if (sequenceRef!=null) {
+      // Clip the mapping, if it exists.
+      int spos = sequenceRef.findPosition(startRes);
+      int epos = sequenceRef.findPosition(endRes);
+      if (sequenceMapping!=null)
+      {
+        Hashtable newmapping = new Hashtable();
+        Enumeration e = sequenceMapping.keys();
+        while (e.hasMoreElements())
+        {
+          Integer pos = (Integer) e.nextElement();
+          if (pos.intValue()>=spos && pos.intValue()<=epos)
+          {
+            newmapping.put(pos, sequenceMapping.get(pos));
+          }
+        }
+        sequenceMapping.clear();
+        sequenceMapping = newmapping;
+      }
+    }
+    annotations=temp;
+  }
+  /**
+   * set the annotation row to be at least length Annotations
+   * @param length minimum number of columns required in the annotation row
+   * @return false if the annotation row is greater than length
+   */
+  public boolean padAnnotation(int length) {
+    if (annotations==null)
+    {
+      annotations = new Annotation[length];
+      return true;
+    }
+    if (annotations.length<length)
+    {
+      Annotation[] na = new Annotation[length];
+      System.arraycopy(annotations, 0, na, 0, annotations.length);
+      annotations = na;
+      return true;
+    }
+    return annotations.length>length;
+    
+  }
+
+  /**
    * DOCUMENT ME!
    *
    * @return DOCUMENT ME!
@@ -470,30 +532,40 @@ public class AlignmentAnnotation
    */
   public void setSequenceRef(SequenceI sequenceI)
   {
-    if (sequenceI!=null) {
-      if (sequenceRef!=null) {
-        if (sequenceRef!=sequenceI && !sequenceRef.equals(sequenceI)) {
+    if (sequenceI != null)
+    {
+      if (sequenceRef != null)
+      {
+        if (sequenceRef != sequenceI && !sequenceRef.equals(sequenceI) && sequenceRef.getDatasetSequence()!=sequenceI.getDatasetSequence())
+        {
+          // if sequenceRef isn't intersecting with sequenceI
           // throw away old mapping and reconstruct.
-          sequenceRef=null;
-          if (sequenceMapping!=null)
+          sequenceRef = null;
+          if (sequenceMapping != null)
           {
-            sequenceMapping=null;
+            sequenceMapping = null;
             // compactAnnotationArray();
           }
-          createSequenceMapping(sequenceI, 1,true);
+          createSequenceMapping(sequenceI, 1, true);
           adjustForAlignment();
-        } else {
+        }
+        else
+        {
           // Mapping carried over
           sequenceRef = sequenceI;
         }
-      } else {
+      }
+      else
+      {
         // No mapping exists
         createSequenceMapping(sequenceI, 1, true);
         adjustForAlignment();
       }
-    } else {
+    }
+    else
+    {
       // throw away the mapping without compacting.
-      sequenceMapping=null;
+      sequenceMapping = null;
       sequenceRef = null;
     }
   }