mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/som/SOMExperimentHeader.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: SOMExperimentHeader.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.4 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:54 $
2 26 Feb 07 jari 9  * $Author: caliente $
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.som;
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
2 26 Feb 07 jari 25 import javax.swing.JComponent;
2 26 Feb 07 jari 26 import javax.swing.JPanel;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30 public class SOMExperimentHeader extends JPanel {
2 26 Feb 07 jari 31     
2 26 Feb 07 jari 32     private SOMVectorPanel somVectorPanel;
2 26 Feb 07 jari 33     private int [][] clusters;
2 26 Feb 07 jari 34     private int clusterIndex;
2 26 Feb 07 jari 35     private static final String SOM_VECTOR_STRING = "SOM Vector";
2 26 Feb 07 jari 36     private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 37     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 38     
2 26 Feb 07 jari 39     /**
2 26 Feb 07 jari 40      * Construct a <code>SOMExperimentHeader</code> with specified experiment
2 26 Feb 07 jari 41      * header and codes.
2 26 Feb 07 jari 42      */
2 26 Feb 07 jari 43     public SOMExperimentHeader(JComponent expHeader, FloatMatrix codes, int [][] clusters) {
2 26 Feb 07 jari 44         setLayout(new BorderLayout());
2 26 Feb 07 jari 45         setBackground(Color.white);
2 26 Feb 07 jari 46         this.somVectorPanel = new SOMVectorPanel(codes);
2 26 Feb 07 jari 47         this.clusters = clusters;
2 26 Feb 07 jari 48         add(expHeader, BorderLayout.NORTH);
2 26 Feb 07 jari 49         add(somVectorPanel, BorderLayout.SOUTH);
2 26 Feb 07 jari 50     }
2 26 Feb 07 jari 51     
2 26 Feb 07 jari 52     /**
2 26 Feb 07 jari 53      * Sets index of current cluster to view
2 26 Feb 07 jari 54      */
2 26 Feb 07 jari 55     public void setClusterIndex(int index){
2 26 Feb 07 jari 56         this.clusterIndex = index;
2 26 Feb 07 jari 57     }
2 26 Feb 07 jari 58     
2 26 Feb 07 jari 59     /**
2 26 Feb 07 jari 60      * Returns current cluster
2 26 Feb 07 jari 61      */
2 26 Feb 07 jari 62     private int [] getCluster(){
2 26 Feb 07 jari 63         return clusters[clusterIndex];
2 26 Feb 07 jari 64     }
2 26 Feb 07 jari 65     
2 26 Feb 07 jari 66     /**
2 26 Feb 07 jari 67      * sets flag to use double or single gradient
2 26 Feb 07 jari 68      * @param useDouble 
2 26 Feb 07 jari 69      */
2 26 Feb 07 jari 70     private void setUseDoubleGradient(boolean useDouble) {
2 26 Feb 07 jari 71       useDoubleGradient = useDouble;    
2 26 Feb 07 jari 72     }
2 26 Feb 07 jari 73     
2 26 Feb 07 jari 74     /**
2 26 Feb 07 jari 75      * The component to display som vector.
2 26 Feb 07 jari 76      */
2 26 Feb 07 jari 77     private class SOMVectorPanel extends JPanel {
2 26 Feb 07 jari 78         
2 26 Feb 07 jari 79         private FloatMatrix codes;
2 26 Feb 07 jari 80         private int cluster;
2 26 Feb 07 jari 81         private float maxValue = 3f;
2 26 Feb 07 jari 82         private float minValue = -3f;
2 26 Feb 07 jari 83         private float midValue = 0.0f;
2 26 Feb 07 jari 84         private Dimension elementSize;
2 26 Feb 07 jari 85         private boolean drawBorders = true;
2 26 Feb 07 jari 86         private boolean isAntiAliasing = false;
2 26 Feb 07 jari 87         private Color missingColor = new Color(128, 128, 128);
2 26 Feb 07 jari 88         private BufferedImage posColorImage;
2 26 Feb 07 jari 89         private BufferedImage negColorImage;
2 26 Feb 07 jari 90         
2 26 Feb 07 jari 91         /**
2 26 Feb 07 jari 92          * Constructs a <code>SOMVectorPanel</code> with specified codes.
2 26 Feb 07 jari 93          */
2 26 Feb 07 jari 94         public SOMVectorPanel(FloatMatrix codes) {
2 26 Feb 07 jari 95             setBackground(Color.white);
2 26 Feb 07 jari 96             this.codes = codes;
2 26 Feb 07 jari 97         }
2 26 Feb 07 jari 98         
2 26 Feb 07 jari 99         /**
2 26 Feb 07 jari 100          * Sets gradient images.
2 26 Feb 07 jari 101          */
2 26 Feb 07 jari 102         public void setColorImages(BufferedImage posColorImage, BufferedImage negColorImage) {
2 26 Feb 07 jari 103             this.posColorImage = posColorImage;
2 26 Feb 07 jari 104             this.negColorImage = negColorImage;
2 26 Feb 07 jari 105         }
2 26 Feb 07 jari 106         
2 26 Feb 07 jari 107         /**
2 26 Feb 07 jari 108          * Sets color for NaN values.
2 26 Feb 07 jari 109          */
2 26 Feb 07 jari 110         public void setMissingColor(Color color) {
2 26 Feb 07 jari 111             this.missingColor = color;
2 26 Feb 07 jari 112         }
2 26 Feb 07 jari 113         
2 26 Feb 07 jari 114         /**
2 26 Feb 07 jari 115          * Sets current index of a cluster.
2 26 Feb 07 jari 116          */
2 26 Feb 07 jari 117         public void setCurrentCluster(int cluster) {
2 26 Feb 07 jari 118             this.cluster = cluster;
2 26 Feb 07 jari 119             clusterIndex = cluster;
2 26 Feb 07 jari 120         }
2 26 Feb 07 jari 121         
2 26 Feb 07 jari 122         /**
2 26 Feb 07 jari 123          * Sets the draw borders attribute.
2 26 Feb 07 jari 124          */
2 26 Feb 07 jari 125         public void setDrawBorders(boolean draw) {
2 26 Feb 07 jari 126             this.drawBorders = draw;
2 26 Feb 07 jari 127         }
2 26 Feb 07 jari 128         
2 26 Feb 07 jari 129         /**
2 26 Feb 07 jari 130          * Sets the anti aliasing attribute.
2 26 Feb 07 jari 131          */
2 26 Feb 07 jari 132         public void setAntiAliasing(boolean value) {
2 26 Feb 07 jari 133             this.isAntiAliasing = value;
2 26 Feb 07 jari 134         }
2 26 Feb 07 jari 135         
2 26 Feb 07 jari 136         /**
2 26 Feb 07 jari 137          * Sets left margin
2 26 Feb 07 jari 138          */
2 26 Feb 07 jari 139         public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 140             insets.left = leftMargin;
2 26 Feb 07 jari 141         }
2 26 Feb 07 jari 142         
2 26 Feb 07 jari 143         /**
2 26 Feb 07 jari 144          * Sets min and max values.
2 26 Feb 07 jari 145          */
2 26 Feb 07 jari 146         public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 147             this.maxValue = maxValue;
2 26 Feb 07 jari 148             this.minValue = minValue;
2 26 Feb 07 jari 149         }
2 26 Feb 07 jari 150
2 26 Feb 07 jari 151         public void setValues(float minValue, float midValue, 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             this.midValue = midValue;
2 26 Feb 07 jari 155         }        
2 26 Feb 07 jari 156         
2 26 Feb 07 jari 157         /**
2 26 Feb 07 jari 158          * Updates the component size.
2 26 Feb 07 jari 159          */
2 26 Feb 07 jari 160         public void updateSize(Dimension size) {
2 26 Feb 07 jari 161             this.elementSize = new Dimension(size);
2 26 Feb 07 jari 162             setFont(new Font("monospaced", Font.PLAIN, size.height));
2 26 Feb 07 jari 163             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 164             if (isAntiAliasing) {
2 26 Feb 07 jari 165                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 166                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 167             }
2 26 Feb 07 jari 168             FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 169             int strWidth = metrics.stringWidth(SOM_VECTOR_STRING)+10;
2 26 Feb 07 jari 170             
2 26 Feb 07 jari 171             int width  = size.width*this.codes.getColumnDimension() +strWidth;
2 26 Feb 07 jari 172             int height = size.height+10;
2 26 Feb 07 jari 173             setSize(width, height);
2 26 Feb 07 jari 174             setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 175         }
2 26 Feb 07 jari 176         
2 26 Feb 07 jari 177         /**
2 26 Feb 07 jari 178          * Paints the component into specified graphics.
2 26 Feb 07 jari 179          */
2 26 Feb 07 jari 180         public void paint(Graphics g) {
2 26 Feb 07 jari 181             super.paint(g);
2 26 Feb 07 jari 182             if(getCluster().length < 1)
2 26 Feb 07 jari 183                 return;
2 26 Feb 07 jari 184             
2 26 Feb 07 jari 185             if (isAntiAliasing) {
2 26 Feb 07 jari 186                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 187                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 188             }
2 26 Feb 07 jari 189             final int samples = codes.getColumnDimension();
2 26 Feb 07 jari 190             for (int i=0; i<samples; i++) {
2 26 Feb 07 jari 191                 fillRectAt(g, i, getColor(codes.get(this.cluster, i)));
2 26 Feb 07 jari 192                 if (this.drawBorders) {
2 26 Feb 07 jari 193                     drawRectAt(g, i, Color.black);
2 26 Feb 07 jari 194                 }
2 26 Feb 07 jari 195             }
2 26 Feb 07 jari 196             g.setColor(Color.black);
2 26 Feb 07 jari 197             g.drawString(SOM_VECTOR_STRING, elementSize.width*samples+10 + insets.left, elementSize.height);
2 26 Feb 07 jari 198         }
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         /**
2 26 Feb 07 jari 201          * Fill in rect for the specified sample.
2 26 Feb 07 jari 202          */
2 26 Feb 07 jari 203         private void fillRectAt(Graphics g, int sample, Color color) {
2 26 Feb 07 jari 204             g.setColor(color);
2 26 Feb 07 jari 205             g.fillRect(sample*elementSize.width + insets.left, 0, elementSize.width, elementSize.height);
2 26 Feb 07 jari 206         }
2 26 Feb 07 jari 207         
2 26 Feb 07 jari 208         /**
2 26 Feb 07 jari 209          * Draw rect for the specified sample.
2 26 Feb 07 jari 210          */
2 26 Feb 07 jari 211         private void drawRectAt(Graphics g, int sample, Color color) {
2 26 Feb 07 jari 212             g.setColor(color);
2 26 Feb 07 jari 213             g.drawRect(sample*elementSize.width + insets.left, 0, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 214         }
2 26 Feb 07 jari 215         
2 26 Feb 07 jari 216         /**
2 26 Feb 07 jari 217          * Calculates color for passed value.
2 26 Feb 07 jari 218          */
2 26 Feb 07 jari 219         private Color getColor(float value) {
2 26 Feb 07 jari 220             if (Float.isNaN(value)) {
2 26 Feb 07 jari 221                 return missingColor;
2 26 Feb 07 jari 222             }
2 26 Feb 07 jari 223             
2 26 Feb 07 jari 224             float maximum;
2 26 Feb 07 jari 225             int colorIndex, rgb;
2 26 Feb 07 jari 226             
2 26 Feb 07 jari 227             if(useDoubleGradient) {
2 26 Feb 07 jari 228               maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 229           colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 230           colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 231           rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 232               : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 233             } else {
2 26 Feb 07 jari 234               float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 235               if(value <= minValue)
2 26 Feb 07 jari 236                 colorIndex = 0;
2 26 Feb 07 jari 237               else if(value >= maxValue)
2 26 Feb 07 jari 238                 colorIndex = 255;
2 26 Feb 07 jari 239               else
2 26 Feb 07 jari 240                 colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 241                
2 26 Feb 07 jari 242               rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 243             }
2 26 Feb 07 jari 244             return new Color(rgb);
2 26 Feb 07 jari 245         }
2 26 Feb 07 jari 246                 
2 26 Feb 07 jari 247     }
2 26 Feb 07 jari 248     
2 26 Feb 07 jari 249     /**
2 26 Feb 07 jari 250      * Updates the viewer size.
2 26 Feb 07 jari 251      */
2 26 Feb 07 jari 252     public void updateSize(Dimension size) {
2 26 Feb 07 jari 253         somVectorPanel.updateSize(size);
2 26 Feb 07 jari 254     }
2 26 Feb 07 jari 255     
2 26 Feb 07 jari 256     /**
2 26 Feb 07 jari 257      * Sets the current index of a cluster.
2 26 Feb 07 jari 258      */
2 26 Feb 07 jari 259     public void setCurrentCluster(int cluster) {
2 26 Feb 07 jari 260         somVectorPanel.setCurrentCluster(cluster);
2 26 Feb 07 jari 261     }
2 26 Feb 07 jari 262     
2 26 Feb 07 jari 263     /**
2 26 Feb 07 jari 264      * Sets the draw borders attribute.
2 26 Feb 07 jari 265      */
2 26 Feb 07 jari 266     public void setDrawBorders(boolean draw) {
2 26 Feb 07 jari 267         somVectorPanel.setDrawBorders(draw);
2 26 Feb 07 jari 268     }
2 26 Feb 07 jari 269     
2 26 Feb 07 jari 270     /**
2 26 Feb 07 jari 271      * Sets min and max values.
2 26 Feb 07 jari 272      */
2 26 Feb 07 jari 273     public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 274         somVectorPanel.setValues(minValue, maxValue);
2 26 Feb 07 jari 275     }
2 26 Feb 07 jari 276     
2 26 Feb 07 jari 277     /**
2 26 Feb 07 jari 278      * Sets min, mid, and max values.
2 26 Feb 07 jari 279      */
2 26 Feb 07 jari 280     public void setValues(float minValue, float midValue, float maxValue) {
2 26 Feb 07 jari 281         somVectorPanel.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 282     }    
2 26 Feb 07 jari 283     
2 26 Feb 07 jari 284     /**
2 26 Feb 07 jari 285      * Sets gradient images.
2 26 Feb 07 jari 286      */
2 26 Feb 07 jari 287     public void setColorImages(BufferedImage posColorImage, BufferedImage negColorImage) {
2 26 Feb 07 jari 288         somVectorPanel.setColorImages(posColorImage, negColorImage);
2 26 Feb 07 jari 289     }
2 26 Feb 07 jari 290     
2 26 Feb 07 jari 291     /**
2 26 Feb 07 jari 292      * Sets color for NaN values.
2 26 Feb 07 jari 293      */
2 26 Feb 07 jari 294     public void setMissingColor(Color color) {
2 26 Feb 07 jari 295         somVectorPanel.setMissingColor(color);
2 26 Feb 07 jari 296     }
2 26 Feb 07 jari 297     
2 26 Feb 07 jari 298     /**
2 26 Feb 07 jari 299      * Sets the anti aliasing attribute.
2 26 Feb 07 jari 300      */
2 26 Feb 07 jari 301     public void setAntiAliasing(boolean value) {
2 26 Feb 07 jari 302         somVectorPanel.setAntiAliasing(value);
2 26 Feb 07 jari 303     }
2 26 Feb 07 jari 304 }