mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/ptm/PTMExperimentHeader.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 3 All rights reserved.
2 26 Feb 07 jari 4 */
2 26 Feb 07 jari 5 /*
2 26 Feb 07 jari 6  * $RCSfile: PTMExperimentHeader.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.6 $
2 26 Feb 07 jari 8  * $Date: 2006/03/24 15:51:08 $
2 26 Feb 07 jari 9  * $Author: eleanorahowe $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.ptm;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.BorderLayout;
2 26 Feb 07 jari 15 import java.awt.Color;
2 26 Feb 07 jari 16 import java.awt.Dimension;
2 26 Feb 07 jari 17 import java.awt.Font;
2 26 Feb 07 jari 18 import java.awt.FontMetrics;
2 26 Feb 07 jari 19 import java.awt.Graphics;
2 26 Feb 07 jari 20 import java.awt.Graphics2D;
2 26 Feb 07 jari 21 import java.awt.Insets;
2 26 Feb 07 jari 22 import java.awt.RenderingHints;
2 26 Feb 07 jari 23 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 24 import java.beans.Encoder;
2 26 Feb 07 jari 25 import java.beans.Expression;
2 26 Feb 07 jari 26 import java.beans.PersistenceDelegate;
2 26 Feb 07 jari 27 import java.util.Vector;
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29 import javax.swing.JComponent;
2 26 Feb 07 jari 30 import javax.swing.JPanel;
2 26 Feb 07 jari 31
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.gui.helpers.CentroidExperimentHeader;
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34 /**
2 26 Feb 07 jari 35  *
2 26 Feb 07 jari 36  * @author  nbhagaba
2 26 Feb 07 jari 37  * @version
2 26 Feb 07 jari 38  */
2 26 Feb 07 jari 39 public class PTMExperimentHeader extends javax.swing.JPanel {
2 26 Feb 07 jari 40     
2 26 Feb 07 jari 41     private PTMVectorPanel ptmVectorPanel;
2 26 Feb 07 jari 42     private static final String PTM_TEMPLATE_STRING = "Template";
2 26 Feb 07 jari 43     private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 44     private BufferedImage posColorImage;
2 26 Feb 07 jari 45     private BufferedImage negColorImage;
2 26 Feb 07 jari 46     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 47     private JComponent expHeader;
2 26 Feb 07 jari 48     private Vector templateVector;
2 26 Feb 07 jari 49
2 26 Feb 07 jari 50     /** Creates new PTMExperimentHeader */
2 26 Feb 07 jari 51     
2 26 Feb 07 jari 52     public PTMExperimentHeader(JComponent expHeader, Vector templateVector) {
2 26 Feb 07 jari 53       setLayout(new BorderLayout());
2 26 Feb 07 jari 54     setBackground(Color.white);
2 26 Feb 07 jari 55     this.expHeader = expHeader;
2 26 Feb 07 jari 56     this.templateVector = templateVector;
2 26 Feb 07 jari 57     this.ptmVectorPanel = new PTMVectorPanel(templateVector);
2 26 Feb 07 jari 58     add(expHeader, BorderLayout.NORTH);
2 26 Feb 07 jari 59     add(ptmVectorPanel, BorderLayout.SOUTH);
2 26 Feb 07 jari 60   }
2 26 Feb 07 jari 61     public static PersistenceDelegate getPersistenceDelegate(){
2 26 Feb 07 jari 62       return new PTMExperimentHeaderPersistenceDelegate();
2 26 Feb 07 jari 63     }
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     public Vector getTemplateVector(){return templateVector;}
2 26 Feb 07 jari 66     public JComponent getExpHeader(){return expHeader;}
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     public void setUseDoubleGradient(boolean useDouble) {
2 26 Feb 07 jari 69       useDoubleGradient = useDouble;
2 26 Feb 07 jari 70     }
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72
2 26 Feb 07 jari 73     /**
2 26 Feb 07 jari 74      * The component to display ptm vector.
2 26 Feb 07 jari 75      */
2 26 Feb 07 jari 76     private class PTMVectorPanel extends JPanel {
2 26 Feb 07 jari 77   
2 26 Feb 07 jari 78   private Vector templateVector;
2 26 Feb 07 jari 79   private int cluster;
2 26 Feb 07 jari 80   private float maxValue = 3f;
2 26 Feb 07 jari 81   private float minValue = -3f;
2 26 Feb 07 jari 82   private float midValue = 0.0f;
2 26 Feb 07 jari 83   private Dimension elementSize;
2 26 Feb 07 jari 84   private boolean drawBorders = true;
2 26 Feb 07 jari 85   private boolean isAntiAliasing = false;
2 26 Feb 07 jari 86   private Color missingColor = new Color(128, 128, 128);
2 26 Feb 07 jari 87   
2 26 Feb 07 jari 88   /**
2 26 Feb 07 jari 89    * Constructs a <code>PTMVectorPanel</code> with specified templateVector.
2 26 Feb 07 jari 90    */
2 26 Feb 07 jari 91   public PTMVectorPanel(Vector templateVector) {
2 26 Feb 07 jari 92       setBackground(Color.white);
2 26 Feb 07 jari 93       this.templateVector = templateVector;
2 26 Feb 07 jari 94   }
2 26 Feb 07 jari 95   
2 26 Feb 07 jari 96         private void writeObject(java.io.ObjectOutputStream oos) throws java.io.IOException {
2 26 Feb 07 jari 97             oos.defaultWriteObject();
2 26 Feb 07 jari 98             oos.writeObject(this.templateVector);
2 26 Feb 07 jari 99             oos.writeInt(this.cluster);
2 26 Feb 07 jari 100             oos.writeFloat(this.maxValue);
2 26 Feb 07 jari 101             oos.writeFloat(this.minValue);
2 26 Feb 07 jari 102             oos.writeObject(this.elementSize);
2 26 Feb 07 jari 103             oos.writeBoolean(this.drawBorders);
2 26 Feb 07 jari 104             oos.writeBoolean(this.isAntiAliasing);
2 26 Feb 07 jari 105             oos.writeObject(this.missingColor);
2 26 Feb 07 jari 106         }
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         private void readObject(java.io.ObjectInputStream ois) throws java.io.IOException, ClassNotFoundException {
2 26 Feb 07 jari 109             ois.defaultReadObject();
2 26 Feb 07 jari 110             this.templateVector = (Vector)ois.readObject();
2 26 Feb 07 jari 111             this.cluster = ois.readInt();
2 26 Feb 07 jari 112             this.maxValue = ois.readFloat();
2 26 Feb 07 jari 113             this.minValue = ois.readFloat();
2 26 Feb 07 jari 114             this.elementSize = (Dimension)ois.readObject();
2 26 Feb 07 jari 115             this.drawBorders = ois.readBoolean();
2 26 Feb 07 jari 116             this.isAntiAliasing = ois.readBoolean();
2 26 Feb 07 jari 117             this.missingColor = (Color)ois.readObject();
2 26 Feb 07 jari 118         }
2 26 Feb 07 jari 119         
2 26 Feb 07 jari 120   /**
2 26 Feb 07 jari 121    * Sets color for NaN values.
2 26 Feb 07 jari 122    */
2 26 Feb 07 jari 123   public void setMissingColor(Color color) {
2 26 Feb 07 jari 124       this.missingColor = color;
2 26 Feb 07 jari 125   }
2 26 Feb 07 jari 126   
2 26 Feb 07 jari 127   /**
2 26 Feb 07 jari 128    * Sets current index of a cluster.
2 26 Feb 07 jari 129    */
2 26 Feb 07 jari 130   public void setCurrentCluster(int cluster) {
2 26 Feb 07 jari 131       this.cluster = cluster;
2 26 Feb 07 jari 132   }
2 26 Feb 07 jari 133   
2 26 Feb 07 jari 134   /**
2 26 Feb 07 jari 135    * Sets the draw borders attribute.
2 26 Feb 07 jari 136    */
2 26 Feb 07 jari 137   public void setDrawBorders(boolean draw) {
2 26 Feb 07 jari 138       this.drawBorders = draw;
2 26 Feb 07 jari 139   }
2 26 Feb 07 jari 140   
2 26 Feb 07 jari 141   /**
2 26 Feb 07 jari 142    * Sets the anti aliasing attribute.
2 26 Feb 07 jari 143    */
2 26 Feb 07 jari 144   public void setAntiAliasing(boolean value) {
2 26 Feb 07 jari 145       this.isAntiAliasing = value;
2 26 Feb 07 jari 146   }
2 26 Feb 07 jari 147   
2 26 Feb 07 jari 148   /**
2 26 Feb 07 jari 149    * Sets min and max values.
2 26 Feb 07 jari 150    */
2 26 Feb 07 jari 151   public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 152       this.maxValue = maxValue;
2 26 Feb 07 jari 153       this.minValue = minValue;
2 26 Feb 07 jari 154   }
2 26 Feb 07 jari 155
2 26 Feb 07 jari 156   /**
2 26 Feb 07 jari 157    * Sets min and max values.
2 26 Feb 07 jari 158    */
2 26 Feb 07 jari 159   public void setValues(float minValue, float midValue, float maxValue) {
2 26 Feb 07 jari 160       this.maxValue = maxValue;
2 26 Feb 07 jari 161       this.minValue = minValue;
2 26 Feb 07 jari 162       this.midValue = midValue;
2 26 Feb 07 jari 163   }
2 26 Feb 07 jari 164   
2 26 Feb 07 jari 165         /**
2 26 Feb 07 jari 166          * Sets left margin
2 26 Feb 07 jari 167          */
2 26 Feb 07 jari 168         public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 169             insets.left = leftMargin;
2 26 Feb 07 jari 170         }
2 26 Feb 07 jari 171   
2 26 Feb 07 jari 172   /**
2 26 Feb 07 jari 173    * Updates the component size.
2 26 Feb 07 jari 174    */
2 26 Feb 07 jari 175   public void updateSize(Dimension size) {
2 26 Feb 07 jari 176       this.elementSize = new Dimension(size);
2 26 Feb 07 jari 177       setFont(new Font("monospaced", Font.PLAIN, size.height));
2 26 Feb 07 jari 178       Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 179       if (isAntiAliasing) {
2 26 Feb 07 jari 180     ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 181     ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 182       }
2 26 Feb 07 jari 183       FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 184       int strWidth = metrics.stringWidth(PTM_TEMPLATE_STRING)+10;
2 26 Feb 07 jari 185       
2 26 Feb 07 jari 186       int width  = size.width*this.templateVector.size() +strWidth;
2 26 Feb 07 jari 187       int height = size.height+10;
2 26 Feb 07 jari 188       setSize(width, height);
2 26 Feb 07 jari 189       setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 190   }
2 26 Feb 07 jari 191   
2 26 Feb 07 jari 192   /**
2 26 Feb 07 jari 193    * Paints the component into specified graphics.
2 26 Feb 07 jari 194    */
2 26 Feb 07 jari 195   public void paint(Graphics g) {
2 26 Feb 07 jari 196       super.paint(g);
2 26 Feb 07 jari 197       if (isAntiAliasing) {
2 26 Feb 07 jari 198     ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 199     ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 200       }
2 26 Feb 07 jari 201       final int samples = templateVector.size();
2 26 Feb 07 jari 202       Vector scaledTemplateVector = new Vector();
2 26 Feb 07 jari 203       float max = getMax(templateVector);
2 26 Feb 07 jari 204       float min = getMin(templateVector);
2 26 Feb 07 jari 205       
2 26 Feb 07 jari 206       for (int i = 0; i < templateVector.size(); i++) {
2 26 Feb 07 jari 207     float current = ((Float)templateVector.get(i)).floatValue();
2 26 Feb 07 jari 208     if (current == max) {
2 26 Feb 07 jari 209         scaledTemplateVector.add(new Float(3.0f));
2 26 Feb 07 jari 210     } else if (current == min) {
2 26 Feb 07 jari 211         scaledTemplateVector.add(new Float(-3.0f));
2 26 Feb 07 jari 212     } else {
2 26 Feb 07 jari 213         float scaledValue = 6*((current - min)/(max - min)) - 3;
2 26 Feb 07 jari 214         scaledTemplateVector.add(new Float(scaledValue));
2 26 Feb 07 jari 215     }
2 26 Feb 07 jari 216       }
2 26 Feb 07 jari 217       
2 26 Feb 07 jari 218       for (int i=0; i<samples; i++) {
2 26 Feb 07 jari 219     fillRectAt(g, i, getColor(((Float)scaledTemplateVector.get(i)).floatValue()));
2 26 Feb 07 jari 220     if (this.drawBorders) {
2 26 Feb 07 jari 221         drawRectAt(g, i, Color.black);
2 26 Feb 07 jari 222     }
2 26 Feb 07 jari 223       }
2 26 Feb 07 jari 224       g.setColor(Color.black);
2 26 Feb 07 jari 225       g.drawString(PTM_TEMPLATE_STRING, elementSize.width*samples+10 + insets.left, elementSize.height);
2 26 Feb 07 jari 226   }
2 26 Feb 07 jari 227   
2 26 Feb 07 jari 228   private float getMax(Vector gene) {
2 26 Feb 07 jari 229       float max = Float.MIN_VALUE;
2 26 Feb 07 jari 230       
2 26 Feb 07 jari 231       for(int i = 0; i < gene.size(); i++) {
2 26 Feb 07 jari 232     if (! Float.isNaN(((Float)gene.get(i)).floatValue())) {
2 26 Feb 07 jari 233         float current = ((Float)gene.get(i)).floatValue();
2 26 Feb 07 jari 234         if (current > max) max = current;
2 26 Feb 07 jari 235     }
2 26 Feb 07 jari 236       }
2 26 Feb 07 jari 237       
2 26 Feb 07 jari 238       return max;
2 26 Feb 07 jari 239   }
2 26 Feb 07 jari 240   
2 26 Feb 07 jari 241   
2 26 Feb 07 jari 242   private float getMin(Vector gene) {
2 26 Feb 07 jari 243       float min = Float.MAX_VALUE;
2 26 Feb 07 jari 244       
2 26 Feb 07 jari 245       for(int i = 0; i < gene.size(); i++) {
2 26 Feb 07 jari 246     if (! Float.isNaN(((Float)gene.get(i)).floatValue())) {
2 26 Feb 07 jari 247         float current = ((Float)gene.get(i)).floatValue();
2 26 Feb 07 jari 248         if (current < min) min = current;
2 26 Feb 07 jari 249     }
2 26 Feb 07 jari 250       }
2 26 Feb 07 jari 251       
2 26 Feb 07 jari 252       return min;
2 26 Feb 07 jari 253   }
2 26 Feb 07 jari 254   
2 26 Feb 07 jari 255   /**
2 26 Feb 07 jari 256    * Fill in rect for the specified sample.
2 26 Feb 07 jari 257    */
2 26 Feb 07 jari 258   private void fillRectAt(Graphics g, int sample, Color color) {
2 26 Feb 07 jari 259       g.setColor(color);
2 26 Feb 07 jari 260       g.fillRect(sample*elementSize.width + insets.left, 0, elementSize.width, elementSize.height);
2 26 Feb 07 jari 261   }
2 26 Feb 07 jari 262   
2 26 Feb 07 jari 263   /**
2 26 Feb 07 jari 264    * Draw rect for the specified sample.
2 26 Feb 07 jari 265    */
2 26 Feb 07 jari 266   private void drawRectAt(Graphics g, int sample, Color color) {
2 26 Feb 07 jari 267       g.setColor(color);
2 26 Feb 07 jari 268       g.drawRect(sample*elementSize.width, 0, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 269   }
2 26 Feb 07 jari 270
2 26 Feb 07 jari 271
2 26 Feb 07 jari 272     /**
2 26 Feb 07 jari 273      * Calculates color for passed value.
2 26 Feb 07 jari 274      */
2 26 Feb 07 jari 275      private Color getColor(float value) {
2 26 Feb 07 jari 276         if (Float.isNaN(value)) {
2 26 Feb 07 jari 277             return missingColor;
2 26 Feb 07 jari 278         }
2 26 Feb 07 jari 279         
2 26 Feb 07 jari 280         float maximum;
2 26 Feb 07 jari 281         int colorIndex, rgb;
2 26 Feb 07 jari 282         
2 26 Feb 07 jari 283         if(useDoubleGradient) {
2 26 Feb 07 jari 284           maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 285       colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 286       colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 287       rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 288           : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 289         } else {
2 26 Feb 07 jari 290           float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 291           if(value <= minValue)
2 26 Feb 07 jari 292             colorIndex = 0;
2 26 Feb 07 jari 293           else if(value >= maxValue)
2 26 Feb 07 jari 294             colorIndex = 255;
2 26 Feb 07 jari 295           else
2 26 Feb 07 jari 296             colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 297            
2 26 Feb 07 jari 298           rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 299         }
2 26 Feb 07 jari 300         return new Color(rgb);
2 26 Feb 07 jari 301     }
2 26 Feb 07 jari 302     }
2 26 Feb 07 jari 303   
2 26 Feb 07 jari 304     
2 26 Feb 07 jari 305     
2 26 Feb 07 jari 306     /**
2 26 Feb 07 jari 307      * Updates the viewer size.
2 26 Feb 07 jari 308      */
2 26 Feb 07 jari 309     public void updateSize(Dimension size) {
2 26 Feb 07 jari 310   ptmVectorPanel.updateSize(size);
2 26 Feb 07 jari 311     }
2 26 Feb 07 jari 312     
2 26 Feb 07 jari 313     /**
2 26 Feb 07 jari 314      * Sets the current index of a cluster.
2 26 Feb 07 jari 315      */
2 26 Feb 07 jari 316     public void setCurrentCluster(int cluster) {
2 26 Feb 07 jari 317   ptmVectorPanel.setCurrentCluster(cluster);
2 26 Feb 07 jari 318     }
2 26 Feb 07 jari 319     
2 26 Feb 07 jari 320     /**
2 26 Feb 07 jari 321      * Sets the draw borders attribute.
2 26 Feb 07 jari 322      */
2 26 Feb 07 jari 323     public void setDrawBorders(boolean draw) {
2 26 Feb 07 jari 324   ptmVectorPanel.setDrawBorders(draw);
2 26 Feb 07 jari 325     }
2 26 Feb 07 jari 326     
2 26 Feb 07 jari 327     /**
2 26 Feb 07 jari 328      * Sets min and max values.
2 26 Feb 07 jari 329      */
2 26 Feb 07 jari 330     public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 331       ptmVectorPanel.setValues(minValue, maxValue);
2 26 Feb 07 jari 332     }
2 26 Feb 07 jari 333
2 26 Feb 07 jari 334     /**
2 26 Feb 07 jari 335      * Sets min and max values.
2 26 Feb 07 jari 336      */
2 26 Feb 07 jari 337     public void setValues(float minValue, float midValue, float maxValue) {
2 26 Feb 07 jari 338       ptmVectorPanel.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 339     }
2 26 Feb 07 jari 340     
2 26 Feb 07 jari 341     
2 26 Feb 07 jari 342     /**
2 26 Feb 07 jari 343      * Sets gradient images.
2 26 Feb 07 jari 344      */
2 26 Feb 07 jari 345     public void setColorImages(BufferedImage posColorImage, BufferedImage negColorImage) {
2 26 Feb 07 jari 346         this.posColorImage = posColorImage;
2 26 Feb 07 jari 347         this.negColorImage = negColorImage;
2 26 Feb 07 jari 348     }
2 26 Feb 07 jari 349     
2 26 Feb 07 jari 350     /**
2 26 Feb 07 jari 351      * Sets color for NaN values.
2 26 Feb 07 jari 352      */
2 26 Feb 07 jari 353     public void setMissingColor(Color color) {
2 26 Feb 07 jari 354   ptmVectorPanel.setMissingColor(color);
2 26 Feb 07 jari 355     }
2 26 Feb 07 jari 356     
2 26 Feb 07 jari 357     /**
2 26 Feb 07 jari 358      * Sets the anti aliasing attribute.
2 26 Feb 07 jari 359      */
2 26 Feb 07 jari 360     public void setAntiAliasing(boolean value) {
2 26 Feb 07 jari 361   ptmVectorPanel.setAntiAliasing(value);
2 26 Feb 07 jari 362     }
2 26 Feb 07 jari 363     
2 26 Feb 07 jari 364     private static class PTMExperimentHeaderPersistenceDelegate extends PersistenceDelegate {
2 26 Feb 07 jari 365
2 26 Feb 07 jari 366     protected Expression instantiate(Object o, Encoder encoder) {
2 26 Feb 07 jari 367       PTMExperimentHeader oldInstance = (PTMExperimentHeader)o;
2 26 Feb 07 jari 368       return new Expression(oldInstance, oldInstance.getClass(), "new", 
2 26 Feb 07 jari 369           new Object[]{oldInstance.getExpHeader(), oldInstance.getTemplateVector()});
2 26 Feb 07 jari 370     }
2 26 Feb 07 jari 371     public void initialize(Class type, Object oldInstance, Object newInstance, Encoder encoder) {
2 26 Feb 07 jari 372       return;
2 26 Feb 07 jari 373     }
2 26 Feb 07 jari 374       
2 26 Feb 07 jari 375     }
2 26 Feb 07 jari 376 }