/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.datamodel; import java.awt.*; import java.util.*; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class Sequence implements SequenceI { SequenceI datasetSequence; String name; String shortName; String sequence; String description; int start; int end; Color color = Color.white; Vector pdbIds; String vamsasId; Vector dbrefs; /** DOCUMENT ME!! */ public Vector sequenceFeatures = new Vector(); /** * Creates a new Sequence object. * * @param name DOCUMENT ME! * @param sequence DOCUMENT ME! * @param start DOCUMENT ME! * @param end DOCUMENT ME! */ public Sequence(String name, String sequence, int start, int end) { this.name = name; this.start = start; this.end = end; parseId(); this.sequence = sequence; checkValidRange(); } void parseId() { // Read in any DB refs first StringTokenizer st = new StringTokenizer(name, "|"); if(st.countTokens()<1) { shortName = name; return; } while (st.countTokens() > 1) { String a = st.nextToken(); String b = st.nextToken(); addDBRef(new DBRefEntry(a, "0", b)); } if (st.hasMoreTokens()) shortName = st.nextToken(); // Remove /start-end from sequence if (shortName.indexOf("/") > 0) { st = new StringTokenizer(shortName, "/"); String limits = null; try { if (st.countTokens() == 2) { shortName = st.nextToken(); limits = st.nextToken(); st = new StringTokenizer(limits, "-"); if (st.countTokens() == 2) { setStart(Integer.valueOf(st.nextToken()).intValue()); setEnd(Integer.valueOf(st.nextToken()).intValue()); } } // If we're still in this loop, parsing of start and end was ok // Therefore remove it from the sequence name name = name.substring(0, name.indexOf("/")); } catch (NumberFormatException ex) { // Problem parsing sequence limits. Just add it back to the // Id so we dont lose this info shortName += "/" + limits; } } } void checkValidRange() { if (end < 1) { int endRes = 0; char ch; for (int j = 0; j < sequence.length(); j++) { ch = sequence.charAt(j); if (!jalview.util.Comparison.isGap( (ch))) { endRes++; } } if (endRes > 0) { endRes += start - 1; } this.end = endRes; } } /** * Creates a new Sequence object. * * @param name DOCUMENT ME! * @param sequence DOCUMENT ME! */ public Sequence(String name, String sequence) { this(name, sequence, 1, -1); } /** * Creates a new Sequence object. * * @param seq DOCUMENT ME! */ public Sequence(SequenceI seq) { this(seq.getName(), seq.getSequence(), seq.getStart(), seq.getEnd()); } /** * DOCUMENT ME! * * @param v DOCUMENT ME! */ public void setSequenceFeatures(Vector v) { sequenceFeatures = v; } public void addSequenceFeature(SequenceFeature sf) { if(sequenceFeatures==null) sequenceFeatures = new Vector(); sequenceFeatures.addElement(sf); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Vector getSequenceFeatures() { return sequenceFeatures; } public void addPDBId(PDBEntry entry) { if(pdbIds == null) pdbIds = new Vector(); pdbIds.addElement(entry); } /** * DOCUMENT ME! * * @param id DOCUMENT ME! */ public void setPDBId(Vector id) { pdbIds = id; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Vector getPDBId() { return pdbIds; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getDisplayId(boolean dbref, boolean jvsuffix) { StringBuffer result = new StringBuffer(); if (dbref && dbrefs != null) { for (int i = 0; i < dbrefs.size(); i++) { DBRefEntry entry = (DBRefEntry) dbrefs.elementAt(i); result.append(entry.getSource() + "|" + entry.getAccessionId() + "|"); } } result.append(shortName); if (jvsuffix) { result.append("/" + start + "-" + end); } return result.toString(); } /** * DOCUMENT ME! * * @param name DOCUMENT ME! */ public void setName(String name) { this.name = name; this.parseId(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getName() { return this.name; } /** * DOCUMENT ME! * * @param start DOCUMENT ME! */ public void setStart(int start) { this.start = start; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getStart() { return this.start; } /** * DOCUMENT ME! * * @param end DOCUMENT ME! */ public void setEnd(int end) { this.end = end; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getEnd() { return this.end; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int getLength() { return this.sequence.length(); } /** * DOCUMENT ME! * * @param seq DOCUMENT ME! */ public void setSequence(String seq) { this.sequence = seq; checkValidRange(); } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getSequence() { return this.sequence; } /** * DOCUMENT ME! * * @param start DOCUMENT ME! * @param end DOCUMENT ME! * * @return DOCUMENT ME! */ public String getSequence(int start, int end) { // JBPNote - left to user to pad the result here (TODO:Decide on this policy) if (start >= sequence.length()) { return ""; } if (end >= sequence.length()) { end = sequence.length(); } return this.sequence.substring(start, end); } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * * @return DOCUMENT ME! */ public char getCharAt(int i) { if (i < sequence.length()) { return sequence.charAt(i); } else { return ' '; } } /** * DOCUMENT ME! * * @param desc DOCUMENT ME! */ public void setDescription(String desc) { this.description = desc; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public String getDescription() { return this.description; } /** * DOCUMENT ME! * * @param pos DOCUMENT ME! * * @return DOCUMENT ME! */ public int findIndex(int pos) { // returns the alignment position for a residue int j = start; int i = 0; while ((i < sequence.length()) && (j <= end) && (j <= pos)) { if (!jalview.util.Comparison.isGap(sequence.charAt(i))) { j++; } i++; } if ((j == end) && (j < pos)) { return end + 1; } else { return i; } } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * * @return DOCUMENT ME! */ public int findPosition(int i) { // Returns the sequence position for an alignment position int j = 0; int pos = start; while ((j < i) && (j < sequence.length())) { char c = sequence.charAt(j); if (!jalview.util.Comparison.isGap((c))) { pos++; } j++; } return pos; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public int[] gapMap() { // Returns an int array giving the position of each residue in the sequence in the alignment String seq = jalview.analysis.AlignSeq.extractGaps("-. ", sequence); int[] map = new int[seq.length()]; int j = 0; int p = 0; while (j < sequence.length()) { if (!jalview.util.Comparison.isGap(sequence.charAt(j))) { map[p++] = j; } j++; } return map; } /** * DOCUMENT ME! * * @param i DOCUMENT ME! */ public void deleteCharAt(int i) { if (i >= sequence.length()) { return; } sequence = sequence.substring(0, i) + sequence.substring(i + 1); } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * @param j DOCUMENT ME! */ public void deleteChars(int i, int j) { if (i >= sequence.length()) { return; } if (j >= sequence.length()) { sequence = sequence.substring(0, i); } else { sequence = sequence.substring(0, i) + sequence.substring(j); } } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * @param c DOCUMENT ME! */ public void insertCharAt(int i, char c) { insertCharAt(i, c, true); } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * @param c DOCUMENT ME! * @param chop DOCUMENT ME! */ public void insertCharAt(int i, char c, boolean chop) { String tmp = new String(sequence); if (i < sequence.length()) { sequence = tmp.substring(0, i) + String.valueOf(c) + tmp.substring(i); } else { // JBPNote : padding char at end of sequence. We'll not get away with this when we insert residues, I bet! char[] ch = new char[(1 + i) - sequence.length()]; for (int j = 0, k = ch.length; j < k; j++) ch[j] = c; sequence = tmp + String.valueOf(ch); } } /** * DOCUMENT ME! * * @param c DOCUMENT ME! */ public void setColor(Color c) { this.color = c; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public Color getColor() { return color; } public String getVamsasId() { return vamsasId; } public void setVamsasId(String id) { vamsasId = id; } public void setDBRef(Vector dbref) { dbrefs = dbref; } public Vector getDBRef() { return dbrefs; } public void addDBRef(DBRefEntry entry) { if(dbrefs == null) dbrefs = new Vector(); dbrefs.addElement(entry); } public void setDatasetSequence(SequenceI seq) { datasetSequence = seq; } public SequenceI getDatasetSequence() { return datasetSequence; } public String getShortName() { return shortName; } }