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