mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/tease/EASEAnalysis.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2003, 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: EASEAnalysis.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.2 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:46 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13 package org.tigr.microarray.mev.cluster.algorithm.impl.tease;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import java.io.BufferedReader;
2 26 Feb 07 jari 16 import java.io.File;
2 26 Feb 07 jari 17 import java.io.FileNotFoundException;
2 26 Feb 07 jari 18 import java.io.FileReader;
2 26 Feb 07 jari 19 import java.io.IOException;
2 26 Feb 07 jari 20 import java.text.DecimalFormat;
2 26 Feb 07 jari 21 import java.util.Hashtable;
2 26 Feb 07 jari 22 import java.util.Random;
2 26 Feb 07 jari 23 import java.util.StringTokenizer;
2 26 Feb 07 jari 24 import java.util.Vector;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import javax.swing.JFrame;
2 26 Feb 07 jari 27 import javax.swing.JOptionPane;
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.impl.ease.EaseElementList;
2 26 Feb 07 jari 35 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 36 import org.tigr.util.QSort;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 /** 
2 26 Feb 07 jari 39  * Manages EASE analysis and raw result manipulation and return.
2 26 Feb 07 jari 40  * @author braisted
2 26 Feb 07 jari 41  */
2 26 Feb 07 jari 42 public class EASEAnalysis{
2 26 Feb 07 jari 43     
2 26 Feb 07 jari 44     private TEASEBench bench;            //a reference to TEASEBench
2 26 Feb 07 jari 45     private AbstractAlgorithm algorithm; //data to be processed
2 26 Feb 07 jari 46     private AlgorithmEvent event; 
2 26 Feb 07 jari 47     private AlgorithmParameters params;  //parameters of algorithmdata
2 26 Feb 07 jari 48     private DecimalFormat format;
2 26 Feb 07 jari 49     private FloatMatrix expData;         //expression data
2 26 Feb 07 jari 50     
2 26 Feb 07 jari 51     private Vector sampleVector;         //selected sample genes
2 26 Feb 07 jari 52     private Vector populationVector;     //population genes
2 26 Feb 07 jari 53     private Vector headerNames;          //for printing result, different for slide and cluster annotation
2 26 Feb 07 jari 54     
2 26 Feb 07 jari 55     private String [] annotationFileList;  //list of annotation files imported
2 26 Feb 07 jari 56     private String [][] result;            //2D array display result
2 26 Feb 07 jari 57     private String [][] hitList;           //row: category, column: locus id
2 26 Feb 07 jari 58     private String [] categoryNames;       //list of categories that receive at least one hit
2 26 Feb 07 jari 59
2 26 Feb 07 jari 60     private String converterFileName;    //null if no converter file is selected
2 26 Feb 07 jari 61     private boolean haveAccessionNumbers;  //True if accession numbers are appended.
2 26 Feb 07 jari 62     private boolean reportEaseScore;    //true if ease score is selected, false, fisher exact score
2 26 Feb 07 jari 63     private boolean stop;                //abort
2 26 Feb 07 jari 64     private boolean performClusterAnalysis;  //false if slide annotation survey
2 26 Feb 07 jari 65     
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     /** 
2 26 Feb 07 jari 68      * Constructor, creates a new instance of ease (Default)
2 26 Feb 07 jari 69      */
2 26 Feb 07 jari 70     public EASEAnalysis() {
2 26 Feb 07 jari 71       this.stop = false;
2 26 Feb 07 jari 72       this.reportEaseScore = false;
2 26 Feb 07 jari 73       this.haveAccessionNumbers = false;
2 26 Feb 07 jari 74     }
2 26 Feb 07 jari 75     
2 26 Feb 07 jari 76     public void abort() {
2 26 Feb 07 jari 77         this.stop = true;
2 26 Feb 07 jari 78     }
2 26 Feb 07 jari 79     
2 26 Feb 07 jari 80     /** 
2 26 Feb 07 jari 81      * Recieves parameters, executes algorithm and returns the result in the <CODE>AlgorithmData</CODE> object.
2 26 Feb 07 jari 82      * @param algorithmData Intput data and parameters
2 26 Feb 07 jari 83      * @throws AlgorithmException Reports errors or abort requests
2 26 Feb 07 jari 84      * @return Returns result in <CODE>AlgorithmData</CODE>
2 26 Feb 07 jari 85      */
2 26 Feb 07 jari 86     public AlgorithmData runEASEAnalysis(AlgorithmData algorithmData) throws AlgorithmException {
2 26 Feb 07 jari 87  //       System.out.println("EASEAnalysis 84, expData is null?  " + (expData == null));
2 26 Feb 07 jari 88 //        for (int i = 0; i < expData.getRowDimension(); i++) {     //***********************************
2 26 Feb 07 jari 89 //          for (int j = 0; j < expData.getColumnDimension(); j++)
2 26 Feb 07 jari 90 //            System.out.print(expData.get(i, j)+" ");
2 26 Feb 07 jari 91 //          System.out.println();
2 26 Feb 07 jari 92 //        }
2 26 Feb 07 jari 93
2 26 Feb 07 jari 94         if(this.performClusterAnalysis)
2 26 Feb 07 jari 95             return performClusterAnnotationAnalysis(algorithmData);
2 26 Feb 07 jari 96         else{
2 26 Feb 07 jari 97             return performSlideAnnotationSurvey(algorithmData);
2 26 Feb 07 jari 98         }
2 26 Feb 07 jari 99     }
2 26 Feb 07 jari 100     
2 26 Feb 07 jari 101     /**
2 26 Feb 07 jari 102      * Reset variables at each run
2 26 Feb 07 jari 103      */
2 26 Feb 07 jari 104     private void createAndInitialize() {
2 26 Feb 07 jari 105         this.headerNames = new Vector();
2 26 Feb 07 jari 106         this.format = new DecimalFormat("0.###E00");
2 26 Feb 07 jari 107         intializeHeaderNames();
2 26 Feb 07 jari 108     }
2 26 Feb 07 jari 109     
2 26 Feb 07 jari 110     /** 
2 26 Feb 07 jari 111      * Main method for cluster analysis. cluster analysis compare selected 
2 26 Feb 07 jari 112      * sample gene list to a population list which can either be an user
2 26 Feb 07 jari 113      * indicated external file or the whole gene list present if no file is 
2 26 Feb 07 jari 114      * selected. Store result in result matrix.
2 26 Feb 07 jari 115      * @param algorithmData Input data and parameters.
2 26 Feb 07 jari 116      * @throws AlgorithmException
2 26 Feb 07 jari 117      * @return algorithmData 
2 26 Feb 07 jari 118      */
2 26 Feb 07 jari 119     private AlgorithmData performClusterAnnotationAnalysis(AlgorithmData algorithmData) throws AlgorithmException {
2 26 Feb 07 jari 120         createAndInitialize();
2 26 Feb 07 jari 121
2 26 Feb 07 jari 122         int [] clusterIndices = algorithmData.getIntArray("sample-indices");
2 26 Feb 07 jari 123         String [] sampleList = algorithmData.getStringArray("sample-list");
2 26 Feb 07 jari 124         EaseElementList sampleElementList = new EaseElementList(clusterIndices, sampleList);   
2 26 Feb 07 jari 125 //        System.out.println("clusterIndices null?" + (clusterIndices == null)); //***************************************
2 26 Feb 07 jari 126 //        System.out.println("sampleList null?" + (sampleList == null));      
2 26 Feb 07 jari 127         
2 26 Feb 07 jari 128         try{
2 26 Feb 07 jari 129             if(this.converterFileName != null){          //if a convert table is used
2 26 Feb 07 jari 130                 sampleElementList.loadValues(converterFileName);
2 26 Feb 07 jari 131             } else {                                //no convert table is selected
2 26 Feb 07 jari 132                 sampleElementList.setDefaultValues();    
2 26 Feb 07 jari 133             }
2 26 Feb 07 jari 134         } catch (FileNotFoundException fnfe) {
2 26 Feb 07 jari 135             throw new AlgorithmException("Annotation Conversion File Not Found\n"+converterFileName+"\n"+fnfe.getMessage());
2 26 Feb 07 jari 136         } catch (IOException ioe) {
2 26 Feb 07 jari 137             throw new AlgorithmException("Error Reading File: "+converterFileName+"\n"+ioe.getMessage());
2 26 Feb 07 jari 138         }
2 26 Feb 07 jari 139         
2 26 Feb 07 jari 140         this.sampleVector = sampleElementList.getUniqueValueList();
2 26 Feb 07 jari 141
2 26 Feb 07 jari 142         
2 26 Feb 07 jari 143         //alter to take the keys as args
2 26 Feb 07 jari 144         this.bench.GetListHitsByCategory(this.sampleVector);
2 26 Feb 07 jari 145         
2 26 Feb 07 jari 146 //        Iterator it = populationVector.iterator();
2 26 Feb 07 jari 147 //        while(it.hasNext())
2 26 Feb 07 jari 148 //          System.out.print(it.next()+ "  ");
2 26 Feb 07 jari 149
2 26 Feb 07 jari 150         this.bench.ConstructResults();     
2 26 Feb 07 jari 151         this.result = this.bench.getResults();
2 26 Feb 07 jari 152  
2 26 Feb 07 jari 153 //    for (int i = 0; i < 10; i ++) {
2 26 Feb 07 jari 154 //      for (int j = 0; j < result[i].length; j++)
2 26 Feb 07 jari 155 //        System.out.print(result[i][j]+ " ");
2 26 Feb 07 jari 156 //      System.out.println();
2 26 Feb 07 jari 157 //    }
2 26 Feb 07 jari 158         
2 26 Feb 07 jari 159         //if the result set is empty, return.
2 26 Feb 07 jari 160         if(this.result.length < 1) {
2 26 Feb 07 jari 161             return algorithmData;
2 26 Feb 07 jari 162         }
2 26 Feb 07 jari 163
2 26 Feb 07 jari 164         this.hitList = this.bench.getListHitMatrix();
2 26 Feb 07 jari 165         this.categoryNames = this.bench.getCategoryNames();    
2 26 Feb 07 jari 166         sortResults();
2 26 Feb 07 jari 167         
2 26 Feb 07 jari 168         if(algorithmData.getParams().getBoolean("p-value-corrections", false)){
2 26 Feb 07 jari 169             pValueCorrections(algorithmData);
2 26 Feb 07 jari 170         }
2 26 Feb 07 jari 171         
2 26 Feb 07 jari 172         if(algorithmData.getParams().getBoolean("run-permutation-analysis", false)){
2 26 Feb 07 jari 173             permutationAnalysis(algorithmData.getParams().getInt("permutation-count", 1));
2 26 Feb 07 jari 174             System.out.println("EASEAnalysis 192 permutation run");
2 26 Feb 07 jari 175         }
2 26 Feb 07 jari 176
2 26 Feb 07 jari 177         this.result = appendAccessions(result, annotationFileList);
2 26 Feb 07 jari 178         algorithmData.addParam("have-accession-numbers", String.valueOf(haveAccessionNumbers));
2 26 Feb 07 jari 179         
2 26 Feb 07 jari 180         //apply trim options
2 26 Feb 07 jari 181         String trimOption = params.getString("trim-option");
2 26 Feb 07 jari 182         float trimValue;
2 26 Feb 07 jari 183         if(!(trimOption.equals("NO_TRIM"))){
2 26 Feb 07 jari 184             trimValue = params.getFloat("trim-value");
2 26 Feb 07 jari 185             trimResult(trimOption, trimValue);
2 26 Feb 07 jari 186         }
2 26 Feb 07 jari 187         
2 26 Feb 07 jari 188         indexResult();
2 26 Feb 07 jari 189         
2 26 Feb 07 jari 190         algorithmData.addObjectMatrix("result-matrix", result);
2 26 Feb 07 jari 191         algorithmData.addObjectMatrix("hit-list-matrix", hitList);
2 26 Feb 07 jari 192         //System.out.println("EASEAnalysis 212, hit List is null?  " + (hitList[0]==null));
2 26 Feb 07 jari 193         //get sorted clusters
2 26 Feb 07 jari 194         int [][] clusters = getClusters(sampleElementList, hitList);
2 26 Feb 07 jari 195         
2 26 Feb 07 jari 196         algorithmData.addStringArray("category-names", categoryNames);
2 26 Feb 07 jari 197         algorithmData.addIntMatrix("cluster-matrix", clusters);
2 26 Feb 07 jari 198         
2 26 Feb 07 jari 199         algorithmData.addStringArray("header-names", getHeaderNames());
2 26 Feb 07 jari 200         
2 26 Feb 07 jari 201         FloatMatrix means = getMeans(expData, clusters);
2 26 Feb 07 jari 202         algorithmData.addMatrix("means", means);
2 26 Feb 07 jari 203         algorithmData.addMatrix("variances", getVariances(expData, means, clusters));
2 26 Feb 07 jari 204
2 26 Feb 07 jari 205         //System.out.println("Duration: "+(System.currentTimeMillis()-start));          
2 26 Feb 07 jari 206         return algorithmData;
2 26 Feb 07 jari 207     }
2 26 Feb 07 jari 208     
2 26 Feb 07 jari 209     /** Alternative analysis mode (slide survey)
2 26 Feb 07 jari 210      * @param algorithmData
2 26 Feb 07 jari 211      * @throws AlgorithmException
2 26 Feb 07 jari 212      * @return  
2 26 Feb 07 jari 213      * */
2 26 Feb 07 jari 214     private AlgorithmData performSlideAnnotationSurvey(AlgorithmData algorithmData) throws AlgorithmException {
2 26 Feb 07 jari 215       createAndInitialize();
2 26 Feb 07 jari 216         
2 26 Feb 07 jari 217         String [] sampleList = algorithmData.getStringArray("sample-list");  //list of indicated annotation key of the samples
2 26 Feb 07 jari 218         EaseElementList sampleElementList = new EaseElementList(sampleList); //put the popluationList into an EaseElementList that 
2 26 Feb 07 jari 219
2 26 Feb 07 jari 220 //        System.out.println("EASEAnalysis 252 sampleList");  //***************************************************
2 26 Feb 07 jari 221 //        for (int i = 0; i < sampleList.length; i++)
2 26 Feb 07 jari 222 //          System.out.println(sampleList[i]);
2 26 Feb 07 jari 223 //        System.out.println();
2 26 Feb 07 jari 224 //        
2 26 Feb 07 jari 225 //        System.out.println("annotationList");
2 26 Feb 07 jari 226 //        for (int i = 0; i < annotationFileList.length; i++)
2 26 Feb 07 jari 227 //          System.out.println(annotationFileList[i]);
2 26 Feb 07 jari 228         
2 26 Feb 07 jari 229         try{
2 26 Feb 07 jari 230             if(converterFileName != null){
2 26 Feb 07 jari 231                 sampleElementList.loadValues(converterFileName);
2 26 Feb 07 jari 232             } else {
2 26 Feb 07 jari 233                 sampleElementList.setDefaultValues();
2 26 Feb 07 jari 234             }
2 26 Feb 07 jari 235         } catch (FileNotFoundException fnfe) {
2 26 Feb 07 jari 236             throw new AlgorithmException("Annotation Conversion File Not Found\n"+converterFileName+"\n"+fnfe.getMessage());
2 26 Feb 07 jari 237         } catch (IOException ioe) {
2 26 Feb 07 jari 238             throw new AlgorithmException("Error Reading File: "+converterFileName+"\n"+ioe.getMessage());
2 26 Feb 07 jari 239         }
2 26 Feb 07 jari 240         
2 26 Feb 07 jari 241         //sampleVector is a replicate of popluationElementList with any duplicate genes removed
2 26 Feb 07 jari 242         this.sampleVector = sampleElementList.getUniqueValueList();
2 26 Feb 07 jari 243         
2 26 Feb 07 jari 244 //        System.out.println("EASEAnalysis 281");
2 26 Feb 07 jari 245 //        Iterator it = sampleVector.iterator();
2 26 Feb 07 jari 246 //        while(it.hasNext())
2 26 Feb 07 jari 247 //          System.out.print(it.next()+" ");
2 26 Feb 07 jari 248
2 26 Feb 07 jari 249         this.bench.GetPopulationHitsByCategoryForSurvey(sampleVector);
2 26 Feb 07 jari 250         this.bench.ConstructSurveyResults();
2 26 Feb 07 jari 251         result = this.bench.getSurveyResults();  //resut[][] = records[][]
2 26 Feb 07 jari 252
2 26 Feb 07 jari 253         //if the result set is empty, return.
2 26 Feb 07 jari 254         if(result.length < 1)  //no hits
2 26 Feb 07 jari 255             return algorithmData;
2 26 Feb 07 jari 256         
2 26 Feb 07 jari 257         hitList = this.bench.getListHitMatrix();
2 26 Feb 07 jari 258         categoryNames = this.bench.getCategoryNames();
2 26 Feb 07 jari 259         
2 26 Feb 07 jari 260         sortSurveyResults();   //rank by number of hit count
2 26 Feb 07 jari 261         result = appendAccessions(result, annotationFileList);
2 26 Feb 07 jari 262         algorithmData.addParam("have-accession-numbers", String.valueOf(haveAccessionNumbers));
2 26 Feb 07 jari 263         algorithmData.addStringArray("header-names", getHeaderNames());
2 26 Feb 07 jari 264       
2 26 Feb 07 jari 265
2 26 Feb 07 jari 266         //apply trim options
2 26 Feb 07 jari 267         String trimOption = params.getString("trim-option");
2 26 Feb 07 jari 268         float trimValue;
2 26 Feb 07 jari 269         if(!(trimOption.equals("NO_TRIM"))){
2 26 Feb 07 jari 270             event.setDescription("Trim Result\n");
2 26 Feb 07 jari 271             this.algorithm.fireValueChanged(event);
2 26 Feb 07 jari 272             trimValue = params.getFloat("trim-value");
2 26 Feb 07 jari 273             trimResult(trimOption, trimValue);
2 26 Feb 07 jari 274         }
2 26 Feb 07 jari 275         
2 26 Feb 07 jari 276         indexResult();
2 26 Feb 07 jari 277
2 26 Feb 07 jari 278         algorithmData.addObjectMatrix("result-matrix", result);
2 26 Feb 07 jari 279         algorithmData.addObjectMatrix("hit-list-matrix", hitList);
2 26 Feb 07 jari 280         
2 26 Feb 07 jari 281 //    System.out.println();
2 26 Feb 07 jari 282 //        for (int i = 0; i < 10; i ++) {
2 26 Feb 07 jari 283 //      for (int j = 0; j < result[i].length; j++)
2 26 Feb 07 jari 284 //        System.out.print(result[i][j]+ " ");
2 26 Feb 07 jari 285 //      System.out.println();
2 26 Feb 07 jari 286 //    }
2 26 Feb 07 jari 287         
2 26 Feb 07 jari 288         //get sorted clusters
2 26 Feb 07 jari 289         int [][] clusters = getClusters(sampleElementList, hitList);
2 26 Feb 07 jari 290         
2 26 Feb 07 jari 291         algorithmData.addStringArray("category-names", categoryNames);
2 26 Feb 07 jari 292         algorithmData.addIntMatrix("cluster-matrix", clusters);
2 26 Feb 07 jari 293         
2 26 Feb 07 jari 294  //       FloatMatrix means = getMeans(expData, clusters);
2 26 Feb 07 jari 295 //        algorithmData.addMatrix("means", means);
2 26 Feb 07 jari 296 //        algorithmData.addMatrix("variances", getVariances(expData, means, clusters));
2 26 Feb 07 jari 297         
2 26 Feb 07 jari 298         return algorithmData;
2 26 Feb 07 jari 299     }
2 26 Feb 07 jari 300     
2 26 Feb 07 jari 301     /**
2 26 Feb 07 jari 302      * Read in the annotation file and store it in TEASEBench.
2 26 Feb 07 jari 303      * different for cluster and slide analysis
2 26 Feb 07 jari 304      * @param data
2 26 Feb 07 jari 305      */
2 26 Feb 07 jari 306     public void setCategories(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 307       //retrieve all information
2 26 Feb 07 jari 308         this.params = data.getParams();
2 26 Feb 07 jari 309         this.expData = data.getMatrix("experiment");
2 26 Feb 07 jari 310       this.converterFileName = this.params.getString("converter-file-name");
2 26 Feb 07 jari 311         this.reportEaseScore = this.params.getBoolean("report-ease-score", false);
2 26 Feb 07 jari 312          this.performClusterAnalysis = this.params.getBoolean("perform-cluster-analysis", true);
2 26 Feb 07 jari 313         this.bench = new TEASEBench(this.reportEaseScore);
2 26 Feb 07 jari 314         
2 26 Feb 07 jari 315       //Gene annotation files path selected by users
2 26 Feb 07 jari 316         this.annotationFileList = data.getStringArray("annotation-file-list");  
2 26 Feb 07 jari 317    
2 26 Feb 07 jari 318         for(int i = 0; i < annotationFileList.length; i++){
2 26 Feb 07 jari 319             this.bench.AddAnnotationFileName(annotationFileList[i]);   //store annotatiln file names in TEASEBench
2 26 Feb 07 jari 320         }
2 26 Feb 07 jari 321
2 26 Feb 07 jari 322         if(this.performClusterAnalysis) {            //if cluster analysis
2 26 Feb 07 jari 323             //extract population-list
2 26 Feb 07 jari 324             //the whole gene list if no external file is selected
2 26 Feb 07 jari 325             String [] populationList = data.getStringArray("population-list");   
2 26 Feb 07 jari 326             EaseElementList populationElementList = new EaseElementList(populationList); 
2 26 Feb 07 jari 327             try {
2 26 Feb 07 jari 328                  if (this.converterFileName != null) {    //if a conversion file is selected
2 26 Feb 07 jari 329                    populationElementList.loadValues(converterFileName);    //convert gene annotations
2 26 Feb 07 jari 330                 }
2 26 Feb 07 jari 331                 else {
2 26 Feb 07 jari 332                   populationElementList.setDefaultValues();   //defalut values => original gene annotation
2 26 Feb 07 jari 333                 }
2 26 Feb 07 jari 334                 this.populationVector = populationElementList.getUniqueValueList();   //remove any duplicate
2 26 Feb 07 jari 335                 this.bench.GetCategories(this.populationVector);      //read and store categories that have at least 
2 26 Feb 07 jari 336                 this.bench.GetPopulationHitsByCategory(this.populationVector);
2 26 Feb 07 jari 337             }catch (FileNotFoundException fnfe) {                     //one hit in population list
2 26 Feb 07 jari 338               throw new AlgorithmException("Annotation Conversion File Not Found\n"+converterFileName+"\n"+fnfe.getMessage());
2 26 Feb 07 jari 339             }catch (IOException ioe) {
2 26 Feb 07 jari 340                 throw new AlgorithmException("Error Reading File: "+converterFileName+"\n"+ioe.getMessage());
2 26 Feb 07 jari 341             }
2 26 Feb 07 jari 342         }
2 26 Feb 07 jari 343         else{   //slide survey
2 26 Feb 07 jari 344           this.bench.GetCategories();     //read and store all categories from the file(s)
2 26 Feb 07 jari 345         }
2 26 Feb 07 jari 346         
2 26 Feb 07 jari 347     }
2 26 Feb 07 jari 348     
2 26 Feb 07 jari 349     /** 
2 26 Feb 07 jari 350      * Creates header names based on analysis mode.
2 26 Feb 07 jari 351      */
2 26 Feb 07 jari 352     private void intializeHeaderNames(){
2 26 Feb 07 jari 353         headerNames.add("Index");
2 26 Feb 07 jari 354         headerNames.add("File");
2 26 Feb 07 jari 355         headerNames.add("Term");
2 26 Feb 07 jari 356       if(performClusterAnalysis){
2 26 Feb 07 jari 357             headerNames.add("List Hits");
2 26 Feb 07 jari 358             headerNames.add("List Size");
2 26 Feb 07 jari 359             headerNames.add("Pop. Hits");
2 26 Feb 07 jari 360             headerNames.add("Pop. Size");
2 26 Feb 07 jari 361             if(reportEaseScore)
2 26 Feb 07 jari 362                 headerNames.add("EASE Score");
2 26 Feb 07 jari 363             else
2 26 Feb 07 jari 364                 headerNames.add("Fisher's Exact");
2 26 Feb 07 jari 365         } else {
2 26 Feb 07 jari 366             headerNames.add("Pop. Hits");
2 26 Feb 07 jari 367             headerNames.add("Pop. Size");
2 26 Feb 07 jari 368         }
2 26 Feb 07 jari 369     }
2 26 Feb 07 jari 370     
2 26 Feb 07 jari 371     /** Returns cluster indices
2 26 Feb 07 jari 372      * @param clusterList list of cluster indices
2 26 Feb 07 jari 373      * @param hitList List of acc. in each category
2 26 Feb 07 jari 374      * @return clusters
2 26 Feb 07 jari 375      */
2 26 Feb 07 jari 376     private int [][] getClusters(EaseElementList clusterList, String [][] hitList){
2 26 Feb 07 jari 377         int [][] clusters = new int[hitList.length][];
2 26 Feb 07 jari 378         for(int i = 0; i < hitList.length; i++){
2 26 Feb 07 jari 379             clusters[i] = clusterList.getIndices(hitList[i]);
2 26 Feb 07 jari 380         }
2 26 Feb 07 jari 381         return clusters;
2 26 Feb 07 jari 382     }
2 26 Feb 07 jari 383     
2 26 Feb 07 jari 384     
2 26 Feb 07 jari 385     /** 
2 26 Feb 07 jari 386      * Sorts analysis results on stat.
2 26 Feb 07 jari 387      */
2 26 Feb 07 jari 388     private void sortResults(){
2 26 Feb 07 jari 389         double [] stat = new double[result.length];
2 26 Feb 07 jari 390         int pValueIndex;
2 26 Feb 07 jari 391         if(reportEaseScore)
2 26 Feb 07 jari 392             pValueIndex =  headerNames.indexOf("EASE Score");
2 26 Feb 07 jari 393         else
2 26 Feb 07 jari 394             pValueIndex =  headerNames.indexOf("Fisher's Exact");
2 26 Feb 07 jari 395         
2 26 Feb 07 jari 396         pValueIndex--;  //subtract one since result is not indexed until after sort
2 26 Feb 07 jari 397         
2 26 Feb 07 jari 398         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 399             stat[i] = Double.parseDouble(result[i][pValueIndex]);
2 26 Feb 07 jari 400         }
2 26 Feb 07 jari 401         QSort qsorter = new QSort(stat);
2 26 Feb 07 jari 402         stat = qsorter.getSortedDouble();
2 26 Feb 07 jari 403         
2 26 Feb 07 jari 404         int [] orderedIndices = qsorter.getOrigIndx();
2 26 Feb 07 jari 405         
2 26 Feb 07 jari 406         String [] holder;
2 26 Feb 07 jari 407         String nameHolder;
2 26 Feb 07 jari 408         
2 26 Feb 07 jari 409         String [] newCatNames = new String[categoryNames.length];
2 26 Feb 07 jari 410         String [][] newHitList = new String[hitList.length][];
2 26 Feb 07 jari 411         String [][] newResult = new String[result.length][];
2 26 Feb 07 jari 412         
2 26 Feb 07 jari 413         for(int i = 0; i < orderedIndices.length; i++){
2 26 Feb 07 jari 414             newCatNames[i] = categoryNames[orderedIndices[i]];
2 26 Feb 07 jari 415             newHitList[i] = hitList[orderedIndices[i]];
2 26 Feb 07 jari 416             newResult[i] = result[orderedIndices[i]];
2 26 Feb 07 jari 417         }
2 26 Feb 07 jari 418         
2 26 Feb 07 jari 419         //format the pvalues
2 26 Feb 07 jari 420         for(int i = 0; i < newResult.length; i++)
2 26 Feb 07 jari 421             newResult[i][pValueIndex] = format.format(Double.parseDouble(newResult[i][pValueIndex]));
2 26 Feb 07 jari 422         
2 26 Feb 07 jari 423         categoryNames = newCatNames;
2 26 Feb 07 jari 424         hitList = newHitList;
2 26 Feb 07 jari 425         result = newResult;
2 26 Feb 07 jari 426     }
2 26 Feb 07 jari 427     
2 26 Feb 07 jari 428     
2 26 Feb 07 jari 429     /** 
2 26 Feb 07 jari 430      * Sorts survey analysis results on population hits (high --> low)
2 26 Feb 07 jari 431      */
2 26 Feb 07 jari 432     private void sortSurveyResults(){
2 26 Feb 07 jari 433         double [] hitCounts = new double[result.length];
2 26 Feb 07 jari 434         int hitIndex = this.headerNames.indexOf("Pop. Hits");
2 26 Feb 07 jari 435         hitIndex--; //decrement since no indexes inserted yet.
2 26 Feb 07 jari 436         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 437             hitCounts[i] = Double.parseDouble(result[i][hitIndex]);
2 26 Feb 07 jari 438         }
2 26 Feb 07 jari 439         QSort qsorter = new QSort(hitCounts);
2 26 Feb 07 jari 440         hitCounts = qsorter.getSortedDouble();
2 26 Feb 07 jari 441         
2 26 Feb 07 jari 442         int [] orderedIndices = qsorter.getOrigIndx();
2 26 Feb 07 jari 443         
2 26 Feb 07 jari 444         String [] holder;
2 26 Feb 07 jari 445         String nameHolder;
2 26 Feb 07 jari 446         
2 26 Feb 07 jari 447         String [] newCatNames = new String[categoryNames.length];
2 26 Feb 07 jari 448         String [][] newHitList = new String[hitList.length][];
2 26 Feb 07 jari 449         String [][] newResult = new String[result.length][];
2 26 Feb 07 jari 450         
2 26 Feb 07 jari 451 //        System.out.println("\nEASEAnalysis 508");
2 26 Feb 07 jari 452 //        System.out.println("categoryNames size = "+categoryNames.length);
2 26 Feb 07 jari 453 //        System.out.println("orderedIndices size = "+orderedIndices.length);
2 26 Feb 07 jari 454         //order high to low
2 26 Feb 07 jari 455         int index = 0;
2 26 Feb 07 jari 456         for(int i = orderedIndices.length-1; i >= 0; i--){
2 26 Feb 07 jari 457             newCatNames[index] = categoryNames[orderedIndices[i]];
2 26 Feb 07 jari 458             newHitList[index] = hitList[orderedIndices[i]];
2 26 Feb 07 jari 459             newResult[index] = result[orderedIndices[i]];
2 26 Feb 07 jari 460             index++;
2 26 Feb 07 jari 461         }
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         categoryNames = newCatNames;
2 26 Feb 07 jari 464         hitList = newHitList;
2 26 Feb 07 jari 465         result = newResult;
2 26 Feb 07 jari 466     }
2 26 Feb 07 jari 467     
2 26 Feb 07 jari 468     
2 26 Feb 07 jari 469     /** Appends accessions
2 26 Feb 07 jari 470      * @param resultMatrix Result matrix input.
2 26 Feb 07 jari 471      * @param fileNames File names.
2 26 Feb 07 jari 472      * @return
2 26 Feb 07 jari 473      */
2 26 Feb 07 jari 474     private String [][] appendAccessions(String [][] resultMatrix, String [] fileNames){
2 26 Feb 07 jari 475         
2 26 Feb 07 jari 476         if(resultMatrix == null || resultMatrix.length < 1)
2 26 Feb 07 jari 477             return resultMatrix;
2 26 Feb 07 jari 478         
2 26 Feb 07 jari 479         String [][] newResult = null;
2 26 Feb 07 jari 480         File file = null;
2 26 Feb 07 jari 481         haveAccessionNumbers = false;
2 26 Feb 07 jari 482         try{
2 26 Feb 07 jari 483             for(int i = 0; i < fileNames.length; i++){
2 26 Feb 07 jari 484                 file = getAccessionFile(fileNames[i]);
2 26 Feb 07 jari 485                 
2 26 Feb 07 jari 486                 if(file.isFile()){
2 26 Feb 07 jari 487                     if(!haveAccessionNumbers){
2 26 Feb 07 jari 488                         newResult = new String[resultMatrix.length][resultMatrix[0].length+1];
2 26 Feb 07 jari 489                         initializeNewResult(newResult, resultMatrix);
2 26 Feb 07 jari 490                         headerNames.insertElementAt("Acc.", 2);  //add header name
2 26 Feb 07 jari 491                     }
2 26 Feb 07 jari 492                     insertAccessions(file, newResult);
2 26 Feb 07 jari 493                     haveAccessionNumbers = true;
2 26 Feb 07 jari 494                     resultMatrix = newResult;  // added to handle multiple files
2 26 Feb 07 jari 495                 }
2 26 Feb 07 jari 496             }
2 26 Feb 07 jari 497         }  catch (IOException ioe){
2 26 Feb 07 jari 498             JOptionPane.showMessageDialog(new JFrame(), "Error in collecting accessions following analysis" +
2 26 Feb 07 jari 499             " from file: "+file.getName()+"\n Results will not have accessions.  Please check file location"+
2 26 Feb 07 jari 500             " and format", "File Error", JOptionPane.WARNING_MESSAGE);
2 26 Feb 07 jari 501             return result;  // return original result
2 26 Feb 07 jari 502         }
2 26 Feb 07 jari 503         if(haveAccessionNumbers)
2 26 Feb 07 jari 504             return newResult;
2 26 Feb 07 jari 505         else
2 26 Feb 07 jari 506             return resultMatrix;
2 26 Feb 07 jari 507     }
2 26 Feb 07 jari 508     
2 26 Feb 07 jari 509     /** 
2 26 Feb 07 jari 510      * Builds a result copy
2 26 Feb 07 jari 511      */
2 26 Feb 07 jari 512     private void initializeNewResult(String [][] newResult, String [][] oldResult){
2 26 Feb 07 jari 513         for(int i = 0; i < newResult.length; i++){
2 26 Feb 07 jari 514             for(int j = 0; j < oldResult[0].length; j++){
2 26 Feb 07 jari 515                 if(j < 1)
2 26 Feb 07 jari 516                     newResult[i][j] = oldResult[i][j];
2 26 Feb 07 jari 517                 else
2 26 Feb 07 jari 518                     newResult[i][j+1] = oldResult[i][j];
2 26 Feb 07 jari 519             }
2 26 Feb 07 jari 520         }
2 26 Feb 07 jari 521         //initialize the acc column
2 26 Feb 07 jari 522         for(int i = 0; i < newResult.length; i++)
2 26 Feb 07 jari 523             newResult[i][1] = " ";
2 26 Feb 07 jari 524     }
2 26 Feb 07 jari 525     
2 26 Feb 07 jari 526     
2 26 Feb 07 jari 527     /** 
2 26 Feb 07 jari 528      * Inserts an index for each record in the result after sorting
2 26 Feb 07 jari 529      */
2 26 Feb 07 jari 530     private void indexResult(){
2 26 Feb 07 jari 531         if(result == null || result.length < 1)
2 26 Feb 07 jari 532             return;
2 26 Feb 07 jari 533         String [][] newResult = new String[result.length][result[0].length+1];
2 26 Feb 07 jari 534         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 535             newResult[i][0] = String.valueOf(i+1);
2 26 Feb 07 jari 536             for(int j = 1; j < newResult[0].length; j++){
2 26 Feb 07 jari 537                 newResult[i][j] = result[i][j-1];
2 26 Feb 07 jari 538             }
2 26 Feb 07 jari 539         }
2 26 Feb 07 jari 540         result = newResult;
2 26 Feb 07 jari 541     }
2 26 Feb 07 jari 542     
2 26 Feb 07 jari 543     
2 26 Feb 07 jari 544     /** 
2 26 Feb 07 jari 545      * Insert accession numbers if they exist.
2 26 Feb 07 jari 546      * @param file file object
2 26 Feb 07 jari 547      * @param result Result data
2 26 Feb 07 jari 548      * @throws IOException
2 26 Feb 07 jari 549      */
2 26 Feb 07 jari 550     private void insertAccessions(File file, String [][] result) throws IOException {
2 26 Feb 07 jari 551         if(file == null)
2 26 Feb 07 jari 552             return;
2 26 Feb 07 jari 553         
2 26 Feb 07 jari 554         BufferedReader fr = new BufferedReader(new FileReader(file));
2 26 Feb 07 jari 555         String line;
2 26 Feb 07 jari 556         Hashtable accHash = new Hashtable();
2 26 Feb 07 jari 557         StringTokenizer stok;
2 26 Feb 07 jari 558         while( (line = fr.readLine()) != null){
2 26 Feb 07 jari 559             stok = new StringTokenizer(line, "\t");
2 26 Feb 07 jari 560             accHash.put(stok.nextToken(), stok.nextToken());
2 26 Feb 07 jari 561         }
2 26 Feb 07 jari 562         String acc;
2 26 Feb 07 jari 563         
2 26 Feb 07 jari 564         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 565             acc = (String)accHash.get(result[i][2]);
2 26 Feb 07 jari 566             if(acc != null)
2 26 Feb 07 jari 567                 result[i][1] = acc;
2 26 Feb 07 jari 568         }
2 26 Feb 07 jari 569         
2 26 Feb 07 jari 570     }
2 26 Feb 07 jari 571     
2 26 Feb 07 jari 572     /** 
2 26 Feb 07 jari 573      * Creates the <CODE>File</CODE> object containing the
2 26 Feb 07 jari 574      * accessions (or indices)
2 26 Feb 07 jari 575      * @param fileName File name String
2 26 Feb 07 jari 576      * @return
2 26 Feb 07 jari 577      */
2 26 Feb 07 jari 578     private File getAccessionFile(String fileName){
2 26 Feb 07 jari 579         String sep = System.getProperty("file.separator");
2 26 Feb 07 jari 580         File file = new File(fileName);
2 26 Feb 07 jari 581         String accFileName = file.getName();
2 26 Feb 07 jari 582         file = file.getParentFile();
2 26 Feb 07 jari 583         file = new File(file.getPath()+sep+"URL data"+sep+"Tags"+sep+accFileName);
2 26 Feb 07 jari 584         return file;
2 26 Feb 07 jari 585     }
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     /** 
2 26 Feb 07 jari 588      * Returns header names based on criteria of the analysis mode and
2 26 Feb 07 jari 589      * depending on if accessions are found.
2 26 Feb 07 jari 590      * @return  */
2 26 Feb 07 jari 591     private String [] getHeaderNames(){
2 26 Feb 07 jari 592         String [] headerNamesArray = new String[headerNames.size()];
2 26 Feb 07 jari 593         for(int i = 0; i < headerNamesArray.length; i++){
2 26 Feb 07 jari 594             headerNamesArray[i] = (String)(headerNames.elementAt(i));
2 26 Feb 07 jari 595         }
2 26 Feb 07 jari 596         return headerNamesArray;
2 26 Feb 07 jari 597     }
2 26 Feb 07 jari 598     
2 26 Feb 07 jari 599     /**
2 26 Feb 07 jari 600      *  Calculates means for the clusters
2 26 Feb 07 jari 601      */
2 26 Feb 07 jari 602     private FloatMatrix getMeans(FloatMatrix data, int [][] clusters){
2 26 Feb 07 jari 603    //   System.out.println("EASEAnalysis 646, data is null?" + (data== null));
2 26 Feb 07 jari 604         FloatMatrix means = new FloatMatrix(clusters.length, data.getColumnDimension());
2 26 Feb 07 jari 605         for(int i = 0; i < clusters.length; i++){
2 26 Feb 07 jari 606             means.A[i] = getMeans(data, clusters[i]);
2 26 Feb 07 jari 607         }
2 26 Feb 07 jari 608         return means;
2 26 Feb 07 jari 609     }
2 26 Feb 07 jari 610     
2 26 Feb 07 jari 611     /**
2 26 Feb 07 jari 612      *  Returns a set of means for an element
2 26 Feb 07 jari 613      */
2 26 Feb 07 jari 614     private float [] getMeans(FloatMatrix data, int [] indices){
2 26 Feb 07 jari 615         int nSamples = data.getColumnDimension();
2 26 Feb 07 jari 616         float [] means = new float[nSamples];
2 26 Feb 07 jari 617         float sum = 0;
2 26 Feb 07 jari 618         float n = 0;
2 26 Feb 07 jari 619         float value;
2 26 Feb 07 jari 620         for(int i = 0; i < nSamples; i++){
2 26 Feb 07 jari 621             n = 0;
2 26 Feb 07 jari 622             sum = 0;
2 26 Feb 07 jari 623             for(int j = 0; j < indices.length; j++){
2 26 Feb 07 jari 624                 value = data.get(indices[j],i);
2 26 Feb 07 jari 625                 if(!Float.isNaN(value)){
2 26 Feb 07 jari 626                     sum += value;
2 26 Feb 07 jari 627                     n++;
2 26 Feb 07 jari 628                 }
2 26 Feb 07 jari 629             }
2 26 Feb 07 jari 630             if(n > 0)
2 26 Feb 07 jari 631                 means[i] = sum/n;
2 26 Feb 07 jari 632             else
2 26 Feb 07 jari 633                 means[i] = Float.NaN;
2 26 Feb 07 jari 634         }
2 26 Feb 07 jari 635         return means;
2 26 Feb 07 jari 636     }
2 26 Feb 07 jari 637     
2 26 Feb 07 jari 638     /** 
2 26 Feb 07 jari 639      * Returns a matrix of standard deviations grouped by cluster and element
2 26 Feb 07 jari 640      * @param data Expression data
2 26 Feb 07 jari 641      * @param means calculated means
2 26 Feb 07 jari 642      * @param clusters cluster indices
2 26 Feb 07 jari 643      * @return
2 26 Feb 07 jari 644      */
2 26 Feb 07 jari 645     private FloatMatrix getVariances(FloatMatrix data, FloatMatrix means, int [][] clusters){
2 26 Feb 07 jari 646         int nSamples = data.getColumnDimension();
2 26 Feb 07 jari 647         FloatMatrix variances = new FloatMatrix(clusters.length, nSamples);
2 26 Feb 07 jari 648         for(int i = 0; i < clusters.length; i++){
2 26 Feb 07 jari 649             variances.A[i] = getVariances(data, means, clusters[i], i);
2 26 Feb 07 jari 650         }
2 26 Feb 07 jari 651         return variances;
2 26 Feb 07 jari 652     }
2 26 Feb 07 jari 653     
2 26 Feb 07 jari 654     /** 
2 26 Feb 07 jari 655      * Calculates the standard deviation for a set of genes.  One SD for each experiment point
2 26 Feb 07 jari 656      * in the expression vectors.
2 26 Feb 07 jari 657      * @param data Expression data
2 26 Feb 07 jari 658      * @param means previously calculated means
2 26 Feb 07 jari 659      * @param indices gene indices for cluster members
2 26 Feb 07 jari 660      * @param clusterIndex the index for the cluster to work upon
2 26 Feb 07 jari 661      * @return
2 26 Feb 07 jari 662      */
2 26 Feb 07 jari 663     private float [] getVariances(FloatMatrix data, FloatMatrix means, int [] indices, int clusterIndex){
2 26 Feb 07 jari 664         int nSamples = data.getColumnDimension();
2 26 Feb 07 jari 665         float [] variances = new float[nSamples];
2 26 Feb 07 jari 666         float sse = 0;
2 26 Feb 07 jari 667         float mean;
2 26 Feb 07 jari 668         float value;
2 26 Feb 07 jari 669         int n = 0;
2 26 Feb 07 jari 670         for(int i = 0; i < nSamples; i++){
2 26 Feb 07 jari 671             mean = means.get(clusterIndex, i);
2 26 Feb 07 jari 672             n = 0;
2 26 Feb 07 jari 673             sse = 0;
2 26 Feb 07 jari 674             for(int j = 0; j < indices.length; j++){
2 26 Feb 07 jari 675                 value = data.get(indices[j], i);
2 26 Feb 07 jari 676                 if(!Float.isNaN(value)){
2 26 Feb 07 jari 677                     sse += (float)Math.pow((value - mean),2);
2 26 Feb 07 jari 678                     n++;
2 26 Feb 07 jari 679                 }
2 26 Feb 07 jari 680             }
2 26 Feb 07 jari 681             if(n > 1)
2 26 Feb 07 jari 682                 variances[i] = (float)Math.sqrt(sse/(n-1));
2 26 Feb 07 jari 683             else
2 26 Feb 07 jari 684                 variances[i] = 0.0f;
2 26 Feb 07 jari 685         }
2 26 Feb 07 jari 686         return variances;
2 26 Feb 07 jari 687     }
2 26 Feb 07 jari 688     
2 26 Feb 07 jari 689     /** 
2 26 Feb 07 jari 690      * Appends a result onto the main result
2 26 Feb 07 jari 691      * @param resultVector data to append
2 26 Feb 07 jari 692      */
2 26 Feb 07 jari 693     private void appendResult(Vector resultVector){
2 26 Feb 07 jari 694         int numCorr = resultVector.size();
2 26 Feb 07 jari 695         double [] currentArray;
2 26 Feb 07 jari 696         int rawPIndex = result[0].length;
2 26 Feb 07 jari 697         int resultColumns = rawPIndex+numCorr;
2 26 Feb 07 jari 698         String [][] newResult = new String[result.length][resultColumns];
2 26 Feb 07 jari 699         
2 26 Feb 07 jari 700         
2 26 Feb 07 jari 701         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 702             for(int j = 0; j < result[0].length; j++){
2 26 Feb 07 jari 703                 newResult[i][j] = result[i][j];
2 26 Feb 07 jari 704             }
2 26 Feb 07 jari 705         }
2 26 Feb 07 jari 706         int resultCol;
2 26 Feb 07 jari 707         for(int col = 0; col < numCorr; col++){
2 26 Feb 07 jari 708             currentArray = (double [])resultVector.elementAt(col);
2 26 Feb 07 jari 709             resultCol = col + rawPIndex;
2 26 Feb 07 jari 710             for(int row = 0; row < newResult.length; row++){
2 26 Feb 07 jari 711                 
2 26 Feb 07 jari 712                 newResult[row][resultCol] = format.format(currentArray[row]);
2 26 Feb 07 jari 713             }
2 26 Feb 07 jari 714         }
2 26 Feb 07 jari 715         result = newResult;
2 26 Feb 07 jari 716     }
2 26 Feb 07 jari 717     
2 26 Feb 07 jari 718     
2 26 Feb 07 jari 719     /** 
2 26 Feb 07 jari 720      * Selects and makes calles to various multiplicity corrections.
2 26 Feb 07 jari 721      */
2 26 Feb 07 jari 722     private void pValueCorrections(AlgorithmData inputData){
2 26 Feb 07 jari 723         int k = this.result.length;
2 26 Feb 07 jari 724         double [] pValues = new double[k];
2 26 Feb 07 jari 725         double [] correctedP = new double[k];
2 26 Feb 07 jari 726         
2 26 Feb 07 jari 727         int pIndex;
2 26 Feb 07 jari 728         if(reportEaseScore)
2 26 Feb 07 jari 729             pIndex =  headerNames.indexOf("EASE Score");
2 26 Feb 07 jari 730         else
2 26 Feb 07 jari 731             pIndex =  headerNames.indexOf("Fisher's Exact");
2 26 Feb 07 jari 732         
2 26 Feb 07 jari 733         pIndex--;  //subtract one since result is not indexed until after sort
2 26 Feb 07 jari 734         
2 26 Feb 07 jari 735         Vector pValueCorrectionVector = new Vector();
2 26 Feb 07 jari 736         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 737             pValues[i] = Double.parseDouble(result[i][pIndex]);
2 26 Feb 07 jari 738         }
2 26 Feb 07 jari 739         AlgorithmParameters params = inputData.getParams();
2 26 Feb 07 jari 740         
2 26 Feb 07 jari 741         if(params.getBoolean("bonferroni-correction", false)){
2 26 Feb 07 jari 742             pValueCorrectionVector.add(bonferroniCorrection(pValues));
2 26 Feb 07 jari 743             headerNames.add("Bonf. Corr.");
2 26 Feb 07 jari 744         }
2 26 Feb 07 jari 745         
2 26 Feb 07 jari 746         if(params.getBoolean("bonferroni-step-down-correction", false)){
2 26 Feb 07 jari 747             pValueCorrectionVector.add(stepDownBonferroniCorrection(pValues));
2 26 Feb 07 jari 748             headerNames.add("Bonf. S.D. Corr.");
2 26 Feb 07 jari 749         }
2 26 Feb 07 jari 750         
2 26 Feb 07 jari 751         if(params.getBoolean("sidak-correction", false)){
2 26 Feb 07 jari 752             pValueCorrectionVector.add(sidakCorrection(pValues));
2 26 Feb 07 jari 753             headerNames.add("Sidak Corr.");
2 26 Feb 07 jari 754         }
2 26 Feb 07 jari 755         appendResult(pValueCorrectionVector);
2 26 Feb 07 jari 756     }
2 26 Feb 07 jari 757     
2 26 Feb 07 jari 758     /** 
2 26 Feb 07 jari 759      * Performs the standard Bonferroni correction.
2 26 Feb 07 jari 760      * @param pValues Raw values
2 26 Feb 07 jari 761      * @return Returns corrected values.
2 26 Feb 07 jari 762      */
2 26 Feb 07 jari 763     private double [] bonferroniCorrection(double [] pValues){
2 26 Feb 07 jari 764         int k = pValues.length;
2 26 Feb 07 jari 765         double [] correctedP = new double[k];
2 26 Feb 07 jari 766         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 767             correctedP[i] = pValues[i]*(double)k;
2 26 Feb 07 jari 768             if(correctedP[i] > 1.0d)
2 26 Feb 07 jari 769                 correctedP[i] = 1.0d;
2 26 Feb 07 jari 770         }
2 26 Feb 07 jari 771         return correctedP;
2 26 Feb 07 jari 772     }
2 26 Feb 07 jari 773     
2 26 Feb 07 jari 774     /** 
2 26 Feb 07 jari 775      * Performs the step down Bonferroni correction.
2 26 Feb 07 jari 776      * @param pValues input values
2 26 Feb 07 jari 777      * @return returns corrected values
2 26 Feb 07 jari 778      */
2 26 Feb 07 jari 779     private double [] stepDownBonferroniCorrection(double [] pValues){
2 26 Feb 07 jari 780         int k = pValues.length;
2 26 Feb 07 jari 781         double [] correctedP = new double[k];
2 26 Feb 07 jari 782         int m = 0;
2 26 Feb 07 jari 783         
2 26 Feb 07 jari 784         //base case
2 26 Feb 07 jari 785         correctedP[0] = pValues[0]*(double)k;
2 26 Feb 07 jari 786         
2 26 Feb 07 jari 787         for(int i = 1; i < k; i++){
2 26 Feb 07 jari 788             if(pValues[i] > pValues[i-1])
2 26 Feb 07 jari 789                 m = i;
2 26 Feb 07 jari 790             correctedP[i] = pValues[i]*(double)(k-m);
2 26 Feb 07 jari 791             if(correctedP[i] > 1.0d)
2 26 Feb 07 jari 792                 correctedP[i] = 1.0d;
2 26 Feb 07 jari 793         }
2 26 Feb 07 jari 794         return correctedP;
2 26 Feb 07 jari 795     }
2 26 Feb 07 jari 796     
2 26 Feb 07 jari 797     /** 
2 26 Feb 07 jari 798      * Perform Sidak method.
2 26 Feb 07 jari 799      * @param pValues input
2 26 Feb 07 jari 800      * @return corrected output
2 26 Feb 07 jari 801      */
2 26 Feb 07 jari 802     private double [] sidakCorrection(double [] pValues){
2 26 Feb 07 jari 803         int k = pValues.length;
2 26 Feb 07 jari 804         double [] correctedP = new double[k];
2 26 Feb 07 jari 805         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 806             correctedP[i] = 1.0d-Math.pow( (1.0d-pValues[i]), (double)k );
2 26 Feb 07 jari 807             if(correctedP[i] > 1.0d)
2 26 Feb 07 jari 808                 correctedP[i] = 1.0d;
2 26 Feb 07 jari 809         }
2 26 Feb 07 jari 810         return correctedP;
2 26 Feb 07 jari 811     }
2 26 Feb 07 jari 812     
2 26 Feb 07 jari 813     /** 
2 26 Feb 07 jari 814      * performs permutation analysis, bootstrapping selection of random samples from
2 26 Feb 07 jari 815      * the population.
2 26 Feb 07 jari 816      * @param p number of permutations
2 26 Feb 07 jari 817      */
2 26 Feb 07 jari 818     private void permutationAnalysis(int p){
2 26 Feb 07 jari 819         //Get a list of categories, have a corresponding accumulator array
2 26 Feb 07 jari 820         //Have a population Vector of strings
2 26 Feb 07 jari 821         //take k elements from here to construct a new sample list
2 26 Feb 07 jari 822         //then from this.bench getList HitsByCategory() and Construct results
2 26 Feb 07 jari 823         
2 26 Feb 07 jari 824         //increment counters indicating the times times when a terms p value falls below
2 26 Feb 07 jari 825         //the minimum p value for a resampling iteration.
2 26 Feb 07 jari 826         
2 26 Feb 07 jari 827         AlgorithmEvent permEvent = new AlgorithmEvent(this, AlgorithmEvent.PROGRESS_VALUE, p);
2 26 Feb 07 jari 828         permEvent.setDescription("SET_UNITS");
2 26 Feb 07 jari 829         permEvent.setIntValue(p);
2 26 Feb 07 jari 830         this.algorithm.fireValueChanged(permEvent);
2 26 Feb 07 jari 831         permEvent.setDescription("SET_VALUE");
2 26 Feb 07 jari 832         
2 26 Feb 07 jari 833         long start = System.currentTimeMillis();
2 26 Feb 07 jari 834         
2 26 Feb 07 jari 835         int k = result.length;
2 26 Feb 07 jari 836         int sampleSize = this.sampleVector.size();
2 26 Feb 07 jari 837         int populationSize = this.populationVector.size();
2 26 Feb 07 jari 838         int [] accumulator = new int[this.result.length];
2 26 Feb 07 jari 839         
2 26 Feb 07 jari 840         for(int i = 0; i < accumulator.length; i++)
2 26 Feb 07 jari 841             accumulator[0]=0;
2 26 Feb 07 jari 842         
2 26 Feb 07 jari 843         int [] hitNumberAcc = new int[sampleSize];
2 26 Feb 07 jari 844         
2 26 Feb 07 jari 845         Random rand = new Random(System.currentTimeMillis());
2 26 Feb 07 jari 846         String [][] testResult;
2 26 Feb 07 jari 847         
2 26 Feb 07 jari 848         long sampleTime = 0;
2 26 Feb 07 jari 849         long startsamp;
2 26 Feb 07 jari 850         
2 26 Feb 07 jari 851         for(int i = 0; i < p; i++){
2 26 Feb 07 jari 852             
2 26 Feb 07 jari 853             permEvent.setIntValue(i+1);
2 26 Feb 07 jari 854             this.algorithm.fireValueChanged(permEvent);
2 26 Feb 07 jari 855
2 26 Feb 07 jari 856             sampleVector = getRandomSampleVector(sampleSize, rand);
2 26 Feb 07 jari 857
2 26 Feb 07 jari 858             this.bench.resetForNewList();
2 26 Feb 07 jari 859
2 26 Feb 07 jari 860             this.bench.GetListHitsByCategory(sampleVector);
2 26 Feb 07 jari 861     
2 26 Feb 07 jari 862             this.bench.ConstructResults();
2 26 Feb 07 jari 863  
2 26 Feb 07 jari 864             testResult = this.bench.getResults();
2 26 Feb 07 jari 865             
2 26 Feb 07 jari 866             accumulateBinHits(testResult, accumulator);
2 26 Feb 07 jari 867         }
2 26 Feb 07 jari 868         
2 26 Feb 07 jari 869         double [] prob = new double[k];
2 26 Feb 07 jari 870         for(int i = 0; i < k; i++){
2 26 Feb 07 jari 871             prob[i] = (double)accumulator[i]/(double)p;
2 26 Feb 07 jari 872             if(prob[i] == 0d)
2 26 Feb 07 jari 873                 prob[i] = 1d/(double)p;
2 26 Feb 07 jari 874         }
2 26 Feb 07 jari 875         
2 26 Feb 07 jari 876         permEvent.setDescription("DISPOSE");  //get rid of progress bar
2 26 Feb 07 jari 877         this.algorithm.fireValueChanged(permEvent);
2 26 Feb 07 jari 878
2 26 Feb 07 jari 879         Vector probVector = new Vector();
2 26 Feb 07 jari 880         probVector.add(prob);
2 26 Feb 07 jari 881         appendResult(probVector);
2 26 Feb 07 jari 882         
2 26 Feb 07 jari 883         headerNames.add("Prob. Anal.");
2 26 Feb 07 jari 884     }
2 26 Feb 07 jari 885     
2 26 Feb 07 jari 886     /** 
2 26 Feb 07 jari 887      * Returns the maximum number of population hits for any category.
2 26 Feb 07 jari 888      */
2 26 Feb 07 jari 889     private int getMaxPopHits(String [][] result){
2 26 Feb 07 jari 890         int max = Integer.MIN_VALUE;
2 26 Feb 07 jari 891         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 892             max = Math.max(max, Integer.parseInt(result[i][4]));
2 26 Feb 07 jari 893         }
2 26 Feb 07 jari 894         return max;
2 26 Feb 07 jari 895     }
2 26 Feb 07 jari 896     
2 26 Feb 07 jari 897     /** 
2 26 Feb 07 jari 898      * Returns a random sample vector of indices.
2 26 Feb 07 jari 899      */
2 26 Feb 07 jari 900     private Vector getRandomSampleVector(int sampleSize, Random rand){
2 26 Feb 07 jari 901         Vector sampleVector = new Vector(sampleSize);
2 26 Feb 07 jari 902         Vector dummyPopVector = (Vector)populationVector.clone();
2 26 Feb 07 jari 903         
2 26 Feb 07 jari 904         int popSize = populationVector.size();
2 26 Feb 07 jari 905         
2 26 Feb 07 jari 906         int index = 0;
2 26 Feb 07 jari 907         
2 26 Feb 07 jari 908         for(int i = 0; i < sampleSize; i++){
2 26 Feb 07 jari 909             index = (int)(dummyPopVector.size()*rand.nextFloat());
2 26 Feb 07 jari 910             sampleVector.add(dummyPopVector.remove(index));  //enforce w/o replacement
2 26 Feb 07 jari 911         }
2 26 Feb 07 jari 912         
2 26 Feb 07 jari 913         return sampleVector;
2 26 Feb 07 jari 914     }
2 26 Feb 07 jari 915     
2 26 Feb 07 jari 916     /** 
2 26 Feb 07 jari 917      * accumulates list hits results from permutations
2 26 Feb 07 jari 918      * @param result
2 26 Feb 07 jari 919      * @param keys
2 26 Feb 07 jari 920      * @param accumulator  */
2 26 Feb 07 jari 921     private void accumulateHits(String [][] result, String [] keys, int [] accumulator){
2 26 Feb 07 jari 922         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 923             for(int j = 0; j < keys.length; j++){
2 26 Feb 07 jari 924                 if((result[i][1]).equals(keys[j])){
2 26 Feb 07 jari 925                     if(Integer.parseInt(result[i][2]) > Integer.parseInt(this.result[j][2]))
2 26 Feb 07 jari 926                         accumulator[j]++;
2 26 Feb 07 jari 927                     break;
2 26 Feb 07 jari 928                 }
2 26 Feb 07 jari 929             }
2 26 Feb 07 jari 930         }
2 26 Feb 07 jari 931     }
2 26 Feb 07 jari 932     
2 26 Feb 07 jari 933     /** 
2 26 Feb 07 jari 934      * Accumulates results from permutations.
2 26 Feb 07 jari 935      */
2 26 Feb 07 jari 936     private void accumulateBinHits(String [][] newResult, int [] accumulator){
2 26 Feb 07 jari 937         
2 26 Feb 07 jari 938         double minP;
2 26 Feb 07 jari 939         
2 26 Feb 07 jari 940         for(int cat = 0; cat < annotationFileList.length; cat++){
2 26 Feb 07 jari 941             
2 26 Feb 07 jari 942             minP = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 943
2 26 Feb 07 jari 944             for(int i = 0; i < newResult.length; i++){
2 26 Feb 07 jari 945                 if(this.annotationFileList[cat].indexOf(newResult[i][0]) >= 0)
2 26 Feb 07 jari 946                     minP = Math.min(minP, Double.parseDouble(newResult[i][6]));
2 26 Feb 07 jari 947             }
2 26 Feb 07 jari 948
2 26 Feb 07 jari 949             for(int j = 0; j < result.length; j++){
2 26 Feb 07 jari 950                 if((this.annotationFileList[cat].indexOf(result[j][0]) >= 0) && (minP < Double.parseDouble(result[j][6]))){
2 26 Feb 07 jari 951                     accumulator[j]++;
2 26 Feb 07 jari 952                 }
2 26 Feb 07 jari 953             }
2 26 Feb 07 jari 954         }
2 26 Feb 07 jari 955     }
2 26 Feb 07 jari 956     
2 26 Feb 07 jari 957     
2 26 Feb 07 jari 958     /** 
2 26 Feb 07 jari 959      * Orders the bootstrap probabilities based on raw probability order.
2 26 Feb 07 jari 960      */
2 26 Feb 07 jari 961     private double [] orderBootStrappedProb(double [] prob){
2 26 Feb 07 jari 962         double [] orderedProb = new double[result.length];
2 26 Feb 07 jari 963         for(int i = 0; i < this.result.length; i++){
2 26 Feb 07 jari 964             orderedProb[i] = prob[Integer.parseInt(this.result[i][2])];
2 26 Feb 07 jari 965         }
2 26 Feb 07 jari 966         return orderedProb;
2 26 Feb 07 jari 967     }
2 26 Feb 07 jari 968     
2 26 Feb 07 jari 969     
2 26 Feb 07 jari 970     /** 
2 26 Feb 07 jari 971      * Trims the results according to specified criteria.
2 26 Feb 07 jari 972      * @param trimOption Defines trim mode, "NO_TRIM", "N_TRIM", or "PERCENT_TRIM"
2 26 Feb 07 jari 973      * @param trimValue Trim parameter.
2 26 Feb 07 jari 974      */
2 26 Feb 07 jari 975     private void trimResult(String trimOption, float trimValue){
2 26 Feb 07 jari 976         
2 26 Feb 07 jari 977         boolean [] flagged = new boolean[result.length];
2 26 Feb 07 jari 978         int hitIndex;
2 26 Feb 07 jari 979         
2 26 Feb 07 jari 980         if(this.performClusterAnalysis){
2 26 Feb 07 jari 981             hitIndex = this.headerNames.indexOf("List Hits");
2 26 Feb 07 jari 982         } else {
2 26 Feb 07 jari 983             hitIndex = this.headerNames.indexOf("Pop. Hits");
2 26 Feb 07 jari 984         }
2 26 Feb 07 jari 985         
2 26 Feb 07 jari 986         hitIndex--;  //decrement since we don't have index inserted yet.
2 26 Feb 07 jari 987         
2 26 Feb 07 jari 988         int keeperCount = this.result.length;
2 26 Feb 07 jari 989         if(trimOption.equals("NO_TRIM")){
2 26 Feb 07 jari 990             for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 991                 if(Integer.parseInt(result[i][hitIndex]) < trimValue){
2 26 Feb 07 jari 992                     flagged[i] = true;
2 26 Feb 07 jari 993                     keeperCount--;
2 26 Feb 07 jari 994                 }
2 26 Feb 07 jari 995             }
2 26 Feb 07 jari 996         } else { //Percent trim option
2 26 Feb 07 jari 997             trimValue /= (float)100;
2 26 Feb 07 jari 998             for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 999                 if(Double.parseDouble(result[i][hitIndex])/Double.parseDouble(result[i][hitIndex+1]) < trimValue){
2 26 Feb 07 jari 1000                     flagged[i] = true;
2 26 Feb 07 jari 1001                     keeperCount--;
2 26 Feb 07 jari 1002                 }
2 26 Feb 07 jari 1003             }
2 26 Feb 07 jari 1004         }
2 26 Feb 07 jari 1005         
2 26 Feb 07 jari 1006         String [][] newResult = new String[keeperCount][];
2 26 Feb 07 jari 1007         String [][] newHitList = new String[keeperCount][];
2 26 Feb 07 jari 1008         String [] newCategoryNames = new String[keeperCount];
2 26 Feb 07 jari 1009         int keeperIndex = 0;
2 26 Feb 07 jari 1010         
2 26 Feb 07 jari 1011         for(int i = 0; i < result.length; i++){
2 26 Feb 07 jari 1012             if(!flagged[i]){
2 26 Feb 07 jari 1013                 newResult[keeperIndex] = result[i];
2 26 Feb 07 jari 1014                 newHitList[keeperIndex] = hitList[i];
2 26 Feb 07 jari 1015                 newCategoryNames[keeperIndex] = categoryNames[i];
2 26 Feb 07 jari 1016                 keeperIndex++;
2 26 Feb 07 jari 1017             }
2 26 Feb 07 jari 1018         }
2 26 Feb 07 jari 1019         this.result = newResult;
2 26 Feb 07 jari 1020         this.hitList = newHitList;
2 26 Feb 07 jari 1021         this.categoryNames = newCategoryNames;
2 26 Feb 07 jari 1022     }
2 26 Feb 07 jari 1023     
2 26 Feb 07 jari 1024 }
2 26 Feb 07 jari 1025