X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Ffeatures%2FSequenceFeatures.java;h=8ac4991d08fe5d6a8e0609e111e73e80d0c16245;hb=10b40b4ec840e5076c95109b0ea518928385821c;hp=fcf1b536409a3579a74c2fe1556d6c0b074d5dac;hpb=9e926ac4305fd9dff38b6e079e55b4f50664d544;p=jalview.git diff --git a/src/jalview/datamodel/features/SequenceFeatures.java b/src/jalview/datamodel/features/SequenceFeatures.java index fcf1b53..8ac4991 100644 --- a/src/jalview/datamodel/features/SequenceFeatures.java +++ b/src/jalview/datamodel/features/SequenceFeatures.java @@ -20,15 +20,8 @@ */ package jalview.datamodel.features; -import jalview.datamodel.ContiguousI; -import jalview.datamodel.SequenceFeature; -import jalview.io.gff.SequenceOntologyFactory; -import jalview.io.gff.SequenceOntologyI; - import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; -import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -36,6 +29,11 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; +import intervalstore.api.IntervalI; +import jalview.datamodel.SequenceFeature; +import jalview.io.gff.SequenceOntologyFactory; +import jalview.io.gff.SequenceOntologyI; + /** * A class that stores sequence features in a way that supports efficient * querying by type and location (overlap). Intended for (but not limited to) @@ -46,30 +44,6 @@ import java.util.TreeMap; */ public class SequenceFeatures implements SequenceFeaturesI { - /** - * a comparator for sorting features by start position ascending - */ - private static Comparator FORWARD_STRAND = new Comparator() - { - @Override - public int compare(ContiguousI o1, ContiguousI o2) - { - return Integer.compare(o1.getBegin(), o2.getBegin()); - } - }; - - /** - * a comparator for sorting features by end position descending - */ - private static Comparator REVERSE_STRAND = new Comparator() - { - @Override - public int compare(ContiguousI o1, ContiguousI o2) - { - return Integer.compare(o2.getEnd(), o1.getEnd()); - } - }; - /* * map from feature type to structured store of features for that type * null types are permitted (but not a good idea!) @@ -87,7 +61,7 @@ public class SequenceFeatures implements SequenceFeaturesI */ // featureStore = Collections // .synchronizedSortedMap(new TreeMap()); - featureStore = new TreeMap(); + featureStore = new TreeMap<>(); } /** @@ -228,7 +202,9 @@ public class SequenceFeatures implements SequenceFeaturesI /** * A convenience method that converts a vararg for feature types to an - * Iterable over matched feature sets in key order + * Iterable over matched feature sets. If no types are specified, all feature + * sets are returned. If one or more types are specified, feature sets for + * those types are returned, preserving the order of the types. * * @param type * @return @@ -244,12 +220,11 @@ public class SequenceFeatures implements SequenceFeaturesI } List types = new ArrayList<>(); - List args = Arrays.asList(type); - for (Entry featureType : featureStore.entrySet()) + for (String theType : type) { - if (args.contains(featureType.getKey())) + if (theType != null && featureStore.containsKey(theType)) { - types.add(featureType.getValue()); + types.add(featureStore.get(theType)); } } return types; @@ -382,9 +357,10 @@ public class SequenceFeatures implements SequenceFeaturesI } /** - * Answers true if the given type is one of the specified sequence ontology - * terms (or a sub-type of one), or if no terms are supplied. Answers false if - * filter terms are specified and the given term does not match any of them. + * Answers true if the given type matches one of the specified terms (or is a + * sub-type of one in the Sequence Ontology), or if no terms are supplied. + * Answers false if filter terms are specified and the given term does not + * match any of them. * * @param type * @param soTerm @@ -399,7 +375,7 @@ public class SequenceFeatures implements SequenceFeaturesI SequenceOntologyI so = SequenceOntologyFactory.getInstance(); for (String term : soTerm) { - if (so.isA(type, term)) + if (type.equals(term) || so.isA(type, term)) { return true; } @@ -434,11 +410,13 @@ public class SequenceFeatures implements SequenceFeaturesI * @param features * @param forwardStrand */ - public static void sortFeatures(List features, + public static void sortFeatures(List features, final boolean forwardStrand) { - Collections.sort(features, forwardStrand ? FORWARD_STRAND - : REVERSE_STRAND); + Collections.sort(features, + forwardStrand + ? IntervalI.COMPARE_BEGIN_ASC_END_DESC + : IntervalI.COMPARE_END_DESC); } /** @@ -471,13 +449,22 @@ public class SequenceFeatures implements SequenceFeaturesI * {@inheritDoc} */ @Override - public boolean shiftFeatures(int shift) + public boolean shiftFeatures(int fromPosition, int shiftBy) { boolean modified = false; for (FeatureStore fs : featureStore.values()) { - modified |= fs.shiftFeatures(shift); + modified |= fs.shiftFeatures(fromPosition, shiftBy); } return modified; } -} \ No newline at end of file + + /** + * {@inheritDoc} + */ + @Override + public void deleteAll() + { + featureStore.clear(); + } +}