d30003dd45822cf9d25fb79ffe09a4ddcbe272f6
[jalview.git] / src / jalview / datamodel / Sequence.java
1 /*\r
2 * Jalview - A Sequence Alignment Editor and Viewer\r
3 * Copyright (C) 2005 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.datamodel;\r
20 \r
21 import java.awt.*;\r
22 \r
23 import java.util.*;\r
24 \r
25 \r
26 /**\r
27  * DOCUMENT ME!\r
28  *\r
29  * @author $author$\r
30  * @version $Revision$\r
31  */\r
32 public class Sequence implements SequenceI\r
33 {\r
34     protected String name;\r
35     protected String sequence;\r
36     protected String description;\r
37     protected int start;\r
38     protected int end;\r
39     protected String displayId;\r
40     protected Color color = Color.white;\r
41     String pdbId;\r
42 \r
43     /** DOCUMENT ME!! */\r
44     public Vector sequenceFeatures = new Vector();\r
45 \r
46     /**\r
47      * Creates a new Sequence object.\r
48      *\r
49      * @param name DOCUMENT ME!\r
50      * @param sequence DOCUMENT ME!\r
51      * @param start DOCUMENT ME!\r
52      * @param end DOCUMENT ME!\r
53      */\r
54     public Sequence(String name, String sequence, int start, int end)\r
55     {\r
56       this.name = name;\r
57       this.sequence = sequence;\r
58       this.start = start;\r
59       this.end = end;\r
60 \r
61       if (end < 1)\r
62       {\r
63         int endRes = 0;\r
64         char ch;\r
65         for (int j = 0; j < sequence.length(); j++)\r
66         {\r
67           ch = sequence.charAt(j);\r
68           if (!jalview.util.Comparison.isGap( (ch)))\r
69           {\r
70             endRes++;\r
71           }\r
72         }\r
73         if (endRes > 0)\r
74         {\r
75           endRes += start - 1;\r
76         }\r
77 \r
78         this.end = endRes;\r
79       }\r
80 \r
81         setDisplayId();\r
82     }\r
83 \r
84     /**\r
85      * Creates a new Sequence object.\r
86      *\r
87      * @param name DOCUMENT ME!\r
88      * @param sequence DOCUMENT ME!\r
89      */\r
90     public Sequence(String name, String sequence)\r
91     {\r
92         this(name, sequence, 1, sequence.length());\r
93     }\r
94 \r
95     /**\r
96      * Creates a new Sequence object.\r
97      *\r
98      * @param seq DOCUMENT ME!\r
99      */\r
100     public Sequence(SequenceI seq)\r
101     {\r
102         this(seq.getName(), seq.getSequence(), seq.getStart(), seq.getEnd());\r
103     }\r
104 \r
105     /**\r
106      * DOCUMENT ME!\r
107      *\r
108      * @param v DOCUMENT ME!\r
109      */\r
110     public void setSequenceFeatures(Vector v)\r
111     {\r
112         sequenceFeatures = v;\r
113     }\r
114 \r
115     /**\r
116      * DOCUMENT ME!\r
117      *\r
118      * @return DOCUMENT ME!\r
119      */\r
120     public Vector getSequenceFeatures()\r
121     {\r
122         return sequenceFeatures;\r
123     }\r
124 \r
125     /**\r
126      * DOCUMENT ME!\r
127      *\r
128      * @param id DOCUMENT ME!\r
129      */\r
130     public void setPDBId(String id)\r
131     {\r
132         pdbId = id;\r
133     }\r
134 \r
135     /**\r
136      * DOCUMENT ME!\r
137      *\r
138      * @return DOCUMENT ME!\r
139      */\r
140     public String getPDBId()\r
141     {\r
142         return pdbId;\r
143     }\r
144 \r
145     /**\r
146      * DOCUMENT ME!\r
147      *\r
148      * @return DOCUMENT ME!\r
149      */\r
150     public String getDisplayId()\r
151     {\r
152         return displayId;\r
153     }\r
154 \r
155     /**\r
156      * DOCUMENT ME!\r
157      */\r
158     public void setDisplayId()\r
159     {\r
160         displayId = name + "/" + start + "-" + end;\r
161     }\r
162 \r
163     /**\r
164      * DOCUMENT ME!\r
165      *\r
166      * @param name DOCUMENT ME!\r
167      */\r
168     public void setName(String name)\r
169     {\r
170         this.name = name;\r
171         setDisplayId();\r
172     }\r
173 \r
174     /**\r
175      * DOCUMENT ME!\r
176      *\r
177      * @return DOCUMENT ME!\r
178      */\r
179     public String getName()\r
180     {\r
181         return this.name;\r
182     }\r
183 \r
184     /**\r
185      * DOCUMENT ME!\r
186      *\r
187      * @param start DOCUMENT ME!\r
188      */\r
189     public void setStart(int start)\r
190     {\r
191         this.start = start;\r
192         setDisplayId();\r
193     }\r
194 \r
195     /**\r
196      * DOCUMENT ME!\r
197      *\r
198      * @return DOCUMENT ME!\r
199      */\r
200     public int getStart()\r
201     {\r
202         return this.start;\r
203     }\r
204 \r
205     /**\r
206      * DOCUMENT ME!\r
207      *\r
208      * @param end DOCUMENT ME!\r
209      */\r
210     public void setEnd(int end)\r
211     {\r
212         this.end = end;\r
213         setDisplayId();\r
214     }\r
215 \r
216     /**\r
217      * DOCUMENT ME!\r
218      *\r
219      * @return DOCUMENT ME!\r
220      */\r
221     public int getEnd()\r
222     {\r
223         return this.end;\r
224     }\r
225 \r
226     /**\r
227      * DOCUMENT ME!\r
228      *\r
229      * @return DOCUMENT ME!\r
230      */\r
231     public int getLength()\r
232     {\r
233         return this.sequence.length();\r
234     }\r
235 \r
236     /**\r
237      * DOCUMENT ME!\r
238      *\r
239      * @param seq DOCUMENT ME!\r
240      */\r
241     public void setSequence(String seq)\r
242     {\r
243         this.sequence = seq;\r
244     }\r
245 \r
246     /**\r
247      * DOCUMENT ME!\r
248      *\r
249      * @return DOCUMENT ME!\r
250      */\r
251     public String getSequence()\r
252     {\r
253         return this.sequence;\r
254     }\r
255 \r
256     /**\r
257      * DOCUMENT ME!\r
258      *\r
259      * @param start DOCUMENT ME!\r
260      * @param end DOCUMENT ME!\r
261      *\r
262      * @return DOCUMENT ME!\r
263      */\r
264     public String getSequence(int start, int end)\r
265     {\r
266         // JBPNote - left to user to pad the result here (TODO:Decide on this policy)\r
267         if (start >= sequence.length())\r
268         {\r
269             return "";\r
270         }\r
271 \r
272         if (end >= sequence.length())\r
273         {\r
274             end = sequence.length();\r
275         }\r
276 \r
277         return this.sequence.substring(start, end);\r
278     }\r
279 \r
280     /**\r
281      * DOCUMENT ME!\r
282      *\r
283      * @param i DOCUMENT ME!\r
284      *\r
285      * @return DOCUMENT ME!\r
286      */\r
287     public char getCharAt(int i)\r
288     {\r
289         if (i < sequence.length())\r
290         {\r
291             return sequence.charAt(i);\r
292         }\r
293         else\r
294         {\r
295             return ' ';\r
296         }\r
297     }\r
298 \r
299     /**\r
300      * DOCUMENT ME!\r
301      *\r
302      * @param desc DOCUMENT ME!\r
303      */\r
304     public void setDescription(String desc)\r
305     {\r
306         this.description = desc;\r
307     }\r
308 \r
309     /**\r
310      * DOCUMENT ME!\r
311      *\r
312      * @return DOCUMENT ME!\r
313      */\r
314     public String getDescription()\r
315     {\r
316         return this.description;\r
317     }\r
318 \r
319     /**\r
320      * DOCUMENT ME!\r
321      *\r
322      * @param pos DOCUMENT ME!\r
323      *\r
324      * @return DOCUMENT ME!\r
325      */\r
326     public int findIndex(int pos)\r
327     {\r
328         // returns the alignment position for a residue\r
329         int j = start;\r
330         int i = 0;\r
331 \r
332         while ((i < sequence.length()) && (j <= end) && (j <= pos))\r
333         {\r
334             char c = sequence.charAt(i);\r
335 \r
336             if (!jalview.util.Comparison.isGap((c)))\r
337             {\r
338                 j++;\r
339             }\r
340 \r
341             i++;\r
342         }\r
343 \r
344         if ((j == end) && (j < pos))\r
345         {\r
346             return end + 1;\r
347         }\r
348         else\r
349         {\r
350             return i;\r
351         }\r
352     }\r
353 \r
354     /**\r
355      * DOCUMENT ME!\r
356      *\r
357      * @param i DOCUMENT ME!\r
358      *\r
359      * @return DOCUMENT ME!\r
360      */\r
361     public int findPosition(int i)\r
362     {\r
363         // Returns the sequence position for an alignment position\r
364         int j = 0;\r
365         int pos = start;\r
366 \r
367         while ((j < i) && (j < sequence.length()))\r
368         {\r
369             char c = sequence.charAt(j);\r
370 \r
371             if (!jalview.util.Comparison.isGap((c)))\r
372             {\r
373                 pos++;\r
374             }\r
375 \r
376             j++;\r
377         }\r
378 \r
379         return pos;\r
380     }\r
381 \r
382     /**\r
383      * DOCUMENT ME!\r
384      *\r
385      * @return DOCUMENT ME!\r
386      */\r
387     public int[] gapMap()\r
388     {\r
389         // Returns an int array giving the position of each residue in the sequence in the alignment\r
390         String seq = jalview.analysis.AlignSeq.extractGaps("-. ", sequence);\r
391         int[] map = new int[seq.length()];\r
392         int j = 0;\r
393         int p = 0;\r
394 \r
395         while (j < sequence.length())\r
396         {\r
397             if (!jalview.util.Comparison.isGap(sequence.charAt(j)))\r
398             {\r
399                 map[p++] = j;\r
400             }\r
401 \r
402             j++;\r
403         }\r
404 \r
405         return map;\r
406     }\r
407 \r
408     /**\r
409      * DOCUMENT ME!\r
410      *\r
411      * @param i DOCUMENT ME!\r
412      */\r
413     public void deleteCharAt(int i)\r
414     {\r
415         if (i >= sequence.length())\r
416         {\r
417             return;\r
418         }\r
419 \r
420         sequence = sequence.substring(0, i) + sequence.substring(i + 1);\r
421     }\r
422 \r
423     /**\r
424      * DOCUMENT ME!\r
425      *\r
426      * @param i DOCUMENT ME!\r
427      * @param j DOCUMENT ME!\r
428      */\r
429     public void deleteChars(int i, int j)\r
430     {\r
431         if (i >= sequence.length())\r
432         {\r
433             return;\r
434         }\r
435 \r
436         if (j >= sequence.length())\r
437         {\r
438             sequence = sequence.substring(0, i);\r
439         }\r
440         else\r
441         {\r
442             sequence = sequence.substring(0, i) + sequence.substring(j);\r
443         }\r
444     }\r
445 \r
446     /**\r
447      * DOCUMENT ME!\r
448      *\r
449      * @param i DOCUMENT ME!\r
450      * @param c DOCUMENT ME!\r
451      */\r
452     public void insertCharAt(int i, char c)\r
453     {\r
454         insertCharAt(i, c, true);\r
455     }\r
456 \r
457     /**\r
458      * DOCUMENT ME!\r
459      *\r
460      * @param i DOCUMENT ME!\r
461      * @param c DOCUMENT ME!\r
462      * @param chop DOCUMENT ME!\r
463      */\r
464     public void insertCharAt(int i, char c, boolean chop)\r
465     {\r
466         String tmp = new String(sequence);\r
467 \r
468         if (i < sequence.length())\r
469         {\r
470             sequence = tmp.substring(0, i) + String.valueOf(c) +\r
471                 tmp.substring(i);\r
472         }\r
473         else\r
474         {\r
475             // JBPNote : padding char at end of sequence. We'll not get away with this when we insert residues, I bet!\r
476             char[] ch = new char[(1 + i) - sequence.length()];\r
477 \r
478             for (int j = 0, k = ch.length; j < k; j++)\r
479                 ch[j] = c;\r
480 \r
481             sequence = tmp + String.valueOf(ch);\r
482         }\r
483     }\r
484 \r
485     /**\r
486      * DOCUMENT ME!\r
487      *\r
488      * @param c DOCUMENT ME!\r
489      */\r
490     public void setColor(Color c)\r
491     {\r
492         this.color = c;\r
493     }\r
494 \r
495     /**\r
496      * DOCUMENT ME!\r
497      *\r
498      * @return DOCUMENT ME!\r
499      */\r
500     public Color getColor()\r
501     {\r
502         return color;\r
503     }\r
504 }\r