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