2 * Jalview - A Sequence Alignment Editor and Viewer
\r
3 * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle
\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
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
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
19 package jalview.datamodel;
\r
30 * @version $Revision$
\r
32 public class Sequence implements SequenceI
\r
34 SequenceI datasetSequence;
\r
40 Color color = Color.white;
\r
45 /** This annotation is displayed below the alignment but the
\r
46 * positions are tied to the residues of this sequence */
\r
49 /** DOCUMENT ME!! */
\r
50 public SequenceFeature [] sequenceFeatures;
\r
52 /** This array holds hidden sequences
\r
53 * of which this sequence is the representitive member of a group
\r
55 SequenceGroup hiddenSequences;
\r
58 * Creates a new Sequence object.
\r
60 * @param name DOCUMENT ME!
\r
61 * @param sequence DOCUMENT ME!
\r
62 * @param start DOCUMENT ME!
\r
63 * @param end DOCUMENT ME!
\r
65 public Sequence(String name, String sequence, int start, int end)
\r
68 this.sequence = sequence;
\r
77 com.stevesoft.pat.Regex limitrx = new com.stevesoft.pat.Regex(
\r
78 "[/][0-9]{1,}[-][0-9]{1,}$");
\r
79 com.stevesoft.pat.Regex endrx = new com.stevesoft.pat.Regex(
\r
84 // Does sequence have the /start-end signiature?
\r
85 if(limitrx.search(name))
\r
87 name = limitrx.left();
\r
88 endrx.search(limitrx.stringMatched());
\r
89 setStart( Integer.parseInt( limitrx.stringMatched().substring(1,endrx.matchedFrom()-1 )));
\r
90 setEnd( Integer.parseInt( endrx.stringMatched() ));
\r
94 void checkValidRange()
\r
100 for (int j = 0; j < sequence.length(); j++)
\r
102 ch = sequence.charAt(j);
\r
103 if (!jalview.util.Comparison.isGap( (ch)))
\r
110 endRes += start - 1;
\r
119 * Creates a new Sequence object.
\r
121 * @param name DOCUMENT ME!
\r
122 * @param sequence DOCUMENT ME!
\r
124 public Sequence(String name, String sequence)
\r
126 this(name, sequence, 1, -1);
\r
130 * Creates a new Sequence object.
\r
132 * @param seq DOCUMENT ME!
\r
134 public Sequence(SequenceI seq)
\r
136 this(seq.getName(), seq.getSequence(), seq.getStart(), seq.getEnd());
\r
142 * @param v DOCUMENT ME!
\r
144 public void setSequenceFeatures(SequenceFeature [] features)
\r
146 sequenceFeatures = features;
\r
149 public void addSequenceFeature(SequenceFeature sf)
\r
151 if(sequenceFeatures==null)
\r
153 sequenceFeatures = new SequenceFeature[0];
\r
156 for(int i=0; i<sequenceFeatures.length; i++)
\r
158 if(sequenceFeatures[i].equals(sf))
\r
164 SequenceFeature [] temp = new SequenceFeature[sequenceFeatures.length+1];
\r
165 System.arraycopy(sequenceFeatures, 0, temp, 0, sequenceFeatures.length);
\r
166 temp[sequenceFeatures.length] = sf;
\r
169 sequenceFeatures = temp;
\r
176 * @return DOCUMENT ME!
\r
178 public SequenceFeature [] getSequenceFeatures()
\r
180 return sequenceFeatures;
\r
183 public void addPDBId(PDBEntry entry)
\r
186 pdbIds = new Vector();
\r
188 pdbIds.addElement(entry);
\r
194 * @param id DOCUMENT ME!
\r
196 public void setPDBId(Vector id)
\r
204 * @return DOCUMENT ME!
\r
206 public Vector getPDBId()
\r
214 * @return DOCUMENT ME!
\r
216 public String getDisplayId(boolean jvsuffix)
\r
218 StringBuffer result = new StringBuffer(name);
\r
221 result.append("/" + start + "-" + end);
\r
224 return result.toString();
\r
230 * @param name DOCUMENT ME!
\r
232 public void setName(String name)
\r
241 * @return DOCUMENT ME!
\r
243 public String getName()
\r
251 * @param start DOCUMENT ME!
\r
253 public void setStart(int start)
\r
255 this.start = start;
\r
261 * @return DOCUMENT ME!
\r
263 public int getStart()
\r
271 * @param end DOCUMENT ME!
\r
273 public void setEnd(int end)
\r
281 * @return DOCUMENT ME!
\r
283 public int getEnd()
\r
291 * @return DOCUMENT ME!
\r
293 public int getLength()
\r
295 return this.sequence.length();
\r
301 * @param seq DOCUMENT ME!
\r
303 public void setSequence(String seq)
\r
305 this.sequence = seq;
\r
312 * @return DOCUMENT ME!
\r
314 public String getSequence()
\r
316 return this.sequence;
\r
322 * @param start DOCUMENT ME!
\r
323 * @param end DOCUMENT ME!
\r
325 * @return DOCUMENT ME!
\r
327 public String getSequence(int start, int end)
\r
329 // JBPNote - left to user to pad the result here (TODO:Decide on this policy)
\r
330 if (start >= sequence.length())
\r
335 if (end >= sequence.length())
\r
337 end = sequence.length();
\r
340 return this.sequence.substring(start, end);
\r
346 * @param i DOCUMENT ME!
\r
348 * @return DOCUMENT ME!
\r
350 public char getCharAt(int i)
\r
352 if (i < sequence.length())
\r
354 return sequence.charAt(i);
\r
365 * @param desc DOCUMENT ME!
\r
367 public void setDescription(String desc)
\r
369 this.description = desc;
\r
375 * @return DOCUMENT ME!
\r
377 public String getDescription()
\r
379 return this.description;
\r
385 * @param pos DOCUMENT ME!
\r
387 * @return DOCUMENT ME!
\r
389 public int findIndex(int pos)
\r
391 // returns the alignment position for a residue
\r
395 while ((i < sequence.length()) && (j <= end) && (j <= pos))
\r
397 if (!jalview.util.Comparison.isGap(sequence.charAt(i)))
\r
405 if ((j == end) && (j < pos))
\r
418 * @param i DOCUMENT ME!
\r
420 * @return DOCUMENT ME!
\r
422 public int findPosition(int i)
\r
424 // Returns the sequence position for an alignment position
\r
428 while ((j < i) && (j < sequence.length()))
\r
430 if (!jalview.util.Comparison.isGap((sequence.charAt(j))))
\r
444 * @return DOCUMENT ME!
\r
446 public int[] gapMap()
\r
448 // Returns an int array giving the position of each residue in the sequence in the alignment
\r
449 String seq = jalview.analysis.AlignSeq.extractGaps("-. ", sequence);
\r
450 int[] map = new int[seq.length()];
\r
454 while (j < sequence.length())
\r
456 if (!jalview.util.Comparison.isGap(sequence.charAt(j)))
\r
470 * @param i DOCUMENT ME!
\r
472 public void deleteCharAt(int i)
\r
474 if (i >= sequence.length())
\r
479 sequence = sequence.substring(0, i) + sequence.substring(i + 1);
\r
485 * @param i DOCUMENT ME!
\r
486 * @param j DOCUMENT ME!
\r
488 public void deleteChars(int i, int j)
\r
490 if (i >= sequence.length())
\r
495 if (j >= sequence.length())
\r
497 sequence = sequence.substring(0, i);
\r
501 sequence = sequence.substring(0, i) + sequence.substring(j);
\r
509 * @param i DOCUMENT ME!
\r
510 * @param c DOCUMENT ME!
\r
511 * @param chop DOCUMENT ME!
\r
513 public void insertCharAt(int i, char c)
\r
515 String tmp = new String(sequence);
\r
517 if (i < sequence.length())
\r
519 sequence = tmp.substring(0, i) + String.valueOf(c) +
\r
524 // JBPNote : padding char at end of sequence. We'll not get away with this when we insert residues, I bet!
\r
525 char[] ch = new char[(1 + i) - sequence.length()];
\r
527 for (int j = 0, k = ch.length; j < k; j++)
\r
530 sequence = tmp + String.valueOf(ch);
\r
537 * @param c DOCUMENT ME!
\r
539 public void setColor(Color c)
\r
547 * @return DOCUMENT ME!
\r
549 public Color getColor()
\r
554 public String getVamsasId()
\r
559 public void setVamsasId(String id)
\r
564 public void setDBRef(Vector dbref)
\r
568 public Vector getDBRef()
\r
573 public void addDBRef(DBRefEntry entry)
\r
576 dbrefs = new Vector();
\r
578 dbrefs.addElement(entry);
\r
581 public void setDatasetSequence(SequenceI seq)
\r
583 datasetSequence = seq;
\r
586 public SequenceI getDatasetSequence()
\r
588 return datasetSequence;
\r
591 public AlignmentAnnotation [] getAnnotation()
\r
593 if(annotation==null)
\r
596 AlignmentAnnotation [] ret = new AlignmentAnnotation[annotation.size()];
\r
597 for(int r = 0; r<ret.length; r++)
\r
598 ret[r] = (AlignmentAnnotation)annotation.elementAt(r);
\r
603 public void addAlignmentAnnotation(AlignmentAnnotation annotation)
\r
605 if(this.annotation==null)
\r
606 this.annotation = new Vector();
\r
608 this.annotation.addElement( annotation );
\r
611 public SequenceGroup getHiddenSequences()
\r
613 return hiddenSequences;
\r
616 public void addHiddenSequence(SequenceI seq)
\r
618 if(hiddenSequences==null)
\r
620 hiddenSequences = new SequenceGroup();
\r
622 hiddenSequences.addSequence(seq, false);
\r
625 public void showHiddenSequence(SequenceI seq)
\r
627 hiddenSequences.deleteSequence(seq, false);
\r
628 if (hiddenSequences.getSize() < 1)
\r
630 hiddenSequences = null;
\r
635 public void changeCase(boolean toUpper, int start, int end)
\r
637 StringBuffer newSeq = new StringBuffer();
\r
639 if(end>sequence.length())
\r
640 end = sequence.length();
\r
644 newSeq.append(sequence.substring(0, start));
\r
648 newSeq.append(sequence.substring(start, end).toUpperCase());
\r
650 newSeq.append(sequence.substring(start, end).toLowerCase());
\r
652 if (end < sequence.length())
\r
653 newSeq.append(sequence.substring(end));
\r
655 sequence = newSeq.toString();
\r
658 public void toggleCase(int start, int end)
\r
660 StringBuffer newSeq = new StringBuffer();
\r
662 if(end>sequence.length())
\r
663 end = sequence.length();
\r
667 newSeq.append(sequence.substring(0, start));
\r
671 for(int c=start; c<end; c++)
\r
673 nextChar = sequence.charAt(c);
\r
674 if(Character.isLetter(nextChar))
\r
676 if(Character.isUpperCase(nextChar))
\r
677 nextChar = Character.toLowerCase(nextChar);
\r
679 nextChar = Character.toUpperCase(nextChar);
\r
683 newSeq.append(nextChar);
\r
686 if (end < sequence.length())
\r
687 newSeq.append(sequence.substring(end));
\r
689 sequence = newSeq.toString();
\r