JAL-2480 cache min-max score values per sequence and feature type
[jalview.git] / src / jalview / datamodel / features / SequenceFeatures.java
index 4489b1d..c825761 100644 (file)
@@ -4,7 +4,6 @@ import jalview.datamodel.SequenceFeature;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -37,8 +36,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     featureStore = new HashMap<String, FeatureStore>();
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#add(jalview.datamodel.SequenceFeature)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public boolean add(SequenceFeature sf)
@@ -52,8 +51,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return featureStore.get(type).addFeature(sf);
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#findFeatures(int, int, java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public List<SequenceFeature> findFeatures(int from, int to,
@@ -73,8 +72,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return result;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getAllFeatures(java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public List<SequenceFeature> getAllFeatures(String... type)
@@ -88,23 +87,47 @@ public class SequenceFeatures implements SequenceFeaturesI
     return result;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getFeatureCount(boolean, java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public int getFeatureCount(boolean positional, String... type)
   {
     int result = 0;
-    for (FeatureStore fs : featureStore.values())
+
+    for (String featureType : varargToTypes(type))
     {
-      result += fs.size(positional);
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        result += featureSet.getFeatureCount(positional);
+      }
     }
+    return result;
+  }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public int getTotalFeatureLength(String... type)
+  {
+    int result = 0;
+
+    for (String featureType : varargToTypes(type))
+    {
+      FeatureStore featureSet = featureStore.get(featureType);
+      if (featureSet != null)
+      {
+        result += featureSet.getTotalFeatureLength();
+      }
+    }
     return result;
+
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getPositionalFeatures(java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public List<SequenceFeature> getPositionalFeatures(String... type)
@@ -136,8 +159,8 @@ public class SequenceFeatures implements SequenceFeaturesI
             .keySet() : Arrays.asList(type);
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getContactFeatures(java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public List<SequenceFeature> getContactFeatures(String... type)
@@ -155,8 +178,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return result;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getNonPositionalFeatures(java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public List<SequenceFeature> getNonPositionalFeatures(String... type)
@@ -174,8 +197,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return result;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#delete(jalview.datamodel.SequenceFeature)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public boolean delete(SequenceFeature sf)
@@ -190,8 +213,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return false;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#hasFeatures()
+  /**
+   * {@inheritDoc}
    */
   @Override
   public boolean hasFeatures()
@@ -206,8 +229,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return false;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getFeatureGroups(boolean, java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public Set<String> getFeatureGroups(boolean positionalFeatures,
@@ -229,8 +252,8 @@ public class SequenceFeatures implements SequenceFeaturesI
     return groups;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getFeatureTypesForGroups(boolean, java.lang.String)
+  /**
+   * {@inheritDoc}
    */
   @Override
   public Set<String> getFeatureTypesForGroups(boolean positionalFeatures,
@@ -258,12 +281,50 @@ public class SequenceFeatures implements SequenceFeaturesI
     return result;
   }
 
-  /* (non-Javadoc)
-   * @see jalview.datamodel.features.SequenceFeaturesI#getFeatureTypes()
+  /**
+   * {@inheritDoc}
    */
   @Override
   public Set<String> getFeatureTypes()
   {
-    return Collections.unmodifiableSet(featureStore.keySet());
+    Set<String> types = new HashSet<String>();
+    for (Entry<String, FeatureStore> entry : featureStore.entrySet())
+    {
+      if (!entry.getValue().isEmpty())
+      {
+        types.add(entry.getKey());
+      }
+    }
+    return types;
+  }
+
+  /**
+   * Answers the minimum score held for positional or non-positional features
+   * for the specified type. This may be Float.NaN if there are no features, or
+   * none has a non-NaN score.
+   * 
+   * @param type
+   * @param positional
+   * @return
+   */
+  public float getMinimumScore(String type, boolean positional)
+  {
+    return featureStore.containsKey(type) ? featureStore.get(type)
+            .getMinimumScore(positional) : Float.NaN;
+  }
+
+  /**
+   * Answers the maximum score held for positional or non-positional features
+   * for the specified type. This may be Float.NaN if there are no features, or
+   * none has a non-NaN score.
+   * 
+   * @param type
+   * @param positional
+   * @return
+   */
+  public float getMaximumScore(String type, boolean positional)
+  {
+    return featureStore.containsKey(type) ? featureStore.get(type)
+            .getMaximumScore(positional) : Float.NaN;
   }
 }