render sequence logo over consensus histogram
authorjprocter <Jim Procter>
Fri, 21 Aug 2009 11:18:37 +0000 (11:18 +0000)
committerjprocter <Jim Procter>
Fri, 21 Aug 2009 11:18:37 +0000 (11:18 +0000)
src/jalview/gui/AnnotationPanel.java

index 743e1fa..d705367 100755 (executable)
@@ -20,10 +20,16 @@ package jalview.gui;
 
 import java.awt.*;
 import java.awt.event.*;
+import java.awt.font.LineMetrics;
+import java.awt.geom.AffineTransform;
 import java.awt.image.*;
+import java.util.Hashtable;
+
 import javax.swing.*;
 
+import jalview.analysis.AAFrequency;
 import jalview.datamodel.*;
+import jalview.schemes.ColourSchemeI;
 
 /**
  * DOCUMENT ME!
@@ -1239,11 +1245,16 @@ public class AnnotationPanel extends JPanel implements MouseListener,
   public void drawBarGraph(Graphics g, AlignmentAnnotation aa, int sRes,
           int eRes, float min, float max, int y)
   {
+    ColourSchemeI profcolour = av.getGlobalColourScheme();
+    if (profcolour==null)
+    {
+      profcolour = new jalview.schemes.ZappoColourScheme();
+    }
     if (sRes > aa.annotations.length)
     {
       return;
     }
-
+    Font ofont = g.getFont();
     eRes = Math.min(eRes, aa.annotations.length);
 
     int x = 0, y1 = y, y2 = y;
@@ -1297,9 +1308,43 @@ public class AnnotationPanel extends JPanel implements MouseListener,
       {
         g.fillRect(x * av.charWidth, y1, av.charWidth, y2 - y1);
       }
-
+      // draw profile if available
+      if (aa.annotations[column].value!=0)
+      {
+        int profl[] = getProfileFor(aa,column);
+        int ht = y1,htn=y2-y1;//aa.graphHeight;
+          float wdth;
+          double ht2=0;
+          char[] dc = new char[1];
+          LineMetrics lm;
+          for (int c=1;profl!=null && c<profl[0];)
+          {
+            dc[0] = (char) profl[c++];
+            wdth = av.charWidth;
+            wdth/=(float) fm
+                    .charsWidth(dc,0,1);
+            
+            if (c>2)
+            {
+              ht+=(int)ht2;
+            }
+            {
+              //if (aa.annotations[column].value==0) {
+              //  g.setFont(ofont.deriveFont(AffineTransform.getScaleInstance(wdth, (ht2=(aa.graphHeight*0.1/av.charHeight)))));
+              //  ht = y2-(int)ht2;
+              //} else {
+                g.setFont(ofont.deriveFont(AffineTransform.getScaleInstance(wdth, (ht2=(htn*((double)profl[c++])/100.0))/av.charHeight)));
+                lm = g.getFontMetrics().getLineMetrics(dc,0,1, g);
+                //htn -=ht2;
+              //}
+              g.setColor(profcolour.findColour(dc[0])); // (av.globalColourScheme!=null) ? );// try to get a colourscheme for the group(aa.groupRef.cs==null) ? av.textColour2 : cs.findColour(dc));
+              g.drawChars(dc,0,1,x*av.charWidth, (int) (ht+lm.getHeight()));
+              // ht+=g.getFontMetrics().getAscent()-g.getFontMetrics().getDescent();
+            }
+          }
+          g.setFont(ofont);
+      }
       x++;
-
     }
     if (aa.threshold != null)
     {
@@ -1315,6 +1360,19 @@ public class AnnotationPanel extends JPanel implements MouseListener,
     }
   }
 
+  private int[] getProfileFor(AlignmentAnnotation aa, int column)
+  {
+    if (aa.groupRef!=null && aa.groupRef.consensusData!=null) {
+      return AAFrequency.extractProfile(aa.groupRef.consensusData[column],aa.groupRef.getIgnoreGapsConsensus());
+    }
+    // TODO extend annotation row to enable dynamic and static profile data to be stored  
+    if (aa.autoCalculated && aa.groupRef==null && aa.sequenceRef==null && aa.label.equals("Consensus"))
+    {
+      return AAFrequency.extractProfile(av.hconsensus[column],av.getIgnoreGapsConsensus());
+    }
+    return null;
+  }
+
   // used by overview window
   public void drawGraph(Graphics g, AlignmentAnnotation aa, int width,
           int y, int sRes, int eRes)