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