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