added feature gradient colours and sortby feature score/density to feature settings...
[jalview.git] / src / jalview / appletgui / FeatureRenderer.java
index cb9736e..249dd4a 100755 (executable)
@@ -26,6 +26,7 @@ import java.awt.event.*;
 
 import jalview.appletgui.FeatureSettings.MyCheckbox;
 import jalview.datamodel.*;
+import jalview.schemes.GraduatedColor;
 
 /**
  * DOCUMENT ME!
@@ -542,8 +543,8 @@ public class FeatureRenderer
           if (sequenceFeatures[sfindex].begin <= start
                   && sequenceFeatures[sfindex].end >= start)
           {
-            currentColour = av.featuresDisplayed
-                    .get(sequenceFeatures[sfindex].type);
+            currentColour = new Integer(getColour(sequenceFeatures[sfindex]).getRGB());//av.featuresDisplayed
+                    //.get(sequenceFeatures[sfindex].type);
           }
 
         }
@@ -573,7 +574,7 @@ public class FeatureRenderer
           renderFeature(g, seq, seq
                   .findIndex(sequenceFeatures[sfindex].begin) - 1, seq
                   .findIndex(sequenceFeatures[sfindex].end) - 1,
-                  getColour(sequenceFeatures[sfindex].type), start, end, y1);
+                  getColour(sequenceFeatures[sfindex]), start, end, y1);
         }
 
       }
@@ -633,13 +634,15 @@ public class FeatureRenderer
       }
     }
   }
-
+  Hashtable minmax=null;
   void findAllFeatures()
   {
     jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
 
     av.featuresDisplayed = new Hashtable();
     Vector allfeatures = new Vector();
+    minmax = new Hashtable();
+    
     for (int i = 0; i < av.alignment.getHeight(); i++)
     {
       SequenceFeature[] features = av.alignment.getSequenceAt(i)
@@ -653,6 +656,10 @@ public class FeatureRenderer
       int index = 0;
       while (index < features.length)
       {
+        if (features[index].begin==0 && features[index].end==0) {
+          index++;
+          continue;
+        }
         if (!av.featuresDisplayed.containsKey(features[index].getType()))
         {
           if (getColour(features[index].getType()) == null)
@@ -665,6 +672,33 @@ public class FeatureRenderer
                   getColour(features[index].getType()).getRGB()));
           allfeatures.addElement(features[index].getType());
         }
+                if (features[index].score != Float.NaN)
+        {
+          int nonpos= features[index].getBegin()>=1 ? 0 : 1;
+          float[][] mm = (float[][]) minmax.get(features[index].getType());
+          if (mm == null)
+          {
+            mm = new float[][] {null, null };
+            minmax.put(features[index].getType(), mm);
+          }
+          if (mm[nonpos]==null)
+          { 
+            mm[nonpos] = new float[] { features[index].score, features[index].score };
+            
+          }
+          else
+          {
+            if (mm[nonpos][0] > features[index].score)
+            {
+              mm[nonpos][0] = features[index].score;
+            }
+            if (mm[nonpos][1] < features[index].score)
+            {
+              mm[nonpos][1] = features[index].score;
+            }
+          }
+        }
+        
         index++;
       }
     }
@@ -681,15 +715,57 @@ public class FeatureRenderer
 
   public Color getColour(String featureType)
   {
-    if (!featureColours.containsKey(featureType))
+    Object fc = featureColours.get(featureType);
+    if (fc == null)
     {
       jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
       Color col = ucs.createColourFromName(featureType);
       featureColours.put(featureType, col);
       return col;
     }
+    else if (fc instanceof Color)
+    {
+      return (Color) fc;
+    }
     else
-      return (Color) featureColours.get(featureType);
+    {
+      if (fc instanceof GraduatedColor)
+      {
+        return ((GraduatedColor) fc).getMinColor();
+      }
+      // TODO: raise an implementation error here.
+      return null; // Color.white;
+    }
+  }
+  /**
+   * implement graduated colouring for features with scores
+   * 
+   * @param feature
+   * @return render colour for the given feature
+   */
+  public Color getColour(SequenceFeature feature)
+  {
+    Object fc = featureColours.get(feature.type);
+    if (fc == null)
+    {
+      jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme();
+      Color col = ucs.createColourFromName(feature.type);
+      featureColours.put(feature.type, col);
+      return col;
+    }
+    else if (fc instanceof Color)
+    {
+      return (Color) fc;
+    }
+    else
+    {
+      if (fc instanceof GraduatedColor)
+      {
+        return ((GraduatedColor) fc).findColor(feature);
+      }
+      // TODO: raise an implementation error here.
+      return null; // Color.white;
+    }
   }
 
   public void setColour(String featureType, Color col)
@@ -973,6 +1049,27 @@ public class FeatureRenderer
 
     return alignmentHasFeatures;
   }
+  /**
+   * 
+   * @return the displayed feature type as an array of strings
+   */
+  protected String[] getDisplayedFeatureTypes()
+  {
+    String[] typ = null;
+    synchronized (renderOrder)
+    {
+      typ = new String[renderOrder.length];
+      System.arraycopy(renderOrder, 0, typ, 0, typ.length);
+      for (int i = 0; i < typ.length; i++)
+      {
+        if (av.featuresDisplayed.get(typ[i]) == null)
+        {
+          typ[i] = null;
+            }
+        }       
+      }
+    return typ;
+  }
 }
 
 class TransparencySetter