moving word methods to MapList and begin bug-fix for single-residue codon span featur...
[jalview.git] / src / jalview / util / MapList.java
index 4a59f88..826ead7 100644 (file)
@@ -31,13 +31,6 @@ import java.util.*;
 public class MapList
 {
   /* (non-Javadoc)
-   * @see java.lang.Object#clone()
-   */
-  protected Object clone() throws CloneNotSupportedException {
-    // TODO Auto-generated method stub
-    return super.clone();
-  }
-  /* (non-Javadoc)
    * @see java.lang.Object#equals(java.lang.Object)
    */
   public boolean equals(MapList obj) {
@@ -131,6 +124,37 @@ public class MapList
     this.fromRatio=fromRatio;
     this.toRatio=toRatio;
   }
+  public MapList(MapList map)
+  {
+    this.fromRange = new int[]
+    { map.fromRange[0], map.fromRange[1] };
+    this.toRange = new int[]
+    { map.toRange[0], map.toRange[1] };
+    this.fromRatio = map.fromRatio;
+    this.toRatio = map.toRatio;
+    if (map.fromShifts != null)
+    {
+      this.fromShifts = new Vector();
+      Enumeration e = map.fromShifts.elements();
+      while (e.hasMoreElements())
+      {
+        int[] el = (int[]) e.nextElement();
+        fromShifts.addElement(new int[]
+        { el[0], el[1] });
+      }
+    }
+    if (map.toShifts != null)
+    {
+      this.toShifts = new Vector();
+      Enumeration e = map.toShifts.elements();
+      while (e.hasMoreElements())
+      {
+        int[] el = (int[]) e.nextElement();
+        toShifts.addElement(new int[]
+        { el[0], el[1] });
+      }
+    }
+  }
   /**
    * get all mapped positions from 'from' to 'to'
    * @return int[][] { int[] { fromStart, fromFinish, toStart, toFinish }, int [fromFinish-fromStart+2] { toStart..toFinish mappings}}
@@ -393,7 +417,7 @@ public class MapList
   public int[] locateInFrom(int start, int end) {
     // inefficient implementation
     int fromStart[] = shiftTo(start);
-    int fromEnd[] = shiftTo(end);
+    int fromEnd[] = shiftTo(end); // needs to be inclusive of end of symbol position
     if (fromStart==null || fromEnd==null)
       return null;
     int iv[] = getIntervals(fromShifts, fromStart, fromEnd,fromRatio);
@@ -426,9 +450,11 @@ public class MapList
    */
   private int[] getIntervals(Vector fromShifts2, int[] fromStart, int[] fromEnd, int fromRatio2)
   {
-    // correct for word direction for start and end
-    int startpos = fromStart[0]+fromStart[2]*(fromRatio2-1);
-    int endpos = fromEnd[0]+fromEnd[2]*(fromRatio2-1);
+    // TODO: correct for word boundary w.r.t. fromStart->fromEnd direction for startpos and endpos.
+    // test is (1,8,12,17) to (1,5) and features on to : 2,2; 3,3; 4,3; 3,4; 4,4; 5,3; 3,5; 2,4; 4,2;
+    // correct for word direction for start and end :
+    int startpos = fromStart[0]+fromStart[2]*(fromRatio2-1); // Math.min(fromStart[0], .. );
+    int endpos = fromEnd[0]+fromEnd[2]*(fromRatio2-1); // Math.max(fromEnd[0],);
     int intv=0,intvSize= fromShifts2.size();
     int iv[],i=0,fs=-1,fe=-1; // containing intervals
     while (intv<intvSize && (fs==-1 || fe==-1)) {
@@ -513,6 +539,56 @@ public class MapList
     return range;
   }
   /**
+ * get the 'initial' position of mpos in To
+ * @param mpos position in from
+ * @return position of first word in to reference frame
+ */
+public int getToPosition(int mpos)
+{
+  int[] mp = shiftTo(mpos);
+  if (mp!=null)
+  {
+    return mp[0];
+  }
+  return mpos;
+}
+/**
+ * get range of positions in To frame for the mpos word in From
+ * @param mpos position in From
+ * @return null or int[] first position in To for mpos, last position in to for Mpos
+ */
+public int[] getToWord(int mpos) {
+  int[] mp=shiftTo(mpos);
+  if (mp!=null) {
+      return new int[] {mp[0], mp[0]+mp[2]*(getFromRatio()-1)};
+  }
+  return null;
+}
+/**
+ * get From position in the associated
+ * reference frame for position pos in the
+ * associated sequence.
+ * @param pos
+ * @return
+ */
+public int getMappedPosition(int pos) {
+  int[] mp = shiftFrom(pos);
+  if (mp!=null)
+  {
+    return mp[0];
+  }
+  return pos;
+}
+public int[] getMappedWord(int pos) {
+  int[] mp = shiftFrom(pos);
+  if (mp!=null)
+  {
+    return new int[] { mp[0], mp[0]+mp[2]*(getToRatio()-1)};
+  }
+  return null;
+}
+
+  /**
    * test routine. not incremental.
    * @param ml
    * @param fromS
@@ -577,7 +653,7 @@ public class MapList
     System.out.print("\nTest locateInFrom\n");
     {
       int f=mmap[0][2],t=mmap[0][3];
-      while (f<t) {
+      while (f<=t) {
         System.out.println("Range "+f+" to "+t);
         int rng[] = ml.locateInFrom(f,t);
         if (rng!=null)
@@ -635,7 +711,7 @@ public class MapList
     System.out.print("\nTest locateInTo\n");
     {
       int f=mmap[0][2],t=mmap[0][3];
-      while (f<t) {
+      while (f<=t) {
         System.out.println("Range "+f+" to "+t);
         int rng[] = ml.locateInTo(f,t);
         if (rng!=null) {