mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/svm/SVMDiscriminantExperimentViewer.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, 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: SVMDiscriminantExperimentViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.10 $
2 26 Feb 07 jari 8  * $Date: 2006/05/02 16:57:36 $
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
2 26 Feb 07 jari 13 package org.tigr.microarray.mev.cluster.gui.impl.svm;
2 26 Feb 07 jari 14
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.Frame;
2 26 Feb 07 jari 20 import java.awt.GradientPaint;
2 26 Feb 07 jari 21 import java.awt.Graphics;
2 26 Feb 07 jari 22 import java.awt.Graphics2D;
2 26 Feb 07 jari 23 import java.awt.Insets;
2 26 Feb 07 jari 24 import java.awt.Rectangle;
2 26 Feb 07 jari 25 import java.awt.RenderingHints;
2 26 Feb 07 jari 26 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 27 import java.awt.event.ActionListener;
2 26 Feb 07 jari 28 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 29 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 30 import java.awt.event.MouseMotionListener;
2 26 Feb 07 jari 31 import java.awt.image.BufferedImage;
2 26 Feb 07 jari 32 import java.beans.Expression;
2 26 Feb 07 jari 33
2 26 Feb 07 jari 34 import java.io.IOException;
2 26 Feb 07 jari 35 import java.io.ObjectInputStream;
2 26 Feb 07 jari 36 import java.io.ObjectOutputStream;
2 26 Feb 07 jari 37 import java.text.DecimalFormat;
2 26 Feb 07 jari 38
2 26 Feb 07 jari 39 import javax.swing.JColorChooser;
2 26 Feb 07 jari 40 import javax.swing.JComponent;
2 26 Feb 07 jari 41 import javax.swing.JMenuItem;
2 26 Feb 07 jari 42 import javax.swing.JOptionPane;
2 26 Feb 07 jari 43 import javax.swing.JPanel;
2 26 Feb 07 jari 44 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 45 import javax.swing.SwingUtilities;
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.clusterUtil.*;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 50 import org.tigr.microarray.mev.cluster.gui.IDisplayMenu;
2 26 Feb 07 jari 51 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 52 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 53 import org.tigr.microarray.mev.cluster.gui.helpers.CentroidViewer;
2 26 Feb 07 jari 54 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentHeader;
2 26 Feb 07 jari 55 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentUtil;
2 26 Feb 07 jari 56 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58
2 26 Feb 07 jari 59
2 26 Feb 07 jari 60 public class SVMDiscriminantExperimentViewer extends JPanel implements IViewer {
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     private int numRetainedPos;
2 26 Feb 07 jari 63     private int numRecruitedNeg;
2 26 Feb 07 jari 64     private Color RecruitColor = Color.red;
2 26 Feb 07 jari 65     private boolean classifyGenes = true;
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     private ExperimentHeader header;
2 26 Feb 07 jari 68     private Experiment experiment;
2 26 Feb 07 jari 69     private IFramework framework;
2 26 Feb 07 jari 70     private IData data;
2 26 Feb 07 jari 71     protected int clusterIndex;
2 26 Feb 07 jari 72     private int[][] clusters;
2 26 Feb 07 jari 73     private float [][] discriminants;
2 26 Feb 07 jari 74     protected int[] samplesOrder;
2 26 Feb 07 jari 75     protected Dimension elementSize = new Dimension(20, 5);
2 26 Feb 07 jari 76     protected int labelIndex = -1;
2 26 Feb 07 jari 77     protected boolean isAntiAliasing = true;
2 26 Feb 07 jari 78     protected boolean isDrawBorders = true;
2 26 Feb 07 jari 79     protected boolean isDrawAnnotations = true;
2 26 Feb 07 jari 80     public static Color missingColor = new Color(128, 128, 128);
2 26 Feb 07 jari 81     public static Color maskColor = new Color(255, 255, 255, 128);
2 26 Feb 07 jari 82     private float maxValue = INITIAL_MAX_VALUE;
2 26 Feb 07 jari 83     private float minValue = INITIAL_MIN_VALUE;
2 26 Feb 07 jari 84     private float midValue = 0.0f;
2 26 Feb 07 jari 85     protected int firstSelectedRow = -1;
2 26 Feb 07 jari 86     protected int lastSelectedRow  = -1;
2 26 Feb 07 jari 87     public BufferedImage posColorImage = createGradientImage(Color.red, Color.black);
2 26 Feb 07 jari 88     public BufferedImage negColorImage = createGradientImage(Color.black, Color.green);
2 26 Feb 07 jari 89     private int annotationWidth;
2 26 Feb 07 jari 90     private Insets insets = new Insets(0, 10, 0, 0);
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     private static final int RECT_HEIGHT = 15;
2 26 Feb 07 jari 93     private static final float INITIAL_MAX_VALUE = 3f;
2 26 Feb 07 jari 94     private static final float INITIAL_MIN_VALUE = -3f;
2 26 Feb 07 jari 95     private static final String NO_GENES_STR = "No Genes in Cluster!";
2 26 Feb 07 jari 96     private static final String NO_EXPERIMENTS_STR = "No Experiments In Cluster!";
2 26 Feb 07 jari 97     private static final Font ERROR_FONT = new Font("monospaced", Font.BOLD, 20);
2 26 Feb 07 jari 98     
2 26 Feb 07 jari 99     protected static final String STORE_CLUSTER_CMD = "store-cluster-cmd";
2 26 Feb 07 jari 100     protected static final String SET_DEF_COLOR_CMD = "set-def-color-cmd";
2 26 Feb 07 jari 101     protected static final String SAVE_CLUSTER_CMD = "save-cluster-cmd";
2 26 Feb 07 jari 102     protected static final String SAVE_ALL_CLUSTERS_CMD = "save-all-clusters-cmd";
2 26 Feb 07 jari 103     protected static final String LAUNCH_NEW_SESSION_CMD = "launch-new-session-cmd";
2 26 Feb 07 jari 104     private boolean haveColorBar;
2 26 Feb 07 jari 105     private boolean useDoubleGradient = true;
2 26 Feb 07 jari 106     
2 26 Feb 07 jari 107     private JPopupMenu popup;
2 26 Feb 07 jari 108     private int exptID;
2 26 Feb 07 jari 109     public SVMDiscriminantExperimentViewer(Experiment experiment, int [][] clusters, Integer NumRetainedPos, Integer NumRecruitedNeg, float [][] discriminants, int [] samplesOrder, Boolean classifyGenes) {
2 26 Feb 07 jari 110       this(experiment, clusters, NumRetainedPos.intValue(), NumRecruitedNeg.intValue(), discriminants, samplesOrder, classifyGenes.booleanValue());
2 26 Feb 07 jari 111     }
2 26 Feb 07 jari 112     /**
2 26 Feb 07 jari 113      * Creates new SVMDiscriminantExperimentViewer
2 26 Feb 07 jari 114      */
2 26 Feb 07 jari 115     public SVMDiscriminantExperimentViewer(Experiment experiment, int [][] clusters, int NumRetainedPos, int NumRecruitedNeg, float [][] discriminants, int [] samplesOrder, boolean classifyGenes) {
2 26 Feb 07 jari 116         if (experiment == null) {
2 26 Feb 07 jari 117             throw new IllegalArgumentException("experiment == null");
2 26 Feb 07 jari 118         }
2 26 Feb 07 jari 119         this.experiment = experiment;
2 26 Feb 07 jari 120         this.exptID = experiment.getId();
2 26 Feb 07 jari 121         this.clusters = clusters == null ? defGenesOrder(experiment.getNumberOfGenes()) : clusters;
2 26 Feb 07 jari 122         this.discriminants = discriminants;
2 26 Feb 07 jari 123         this.samplesOrder = samplesOrder == null ? defSamplesOrder(experiment.getNumberOfSamples()) : samplesOrder;
2 26 Feb 07 jari 124         this.classifyGenes = classifyGenes;
2 26 Feb 07 jari 125         this.isDrawAnnotations = true;
2 26 Feb 07 jari 126         this.header = new ExperimentHeader(this.experiment, this.clusters, this.samplesOrder);
2 26 Feb 07 jari 127         setBackground(Color.white);
2 26 Feb 07 jari 128         Listener listener = new Listener();
2 26 Feb 07 jari 129         addMouseListener(listener);
2 26 Feb 07 jari 130         addMouseMotionListener(listener);
2 26 Feb 07 jari 131         
2 26 Feb 07 jari 132         SVMExperimentActionListener actionListener = new SVMExperimentActionListener();
2 26 Feb 07 jari 133         addMouseListener(actionListener);
2 26 Feb 07 jari 134         this.popup = createJPopupMenu(actionListener);
2 26 Feb 07 jari 135         numRetainedPos= NumRetainedPos;
2 26 Feb 07 jari 136         numRecruitedNeg= NumRecruitedNeg;
2 26 Feb 07 jari 137     }
2 26 Feb 07 jari 138     /**
2 26 Feb 07 jari 139      * @inheritDoc
2 26 Feb 07 jari 140      */
2 26 Feb 07 jari 141     public Expression getExpression(){
2 26 Feb 07 jari 142       return new Expression(this, this.getClass(), "new", 
2 26 Feb 07 jari 143           new Object[]{this.experiment, clusters, new Integer(numRetainedPos), new Integer(numRecruitedNeg), discriminants, samplesOrder, new Boolean(classifyGenes)});
2 26 Feb 07 jari 144     }
2 26 Feb 07 jari 145     
2 26 Feb 07 jari 146     /**
2 26 Feb 07 jari 147      * Creates a popup menu.
2 26 Feb 07 jari 148      */
2 26 Feb 07 jari 149     private JPopupMenu createJPopupMenu(SVMExperimentActionListener listener) {
2 26 Feb 07 jari 150         JPopupMenu popup = new JPopupMenu();
2 26 Feb 07 jari 151         addMenuItems(popup, listener);
2 26 Feb 07 jari 152         return popup;
2 26 Feb 07 jari 153     }
2 26 Feb 07 jari 154     
2 26 Feb 07 jari 155     
2 26 Feb 07 jari 156     /**
2 26 Feb 07 jari 157      * Adds viewer specific menu items.
2 26 Feb 07 jari 158      */
2 26 Feb 07 jari 159     protected void addMenuItems(JPopupMenu menu, ActionListener listener) {
2 26 Feb 07 jari 160         JMenuItem menuItem;
2 26 Feb 07 jari 161         menuItem = new JMenuItem("Store cluster", GUIFactory.getIcon("new16.gif"));
2 26 Feb 07 jari 162         menuItem.setActionCommand(STORE_CLUSTER_CMD);
2 26 Feb 07 jari 163         menuItem.addActionListener(listener);
2 26 Feb 07 jari 164         menu.add(menuItem);
2 26 Feb 07 jari 165         
2 26 Feb 07 jari 166         menu.addSeparator();
2 26 Feb 07 jari 167         
2 26 Feb 07 jari 168         menuItem = new JMenuItem("Launch new session", GUIFactory.getIcon("analysis16.gif"));
2 26 Feb 07 jari 169         menuItem.setActionCommand(LAUNCH_NEW_SESSION_CMD);
2 26 Feb 07 jari 170         menuItem.addActionListener(listener);
2 26 Feb 07 jari 171         menu.add(menuItem);
2 26 Feb 07 jari 172         
2 26 Feb 07 jari 173         menu.addSeparator();
2 26 Feb 07 jari 174         
2 26 Feb 07 jari 175         menuItem = new JMenuItem("Delete public cluster", GUIFactory.getIcon("delete16.gif"));
2 26 Feb 07 jari 176         menuItem.setActionCommand(SET_DEF_COLOR_CMD);
2 26 Feb 07 jari 177         menuItem.addActionListener(listener);
2 26 Feb 07 jari 178         menu.add(menuItem);
2 26 Feb 07 jari 179         
2 26 Feb 07 jari 180         menu.addSeparator();
2 26 Feb 07 jari 181         
2 26 Feb 07 jari 182         menuItem = new JMenuItem("Save cluster...", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 183         menuItem.setActionCommand(SAVE_CLUSTER_CMD);
2 26 Feb 07 jari 184         menuItem.addActionListener(listener);
2 26 Feb 07 jari 185         menu.add(menuItem);
2 26 Feb 07 jari 186         
2 26 Feb 07 jari 187         menuItem = new JMenuItem("Save all clusters...", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 188         menuItem.setActionCommand(SAVE_ALL_CLUSTERS_CMD);
2 26 Feb 07 jari 189         menuItem.addActionListener(listener);
2 26 Feb 07 jari 190         menu.add(menuItem);
2 26 Feb 07 jari 191     }
2 26 Feb 07 jari 192     
2 26 Feb 07 jari 193     
2 26 Feb 07 jari 194     
2 26 Feb 07 jari 195     private static int[] defSamplesOrder(int size) {
2 26 Feb 07 jari 196         int[] order = new int[size];
2 26 Feb 07 jari 197         for (int i=0; i<order.length; i++) {
2 26 Feb 07 jari 198             order[i] = i;
2 26 Feb 07 jari 199         }
2 26 Feb 07 jari 200         return order;
2 26 Feb 07 jari 201     }
2 26 Feb 07 jari 202     
2 26 Feb 07 jari 203     private static int[][] defGenesOrder(int size) {
2 26 Feb 07 jari 204         int[][] order = new int[1][size];
2 26 Feb 07 jari 205         for (int i=0; i<order[0].length; i++) {
2 26 Feb 07 jari 206             order[0][i] = i;
2 26 Feb 07 jari 207         }
2 26 Feb 07 jari 208         return order;
2 26 Feb 07 jari 209     }
2 26 Feb 07 jari 210     
2 26 Feb 07 jari 211     /**
2 26 Feb 07 jari 212      * Returns component to render the experiment header.
2 26 Feb 07 jari 213      */
2 26 Feb 07 jari 214     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 215         return header;
2 26 Feb 07 jari 216     }
2 26 Feb 07 jari 217     
2 26 Feb 07 jari 218     /**
2 26 Feb 07 jari 219      * Returns component to render the experiment values.
2 26 Feb 07 jari 220      */
2 26 Feb 07 jari 221     public JComponent getContentComponent() {
2 26 Feb 07 jari 222         return this;
2 26 Feb 07 jari 223     }
2 26 Feb 07 jari 224     
2 26 Feb 07 jari 225     /**
2 26 Feb 07 jari 226      * Returns null.
2 26 Feb 07 jari 227      */
2 26 Feb 07 jari 228     public BufferedImage getImage() {
2 26 Feb 07 jari 229         return null;
2 26 Feb 07 jari 230     }
2 26 Feb 07 jari 231     
2 26 Feb 07 jari 232     /**
2 26 Feb 07 jari 233      * Returns a gradient image for positive values.
2 26 Feb 07 jari 234      */
2 26 Feb 07 jari 235     public BufferedImage getPosColorImage() {
2 26 Feb 07 jari 236         return posColorImage;
2 26 Feb 07 jari 237     }
2 26 Feb 07 jari 238     
2 26 Feb 07 jari 239     /**
2 26 Feb 07 jari 240      * Returns a gradient image for negative values.
2 26 Feb 07 jari 241      */
2 26 Feb 07 jari 242     public BufferedImage getNegColorImage() {
2 26 Feb 07 jari 243         return negColorImage;
2 26 Feb 07 jari 244     }
2 26 Feb 07 jari 245     
2 26 Feb 07 jari 246     /**
2 26 Feb 07 jari 247      * Returns a color assigned for a NaN value.
2 26 Feb 07 jari 248      */
2 26 Feb 07 jari 249     public Color getMissingColor() {
2 26 Feb 07 jari 250         return missingColor;
2 26 Feb 07 jari 251     }
2 26 Feb 07 jari 252     
2 26 Feb 07 jari 253     /**
2 26 Feb 07 jari 254      * Selects rows from start to end.
2 26 Feb 07 jari 255      */
2 26 Feb 07 jari 256     public void selectRows(int start, int end) {
2 26 Feb 07 jari 257         firstSelectedRow = start;
2 26 Feb 07 jari 258         lastSelectedRow  = end;
2 26 Feb 07 jari 259         repaint();
2 26 Feb 07 jari 260     }
2 26 Feb 07 jari 261     
2 26 Feb 07 jari 262     /**
2 26 Feb 07 jari 263      * Initializes appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 264      * @see IViewer#onSelected
2 26 Feb 07 jari 265      */
2 26 Feb 07 jari 266     public void onSelected(IFramework framework) {
2 26 Feb 07 jari 267         this.framework = framework;
2 26 Feb 07 jari 268         this.data = framework.getData();
2 26 Feb 07 jari 269         IDisplayMenu menu = framework.getDisplayMenu();
2 26 Feb 07 jari 270         useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 271         header.setUseDoubleGradient(useDoubleGradient);
2 26 Feb 07 jari 272         Integer userObject = (Integer)framework.getUserObject();
2 26 Feb 07 jari 273         setClusterIndex(userObject == null ? 0 : userObject.intValue());
2 26 Feb 07 jari 274         labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 275         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 276         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 277         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 278         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 279         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 280         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 281         updateSize();
2 26 Feb 07 jari 282         header.setData(data);
2 26 Feb 07 jari 283         onMenuChanged(menu);
2 26 Feb 07 jari 284         //header.setValues(maxValue, minValue);
2 26 Feb 07 jari 285         header.setClusterIndex(clusterIndex);
2 26 Feb 07 jari 286         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 287         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 288         header.updateSizes(getSize().width, elementSize.width);        
2 26 Feb 07 jari 289     }
2 26 Feb 07 jari 290     
2 26 Feb 07 jari 291     /**
2 26 Feb 07 jari 292      * Updates appropriate attributes of this viewer and its header.
2 26 Feb 07 jari 293      * @see IViewer#onMenuChanged
2 26 Feb 07 jari 294      */
2 26 Feb 07 jari 295     public void onMenuChanged(IDisplayMenu menu) {
2 26 Feb 07 jari 296       useDoubleGradient = menu.getUseDoubleGradient();
2 26 Feb 07 jari 297       header.setUseDoubleGradient(useDoubleGradient);
2 26 Feb 07 jari 298         setDrawBorders(menu.isDrawingBorder());
2 26 Feb 07 jari 299         this.maxValue = menu.getMaxRatioScale();
2 26 Feb 07 jari 300         this.minValue = menu.getMinRatioScale();
2 26 Feb 07 jari 301         this.midValue = menu.getMidRatioValue();
2 26 Feb 07 jari 302         this.negColorImage = menu.getNegativeGradientImage();
2 26 Feb 07 jari 303         this.posColorImage = menu.getPositiveGradientImage();
2 26 Feb 07 jari 304         header.setNegAndPosColorImages(this.negColorImage, this.posColorImage);
2 26 Feb 07 jari 305         //header.setValues(maxValue, minValue);
2 26 Feb 07 jari 306         header.setValues(minValue, midValue, maxValue);
2 26 Feb 07 jari 307         if (this.elementSize.equals(menu.getElementSize()) &&
2 26 Feb 07 jari 308         labelIndex == menu.getLabelIndex() &&
2 26 Feb 07 jari 309         this.isAntiAliasing == menu.isAntiAliasing()) {
2 26 Feb 07 jari 310             return;
2 26 Feb 07 jari 311         }
2 26 Feb 07 jari 312         setElementSize(menu.getElementSize());
2 26 Feb 07 jari 313         setAntialiasing(menu.isAntiAliasing());
2 26 Feb 07 jari 314         labelIndex = menu.getLabelIndex();
2 26 Feb 07 jari 315         haveColorBar = areProbesColored();
2 26 Feb 07 jari 316         updateSize();
2 26 Feb 07 jari 317         header.setAntiAliasing(menu.isAntiAliasing());
2 26 Feb 07 jari 318         header.updateSizes(getSize().width, elementSize.width);
2 26 Feb 07 jari 319     }
2 26 Feb 07 jari 320     
2 26 Feb 07 jari 321     
2 26 Feb 07 jari 322     
2 26 Feb 07 jari 323     
2 26 Feb 07 jari 324     
2 26 Feb 07 jari 325     /**
2 26 Feb 07 jari 326      * Sets data for this viewer and its header.
2 26 Feb 07 jari 327      * @see IViewer#onDataChanged
2 26 Feb 07 jari 328      */
2 26 Feb 07 jari 329     public void onDataChanged(IData data) {
2 26 Feb 07 jari 330         this.data = data;
2 26 Feb 07 jari 331         this.haveColorBar = areProbesColored();
2 26 Feb 07 jari 332         this.header.setData(data);
2 26 Feb 07 jari 333    }
2 26 Feb 07 jari 334     
2 26 Feb 07 jari 335     public void onDeselected() {}
2 26 Feb 07 jari 336     public void onClosed() {}
2 26 Feb 07 jari 337     
2 26 Feb 07 jari 338     /**
2 26 Feb 07 jari 339      * Sets cluster index to be displayed.
2 26 Feb 07 jari 340      */
2 26 Feb 07 jari 341     public void setClusterIndex(int clusterIndex) {
2 26 Feb 07 jari 342         this.clusterIndex = clusterIndex;
2 26 Feb 07 jari 343     }
2 26 Feb 07 jari 344     
2 26 Feb 07 jari 345     /**
2 26 Feb 07 jari 346      * Returns index of current cluster.
2 26 Feb 07 jari 347      */
2 26 Feb 07 jari 348     public int getClusterIndex() {
2 26 Feb 07 jari 349         return clusterIndex;
2 26 Feb 07 jari 350     }
2 26 Feb 07 jari 351     
2 26 Feb 07 jari 352     /**
2 26 Feb 07 jari 353      * Returns indices of current cluster.
2 26 Feb 07 jari 354      */
2 26 Feb 07 jari 355     public int[] getCluster() {
2 26 Feb 07 jari 356         return clusters[this.clusterIndex];
2 26 Feb 07 jari 357     }
2 26 Feb 07 jari 358     
2 26 Feb 07 jari 359     /**
2 26 Feb 07 jari 360      * Returns all the clusters.
2 26 Feb 07 jari 361      */
2 26 Feb 07 jari 362     public int[][] getClusters() {
2 26 Feb 07 jari 363         return clusters;
2 26 Feb 07 jari 364     }
2 26 Feb 07 jari 365     
2 26 Feb 07 jari 366     /**
2 26 Feb 07 jari 367      *  Returns the row (index) within the main iData which corresponds to
2 26 Feb 07 jari 368      *  the passed index to the clusters array
2 26 Feb 07 jari 369      */
2 26 Feb 07 jari 370     protected int getMultipleArrayDataRow(int clusterArrayRow) {
2 26 Feb 07 jari 371         return experiment.getGeneIndexMappedToData(this.clusters[this.clusterIndex][clusterArrayRow]);
2 26 Feb 07 jari 372     }
2 26 Feb 07 jari 373     
2 26 Feb 07 jari 374     /**
2 26 Feb 07 jari 375      * Converts cluster indicies from the experiment to IData rows which could be different
2 26 Feb 07 jari 376      */
2 26 Feb 07 jari 377     private int [] getIDataRowIndices(int [] expIndices){
2 26 Feb 07 jari 378         int [] dataIndices = new int[expIndices.length];
2 26 Feb 07 jari 379         for(int i = 0; i < expIndices.length; i++){
2 26 Feb 07 jari 380             dataIndices[i] = this.getMultipleArrayDataRow(i);
2 26 Feb 07 jari 381         }
2 26 Feb 07 jari 382         return dataIndices;
2 26 Feb 07 jari 383     }
2 26 Feb 07 jari 384     
2 26 Feb 07 jari 385     /**
2 26 Feb 07 jari 386      *  Returns the row index in the experiment's <code>FloatMatrix<\code>
2 26 Feb 07 jari 387      *  corresponding to the passed index to the clusters array
2 26 Feb 07 jari 388      */
2 26 Feb 07 jari 389     protected int getExperimentRow(int row){
2 26 Feb 07 jari 390         return this.clusters[this.clusterIndex][row];
2 26 Feb 07 jari 391     }
2 26 Feb 07 jari 392     
2 26 Feb 07 jari 393     
2 26 Feb 07 jari 394     
2 26 Feb 07 jari 395     private int getColumn(int column) {
2 26 Feb 07 jari 396         return samplesOrder[column];
2 26 Feb 07 jari 397     }
2 26 Feb 07 jari 398     
2 26 Feb 07 jari 399     /**
2 26 Feb 07 jari 400      * Returns wrapped experiment.
2 26 Feb 07 jari 401      */
2 26 Feb 07 jari 402     public Experiment getExperiment() {
2 26 Feb 07 jari 403         return experiment;
2 26 Feb 07 jari 404     }
2 26 Feb 07 jari 405     
2 26 Feb 07 jari 406     /**
2 26 Feb 07 jari 407      * Returns the data.
2 26 Feb 07 jari 408      */
2 26 Feb 07 jari 409     protected IData getData() {
2 26 Feb 07 jari 410         return data;
2 26 Feb 07 jari 411     }
2 26 Feb 07 jari 412     
2 26 Feb 07 jari 413     /**
2 26 Feb 07 jari 414      * Launches a new <code>MultipleExperimentViewer</code> containing the current cluster
2 26 Feb 07 jari 415      */
2 26 Feb 07 jari 416     public void launchNewSession(){
2 26 Feb 07 jari 417         framework.launchNewMAV(getIDataRowIndices(getCluster()), this.experiment, "Multiple Experiment Viewer - Cluster Viewer", Cluster.GENE_CLUSTER);
2 26 Feb 07 jari 418     }
2 26 Feb 07 jari 419     
2 26 Feb 07 jari 420     /**
2 26 Feb 07 jari 421      * Sets public color for the current cluster.
2 26 Feb 07 jari 422      */
2 26 Feb 07 jari 423     public void setClusterColor(Color color) {
2 26 Feb 07 jari 424         if(color ==null){  //indicates removal of cluster
2 26 Feb 07 jari 425             framework.removeCluster(getIDataRowIndices(getCluster()), experiment, ClusterRepository.GENE_CLUSTER);
2 26 Feb 07 jari 426         }
2 26 Feb 07 jari 427     }
2 26 Feb 07 jari 428     
2 26 Feb 07 jari 429     /**
2 26 Feb 07 jari 430      *  Sets cluster color
2 26 Feb 07 jari 431      */
2 26 Feb 07 jari 432     public void storeCluster(){
2 26 Feb 07 jari 433         framework.storeCluster(getIDataRowIndices(getCluster()), experiment, ClusterRepository.GENE_CLUSTER);
2 26 Feb 07 jari 434         onDataChanged(this.data);
2 26 Feb 07 jari 435         updateSize();
2 26 Feb 07 jari 436     }
2 26 Feb 07 jari 437     
2 26 Feb 07 jari 438     /**
2 26 Feb 07 jari 439      * Saves all the clusters.
2 26 Feb 07 jari 440      */
2 26 Feb 07 jari 441     public void saveClusters(Frame frame) throws Exception {
2 26 Feb 07 jari 442         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 443         ExperimentUtil.saveExperiment(frame, getExperiment(), getData(), getClusters());
2 26 Feb 07 jari 444     }
2 26 Feb 07 jari 445     
2 26 Feb 07 jari 446     /**
2 26 Feb 07 jari 447      * Saves current cluster.
2 26 Feb 07 jari 448      */
2 26 Feb 07 jari 449     public void saveCluster(Frame frame) throws Exception {
2 26 Feb 07 jari 450         frame = frame == null ? JOptionPane.getFrameForComponent(this) : frame;
2 26 Feb 07 jari 451         ExperimentUtil.saveExperiment(frame, getExperiment(), getData(), getCluster());
2 26 Feb 07 jari 452     }
2 26 Feb 07 jari 453     
2 26 Feb 07 jari 454     /**
2 26 Feb 07 jari 455      * Saves clusters.
2 26 Feb 07 jari 456      */
2 26 Feb 07 jari 457     private void onSaveClusters() {
2 26 Feb 07 jari 458         Frame frame = JOptionPane.getFrameForComponent(getContentComponent());
2 26 Feb 07 jari 459         try {
2 26 Feb 07 jari 460             saveClusters(frame);
2 26 Feb 07 jari 461         } catch (Exception e) {
2 26 Feb 07 jari 462             JOptionPane.showMessageDialog(frame, "Can not save clusters!", e.toString(), JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 463             e.printStackTrace();
2 26 Feb 07 jari 464         }
2 26 Feb 07 jari 465     }
2 26 Feb 07 jari 466     
2 26 Feb 07 jari 467     /**
2 26 Feb 07 jari 468      * Save the viewer cluster.
2 26 Feb 07 jari 469      */
2 26 Feb 07 jari 470     private void onSaveCluster() {
2 26 Feb 07 jari 471         Frame frame = JOptionPane.getFrameForComponent(getContentComponent());
2 26 Feb 07 jari 472         try {
2 26 Feb 07 jari 473             saveCluster(frame);
2 26 Feb 07 jari 474         } catch (Exception e) {
2 26 Feb 07 jari 475             JOptionPane.showMessageDialog(frame, "Can not save cluster!", e.toString(), JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 476             e.printStackTrace();
2 26 Feb 07 jari 477         }
2 26 Feb 07 jari 478     }
2 26 Feb 07 jari 479     
2 26 Feb 07 jari 480     /**
2 26 Feb 07 jari 481      * Sets a public color.
2 26 Feb 07 jari 482      */
2 26 Feb 07 jari 483     private void onSetColor() {
2 26 Feb 07 jari 484         Frame frame = JOptionPane.getFrameForComponent(getContentComponent());
2 26 Feb 07 jari 485         Color newColor = JColorChooser.showDialog(frame, "Choose color", CentroidViewer.DEF_CLUSTER_COLOR);
2 26 Feb 07 jari 486         if (newColor != null) {
2 26 Feb 07 jari 487             setClusterColor(newColor);
2 26 Feb 07 jari 488         }
2 26 Feb 07 jari 489     }
2 26 Feb 07 jari 490     
2 26 Feb 07 jari 491     /**
2 26 Feb 07 jari 492      * Sets a shape size.
2 26 Feb 07 jari 493      */
2 26 Feb 07 jari 494     private void setElementSize(Dimension elementSize) {
2 26 Feb 07 jari 495         this.elementSize = new Dimension(elementSize);
2 26 Feb 07 jari 496     }
2 26 Feb 07 jari 497     
2 26 Feb 07 jari 498     /**
2 26 Feb 07 jari 499      * Sets anti-aliasing attribute.
2 26 Feb 07 jari 500      */
2 26 Feb 07 jari 501     private void setAntialiasing(boolean value) {
2 26 Feb 07 jari 502         this.isAntiAliasing = value;
2 26 Feb 07 jari 503     }
2 26 Feb 07 jari 504     
2 26 Feb 07 jari 505     /**
2 26 Feb 07 jari 506      * Sets draw borders attribute.
2 26 Feb 07 jari 507      */
2 26 Feb 07 jari 508     private void setDrawBorders(boolean value) {
2 26 Feb 07 jari 509         this.isDrawBorders = value;
2 26 Feb 07 jari 510     }
2 26 Feb 07 jari 511     
2 26 Feb 07 jari 512     /**
2 26 Feb 07 jari 513      * Creates a gradient image with specified initial colors.
2 26 Feb 07 jari 514      */
2 26 Feb 07 jari 515     public BufferedImage createGradientImage(Color color1, Color color2) {
2 26 Feb 07 jari 516         BufferedImage image = (BufferedImage)java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(256,1);
2 26 Feb 07 jari 517         Graphics2D graphics = image.createGraphics();
2 26 Feb 07 jari 518         GradientPaint gp = new GradientPaint(0, 0, color1, 255, 0, color2);
2 26 Feb 07 jari 519         graphics.setPaint(gp);
2 26 Feb 07 jari 520         graphics.drawRect(0, 0, 255, 1);
2 26 Feb 07 jari 521         return image;
2 26 Feb 07 jari 522     }
2 26 Feb 07 jari 523     
2 26 Feb 07 jari 524     /**
2 26 Feb 07 jari 525      * returns true if a probe in the current viewer has color
2 26 Feb 07 jari 526      */
2 26 Feb 07 jari 527     protected  boolean areProbesColored() {
2 26 Feb 07 jari 528         int [] indices = this.getCluster();
2 26 Feb 07 jari 529         for(int i = 0; i < indices.length; i++){
2 26 Feb 07 jari 530             if( this.data.getProbeColor(this.getMultipleArrayDataRow(i)) != null){
2 26 Feb 07 jari 531                 return true;
2 26 Feb 07 jari 532             }
2 26 Feb 07 jari 533         }
2 26 Feb 07 jari 534         return false;
2 26 Feb 07 jari 535     }
2 26 Feb 07 jari 536     
2 26 Feb 07 jari 537     /**
2 26 Feb 07 jari 538      * Updates size of this viewer.
2 26 Feb 07 jari 539      */
2 26 Feb 07 jari 540     private void updateSize() {
2 26 Feb 07 jari 541         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 542             setFont(ERROR_FONT);
2 26 Feb 07 jari 543             Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 544             FontMetrics metrics = g.getFontMetrics();
2 26 Feb 07 jari 545             int width = metrics.stringWidth(NO_GENES_STR)+10;
2 26 Feb 07 jari 546             int height = metrics.getHeight()+30;
2 26 Feb 07 jari 547             setSize(width, height);
2 26 Feb 07 jari 548             setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 549             return;
2 26 Feb 07 jari 550         }
2 26 Feb 07 jari 551         setFont(new Font("monospaced", Font.PLAIN, elementSize.height));
2 26 Feb 07 jari 552         Graphics2D g = (Graphics2D)getGraphics();
2 26 Feb 07 jari 553         int width = elementSize.width*samplesOrder.length; //experiment.getNumberOfSamples()+1;
2 26 Feb 07 jari 554         if (isDrawAnnotations) {
2 26 Feb 07 jari 555             this.annotationWidth = getMaxWidth(g);
2 26 Feb 07 jari 556             width += 20+this.annotationWidth;
2 26 Feb 07 jari 557         }
2 26 Feb 07 jari 558         if(haveColorBar)
2 26 Feb 07 jari 559             width += this.elementSize.width + 10;
2 26 Feb 07 jari 560         int height = elementSize.height*getCluster().length+1;
2 26 Feb 07 jari 561         setSize(width, height);
2 26 Feb 07 jari 562         setPreferredSize(new Dimension(width, height));
2 26 Feb 07 jari 563     }
2 26 Feb 07 jari 564     
2 26 Feb 07 jari 565     /**
2 26 Feb 07 jari 566      * Returns max width of annotation strings.
2 26 Feb 07 jari 567      */
2 26 Feb 07 jari 568     private int getMaxWidth(Graphics2D g) {
2 26 Feb 07 jari 569         if (g == null || data == null || getCluster() == null) {
2 26 Feb 07 jari 570             return 0;
2 26 Feb 07 jari 571         }
2 26 Feb 07 jari 572         if (isAntiAliasing) {
2 26 Feb 07 jari 573             g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 574             g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 575         }
2 26 Feb 07 jari 576         FontMetrics fm = g.getFontMetrics();
2 26 Feb 07 jari 577         int max = 0;
2 26 Feb 07 jari 578         String str;
2 26 Feb 07 jari 579         for (int i=0; i<getCluster().length; i++) {
2 26 Feb 07 jari 580             str = data.getElementAttribute(getMultipleArrayDataRow(i), labelIndex);
2 26 Feb 07 jari 581             // str = genename ? data.getGeneName(getMultipleArrayDataRow(i)) : data.getUniqueId(getMultipleArrayDataRow(i));
2 26 Feb 07 jari 582             max = Math.max(max, fm.stringWidth(str));
2 26 Feb 07 jari 583         }
2 26 Feb 07 jari 584         return max;
2 26 Feb 07 jari 585     }
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     /**
2 26 Feb 07 jari 588      * Calculates color for passed value.
2 26 Feb 07 jari 589      */
2 26 Feb 07 jari 590     private Color getColor(float value) {
2 26 Feb 07 jari 591         if (Float.isNaN(value)) {
2 26 Feb 07 jari 592             return missingColor;
2 26 Feb 07 jari 593         }
2 26 Feb 07 jari 594         
2 26 Feb 07 jari 595         float maximum;
2 26 Feb 07 jari 596         int colorIndex, rgb;
2 26 Feb 07 jari 597         
2 26 Feb 07 jari 598         if(useDoubleGradient) {
2 26 Feb 07 jari 599           maximum = value < midValue ? this.minValue : this.maxValue;
2 26 Feb 07 jari 600       colorIndex = (int) (255 * (value-midValue) / (maximum - midValue));
2 26 Feb 07 jari 601       colorIndex = colorIndex > 255 ? 255 : colorIndex;
2 26 Feb 07 jari 602       rgb = value < midValue ? negColorImage.getRGB(255 - colorIndex, 0)
2 26 Feb 07 jari 603           : posColorImage.getRGB(colorIndex, 0);
2 26 Feb 07 jari 604         } else {
2 26 Feb 07 jari 605           float span = this.maxValue - this.minValue;
2 26 Feb 07 jari 606           if(value <= minValue)
2 26 Feb 07 jari 607             colorIndex = 0;
2 26 Feb 07 jari 608           else if(value >= maxValue)
2 26 Feb 07 jari 609             colorIndex = 255;
2 26 Feb 07 jari 610           else
2 26 Feb 07 jari 611             colorIndex = (int)(((value - this.minValue)/span) * 255);
2 26 Feb 07 jari 612            
2 26 Feb 07 jari 613           rgb = posColorImage.getRGB(colorIndex,0);
2 26 Feb 07 jari 614         }
2 26 Feb 07 jari 615         return new Color(rgb);
2 26 Feb 07 jari 616     }
2 26 Feb 07 jari 617     
2 26 Feb 07 jari 618     
2 26 Feb 07 jari 619     /**
2 26 Feb 07 jari 620      * Removes a public color.
2 26 Feb 07 jari 621      */
2 26 Feb 07 jari 622     private void onSetDefaultColor() {
2 26 Feb 07 jari 623         setClusterColor(null);
2 26 Feb 07 jari 624     }
2 26 Feb 07 jari 625     
2 26 Feb 07 jari 626     /**
2 26 Feb 07 jari 627      * Paint component into specified graphics.
2 26 Feb 07 jari 628      */
2 26 Feb 07 jari 629     public void paint(Graphics g) {
2 26 Feb 07 jari 630         super.paint(g);
2 26 Feb 07 jari 631         if (this.data == null) {
2 26 Feb 07 jari 632             return;
2 26 Feb 07 jari 633         }
2 26 Feb 07 jari 634         
2 26 Feb 07 jari 635         setBackground(Color.white);
2 26 Feb 07 jari 636         DecimalFormat format = new DecimalFormat();
2 26 Feb 07 jari 637         format.setMinimumFractionDigits(4);
2 26 Feb 07 jari 638         format.setMaximumFractionDigits(4);
2 26 Feb 07 jari 639         format.setPositivePrefix("+");
2 26 Feb 07 jari 640         
2 26 Feb 07 jari 641         final int samples = samplesOrder.length; //experiment.getNumberOfSamples();
2 26 Feb 07 jari 642         
2 26 Feb 07 jari 643         if (this.clusters == null || getCluster().length == 0) {
2 26 Feb 07 jari 644             g.setColor(new Color(0, 0, 128));
2 26 Feb 07 jari 645             g.setFont(ERROR_FONT);
2 26 Feb 07 jari 646             g.drawString(NO_GENES_STR, 10, 30);
2 26 Feb 07 jari 647             return;
2 26 Feb 07 jari 648         }
2 26 Feb 07 jari 649         
2 26 Feb 07 jari 650         if (this.samplesOrder.length == 0){
2 26 Feb 07 jari 651             g.setColor(new Color(0, 0, 128));
2 26 Feb 07 jari 652             g.setFont(ERROR_FONT);
2 26 Feb 07 jari 653             g.drawString(NO_EXPERIMENTS_STR, 10, 30);
2 26 Feb 07 jari 654             return;
2 26 Feb 07 jari 655             
2 26 Feb 07 jari 656         }
2 26 Feb 07 jari 657         
2 26 Feb 07 jari 658         Rectangle bounds = g.getClipBounds();
2 26 Feb 07 jari 659         final int top = getTopIndex(bounds.y);
2 26 Feb 07 jari 660         final int bottom = getBottomIndex(bounds.y+bounds.height, getCluster().length);
2 26 Feb 07 jari 661         final int left = getLeftIndex(bounds.x);
2 26 Feb 07 jari 662         final int right = getRightIndex(bounds.x+bounds.width, samples);
2 26 Feb 07 jari 663         
2 26 Feb 07 jari 664         int x, y, breakPoint;
2 26 Feb 07 jari 665         // draw rectangles
2 26 Feb 07 jari 666         for (int column=left; column<right; column++) {
2 26 Feb 07 jari 667             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 668                 fillRectAt(g, row, column);
2 26 Feb 07 jari 669             }
2 26 Feb 07 jari 670         }
2 26 Feb 07 jari 671         
2 26 Feb 07 jari 672         // add color bar
2 26 Feb 07 jari 673         if(haveColorBar){
2 26 Feb 07 jari 674             for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 675                 fillClusterRectAt(g, row, samples * this.elementSize.width + 5);
2 26 Feb 07 jari 676             }
2 26 Feb 07 jari 677         }
2 26 Feb 07 jari 678         
2 26 Feb 07 jari 679         // draw annotations
2 26 Feb 07 jari 680         if (this.isDrawAnnotations) {
2 26 Feb 07 jari 681             if (this.isAntiAliasing) {
2 26 Feb 07 jari 682                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
2 26 Feb 07 jari 683                 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
2 26 Feb 07 jari 684             }
2 26 Feb 07 jari 685             if (right >= samples) {
2 26 Feb 07 jari 686                 String label = "";
2 26 Feb 07 jari 687                 g.setColor(Color.black);
2 26 Feb 07 jari 688                 
2 26 Feb 07 jari 689                 if(clusterIndex == 0)
2 26 Feb 07 jari 690                     breakPoint = this.numRetainedPos;
2 26 Feb 07 jari 691                 else
2 26 Feb 07 jari 692                     breakPoint = this.numRecruitedNeg;
2 26 Feb 07 jari 693                 
2 26 Feb 07 jari 694                 int uniqX = elementSize.width*samples+10;
2 26 Feb 07 jari 695                 int annY;
2 26 Feb 07 jari 696                 
2 26 Feb 07 jari 697                 for (int row=top; row<bottom; row++) {
2 26 Feb 07 jari 698                     if (labelIndex >= 0) {
2 26 Feb 07 jari 699                         if(classifyGenes && ((clusterIndex == 0 && row >= breakPoint ) || (clusterIndex == 1 && row < breakPoint)))
2 26 Feb 07 jari 700                             g.setColor(this.RecruitColor);
2 26 Feb 07 jari 701                         else
2 26 Feb 07 jari 702                             g.setColor(Color.black);
2 26 Feb 07 jari 703                         
2 26 Feb 07 jari 704                         label = data.getElementAttribute(getMultipleArrayDataRow(row), labelIndex);
2 26 Feb 07 jari 705                     }
2 26 Feb 07 jari 706                     annY = (row+1)*elementSize.height;
2 26 Feb 07 jari 707                     if(discriminants.length >= getCluster().length)
2 26 Feb 07 jari 708                         g.drawString(format.format(discriminants[clusterIndex][row])+"   " +label, uniqX + insets.left, annY);
2 26 Feb 07 jari 709                     else
2 26 Feb 07 jari 710                         g.drawString(label, uniqX + insets.left, annY);
2 26 Feb 07 jari 711                 }
2 26 Feb 07 jari 712             }
2 26 Feb 07 jari 713         }
2 26 Feb 07 jari 714         g.setColor(Color.black);
2 26 Feb 07 jari 715     }
2 26 Feb 07 jari 716     
2 26 Feb 07 jari 717     /**
2 26 Feb 07 jari 718      * Fills rect with specified row and colunn.
2 26 Feb 07 jari 719      */
2 26 Feb 07 jari 720     private void fillRectAt(Graphics g, int row, int column) {
2 26 Feb 07 jari 721         int x = column*elementSize.width + insets.left;
2 26 Feb 07 jari 722         int y = row*elementSize.height;
2 26 Feb 07 jari 723         boolean mask = this.firstSelectedRow >= 0 && this.lastSelectedRow >= 0 && (row < this.firstSelectedRow || row > this.lastSelectedRow);
2 26 Feb 07 jari 724         g.setColor(getColor(this.experiment.get(getExperimentRow(row), getColumn(column))));
2 26 Feb 07 jari 725         g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 726         if (mask) {
2 26 Feb 07 jari 727             g.setColor(maskColor);
2 26 Feb 07 jari 728             g.fillRect(x, y, elementSize.width, elementSize.height);
2 26 Feb 07 jari 729         }
2 26 Feb 07 jari 730         if (this.isDrawBorders) {
2 26 Feb 07 jari 731             g.setColor(Color.black);
2 26 Feb 07 jari 732             g.drawRect(x, y, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 733         }
2 26 Feb 07 jari 734     }
2 26 Feb 07 jari 735     
2 26 Feb 07 jari 736     /**
2 26 Feb 07 jari 737      * Draws rect with specified row, column and color.
2 26 Feb 07 jari 738      */
2 26 Feb 07 jari 739     private void drawRectAt(Graphics g, int row, int column, Color color) {
2 26 Feb 07 jari 740         g.setColor(color);
2 26 Feb 07 jari 741         g.drawRect(column*elementSize.width + insets.left, row*elementSize.height, elementSize.width-1, elementSize.height-1);
2 26 Feb 07 jari 742     }
2 26 Feb 07 jari 743     
2 26 Feb 07 jari 744     /**
2 26 Feb 07 jari 745      * fills cluster colors
2 26 Feb 07 jari 746      */
2 26 Feb 07 jari 747     private void fillClusterRectAt(Graphics g, int row, int xLoc) {
2 26 Feb 07 jari 748         Color geneColor = data.getProbeColor(getMultipleArrayDataRow(row));
2 26 Feb 07 jari 749         if(geneColor == null)
2 26 Feb 07 jari 750             geneColor = Color.white;
2 26 Feb 07 jari 751         
2 26 Feb 07 jari 752         g.setColor(geneColor);
2 26 Feb 07 jari 753         g.fillRect(xLoc + insets.left, row*elementSize.height, elementSize.width-1, elementSize.height);
2 26 Feb 07 jari 754     }
2 26 Feb 07 jari 755     
2 26 Feb 07 jari 756     private int getTopIndex(int top) {
2 26 Feb 07 jari 757         if (top < 0) {
2 26 Feb 07 jari 758             return 0;
2 26 Feb 07 jari 759         }
2 26 Feb 07 jari 760         return top/elementSize.height;
2 26 Feb 07 jari 761     }
2 26 Feb 07 jari 762     
2 26 Feb 07 jari 763     private int getLeftIndex(int left) {
2 26 Feb 07 jari 764         if (left < insets.left) {
2 26 Feb 07 jari 765             return 0;
2 26 Feb 07 jari 766         }
2 26 Feb 07 jari 767         return (left - insets.left)/elementSize.width;
2 26 Feb 07 jari 768     }
2 26 Feb 07 jari 769     
2 26 Feb 07 jari 770     private int getRightIndex(int right, int limit) {
2 26 Feb 07 jari 771         if (right < 0) {
2 26 Feb 07 jari 772             return 0;
2 26 Feb 07 jari 773         }
2 26 Feb 07 jari 774         int result = right/elementSize.width+1;
2 26 Feb 07 jari 775         return result > limit ? limit : result;
2 26 Feb 07 jari 776     }
2 26 Feb 07 jari 777     
2 26 Feb 07 jari 778     private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 779         if (bottom < 0) {
2 26 Feb 07 jari 780             return 0;
2 26 Feb 07 jari 781         }
2 26 Feb 07 jari 782         int result = bottom/elementSize.height+1;
2 26 Feb 07 jari 783         return result > limit ? limit : result;
2 26 Feb 07 jari 784     }
2 26 Feb 07 jari 785     
2 26 Feb 07 jari 786     /**
2 26 Feb 07 jari 787      * Finds column for specified x coordinate.
2 26 Feb 07 jari 788      * @return -1 if column was not found.
2 26 Feb 07 jari 789      */
2 26 Feb 07 jari 790     private int findColumn(int targetx) {
2 26 Feb 07 jari 791         int xSize = samplesOrder.length*elementSize.width;
2 26 Feb 07 jari 792         if (targetx >= (xSize + insets.left) || targetx < insets.left) {
2 26 Feb 07 jari 793             return -1;
2 26 Feb 07 jari 794         }
2 26 Feb 07 jari 795         return (targetx - insets.left)/elementSize.width;
2 26 Feb 07 jari 796     }
2 26 Feb 07 jari 797     
2 26 Feb 07 jari 798     /**
2 26 Feb 07 jari 799      * Finds row for specified y coordinate.
2 26 Feb 07 jari 800      * @return -1 if row was not found.
2 26 Feb 07 jari 801      */
2 26 Feb 07 jari 802     private int findRow(int targety) {
2 26 Feb 07 jari 803         int ySize = getCluster().length*elementSize.height;
2 26 Feb 07 jari 804         if (targety >= ySize || targety < 0)
2 26 Feb 07 jari 805             return -1;
2 26 Feb 07 jari 806         return targety/elementSize.height;
2 26 Feb 07 jari 807     }
2 26 Feb 07 jari 808     
2 26 Feb 07 jari 809     private boolean isLegalPosition(int row, int column) {
2 26 Feb 07 jari 810         if (isLegalRow(row) && isLegalColumn(column))
2 26 Feb 07 jari 811             return true;
2 26 Feb 07 jari 812         return false;
2 26 Feb 07 jari 813     }
2 26 Feb 07 jari 814     
2 26 Feb 07 jari 815     private boolean isLegalColumn(int column) {
2 26 Feb 07 jari 816         if (column < 0 || column > samplesOrder.length -1)
2 26 Feb 07 jari 817             return false;
2 26 Feb 07 jari 818         return true;
2 26 Feb 07 jari 819     }
2 26 Feb 07 jari 820     
2 26 Feb 07 jari 821     private boolean isLegalRow(int row) {
2 26 Feb 07 jari 822         if (row < 0 || row > getCluster().length -1)
2 26 Feb 07 jari 823             return false;
2 26 Feb 07 jari 824         return true;
2 26 Feb 07 jari 825     }
2 26 Feb 07 jari 826     
2 26 Feb 07 jari 827     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 828      */
2 26 Feb 07 jari 829     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 830         return null;
2 26 Feb 07 jari 831     }
2 26 Feb 07 jari 832     
2 26 Feb 07 jari 833     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 834      * posibly null
2 26 Feb 07 jari 835      */
2 26 Feb 07 jari 836     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 837         return null;
2 26 Feb 07 jari 838     }
2 26 Feb 07 jari 839     
2 26 Feb 07 jari 840     
2 26 Feb 07 jari 841     /** Returns int value indicating viewer type
2 26 Feb 07 jari 842      * Cluster.GENE_CLUSTER, Cluster.EXPERIMENT_CLUSTER, or -1 for both or unspecified
2 26 Feb 07 jari 843      */
2 26 Feb 07 jari 844     public int getViewerType() {
2 26 Feb 07 jari 845         if(this.classifyGenes)
2 26 Feb 07 jari 846             return Cluster.GENE_CLUSTER;
2 26 Feb 07 jari 847         return Cluster.EXPERIMENT_CLUSTER;
2 26 Feb 07 jari 848     }
2 26 Feb 07 jari 849     
2 26 Feb 07 jari 850     /**
2 26 Feb 07 jari 851      * The class to listen to mouse events.
2 26 Feb 07 jari 852      */
2 26 Feb 07 jari 853     private class Listener extends MouseAdapter implements MouseMotionListener {
2 26 Feb 07 jari 854         
2 26 Feb 07 jari 855         private String oldStatusText;
2 26 Feb 07 jari 856         private int oldRow = -1;
2 26 Feb 07 jari 857         private int oldColumn = -1;
2 26 Feb 07 jari 858         
2 26 Feb 07 jari 859         public void mouseClicked(MouseEvent event) {
2 26 Feb 07 jari 860             if (SwingUtilities.isRightMouseButton(event)) {
2 26 Feb 07 jari 861                 return;
2 26 Feb 07 jari 862             }
2 26 Feb 07 jari 863             int column = findColumn(event.getX());
2 26 Feb 07 jari 864             int row = findRow(event.getY());
2 26 Feb 07 jari 865             if (!isLegalPosition(row, column)) {
2 26 Feb 07 jari 866                 return;
2 26 Feb 07 jari 867             }
2 26 Feb 07 jari 868             if (event.isControlDown()) { // single array viewer
2 26 Feb 07 jari 869                 framework.displaySingleArrayViewer(experiment.getSampleIndex(getColumn(column)));
2 26 Feb 07 jari 870                 return;
2 26 Feb 07 jari 871             }
2 26 Feb 07 jari 872             if (!event.isShiftDown()) { // element info
2 26 Feb 07 jari 873                 framework.displaySlideElementInfo(experiment.getSampleIndex(getColumn(column)), getMultipleArrayDataRow(row));
2 26 Feb 07 jari 874                 return;
2 26 Feb 07 jari 875             }
2 26 Feb 07 jari 876         }
2 26 Feb 07 jari 877         
2 26 Feb 07 jari 878         public void mouseMoved(MouseEvent event) {
2 26 Feb 07 jari 879             if (experiment.getNumberOfSamples() == 0 || event.isShiftDown())
2 26 Feb 07 jari 880                 return;
2 26 Feb 07 jari 881             int column = findColumn(event.getX());
2 26 Feb 07 jari 882             int row = findRow(event.getY());
2 26 Feb 07 jari 883             if (isCurrentPosition(row, column)) {
2 26 Feb 07 jari 884                 return;
2 26 Feb 07 jari 885             }
2 26 Feb 07 jari 886             Graphics g = null;
2 26 Feb 07 jari 887             if (isLegalPosition(row, column)) {
2 26 Feb 07 jari 888                 g = getGraphics();
2 26 Feb 07 jari 889                 drawRectAt(g, row, column, Color.white);
2 26 Feb 07 jari 890                 framework.setStatusText("Gene: "+data.getUniqueId(getMultipleArrayDataRow(row))+" Sample: "+data.getSampleName(experiment.getSampleIndex(getColumn(column)))+" Value: "+experiment.get(getExperimentRow(row), getColumn(column)));
2 26 Feb 07 jari 891             } else {
2 26 Feb 07 jari 892                 framework.setStatusText(oldStatusText);
2 26 Feb 07 jari 893             }
2 26 Feb 07 jari 894             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 895                 g = g != null ? g : getGraphics();
2 26 Feb 07 jari 896                 fillRectAt(g, oldRow, oldColumn);
2 26 Feb 07 jari 897             }
2 26 Feb 07 jari 898             setOldPosition(row, column);
2 26 Feb 07 jari 899             if (g != null) {
2 26 Feb 07 jari 900                 g.dispose();
2 26 Feb 07 jari 901             }
2 26 Feb 07 jari 902         }
2 26 Feb 07 jari 903         
2 26 Feb 07 jari 904         public void mouseEntered(MouseEvent event) {
2 26 Feb 07 jari 905             oldStatusText = framework.getStatusText();
2 26 Feb 07 jari 906         }
2 26 Feb 07 jari 907         
2 26 Feb 07 jari 908         public void mouseExited(MouseEvent event) {
2 26 Feb 07 jari 909             if (isLegalPosition(oldRow, oldColumn)) {
2 26 Feb 07 jari 910                 Graphics g = getGraphics();
2 26 Feb 07 jari 911                 fillRectAt(g, oldRow, oldColumn);
2 26 Feb 07 jari 912                 g.dispose();
2 26 Feb 07 jari 913             }
2 26 Feb 07 jari 914             setOldPosition(-1, -1);
2 26 Feb 07 jari 915             framework.setStatusText(oldStatusText);
2 26 Feb 07 jari 916         }
2 26 Feb 07 jari 917         
2 26 Feb 07 jari 918         public void mouseDragged(MouseEvent event) {}
2 26 Feb 07 jari 919         
2 26 Feb 07 jari 920         private void setOldPosition(int row, int column) {
2 26 Feb 07 jari 921             oldColumn = column;
2 26 Feb 07 jari 922             oldRow = row;
2 26 Feb 07 jari 923         }
2 26 Feb 07 jari 924         
2 26 Feb 07 jari 925         private boolean isCurrentPosition(int row, int column) {
2 26 Feb 07 jari 926             return(row == oldRow && column == oldColumn);
2 26 Feb 07 jari 927         }
2 26 Feb 07 jari 928     }
2 26 Feb 07 jari 929     
2 26 Feb 07 jari 930     /**
2 26 Feb 07 jari 931      * The class to listen to mouse and action events.
2 26 Feb 07 jari 932      */
2 26 Feb 07 jari 933     private class SVMExperimentActionListener extends MouseAdapter implements ActionListener {
2 26 Feb 07 jari 934         
2 26 Feb 07 jari 935         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 936             String command = e.getActionCommand();
2 26 Feb 07 jari 937             if (command.equals(SAVE_CLUSTER_CMD)) {
2 26 Feb 07 jari 938                 onSaveCluster();
2 26 Feb 07 jari 939             } else if (command.equals(SAVE_ALL_CLUSTERS_CMD)) {
2 26 Feb 07 jari 940                 onSaveClusters();
2 26 Feb 07 jari 941             } else if (command.equals(SET_DEF_COLOR_CMD)) {
2 26 Feb 07 jari 942                 onSetDefaultColor();
2 26 Feb 07 jari 943             } else if (command.equals(STORE_CLUSTER_CMD)) {
2 26 Feb 07 jari 944                 storeCluster();
2 26 Feb 07 jari 945             } else if(command.equals(LAUNCH_NEW_SESSION_CMD)){
2 26 Feb 07 jari 946                 launchNewSession();
2 26 Feb 07 jari 947             }
2 26 Feb 07 jari 948         }
2 26 Feb 07 jari 949         
2 26 Feb 07 jari 950         public void mouseReleased(MouseEvent event) {
2 26 Feb 07 jari 951             maybeShowPopup(event);
2 26 Feb 07 jari 952         }
2 26 Feb 07 jari 953         
2 26 Feb 07 jari 954         public void mousePressed(MouseEvent event) {
2 26 Feb 07 jari 955             maybeShowPopup(event);
2 26 Feb 07 jari 956         }
2 26 Feb 07 jari 957         
2 26 Feb 07 jari 958         private void maybeShowPopup(MouseEvent e) {
2 26 Feb 07 jari 959             
2 26 Feb 07 jari 960             if (!e.isPopupTrigger() || getCluster() == null || getCluster().length == 0) {
2 26 Feb 07 jari 961                 return;
2 26 Feb 07 jari 962             }
2 26 Feb 07 jari 963             popup.show(e.getComponent(), e.getX(), e.getY());
2 26 Feb 07 jari 964         }
2 26 Feb 07 jari 965     }
2 26 Feb 07 jari 966     
2 26 Feb 07 jari 967   /* (non-Javadoc)
2 26 Feb 07 jari 968    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperiment(org.tigr.microarray.mev.cluster.gui.Experiment)
2 26 Feb 07 jari 969    */
2 26 Feb 07 jari 970   public void setExperiment(Experiment e) {
2 26 Feb 07 jari 971     this.experiment = e;
2 26 Feb 07 jari 972     this.exptID = e.getId();
2 26 Feb 07 jari 973     this.header.setExperiment(e);
2 26 Feb 07 jari 974   }
2 26 Feb 07 jari 975
2 26 Feb 07 jari 976   /* (non-Javadoc)
2 26 Feb 07 jari 977    * @see org.tigr.microarray.mev.cluster.gui.IViewer#getExperimentID()
2 26 Feb 07 jari 978    */
2 26 Feb 07 jari 979   public int getExperimentID() {
2 26 Feb 07 jari 980     return exptID;
2 26 Feb 07 jari 981   }
2 26 Feb 07 jari 982
2 26 Feb 07 jari 983   /* (non-Javadoc)
2 26 Feb 07 jari 984    * @see org.tigr.microarray.mev.cluster.gui.IViewer#setExperimentID(int)
2 26 Feb 07 jari 985    */
2 26 Feb 07 jari 986   public void setExperimentID(int id) {
2 26 Feb 07 jari 987     this.exptID = id;
2 26 Feb 07 jari 988   }
2 26 Feb 07 jari 989    
2 26 Feb 07 jari 990 }