mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/svm/SVMClassifyViewer.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: SVMClassifyViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.8 $
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.beans.Expression;
2 26 Feb 07 jari 18 import java.awt.Font;
2 26 Feb 07 jari 19 import java.awt.FontMetrics;
2 26 Feb 07 jari 20 import java.awt.Graphics;
2 26 Feb 07 jari 21 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 22 import java.awt.Insets;
2 26 Feb 07 jari 23 import java.awt.Rectangle;
2 26 Feb 07 jari 24 import java.io.BufferedWriter;
2 26 Feb 07 jari 25 import java.io.File;
2 26 Feb 07 jari 26 import java.io.FileOutputStream;
2 26 Feb 07 jari 27 import java.io.OutputStreamWriter;
2 26 Feb 07 jari 28 import java.text.DecimalFormat;
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30 import javax.swing.JComponent;
2 26 Feb 07 jari 31 import javax.swing.JFileChooser;
2 26 Feb 07 jari 32 import javax.swing.JOptionPane;
2 26 Feb 07 jari 33 import javax.swing.JPanel;
2 26 Feb 07 jari 34 import javax.swing.JScrollPane;
2 26 Feb 07 jari 35 import javax.swing.JTable;
2 26 Feb 07 jari 36 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.helpers.ExpressionFileFilter;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.helpers.ExpressionFileView;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.impl.svm.SVMResultViewer.MyListener;
2 26 Feb 07 jari 45 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47 public class SVMClassifyViewer extends SVMResultViewer {
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49     // calculation results
2 26 Feb 07 jari 50     private FloatMatrix discriminant;
2 26 Feb 07 jari 51     private SVMData data;
2 26 Feb 07 jari 52     private GeneralInfo info;
2 26 Feb 07 jari 53     private boolean classifyGenes;
2 26 Feb 07 jari 54     float [] classes;
2 26 Feb 07 jari 55     float [] discr;
2 26 Feb 07 jari 56     
2 26 Feb 07 jari 57     DecimalFormat floatFormat, intFormat, indexFormat;
2 26 Feb 07 jari 58     int indexLength = 1;        
2 26 Feb 07 jari 59     int lineHeight = 20;
2 26 Feb 07 jari 60     String [] spacerStrings;
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     ClassifyViewerTableModel cvtm; 
2 26 Feb 07 jari 63         
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65     public SVMClassifyViewer(Experiment expt, FloatMatrix discriminant, boolean classifyGenes){
2 26 Feb 07 jari 66       super(expt);
2 26 Feb 07 jari 67         FloatMatrix M = discriminant.transpose();
2 26 Feb 07 jari 68         init(M.A[1], M.A[0], classifyGenes);
2 26 Feb 07 jari 69     }
2 26 Feb 07 jari 70
2 26 Feb 07 jari 71     public SVMClassifyViewer(Experiment e, float[] discr, float[] classes, Boolean classifyGenes){
2 26 Feb 07 jari 72       super(e);
2 26 Feb 07 jari 73       init(discr, classes, classifyGenes.booleanValue());
2 26 Feb 07 jari 74     }
2 26 Feb 07 jari 75     /**
2 26 Feb 07 jari 76      * @inheritDoc
2 26 Feb 07 jari 77      */
2 26 Feb 07 jari 78     public Expression getExpression(){
2 26 Feb 07 jari 79       Object[] superExpressionArgs = super.getExpression().getArguments();
2 26 Feb 07 jari 80       return new Expression(this, this.getClass(), "new", 
2 26 Feb 07 jari 81           new Object[]{superExpressionArgs[0], discr, classes, new Boolean(classifyGenes)});
2 26 Feb 07 jari 82     }
2 26 Feb 07 jari 83     
2 26 Feb 07 jari 84     private void init(float[] discr, float[] classes, boolean classifyGenes){
2 26 Feb 07 jari 85         floatFormat = new DecimalFormat();
2 26 Feb 07 jari 86         floatFormat.setMaximumFractionDigits(4);
2 26 Feb 07 jari 87         floatFormat.setMinimumFractionDigits(4);
2 26 Feb 07 jari 88         floatFormat.setGroupingUsed(false);
2 26 Feb 07 jari 89
2 26 Feb 07 jari 90         intFormat = new DecimalFormat();
2 26 Feb 07 jari 91         intFormat.setMinimumFractionDigits(0);
2 26 Feb 07 jari 92         intFormat.setMaximumFractionDigits(0);
2 26 Feb 07 jari 93         intFormat.setGroupingUsed(false);
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95         indexFormat = new DecimalFormat();
2 26 Feb 07 jari 96         indexFormat = new DecimalFormat();
2 26 Feb 07 jari 97         indexFormat.setMinimumFractionDigits(0);
2 26 Feb 07 jari 98         indexFormat.setMaximumFractionDigits(0);
2 26 Feb 07 jari 99         indexLength = String.valueOf(classes.length).length();
2 26 Feb 07 jari 100         indexFormat.setMinimumIntegerDigits(indexLength);
2 26 Feb 07 jari 101         indexFormat.setGroupingUsed(false);
2 26 Feb 07 jari 102     
2 26 Feb 07 jari 103         this.classes = classes;
2 26 Feb 07 jari 104         this.discr = discr;
2 26 Feb 07 jari 105         this.classifyGenes = classifyGenes;
2 26 Feb 07 jari 106         cvtm = new ClassifyViewerTableModel();
2 26 Feb 07 jari 107        this.resultTable = new JTable(cvtm);
2 26 Feb 07 jari 108         
2 26 Feb 07 jari 109         setBackground(Color.white);
2 26 Feb 07 jari 110         this.add(new JScrollPane(resultTable), new GridBagConstraints(0,0,1,1,1.0,1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0));
2 26 Feb 07 jari 111         
2 26 Feb 07 jari 112         MyListener listener = new MyListener();
2 26 Feb 07 jari 113         resultTable.addMouseListener(listener);
2 26 Feb 07 jari 114         resultTable.addMouseMotionListener(listener);
2 26 Feb 07 jari 115     }
2 26 Feb 07 jari 116     
2 26 Feb 07 jari 117     class ClassifyViewerTableModel extends AbstractTableModel{
2 26 Feb 07 jari 118       String[] header = new String[]{"Index", "Class", "Discriminant", annotationLabel};
2 26 Feb 07 jari 119       FloatMatrix data;
2 26 Feb 07 jari 120       public ClassifyViewerTableModel(){}
2 26 Feb 07 jari 121       public String getColumnName(int col){
2 26 Feb 07 jari 122         return header[col];
2 26 Feb 07 jari 123       }
2 26 Feb 07 jari 124       public Object getValueAt(int row, int col){
2 26 Feb 07 jari 125         if(col == 0){
2 26 Feb 07 jari 126           return new Integer(row+1);
2 26 Feb 07 jari 127         } else if (col == 1) {
2 26 Feb 07 jari 128             if(classes[row] == -1.0f)
2 26 Feb 07 jari 129             return "none";
2 26 Feb 07 jari 130             return intFormat.format(classes[row]).toString();
2 26 Feb 07 jari 131             } else if (col == 2) {
2 26 Feb 07 jari 132           return floatFormat.format(discr[row]).toString();
2 26 Feb 07 jari 133         } else if (col == 3) {
2 26 Feb 07 jari 134           try {
2 26 Feb 07 jari 135             if(classifyGenes)
2 26 Feb 07 jari 136             return iData.getElementAttribute(getMultipleArrayDataRow(row), labelIndex);
2 26 Feb 07 jari 137           else 
2 26 Feb 07 jari 138             return iData.getSampleName(row);
2 26 Feb 07 jari 139           } catch (NullPointerException npe){
2 26 Feb 07 jari 140               npe.printStackTrace();
2 26 Feb 07 jari 141               return "";
2 26 Feb 07 jari 142           }
2 26 Feb 07 jari 143         }
2 26 Feb 07 jari 144         return new String("");
2 26 Feb 07 jari 145       }  
2 26 Feb 07 jari 146       public boolean isCellEditable(int row, int col) { return false; }
2 26 Feb 07 jari 147
2 26 Feb 07 jari 148     public int getColumnCount() {
2 26 Feb 07 jari 149       return header.length;
2 26 Feb 07 jari 150     }
2 26 Feb 07 jari 151     
2 26 Feb 07 jari 152     public int getRowCount() {
2 26 Feb 07 jari 153       return classes.length;
2 26 Feb 07 jari 154     }
2 26 Feb 07 jari 155     }
2 26 Feb 07 jari 156
2 26 Feb 07 jari 157     public void setExperiment(Experiment e){
2 26 Feb 07 jari 158       super.setExperiment(e);
2 26 Feb 07 jari 159     }
2 26 Feb 07 jari 160     
2 26 Feb 07 jari 161     public void onSelected(IFramework frm) {
2 26 Feb 07 jari 162       super.onSelected(frm);
2 26 Feb 07 jari 163         onMenuChanged(frm.getDisplayMenu());
2 26 Feb 07 jari 164     }
2 26 Feb 07 jari 165     
2 26 Feb 07 jari 166     /**
2 26 Feb 07 jari 167      * Displays data.
2 26 Feb 07 jari 168      */
2 26 Feb 07 jari 169     protected void displayData() {
2 26 Feb 07 jari 170         displayResult(this.classifyGenes);
2 26 Feb 07 jari 171     }
2 26 Feb 07 jari 172     
2 26 Feb 07 jari 173     private void displayResult(boolean genes){
2 26 Feb 07 jari 174     }
2 26 Feb 07 jari 175     
2 26 Feb 07 jari 176     /**
2 26 Feb 07 jari 177      * Saves train result to a file.
2 26 Feb 07 jari 178      */
2 26 Feb 07 jari 179     protected void onSaveResult() {
2 26 Feb 07 jari 180         File SVMFile;
2 26 Feb 07 jari 181         final JFileChooser fc = new JFileChooser(TMEV.getFile("data/"));
2 26 Feb 07 jari 182         fc.addChoosableFileFilter(new ExpressionFileFilter());
2 26 Feb 07 jari 183         fc.setFileView(new ExpressionFileView());
2 26 Feb 07 jari 184         fc.setCurrentDirectory(new File("Data"));
2 26 Feb 07 jari 185         int returnVal = fc.showSaveDialog(JOptionPane.getFrameForComponent(this));
2 26 Feb 07 jari 186         if (returnVal == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 187             SVMFile = fc.getSelectedFile();
2 26 Feb 07 jari 188         } else return;
2 26 Feb 07 jari 189         try {
2 26 Feb 07 jari 190             BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(SVMFile)));
2 26 Feb 07 jari 191             
2 26 Feb 07 jari 192             
2 26 Feb 07 jari 193             for(int row=0; row<cvtm.getRowCount(); row++){
2 26 Feb 07 jari 194               for(int col=0; col<cvtm.getColumnCount(); col++){
2 26 Feb 07 jari 195                 out.write(cvtm.getValueAt(row, col).toString() + '\t');
2 26 Feb 07 jari 196             }
2 26 Feb 07 jari 197               out.write('\n');
2 26 Feb 07 jari 198             }
2 26 Feb 07 jari 199             out.flush();
2 26 Feb 07 jari 200             out.close();
2 26 Feb 07 jari 201             out = null;
2 26 Feb 07 jari 202         } catch (Exception ex) {
2 26 Feb 07 jari 203             ex.printStackTrace();
2 26 Feb 07 jari 204             JOptionPane.showMessageDialog( this, "Error writing to file "+SVMFile.getPath()+"!","Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 205         }
2 26 Feb 07 jari 206     }
2 26 Feb 07 jari 207     
2 26 Feb 07 jari 208     
2 26 Feb 07 jari 209
2 26 Feb 07 jari 210     
2 26 Feb 07 jari 211     /** Returns a component to be inserted into the scroll pane row header
2 26 Feb 07 jari 212      */
2 26 Feb 07 jari 213     public JComponent getRowHeaderComponent() {
2 26 Feb 07 jari 214         return null;
2 26 Feb 07 jari 215     }    
2 26 Feb 07 jari 216     
2 26 Feb 07 jari 217     /** Returns the corner component corresponding to the indicated corner,
2 26 Feb 07 jari 218      * posibly null
2 26 Feb 07 jari 219      */
2 26 Feb 07 jari 220     public JComponent getCornerComponent(int cornerIndex) {
2 26 Feb 07 jari 221         return null;
2 26 Feb 07 jari 222     }    
2 26 Feb 07 jari 223     
2 26 Feb 07 jari 224   //TODO adding ResultPanel methods
2 26 Feb 07 jari 225     public void setSize(){
2 26 Feb 07 jari 226             Dimension d = updateSize();
2 26 Feb 07 jari 227             setSize(d.width, classes.length * lineHeight + 10);
2 26 Feb 07 jari 228             setPreferredSize(new Dimension(d.width, classes.length * lineHeight + 5));
2 26 Feb 07 jari 229         }
2 26 Feb 07 jari 230         
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         private boolean isLegalIndex(int i){
2 26 Feb 07 jari 233             return (i >=0 && i < classes.length);
2 26 Feb 07 jari 234         }
2 26 Feb 07 jari 235         
2 26 Feb 07 jari 236         private int getTopIndex(int top) {
2 26 Feb 07 jari 237             if (top < 0) {
2 26 Feb 07 jari 238                 return 0;
2 26 Feb 07 jari 239             }
2 26 Feb 07 jari 240             return top/lineHeight;
2 26 Feb 07 jari 241         }
2 26 Feb 07 jari 242         
2 26 Feb 07 jari 243         private int getBottomIndex(int bottom, int limit) {
2 26 Feb 07 jari 244             if (bottom < 0) {
2 26 Feb 07 jari 245                 return 0;
2 26 Feb 07 jari 246             }
2 26 Feb 07 jari 247             int result = bottom/lineHeight+1;
2 26 Feb 07 jari 248             return result > limit ? limit : result;
2 26 Feb 07 jari 249         }
2 26 Feb 07 jari 250         
2 26 Feb 07 jari 251         protected String [] getSpacerStrings(int indexLength, String clas, String discr){
2 26 Feb 07 jari 252             
2 26 Feb 07 jari 253             String [] s = new String[3];
2 26 Feb 07 jari 254             int s2_length;
2 26 Feb 07 jari 255             s[0] = s[1] = s[2] = "";
2 26 Feb 07 jari 256             for(int i = indexLength; i < 10 ; i++){
2 26 Feb 07 jari 257                 s[0] += " ";
2 26 Feb 07 jari 258             }
2 26 Feb 07 jari 259             if(clas.length() == 1)
2 26 Feb 07 jari 260                 s[0] += " ";
2 26 Feb 07 jari 261             s[1] = "     ";
2 26 Feb 07 jari 262             s2_length = 13 - discr.length();
2 26 Feb 07 jari 263             for(int i = 0; i < s2_length;i++){
2 26 Feb 07 jari 264                 s[2] += " ";
2 26 Feb 07 jari 265             }
2 26 Feb 07 jari 266             return s;
2 26 Feb 07 jari 267         }
2 26 Feb 07 jari 268         
2 26 Feb 07 jari 269         protected Dimension updateSize(){
2 26 Feb 07 jari 270     //  resultTable.
2 26 Feb 07 jari 271     //  FontMetrics fm = this.getFontMetrics(new Font("monospaced", Font.PLAIN, 14));
2 26 Feb 07 jari 272             int len = 0;
2 26 Feb 07 jari 273        
2 26 Feb 07 jari 274         //len = Math.max(len, fm.stringWidth(s));
2 26 Feb 07 jari 275         return new Dimension(120, getHeight());
2 26 Feb 07 jari 276     }
2 26 Feb 07 jari 277     
2 26 Feb 07 jari 278 }
2 26 Feb 07 jari 279