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