inverse ShiftList and SequenceI.gapMap->ShiftList methods.
[jalview.git] / src / jalview / util / ShiftList.java
index 905b098..78b99ef 100644 (file)
-package jalview.util;\r
-\r
-import java.util.*;\r
-\r
-/**\r
- * ShiftList\r
- * Simple way of mapping a linear series to a new linear range with new points introduced.\r
- * Use at your own risk!\r
- * <p>Title: ShiftList</p>\r
- *\r
- * <p>Description: </p>\r
- *\r
- * <p>Copyright: Copyright (c) 2004</p>\r
- *\r
- * <p>Company: Dundee University</p>\r
- *\r
- * @author not attributable\r
- * @version 1.0\r
- */\r
-public class ShiftList\r
-{\r
-    Vector shifts;\r
-  public ShiftList()\r
-  {\r
-    shifts = new Vector();\r
-  }\r
-\r
-  /**\r
-   * addShift\r
-   * @param pos start position for shift (in original reference frame)\r
-   * @param shift length of shift\r
-   */\r
-  public void addShift(int pos, int shift)\r
-  {\r
-    int sidx = 0;\r
-    int[] rshift=null;\r
-    while (sidx<shifts.size() && (rshift=(int[]) shifts.elementAt(sidx))[0]<pos)\r
-      sidx++;\r
-    if (sidx==shifts.size())\r
-      shifts.insertElementAt(new int[] { pos, shift}, sidx);\r
-    else\r
-      rshift[1]+=shift;\r
-  }\r
-\r
-  /**\r
-   * shift\r
-   *\r
-   * @param pos int\r
-   * @return int shifted position\r
-   */\r
-  public int shift(int pos)\r
-  {\r
-    if (shifts.size()==0)\r
-      return pos;\r
-    int shifted=pos;\r
-    int sidx=0;\r
-    int rshift[];\r
-    while (sidx<shifts.size()\r
-           &&\r
-           (rshift=((int[]) shifts.elementAt(sidx++)))[0]<=pos) {\r
-      shifted += rshift[1];\r
-    }\r
-    return shifted;\r
-  }\r
-\r
-  /**\r
-   * clear all shifts\r
-   */\r
-  public void clear()\r
-  {\r
-    shifts.removeAllElements();\r
-  }\r
-\r
-}\r
+package jalview.util;
+
+import jalview.datamodel.SequenceI;
+
+import java.util.*;
+
+/**
+ * ShiftList
+ * Simple way of mapping a linear series to a new linear range with new points introduced.
+ * Use at your own risk!
+ * <p>Title: ShiftList</p>
+ *
+ * <p>Description: </p>
+ *
+ * <p>Copyright: Copyright (c) 2004</p>
+ *
+ * <p>Company: Dundee University</p>
+ *
+ * @author not attributable
+ * @version 1.0
+ */
+public class ShiftList
+{
+    public Vector shifts;
+  public ShiftList()
+  {
+    shifts = new Vector();
+  }
+
+  /**
+   * addShift
+   * @param pos start position for shift (in original reference frame)
+   * @param shift length of shift
+   */
+  public void addShift(int pos, int shift)
+  {
+    int sidx = 0;
+    int[] rshift=null;
+    while (sidx<shifts.size() && (rshift=(int[]) shifts.elementAt(sidx))[0]<pos)
+      sidx++;
+    if (sidx==shifts.size())
+      shifts.insertElementAt(new int[] { pos, shift}, sidx);
+    else
+      rshift[1]+=shift;
+  }
+
+  /**
+   * shift
+   *
+   * @param pos int
+   * @return int shifted position
+   */
+  public int shift(int pos)
+  {
+    if (shifts.size()==0)
+      return pos;
+    int shifted=pos;
+    int sidx=0;
+    int rshift[];
+    while (sidx<shifts.size()
+           &&
+           (rshift=((int[]) shifts.elementAt(sidx++)))[0]<=pos) {
+      shifted += rshift[1];
+    }
+    return shifted;
+  }
+
+  /**
+   * clear all shifts
+   */
+  public void clear()
+  {
+    shifts.removeAllElements();
+  }
+  /**
+   * invert the shifts
+   * @return ShiftList with inverse shift operations
+   */
+  public ShiftList getInverse() {
+    ShiftList inverse=new ShiftList();
+    if (shifts!=null) {
+      for (int i=0,j=shifts.size(); i<j; i++) {
+        int[] sh=(int[]) shifts.get(i);
+        if (sh!=null)
+          inverse.shifts.add(new int[] {sh[0], -sh[1]});
+      }
+    }
+    return inverse;
+  }
+
+  /**
+   * parse a 1d map of position 1<i<n to L<pos[i]<N
+   * such as that returned from SequenceI.gapMap() 
+   * @param gapMap
+   * @return
+   */
+  public static ShiftList parseMap(int[] gapMap) {
+    ShiftList shiftList = null;
+    if (gapMap!=null && gapMap.length>0) {
+      shiftList=new ShiftList();
+      
+      for (int i=0,p=0; i<gapMap.length; p++,i++) {
+        if (p!=gapMap[i]) {
+          shiftList.addShift(p, gapMap[i]-p);
+          p=gapMap[i];
+        }
+      }
+    }
+    return shiftList;
+  }
+}