mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/usc/USCGUI.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * Created on Jun 4, 2004
2 26 Feb 07 jari 3  */
2 26 Feb 07 jari 4 package org.tigr.microarray.mev.cluster.gui.impl.usc;
2 26 Feb 07 jari 5
2 26 Feb 07 jari 6 import java.awt.Cursor;
2 26 Feb 07 jari 7 import java.awt.Dimension;
2 26 Feb 07 jari 8 import java.awt.Frame;
2 26 Feb 07 jari 9 import java.awt.Toolkit;
2 26 Feb 07 jari 10 import java.io.File;
2 26 Feb 07 jari 11 import java.io.FileWriter;
2 26 Feb 07 jari 12 import java.io.IOException;
2 26 Feb 07 jari 13 import java.util.Arrays;
2 26 Feb 07 jari 14 import java.util.Hashtable;
2 26 Feb 07 jari 15 import java.util.StringTokenizer;
2 26 Feb 07 jari 16 import java.util.Vector;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 import javax.swing.JFileChooser;
2 26 Feb 07 jari 19 import javax.swing.JFrame;
2 26 Feb 07 jari 20 import javax.swing.JOptionPane;
2 26 Feb 07 jari 21 import javax.swing.JPanel;
2 26 Feb 07 jari 22 import javax.swing.JProgressBar;
2 26 Feb 07 jari 23 import javax.swing.JTextField;
2 26 Feb 07 jari 24 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 27 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.gui.IClusterGUI;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 33 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 34
2 26 Feb 07 jari 35 /**
2 26 Feb 07 jari 36  * USCGUI is the main handler for the USC algorithm.  It creates 2 - 4 dialog boxes
2 26 Feb 07 jari 37  * and returns a some IViewer implementations in a DefaultMutableTreeNode.
2 26 Feb 07 jari 38  * 
2 26 Feb 07 jari 39  * 1.  USCClassDialog - allows user to choose between training (default) or 
2 26 Feb 07 jari 40  * classifying from a file.  If training, the user is required to provide USC
2 26 Feb 07 jari 41  * with the complete list of classes.  The user may also tweak some advanced
2 26 Feb 07 jari 42  * parameters if desired.
2 26 Feb 07 jari 43  * 
2 26 Feb 07 jari 44  * 2.  USCAssignLabel - asks user to assign the class labels to the training
2 26 Feb 07 jari 45  * hybs that are known.
2 26 Feb 07 jari 46  * 
2 26 Feb 07 jari 47  * 3.  USCDeltaDialog - displays a synopsis of the results from Cross Validation.
2 26 Feb 07 jari 48  * The user must choose 1 Delta/Rho combination to use for classification.  The
2 26 Feb 07 jari 49  * user is allowed here to save the training results to a file to use later.
2 26 Feb 07 jari 50  * 
2 26 Feb 07 jari 51  * 4.  USCFileDialog - just a File Browser so the user can point to a training
2 26 Feb 07 jari 52  * file.
2 26 Feb 07 jari 53  * 
2 26 Feb 07 jari 54  * 5.  USCConfirmDelta - allow user to try different Delta/Rho values
2 26 Feb 07 jari 55  * 
2 26 Feb 07 jari 56  * @author vu
2 26 Feb 07 jari 57  */
2 26 Feb 07 jari 58 public class USCGUI implements IClusterGUI {
2 26 Feb 07 jari 59   //0 based row and column numbers
2 26 Feb 07 jari 60   public static final int START_ROW = 1;
2 26 Feb 07 jari 61   public static final int START_COLUMN = 1;
2 26 Feb 07 jari 62   public static final int NUMBER_REPLICATES = 1;
2 26 Feb 07 jari 63   public static final String ERROR_OPTION = "0";
2 26 Feb 07 jari 64   
2 26 Feb 07 jari 65   public static final String NULL_REPLACER = "MOTHRA";
2 26 Feb 07 jari 66   public static final String END_LINE = "\r\n";
2 26 Feb 07 jari 67   public static final String TAB = "\t";
2 26 Feb 07 jari 68   
2 26 Feb 07 jari 69   private Hashtable htNameIndex;  //Hashtable of HybName/index in IData
2 26 Feb 07 jari 70
2 26 Feb 07 jari 71   private int numClasses;
2 26 Feb 07 jari 72   private int fold;
2 26 Feb 07 jari 73   private int numBins;
2 26 Feb 07 jari 74   private int delta;
2 26 Feb 07 jari 75   private int xValKount;
2 26 Feb 07 jari 76   private double corrLo;
2 26 Feb 07 jari 77   private double corrHi;
2 26 Feb 07 jari 78   private double corrStep;
2 26 Feb 07 jari 79   private boolean doLoocv;
2 26 Feb 07 jari 80
2 26 Feb 07 jari 81   private String[] uniqueClassArray;
2 26 Feb 07 jari 82   private String[] userLabelArray;
2 26 Feb 07 jari 83   private String[] hybNames;
2 26 Feb 07 jari 84   private String[] params;  //[ numBins, corrLo, corrHi, corrStep ]
2 26 Feb 07 jari 85   private String dataPath;
2 26 Feb 07 jari 86   
2 26 Feb 07 jari 87   private USCResult finalResult;
2 26 Feb 07 jari 88   private USCFoldResult[] foldResults;
2 26 Feb 07 jari 89   //private USCXValResult xValResults;
2 26 Feb 07 jari 90   private USCDeltaRhoResult[][][] xResult;
2 26 Feb 07 jari 91   
2 26 Feb 07 jari 92   
2 26 Feb 07 jari 93   /**
2 26 Feb 07 jari 94    * Reads hyb ratio data from the framework, classifies it and returns a 
2 26 Feb 07 jari 95    * DefaultMutableTreeNode containing LeafInfo objects with the results
2 26 Feb 07 jari 96    * @param framework
2 26 Feb 07 jari 97    * @return 
2 26 Feb 07 jari 98    */
2 26 Feb 07 jari 99   public DefaultMutableTreeNode execute( IFramework framework ) throws AlgorithmException {
2 26 Feb 07 jari 100     this.dataPath = TMEV.getDataPath();
2 26 Feb 07 jari 101     DefaultMutableTreeNode returnNode = new DefaultMutableTreeNode( "USC Result" );
2 26 Feb 07 jari 102     
2 26 Feb 07 jari 103     IData data = framework.getData();
2 26 Feb 07 jari 104     
2 26 Feb 07 jari 105     //figure out what type of analysis the user wants to do and get parameters
2 26 Feb 07 jari 106     USCClassDialog classDialog = new USCClassDialog( framework.getFrame() );
2 26 Feb 07 jari 107     
2 26 Feb 07 jari 108     if( classDialog.showModal() != JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 109 //      System.out.println( "Cancelled out of USCClassDialog" );
2 26 Feb 07 jari 110       return null;
2 26 Feb 07 jari 111     }
2 26 Feb 07 jari 112     
2 26 Feb 07 jari 113     //gather up all the parameters
2 26 Feb 07 jari 114     this.numClasses = classDialog.getNumClasses();
2 26 Feb 07 jari 115     this.numBins = classDialog.getNumBins();
2 26 Feb 07 jari 116     this.delta = classDialog.getDeltaMax();
2 26 Feb 07 jari 117     this.fold = classDialog.getFolds();
2 26 Feb 07 jari 118     this.corrLo = classDialog.getCorrLo();
2 26 Feb 07 jari 119     this.corrHi = classDialog.getCorrHi();
2 26 Feb 07 jari 120     this.corrStep = classDialog.getCorrStep();
2 26 Feb 07 jari 121     this.userLabelArray = classDialog.getClassLabels();
2 26 Feb 07 jari 122     this.xValKount = classDialog.getXValRuns();
2 26 Feb 07 jari 123     
2 26 Feb 07 jari 124     this.params = new String[ 4 ];
2 26 Feb 07 jari 125     this.params[ 0 ] = Integer.toString( this.numBins );
2 26 Feb 07 jari 126     this.params[ 1 ] = Double.toString( this.corrLo );
2 26 Feb 07 jari 127     this.params[ 2 ] = Double.toString( this.corrHi );
2 26 Feb 07 jari 128     this.params[ 3 ] = Double.toString( this.corrStep );
2 26 Feb 07 jari 129     
2 26 Feb 07 jari 130     //get hyb names as String[], so user can assign labels
2 26 Feb 07 jari 131     this.hybNames = new String[ data.getFeaturesCount() ];
2 26 Feb 07 jari 132     for( int i = 0; i < this.hybNames.length; i ++ ) {
2 26 Feb 07 jari 133       this.hybNames[ i ] = data.getFullSampleName( i );
2 26 Feb 07 jari 134     }//end i
2 26 Feb 07 jari 135     
2 26 Feb 07 jari 136     //act according to user's choice
2 26 Feb 07 jari 137     if( classDialog.getAnalysisOption() == USCClassDialog.TRAIN_THEN_CLASSIFY ) {
2 26 Feb 07 jari 138       return this.trainThenClassify( data, framework );
2 26 Feb 07 jari 139     } else {
2 26 Feb 07 jari 140       return this.classifyFromFile( data, framework );
2 26 Feb 07 jari 141     }
2 26 Feb 07 jari 142   }//end execute()
2 26 Feb 07 jari 143   
2 26 Feb 07 jari 144   
2 26 Feb 07 jari 145   /**
2 26 Feb 07 jari 146    * Train the training data, test the test data, return results
2 26 Feb 07 jari 147    * @param data
2 26 Feb 07 jari 148    * @return 
2 26 Feb 07 jari 149    */
2 26 Feb 07 jari 150   private DefaultMutableTreeNode trainThenClassify( IData data, IFramework framework ) {
2 26 Feb 07 jari 151     //show dialog so user can assign labels
2 26 Feb 07 jari 152     USCAssignLabel assLabel = new USCAssignLabel( this.hybNames, this.userLabelArray );
2 26 Feb 07 jari 153     if( assLabel.showModal() == JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 154       //the labels entered by the user
2 26 Feb 07 jari 155       String[] userEnteredLabels = assLabel.getHybLabels();
2 26 Feb 07 jari 156       
2 26 Feb 07 jari 157       //gather up loaded data in the form of USCHybSet objects
2 26 Feb 07 jari 158       USCTrainFileLoader loader = new USCTrainFileLoader( data, userEnteredLabels );
2 26 Feb 07 jari 159       USCHybSet trainSet = loader.getTrainHybSet();
2 26 Feb 07 jari 160       USCHybSet testSet = loader.getTestHybSet();
2 26 Feb 07 jari 161       
2 26 Feb 07 jari 162       //should keep track of what hyb comes in what position
2 26 Feb 07 jari 163       this.htNameIndex = this.hashNameIndex( data );
2 26 Feb 07 jari 164       
2 26 Feb 07 jari 165       //similar to userEntered, but in order as determined by USCHybSet & USCTrainFileLoader
2 26 Feb 07 jari 166       this.uniqueClassArray = trainSet.getUniqueClasses();
2 26 Feb 07 jari 167       
2 26 Feb 07 jari 168       //make sure the #folds doesn't exceed minimum hybs/class
2 26 Feb 07 jari 169       this.fold = this.validateFold( this.fold, trainSet );
2 26 Feb 07 jari 170       trainSet.permute( this.fold );
2 26 Feb 07 jari 171       
2 26 Feb 07 jari 172       //ready to cross validate
2 26 Feb 07 jari 173       USCCrossValidation xVal = new USCCrossValidation( this.numBins, 
2 26 Feb 07 jari 174       this.delta, this.corrLo, this.corrHi, this.corrStep, this.fold, this.xValKount );
2 26 Feb 07 jari 175       this.xResult = xVal.crossValidate(trainSet,framework.getFrame());
2 26 Feb 07 jari 176       
2 26 Feb 07 jari 177       //let user determine which rho/delta from cross validation to use
2 26 Feb 07 jari 178       USCDeltaDialog deltaDialog;
2 26 Feb 07 jari 179       
2 26 Feb 07 jari 180       if( this.fold == 1 ) {
2 26 Feb 07 jari 181         deltaDialog = new USCDeltaDialog( this.xResult, true );
2 26 Feb 07 jari 182       } else {
2 26 Feb 07 jari 183         deltaDialog = new USCDeltaDialog( this.xResult, false );
2 26 Feb 07 jari 184       }
2 26 Feb 07 jari 185       if( deltaDialog.showModal() == JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 186         USCRow row = deltaDialog.getSelectedRow();
2 26 Feb 07 jari 187         double fDelta = row.getFDelta();
2 26 Feb 07 jari 188         double fRho = row.getFRho();
2 26 Feb 07 jari 189         int iRho = ( int ) ( fRho * 10 );
2 26 Feb 07 jari 190         
2 26 Feb 07 jari 191         //need a progres bar and dialog
2 26 Feb 07 jari 192         JFrame jf = new JFrame();
2 26 Feb 07 jari 193         JPanel panel = new JPanel();
2 26 Feb 07 jari 194         JProgressBar bar = new JProgressBar( 0, trainSet.getNumGenes() );
2 26 Feb 07 jari 195         JProgressBar rhoBar = new JProgressBar( 0, 6 );
2 26 Feb 07 jari 196         panel.add( bar );
2 26 Feb 07 jari 197         jf.getContentPane().add( panel );
2 26 Feb 07 jari 198         jf.setSize( 150, 100 );
2 26 Feb 07 jari 199         jf.show();
2 26 Feb 07 jari 200         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 201         jf.setLocation((screenSize.width - 200)/2, (screenSize.height - 100)/2);
2 26 Feb 07 jari 202         
2 26 Feb 07 jari 203         //test the test set against the training set using user selected delta and rho
2 26 Feb 07 jari 204         USCHyb[] trainArray = trainSet.getHybs();
2 26 Feb 07 jari 205         USCHyb[] testArray = testSet.getHybs();
2 26 Feb 07 jari 206         this.finalResult = xVal.testTest( trainArray, testArray, fDelta, 
2 26 Feb 07 jari 207             fRho, trainSet.getNumGenes(), trainSet.getNumClasses(), 
2 26 Feb 07 jari 208             uniqueClassArray, bar, iRho );
2 26 Feb 07 jari 209         
2 26 Feb 07 jari 210         jf.dispose();
2 26 Feb 07 jari 211       
2 26 Feb 07 jari 212         //USCOrder[] has relevant gene info
2 26 Feb 07 jari 213         USCOrder[] order = this.finalResult.getOrder();
2 26 Feb 07 jari 214       
2 26 Feb 07 jari 215         //have all requisite info to save the training to a file if desired
2 26 Feb 07 jari 216         if( deltaDialog.saveTraining() ) {
2 26 Feb 07 jari 217           this.saveTraining( trainSet.getHybs(), row, order, data, 
2 26 Feb 07 jari 218               framework.getFrame(), trainSet.getGenes() );
2 26 Feb 07 jari 219         }
2 26 Feb 07 jari 220         
2 26 Feb 07 jari 221         //create a new Experiment to represent this analysis (subset of genes used)
2 26 Feb 07 jari 222         Experiment newExp = this.createNewExperiment( data.getExperiment(), 
2 26 Feb 07 jari 223             this.finalResult.getNumGenesUsed(), order );
2 26 Feb 07 jari 224         
2 26 Feb 07 jari 225         DefaultMutableTreeNode returnNode = new DefaultMutableTreeNode( "USC" );
2 26 Feb 07 jari 226         
2 26 Feb 07 jari 227         String[] testHybNames = new String[ testArray.length ];
2 26 Feb 07 jari 228         for( int h = 0; h < testArray.length; h ++ ) {
2 26 Feb 07 jari 229           testHybNames[ h ] = testArray[ h ].getHybName();
2 26 Feb 07 jari 230         }
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         //add the summary
2 26 Feb 07 jari 233         USCSummaryViewer summaryViewer = new USCSummaryViewer( 
2 26 Feb 07 jari 234             testHybNames, this.finalResult, this.uniqueClassArray, this.params,
2 26 Feb 07 jari 235             this.getGenes( testSet.getGenes(), finalResult ), framework );
2 26 Feb 07 jari 236         LeafInfo summaryLeaf = new LeafInfo( "Summary", summaryViewer );
2 26 Feb 07 jari 237         returnNode.add( new DefaultMutableTreeNode( summaryLeaf ) );
2 26 Feb 07 jari 238         
2 26 Feb 07 jari 239         //add a node to display all the hybs and the genes used for analysis
2 26 Feb 07 jari 240         returnNode.add( new DefaultMutableTreeNode( 
2 26 Feb 07 jari 241             this.createFullCluster( data, newExp, finalResult ) ) );
2 26 Feb 07 jari 242         
2 26 Feb 07 jari 243         //add the class results
2 26 Feb 07 jari 244         for( int c = 0; c < this.numClasses; c ++ ) {
2 26 Feb 07 jari 245           LeafInfo li = this.createClassCluster( c, newExp, finalResult, trainSet, testSet );
2 26 Feb 07 jari 246           returnNode.add( new DefaultMutableTreeNode( li ) );
2 26 Feb 07 jari 247         }
2 26 Feb 07 jari 248         
2 26 Feb 07 jari 249         return returnNode;
2 26 Feb 07 jari 250       } else {
2 26 Feb 07 jari 251         //System.out.println( "Cancelled out of Delta dialog" );
2 26 Feb 07 jari 252         return null;
2 26 Feb 07 jari 253       }
2 26 Feb 07 jari 254     } else {
2 26 Feb 07 jari 255       //System.out.println( "Cancelled out of AssignLabel dialog" );
2 26 Feb 07 jari 256       return null;
2 26 Feb 07 jari 257     }
2 26 Feb 07 jari 258   }//trainThenClassify()
2 26 Feb 07 jari 259   
2 26 Feb 07 jari 260   
2 26 Feb 07 jari 261   /**
2 26 Feb 07 jari 262    * Load Cross Validation data from a file, test against it and return results.  Need 
2 26 Feb 07 jari 263    * to be careful here to keep track of genes.  For starters, only the genes that 
2 26 Feb 07 jari 264    * were relevant and uncorrelated were written to the training file.  As such, we 
2 26 Feb 07 jari 265    * need to make sure that the USCHybs in both Training and Test sets match.  
2 26 Feb 07 jari 266    * Then, when we need to display the result hybs, we need to make sure we display
2 26 Feb 07 jari 267    * the right genes.
2 26 Feb 07 jari 268    * @param data
2 26 Feb 07 jari 269    * @param framework
2 26 Feb 07 jari 270    * @return
2 26 Feb 07 jari 271    */
2 26 Feb 07 jari 272   private DefaultMutableTreeNode classifyFromFile( IData data, IFramework framework ) {
2 26 Feb 07 jari 273     framework.getFrame().setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) );
2 26 Feb 07 jari 274     
2 26 Feb 07 jari 275     //let user load the training file
2 26 Feb 07 jari 276     USCFileDialog trainFileDialog = new USCFileDialog( framework.getFrame() );
2 26 Feb 07 jari 277     int iTfd = trainFileDialog.showModal();
2 26 Feb 07 jari 278       
2 26 Feb 07 jari 279     if( iTfd != JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 280       return null;
2 26 Feb 07 jari 281     }
2 26 Feb 07 jari 282       
2 26 Feb 07 jari 283     //create USCHybSet objects to represent training file
2 26 Feb 07 jari 284     USCTrainFileLoader loader = null;
2 26 Feb 07 jari 285     try {
2 26 Feb 07 jari 286       loader = new USCTrainFileLoader( trainFileDialog.getSelectedFile() );
2 26 Feb 07 jari 287     } catch (IOException e) {
2 26 Feb 07 jari 288       this.error("The File doesn't appear to be a Results File");
2 26 Feb 07 jari 289       e.printStackTrace();
2 26 Feb 07 jari 290       return null;
2 26 Feb 07 jari 291     }
2 26 Feb 07 jari 292       
2 26 Feb 07 jari 293     //file seems to have loaded properly
2 26 Feb 07 jari 294     USCHybSet trainSet = loader.getTrainHybSet();
2 26 Feb 07 jari 295     this.htNameIndex = this.hashNameIndex( data );
2 26 Feb 07 jari 296     this.uniqueClassArray = trainSet.getUniqueClasses();
2 26 Feb 07 jari 297       
2 26 Feb 07 jari 298     //also get the delta & rho to use
2 26 Feb 07 jari 299     double fDelta = loader.getDelta();
2 26 Feb 07 jari 300     double fRho = loader.getRho();
2 26 Feb 07 jari 301     
2 26 Feb 07 jari 302     //display dialog to see if user would like to try different delta or rho
2 26 Feb 07 jari 303     USCConfirmDelta confirmDelta = new USCConfirmDelta(framework.getFrame(), fDelta, fRho);
2 26 Feb 07 jari 304     int iCd = confirmDelta.showModal();
2 26 Feb 07 jari 305     
2 26 Feb 07 jari 306     if(iCd != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 307         return null;
2 26 Feb 07 jari 308     }
2 26 Feb 07 jari 309     
2 26 Feb 07 jari 310     fDelta = confirmDelta.getDelta();
2 26 Feb 07 jari 311     fRho = confirmDelta.getRho();
2 26 Feb 07 jari 312     int iRho = ( int ) ( fRho * 10 );
2 26 Feb 07 jari 313     
2 26 Feb 07 jari 314     //create a USCHybSet of the test set
2 26 Feb 07 jari 315     USCTrainFileLoader testLoader = new USCTrainFileLoader( data );
2 26 Feb 07 jari 316     USCHybSet testSet = testLoader.getTestHybSet();
2 26 Feb 07 jari 317       
2 26 Feb 07 jari 318     USCHyb[] trainArray = trainSet.getHybs();
2 26 Feb 07 jari 319     USCHyb[] testArray = testSet.getHybs();
2 26 Feb 07 jari 320     
2 26 Feb 07 jari 321     //need numclasses
2 26 Feb 07 jari 322     this.numClasses = trainSet.getNumClasses();
2 26 Feb 07 jari 323         
2 26 Feb 07 jari 324     //need a progres bar and dialog
2 26 Feb 07 jari 325     JFrame jf = new JFrame();
2 26 Feb 07 jari 326     JPanel panel = new JPanel();
2 26 Feb 07 jari 327     JProgressBar bar = new JProgressBar( 0, trainSet.getNumGenes() );
2 26 Feb 07 jari 328     panel.add( bar );
2 26 Feb 07 jari 329     jf.getContentPane().add( panel );
2 26 Feb 07 jari 330     jf.setSize( 250, 100 );
2 26 Feb 07 jari 331     jf.show();
2 26 Feb 07 jari 332     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 333     jf.setLocation((screenSize.width - 200)/2, (screenSize.height - 100)/2);
2 26 Feb 07 jari 334       
2 26 Feb 07 jari 335     //test
2 26 Feb 07 jari 336     USCCrossValidation xVal = new USCCrossValidation( this.numBins, this.delta, 
2 26 Feb 07 jari 337         this.corrLo, this.corrHi, this.corrStep, this.fold, this.xValKount );
2 26 Feb 07 jari 338     this.finalResult = xVal.testTest( trainArray, testArray, fDelta, 
2 26 Feb 07 jari 339         fRho, trainSet.getNumGenes(), trainSet.getNumClasses(), 
2 26 Feb 07 jari 340         trainSet.getUniqueClasses(), bar, iRho);
2 26 Feb 07 jari 341     
2 26 Feb 07 jari 342     jf.dispose();
2 26 Feb 07 jari 343
2 26 Feb 07 jari 344     //USCOrder[] has relevant gene info
2 26 Feb 07 jari 345     USCOrder[] order = finalResult.getOrder();
2 26 Feb 07 jari 346
2 26 Feb 07 jari 347     //create a new Experiment to represent this analysis (subset of genes used)
2 26 Feb 07 jari 348     Experiment newExp = this.createNewExperiment( data.getExperiment(), 
2 26 Feb 07 jari 349     finalResult.getNumGenesUsed(), order );
2 26 Feb 07 jari 350     
2 26 Feb 07 jari 351     DefaultMutableTreeNode returnNode = new DefaultMutableTreeNode( "USC" );
2 26 Feb 07 jari 352         
2 26 Feb 07 jari 353     //add the summary
2 26 Feb 07 jari 354     USCSummaryViewer summaryViewer = new USCSummaryViewer( 
2 26 Feb 07 jari 355         this.hybNames, this.finalResult, this.uniqueClassArray, this.params,
2 26 Feb 07 jari 356         this.getGenes( testSet.getGenes(), finalResult ), framework );
2 26 Feb 07 jari 357     
2 26 Feb 07 jari 358     LeafInfo summaryLeaf = new LeafInfo( "Summary", summaryViewer );
2 26 Feb 07 jari 359     returnNode.add( new DefaultMutableTreeNode( summaryLeaf ) );
2 26 Feb 07 jari 360         
2 26 Feb 07 jari 361     //add a node to display all the hybs and the genes used for analysis
2 26 Feb 07 jari 362     returnNode.add( new DefaultMutableTreeNode( 
2 26 Feb 07 jari 363     this.createFullCluster( data, newExp, finalResult ) ) );
2 26 Feb 07 jari 364     
2 26 Feb 07 jari 365     for( int c = 0; c < this.numClasses; c ++ ) {
2 26 Feb 07 jari 366       LeafInfo li = this.createClassClusterForTrainFile( c, newExp, finalResult, trainSet, testSet );
2 26 Feb 07 jari 367       returnNode.add( new DefaultMutableTreeNode( li ) );
2 26 Feb 07 jari 368     }
2 26 Feb 07 jari 369     
2 26 Feb 07 jari 370     framework.getFrame().setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURSOR ) );
2 26 Feb 07 jari 371     
2 26 Feb 07 jari 372     return returnNode;
2 26 Feb 07 jari 373   }//classifyFromFile()
2 26 Feb 07 jari 374   
2 26 Feb 07 jari 375   
2 26 Feb 07 jari 376   /**
2 26 Feb 07 jari 377    * Casts a float[][] to a double[][]
2 26 Feb 07 jari 378    * @param floatMatrix
2 26 Feb 07 jari 379    * @return
2 26 Feb 07 jari 380    */
2 26 Feb 07 jari 381   static double[][] castFloatToDoubleArray( float[][] floatMatrix ) {
2 26 Feb 07 jari 382     double[][] toReturn = new double[ floatMatrix.length ][ floatMatrix[ 0 ].length ];
2 26 Feb 07 jari 383     for( int i = 0; i < floatMatrix.length; i ++ ) {
2 26 Feb 07 jari 384       for( int j = 0; j < floatMatrix[ i ].length; j ++ ) {
2 26 Feb 07 jari 385         toReturn[ i ][ j ] = ( double ) floatMatrix[ i ][ j ];
2 26 Feb 07 jari 386       }
2 26 Feb 07 jari 387     }
2 26 Feb 07 jari 388     return toReturn;
2 26 Feb 07 jari 389   }//castFloatToDoubleArray()
2 26 Feb 07 jari 390   
2 26 Feb 07 jari 391   
2 26 Feb 07 jari 392   /**
2 26 Feb 07 jari 393    * Creates a new Experiment as a subset of the existing Experiment containing
2 26 Feb 07 jari 394    * only the genes used for this analysis ( those found to be both relevant and 
2 26 Feb 07 jari 395    * uncorrelated through Shrunken Centroid analysis ).
2 26 Feb 07 jari 396    * @param exp
2 26 Feb 07 jari 397    * @param numGenesUsed
2 26 Feb 07 jari 398    * @param order
2 26 Feb 07 jari 399    * @return
2 26 Feb 07 jari 400    */
2 26 Feb 07 jari 401   private Experiment createNewExperiment( Experiment exp, int numGenesUsed,
2 26 Feb 07 jari 402   USCOrder[] order ) {
2 26 Feb 07 jari 403     //need to first get the full double[][] of ratios, the full rowMap and full columns
2 26 Feb 07 jari 404     float[][] fullMatrix =  exp.getValues();
2 26 Feb 07 jari 405     int[] fullRowMap = exp.getRowMappingArrayCopy();
2 26 Feb 07 jari 406     int[] fullColumns = exp.getColumnIndicesCopy();
2 26 Feb 07 jari 407     
2 26 Feb 07 jari 408     //our new float[ genes ][ hybs ]
2 26 Feb 07 jari 409     float[][] newMatrix = new float[ numGenesUsed ][];
2 26 Feb 07 jari 410     
2 26 Feb 07 jari 411     //our new rowMap
2 26 Feb 07 jari 412     int[] newRowMap = new int[ numGenesUsed ];
2 26 Feb 07 jari 413     
2 26 Feb 07 jari 414     //loop through the USCOrder[] and look for relevant/uncorrelated genes, get the
2 26 Feb 07 jari 415     //rowMap index of that gene from original experiment and store for new exp
2 26 Feb 07 jari 416     int iKount = 0;
2 26 Feb 07 jari 417     for( int i = 0; i < order.length; i ++ ) {
2 26 Feb 07 jari 418       if( order[ i ].use() ) {
2 26 Feb 07 jari 419         int iGene = order[ iKount ].getIOriginal();
2 26 Feb 07 jari 420         newMatrix[ iKount ] = fullMatrix[ iGene ];
2 26 Feb 07 jari 421         newRowMap[ iKount ] = fullRowMap[ iGene ];
2 26 Feb 07 jari 422         iKount ++;
2 26 Feb 07 jari 423       }
2 26 Feb 07 jari 424     }//end i
2 26 Feb 07 jari 425     
2 26 Feb 07 jari 426     FloatMatrix fm = new FloatMatrix( newMatrix );
2 26 Feb 07 jari 427     Experiment toReturn = new Experiment( fm, fullColumns, newRowMap );
2 26 Feb 07 jari 428     
2 26 Feb 07 jari 429     return toReturn;
2 26 Feb 07 jari 430   }//createNewExperiment
2 26 Feb 07 jari 431   
2 26 Feb 07 jari 432   
2 26 Feb 07 jari 433   /**
2 26 Feb 07 jari 434    * Display all the hybs, but only the genes that were used in this analysis
2 26 Feb 07 jari 435    * @param data
2 26 Feb 07 jari 436    * @param exp
2 26 Feb 07 jari 437    * @param result
2 26 Feb 07 jari 438    * @return
2 26 Feb 07 jari 439    */
2 26 Feb 07 jari 440   private LeafInfo createFullCluster( IData data, Experiment exp, USCResult result ) {
2 26 Feb 07 jari 441     LeafInfo toReturn;
2 26 Feb 07 jari 442     
2 26 Feb 07 jari 443     int[][] clusters = new int[ 1 ][ data.getFeaturesCount() ];
2 26 Feb 07 jari 444     for( int i = 0; i < data.getFeaturesCount(); i ++ ) {
2 26 Feb 07 jari 445       clusters[ 0 ][ i ] = i;
2 26 Feb 07 jari 446     }
2 26 Feb 07 jari 447     
2 26 Feb 07 jari 448     USCExperimentClusterViewer viewer = new USCExperimentClusterViewer( exp, clusters );
2 26 Feb 07 jari 449     toReturn = new LeafInfo( "All Loaded Hybs - Genes Used", viewer, new Integer( 0 ) );
2 26 Feb 07 jari 450     
2 26 Feb 07 jari 451     return toReturn;
2 26 Feb 07 jari 452   }//createFullCluster()
2 26 Feb 07 jari 453   
2 26 Feb 07 jari 454   
2 26 Feb 07 jari 455   /**
2 26 Feb 07 jari 456    * Creates the Leaf Info for the case where the user loaded previous training file.
2 26 Feb 07 jari 457    * @param c
2 26 Feb 07 jari 458    * @param exp
2 26 Feb 07 jari 459    * @param result
2 26 Feb 07 jari 460    * @param trainSet
2 26 Feb 07 jari 461    * @param testSet
2 26 Feb 07 jari 462    * @return
2 26 Feb 07 jari 463    */
2 26 Feb 07 jari 464   private LeafInfo createClassClusterForTrainFile( int c, Experiment exp, USCResult result, 
2 26 Feb 07 jari 465   USCHybSet trainSet, USCHybSet testSet ) {
2 26 Feb 07 jari 466     LeafInfo toReturn;
2 26 Feb 07 jari 467     double[][] scores = result.getDiscScores();
2 26 Feb 07 jari 468     
2 26 Feb 07 jari 469     //we'll create a separate viewer for each class
2 26 Feb 07 jari 470     //get this class's hybs
2 26 Feb 07 jari 471     USCHyb[] classHybs = trainSet.getHybsInClass( c );
2 26 Feb 07 jari 472     
2 26 Feb 07 jari 473     //find the hybs that were assigned to this class
2 26 Feb 07 jari 474     Vector vHybIndex = new Vector();
2 26 Feb 07 jari 475     for( int h = 0; h < scores.length; h ++ ) {
2 26 Feb 07 jari 476       //get a handle to the hyb we're testing
2 26 Feb 07 jari 477       USCHyb hyb = testSet.getHyb( h );
2 26 Feb 07 jari 478       
2 26 Feb 07 jari 479       //if this hyb belongs to this class, store its index
2 26 Feb 07 jari 480       int iMin = result.getAssignedClassIndex( h );
2 26 Feb 07 jari 481       if( iMin == c ) {
2 26 Feb 07 jari 482         //System.out.println( hyb.getHybName() );
2 26 Feb 07 jari 483         vHybIndex.add( new Integer( this.lookupIndex( hyb.getHybName() ) ) );
2 26 Feb 07 jari 484       }
2 26 Feb 07 jari 485     }//end h
2 26 Feb 07 jari 486     
2 26 Feb 07 jari 487     int[][] clusters = new int[ 1 ][ vHybIndex.size() ];
2 26 Feb 07 jari 488     for( int h = 0; h < vHybIndex.size(); h ++ ) {
2 26 Feb 07 jari 489       Integer I = ( Integer ) vHybIndex.elementAt( h );
2 26 Feb 07 jari 490       clusters[ 0 ][ h ] = I.intValue();
2 26 Feb 07 jari 491     }
2 26 Feb 07 jari 492     
2 26 Feb 07 jari 493     USCExperimentClusterViewer viewer = new USCExperimentClusterViewer( exp, clusters );
2 26 Feb 07 jari 494     String sNode = new String( "Classified As: " + trainSet.getUniqueClass( c ) );
2 26 Feb 07 jari 495     toReturn = new LeafInfo( sNode, viewer, new Integer( 0 ) );
2 26 Feb 07 jari 496     
2 26 Feb 07 jari 497     return toReturn;
2 26 Feb 07 jari 498   }//end createClassCluster()
2 26 Feb 07 jari 499   
2 26 Feb 07 jari 500   
2 26 Feb 07 jari 501   /**
2 26 Feb 07 jari 502    * 
2 26 Feb 07 jari 503    * @param c
2 26 Feb 07 jari 504    * @param exp
2 26 Feb 07 jari 505    * @param result
2 26 Feb 07 jari 506    * @param trainSet
2 26 Feb 07 jari 507    * @param testSet
2 26 Feb 07 jari 508    * @return
2 26 Feb 07 jari 509    */
2 26 Feb 07 jari 510   private LeafInfo createClassCluster( int c, Experiment exp, USCResult result, 
2 26 Feb 07 jari 511   USCHybSet trainSet, USCHybSet testSet ) {
2 26 Feb 07 jari 512     LeafInfo toReturn;
2 26 Feb 07 jari 513     double[][] scores = result.getDiscScores();
2 26 Feb 07 jari 514     
2 26 Feb 07 jari 515     //we'll create a separate viewer for each class
2 26 Feb 07 jari 516     //get this class's hybs
2 26 Feb 07 jari 517     USCHyb[] classHybs = trainSet.getHybsInClass( c );
2 26 Feb 07 jari 518     
2 26 Feb 07 jari 519     //find the hybs that were assigned to this class
2 26 Feb 07 jari 520     Vector vHybIndex = new Vector();
2 26 Feb 07 jari 521     for( int h = 0; h < scores.length; h ++ ) {
2 26 Feb 07 jari 522       //get a handle to the hyb we're testing
2 26 Feb 07 jari 523       USCHyb hyb = testSet.getHyb( h );
2 26 Feb 07 jari 524       
2 26 Feb 07 jari 525       //if this hyb belongs to this class, store its index
2 26 Feb 07 jari 526       int iMin = result.getAssignedClassIndex( h );
2 26 Feb 07 jari 527       if( iMin == c ) {
2 26 Feb 07 jari 528         //System.out.println( hyb.getHybName() );
2 26 Feb 07 jari 529         vHybIndex.add( new Integer( this.lookupIndex( hyb.getHybName() ) ) );
2 26 Feb 07 jari 530       }
2 26 Feb 07 jari 531     }//end h
2 26 Feb 07 jari 532     
2 26 Feb 07 jari 533     int[][] clusters = new int[ 1 ][ ( classHybs.length + vHybIndex.size() ) ];
2 26 Feb 07 jari 534     for( int h = 0; h < classHybs.length; h ++ ) {
2 26 Feb 07 jari 535       clusters[ 0 ][ h ] = this.lookupIndex( classHybs[ h ].getHybName() );
2 26 Feb 07 jari 536     }
2 26 Feb 07 jari 537     for( int h = 0; h < vHybIndex.size(); h ++ ) {
2 26 Feb 07 jari 538       Integer I = ( Integer ) vHybIndex.elementAt( h );
2 26 Feb 07 jari 539       clusters[ 0 ][ ( classHybs.length + h ) ] = I.intValue();
2 26 Feb 07 jari 540     }
2 26 Feb 07 jari 541     
2 26 Feb 07 jari 542     USCExperimentClusterViewer viewer = new USCExperimentClusterViewer( exp, clusters );
2 26 Feb 07 jari 543     String sNode = new String( "Classified As: " + trainSet.getUniqueClass( c ) );
2 26 Feb 07 jari 544     toReturn = new LeafInfo( sNode, viewer, new Integer( 0 ) );
2 26 Feb 07 jari 545     
2 26 Feb 07 jari 546     return toReturn;
2 26 Feb 07 jari 547   }//end createClassCluster()
2 26 Feb 07 jari 548   
2 26 Feb 07 jari 549   
2 26 Feb 07 jari 550   /**
2 26 Feb 07 jari 551    * 
2 26 Feb 07 jari 552    * @param data
2 26 Feb 07 jari 553    * @return
2 26 Feb 07 jari 554    */
2 26 Feb 07 jari 555   private Hashtable hashNameIndex( IData data ) {
2 26 Feb 07 jari 556     Hashtable ht = new Hashtable();
2 26 Feb 07 jari 557     
2 26 Feb 07 jari 558     int iHyb = data.getFeaturesCount();
2 26 Feb 07 jari 559     for( int i = 0; i < iHyb; i ++ ) {
2 26 Feb 07 jari 560       ht.put( data.getFullSampleName( i ), new Integer( i ) );
2 26 Feb 07 jari 561     }
2 26 Feb 07 jari 562     
2 26 Feb 07 jari 563     return ht;
2 26 Feb 07 jari 564   }//hashNameIndex()
2 26 Feb 07 jari 565   
2 26 Feb 07 jari 566   
2 26 Feb 07 jari 567   /**
2 26 Feb 07 jari 568    * Save the Trained Hybs
2 26 Feb 07 jari 569    * @param trainArray
2 26 Feb 07 jari 570    * @param row
2 26 Feb 07 jari 571    * @param order
2 26 Feb 07 jari 572    * @param data
2 26 Feb 07 jari 573    */
2 26 Feb 07 jari 574   private void saveTraining( USCHyb[] trainArray, USCRow row, 
2 26 Feb 07 jari 575   USCOrder[] order, IData data, Frame frame, USCGene[] genes ) {
2 26 Feb 07 jari 576     //System.out.println( "SaveTraining()" );
2 26 Feb 07 jari 577     
2 26 Feb 07 jari 578     //load the current path
2 26 Feb 07 jari 579     String dataPath = "/" + TMEV.getDataPath();
2 26 Feb 07 jari 580     if( dataPath == null ) {
2 26 Feb 07 jari 581       dataPath = "";
2 26 Feb 07 jari 582     }
2 26 Feb 07 jari 583     
2 26 Feb 07 jari 584     //resort the genes to be in original order
2 26 Feb 07 jari 585     Arrays.sort( order, new USCOrderSorter() );
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     //pop up dialog for save
2 26 Feb 07 jari 588     JFileChooser chooser = new JFileChooser( dataPath );
2 26 Feb 07 jari 589     USCTextFileFilter textFilter = new USCTextFileFilter();
2 26 Feb 07 jari 590     chooser.addChoosableFileFilter( textFilter );
2 26 Feb 07 jari 591     int returnVal = chooser.showSaveDialog( frame );
2 26 Feb 07 jari 592     if( returnVal == JFileChooser.APPROVE_OPTION ) {
2 26 Feb 07 jari 593       File saveFile;
2 26 Feb 07 jari 594       
2 26 Feb 07 jari 595       if( chooser.getFileFilter() == textFilter ) {
2 26 Feb 07 jari 596         //make sure to add .txt
2 26 Feb 07 jari 597         String path = chooser.getSelectedFile().getPath();
2 26 Feb 07 jari 598         if( path.toLowerCase().endsWith( "txt" ) ) {
2 26 Feb 07 jari 599           //great, already ok
2 26 Feb 07 jari 600           saveFile = new File( path );
2 26 Feb 07 jari 601         } else {
2 26 Feb 07 jari 602           //add it
2 26 Feb 07 jari 603           String subPath;
2 26 Feb 07 jari 604           int period = path.lastIndexOf( "." );
2 26 Feb 07 jari 605           if( period != -1 ) {
2 26 Feb 07 jari 606             System.out.println( "period  = -1" );
2 26 Feb 07 jari 607             subPath = path.substring( 0, period );
2 26 Feb 07 jari 608           } else {
2 26 Feb 07 jari 609             subPath = path;
2 26 Feb 07 jari 610           }
2 26 Feb 07 jari 611           String newPath = subPath + ".txt";
2 26 Feb 07 jari 612           saveFile = new File( newPath );
2 26 Feb 07 jari 613         }
2 26 Feb 07 jari 614       } else {
2 26 Feb 07 jari 615         saveFile = chooser.getSelectedFile();
2 26 Feb 07 jari 616       }
2 26 Feb 07 jari 617     
2 26 Feb 07 jari 618       StringBuffer sb = new StringBuffer();
2 26 Feb 07 jari 619     
2 26 Feb 07 jari 620       //first line
2 26 Feb 07 jari 621       sb.append( "Delta=" );
2 26 Feb 07 jari 622       sb.append( row.getDelta() );
2 26 Feb 07 jari 623       //append space
2 26 Feb 07 jari 624       sb.append( USCGUI.TAB );
2 26 Feb 07 jari 625       sb.append( "BLANK" );
2 26 Feb 07 jari 626       //loop through training hybs
2 26 Feb 07 jari 627       for( int h = 0; h < trainArray.length; h ++ ) {
2 26 Feb 07 jari 628         USCHyb hyb = trainArray[ h ];
2 26 Feb 07 jari 629         sb.append( USCGUI.TAB );
2 26 Feb 07 jari 630         sb.append( hyb.getHybName() );
2 26 Feb 07 jari 631       }
2 26 Feb 07 jari 632       sb.append( USCGUI.END_LINE );
2 26 Feb 07 jari 633     
2 26 Feb 07 jari 634       //2nd line
2 26 Feb 07 jari 635       sb.append( "Rho=" );
2 26 Feb 07 jari 636       sb.append( row.getRho() );
2 26 Feb 07 jari 637       //append space
2 26 Feb 07 jari 638       sb.append( USCGUI.TAB );
2 26 Feb 07 jari 639       sb.append( "BLANK" );
2 26 Feb 07 jari 640       //loop through training hybs
2 26 Feb 07 jari 641       for( int h = 0; h < trainArray.length; h ++ ) {
2 26 Feb 07 jari 642         USCHyb hyb = trainArray[ h ];
2 26 Feb 07 jari 643         sb.append( USCGUI.TAB );
2 26 Feb 07 jari 644         sb.append( hyb.getHybLabel() );
2 26 Feb 07 jari 645       }
2 26 Feb 07 jari 646       sb.append( USCGUI.END_LINE );
2 26 Feb 07 jari 647     
2 26 Feb 07 jari 648       //loop through USCOrder
2 26 Feb 07 jari 649       for( int o = 0; o < order.length; o ++ ) {
2 26 Feb 07 jari 650         //if( order[ o ].use() ) {
2 26 Feb 07 jari 651           //get the original index
2 26 Feb 07 jari 652           int iOrig = order[ o ].getIOriginal();
2 26 Feb 07 jari 653         
2 26 Feb 07 jari 654           //get the original gene
2 26 Feb 07 jari 655           sb.append( data.getGeneName( iOrig ) );
2 26 Feb 07 jari 656           
2 26 Feb 07 jari 657           //write the uid
2 26 Feb 07 jari 658           sb.append( USCGUI.TAB );
2 26 Feb 07 jari 659           sb.append( data.getUniqueId( iOrig ) );
2 26 Feb 07 jari 660         
2 26 Feb 07 jari 661           //loop through hybs
2 26 Feb 07 jari 662           for( int h = 0; h < trainArray.length; h ++ ) {
2 26 Feb 07 jari 663             USCHyb hyb = trainArray[ h ];
2 26 Feb 07 jari 664             sb.append( USCGUI.TAB );
2 26 Feb 07 jari 665             sb.append( hyb.getRatio( iOrig ) );
2 26 Feb 07 jari 666           }//end h
2 26 Feb 07 jari 667         
2 26 Feb 07 jari 668           sb.append( USCGUI.END_LINE );
2 26 Feb 07 jari 669         //}
2 26 Feb 07 jari 670       }//end o
2 26 Feb 07 jari 671     
2 26 Feb 07 jari 672       this.writeFile( saveFile, sb.toString() );
2 26 Feb 07 jari 673       
2 26 Feb 07 jari 674       //seems to have gone ok, save new path
2 26 Feb 07 jari 675       this.updateDataPath( saveFile.getAbsolutePath() );
2 26 Feb 07 jari 676     } else {
2 26 Feb 07 jari 677       System.out.println( "User Cancelled Saving Training File" );
2 26 Feb 07 jari 678       return;
2 26 Feb 07 jari 679     }
2 26 Feb 07 jari 680   }//saveTraining()
2 26 Feb 07 jari 681     
2 26 Feb 07 jari 682
2 26 Feb 07 jari 683   private void updateDataPath(String dataPath) {
2 26 Feb 07 jari 684     if (dataPath == null)
2 26 Feb 07 jari 685       return;
2 26 Feb 07 jari 686     String renderedSep = "/";
2 26 Feb 07 jari 687     String renderedPath = new String();
2 26 Feb 07 jari 688
2 26 Feb 07 jari 689     String sep = System.getProperty("file.separator");
2 26 Feb 07 jari 690     String lineSep = System.getProperty("line.separator");
2 26 Feb 07 jari 691
2 26 Feb 07 jari 692     StringTokenizer stok = new StringTokenizer(dataPath, sep);
2 26 Feb 07 jari 693
2 26 Feb 07 jari 694     this.dataPath = new String();
2 26 Feb 07 jari 695
2 26 Feb 07 jari 696     String str;
2 26 Feb 07 jari 697     while (stok.hasMoreTokens() && stok.countTokens() > 1) {
2 26 Feb 07 jari 698       str = stok.nextToken();
2 26 Feb 07 jari 699       renderedPath += str + renderedSep;
2 26 Feb 07 jari 700       this.dataPath += str + sep;
2 26 Feb 07 jari 701     }
2 26 Feb 07 jari 702     // sets the data path in config to render well
2 26 Feb 07 jari 703     TMEV.updateDataPath(renderedPath);
2 26 Feb 07 jari 704
2 26 Feb 07 jari 705     // sets variable to conform to OS spec.
2 26 Feb 07 jari 706     TMEV.setDataPath(this.dataPath);
2 26 Feb 07 jari 707   }
2 26 Feb 07 jari 708   
2 26 Feb 07 jari 709   
2 26 Feb 07 jari 710   /**
2 26 Feb 07 jari 711    * Uses the indices in result to create a String[] of gene names
2 26 Feb 07 jari 712    * @param data
2 26 Feb 07 jari 713    * @param result
2 26 Feb 07 jari 714    * @return
2 26 Feb 07 jari 715    */
2 26 Feb 07 jari 716   /*
2 26 Feb 07 jari 717   private String[] getGeneNames( IData data, USCResult result ) {
2 26 Feb 07 jari 718     //first gather the genes that were actually used
2 26 Feb 07 jari 719     USCOrder[] order = result.getOrder();
2 26 Feb 07 jari 720     int usedKount = 0;
2 26 Feb 07 jari 721     for( int i = 0; i < order.length; i ++ ) {
2 26 Feb 07 jari 722       if( order[ i ].use() ) {
2 26 Feb 07 jari 723         usedKount ++;
2 26 Feb 07 jari 724       }
2 26 Feb 07 jari 725     }
2 26 Feb 07 jari 726     
2 26 Feb 07 jari 727     //now create the String[]
2 26 Feb 07 jari 728     String[] geneNames = new String[ usedKount ];
2 26 Feb 07 jari 729     int iGeneNames = 0;
2 26 Feb 07 jari 730     for( int i = 0; i < order.length; i ++ ) {
2 26 Feb 07 jari 731       if( order[ i ].use() ) {
2 26 Feb 07 jari 732         geneNames[ iGeneNames ] = data.getGeneName( order[ i ].getIOriginal() );
2 26 Feb 07 jari 733         iGeneNames ++;
2 26 Feb 07 jari 734       }
2 26 Feb 07 jari 735     }
2 26 Feb 07 jari 736     
2 26 Feb 07 jari 737     return geneNames;
2 26 Feb 07 jari 738   }//getGeneNames()*/
2 26 Feb 07 jari 739   private USCGene[] getGenes( USCGene[] fullGenes, USCResult result ) {
2 26 Feb 07 jari 740     USCOrder[] order = result.getOrder();
2 26 Feb 07 jari 741     int usedKount = 0;
2 26 Feb 07 jari 742     for( int i = 0; i < order.length; i ++ ) {
2 26 Feb 07 jari 743       if( order[ i ].use() ) {
2 26 Feb 07 jari 744         usedKount ++;
2 26 Feb 07 jari 745       }
2 26 Feb 07 jari 746     }//i
2 26 Feb 07 jari 747     
2 26 Feb 07 jari 748     USCGene[] returnGenes = new USCGene[ usedKount ];
2 26 Feb 07 jari 749     int iGene = 0;
2 26 Feb 07 jari 750     for( int i = 0; i < order.length; i ++ ) {
2 26 Feb 07 jari 751       if( order[ i ].use() ) {
2 26 Feb 07 jari 752         returnGenes[ iGene ] = fullGenes[ order[ i ].getIOriginal() ];
2 26 Feb 07 jari 753         iGene ++;
2 26 Feb 07 jari 754       }
2 26 Feb 07 jari 755     }
2 26 Feb 07 jari 756     
2 26 Feb 07 jari 757     return returnGenes;
2 26 Feb 07 jari 758   }//getGenes();
2 26 Feb 07 jari 759   
2 26 Feb 07 jari 760   
2 26 Feb 07 jari 761   /**
2 26 Feb 07 jari 762    * 
2 26 Feb 07 jari 763    * @param hybName
2 26 Feb 07 jari 764    * @return
2 26 Feb 07 jari 765    */
2 26 Feb 07 jari 766   private int lookupIndex( String hybName ) {
2 26 Feb 07 jari 767     Integer I = ( Integer ) this.htNameIndex.get( hybName );
2 26 Feb 07 jari 768     return I.intValue();
2 26 Feb 07 jari 769   }//end lookupIndex()
2 26 Feb 07 jari 770   
2 26 Feb 07 jari 771   
2 26 Feb 07 jari 772   /**
2 26 Feb 07 jari 773    * 
2 26 Feb 07 jari 774    * @param iFold
2 26 Feb 07 jari 775    * @param hybSet
2 26 Feb 07 jari 776    * @return
2 26 Feb 07 jari 777    */
2 26 Feb 07 jari 778   private int validateFold( int iFold, USCHybSet hybSet ) {
2 26 Feb 07 jari 779     int toReturn = iFold;
2 26 Feb 07 jari 780     
2 26 Feb 07 jari 781     for( int i = 0; i < this.numClasses; i ++ ) {
2 26 Feb 07 jari 782       int hybKount = hybSet.getNumHybsInClass( i );
2 26 Feb 07 jari 783       if( hybKount < toReturn ) {
2 26 Feb 07 jari 784         toReturn = hybKount;
2 26 Feb 07 jari 785       }
2 26 Feb 07 jari 786     }
2 26 Feb 07 jari 787     
2 26 Feb 07 jari 788     return toReturn;
2 26 Feb 07 jari 789   }//end
2 26 Feb 07 jari 790   
2 26 Feb 07 jari 791   
2 26 Feb 07 jari 792   /**
2 26 Feb 07 jari 793    * Write the String s to File f
2 26 Feb 07 jari 794    * @param f
2 26 Feb 07 jari 795    * @param s
2 26 Feb 07 jari 796    */
2 26 Feb 07 jari 797   private void writeFile( File f, String s ) {
2 26 Feb 07 jari 798     try {
2 26 Feb 07 jari 799       FileWriter fw = new FileWriter( f );
2 26 Feb 07 jari 800       fw.write( s );
2 26 Feb 07 jari 801       fw.flush();
2 26 Feb 07 jari 802       fw.close();
2 26 Feb 07 jari 803     } catch (IOException e) {
2 26 Feb 07 jari 804       e.printStackTrace();
2 26 Feb 07 jari 805       this.error( e.getMessage() );
2 26 Feb 07 jari 806     }
2 26 Feb 07 jari 807   }//writeFile()
2 26 Feb 07 jari 808   
2 26 Feb 07 jari 809   
2 26 Feb 07 jari 810   private int findParamValue( Hashtable ht, String sKey ) {
2 26 Feb 07 jari 811     int toReturn = 0;
2 26 Feb 07 jari 812     
2 26 Feb 07 jari 813     JTextField field = ( JTextField ) ht.get( sKey );
2 26 Feb 07 jari 814     Integer I = new Integer( field.getText() );
2 26 Feb 07 jari 815     toReturn = I.intValue();
2 26 Feb 07 jari 816     
2 26 Feb 07 jari 817     return toReturn;
2 26 Feb 07 jari 818   }
2 26 Feb 07 jari 819   
2 26 Feb 07 jari 820   
2 26 Feb 07 jari 821   public void error( String message ) {
2 26 Feb 07 jari 822     JOptionPane.showMessageDialog( new JFrame(), message, "Input Error", JOptionPane.ERROR_MESSAGE );
2 26 Feb 07 jari 823   }
2 26 Feb 07 jari 824 }//end class
2 26 Feb 07 jari 825
2 26 Feb 07 jari 826 /*
2 26 Feb 07 jari 827
2 26 Feb 07 jari 828 private DefaultMutableTreeNode trainThenClassify( IData data, IFramework framework ) {
2 26 Feb 07 jari 829   //show dialog so user can assign labels
2 26 Feb 07 jari 830   USCAssignLabel assLabel = new USCAssignLabel( this.hybNames, this.userLabelArray );
2 26 Feb 07 jari 831   if( assLabel.showModal() == JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 832     //the labels entered by the user
2 26 Feb 07 jari 833     String[] userEnteredLabels = assLabel.getHybLabels();
2 26 Feb 07 jari 834     
2 26 Feb 07 jari 835     //gather up loaded data in the form of USCHybSet objects
2 26 Feb 07 jari 836     USCTrainFileLoader loader = new USCTrainFileLoader( data, userEnteredLabels );
2 26 Feb 07 jari 837     USCHybSet trainSet = loader.getTrainHybSet();
2 26 Feb 07 jari 838     USCHybSet testSet = loader.getTestHybSet();
2 26 Feb 07 jari 839     
2 26 Feb 07 jari 840     //should keep track of what hyb comes in what position
2 26 Feb 07 jari 841     this.htNameIndex = this.hashNameIndex( data );
2 26 Feb 07 jari 842     
2 26 Feb 07 jari 843     //similar to userEntered, but in order as determined by USCHybSet & USCTrainFileLoader
2 26 Feb 07 jari 844     this.uniqueClassArray = trainSet.getUniqueClasses();
2 26 Feb 07 jari 845     
2 26 Feb 07 jari 846     //make sure the #folds doesn't exceed minimum hybs/class
2 26 Feb 07 jari 847     this.fold = this.validateFold( this.fold, trainSet );
2 26 Feb 07 jari 848     trainSet.permute( this.fold );
2 26 Feb 07 jari 849     
2 26 Feb 07 jari 850     //ready to cross validate
2 26 Feb 07 jari 851     USCCrossValidation xVal = new USCCrossValidation( this.numBins, 
2 26 Feb 07 jari 852     this.delta, this.corrLo, this.corrHi, this.corrStep, this.fold, this.xValKount );
2 26 Feb 07 jari 853     this.xValResults = xVal.crossValidate( trainSet, framework.getFrame() );
2 26 Feb 07 jari 854     //this.xResult = xVal.crossValidate(trainSet,framework.getFrame());
2 26 Feb 07 jari 855     
2 26 Feb 07 jari 856     //let user determine which rho/delta from cross validation to use
2 26 Feb 07 jari 857     USCDeltaDialog deltaDialog;
2 26 Feb 07 jari 858     
2 26 Feb 07 jari 859     if( this.fold == 1 ) {
2 26 Feb 07 jari 860       deltaDialog = new USCDeltaDialog( this.xValResults, true );
2 26 Feb 07 jari 861     } else {
2 26 Feb 07 jari 862       deltaDialog = new USCDeltaDialog( this.xValResults, false );
2 26 Feb 07 jari 863     }
2 26 Feb 07 jari 864     if( deltaDialog.showModal() == JOptionPane.OK_OPTION ) {
2 26 Feb 07 jari 865       USCRow row = deltaDialog.getSelectedRow();
2 26 Feb 07 jari 866       double fDelta = row.getFDelta();
2 26 Feb 07 jari 867       double fRho = row.getFRho();
2 26 Feb 07 jari 868       int iRho = ( int ) ( fRho * 10 );
2 26 Feb 07 jari 869       //System.out.println("iRho = " + iRho );
2 26 Feb 07 jari 870       
2 26 Feb 07 jari 871       //need a progres bar and dialog
2 26 Feb 07 jari 872       JFrame jf = new JFrame();
2 26 Feb 07 jari 873       JPanel panel = new JPanel();
2 26 Feb 07 jari 874       JProgressBar bar = new JProgressBar( 0, trainSet.getNumGenes() );
2 26 Feb 07 jari 875       panel.add( bar );
2 26 Feb 07 jari 876       jf.getContentPane().add( panel );
2 26 Feb 07 jari 877       jf.setSize( 150, 200 );
2 26 Feb 07 jari 878       jf.show();
2 26 Feb 07 jari 879       Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 880       jf.setLocation((screenSize.width - 200)/2, (screenSize.height - 100)/2);
2 26 Feb 07 jari 881       
2 26 Feb 07 jari 882       //test the test set against the training set using user selected delta and rho
2 26 Feb 07 jari 883       USCHyb[] trainArray = trainSet.getHybs();
2 26 Feb 07 jari 884       USCHyb[] testArray = testSet.getHybs();
2 26 Feb 07 jari 885       this.finalResult = xVal.testTest( trainArray, testArray, fDelta, 
2 26 Feb 07 jari 886       fRho, trainSet.getNumGenes(), trainSet.getNumClasses(), 
2 26 Feb 07 jari 887       uniqueClassArray, bar, iRho );
2 26 Feb 07 jari 888       
2 26 Feb 07 jari 889       jf.dispose();
2 26 Feb 07 jari 890     
2 26 Feb 07 jari 891       //USCOrder[] has relevant gene info
2 26 Feb 07 jari 892       USCOrder[] order = this.finalResult.getOrder();
2 26 Feb 07 jari 893     
2 26 Feb 07 jari 894       //have all requisite info to save the training to a file if desired
2 26 Feb 07 jari 895       if( deltaDialog.saveTraining() ) {
2 26 Feb 07 jari 896         this.saveTraining( trainSet.getHybs(), row, order, data, 
2 26 Feb 07 jari 897         framework.getFrame(), trainSet.getGeneList() );
2 26 Feb 07 jari 898       }
2 26 Feb 07 jari 899       
2 26 Feb 07 jari 900       //create a new Experiment to represent this analysis (subset of genes used)
2 26 Feb 07 jari 901       Experiment newExp = this.createNewExperiment( data.getExperiment(), 
2 26 Feb 07 jari 902       this.finalResult.getNumGenesUsed(), order );
2 26 Feb 07 jari 903       
2 26 Feb 07 jari 904       DefaultMutableTreeNode returnNode = new DefaultMutableTreeNode( "USC" );
2 26 Feb 07 jari 905       
2 26 Feb 07 jari 906       String[] testHybNames = new String[ testArray.length ];
2 26 Feb 07 jari 907       for( int h = 0; h < testArray.length; h ++ ) {
2 26 Feb 07 jari 908         testHybNames[ h ] = testArray[ h ].getHybName();
2 26 Feb 07 jari 909       }
2 26 Feb 07 jari 910       
2 26 Feb 07 jari 911       //add the summary
2 26 Feb 07 jari 912       USCSummaryViewer summaryViewer = new USCSummaryViewer( 
2 26 Feb 07 jari 913       testHybNames, this.finalResult, this.uniqueClassArray, this.params,
2 26 Feb 07 jari 914       this.getGeneNames( data, finalResult ), framework );
2 26 Feb 07 jari 915       LeafInfo summaryLeaf = new LeafInfo( "Summary", summaryViewer );
2 26 Feb 07 jari 916       returnNode.add( new DefaultMutableTreeNode( summaryLeaf ) );
2 26 Feb 07 jari 917       
2 26 Feb 07 jari 918       //add a node to display all the hybs and the genes used for analysis
2 26 Feb 07 jari 919       returnNode.add( new DefaultMutableTreeNode( 
2 26 Feb 07 jari 920       this.createFullCluster( data, newExp, finalResult ) ) );
2 26 Feb 07 jari 921       
2 26 Feb 07 jari 922       //add the class results
2 26 Feb 07 jari 923       for( int c = 0; c < this.numClasses; c ++ ) {
2 26 Feb 07 jari 924         LeafInfo li = this.createClassCluster( c, newExp, finalResult, trainSet, testSet );
2 26 Feb 07 jari 925         returnNode.add( new DefaultMutableTreeNode( li ) );
2 26 Feb 07 jari 926       }
2 26 Feb 07 jari 927       
2 26 Feb 07 jari 928       return returnNode;
2 26 Feb 07 jari 929     } else {
2 26 Feb 07 jari 930       //System.out.println( "Cancelled out of Delta dialog" );
2 26 Feb 07 jari 931       return null;
2 26 Feb 07 jari 932     }
2 26 Feb 07 jari 933   } else {
2 26 Feb 07 jari 934     //System.out.println( "Cancelled out of AssignLabel dialog" );
2 26 Feb 07 jari 935     return null;
2 26 Feb 07 jari 936   }
2 26 Feb 07 jari 937 }//trainThenClassify()
2 26 Feb 07 jari 938 */