apply jalview code style
[jalview.git] / src / jalview / util / ShiftList.java
index 905b098..7b13045 100644 (file)
@@ -1,25 +1,33 @@
+/*\r
+ * Jalview - A Sequence Alignment Editor and Viewer (Version 2.6)\r
+ * Copyright (C) 2010 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle\r
+ * \r
+ * This file is part of Jalview.\r
+ * \r
+ * Jalview 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 3 of the License, or (at your option) any later version.\r
+ * \r
+ * Jalview is distributed in the hope that it will be useful, but \r
+ * WITHOUT ANY WARRANTY; without even the implied warranty \r
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR \r
+ * PURPOSE.  See the GNU General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU General Public License along with Jalview.  If not, see <http://www.gnu.org/licenses/>.\r
+ */\r
 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
+ * ShiftList Simple way of mapping a linear series to a new linear range with\r
+ * new points introduced. Use at your own risk! Now growing to be used for\r
+ * interval ranges (position, offset) storing deletions/insertions\r
  */\r
 public class ShiftList\r
 {\r
-    Vector shifts;\r
+  public Vector shifts;\r
+\r
   public ShiftList()\r
   {\r
     shifts = new Vector();\r
@@ -27,37 +35,51 @@ public class ShiftList
 \r
   /**\r
    * addShift\r
-   * @param pos start position for shift (in original reference frame)\r
-   * @param shift length of shift\r
+   * \r
+   * @param pos\r
+   *          start position for shift (in original reference frame)\r
+   * @param shift\r
+   *          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
+    int[] rshift = null;\r
+    while (sidx < shifts.size()\r
+            && (rshift = (int[]) shifts.elementAt(sidx))[0] < pos)\r
+    {\r
       sidx++;\r
-    if (sidx==shifts.size())\r
-      shifts.insertElementAt(new int[] { pos, shift}, sidx);\r
+    }\r
+    if (sidx == shifts.size())\r
+    {\r
+      shifts.insertElementAt(new int[]\r
+      { pos, shift }, sidx);\r
+    }\r
     else\r
-      rshift[1]+=shift;\r
+    {\r
+      rshift[1] += shift;\r
+    }\r
   }\r
 \r
   /**\r
    * shift\r
-   *\r
-   * @param pos int\r
+   * \r
+   * @param pos\r
+   *          int\r
    * @return int shifted position\r
    */\r
   public int shift(int pos)\r
   {\r
-    if (shifts.size()==0)\r
+    if (shifts.size() == 0)\r
+    {\r
       return pos;\r
-    int shifted=pos;\r
-    int sidx=0;\r
+    }\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
+    while (sidx < shifts.size()\r
+            && (rshift = ((int[]) shifts.elementAt(sidx++)))[0] <= pos)\r
+    {\r
       shifted += rshift[1];\r
     }\r
     return shifted;\r
@@ -71,4 +93,51 @@ public class ShiftList
     shifts.removeAllElements();\r
   }\r
 \r
+  /**\r
+   * invert the shifts\r
+   * \r
+   * @return ShiftList with inverse shift operations\r
+   */\r
+  public ShiftList getInverse()\r
+  {\r
+    ShiftList inverse = new ShiftList();\r
+    if (shifts != null)\r
+    {\r
+      for (int i = 0, j = shifts.size(); i < j; i++)\r
+      {\r
+        int[] sh = (int[]) shifts.elementAt(i);\r
+        if (sh != null)\r
+        {\r
+          inverse.shifts.addElement(new int[]\r
+          { sh[0], -sh[1] });\r
+        }\r
+      }\r
+    }\r
+    return inverse;\r
+  }\r
+\r
+  /**\r
+   * parse a 1d map of position 1<i<n to L<pos[i]<N such as that returned from\r
+   * SequenceI.gapMap()\r
+   * \r
+   * @param gapMap\r
+   * @return shifts from map index to mapped position\r
+   */\r
+  public static ShiftList parseMap(int[] gapMap)\r
+  {\r
+    ShiftList shiftList = null;\r
+    if (gapMap != null && gapMap.length > 0)\r
+    {\r
+      shiftList = new ShiftList();\r
+      for (int i = 0, p = 0; i < gapMap.length; p++, i++)\r
+      {\r
+        if (p != gapMap[i])\r
+        {\r
+          shiftList.addShift(p, gapMap[i] - p);\r
+          p = gapMap[i];\r
+        }\r
+      }\r
+    }\r
+    return shiftList;\r
+  }\r
 }\r