X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fdatamodel%2Ffeatures%2FSequenceFeatures.java;h=bc389427acd2589b0261b2cbe32f476916b2e01d;hb=refs%2Fheads%2FJAL-3253_applet_omnibus-BH;hp=db2f0e1bb9950587e78519087fc8232151d57425;hpb=ab0e5f2223a993371761baf240d815abdfcbb950;p=jalview.git diff --git a/src/jalview/datamodel/features/SequenceFeatures.java b/src/jalview/datamodel/features/SequenceFeatures.java index db2f0e1..bc38942 100644 --- a/src/jalview/datamodel/features/SequenceFeatures.java +++ b/src/jalview/datamodel/features/SequenceFeatures.java @@ -23,8 +23,11 @@ package jalview.datamodel.features; import jalview.datamodel.SequenceFeature; import jalview.io.gff.SequenceOntologyFactory; import jalview.io.gff.SequenceOntologyI; +import jalview.util.Platform; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -44,7 +47,6 @@ import intervalstore.api.IntervalI; */ public class SequenceFeatures implements SequenceFeaturesI { - /* * map from feature type to structured store of features for that type * null types are permitted (but not a good idea!) @@ -108,12 +110,11 @@ public class SequenceFeatures implements SequenceFeaturesI String... type) { List result = new ArrayList<>(); - for (FeatureStore featureSet : varargToTypes(type)) { - result.addAll(featureSet.findOverlappingFeatures(from, to)); + // BH MUCH more efficient to pass the list + featureSet.findFeatures(from, to, result); } - return result; } @@ -196,7 +197,7 @@ public class SequenceFeatures implements SequenceFeaturesI for (FeatureStore featureSet : varargToTypes(type)) { - result.addAll(featureSet.getPositionalFeatures()); + featureSet.getPositionalFeatures(result); } return result; } @@ -241,7 +242,7 @@ public class SequenceFeatures implements SequenceFeaturesI for (FeatureStore featureSet : varargToTypes(type)) { - result.addAll(featureSet.getContactFeatures()); + featureSet.getContactFeatures(result); } return result; } @@ -256,7 +257,7 @@ public class SequenceFeatures implements SequenceFeaturesI for (FeatureStore featureSet : varargToTypes(type)) { - result.addAll(featureSet.getNonPositionalFeatures()); + featureSet.getNonPositionalFeatures(result); } return result; } @@ -300,7 +301,11 @@ public class SequenceFeatures implements SequenceFeaturesI public Set getFeatureGroups(boolean positionalFeatures, String... type) { - Set groups = new HashSet<>(); + // BH 2020.03.21 This is the set that orders the list of groups + // at the top of the FeatureSettings panel. + // In order to keep the same order as a Java HashSet, we must + // request that specifically. See Platform. + Set groups = Platform.getJavaOrderedHashSet(); for (FeatureStore featureSet : varargToTypes(type)) { @@ -317,7 +322,10 @@ public class SequenceFeatures implements SequenceFeaturesI public Set getFeatureTypesForGroups(boolean positionalFeatures, String... groups) { - Set result = new HashSet<>(); + // BH 2020.03.21 This set is the one that sets the initial ordering for + // feature rendering. We set it to new HashSet<>(16,0.75) to force it to + // be backed by a Java hash-ordered HashMap instead of a JavaScript Map. + Set result = Platform.getJavaOrderedHashSet(); for (Entry featureType : featureStore.entrySet()) { @@ -345,7 +353,7 @@ public class SequenceFeatures implements SequenceFeaturesI @Override public Set getFeatureTypes(String... soTerm) { - Set types = new HashSet<>(); + Set types = Platform.getJavaOrderedHashSet(); for (Entry entry : featureStore.entrySet()) { String type = entry.getKey(); @@ -373,7 +381,7 @@ public class SequenceFeatures implements SequenceFeaturesI { return true; } - SequenceOntologyI so = SequenceOntologyFactory.getInstance(); + SequenceOntologyI so = SequenceOntologyFactory.getSequenceOntology(); for (String term : soTerm) { if (type.equals(term) || so.isA(type, term)) @@ -465,4 +473,24 @@ public class SequenceFeatures implements SequenceFeaturesI { featureStore.clear(); } + + @Override + public List findFeatures(int pos, String type, + List list) + { + FeatureStore fs = featureStore.get(type); + if (fs == null) + { + return list == null ? new ArrayList<>() : list; + } + return fs.findFeatures(pos, pos, list); + } + + @Override + public boolean hasFeatures(String type) + { + return featureStore.containsKey(type) + && !featureStore.get(type).isEmpty(); + } + }