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