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