1 package jalview.datamodel.features;
3 import jalview.datamodel.SequenceFeature;
5 import java.util.ArrayList;
6 import java.util.Arrays;
7 import java.util.HashMap;
8 import java.util.HashSet;
11 import java.util.Map.Entry;
15 * A class that stores sequence features in a way that supports efficient
16 * querying by type and location (overlap). Intended for (but not limited to)
17 * storage of features for one sequence.
22 public class SequenceFeatures implements SequenceFeaturesI
26 * map from feature type to structured store of features for that type
27 * null types are permitted (but not a good idea!)
29 private Map<String, FeatureStore> featureStore;
34 public SequenceFeatures()
36 featureStore = new HashMap<String, FeatureStore>();
43 public boolean add(SequenceFeature sf)
45 String type = sf.getType();
47 if (featureStore.get(type) == null)
49 featureStore.put(type, new FeatureStore());
51 return featureStore.get(type).addFeature(sf);
58 public List<SequenceFeature> findFeatures(int from, int to,
61 List<SequenceFeature> result = new ArrayList<SequenceFeature>();
63 for (String featureType : varargToTypes(type))
65 FeatureStore features = featureStore.get(featureType);
68 result.addAll(features.findOverlappingFeatures(from, to));
79 public List<SequenceFeature> getAllFeatures(String... type)
81 List<SequenceFeature> result = new ArrayList<SequenceFeature>();
83 result.addAll(getPositionalFeatures(type));
85 result.addAll(getNonPositionalFeatures(type));
94 public int getFeatureCount(boolean positional, String... type)
98 for (String featureType : varargToTypes(type))
100 FeatureStore featureSet = featureStore.get(featureType);
101 if (featureSet != null)
103 result += featureSet.getFeatureCount(positional);
113 public List<SequenceFeature> getPositionalFeatures(String... type)
115 List<SequenceFeature> result = new ArrayList<SequenceFeature>();
117 for (String featureType : varargToTypes(type))
119 FeatureStore featureSet = featureStore.get(featureType);
120 if (featureSet != null)
122 result.addAll(featureSet.getPositionalFeatures());
129 * A convenience method that converts a vararg for feature types to an
130 * Iterable, replacing the value with the stored feature types if it is null
136 protected Iterable<String> varargToTypes(String... type)
138 return type == null || type.length == 0 ? featureStore
139 .keySet() : Arrays.asList(type);
146 public List<SequenceFeature> getContactFeatures(String... type)
148 List<SequenceFeature> result = new ArrayList<SequenceFeature>();
150 for (String featureType : varargToTypes(type))
152 FeatureStore featureSet = featureStore.get(featureType);
153 if (featureSet != null)
155 result.addAll(featureSet.getContactFeatures());
165 public List<SequenceFeature> getNonPositionalFeatures(String... type)
167 List<SequenceFeature> result = new ArrayList<SequenceFeature>();
169 for (String featureType : varargToTypes(type))
171 FeatureStore featureSet = featureStore.get(featureType);
172 if (featureSet != null)
174 result.addAll(featureSet.getNonPositionalFeatures());
184 public boolean delete(SequenceFeature sf)
186 for (FeatureStore featureSet : featureStore.values())
188 if (featureSet.delete(sf))
200 public boolean hasFeatures()
202 for (FeatureStore featureSet : featureStore.values())
204 if (!featureSet.isEmpty())
216 public Set<String> getFeatureGroups(boolean positionalFeatures,
219 Set<String> groups = new HashSet<String>();
221 Iterable<String> types = varargToTypes(type);
223 for (String featureType : types)
225 FeatureStore featureSet = featureStore.get(featureType);
226 if (featureSet != null)
228 groups.addAll(featureSet.getFeatureGroups(positionalFeatures));
239 public Set<String> getFeatureTypesForGroups(boolean positionalFeatures,
242 Set<String> result = new HashSet<String>();
244 for (Entry<String, FeatureStore> featureType : featureStore.entrySet())
246 Set<String> featureGroups = featureType.getValue().getFeatureGroups(
248 for (String group : groups)
250 if (featureGroups.contains(group))
253 * yes this feature type includes one of the query groups
255 result.add(featureType.getKey());
268 public Set<String> getFeatureTypes()
270 Set<String> types = new HashSet<String>();
271 for (Entry<String, FeatureStore> entry : featureStore.entrySet())
273 if (!entry.getValue().isEmpty())
275 types.add(entry.getKey());