remove unnecessary import
[jalview.git] / src / jalview / util / ShiftList.java
1 /*\r
2  * Jalview - A Sequence Alignment Editor and Viewer\r
3  * Copyright (C) 2006 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle\r
4  *\r
5  * This program is free software; you can redistribute it and/or\r
6  * modify it under the terms of the GNU General Public License\r
7  * as published by the Free Software Foundation; either version 2\r
8  * of the License, or (at your option) any later version.\r
9  *\r
10  * This program is distributed in the hope that it will be useful,\r
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13  * GNU General Public License for more details.\r
14  *\r
15  * You should have received a copy of the GNU General Public License\r
16  * along with this program; if not, write to the Free Software\r
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\r
18  */\r
19 package jalview.util;\r
20 \r
21 import java.util.*;\r
22 \r
23 /**\r
24  * ShiftList\r
25  * Simple way of mapping a linear series to a new linear range with new points introduced.\r
26  * Use at your own risk!\r
27  * Now growing to be used for interval ranges (position, offset) storing deletions/insertions\r
28  */\r
29 public class ShiftList\r
30 {\r
31     public Vector shifts;\r
32   public ShiftList()\r
33   {\r
34     shifts = new Vector();\r
35   }\r
36 \r
37   /**\r
38    * addShift\r
39    * @param pos start position for shift (in original reference frame)\r
40    * @param shift length of shift\r
41    */\r
42   public void addShift(int pos, int shift)\r
43   {\r
44     int sidx = 0;\r
45     int[] rshift=null;\r
46     while (sidx<shifts.size() && (rshift=(int[]) shifts.elementAt(sidx))[0]<pos)\r
47       sidx++;\r
48     if (sidx==shifts.size())\r
49       shifts.insertElementAt(new int[] { pos, shift}, sidx);\r
50     else\r
51       rshift[1]+=shift;\r
52   }\r
53 \r
54   /**\r
55    * shift\r
56    *\r
57    * @param pos int\r
58    * @return int shifted position\r
59    */\r
60   public int shift(int pos)\r
61   {\r
62     if (shifts.size()==0)\r
63       return pos;\r
64     int shifted=pos;\r
65     int sidx=0;\r
66     int rshift[];\r
67     while (sidx<shifts.size()\r
68            &&\r
69            (rshift=((int[]) shifts.elementAt(sidx++)))[0]<=pos) {\r
70       shifted += rshift[1];\r
71     }\r
72     return shifted;\r
73   }\r
74 \r
75   /**\r
76    * clear all shifts\r
77    */\r
78   public void clear()\r
79   {\r
80     shifts.removeAllElements();\r
81   }\r
82   /**\r
83    * invert the shifts\r
84    * @return ShiftList with inverse shift operations\r
85    */\r
86   public ShiftList getInverse() {\r
87     ShiftList inverse=new ShiftList();\r
88     if (shifts!=null) {\r
89       for (int i=0,j=shifts.size(); i<j; i++) {\r
90         int[] sh=(int[]) shifts.elementAt(i);\r
91         if (sh!=null)\r
92           inverse.shifts.addElement(new int[] {sh[0], -sh[1]});\r
93       }\r
94     }\r
95     return inverse;\r
96   }\r
97 \r
98   /**\r
99    * parse a 1d map of position 1<i<n to L<pos[i]<N\r
100    * such as that returned from SequenceI.gapMap()\r
101    * @param gapMap\r
102    * @return shifts from map index to mapped position\r
103    */\r
104   public static ShiftList parseMap(int[] gapMap) {\r
105     ShiftList shiftList = null;\r
106     if (gapMap!=null && gapMap.length>0) {\r
107       shiftList=new ShiftList();\r
108       for (int i=0,p=0; i<gapMap.length; p++,i++) {\r
109         if (p!=gapMap[i]) {\r
110           shiftList.addShift(p, gapMap[i]-p);\r
111           p=gapMap[i];\r
112         }\r
113       }\r
114     }\r
115     return shiftList;\r
116   }\r
117 }\r