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