/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2007 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.util.*; import jalview.analysis.*; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class Sequence implements SequenceI { SequenceI datasetSequence; String name; private char [] sequence; String description; int start; int end; Vector pdbIds; String vamsasId; DBRefEntry[] dbrefs; /** This annotation is displayed below the alignment but the * positions are tied to the residues of this sequence */ Vector annotation; /** DOCUMENT ME!! */ public SequenceFeature[] sequenceFeatures; /** * 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.sequence = sequence.toCharArray(); this.start = start; this.end = end; parseId(); checkValidRange(); } public Sequence(String name, char [] sequence, int start, int end) { this.name = name; this.sequence = sequence; this.start = start; this.end = end; parseId(); checkValidRange(); } com.stevesoft.pat.Regex limitrx = new com.stevesoft.pat.Regex( "[/][0-9]{1,}[-][0-9]{1,}$"); com.stevesoft.pat.Regex endrx = new com.stevesoft.pat.Regex( "[0-9]{1,}$"); void parseId() { // Does sequence have the /start-end signiature? if (limitrx.search(name)) { name = limitrx.left(); endrx.search(limitrx.stringMatched()); setStart(Integer.parseInt(limitrx.stringMatched().substring(1, endrx.matchedFrom() - 1))); setEnd(Integer.parseInt(endrx.stringMatched())); } } void checkValidRange() { if (end < 1) { int endRes = 0; for (int j = 0; j < sequence.length; j++) { if (!jalview.util.Comparison.isGap( sequence[j] )) { 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()); description = seq.getDescription(); } /** * DOCUMENT ME! * * @param v DOCUMENT ME! */ public void setSequenceFeatures(SequenceFeature[] features) { sequenceFeatures = features; } public synchronized void addSequenceFeature(SequenceFeature sf) { if (sequenceFeatures == null) { sequenceFeatures = new SequenceFeature[0]; } for (int i = 0; i < sequenceFeatures.length; i++) { if (sequenceFeatures[i].equals(sf)) { return; } } SequenceFeature[] temp = new SequenceFeature[sequenceFeatures.length + 1]; System.arraycopy(sequenceFeatures, 0, temp, 0, sequenceFeatures.length); temp[sequenceFeatures.length] = sf; sequenceFeatures = temp; } public void deleteFeature(SequenceFeature sf) { if(sequenceFeatures==null) { return; } int index=0; for (index = 0; index < sequenceFeatures.length; index++) { if (sequenceFeatures[index].equals(sf)) { break; } } if(index==sequenceFeatures.length) { return; } int sfLength = sequenceFeatures.length; if(sfLength<2) { sequenceFeatures = null; } else { SequenceFeature[] temp = new SequenceFeature[sfLength-1]; System.arraycopy(sequenceFeatures, 0, temp, 0, index); if(index= sequence.length) { return new char[0]; } if (end >= sequence.length) { end = sequence.length; } char [] reply = new char[end-start]; System.arraycopy(sequence, start, reply, 0, end-start); return reply; } /** * make a new Sequence object from start to end (including gaps) over this seqeunce * @param start int * @param end int * @return SequenceI */ public SequenceI getSubSequence(int start, int end) { if (start < 0) { start = 0; } char [] seq = getSequence(start, end); if (seq.length == 0) { return null; } int nstart = findPosition(start); int nend = findPosition(end) - 1; // JBPNote - this is an incomplete copy. SequenceI nseq = new Sequence(this.getName(), seq, nstart, nend); nseq.setDescription(description); if (datasetSequence!=null) { nseq.setDatasetSequence(datasetSequence); } else { nseq.setDatasetSequence(this); } return nseq; } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * * @return DOCUMENT ME! */ public char getCharAt(int i) { if (i < sequence.length) { return sequence[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[i])) { j++; } i++; } if ( (j == end) && (j < pos)) { return end + 1; } else { return i; } } /** * Returns the sequence position for an alignment position * * @param i column index in alignment (from 1) * * @return residue number for residue (left of and) nearest ith column */ public int findPosition(int i) { int j = 0; int pos = start; int seqlen = sequence.length; while ( (j < i) && (j < seqlen)) { if (!jalview.util.Comparison.isGap( sequence[j] )) { pos++; } j++; } return pos; } /** * Returns an int array where indices correspond to each residue in the sequence and the element value gives its position in the alignment * * @return int[SequenceI.getEnd()-SequenceI.getStart()+1] or null if no residues in SequenceI object */ public int[] gapMap() { String seq = jalview.analysis.AlignSeq.extractGaps(jalview.util.Comparison. GapChars, new String(sequence)); int[] map = new int[seq.length()]; int j = 0; int p = 0; while (j < sequence.length) { if (!jalview.util.Comparison.isGap(sequence[j])) { map[p++] = j; } j++; } return map; } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * @param j DOCUMENT ME! */ public void deleteChars(int i, int j) { if (i >= sequence.length) { return; } char [] tmp; if (j >= sequence.length) { tmp = new char[i]; System.arraycopy(sequence,0,tmp,0,i); } else { tmp = new char[sequence.length-j+i]; System.arraycopy(sequence,0,tmp,0,i); System.arraycopy(sequence,j,tmp,i,sequence.length-j); } if (this.datasetSequence != null) { for (int s = i; s < j; s++) { if (jalview.schemes.ResidueProperties.aaIndex[sequence[s]] != 23) { Sequence ds = new Sequence(name, AlignSeq.extractGaps( jalview.util.Comparison.GapChars, this.getSequenceAsString() ), start, end); ds.setDescription(description); } break; } } sequence = tmp; } /** * DOCUMENT ME! * * @param i DOCUMENT ME! * @param c DOCUMENT ME! * @param chop DOCUMENT ME! */ public void insertCharAt(int i, int length, char c) { char [] tmp = new char[sequence.length+length]; if (i >= sequence.length) { System.arraycopy(sequence, 0, tmp, 0, sequence.length); i = sequence.length; } else { System.arraycopy(sequence, 0, tmp, 0, i); } int index = i; while (length > 0) { tmp[ index++ ] = c; length--; } if (i < sequence.length) { System.arraycopy(sequence, i, tmp, index, sequence.length-i ); } sequence = tmp; } public void insertCharAt(int i, char c) { insertCharAt(i, 1, c); } public String getVamsasId() { return vamsasId; } public void setVamsasId(String id) { vamsasId = id; } public void setDBRef(DBRefEntry[] dbref) { dbrefs = dbref; } public DBRefEntry[] getDBRef() { return dbrefs; } public void addDBRef(DBRefEntry entry) { if (dbrefs == null) { dbrefs = new DBRefEntry[0]; } int i, iSize = dbrefs.length; for(i=0; i