mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/ttest/TStatsTableViewer.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: TStatsTableViewer.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.9 $
2 26 Feb 07 jari 8  * $Date: 2006/05/02 16:57:56 $
2 26 Feb 07 jari 9  * $Author: eleanorahowe $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.ttest;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.Color;
2 26 Feb 07 jari 15 import java.awt.Dimension;
2 26 Feb 07 jari 16 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 17 import java.awt.GridBagLayout;
2 26 Feb 07 jari 18 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 19 import java.awt.event.ActionListener;
2 26 Feb 07 jari 20 import java.awt.event.InputEvent;
2 26 Feb 07 jari 21 import java.awt.event.MouseAdapter;
2 26 Feb 07 jari 22 import java.awt.event.MouseEvent;
2 26 Feb 07 jari 23 import java.io.File;
2 26 Feb 07 jari 24 import java.io.FileOutputStream;
2 26 Feb 07 jari 25 import java.io.PrintWriter;
2 26 Feb 07 jari 26 import java.util.Arrays;
2 26 Feb 07 jari 27 import java.util.Vector;
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29 import javax.swing.JComponent;
2 26 Feb 07 jari 30 import javax.swing.JFileChooser;
2 26 Feb 07 jari 31 import javax.swing.JMenuItem;
2 26 Feb 07 jari 32 import javax.swing.JPanel;
2 26 Feb 07 jari 33 import javax.swing.JPopupMenu;
2 26 Feb 07 jari 34 import javax.swing.JTable;
2 26 Feb 07 jari 35 import javax.swing.table.AbstractTableModel;
2 26 Feb 07 jari 36 import javax.swing.table.JTableHeader;
2 26 Feb 07 jari 37 import javax.swing.table.TableColumn;
2 26 Feb 07 jari 38 import javax.swing.table.TableColumnModel;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.impl.GUIFactory;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.impl.ViewerAdapter;
2 26 Feb 07 jari 45 import org.tigr.util.QSort;
2 26 Feb 07 jari 46
2 26 Feb 07 jari 47 /**
2 26 Feb 07 jari 48  *
2 26 Feb 07 jari 49  * @author  nbhagaba
2 26 Feb 07 jari 50  * @version
2 26 Feb 07 jari 51  */
2 26 Feb 07 jari 52 public class TStatsTableViewer extends ViewerAdapter {
2 26 Feb 07 jari 53     
2 26 Feb 07 jari 54     private JComponent header;
2 26 Feb 07 jari 55     private JComponent content;
2 26 Feb 07 jari 56     private Experiment experiment;
2 26 Feb 07 jari 57     private int[][] clusters;
2 26 Feb 07 jari 58     private boolean sig;
2 26 Feb 07 jari 59     private int[] rows;
2 26 Feb 07 jari 60     private String[] fieldNames;
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     private JTable tValuesTable;
2 26 Feb 07 jari 63     private TValuesTableModel tModel;
2 26 Feb 07 jari 64     private int tTestDesign;
2 26 Feb 07 jari 65     private Vector pValues, tValues, dfValues, meansA, meansB, sdA, sdB, oneClassMeans, oneClassSDs;
2 26 Feb 07 jari 66     private IData data;
2 26 Feb 07 jari 67     private JPopupMenu popup;
2 26 Feb 07 jari 68     //boolean meansASortedAsc, meansASortedDesc;
2 26 Feb 07 jari 69     private Object[][] origData;
2 26 Feb 07 jari 70     private boolean sortedAscending[];//, sortedDescending;
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72     /** Creates new TStatsTableViewer */
2 26 Feb 07 jari 73     public TStatsTableViewer(Experiment experiment, int[][] clusters, IData data, int tTestDesign, Vector oneClassMeans, Vector oneClassSDs, Vector meansA, Vector meansB, Vector sdA, Vector sdB, Vector pValues, Vector tValues, Vector dfValues, boolean sig) {
2 26 Feb 07 jari 74         this.experiment = experiment;
2 26 Feb 07 jari 75         this.clusters = clusters;
2 26 Feb 07 jari 76         this.data = data;
2 26 Feb 07 jari 77         this.fieldNames = data.getFieldNames();
2 26 Feb 07 jari 78         this.tTestDesign = tTestDesign;
2 26 Feb 07 jari 79         this.oneClassMeans = oneClassMeans;
2 26 Feb 07 jari 80         this.oneClassSDs = oneClassSDs;
2 26 Feb 07 jari 81         this.pValues = pValues;
2 26 Feb 07 jari 82         this.tValues = tValues;
2 26 Feb 07 jari 83         this.dfValues = dfValues;
2 26 Feb 07 jari 84         this.meansA = meansA;
2 26 Feb 07 jari 85         this.meansB = meansB;
2 26 Feb 07 jari 86         this.sdA = sdA;
2 26 Feb 07 jari 87         this.sdB = sdB;
2 26 Feb 07 jari 88         this.sig = sig;
2 26 Feb 07 jari 89         //this.meansASortedAsc = false;
2 26 Feb 07 jari 90         //this.meansASortedDesc =false;
2 26 Feb 07 jari 91         if (sig) {
2 26 Feb 07 jari 92             rows = clusters[0];
2 26 Feb 07 jari 93         } else {
2 26 Feb 07 jari 94             rows =clusters[1];
2 26 Feb 07 jari 95         }
2 26 Feb 07 jari 96         //this.sortedAscending = false;
2 26 Feb 07 jari 97         //this.sortedDescending = false;
2 26 Feb 07 jari 98         tModel = new TValuesTableModel(tTestDesign);
2 26 Feb 07 jari 99         tValuesTable = new JTable(tModel);
2 26 Feb 07 jari 100         origData = new Object[tModel.getRowCount()][tModel.getColumnCount()];
2 26 Feb 07 jari 101         for (int i = 0; i < origData.length; i++) {
2 26 Feb 07 jari 102             for (int j = 0; j < origData[i].length; j++) {
2 26 Feb 07 jari 103                 origData[i][j] = tModel.getValueAt(i, j);
2 26 Feb 07 jari 104             }
2 26 Feb 07 jari 105         }
2 26 Feb 07 jari 106         this.sortedAscending = new boolean[tModel.getColumnCount()];
2 26 Feb 07 jari 107         for (int i = 0; i < sortedAscending.length; i++) {
2 26 Feb 07 jari 108             sortedAscending[i] = false;
2 26 Feb 07 jari 109         }
2 26 Feb 07 jari 110         //tValuesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2 26 Feb 07 jari 111         //tValuesTable.setBackground(Color.white);
2 26 Feb 07 jari 112         //tValuesTable.setMinimumSize(new Dimension(500, tModel.getRowCount()*tValuesTable.getRowHeight()));
2 26 Feb 07 jari 113         //tValuesTable.setPreferredScrollableViewportSize(new Dimension(500, 600));
2 26 Feb 07 jari 114         //tValuesTable.setM
2 26 Feb 07 jari 115         TableColumn column = null;
2 26 Feb 07 jari 116         for (int i = 0; i < tModel.getColumnCount(); i++) {
2 26 Feb 07 jari 117             column = tValuesTable.getColumnModel().getColumn(i);
2 26 Feb 07 jari 118             column.setMinWidth(30);
2 26 Feb 07 jari 119         }
2 26 Feb 07 jari 120         addMouseListenerToHeaderInTable(tValuesTable);
2 26 Feb 07 jari 121         header  = tValuesTable.getTableHeader();
2 26 Feb 07 jari 122         //header.setBackground(Color.white);
2 26 Feb 07 jari 123         //content = createContent();
2 26 Feb 07 jari 124         setMaxWidth(getContentComponent(), getHeaderComponent());
2 26 Feb 07 jari 125     }
2 26 Feb 07 jari 126     
2 26 Feb 07 jari 127     public void onSelected(IFramework framework){
2 26 Feb 07 jari 128         this.data = framework.getData();
2 26 Feb 07 jari 129     }
2 26 Feb 07 jari 130     
2 26 Feb 07 jari 131     /**
2 26 Feb 07 jari 132      * Returns component to be inserted into the framework scroll pane.
2 26 Feb 07 jari 133      */
2 26 Feb 07 jari 134     public JComponent getContentComponent() {
2 26 Feb 07 jari 135         JPanel panel = new JPanel();
2 26 Feb 07 jari 136         panel.setBackground(Color.white);
2 26 Feb 07 jari 137         GridBagConstraints constraints = new GridBagConstraints();
2 26 Feb 07 jari 138         GridBagLayout gridbag = new GridBagLayout();
2 26 Feb 07 jari 139         panel.setLayout(gridbag);
2 26 Feb 07 jari 140         constraints.fill = GridBagConstraints.HORIZONTAL;
2 26 Feb 07 jari 141         constraints.anchor = GridBagConstraints.NORTH;
2 26 Feb 07 jari 142         buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
2 26 Feb 07 jari 143         gridbag.setConstraints(tValuesTable, constraints);
2 26 Feb 07 jari 144         panel.add(tValuesTable);
2 26 Feb 07 jari 145         
2 26 Feb 07 jari 146         final JFileChooser fc = new JFileChooser();
2 26 Feb 07 jari 147         fc.setCurrentDirectory(new File("Data"));
2 26 Feb 07 jari 148         fc.setDialogTitle("Save gene t-statistics");
2 26 Feb 07 jari 149         
2 26 Feb 07 jari 150         popup = new JPopupMenu();
2 26 Feb 07 jari 151         JMenuItem menuItem = new JMenuItem("Save Gene t-statistics", GUIFactory.getIcon("save16.gif"));
2 26 Feb 07 jari 152         menuItem.addActionListener(new ActionListener() {
2 26 Feb 07 jari 153             public void actionPerformed(ActionEvent evt) {
2 26 Feb 07 jari 154                 int returnVal = fc.showSaveDialog(TStatsTableViewer.this.getHeaderComponent());
2 26 Feb 07 jari 155                 if (returnVal == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 156                     File file = fc.getSelectedFile();
2 26 Feb 07 jari 157                     try {
2 26 Feb 07 jari 158                         PrintWriter out = new PrintWriter(new FileOutputStream(file));
2 26 Feb 07 jari 159                         for (int i = 0; i < fieldNames.length; i++) {
2 26 Feb 07 jari 160                             out.print(fieldNames[i]);
2 26 Feb 07 jari 161                             if (i < fieldNames.length - 1) {
2 26 Feb 07 jari 162                                 
2 26 Feb 07 jari 163                                 out.print("\t");
2 26 Feb 07 jari 164                             }
2 26 Feb 07 jari 165                         }
2 26 Feb 07 jari 166                         if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 167                             out.print("\tGroupA mean\tGroupA std.dev.\tGroupB mean\tGroupB std.dev.\tt-ratio\tdf\tp-value\n");
2 26 Feb 07 jari 168                         } else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 169                             out.print("\tGene mean\tGene std.dev.\tt-ratio\tdf\tp-value\n");
2 26 Feb 07 jari 170                         }
2 26 Feb 07 jari 171                         for (int i = 0; i < rows.length; i++) {
2 26 Feb 07 jari 172                             for (int k = 0; k < fieldNames.length; k++) {
2 26 Feb 07 jari 173                                 out.print(data.getElementAttribute(experiment.getGeneIndexMappedToData(rows[i]), k));
2 26 Feb 07 jari 174                                 if (k < fieldNames.length - 1) {
2 26 Feb 07 jari 175                                     out.print("\t");
2 26 Feb 07 jari 176                                 }
2 26 Feb 07 jari 177                             }
2 26 Feb 07 jari 178                             if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 179                                 out.print("\t" + ((Float)(meansA.get(rows[i]))).floatValue());
2 26 Feb 07 jari 180                                 out.print("\t" + ((Float)(sdA.get(rows[i]))).floatValue());
2 26 Feb 07 jari 181                                 out.print("\t" + ((Float)(meansB.get(rows[i]))).floatValue());
2 26 Feb 07 jari 182                                 out.print("\t" + ((Float)(sdB.get(rows[i]))).floatValue());
2 26 Feb 07 jari 183                             } else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 184                                 out.print("\t" + ((Float)(oneClassMeans.get(rows[i]))).floatValue());
2 26 Feb 07 jari 185                                 out.print("\t" + ((Float)(oneClassSDs.get(rows[i]))).floatValue());                                
2 26 Feb 07 jari 186                             }
2 26 Feb 07 jari 187                             out.print("\t" + ((Float)(tValues.get(rows[i]))).floatValue());
2 26 Feb 07 jari 188                             out.print("\t" + ((Float)(dfValues.get(rows[i]))).intValue());
2 26 Feb 07 jari 189                             out.print("\t" + ((Float)(pValues.get(rows[i]))).floatValue());
2 26 Feb 07 jari 190                             out.print("\n");
2 26 Feb 07 jari 191                         }
2 26 Feb 07 jari 192                         out.println();
2 26 Feb 07 jari 193                         out.flush();
2 26 Feb 07 jari 194                         out.close();
2 26 Feb 07 jari 195                     } catch (Exception e) {
2 26 Feb 07 jari 196                         e.printStackTrace();
2 26 Feb 07 jari 197                     }
2 26 Feb 07 jari 198                     //this is where a real application would save the file.
2 26 Feb 07 jari 199                     //log.append("Saving: " + file.getName() + "." + newline);
2 26 Feb 07 jari 200                 } else {
2 26 Feb 07 jari 201                     //log.append("Save command cancelled by user." + newline);
2 26 Feb 07 jari 202                 }
2 26 Feb 07 jari 203             }
2 26 Feb 07 jari 204         });
2 26 Feb 07 jari 205         
2 26 Feb 07 jari 206         popup.add(menuItem);
2 26 Feb 07 jari 207         
2 26 Feb 07 jari 208         tValuesTable.addMouseListener(new MouseAdapter() {
2 26 Feb 07 jari 209             public void mousePressed(MouseEvent e) {
2 26 Feb 07 jari 210                 maybeShowPopup(e);
2 26 Feb 07 jari 211             }
2 26 Feb 07 jari 212             
2 26 Feb 07 jari 213             public void mouseReleased(MouseEvent e) {
2 26 Feb 07 jari 214                 maybeShowPopup(e);
2 26 Feb 07 jari 215             }
2 26 Feb 07 jari 216             
2 26 Feb 07 jari 217             private void maybeShowPopup(MouseEvent e) {
2 26 Feb 07 jari 218                 if (e.isPopupTrigger()) {
2 26 Feb 07 jari 219                     popup.show(e.getComponent(),
2 26 Feb 07 jari 220                     e.getX(), e.getY());
2 26 Feb 07 jari 221                 }
2 26 Feb 07 jari 222             }
2 26 Feb 07 jari 223             
2 26 Feb 07 jari 224         });
2 26 Feb 07 jari 225         
2 26 Feb 07 jari 226         return panel;
2 26 Feb 07 jari 227         //return tValuesTable;
2 26 Feb 07 jari 228         //return content;
2 26 Feb 07 jari 229     }
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231     /**
2 26 Feb 07 jari 232      * Returns the viewer header.
2 26 Feb 07 jari 233      */
2 26 Feb 07 jari 234     public JComponent getHeaderComponent() {
2 26 Feb 07 jari 235         JPanel panel = new JPanel();
2 26 Feb 07 jari 236         panel.setBackground(Color.white);
2 26 Feb 07 jari 237         GridBagConstraints constraints = new GridBagConstraints();
2 26 Feb 07 jari 238         GridBagLayout gridbag = new GridBagLayout();
2 26 Feb 07 jari 239         panel.setLayout(gridbag);
2 26 Feb 07 jari 240         constraints.fill = GridBagConstraints.HORIZONTAL;
2 26 Feb 07 jari 241         buildConstraints(constraints, 0, 0, 1, 1, 100, 100);
2 26 Feb 07 jari 242         gridbag.setConstraints(header, constraints);
2 26 Feb 07 jari 243         panel.add(header);
2 26 Feb 07 jari 244         return panel;
2 26 Feb 07 jari 245         //return header;
2 26 Feb 07 jari 246     }
2 26 Feb 07 jari 247     
2 26 Feb 07 jari 248     void buildConstraints(GridBagConstraints gbc, int gx, int gy,
2 26 Feb 07 jari 249     int gw, int gh, int wx, int wy) {
2 26 Feb 07 jari 250         
2 26 Feb 07 jari 251         gbc.gridx = gx;
2 26 Feb 07 jari 252         gbc.gridy = gy;
2 26 Feb 07 jari 253         gbc.gridwidth = gw;
2 26 Feb 07 jari 254         gbc.gridheight = gh;
2 26 Feb 07 jari 255         gbc.weightx = wx;
2 26 Feb 07 jari 256         gbc.weighty = wy;
2 26 Feb 07 jari 257     }
2 26 Feb 07 jari 258     
2 26 Feb 07 jari 259     
2 26 Feb 07 jari 260     
2 26 Feb 07 jari 261     class TValuesTableModel extends AbstractTableModel implements java.io.Serializable {
2 26 Feb 07 jari 262         String[] columnNames;
2 26 Feb 07 jari 263         Object[][] tableData;
2 26 Feb 07 jari 264         
2 26 Feb 07 jari 265         public TValuesTableModel(int design) {
2 26 Feb 07 jari 266             if (design == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 267                 columnNames = new String[fieldNames.length + 7];
2 26 Feb 07 jari 268                 int counter;
2 26 Feb 07 jari 269                 for (counter = 0; counter < fieldNames.length; counter++) {
2 26 Feb 07 jari 270                     columnNames[counter] = fieldNames[counter];
2 26 Feb 07 jari 271                 }
2 26 Feb 07 jari 272                 columnNames[counter] = "GroupA mean";
2 26 Feb 07 jari 273                 columnNames[counter + 1] = "GroupA std.dev";
2 26 Feb 07 jari 274                 columnNames[counter + 2] = "GroupB mean";
2 26 Feb 07 jari 275                 columnNames[counter + 3] = "GroupB std.dev.";
2 26 Feb 07 jari 276                 columnNames[counter + 4] = "t-ratio";
2 26 Feb 07 jari 277                 columnNames[counter + 5] = "df";
2 26 Feb 07 jari 278                 columnNames[counter + 6] = "p-value";
2 26 Feb 07 jari 279                 
2 26 Feb 07 jari 280                 tableData = new Object[rows.length][columnNames.length];
2 26 Feb 07 jari 281                 
2 26 Feb 07 jari 282                 for (int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 283                     for (int j = 0; j < tableData[i].length; j++) {
2 26 Feb 07 jari 284                         if (j < fieldNames.length) {
2 26 Feb 07 jari 285                             tableData[i][j] = data.getElementAttribute(experiment.getGeneIndexMappedToData(rows[i]), j);
2 26 Feb 07 jari 286                         } else if (j == fieldNames.length) {
2 26 Feb 07 jari 287                             float f = ((Float)(meansA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 288                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 289                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 290                             } else {
2 26 Feb 07 jari 291                                 tableData[i][j] = (Float)(meansA.get(rows[i]));
2 26 Feb 07 jari 292                             }
2 26 Feb 07 jari 293                             
2 26 Feb 07 jari 294                         } else if (j == fieldNames.length + 1) {
2 26 Feb 07 jari 295                             
2 26 Feb 07 jari 296                             float f = ((Float)(sdA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 297                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 298                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 299                             } else {
2 26 Feb 07 jari 300                                 tableData[i][j] = (Float)(sdA.get(rows[i]));
2 26 Feb 07 jari 301                             }
2 26 Feb 07 jari 302                             
2 26 Feb 07 jari 303                         } else if (j == fieldNames.length + 2) {
2 26 Feb 07 jari 304                             
2 26 Feb 07 jari 305                             float f = ((Float)(meansB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 306                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 307                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 308                             } else {
2 26 Feb 07 jari 309                                 tableData[i][j] = (Float)(meansB.get(rows[i]));
2 26 Feb 07 jari 310                             }
2 26 Feb 07 jari 311                             
2 26 Feb 07 jari 312                         } else if (j == fieldNames.length + 3) {
2 26 Feb 07 jari 313                             
2 26 Feb 07 jari 314                             float f = ((Float)(sdB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 315                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 316                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 317                             } else {
2 26 Feb 07 jari 318                                 tableData[i][j] = (Float)(sdB.get(rows[i]));
2 26 Feb 07 jari 319                             }
2 26 Feb 07 jari 320                             
2 26 Feb 07 jari 321                         } else if (j == fieldNames.length + 4) {
2 26 Feb 07 jari 322                             float f = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 323                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 324                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 325                             } else {
2 26 Feb 07 jari 326                                 tableData[i][j] = (Float)(tValues.get(rows[i]));
2 26 Feb 07 jari 327                             }
2 26 Feb 07 jari 328                         } else if (j == fieldNames.length + 5) {
2 26 Feb 07 jari 329                             float f = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 330                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 331                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 332                             } else {
2 26 Feb 07 jari 333                                 tableData[i][j] = (Float)(dfValues.get(rows[i]));
2 26 Feb 07 jari 334                             }
2 26 Feb 07 jari 335                         } else if (j == fieldNames.length + 6) {
2 26 Feb 07 jari 336                             float f = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 337                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 338                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 339                             } else {
2 26 Feb 07 jari 340                                 tableData[i][j] = (Float)(pValues.get(rows[i]));
2 26 Feb 07 jari 341                             }
2 26 Feb 07 jari 342                         }
2 26 Feb 07 jari 343                     }
2 26 Feb 07 jari 344                 }
2 26 Feb 07 jari 345                 
2 26 Feb 07 jari 346             } else if (design == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 347                 columnNames = new String[fieldNames.length + 5];
2 26 Feb 07 jari 348                 int counter;
2 26 Feb 07 jari 349                 for (counter = 0; counter < fieldNames.length; counter++) {
2 26 Feb 07 jari 350                     columnNames[counter] = fieldNames[counter];
2 26 Feb 07 jari 351                 }
2 26 Feb 07 jari 352                 columnNames[counter] = "Gene mean";
2 26 Feb 07 jari 353                 columnNames[counter + 1] = "Gene std.dev";
2 26 Feb 07 jari 354                 columnNames[counter + 2] = "t-ratio";
2 26 Feb 07 jari 355                 columnNames[counter + 3] = "df";
2 26 Feb 07 jari 356                 columnNames[counter + 4] = "p-value";
2 26 Feb 07 jari 357                 
2 26 Feb 07 jari 358                 tableData = new Object[rows.length][columnNames.length];
2 26 Feb 07 jari 359                 
2 26 Feb 07 jari 360                 for (int i = 0; i < tableData.length; i++) {
2 26 Feb 07 jari 361                     for (int j = 0; j < tableData[i].length; j++) {
2 26 Feb 07 jari 362                         if (j < fieldNames.length) {
2 26 Feb 07 jari 363                             tableData[i][j] = data.getElementAttribute(experiment.getGeneIndexMappedToData(rows[i]), j);
2 26 Feb 07 jari 364                         } else if (j == fieldNames.length) {
2 26 Feb 07 jari 365                             float f = ((Float)(oneClassMeans.get(rows[i]))).floatValue();
2 26 Feb 07 jari 366                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 367                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 368                             } else {
2 26 Feb 07 jari 369                                 tableData[i][j] = (Float)(oneClassMeans.get(rows[i]));
2 26 Feb 07 jari 370                             }
2 26 Feb 07 jari 371                             
2 26 Feb 07 jari 372                         } else if (j == fieldNames.length + 1) {
2 26 Feb 07 jari 373                             
2 26 Feb 07 jari 374                             float f = ((Float)(oneClassSDs.get(rows[i]))).floatValue();
2 26 Feb 07 jari 375                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 376                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 377                             } else {
2 26 Feb 07 jari 378                                 tableData[i][j] = (Float)(oneClassSDs.get(rows[i]));
2 26 Feb 07 jari 379                             }
2 26 Feb 07 jari 380                             
2 26 Feb 07 jari 381                         } else if (j == fieldNames.length + 2) {
2 26 Feb 07 jari 382                             float f = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 383                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 384                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 385                             } else {
2 26 Feb 07 jari 386                                 tableData[i][j] = (Float)(tValues.get(rows[i]));
2 26 Feb 07 jari 387                             }
2 26 Feb 07 jari 388                         } else if (j == fieldNames.length + 3) {
2 26 Feb 07 jari 389                             float f = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 390                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 391                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 392                             } else {
2 26 Feb 07 jari 393                                 tableData[i][j] = (Float)(dfValues.get(rows[i]));
2 26 Feb 07 jari 394                             }
2 26 Feb 07 jari 395                         } else if (j == fieldNames.length + 4) {
2 26 Feb 07 jari 396                             float f = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 397                             if (Float.isNaN(f)) {
2 26 Feb 07 jari 398                                 tableData[i][j] = "N/A";
2 26 Feb 07 jari 399                             } else {
2 26 Feb 07 jari 400                                 tableData[i][j] = (Float)(pValues.get(rows[i]));
2 26 Feb 07 jari 401                             }
2 26 Feb 07 jari 402                         }
2 26 Feb 07 jari 403                     }
2 26 Feb 07 jari 404                 }
2 26 Feb 07 jari 405             }
2 26 Feb 07 jari 406         }
2 26 Feb 07 jari 407         
2 26 Feb 07 jari 408         public int getColumnCount() {
2 26 Feb 07 jari 409             return columnNames.length;
2 26 Feb 07 jari 410         }
2 26 Feb 07 jari 411         
2 26 Feb 07 jari 412         public int getRowCount() {
2 26 Feb 07 jari 413             return tableData.length;
2 26 Feb 07 jari 414         }
2 26 Feb 07 jari 415         
2 26 Feb 07 jari 416         public String getColumnName(int col) {
2 26 Feb 07 jari 417             return columnNames[col];
2 26 Feb 07 jari 418         }
2 26 Feb 07 jari 419         
2 26 Feb 07 jari 420         public Object getValueAt(int row, int col) {
2 26 Feb 07 jari 421             return tableData[row][col];
2 26 Feb 07 jari 422         }
2 26 Feb 07 jari 423         
2 26 Feb 07 jari 424         public void setValueAt(Object value, int row, int col) {
2 26 Feb 07 jari 425             tableData[row][col] = value;
2 26 Feb 07 jari 426             fireTableCellUpdated(row, col);
2 26 Feb 07 jari 427         }
2 26 Feb 07 jari 428         
2 26 Feb 07 jari 429         /*
2 26 Feb 07 jari 430         public Class getColumnClass(int c) {
2 26 Feb 07 jari 431             if (c < fieldNames.length) {
2 26 Feb 07 jari 432                 return (new String()).getClass();
2 26 Feb 07 jari 433             } else {
2 26 Feb 07 jari 434                 return (new Float(1.0f)).getClass();
2 26 Feb 07 jari 435             }
2 26 Feb 07 jari 436             //return getValueAt(0, c).getClass();
2 26 Feb 07 jari 437         }
2 26 Feb 07 jari 438          */
2 26 Feb 07 jari 439         
2 26 Feb 07 jari 440         
2 26 Feb 07 jari 441         
2 26 Feb 07 jari 442     }
2 26 Feb 07 jari 443     
2 26 Feb 07 jari 444     /**
2 26 Feb 07 jari 445      * Synchronize content and header sizes.
2 26 Feb 07 jari 446      */
2 26 Feb 07 jari 447     private void setMaxWidth(JComponent content, JComponent header) {
2 26 Feb 07 jari 448         int c_width = content.getPreferredSize().width;
2 26 Feb 07 jari 449         int h_width = header.getPreferredSize().width;
2 26 Feb 07 jari 450         if (c_width > h_width) {
2 26 Feb 07 jari 451             header.setPreferredSize(new Dimension(c_width, header.getPreferredSize().height));
2 26 Feb 07 jari 452         } else {
2 26 Feb 07 jari 453             content.setPreferredSize(new Dimension(h_width, content.getPreferredSize().height));
2 26 Feb 07 jari 454         }
2 26 Feb 07 jari 455     }
2 26 Feb 07 jari 456     
2 26 Feb 07 jari 457     public void addMouseListenerToHeaderInTable(JTable table) {
2 26 Feb 07 jari 458         //final TableSorter sorter = this;
2 26 Feb 07 jari 459         final JTable tableView = table;
2 26 Feb 07 jari 460         tableView.setColumnSelectionAllowed(false);
2 26 Feb 07 jari 461         MouseAdapter listMouseListener = new MouseAdapter() {
2 26 Feb 07 jari 462             public void mouseClicked(MouseEvent e) {
2 26 Feb 07 jari 463                 TableColumnModel columnModel = tableView.getColumnModel();
2 26 Feb 07 jari 464                 int viewColumn = columnModel.getColumnIndexAtX(e.getX());
2 26 Feb 07 jari 465                 int column = tableView.convertColumnIndexToModel(viewColumn);
2 26 Feb 07 jari 466                 if (e.getClickCount() == 1 && column != -1) {
2 26 Feb 07 jari 467                     //System.out.println("Sorting ...");
2 26 Feb 07 jari 468                     int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;
2 26 Feb 07 jari 469                     int controlPressed = e.getModifiers()&InputEvent.CTRL_MASK;
2 26 Feb 07 jari 470                     //boolean ascending = (shiftPressed == 0);
2 26 Feb 07 jari 471                     boolean originalOrder = (controlPressed != 0);
2 26 Feb 07 jari 472                     //sortedAscending[column] = !(sortedAscending[column]);
2 26 Feb 07 jari 473                     //sortByColumn(column, ascending, originalOrder);
2 26 Feb 07 jari 474                     sortByColumn(column, !(sortedAscending[column]), originalOrder);
2 26 Feb 07 jari 475                     sortedAscending[column] = !(sortedAscending[column]);
2 26 Feb 07 jari 476                     //System.out.println("sortedAscending[" + column + "] = " + sortedAscending[column]);
2 26 Feb 07 jari 477                     if (originalOrder) {
2 26 Feb 07 jari 478                         for (int i = 0; i < tModel.getColumnCount(); i++)
2 26 Feb 07 jari 479                         sortedAscending[i] = false;
2 26 Feb 07 jari 480                     } 
2 26 Feb 07 jari 481                     //System.out.println("sortedAscending[" + column + "] = " + sortedAscending[column]);                    
2 26 Feb 07 jari 482                 }
2 26 Feb 07 jari 483             }
2 26 Feb 07 jari 484         };
2 26 Feb 07 jari 485         JTableHeader th = tableView.getTableHeader();
2 26 Feb 07 jari 486         th.addMouseListener(listMouseListener);
2 26 Feb 07 jari 487     }
2 26 Feb 07 jari 488     
2 26 Feb 07 jari 489     public void sortByColumn(int column, boolean ascending, boolean originalOrder) {
2 26 Feb 07 jari 490         if (originalOrder) {
2 26 Feb 07 jari 491             for (int i = 0; i < tModel.getRowCount(); i++) {
2 26 Feb 07 jari 492                 for (int j = 0; j < tModel.getColumnCount(); j++) {
2 26 Feb 07 jari 493                     tModel.setValueAt(origData[i][j], i, j);
2 26 Feb 07 jari 494                 }
2 26 Feb 07 jari 495             }
2 26 Feb 07 jari 496             //sortedAscending = false;
2 26 Feb 07 jari 497             return;
2 26 Feb 07 jari 498         } /*else {
2 26 Feb 07 jari 499             sortedAscending = !(sortedAscending);
2 26 Feb 07 jari 500         }*/
2 26 Feb 07 jari 501         //int[] sortedIndices;
2 26 Feb 07 jari 502         Object[][] sortedData = new Object[tValuesTable.getRowCount()][tValuesTable.getColumnCount()];
2 26 Feb 07 jari 503         float[] origArray = new float[rows.length];
2 26 Feb 07 jari 504         SortableField[] sortFields = new SortableField[rows.length];
2 26 Feb 07 jari 505         if (column < fieldNames.length) {
2 26 Feb 07 jari 506             //SortableField[] sortFields = new SortableField[rows.length];
2 26 Feb 07 jari 507             for (int i = 0; i < sortFields.length; i++) {
2 26 Feb 07 jari 508                 sortFields[i] = new SortableField(i, column);
2 26 Feb 07 jari 509                 //Arrays.sort(sortFields);
2 26 Feb 07 jari 510             }
2 26 Feb 07 jari 511             Arrays.sort(sortFields);
2 26 Feb 07 jari 512             //return;
2 26 Feb 07 jari 513         } else if (tTestDesign == TtestInitDialog.BETWEEN_SUBJECTS) {
2 26 Feb 07 jari 514             if (column == fieldNames.length) {
2 26 Feb 07 jari 515                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 516                     origArray[i] = ((Float)(meansA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 517                 }
2 26 Feb 07 jari 518             } else if (column == fieldNames.length + 1) {
2 26 Feb 07 jari 519                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 520                     origArray[i] = ((Float)(sdA.get(rows[i]))).floatValue();
2 26 Feb 07 jari 521                 }
2 26 Feb 07 jari 522             } else if (column == fieldNames.length + 2) {
2 26 Feb 07 jari 523                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 524                     origArray[i] = ((Float)(meansB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 525                 }
2 26 Feb 07 jari 526             } else if (column == fieldNames.length + 3) {
2 26 Feb 07 jari 527                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 528                     origArray[i] = ((Float)(sdB.get(rows[i]))).floatValue();
2 26 Feb 07 jari 529                 }
2 26 Feb 07 jari 530             } else if (column == fieldNames.length + 4) {
2 26 Feb 07 jari 531                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 532                     origArray[i] = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 533                 }
2 26 Feb 07 jari 534             } else if (column == fieldNames.length + 5) {
2 26 Feb 07 jari 535                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 536                     origArray[i] = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 537                 }
2 26 Feb 07 jari 538             } else if (column == fieldNames.length + 6) {
2 26 Feb 07 jari 539                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 540                     origArray[i] = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 541                 }
2 26 Feb 07 jari 542             }
2 26 Feb 07 jari 543         } else if (tTestDesign == TtestInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 544             if (column == fieldNames.length) {
2 26 Feb 07 jari 545                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 546                     origArray[i] = ((Float)(oneClassMeans.get(rows[i]))).floatValue();
2 26 Feb 07 jari 547                 }
2 26 Feb 07 jari 548             } else if (column == fieldNames.length + 1) {
2 26 Feb 07 jari 549                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 550                     origArray[i] = ((Float)(oneClassSDs.get(rows[i]))).floatValue();
2 26 Feb 07 jari 551                 }
2 26 Feb 07 jari 552             } else if (column == fieldNames.length + 2) {
2 26 Feb 07 jari 553                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 554                     origArray[i] = ((Float)(tValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 555                 }
2 26 Feb 07 jari 556             } else if (column == fieldNames.length + 3) {
2 26 Feb 07 jari 557                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 558                     origArray[i] = ((Float)(dfValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 559                 }
2 26 Feb 07 jari 560             } else if (column == fieldNames.length + 4) {
2 26 Feb 07 jari 561                 for (int i = 0; i < origArray.length; i++) {
2 26 Feb 07 jari 562                     origArray[i] = ((Float)(pValues.get(rows[i]))).floatValue();
2 26 Feb 07 jari 563                 }
2 26 Feb 07 jari 564             }            
2 26 Feb 07 jari 565         }
2 26 Feb 07 jari 566         //if ( ((ascending) && (!meansASortedAsc)) || ((!ascending) && (!meansASortedDesc)) ) {
2 26 Feb 07 jari 567         int[] sortedIndices = new int[rows.length];
2 26 Feb 07 jari 568         if (column >= fieldNames.length) {
2 26 Feb 07 jari 569             QSort sortArray = new QSort(origArray);
2 26 Feb 07 jari 570             sortedIndices = sortArray.getOrigIndx();
2 26 Feb 07 jari 571         } else {
2 26 Feb 07 jari 572             for (int i = 0; i < sortedIndices.length; i++) {
2 26 Feb 07 jari 573                 sortedIndices[i] = sortFields[i].getIndex();
2 26 Feb 07 jari 574             }
2 26 Feb 07 jari 575         }
2 26 Feb 07 jari 576         if (!ascending) {
2 26 Feb 07 jari 577             sortedIndices = reverse(sortedIndices);
2 26 Feb 07 jari 578         }
2 26 Feb 07 jari 579         //sortedIndices = sortNaNs(sortedIndices); //QSort does not appear to handle NaN's well, they show up in the middle of the sorted array
2 26 Feb 07 jari 580         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 581             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 582                 //sortedData[i][j] = tModel.getValueAt(sortedMeansAIndices[i], j);
2 26 Feb 07 jari 583                 sortedData[i][j] = origData[sortedIndices[i]][j];
2 26 Feb 07 jari 584             }
2 26 Feb 07 jari 585         }
2 26 Feb 07 jari 586         
2 26 Feb 07 jari 587         for (int i = 0; i < sortedData.length; i++) {
2 26 Feb 07 jari 588             for (int j = 0; j < sortedData[i].length; j++) {
2 26 Feb 07 jari 589                 tModel.setValueAt(sortedData[i][j], i, j);
2 26 Feb 07 jari 590             }
2 26 Feb 07 jari 591         }
2 26 Feb 07 jari 592         //}
2 26 Feb 07 jari 593         
2 26 Feb 07 jari 594                 /*
2 26 Feb 07 jari 595             if (ascending) {
2 26 Feb 07 jari 596                 if (column == fieldNames.length) {
2 26 Feb 07 jari 597                     meansASortedAsc = true;
2 26 Feb 07 jari 598                     meansASortedDesc = false;
2 26 Feb 07 jari 599                 }
2 26 Feb 07 jari 600                  
2 26 Feb 07 jari 601             } else {
2 26 Feb 07 jari 602                 if (column == fieldNames.length) {
2 26 Feb 07 jari 603                 meansASortedAsc = false;
2 26 Feb 07 jari 604                 meansASortedDesc = true;
2 26 Feb 07 jari 605                 }
2 26 Feb 07 jari 606                  
2 26 Feb 07 jari 607             }
2 26 Feb 07 jari 608                  */
2 26 Feb 07 jari 609         
2 26 Feb 07 jari 610         //}
2 26 Feb 07 jari 611     }
2 26 Feb 07 jari 612     
2 26 Feb 07 jari 613     private int[] reverse(int[] arr) {
2 26 Feb 07 jari 614         int[] revArr = new int[arr.length];
2 26 Feb 07 jari 615         int  revCount = 0;
2 26 Feb 07 jari 616         int count = arr.length - 1;
2 26 Feb 07 jari 617         for (int i=0; i < arr.length; i++) {
2 26 Feb 07 jari 618             revArr[revCount] = arr[count];
2 26 Feb 07 jari 619             revCount++;
2 26 Feb 07 jari 620             count--;
2 26 Feb 07 jari 621         }
2 26 Feb 07 jari 622         return revArr;
2 26 Feb 07 jari 623     }
2 26 Feb 07 jari 624     
2 26 Feb 07 jari 625     private class SortableField implements Comparable {
2 26 Feb 07 jari 626         private String field;
2 26 Feb 07 jari 627         private int index;
2 26 Feb 07 jari 628         
2 26 Feb 07 jari 629         SortableField(int index, int column) {
2 26 Feb 07 jari 630             this.index = index;
2 26 Feb 07 jari 631             this.field = (String)(origData[index][column]);
2 26 Feb 07 jari 632             //System.out.println("SortableField[" + index + "][" + column + "]: index = " + index + ", field = " + field);
2 26 Feb 07 jari 633         }
2 26 Feb 07 jari 634         
2 26 Feb 07 jari 635         public int compareTo(Object other) {
2 26 Feb 07 jari 636             SortableField otherField = (SortableField)other;
2 26 Feb 07 jari 637             return this.field.compareTo(otherField.getField());
2 26 Feb 07 jari 638         }
2 26 Feb 07 jari 639         
2 26 Feb 07 jari 640         public int getIndex() {
2 26 Feb 07 jari 641             return this.index;
2 26 Feb 07 jari 642         }
2 26 Feb 07 jari 643         public String getField() {
2 26 Feb 07 jari 644             return this.field;
2 26 Feb 07 jari 645         }
2 26 Feb 07 jari 646     }
2 26 Feb 07 jari 647 }