X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequence.java;h=52d9a720235bf2cd1dc8c760106cc169e1d43e43;hb=a45774ee31d9f35d4eff46d54d7deab719afb092;hp=fc9b3985c77c2225f6fdb3a0e65e87d1f45172de;hpb=711248f74fba4db5cff18a4f70464f909b05b962;p=jalview.git diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index fc9b398..52d9a72 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -1,24 +1,22 @@ /* -* 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 -*/ + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.7) + * Copyright (C) 2011 J Procter, AM Waterhouse, G Barton, M Clamp, S Searle + * + * This file is part of Jalview. + * + * Jalview 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 3 of the License, or (at your option) any later version. + * + * Jalview 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 Jalview. If not, see . + */ package jalview.datamodel; - import java.util.*; import jalview.analysis.*; @@ -26,38 +24,51 @@ import jalview.analysis.*; /** * * Implements the SequenceI interface for a char[] based sequence object. - * + * * @author $author$ * @version $Revision$ */ -public class Sequence - implements SequenceI +public class Sequence implements SequenceI { SequenceI datasetSequence; + String name; - private char [] sequence; + + 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 */ + /** + * This annotation is displayed below the alignment but the positions are tied + * to the residues of this sequence + */ Vector annotation; /** array of seuqence features - may not be null for a valid sequence object */ public SequenceFeature[] sequenceFeatures; - /** * Creates a new Sequence object. - * - * @param name display name string - * @param sequence string to form a possibly gapped sequence out of - * @param start first position of non-gap residue in the sequence - * @param end last position of ungapped residues (nearly always only used for display purposes) + * + * @param name + * display name string + * @param sequence + * string to form a possibly gapped sequence out of + * @param start + * first position of non-gap residue in the sequence + * @param end + * last position of ungapped residues (nearly always only used for + * display purposes) */ public Sequence(String name, String sequence, int start, int end) { @@ -69,7 +80,7 @@ public class Sequence checkValidRange(); } - public Sequence(String name, char [] sequence, int start, int end) + public Sequence(String name, char[] sequence, int start, int end) { this.name = name; this.sequence = sequence; @@ -80,15 +91,16 @@ public class Sequence } 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,}$"); + "[/][0-9]{1,}[-][0-9]{1,}$"); + + com.stevesoft.pat.Regex endrx = new com.stevesoft.pat.Regex("[0-9]{1,}$"); void parseId() { - if (name==null) + if (name == null) { - System.err.println("POSSIBLE IMPLEMENTATION ERROR: null sequence name passed to constructor."); + System.err + .println("POSSIBLE IMPLEMENTATION ERROR: null sequence name passed to constructor."); name = ""; } // Does sequence have the /start-end signiature? @@ -97,19 +109,19 @@ public class Sequence name = limitrx.left(); endrx.search(limitrx.stringMatched()); setStart(Integer.parseInt(limitrx.stringMatched().substring(1, - endrx.matchedFrom() - 1))); + endrx.matchedFrom() - 1))); setEnd(Integer.parseInt(endrx.stringMatched())); } } void checkValidRange() { - if (end < 1) + // Note: JAL-774 : http://issues.jalview.org/browse/JAL-774?focusedCommentId=11239&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-11239 { int endRes = 0; for (int j = 0; j < sequence.length; j++) { - if (!jalview.util.Comparison.isGap( sequence[j] )) + if (!jalview.util.Comparison.isGap(sequence[j])) { endRes++; } @@ -119,16 +131,20 @@ public class Sequence endRes += start - 1; } - this.end = endRes; + if (end= sequence.length) { return new char[0]; @@ -452,17 +487,20 @@ public class Sequence end = sequence.length; } - char [] reply = new char[end-start]; - System.arraycopy(sequence, start, reply, 0, end-start); + 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 + * 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) @@ -471,7 +509,7 @@ public class Sequence { start = 0; } - char [] seq = getSequence(start, end); + char[] seq = getSequence(start, end); if (seq.length == 0) { return null; @@ -481,22 +519,23 @@ public class Sequence // JBPNote - this is an incomplete copy. SequenceI nseq = new Sequence(this.getName(), seq, nstart, nend); nseq.setDescription(description); - if (datasetSequence!=null) + if (datasetSequence != null) { - nseq.setDatasetSequence(datasetSequence); + nseq.setDatasetSequence(datasetSequence); } else { - nseq.setDatasetSequence(this); + nseq.setDatasetSequence(this); } return nseq; } /** * DOCUMENT ME! - * - * @param i DOCUMENT ME! - * + * + * @param i + * DOCUMENT ME! + * * @return DOCUMENT ME! */ public char getCharAt(int i) @@ -513,8 +552,9 @@ public class Sequence /** * DOCUMENT ME! - * - * @param desc DOCUMENT ME! + * + * @param desc + * DOCUMENT ME! */ public void setDescription(String desc) { @@ -523,7 +563,7 @@ public class Sequence /** * DOCUMENT ME! - * + * * @return DOCUMENT ME! */ public String getDescription() @@ -533,9 +573,10 @@ public class Sequence /** * Return the alignment position for a sequence position - * - * @param pos lying from start to end - * + * + * @param pos + * lying from start to end + * * @return aligned position of residue pos */ public int findIndex(int pos) @@ -543,8 +584,8 @@ public class Sequence // returns the alignment position for a residue int j = start; int i = 0; - - while ( (i < sequence.length) && (j <= end) && (j <= pos)) + // Rely on end being at least as long as the length of the sequence. + while ((i < sequence.length) && (j <= end) && (j <= pos)) { if (!jalview.util.Comparison.isGap(sequence[i])) { @@ -554,7 +595,7 @@ public class Sequence i++; } - if ( (j == end) && (j < pos)) + if ((j == end) && (j < pos)) { return end + 1; } @@ -566,9 +607,10 @@ public class Sequence /** * Returns the sequence position for an alignment position - * - * @param i column index in alignment (from 1) - * + * + * @param i + * column index in alignment (from 1) + * * @return residue number for residue (left of and) nearest ith column */ public int findPosition(int i) @@ -576,9 +618,9 @@ public class Sequence int j = 0; int pos = start; int seqlen = sequence.length; - while ( (j < i) && (j < seqlen)) + while ((j < i) && (j < seqlen)) { - if (!jalview.util.Comparison.isGap( sequence[j] )) + if (!jalview.util.Comparison.isGap(sequence[j])) { pos++; } @@ -590,14 +632,16 @@ public class Sequence } /** - * 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 + * 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)); + 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; @@ -615,31 +659,57 @@ public class Sequence return map; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * + * @see jalview.datamodel.SequenceI#findPositionMap() + */ + public int[] findPositionMap() + { + int map[] = new int[sequence.length]; + int j = 0; + int pos = start; + int seqlen = sequence.length; + while ((j < seqlen)) + { + map[j] = pos; + if (!jalview.util.Comparison.isGap(sequence[j])) + { + pos++; + } + + j++; + } + return map; + } + + /* + * (non-Javadoc) + * * @see jalview.datamodel.SequenceI#deleteChars(int, int) */ public void deleteChars(int i, int j) { - int newstart=start,newend=end; + int newstart = start, newend = end; if (i >= sequence.length) { return; } - char [] tmp; + char[] tmp; if (j >= sequence.length) { tmp = new char[i]; - System.arraycopy(sequence,0,tmp,0,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); + tmp = new char[sequence.length - j + i]; + System.arraycopy(sequence, 0, tmp, 0, i); + System.arraycopy(sequence, j, tmp, i, sequence.length - j); } - boolean createNewDs=false; + boolean createNewDs = false; for (int s = i; s < j; s++) { if (jalview.schemes.ResidueProperties.aaIndex[sequence[s]] != 23) @@ -647,26 +717,33 @@ public class Sequence if (createNewDs) { newend--; - } else { - int sindex = findIndex(start)-1; - if (sindex==s) + } + else { - // delete characters including start of sequence - newstart = findPosition(j); - break; // don't need to search for any more residue characters. - } else { - // delete characters after start. - int eindex = findIndex(end)-1; - if (eindex= sequence.length) { @@ -703,21 +782,20 @@ public class Sequence i = sequence.length; } else - { + { System.arraycopy(sequence, 0, tmp, 0, i); - } - + } int index = i; while (length > 0) { - tmp[ index++ ] = c; + tmp[index++] = c; length--; } if (i < sequence.length) { - System.arraycopy(sequence, i, tmp, index, sequence.length-i ); + System.arraycopy(sequence, i, tmp, index, sequence.length - i); } sequence = tmp; @@ -745,6 +823,11 @@ public class Sequence public DBRefEntry[] getDBRef() { + if (dbrefs == null && datasetSequence != null + && this != datasetSequence) + { + return datasetSequence.getDBRef(); + } return dbrefs; } @@ -757,13 +840,13 @@ public class Sequence int i, iSize = dbrefs.length; - for(i=0; i0) + if (newpdb.size() > 0) { Enumeration en = newpdb.elements(); while (en.hasMoreElements()) @@ -997,6 +1102,74 @@ public class Sequence return false; } -} + /* + * (non-Javadoc) + * + * @see + * jalview.datamodel.SequenceI#transferAnnotation(jalview.datamodel.SequenceI, + * jalview.datamodel.Mapping) + */ + public void transferAnnotation(SequenceI entry, Mapping mp) + { + if (datasetSequence != null) + { + datasetSequence.transferAnnotation(entry, mp); + return; + } + if (entry.getDatasetSequence() != null) + { + transferAnnotation(entry.getDatasetSequence(), mp); + return; + } + // transfer any new features from entry onto sequence + if (entry.getSequenceFeatures() != null) + { + SequenceFeature[] sfs = entry.getSequenceFeatures(); + for (int si = 0; si < sfs.length; si++) + { + SequenceFeature sf[] = (mp != null) ? mp.locateFeature(sfs[si]) + : new SequenceFeature[] + { new SequenceFeature(sfs[si]) }; + if (sf != null && sf.length > 0) + { + for (int sfi = 0; sfi < sf.length; sfi++) + { + addSequenceFeature(sf[sfi]); + } + } + } + } + // transfer PDB entries + if (entry.getPDBId() != null) + { + Enumeration e = entry.getPDBId().elements(); + while (e.hasMoreElements()) + { + PDBEntry pdb = (PDBEntry) e.nextElement(); + addPDBId(pdb); + } + } + // transfer database references + DBRefEntry[] entryRefs = entry.getDBRef(); + if (entryRefs != null) + { + for (int r = 0; r < entryRefs.length; r++) + { + DBRefEntry newref = new DBRefEntry(entryRefs[r]); + if (newref.getMap() != null && mp != null) + { + // remap ref using our local mapping + } + // we also assume all version string setting is done by dbSourceProxy + /* + * if (!newref.getSource().equalsIgnoreCase(dbSource)) { + * newref.setSource(dbSource); } + */ + addDBRef(newref); + } + } + } + +}