mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/helpers/ExperimentHeader.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2005, 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: ExperimentHeader.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.9 $
2 26 Feb 07 jari 8  * $Date: 2006/07/13 16:08:37 $
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.helpers;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.Dimension;
2 26 Feb 07 jari 16 import java.awt.Font;
2 26 Feb 07 jari 17 import java.awt.FontMetrics;
2 26 Feb 07 jari 18 import java.awt.Graphics;
2 26 Feb 07 jari 19 import java.awt.Graphics2D;
2 26 Feb 07 jari 20 import java.awt.Insets;
2 26 Feb 07 jari 21 import java.awt.RenderingHints;
2 26 Feb 07 jari 22 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 23 import java.io.IOException;
2 26 Feb 07 jari 24 import java.io.ObjectInputStream;
2 26 Feb 07 jari 25 import java.io.ObjectOutputStream;
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 import javax.swing.JComponent;
2 26 Feb 07 jari 28 import javax.swing.JPanel;
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 /**
2 26 Feb 07 jari 34  * This class is used to render header of an experiment.
2 26 Feb 07 jari 35  *
2 26 Feb 07 jari 36  * @version 1.0
2 26 Feb 07 jari 37  * @author Aleksey D.Rezantsev
2 26 Feb 07 jari 38  */
2 26 Feb 07 jari 39 public class ExperimentHeader extends JPanel implements IExperimentHeader {
2 26 Feb 07 jari 40     
2 26 Feb 07 jari 41     
2 26 Feb 07 jari 42     private static final int RECT_HEIGHT = 15;
2 26 Feb 07 jari 43     private static final int COLOR_BAR_HEIGHT = 10;
2 26 Feb 07 jari 44     private Experiment experiment;
2 26 Feb 07 jari 45     private IData data;
2 26 Feb 07 jari 46     private int[] samplesOrder;
2 26 Feb 07 jari 47     private int[][] clusters;
2 26 Feb 07 jari 48     private int clusterIndex;
2 26 Feb 07 jari 49     private int elementWidth;
2 26 Feb 07 jari 50     private boolean isAntiAliasing = true;
2 26 Feb 07 jari 51     private float maxValue = 3f;
2 26 Feb 07 jari 52     private float minValue = -3f;
2 26 Feb 07 jari 53     private float midValue = 0.0f;
2 26 Feb 07 jari 54     private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 55     private BufferedImage negColorImage;
2 26 Feb 07 jari 56     private BufferedImage posColorImage;
2 26 Feb 07 jari 57     
2 26 Feb 07 jari 58     public void setExperiment(Experiment e) {
2 26 Feb 07 jari 59       this.experiment = e;
2 26 Feb 07 jari 60     }
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 63     
2 26 Feb 07 jari 64   
2 26 Feb 07 jari 65     protected void setIData(IData d) {this.data = d;}
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     /**
2 26 Feb 07 jari 69      * Construct an <code>ExperimentHeader</code> with specified experiment.
2 26 Feb 07 jari 70      */
2 26 Feb 07 jari 71     public ExperimentHeader(Experiment experiment, int [][] clusters) {
2 26 Feb 07 jari 72         this(experiment, clusters, null);
2 26 Feb 07 jari 73     }
2 26 Feb 07 jari 74     
2 26 Feb 07 jari 75     /**
2 26 Feb 07 jari 76      * Construct an <code>ExperimentHeader</code> with specified experiment
2 26 Feb 07 jari 77      * and samples order.
2 26 Feb 07 jari 78      */
2 26 Feb 07 jari 79     public ExperimentHeader(Experiment experiment, int [][] clusters, int[] samplesOrder) {
2 26 Feb 07 jari 80         this.experiment = experiment;
2 26 Feb 07 jari 81         this.clusters = clusters;
2 26 Feb 07 jari 82         this.samplesOrder = samplesOrder == null ? createSamplesOrder(experiment) : samplesOrder;
2 26 Feb 07 jari 83         setBackground(Color.white);
2 26 Feb 07 jari 84     }
2 26 Feb 07 jari 85     public Insets getInsets(){return insets;}
2 26 Feb 07 jari 86     public Experiment getExperiment() {
2 26 Feb 07 jari 87       return experiment;
2 26 Feb 07 jari 88     }
2 26 Feb 07 jari 89     public int[][] getClusters() {
2 26 Feb 07 jari 90       return clusters;
2 26 Feb 07 jari 91     }
2 26 Feb 07 jari 92     /**
2 26 Feb 07 jari 93      * Returns a component to be inserted into scroll pane view port.
2 26 Feb 07 jari 94      */
2 26 Feb 07 jari 95     public JComponent getContentComponent() {
2 26 Feb 07 jari 96         return this;
2 26 Feb 07 jari 97     }
2 26 Feb 07 jari 98     
2 26 Feb 07 jari 99     private static int[] createSamplesOrder(Experiment experiment) {
2 26 Feb 07 jari 100         int[] order = new int[experiment.getNumberOfSamples()];
2 26 Feb 07 jari 101         for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 102             order[i] = i;
2 26 Feb 07 jari 103         }
2 26 Feb 07 jari 104         return order;
2 26 Feb 07 jari 105     }
2 26 Feb 07 jari 106     public int[] getSamplesOrder(){return samplesOrder;}
2 26 Feb 07 jari 107     public BufferedImage getPosColorImage(){return posColorImage;}
2 26 Feb 07 jari 108     public BufferedImage getNegColorImage(){return negColorImage;}
2 26 Feb 07 jari 109     /**
2 26 Feb 07 jari 110      * Sets data.
2 26 Feb 07 jari 111      */
2 26 Feb 07 jari 112     public void setData(IData data) {
2 26 Feb 07 jari 113         this.data = data;
2 26 Feb 07 jari 114     }
2 26 Feb 07 jari 115     public IData getData(){return data;}
2 26 Feb 07 jari 116     
2 26 Feb 07 jari 117     /**
2 26 Feb 07 jari 118      * Sets max and min experiment values.
2 26 Feb 07 jari 119      */
2 26 Feb 07 jari 120     public void setValues(float minValue, float midValue, float maxValue) {
2 26 Feb 07 jari 121         this.maxValue = maxValue;
2 26 Feb 07 jari 122         this.minValue = minValue;
2 26 Feb 07 jari 123         this.midValue = midValue;
2 26 Feb 07 jari 124     }
2 26 Feb 07 jari 125
2 26 Feb 07 jari 126     /**
2 26 Feb 07 jari 127      * Sets max and min experiment values.
2 26 Feb 07 jari 128      */
2 26 Feb 07 jari 129     public void setValues(float minValue, float maxValue) {
2 26 Feb 07 jari 130         this.maxValue = maxValue;
2 26 Feb 07 jari 131         this.minValue = minValue;
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 positive and negative images
2 26 Feb 07 jari 136      */
2 26 Feb 07 jari 137     public void setNegAndPosColorImages(BufferedImage neg, BufferedImage pos){
2 26 Feb 07 jari 138         this.negColorImage = neg;
2 26 Feb 07 jari 139         this.posColorImage = pos;
2 26 Feb 07 jari 140     }
2 26 Feb 07 jari 141     
2 26 Feb 07 jari 142     /**
2 26 Feb 07 jari 143      * Sets flag to use a double gradient 
2 26 Feb 07 jari 144      */
2 26 Feb 07 jari 145     public void setUseDoubleGradient(boolean useDouble) {
2 26 Feb 07 jari 146       this.useDoubleGradient = useDouble;
2 26 Feb 07 jari 147     }    
2 26 Feb 07 jari 148      
2 26 Feb 07 jari 149     /**
2 26 Feb 07 jari 150      * Sets anti-aliasing property.
2 26 Feb 07 jari 151      */
2 26 Feb 07 jari 152     public void setAntiAliasing(boolean isAntiAliasing) {
2 26 Feb 07 jari 153         this.isAntiAliasing = isAntiAliasing;
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 the left margin for the header
2 26 Feb 07 jari 158      */
2 26 Feb 07 jari 159     public void setLeftInset(int leftMargin){
2 26 Feb 07 jari 160         insets.left = leftMargin;
2 26 Feb 07 jari 161     }
2 26 Feb 07 jari 162     
2 26 Feb 07 jari 163     /**
2 26 Feb 07 jari 164      * Sets current cluster index
2 26 Feb 07 jari 165      */
2 26 Feb 07 jari 166     public void setClusterIndex(int index){
2 26 Feb 07 jari 167         clusterIndex = index;
2 26 Feb 07 jari 168     }
2 26 Feb 07 jari 169     
2 26 Feb 07 jari 170     /**
2 26 Feb 07 jari 171      *  Gets current cluster
2 26 Feb 07 jari 172      */
2 26 Feb 07 jari 173     private int [] getCluster(){
2 26 Feb 07 jari 174         return clusters[clusterIndex];
2 26 Feb 07 jari 175     }
2 26 Feb 07 jari 176     
2 26 Feb 07 jari 177     /**
2 26 Feb 07 jari 178      * Returns height of color bar for experiments
2 26 Feb 07 jari 179      */
2 26 Feb 07 jari 180     private int getColorBarHeight(){
2 26 Feb 07 jari 181         for( int sample = 0; sample < samplesOrder.length ; sample++){
2 26 Feb 07 jari 182             if(data.getExperimentColor(experiment.getSampleIndex(this.samplesOrder[sample])) != null)
2 26 Feb 07 jari 183                 return COLOR_BAR_HEIGHT;
2 26 Feb 07 jari 184         }
2 26 Feb 07 jari 185         return 0;
2 26 Feb 07 jari 186     }
2 26 Feb 07 jari 187     
2 26 Feb 07 jari 188     /**
2 26 Feb 07 jari 189      * Sets an element width.
2 26 Feb 07 jari 190      */
2 26 Feb 07 jari 191     private void setElementWidth(int width) {
2 26 Feb 07 jari 192         this.elementWidth = width;
2 26 Feb 07 jari 193         if (width > 12) {
2 26 Feb 07 jari 194             width = 12;
2 26 Feb 07 jari 195         }
2 26 Feb 07 jari 196         setFont(new Font("monospaced", Font.PLAIN, width));
2 26 Feb 07 jari 197     }
2 26 Feb 07 jari 198     
2 26 Feb 07 jari 199     /**
2 26 Feb 07 jari 200      * Updates size of this header.
2 26 Feb 07 jari 201      */
2 26 Feb 07 jari 202     public void updateSizes(int contentWidth, int elementWidth) {
2 26 Feb 07 jari 203         if(data == null)
2 26 Feb 07 jari 204             return;
2 26 Feb 07 jari 205         setElementWidth(elementWidth);
2 26 Feb 07 jari 206         Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 207         if (g == null) {
2 26 Feb 07 jari 208             return;
2 26 Feb 07 jari 209         }
2 26 Feb 07 jari 210         if (isAntiAliasing) {
2 26 Feb 07 jari 211             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 212             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 213         }
2 26 Feb 07 jari 214         FontMetrics hfm = g.getFontMetrics();
2 26 Feb 07 jari 215         int maxHeight = 0;
2 26 Feb 07 jari 216         String name;
2 26 Feb 07 jari 217         final int size = this.experiment.getNumberOfSamples();
2 26 Feb 07 jari 218         for (int feature = 0; feature < size; feature++) {
2 26 Feb 07 jari 219             name = data.getSampleName(experiment.getSampleIndex(feature));
2 26 Feb 07 jari 220             maxHeight = Math.max(maxHeight, hfm.stringWidth(name));
2 26 Feb 07 jari 221         }
2 26 Feb 07 jari 222         maxHeight += RECT_HEIGHT + hfm.getHeight() + 10;
2 26 Feb 07 jari 223         maxHeight += getColorBarHeight();
2 26 Feb 07 jari 224         setSize(contentWidth, maxHeight);
2 26 Feb 07 jari 225         setPreferredSize(new Dimension(contentWidth, maxHeight));
2 26 Feb 07 jari 226     }
2 26 Feb 07 jari 227     
2 26 Feb 07 jari 228     /**
2 26 Feb 07 jari 229      * Paints the header into specified graphics.
2 26 Feb 07 jari 230      */
2 26 Feb 07 jari 231     public void paint(Graphics g1D) {
2 26 Feb 07 jari 232         super.paint(g1D);
2 26 Feb 07 jari 233         if (data == null || (this.getCluster().length < 1)) {
2 26 Feb 07 jari 234             return;
2 26 Feb 07 jari 235         }
2 26 Feb 07 jari 236         Graphics2D g = (Graphics2D)g1D;
2 26 Feb 07 jari 237         if (isAntiAliasing) {
2 26 Feb 07 jari 238             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 239             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 240         }
2 26 Feb 07 jari 241         drawHeader(g);
2 26 Feb 07 jari 242     }
2 26 Feb 07 jari 243     
2 26 Feb 07 jari 244     /**
2 26 Feb 07 jari 245      * Draws the header into specified graphics.
2 26 Feb 07 jari 246      */
2 26 Feb 07 jari 247     private void drawHeader(Graphics2D g) {
2 26 Feb 07 jari 248         final int samples = this.experiment.getNumberOfSamples();
2 26 Feb 07 jari 249         
2 26 Feb 07 jari 250         if (samples == 0) {
2 26 Feb 07 jari 251             return;
2 26 Feb 07 jari 252         }
2 26 Feb 07 jari 253         
2 26 Feb 07 jari 254         int width = samples*elementWidth;
2 26 Feb 07 jari 255         
2 26 Feb 07 jari 256         if(useDoubleGradient) {
2 26 Feb 07 jari 257           g.drawImage(this.negColorImage, insets.left, 0, (int)(width/2f), RECT_HEIGHT, null);
2 26 Feb 07 jari 258           g.drawImage(this.posColorImage, (int)((width)/2f + insets.left), 0, (int)(width/2.0), RECT_HEIGHT, null);
2 26 Feb 07 jari 259         } else {
2 26 Feb 07 jari 260           g.drawImage(this.posColorImage, insets.left, 0, width, RECT_HEIGHT, null);
2 26 Feb 07 jari 261         }
2 26 Feb 07 jari 262
2 26 Feb 07 jari 263         FontMetrics hfm = g.getFontMetrics();
2 26 Feb 07 jari 264         int descent = hfm.getDescent();
2 26 Feb 07 jari 265         int fHeight = hfm.getHeight();
2 26 Feb 07 jari 266         
2 26 Feb 07 jari 267         g.setColor(Color.black);
2 26 Feb 07 jari 268         
2 26 Feb 07 jari 269         int textWidth;
2 26 Feb 07 jari 270         g.drawString(String.valueOf(this.minValue), insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 271         textWidth = hfm.stringWidth(String.valueOf(midValue));
2 26 Feb 07 jari 272         if(useDoubleGradient)
2 26 Feb 07 jari 273           g.drawString(String.valueOf(midValue), (int)(width/2f)-textWidth/2 + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 274         textWidth = hfm.stringWidth(String.valueOf(this.maxValue));
2 26 Feb 07 jari 275         g.drawString(String.valueOf(this.maxValue), width-textWidth + insets.left, RECT_HEIGHT+fHeight);
2 26 Feb 07 jari 276         
2 26 Feb 07 jari 277         //draw possible clusters
2 26 Feb 07 jari 278         int h = -getSize().height + 5;
2 26 Feb 07 jari 279         boolean hasColorBar = false;
2 26 Feb 07 jari 280         if(this.getColorBarHeight() > 0){
2 26 Feb 07 jari 281             h += COLOR_BAR_HEIGHT;
2 26 Feb 07 jari 282             hasColorBar = true;
2 26 Feb 07 jari 283         }
2 26 Feb 07 jari 284         
2 26 Feb 07 jari 285         // draw feature names
2 26 Feb 07 jari 286         String name;
2 26 Feb 07 jari 287         g.rotate(-Math.PI/2);
2 26 Feb 07 jari 288         for (int sample = 0; sample < samples; sample++) {
2 26 Feb 07 jari 289             name = data.getSampleName(experiment.getSampleIndex(this.samplesOrder[sample]));
2 26 Feb 07 jari 290             g.drawString(name, h, descent + elementWidth*sample + elementWidth/2 + insets.left);
2 26 Feb 07 jari 291         }
2 26 Feb 07 jari 292         g.rotate(Math.PI/2);
2 26 Feb 07 jari 293         
2 26 Feb 07 jari 294         if(hasColorBar){
2 26 Feb 07 jari 295             Color color;
2 26 Feb 07 jari 296             for(int sample = 0; sample < samples; sample++){
2 26 Feb 07 jari 297                 color = data.getExperimentColor(experiment.getSampleIndex(this.samplesOrder[sample]));
2 26 Feb 07 jari 298                 if(color != null)
2 26 Feb 07 jari 299                     g.setColor(color);
2 26 Feb 07 jari 300                 else
2 26 Feb 07 jari 301                     g.setColor(Color.white);
2 26 Feb 07 jari 302                 g.fillRect(sample*elementWidth + insets.left, getSize().height - COLOR_BAR_HEIGHT - 2, elementWidth, COLOR_BAR_HEIGHT);
2 26 Feb 07 jari 303             }
2 26 Feb 07 jari 304         } else {
2 26 Feb 07 jari 305         }
2 26 Feb 07 jari 306     }  
2 26 Feb 07 jari 307 }