mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/lem/LocusInfoDialog.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2006, 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 package org.tigr.microarray.mev.cluster.gui.impl.lem;
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 import java.awt.Color;
2 26 Feb 07 jari 8 import java.awt.Dimension;
2 26 Feb 07 jari 9 import java.awt.Font;
2 26 Feb 07 jari 10 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 11 import java.awt.GridBagLayout;
2 26 Feb 07 jari 12 import java.awt.Insets;
2 26 Feb 07 jari 13 import java.awt.Toolkit;
2 26 Feb 07 jari 14 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 15 import java.awt.event.ActionListener;
2 26 Feb 07 jari 16 import java.awt.event.WindowAdapter;
2 26 Feb 07 jari 17 import java.awt.event.WindowEvent;
2 26 Feb 07 jari 18 import java.util.Vector;
2 26 Feb 07 jari 19
2 26 Feb 07 jari 20 import javax.swing.Icon;
2 26 Feb 07 jari 21 import javax.swing.JButton;
2 26 Feb 07 jari 22 import javax.swing.JDialog;
2 26 Feb 07 jari 23 import javax.swing.JFrame;
2 26 Feb 07 jari 24 import javax.swing.JPanel;
2 26 Feb 07 jari 25 import javax.swing.JScrollPane;
2 26 Feb 07 jari 26 import javax.swing.JTextPane;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 import org.tigr.graph.GC;
2 26 Feb 07 jari 29 import org.tigr.graph.GraphLine;
2 26 Feb 07 jari 30 import org.tigr.graph.GraphPoint;
2 26 Feb 07 jari 31 import org.tigr.graph.GraphTick;
2 26 Feb 07 jari 32 import org.tigr.graph.GraphViewer;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.ParameterPanel;
2 26 Feb 07 jari 36 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 /**
2 26 Feb 07 jari 39  * @author braisted
2 26 Feb 07 jari 40  * The LocusInfoDialog displays expresssion, annotation, and a graphical
2 26 Feb 07 jari 41  * display of a selected locus.  The dialog also allows the user to walk
2 26 Feb 07 jari 42  * over the LEM by advancing to the next or previous locus.  A web resource
2 26 Feb 07 jari 43  * related to the locus can be opened using a button on the dialog.
2 26 Feb 07 jari 44  */
2 26 Feb 07 jari 45 public class LocusInfoDialog extends JDialog {
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47   /**Parent LEM
2 26 Feb 07 jari 48    */  
2 26 Feb 07 jari 49   private LinearExpressionMapViewer lem;
2 26 Feb 07 jari 50   private ParameterPanel graphPanel;
2 26 Feb 07 jari 51   private InfoPanel infoPanel;
2 26 Feb 07 jari 52   private IData data;
2 26 Feb 07 jari 53   private Experiment experiment;
2 26 Feb 07 jari 54   private FloatMatrix meanMatrix;
2 26 Feb 07 jari 55   private Experiment fullExperiment;
2 26 Feb 07 jari 56   private FloatMatrix fullMatrix;
2 26 Feb 07 jari 57   private int locusIndex;
2 26 Feb 07 jari 58   private GraphViewer graph;
2 26 Feb 07 jari 59   private int [] replicates;
2 26 Feb 07 jari 60   private String locusName;
2 26 Feb 07 jari 61   private int numLoci;
2 26 Feb 07 jari 62   private int numSamples;
2 26 Feb 07 jari 63   private boolean isSelected;
2 26 Feb 07 jari 64   private JButton nextButton;
2 26 Feb 07 jari 65   private JButton prevButton;
2 26 Feb 07 jari 66   private JButton selectLocusButton;
2 26 Feb 07 jari 67   private String SELECT_LOCUS_BUTTON_TEXT = "Select";
2 26 Feb 07 jari 68   private String DESELECT_LOCUS_BUTTON_TEXT = "Deselect";
2 26 Feb 07 jari 69   private Icon selectIcon, deleteIcon;
2 26 Feb 07 jari 70   
2 26 Feb 07 jari 71   private Thread locusRunnerThread;
2 26 Feb 07 jari 72   private LocusRunner locusRunner;
2 26 Feb 07 jari 73   
2 26 Feb 07 jari 74   /**
2 26 Feb 07 jari 75    * Constructs a Locus information dialog
2 26 Feb 07 jari 76    * @param parent parent
2 26 Feb 07 jari 77    * @param lem LinearExpressionMapViewr parent
2 26 Feb 07 jari 78    * @param locusName locus name
2 26 Feb 07 jari 79    * @param locusIndex current locus index
2 26 Feb 07 jari 80    * @param experiment <code>Experiment</code> object containing filtered data
2 26 Feb 07 jari 81    * @param fullExperiment <code>Experiment</code> object containing all data
2 26 Feb 07 jari 82    * @param data IData object
2 26 Feb 07 jari 83    * @param replicates replicate array, contains replicate indices for each locus
2 26 Feb 07 jari 84    */
2 26 Feb 07 jari 85   public LocusInfoDialog(JFrame parent, LinearExpressionMapViewer lem, String locusName, int locusIndex, Experiment experiment, Experiment fullExperiment, IData data, int [] replicates) {
2 26 Feb 07 jari 86     super(parent, "Locus Information: "+locusName);
2 26 Feb 07 jari 87     this.lem = lem;  
2 26 Feb 07 jari 88     this.locusName = locusName;
2 26 Feb 07 jari 89     this.experiment = experiment;
2 26 Feb 07 jari 90     this.fullExperiment = fullExperiment;
2 26 Feb 07 jari 91     this.fullMatrix = fullExperiment.getMatrix();
2 26 Feb 07 jari 92     this.locusIndex = locusIndex;
2 26 Feb 07 jari 93     this.replicates = replicates;
2 26 Feb 07 jari 94     this.isSelected = lem.isLocusSelected(locusIndex);
2 26 Feb 07 jari 95
2 26 Feb 07 jari 96     selectIcon = null;  //GUIFactory.getIcon("select_check24.gif");        
2 26 Feb 07 jari 97     deleteIcon = null;
2 26 Feb 07 jari 98     
2 26 Feb 07 jari 99     meanMatrix = experiment.getMatrix();
2 26 Feb 07 jari 100     fullMatrix = fullExperiment.getMatrix();    
2 26 Feb 07 jari 101     numLoci = meanMatrix.getRowDimension();
2 26 Feb 07 jari 102     this.data = data;    
2 26 Feb 07 jari 103     numSamples = experiment.getNumberOfSamples();
2 26 Feb 07 jari 104     
2 26 Feb 07 jari 105     getContentPane().setLayout(new GridBagLayout());
2 26 Feb 07 jari 106
2 26 Feb 07 jari 107     graph = createGraph();
2 26 Feb 07 jari 108     graphPanel = new ParameterPanel("Expression Graph");
2 26 Feb 07 jari 109     graphPanel.setLayout(new GridBagLayout());      
2 26 Feb 07 jari 110     graphPanel.add(graph, new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3,3,3,3), 0, 0));
2 26 Feb 07 jari 111     
2 26 Feb 07 jari 112     infoPanel = new InfoPanel();
2 26 Feb 07 jari 113     
2 26 Feb 07 jari 114     Listener listener = new Listener();
2 26 Feb 07 jari 115     
2 26 Feb 07 jari 116     JPanel buttonPanel = new JPanel(new GridBagLayout());
2 26 Feb 07 jari 117     prevButton = new JButton("<<  Previous");
2 26 Feb 07 jari 118     prevButton.setFocusPainted(false);
2 26 Feb 07 jari 119     prevButton.setPreferredSize(new Dimension(120,30));    
2 26 Feb 07 jari 120     prevButton.setSize(120,30);
2 26 Feb 07 jari 121     prevButton.setActionCommand("prev-locus-command");  
2 26 Feb 07 jari 122     prevButton.addActionListener(listener);
2 26 Feb 07 jari 123     
2 26 Feb 07 jari 124     nextButton = new JButton("Next  >>");
2 26 Feb 07 jari 125     nextButton.setFocusPainted(false);
2 26 Feb 07 jari 126     nextButton.setPreferredSize(new Dimension(120,30));
2 26 Feb 07 jari 127     nextButton.setSize(120,30);
2 26 Feb 07 jari 128     nextButton.setActionCommand("next-locus-command");
2 26 Feb 07 jari 129     nextButton.addActionListener(listener);
2 26 Feb 07 jari 130     
2 26 Feb 07 jari 131     String buttonText = "Select";
2 26 Feb 07 jari 132     selectLocusButton = new JButton(buttonText, selectIcon);
2 26 Feb 07 jari 133     
2 26 Feb 07 jari 134     if(isSelected) {
2 26 Feb 07 jari 135       selectLocusButton.setText("Deselect");
2 26 Feb 07 jari 136       selectLocusButton.setIcon(deleteIcon);
2 26 Feb 07 jari 137     }    
2 26 Feb 07 jari 138     
2 26 Feb 07 jari 139     selectLocusButton.setFocusPainted(false);
2 26 Feb 07 jari 140   
2 26 Feb 07 jari 141     selectLocusButton.setPreferredSize(new Dimension(120,30));
2 26 Feb 07 jari 142     selectLocusButton.setSize(120,30);
2 26 Feb 07 jari 143     selectLocusButton.setActionCommand("toggle-locus-selection-command");
2 26 Feb 07 jari 144     selectLocusButton.addActionListener(listener);    
2 26 Feb 07 jari 145     selectLocusButton.setFocusPainted(false);
2 26 Feb 07 jari 146     
2 26 Feb 07 jari 147     JButton openCMRButton = new JButton("Gene Page");
2 26 Feb 07 jari 148     openCMRButton.setPreferredSize(new Dimension(120, 30));
2 26 Feb 07 jari 149     openCMRButton.setSize(120,30);
2 26 Feb 07 jari 150     openCMRButton.setFocusPainted(false);
2 26 Feb 07 jari 151     openCMRButton.setActionCommand("open-web-command");
2 26 Feb 07 jari 152     openCMRButton.addActionListener(listener);
2 26 Feb 07 jari 153     
2 26 Feb 07 jari 154     validateButtons();
2 26 Feb 07 jari 155         
2 26 Feb 07 jari 156     buttonPanel.add(prevButton, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(3,5,3,0),0,0));
2 26 Feb 07 jari 157     buttonPanel.add(openCMRButton, new GridBagConstraints(1,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3,10,3,10),0,0));    
2 26 Feb 07 jari 158     buttonPanel.add(selectLocusButton, new GridBagConstraints(2,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(3,0,3,10),0,0));
2 26 Feb 07 jari 159     buttonPanel.add(nextButton, new GridBagConstraints(3,0,1,1,1,1,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(3,0,3,5),0,0));
2 26 Feb 07 jari 160         
2 26 Feb 07 jari 161     getContentPane().add(graphPanel, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));
2 26 Feb 07 jari 162     getContentPane().add(infoPanel, new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));    
2 26 Feb 07 jari 163     getContentPane().add(buttonPanel, new GridBagConstraints(0,2,1,1,1,0.2,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0),0,0));    
2 26 Feb 07 jari 164     
2 26 Feb 07 jari 165     addWindowListener(listener);
2 26 Feb 07 jari 166     
2 26 Feb 07 jari 167     pack();
2 26 Feb 07 jari 168   }
2 26 Feb 07 jari 169   
2 26 Feb 07 jari 170   
2 26 Feb 07 jari 171   /**
2 26 Feb 07 jari 172    * Constructs the small graph of the current locus
2 26 Feb 07 jari 173    * @return <code>GraphViewer</code> for the current locus
2 26 Feb 07 jari 174    */
2 26 Feb 07 jari 175   private GraphViewer createGraph() {
2 26 Feb 07 jari 176     
2 26 Feb 07 jari 177     String [] names = new String[numSamples];
2 26 Feb 07 jari 178     
2 26 Feb 07 jari 179     for(int i = 0; i < numSamples; i++)
2 26 Feb 07 jari 180       names[i] = data.getSampleName(i);
2 26 Feb 07 jari 181     
2 26 Feb 07 jari 182     float [] meanValues = meanMatrix.A[locusIndex];
2 26 Feb 07 jari 183     
2 26 Feb 07 jari 184     float [][] values = new float[replicates.length][];
2 26 Feb 07 jari 185     for(int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 186       values[i] = fullMatrix.A[replicates[i]];
2 26 Feb 07 jari 187     }
2 26 Feb 07 jari 188     
2 26 Feb 07 jari 189     float [] maxAndMin = getMaxAndMin(meanValues, values);
2 26 Feb 07 jari 190     
2 26 Feb 07 jari 191     //constant avoids max = min ==> upperY == lowerY, for flat genes
2 26 Feb 07 jari 192     int upperY = (int)Math.ceil(maxAndMin[0]+0.001f);
2 26 Feb 07 jari 193     int lowerY = (int)Math.floor(maxAndMin[1]-0.001f);  
2 26 Feb 07 jari 194             
2 26 Feb 07 jari 195     GraphViewer graph = new GraphViewer(null, 0, 425, 0, 300, 0, numSamples, lowerY, upperY, 40, 40, 40, 40, "Expression of Locus: "+locusName, "Sample Number", "Log\u2082(Cy5 / Cy3)");
2 26 Feb 07 jari 196
2 26 Feb 07 jari 197     graph.setXAxisValue(lowerY);
2 26 Feb 07 jari 198     
2 26 Feb 07 jari 199     graph.setShowCoordinates(true);    
2 26 Feb 07 jari 200
2 26 Feb 07 jari 201     Dimension size = new Dimension(250, 250);        
2 26 Feb 07 jari 202     
2 26 Feb 07 jari 203     graph.setPreferredSize(size);
2 26 Feb 07 jari 204       graph.setSize(size);
2 26 Feb 07 jari 205       
2 26 Feb 07 jari 206     GraphTick tick = new GraphTick(0, 8, Color.black, GC.HORIZONTAL, GC.C, "", Color.black);    
2 26 Feb 07 jari 207   
2 26 Feb 07 jari 208     graph.addGraphElement(tick);
2 26 Feb 07 jari 209
2 26 Feb 07 jari 210     //zero line
2 26 Feb 07 jari 211     graph.addGraphElement(new GraphLine(0, 0, numSamples, 0, Color.black));
2 26 Feb 07 jari 212     
2 26 Feb 07 jari 213     for(int i = 0; i < meanValues.length-1; i++) {
2 26 Feb 07 jari 214                 
2 26 Feb 07 jari 215       tick = new GraphTick(i+1, 8, Color.black, GC.HORIZONTAL, GC.C, String.valueOf(i+1), Color.black);
2 26 Feb 07 jari 216       graph.addGraphElement(tick);
2 26 Feb 07 jari 217       
2 26 Feb 07 jari 218       if(!Float.isNaN(meanValues[i]) && !Float.isNaN(meanValues[i+1]))
2 26 Feb 07 jari 219         graph.addGraphElement(new GraphLine(i+1, meanValues[i], i+2, meanValues[i+1], Color.magenta));
2 26 Feb 07 jari 220       
2 26 Feb 07 jari 221       if(!Float.isNaN(meanValues[i]))      
2 26 Feb 07 jari 222         graph.addGraphElement(new GraphPoint(i+1, meanValues[i], Color.blue, 5));
2 26 Feb 07 jari 223     }
2 26 Feb 07 jari 224   
2 26 Feb 07 jari 225     tick = new GraphTick(meanValues.length, 8, Color.black, GC.HORIZONTAL, GC.C, String.valueOf(meanValues.length), Color.black);
2 26 Feb 07 jari 226     graph.addGraphElement(tick);
2 26 Feb 07 jari 227
2 26 Feb 07 jari 228     if(!Float.isNaN(meanValues[meanValues.length-1]))      
2 26 Feb 07 jari 229       graph.addGraphElement(new GraphPoint(meanValues.length, meanValues[meanValues.length-1], Color.blue, 5));
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     
2 26 Feb 07 jari 232     for(int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 233       for(int j = 0; j < values[i].length; j++) {
2 26 Feb 07 jari 234         if(!Float.isNaN(values[i][j]))
2 26 Feb 07 jari 235           graph.addGraphElement(new GraphPoint(j+1, values[i][j], Color.blue, 2));        
2 26 Feb 07 jari 236       }
2 26 Feb 07 jari 237     }
2 26 Feb 07 jari 238
2 26 Feb 07 jari 239         for (int i = lowerY; i <= upperY; i++) {
2 26 Feb 07 jari 240             if (i == 0) 
2 26 Feb 07 jari 241               tick = new GraphTick(i, 8, Color.black, GC.VERTICAL, GC.C, "0", Color.black);
2 26 Feb 07 jari 242             else 
2 26 Feb 07 jari 243               tick = new GraphTick(i, 8, Color.black, GC.VERTICAL, GC.C, "" + i, Color.black);            
2 26 Feb 07 jari 244             graph.addGraphElement(tick);
2 26 Feb 07 jari 245         }
2 26 Feb 07 jari 246         
2 26 Feb 07 jari 247         return graph;
2 26 Feb 07 jari 248   }
2 26 Feb 07 jari 249   
2 26 Feb 07 jari 250   /**
2 26 Feb 07 jari 251    * Displays a centered locus info. dialog
2 26 Feb 07 jari 252    */
2 26 Feb 07 jari 253   public void showInfo() {
2 26 Feb 07 jari 254         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 255         setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);
2 26 Feb 07 jari 256         show();
2 26 Feb 07 jari 257   }
2 26 Feb 07 jari 258   
2 26 Feb 07 jari 259   /**
2 26 Feb 07 jari 260    * Retruns the current max and min for the locus means in the display
2 26 Feb 07 jari 261    * @param means locus means
2 26 Feb 07 jari 262    * @param vals raw values
2 26 Feb 07 jari 263    * @return float array with index 0 with Max, index 1 with min
2 26 Feb 07 jari 264    */
2 26 Feb 07 jari 265   private float [] getMaxAndMin(float [] means, float [][] vals) {
2 26 Feb 07 jari 266     float [] maxAndMin = new float[2];
2 26 Feb 07 jari 267     maxAndMin[0] = Float.NEGATIVE_INFINITY;
2 26 Feb 07 jari 268     maxAndMin[1] = Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 269   
2 26 Feb 07 jari 270     for(int i = 0; i < means.length; i++) {
2 26 Feb 07 jari 271       
2 26 Feb 07 jari 272       if(!Float.isNaN(means[i]) && means[i] > maxAndMin[0])
2 26 Feb 07 jari 273         maxAndMin[0] = means[i];
2 26 Feb 07 jari 274
2 26 Feb 07 jari 275       if(!Float.isNaN(means[i]) && means[i] < maxAndMin[1])
2 26 Feb 07 jari 276         maxAndMin[1] = means[i];
2 26 Feb 07 jari 277         
2 26 Feb 07 jari 278       for(int j = 0; j < vals.length; j++) {
2 26 Feb 07 jari 279         if(!Float.isNaN(vals[j][i]) && vals[j][i] > maxAndMin[0])
2 26 Feb 07 jari 280           maxAndMin[0] = vals[j][i];
2 26 Feb 07 jari 281
2 26 Feb 07 jari 282         if(!Float.isNaN(vals[j][i]) && vals[j][i] < maxAndMin[1])
2 26 Feb 07 jari 283           maxAndMin[1] = vals[j][i];      
2 26 Feb 07 jari 284       }
2 26 Feb 07 jari 285     }
2 26 Feb 07 jari 286     
2 26 Feb 07 jari 287     if(maxAndMin[0] == Float.NEGATIVE_INFINITY)
2 26 Feb 07 jari 288       maxAndMin[0] = 0;
2 26 Feb 07 jari 289     if(maxAndMin[1] == Float.POSITIVE_INFINITY)
2 26 Feb 07 jari 290       maxAndMin[1] = 0;
2 26 Feb 07 jari 291     
2 26 Feb 07 jari 292     return maxAndMin;
2 26 Feb 07 jari 293   }
2 26 Feb 07 jari 294   
2 26 Feb 07 jari 295   /**
2 26 Feb 07 jari 296    * Validates the buttons for the current locus index
2 26 Feb 07 jari 297    */
2 26 Feb 07 jari 298   private void validateButtons() {      
2 26 Feb 07 jari 299     prevButton.setEnabled(locusIndex != 0);          
2 26 Feb 07 jari 300     nextButton.setEnabled(locusIndex != numLoci-1);    
2 26 Feb 07 jari 301     updateSelectionButton();      
2 26 Feb 07 jari 302   }
2 26 Feb 07 jari 303
2 26 Feb 07 jari 304   /**
2 26 Feb 07 jari 305    * Checks to see if locus is selected, updates the button to add locus
2 26 Feb 07 jari 306    */
2 26 Feb 07 jari 307   public void checkSelection() {
2 26 Feb 07 jari 308     this.isSelected = lem.isLocusSelected(this.locusIndex);
2 26 Feb 07 jari 309     updateSelectionButton();
2 26 Feb 07 jari 310   }
2 26 Feb 07 jari 311   
2 26 Feb 07 jari 312   /**
2 26 Feb 07 jari 313    * Updates the selection button based on state
2 26 Feb 07 jari 314    */
2 26 Feb 07 jari 315   public void updateSelectionButton() {
2 26 Feb 07 jari 316     if(!isSelected) {
2 26 Feb 07 jari 317       this.selectLocusButton.setText(this.SELECT_LOCUS_BUTTON_TEXT);
2 26 Feb 07 jari 318       this.selectLocusButton.setIcon(selectIcon);
2 26 Feb 07 jari 319     } else {
2 26 Feb 07 jari 320       this.selectLocusButton.setText(this.DESELECT_LOCUS_BUTTON_TEXT);      
2 26 Feb 07 jari 321       this.selectLocusButton.setIcon(deleteIcon);
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    * Updates the Graph panel, on locus change
2 26 Feb 07 jari 327    *
2 26 Feb 07 jari 328    */
2 26 Feb 07 jari 329   private void updateGraphPanel() {
2 26 Feb 07 jari 330     GraphViewer graphViewer = createGraph();
2 26 Feb 07 jari 331     graphPanel.removeAll();
2 26 Feb 07 jari 332     graphPanel.add(graphViewer, new GridBagConstraints(0,0,1,1,1,1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(3,3,3,3), 0, 0));
2 26 Feb 07 jari 333     graphPanel.validate();
2 26 Feb 07 jari 334     graph = graphViewer;
2 26 Feb 07 jari 335   }
2 26 Feb 07 jari 336   
2 26 Feb 07 jari 337   /**
2 26 Feb 07 jari 338    * Triggers jump to next locus
2 26 Feb 07 jari 339    *
2 26 Feb 07 jari 340    */
2 26 Feb 07 jari 341   private void getNextLocusInfo() {
2 26 Feb 07 jari 342     this.locusIndex++;
2 26 Feb 07 jari 343     this.locusName = lem.getLocusName(locusIndex);
2 26 Feb 07 jari 344     this.setTitle("Locus Information: "+locusName);
2 26 Feb 07 jari 345     this.replicates = lem.getReplicatesArray(locusIndex);
2 26 Feb 07 jari 346     this.isSelected = lem.isLocusSelected(locusIndex);
2 26 Feb 07 jari 347     updateGraphPanel();
2 26 Feb 07 jari 348     this.infoPanel.updateContent();
2 26 Feb 07 jari 349     validateButtons();
2 26 Feb 07 jari 350     //validate();
2 26 Feb 07 jari 351   }
2 26 Feb 07 jari 352   
2 26 Feb 07 jari 353   /**
2 26 Feb 07 jari 354    * Pulls the locus information for the previous locus
2 26 Feb 07 jari 355    *
2 26 Feb 07 jari 356    */
2 26 Feb 07 jari 357   private void getPreviousLocusInfo() {
2 26 Feb 07 jari 358     this.locusIndex--;
2 26 Feb 07 jari 359     this.locusName = lem.getLocusName(locusIndex);
2 26 Feb 07 jari 360     this.setTitle("Locus Information: "+locusName);    
2 26 Feb 07 jari 361     this.replicates = lem.getReplicatesArray(locusIndex);
2 26 Feb 07 jari 362     this.isSelected = lem.isLocusSelected(locusIndex);    
2 26 Feb 07 jari 363     this.updateGraphPanel();
2 26 Feb 07 jari 364     this.infoPanel.updateContent();    
2 26 Feb 07 jari 365     validateButtons();
2 26 Feb 07 jari 366     //validate();
2 26 Feb 07 jari 367   }
2 26 Feb 07 jari 368   
2 26 Feb 07 jari 369   /**
2 26 Feb 07 jari 370    * 
2 26 Feb 07 jari 371    * @author braisted
2 26 Feb 07 jari 372    *
2 26 Feb 07 jari 373    * Formatted text rendering panel to support delivery of locus information
2 26 Feb 07 jari 374    */
2 26 Feb 07 jari 375   public class InfoPanel extends JPanel {
2 26 Feb 07 jari 376     private JTextPane textPane;
2 26 Feb 07 jari 377     private JScrollPane pane;
2 26 Feb 07 jari 378     
2 26 Feb 07 jari 379     /**
2 26 Feb 07 jari 380      * Constructs an info panel for the current locus
2 26 Feb 07 jari 381      */
2 26 Feb 07 jari 382     public InfoPanel() {
2 26 Feb 07 jari 383       setLayout(new GridBagLayout());
2 26 Feb 07 jari 384       
2 26 Feb 07 jari 385       String text = createContent();      
2 26 Feb 07 jari 386       textPane = new JTextPane(); 
2 26 Feb 07 jari 387       textPane.setContentType("text/html");
2 26 Feb 07 jari 388   
2 26 Feb 07 jari 389       textPane.setEditable(false);
2 26 Feb 07 jari 390       textPane.setText(text);
2 26 Feb 07 jari 391       textPane.setFont(new Font("Arial", Font.PLAIN, 10));
2 26 Feb 07 jari 392           textPane.setMargin(new Insets(10,15,10,15));
2 26 Feb 07 jari 393       textPane.setBackground(new Color(Integer.parseInt("FFFFCC",16)));
2 26 Feb 07 jari 394           
2 26 Feb 07 jari 395       pane = new JScrollPane(textPane);      
2 26 Feb 07 jari 396       add(pane, new GridBagConstraints(0,0,1,1,1,1,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));            
2 26 Feb 07 jari 397       //setPreferredSize(new Dimension(500, 450));
2 26 Feb 07 jari 398       setPreferredSize(new Dimension(250, 300));
2 26 Feb 07 jari 399       
2 26 Feb 07 jari 400       textPane.setCaretPosition(0);    
2 26 Feb 07 jari 401     }
2 26 Feb 07 jari 402     
2 26 Feb 07 jari 403     /**
2 26 Feb 07 jari 404      * updates the panel for a new locus
2 26 Feb 07 jari 405      */
2 26 Feb 07 jari 406     public void updateContent() {
2 26 Feb 07 jari 407       String newText = createContent();
2 26 Feb 07 jari 408       textPane.setText(newText);
2 26 Feb 07 jari 409       textPane.setCaretPosition(0);
2 26 Feb 07 jari 410       pane.validate();
2 26 Feb 07 jari 411     }
2 26 Feb 07 jari 412     
2 26 Feb 07 jari 413     /**
2 26 Feb 07 jari 414      * Constructs conten
2 26 Feb 07 jari 415      * @return String (html)
2 26 Feb 07 jari 416      */
2 26 Feb 07 jari 417     private String createContent() {
2 26 Feb 07 jari 418       String [] fieldNames = data.getFieldNames();
2 26 Feb 07 jari 419       int numSamples = meanMatrix.getColumnDimension();
2 26 Feb 07 jari 420       
2 26 Feb 07 jari 421       int rowCount = fieldNames.length + 2;
2 26 Feb 07 jari 422       
2 26 Feb 07 jari 423       float [] sd = new float[numSamples];
2 26 Feb 07 jari 424       int [] validN = new int[numSamples];
2 26 Feb 07 jari 425       
2 26 Feb 07 jari 426       //populate sd and validN arrays
2 26 Feb 07 jari 427       getSDs(sd,validN);
2 26 Feb 07 jari 428       
2 26 Feb 07 jari 429       String text = "<html><body face=arial bgcolor = \"#FFFFCC\"><h1>Locus: " + locusName +"</h1>";
2 26 Feb 07 jari 430             
2 26 Feb 07 jari 431       text += "<h2>Expression Data</h2>";
2 26 Feb 07 jari 432       
2 26 Feb 07 jari 433       text += "<table border=3>";
2 26 Feb 07 jari 434       
2 26 Feb 07 jari 435       text += "<tr><td nowrap><b>Sample Number</b></td>";
2 26 Feb 07 jari 436       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 437         text += "<td nowrap><b>" + String.valueOf(i+1) + "</b></td>";        
2 26 Feb 07 jari 438       }
2 26 Feb 07 jari 439       
2 26 Feb 07 jari 440       text += "</tr>";
2 26 Feb 07 jari 441       
2 26 Feb 07 jari 442       //sample name
2 26 Feb 07 jari 443       Vector sampleFields = data.getSampleAnnotationFieldNames();
2 26 Feb 07 jari 444       String fieldName = (String)(sampleFields.get(0));
2 26 Feb 07 jari 445       text += "<tr><td nowrap><b>Sample Name</b></td>";
2 26 Feb 07 jari 446       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 447         text += "<td nowrap><b>" + data.getSampleAnnotation(i, fieldName) + "</b></td>";        
2 26 Feb 07 jari 448       }
2 26 Feb 07 jari 449         
2 26 Feb 07 jari 450       text += "</tr>";
2 26 Feb 07 jari 451
2 26 Feb 07 jari 452       for(int i = 1; i < sampleFields.size(); i++ ){
2 26 Feb 07 jari 453         fieldName = (String)(sampleFields.get(i));
2 26 Feb 07 jari 454         text += "<tr><td nowrap><b>" + fieldName + "</b></td>";
2 26 Feb 07 jari 455         for(int j = 0; j < numSamples; j++) {
2 26 Feb 07 jari 456           text += "<td nowrap>" + data.getSampleAnnotation(j, fieldName) + "</td>";          
2 26 Feb 07 jari 457         }
2 26 Feb 07 jari 458         text += "</tr>";
2 26 Feb 07 jari 459       }
2 26 Feb 07 jari 460       
2 26 Feb 07 jari 461       //replicate count
2 26 Feb 07 jari 462       text += "<tr><td nowrap><b>Locus Reps/Slide</b></td>";      
2 26 Feb 07 jari 463       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 464         text += "<td nowrap>" + String.valueOf(replicates.length) + "</td>";        
2 26 Feb 07 jari 465       }
2 26 Feb 07 jari 466       
2 26 Feb 07 jari 467       //validN count
2 26 Feb 07 jari 468       text += "</tr><tr><td nowrap><b>Rep. Values/Slide</b></td>";      
2 26 Feb 07 jari 469       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 470         text += "<td nowrap>" + String.valueOf(validN[i]) + "</td>";
2 26 Feb 07 jari 471       }
2 26 Feb 07 jari 472             
2 26 Feb 07 jari 473       text += "</tr><tr><td nowrap><b>Mean</b></td>";      
2 26 Feb 07 jari 474       float value;
2 26 Feb 07 jari 475       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 476         value = meanMatrix.A[locusIndex][i];
2 26 Feb 07 jari 477         if(!Float.isNaN(value))
2 26 Feb 07 jari 478           text += "<td nowrap>" + value + "</td>";        
2 26 Feb 07 jari 479         else
2 26 Feb 07 jari 480           text += "<td nowrap> -- </td>";        
2 26 Feb 07 jari 481       }
2 26 Feb 07 jari 482       
2 26 Feb 07 jari 483       text += "</tr><tr><td nowrap><b>SD</b></td>";      
2 26 Feb 07 jari 484       for(int i = 0; i < numSamples; i++) {
2 26 Feb 07 jari 485         value = sd[i];
2 26 Feb 07 jari 486         if(Float.isNaN(value) || validN[i] == 1)        
2 26 Feb 07 jari 487           text += "<td nowrap> -- </td>";
2 26 Feb 07 jari 488         else
2 26 Feb 07 jari 489           text += "<td nowrap>" + value + "</td>";                
2 26 Feb 07 jari 490       }
2 26 Feb 07 jari 491       
2 26 Feb 07 jari 492       text += "</tr></table>";
2 26 Feb 07 jari 493       
2 26 Feb 07 jari 494       //annotation
2 26 Feb 07 jari 495       text += "<h2>Annotation</h2>";
2 26 Feb 07 jari 496       
2 26 Feb 07 jari 497       text += "<table border = 3>";      
2 26 Feb 07 jari 498       if(replicates.length > 1)
2 26 Feb 07 jari 499         text+= "<th></th><th colspan="+ String.valueOf(replicates.length+1)+"><b>Locus Replicates<b></th>";
2 26 Feb 07 jari 500
2 26 Feb 07 jari 501       for(int row = 0; row < fieldNames.length + 1; row++) {
2 26 Feb 07 jari 502         text += "<tr>";
2 26 Feb 07 jari 503
2 26 Feb 07 jari 504         if(row == 0) {
2 26 Feb 07 jari 505           text += "<td nowrap><b>UID</b></td>";
2 26 Feb 07 jari 506         } else {
2 26 Feb 07 jari 507           text += "<td nowrap><b>" + fieldNames[row-1] + "</b></td>";
2 26 Feb 07 jari 508         }
2 26 Feb 07 jari 509
2 26 Feb 07 jari 510         for(int rep = 0; rep < replicates.length; rep++) {
2 26 Feb 07 jari 511           if(row == 0)
2 26 Feb 07 jari 512             text += "<td nowrap>" + data.getSlideDataElement(0, fullExperiment.getGeneIndexMappedToData(replicates[rep])).getUID() + "</td>"; 
2 26 Feb 07 jari 513           else
2 26 Feb 07 jari 514             text += "<td>" + data.getElementAttribute(fullExperiment.getGeneIndexMappedToData(replicates[rep]), row-1) + "</td>"; 
2 26 Feb 07 jari 515         }
2 26 Feb 07 jari 516         text += "</tr>";
2 26 Feb 07 jari 517       }      
2 26 Feb 07 jari 518       text += "</table>";
2 26 Feb 07 jari 519       
2 26 Feb 07 jari 520       text += "</body></html>";
2 26 Feb 07 jari 521
2 26 Feb 07 jari 522       return text;      
2 26 Feb 07 jari 523     }
2 26 Feb 07 jari 524     
2 26 Feb 07 jari 525     
2 26 Feb 07 jari 526     /**
2 26 Feb 07 jari 527      * Updates standard deveiations for the replicates related to the displayed locus
2 26 Feb 07 jari 528      * also updates the validNArray 
2 26 Feb 07 jari 529      * @param sd SD array to be updated
2 26 Feb 07 jari 530      * @param validNArray array showing valid replicate measuremet count for each
2 26 Feb 07 jari 531      * hyb for the displayed locus
2 26 Feb 07 jari 532      */
2 26 Feb 07 jari 533     private void getSDs(float [] sd, int [] validNArray){
2 26 Feb 07 jari 534       int numSamples = meanMatrix.getColumnDimension();
2 26 Feb 07 jari 535       float [] means = meanMatrix.A[locusIndex];
2 26 Feb 07 jari 536       int validN;
2 26 Feb 07 jari 537       float value;
2 26 Feb 07 jari 538       for(int sample = 0; sample < numSamples; sample++) {
2 26 Feb 07 jari 539         validN = 0;
2 26 Feb 07 jari 540         for(int rep = 0; rep < replicates.length; rep++) {      
2 26 Feb 07 jari 541           value = fullMatrix.get(replicates[rep], sample);
2 26 Feb 07 jari 542           if(!Float.isNaN(value)) {
2 26 Feb 07 jari 543             sd[sample] += Math.pow( (value-means[sample]),2);
2 26 Feb 07 jari 544             validN++;
2 26 Feb 07 jari 545           }
2 26 Feb 07 jari 546         }
2 26 Feb 07 jari 547         
2 26 Feb 07 jari 548         validNArray[sample] = validN;
2 26 Feb 07 jari 549         //check number of valid numbers
2 26 Feb 07 jari 550         //no valid entry use NaN
2 26 Feb 07 jari 551         if(validN == 0)
2 26 Feb 07 jari 552           sd[sample] = Float.NaN;
2 26 Feb 07 jari 553
2 26 Feb 07 jari 554         //if validN == 1 set to zero
2 26 Feb 07 jari 555         else if(validN == 1)          
2 26 Feb 07 jari 556           sd[sample] = 0;
2 26 Feb 07 jari 557         
2 26 Feb 07 jari 558         else
2 26 Feb 07 jari 559           sd[sample] =  (float)Math.sqrt(sd[sample]/(float)(validN-1));        
2 26 Feb 07 jari 560       }                  
2 26 Feb 07 jari 561     }
2 26 Feb 07 jari 562     
2 26 Feb 07 jari 563   }
2 26 Feb 07 jari 564   
2 26 Feb 07 jari 565   /**
2 26 Feb 07 jari 566    * Signals to open web resource for the locus index
2 26 Feb 07 jari 567    */
2 26 Feb 07 jari 568     private void linkToURL() {
2 26 Feb 07 jari 569       lem.linkToURL(locusIndex);    
2 26 Feb 07 jari 570     }
2 26 Feb 07 jari 571
2 26 Feb 07 jari 572     /**
2 26 Feb 07 jari 573      * 
2 26 Feb 07 jari 574      * @author braisted
2 26 Feb 07 jari 575      *
2 26 Feb 07 jari 576      * LocusRunner implements <code>Runnable</code> and allows smooth update
2 26 Feb 07 jari 577      * of the dialog when jumping to next locus
2 26 Feb 07 jari 578      */
2 26 Feb 07 jari 579     public class LocusRunner implements Runnable {
2 26 Feb 07 jari 580
2 26 Feb 07 jari 581       private boolean advance;
2 26 Feb 07 jari 582       private long napTime = 3000;
2 26 Feb 07 jari 583       
2 26 Feb 07 jari 584       public LocusRunner(boolean advance, long napTime) {
2 26 Feb 07 jari 585         this.advance = advance;
2 26 Feb 07 jari 586         this.napTime = napTime;
2 26 Feb 07 jari 587       }
2 26 Feb 07 jari 588         
2 26 Feb 07 jari 589     public void run() {
2 26 Feb 07 jari 590       while(true) {    
2 26 Feb 07 jari 591         try {
2 26 Feb 07 jari 592           Thread.sleep(napTime);
2 26 Feb 07 jari 593         } catch (Exception e) {
2 26 Feb 07 jari 594           
2 26 Feb 07 jari 595         }
2 26 Feb 07 jari 596         if(advance)
2 26 Feb 07 jari 597           getNextLocusInfo();
2 26 Feb 07 jari 598         else
2 26 Feb 07 jari 599           getPreviousLocusInfo();
2 26 Feb 07 jari 600       }
2 26 Feb 07 jari 601     }
2 26 Feb 07 jari 602             
2 26 Feb 07 jari 603     }
2 26 Feb 07 jari 604     
2 26 Feb 07 jari 605     /**
2 26 Feb 07 jari 606      * 
2 26 Feb 07 jari 607      * @author braisted
2 26 Feb 07 jari 608      *
2 26 Feb 07 jari 609      * Button listener
2 26 Feb 07 jari 610      */
2 26 Feb 07 jari 611   public class Listener extends WindowAdapter implements ActionListener{
2 26 Feb 07 jari 612   
2 26 Feb 07 jari 613     public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 614       String command = e.getActionCommand();
2 26 Feb 07 jari 615       if(command.equals("next-locus-command")) {
2 26 Feb 07 jari 616         /*
2 26 Feb 07 jari 617         locusRunner = new LocusRunner(true, 3000);        
2 26 Feb 07 jari 618         locusRunnerThread = new Thread(locusRunner);
2 26 Feb 07 jari 619         locusRunnerThread.start();
2 26 Feb 07 jari 620         */
2 26 Feb 07 jari 621         getNextLocusInfo();
2 26 Feb 07 jari 622       } else if(command.equals("prev-locus-command")) {
2 26 Feb 07 jari 623         /*
2 26 Feb 07 jari 624         if(locusRunnerThread != null) {
2 26 Feb 07 jari 625           locusRunnerThread = null;
2 26 Feb 07 jari 626           locusRunner = null;          
2 26 Feb 07 jari 627         }
2 26 Feb 07 jari 628         */          
2 26 Feb 07 jari 629         getPreviousLocusInfo();
2 26 Feb 07 jari 630       } else if(command.equals("toggle-locus-selection-command")) {
2 26 Feb 07 jari 631         lem.toggleSelectedLocus(locusIndex);
2 26 Feb 07 jari 632         isSelected = !isSelected;
2 26 Feb 07 jari 633         //updateSelectionButton();        
2 26 Feb 07 jari 634       } else if(command.equals("open-web-command")) {
2 26 Feb 07 jari 635         linkToURL();
2 26 Feb 07 jari 636       } 
2 26 Feb 07 jari 637     }
2 26 Feb 07 jari 638     
2 26 Feb 07 jari 639     public void windowClosing(WindowEvent we) {
2 26 Feb 07 jari 640       lem.removeInfoViewer(LocusInfoDialog.this);
2 26 Feb 07 jari 641     }
2 26 Feb 07 jari 642     
2 26 Feb 07 jari 643   
2 26 Feb 07 jari 644   }
2 26 Feb 07 jari 645   
2 26 Feb 07 jari 646 }