X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2FSequence.java;h=0055d0e605b71e889530ed3fee929e1e8b867cf5;hp=dd7c24aeea1ec8b7a6853157d6c64b4a7e68f0f5;hb=4c6cd08af580ff73cfce39bec34ae4658a4b4b34;hpb=173080a606f4e91665be2d9f67ed1271390a4c82 diff --git a/src/jalview/datamodel/Sequence.java b/src/jalview/datamodel/Sequence.java index dd7c24a..0055d0e 100755 --- a/src/jalview/datamodel/Sequence.java +++ b/src/jalview/datamodel/Sequence.java @@ -34,6 +34,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.Enumeration; import java.util.List; +import java.util.ListIterator; import java.util.Vector; import com.stevesoft.pat.Regex; @@ -700,68 +701,6 @@ public class Sequence extends ASequence implements SequenceI } /** - * {@inheritDoc} - */ - @Override - public Range findPositions(int fromCol, int toCol) - { - /* - * count residues before fromCol - */ - int j = 0; - int count = 0; - int seqlen = sequence.length; - while (j < fromCol && j < seqlen) - { - if (!Comparison.isGap(sequence[j])) - { - count++; - } - j++; - } - - /* - * find first and last residues between fromCol and toCol - */ - int firstPos = 0; - int lastPos = 0; - int firstPosCol = 0; - boolean foundFirst = false; - - while (j <= toCol && j < seqlen) - { - if (!Comparison.isGap(sequence[j])) - { - count++; - if (!foundFirst) - { - firstPos = count; - firstPosCol = j; - foundFirst = true; - } - lastPos = count; - } - j++; - } - - if (firstPos == 0) - { - /* - * no residues in this range - */ - return null; - } - - /* - * adjust for sequence start coordinate - */ - firstPos += start - 1; - lastPos += start - 1; - - return new Range(firstPos, lastPos); - } - - /** * Returns an int array where indices correspond to each residue in the * sequence and the element value gives its position in the alignment * @@ -1505,13 +1444,55 @@ public class Sequence extends ASequence implements SequenceI * {@inheritDoc} */ @Override - public List findFeatures(int from, int to, + public List findFeatures(int fromColumn, int toColumn, String... types) { + int startPos = findPosition(fromColumn - 1); // convert base 1 to base 0 + int endPos = findPosition(toColumn - 1); + + List result = new ArrayList<>(); if (datasetSequence != null) { - return datasetSequence.findFeatures(from, to, types); + result = datasetSequence.getFeatures().findFeatures(startPos, endPos, + types); } - return sequenceFeatureStore.findFeatures(from, to, types); + else + { + result = sequenceFeatureStore.findFeatures(startPos, endPos, types); + } + + /* + * if the start or end column is gapped, startPos or endPos may be to the + * left or right, and we may have included adjacent or enclosing features; + * remove any that are not enclosing, non-contact features + */ + if (endPos > this.end || Comparison.isGap(sequence[fromColumn - 1]) + || Comparison.isGap(sequence[toColumn - 1])) + { + ListIterator it = result.listIterator(); + while (it.hasNext()) + { + SequenceFeature sf = it.next(); + int featureStartColumn = findIndex(sf.getBegin()); + int featureEndColumn = findIndex(sf.getEnd()); + boolean noOverlap = featureStartColumn > toColumn + || featureEndColumn < fromColumn; + + /* + * reject an 'enclosing' feature if it is actually a contact feature + */ + if (sf.isContactFeature() && featureStartColumn < fromColumn + && featureEndColumn > toColumn) + { + noOverlap = true; + } + if (noOverlap) + { + it.remove(); + } + } + } + + return result; } }