make 1.1 compatible
[jalview.git] / src / jalview / util / ShiftList.java
index e21392b..bcd8e7c 100644 (file)
@@ -1,25 +1,36 @@
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer\r
+ * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
+ *\r
+ * This program is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU General Public License\r
+ * as published by the Free Software Foundation; either version 2\r
+ * of the License, or (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
+ */\r
 package jalview.util;\r
 \r
+import jalview.datamodel.SequenceI;\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
+ * Now growing to be used for interval ranges (position, offset) storing deletions/insertions\r
  */\r
 public class ShiftList\r
 {\r
-    Vector shifts;\r
+    public Vector shifts;\r
   public ShiftList()\r
   {\r
     shifts = new Vector();\r
@@ -37,7 +48,7 @@ public class ShiftList
     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}, 0);\r
+      shifts.insertElementAt(new int[] { pos, shift}, sidx);\r
     else\r
       rshift[1]+=shift;\r
   }\r
@@ -70,5 +81,39 @@ public class ShiftList
   {\r
     shifts.removeAllElements();\r
   }\r
+  /**\r
+   * invert the shifts\r
+   * @return ShiftList with inverse shift operations\r
+   */\r
+  public ShiftList getInverse() {\r
+    ShiftList inverse=new ShiftList();\r
+    if (shifts!=null) {\r
+      for (int i=0,j=shifts.size(); i<j; i++) {\r
+        int[] sh=(int[]) shifts.elementAt(i);\r
+        if (sh!=null)\r
+          inverse.shifts.addElement(new int[] {sh[0], -sh[1]});\r
+      }\r
+    }\r
+    return inverse;\r
+  }\r
 \r
+  /**\r
+   * parse a 1d map of position 1<i<n to L<pos[i]<N\r
+   * such as that returned from SequenceI.gapMap()\r
+   * @param gapMap\r
+   * @return shifts from map index to mapped position\r
+   */\r
+  public static ShiftList parseMap(int[] gapMap) {\r
+    ShiftList shiftList = null;\r
+    if (gapMap!=null && gapMap.length>0) {\r
+      shiftList=new ShiftList();\r
+      for (int i=0,p=0; i<gapMap.length; p++,i++) {\r
+        if (p!=gapMap[i]) {\r
+          shiftList.addShift(p, gapMap[i]-p);\r
+          p=gapMap[i];\r
+        }\r
+      }\r
+    }\r
+    return shiftList;\r
+  }\r
 }\r