2 |
26 Feb 07 |
jari |
1 |
/* |
2 |
26 Feb 07 |
jari |
Copyright @ 1999-2003, The Institute for Genomic Research (TIGR). |
2 |
26 Feb 07 |
jari |
All rights reserved. |
2 |
26 Feb 07 |
jari |
4 |
*/ |
2 |
26 Feb 07 |
jari |
5 |
/* |
2 |
26 Feb 07 |
jari |
* $RCSfile: EASEAnalysis.java,v $ |
2 |
26 Feb 07 |
jari |
* $Revision: 1.2 $ |
2 |
26 Feb 07 |
jari |
* $Date: 2006/02/23 20:59:46 $ |
2 |
26 Feb 07 |
jari |
* $Author: caliente $ |
2 |
26 Feb 07 |
jari |
* $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 |
* Manages EASE analysis and raw result manipulation and return. |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
* Recieves parameters, executes algorithm and returns the result in the <CODE>AlgorithmData</CODE> object. |
2 |
26 Feb 07 |
jari |
* @param algorithmData Intput data and parameters |
2 |
26 Feb 07 |
jari |
* @throws AlgorithmException Reports errors or abort requests |
2 |
26 Feb 07 |
jari |
* @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 |
// System.out.println("EASEAnalysis 84, expData is null? " + (expData == null)); |
2 |
26 Feb 07 |
jari |
// for (int i = 0; i < expData.getRowDimension(); i++) { //*********************************** |
2 |
26 Feb 07 |
jari |
// for (int j = 0; j < expData.getColumnDimension(); j++) |
2 |
26 Feb 07 |
jari |
// System.out.print(expData.get(i, j)+" "); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
92 |
// } |
2 |
26 Feb 07 |
jari |
93 |
|
2 |
26 Feb 07 |
jari |
if(this.performClusterAnalysis) |
2 |
26 Feb 07 |
jari |
return performClusterAnnotationAnalysis(algorithmData); |
2 |
26 Feb 07 |
jari |
else{ |
2 |
26 Feb 07 |
jari |
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 |
* 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 |
* Main method for cluster analysis. cluster analysis compare selected |
2 |
26 Feb 07 |
jari |
* sample gene list to a population list which can either be an user |
2 |
26 Feb 07 |
jari |
* indicated external file or the whole gene list present if no file is |
2 |
26 Feb 07 |
jari |
* selected. Store result in result matrix. |
2 |
26 Feb 07 |
jari |
* @param algorithmData Input data and parameters. |
2 |
26 Feb 07 |
jari |
* @throws AlgorithmException |
2 |
26 Feb 07 |
jari |
* @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 |
// System.out.println("clusterIndices null?" + (clusterIndices == null)); //*************************************** |
2 |
26 Feb 07 |
jari |
// System.out.println("sampleList null?" + (sampleList == null)); |
2 |
26 Feb 07 |
jari |
127 |
|
2 |
26 Feb 07 |
jari |
try{ |
2 |
26 Feb 07 |
jari |
if(this.converterFileName != null){ //if a convert table is used |
2 |
26 Feb 07 |
jari |
sampleElementList.loadValues(converterFileName); |
2 |
26 Feb 07 |
jari |
} else { //no convert table is selected |
2 |
26 Feb 07 |
jari |
sampleElementList.setDefaultValues(); |
2 |
26 Feb 07 |
jari |
133 |
} |
2 |
26 Feb 07 |
jari |
} catch (FileNotFoundException fnfe) { |
2 |
26 Feb 07 |
jari |
throw new AlgorithmException("Annotation Conversion File Not Found\n"+converterFileName+"\n"+fnfe.getMessage()); |
2 |
26 Feb 07 |
jari |
} catch (IOException ioe) { |
2 |
26 Feb 07 |
jari |
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 |
this.sampleVector = sampleElementList.getUniqueValueList(); |
2 |
26 Feb 07 |
jari |
141 |
|
2 |
26 Feb 07 |
jari |
142 |
|
2 |
26 Feb 07 |
jari |
//alter to take the keys as args |
2 |
26 Feb 07 |
jari |
this.bench.GetListHitsByCategory(this.sampleVector); |
2 |
26 Feb 07 |
jari |
145 |
|
2 |
26 Feb 07 |
jari |
// Iterator it = populationVector.iterator(); |
2 |
26 Feb 07 |
jari |
// while(it.hasNext()) |
2 |
26 Feb 07 |
jari |
// System.out.print(it.next()+ " "); |
2 |
26 Feb 07 |
jari |
149 |
|
2 |
26 Feb 07 |
jari |
this.bench.ConstructResults(); |
2 |
26 Feb 07 |
jari |
this.result = this.bench.getResults(); |
2 |
26 Feb 07 |
jari |
152 |
|
2 |
26 Feb 07 |
jari |
// for (int i = 0; i < 10; i ++) { |
2 |
26 Feb 07 |
jari |
// for (int j = 0; j < result[i].length; j++) |
2 |
26 Feb 07 |
jari |
// System.out.print(result[i][j]+ " "); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
157 |
// } |
2 |
26 Feb 07 |
jari |
158 |
|
2 |
26 Feb 07 |
jari |
//if the result set is empty, return. |
2 |
26 Feb 07 |
jari |
if(this.result.length < 1) { |
2 |
26 Feb 07 |
jari |
return algorithmData; |
2 |
26 Feb 07 |
jari |
162 |
} |
2 |
26 Feb 07 |
jari |
163 |
|
2 |
26 Feb 07 |
jari |
this.hitList = this.bench.getListHitMatrix(); |
2 |
26 Feb 07 |
jari |
this.categoryNames = this.bench.getCategoryNames(); |
2 |
26 Feb 07 |
jari |
sortResults(); |
2 |
26 Feb 07 |
jari |
167 |
|
2 |
26 Feb 07 |
jari |
if(algorithmData.getParams().getBoolean("p-value-corrections", false)){ |
2 |
26 Feb 07 |
jari |
pValueCorrections(algorithmData); |
2 |
26 Feb 07 |
jari |
170 |
} |
2 |
26 Feb 07 |
jari |
171 |
|
2 |
26 Feb 07 |
jari |
if(algorithmData.getParams().getBoolean("run-permutation-analysis", false)){ |
2 |
26 Feb 07 |
jari |
permutationAnalysis(algorithmData.getParams().getInt("permutation-count", 1)); |
2 |
26 Feb 07 |
jari |
System.out.println("EASEAnalysis 192 permutation run"); |
2 |
26 Feb 07 |
jari |
175 |
} |
2 |
26 Feb 07 |
jari |
176 |
|
2 |
26 Feb 07 |
jari |
this.result = appendAccessions(result, annotationFileList); |
2 |
26 Feb 07 |
jari |
algorithmData.addParam("have-accession-numbers", String.valueOf(haveAccessionNumbers)); |
2 |
26 Feb 07 |
jari |
179 |
|
2 |
26 Feb 07 |
jari |
//apply trim options |
2 |
26 Feb 07 |
jari |
String trimOption = params.getString("trim-option"); |
2 |
26 Feb 07 |
jari |
float trimValue; |
2 |
26 Feb 07 |
jari |
if(!(trimOption.equals("NO_TRIM"))){ |
2 |
26 Feb 07 |
jari |
trimValue = params.getFloat("trim-value"); |
2 |
26 Feb 07 |
jari |
trimResult(trimOption, trimValue); |
2 |
26 Feb 07 |
jari |
186 |
} |
2 |
26 Feb 07 |
jari |
187 |
|
2 |
26 Feb 07 |
jari |
indexResult(); |
2 |
26 Feb 07 |
jari |
189 |
|
2 |
26 Feb 07 |
jari |
algorithmData.addObjectMatrix("result-matrix", result); |
2 |
26 Feb 07 |
jari |
algorithmData.addObjectMatrix("hit-list-matrix", hitList); |
2 |
26 Feb 07 |
jari |
//System.out.println("EASEAnalysis 212, hit List is null? " + (hitList[0]==null)); |
2 |
26 Feb 07 |
jari |
//get sorted clusters |
2 |
26 Feb 07 |
jari |
int [][] clusters = getClusters(sampleElementList, hitList); |
2 |
26 Feb 07 |
jari |
195 |
|
2 |
26 Feb 07 |
jari |
algorithmData.addStringArray("category-names", categoryNames); |
2 |
26 Feb 07 |
jari |
algorithmData.addIntMatrix("cluster-matrix", clusters); |
2 |
26 Feb 07 |
jari |
198 |
|
2 |
26 Feb 07 |
jari |
algorithmData.addStringArray("header-names", getHeaderNames()); |
2 |
26 Feb 07 |
jari |
200 |
|
2 |
26 Feb 07 |
jari |
FloatMatrix means = getMeans(expData, clusters); |
2 |
26 Feb 07 |
jari |
algorithmData.addMatrix("means", means); |
2 |
26 Feb 07 |
jari |
algorithmData.addMatrix("variances", getVariances(expData, means, clusters)); |
2 |
26 Feb 07 |
jari |
204 |
|
2 |
26 Feb 07 |
jari |
//System.out.println("Duration: "+(System.currentTimeMillis()-start)); |
2 |
26 Feb 07 |
jari |
return algorithmData; |
2 |
26 Feb 07 |
jari |
207 |
} |
2 |
26 Feb 07 |
jari |
208 |
|
2 |
26 Feb 07 |
jari |
/** Alternative analysis mode (slide survey) |
2 |
26 Feb 07 |
jari |
* @param algorithmData |
2 |
26 Feb 07 |
jari |
* @throws AlgorithmException |
2 |
26 Feb 07 |
jari |
* @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 |
// System.out.println("EASEAnalysis 252 sampleList"); //*************************************************** |
2 |
26 Feb 07 |
jari |
// for (int i = 0; i < sampleList.length; i++) |
2 |
26 Feb 07 |
jari |
// System.out.println(sampleList[i]); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
224 |
// |
2 |
26 Feb 07 |
jari |
// System.out.println("annotationList"); |
2 |
26 Feb 07 |
jari |
// for (int i = 0; i < annotationFileList.length; i++) |
2 |
26 Feb 07 |
jari |
// System.out.println(annotationFileList[i]); |
2 |
26 Feb 07 |
jari |
228 |
|
2 |
26 Feb 07 |
jari |
try{ |
2 |
26 Feb 07 |
jari |
if(converterFileName != null){ |
2 |
26 Feb 07 |
jari |
sampleElementList.loadValues(converterFileName); |
2 |
26 Feb 07 |
jari |
} else { |
2 |
26 Feb 07 |
jari |
sampleElementList.setDefaultValues(); |
2 |
26 Feb 07 |
jari |
234 |
} |
2 |
26 Feb 07 |
jari |
} catch (FileNotFoundException fnfe) { |
2 |
26 Feb 07 |
jari |
throw new AlgorithmException("Annotation Conversion File Not Found\n"+converterFileName+"\n"+fnfe.getMessage()); |
2 |
26 Feb 07 |
jari |
} catch (IOException ioe) { |
2 |
26 Feb 07 |
jari |
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 |
//sampleVector is a replicate of popluationElementList with any duplicate genes removed |
2 |
26 Feb 07 |
jari |
this.sampleVector = sampleElementList.getUniqueValueList(); |
2 |
26 Feb 07 |
jari |
243 |
|
2 |
26 Feb 07 |
jari |
// System.out.println("EASEAnalysis 281"); |
2 |
26 Feb 07 |
jari |
// Iterator it = sampleVector.iterator(); |
2 |
26 Feb 07 |
jari |
// while(it.hasNext()) |
2 |
26 Feb 07 |
jari |
// System.out.print(it.next()+" "); |
2 |
26 Feb 07 |
jari |
248 |
|
2 |
26 Feb 07 |
jari |
this.bench.GetPopulationHitsByCategoryForSurvey(sampleVector); |
2 |
26 Feb 07 |
jari |
this.bench.ConstructSurveyResults(); |
2 |
26 Feb 07 |
jari |
result = this.bench.getSurveyResults(); //resut[][] = records[][] |
2 |
26 Feb 07 |
jari |
252 |
|
2 |
26 Feb 07 |
jari |
//if the result set is empty, return. |
2 |
26 Feb 07 |
jari |
if(result.length < 1) //no hits |
2 |
26 Feb 07 |
jari |
return algorithmData; |
2 |
26 Feb 07 |
jari |
256 |
|
2 |
26 Feb 07 |
jari |
hitList = this.bench.getListHitMatrix(); |
2 |
26 Feb 07 |
jari |
categoryNames = this.bench.getCategoryNames(); |
2 |
26 Feb 07 |
jari |
259 |
|
2 |
26 Feb 07 |
jari |
sortSurveyResults(); //rank by number of hit count |
2 |
26 Feb 07 |
jari |
result = appendAccessions(result, annotationFileList); |
2 |
26 Feb 07 |
jari |
algorithmData.addParam("have-accession-numbers", String.valueOf(haveAccessionNumbers)); |
2 |
26 Feb 07 |
jari |
algorithmData.addStringArray("header-names", getHeaderNames()); |
2 |
26 Feb 07 |
jari |
264 |
|
2 |
26 Feb 07 |
jari |
265 |
|
2 |
26 Feb 07 |
jari |
//apply trim options |
2 |
26 Feb 07 |
jari |
String trimOption = params.getString("trim-option"); |
2 |
26 Feb 07 |
jari |
float trimValue; |
2 |
26 Feb 07 |
jari |
if(!(trimOption.equals("NO_TRIM"))){ |
2 |
26 Feb 07 |
jari |
event.setDescription("Trim Result\n"); |
2 |
26 Feb 07 |
jari |
this.algorithm.fireValueChanged(event); |
2 |
26 Feb 07 |
jari |
trimValue = params.getFloat("trim-value"); |
2 |
26 Feb 07 |
jari |
trimResult(trimOption, trimValue); |
2 |
26 Feb 07 |
jari |
274 |
} |
2 |
26 Feb 07 |
jari |
275 |
|
2 |
26 Feb 07 |
jari |
indexResult(); |
2 |
26 Feb 07 |
jari |
277 |
|
2 |
26 Feb 07 |
jari |
algorithmData.addObjectMatrix("result-matrix", result); |
2 |
26 Feb 07 |
jari |
algorithmData.addObjectMatrix("hit-list-matrix", hitList); |
2 |
26 Feb 07 |
jari |
280 |
|
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
// for (int i = 0; i < 10; i ++) { |
2 |
26 Feb 07 |
jari |
// for (int j = 0; j < result[i].length; j++) |
2 |
26 Feb 07 |
jari |
// System.out.print(result[i][j]+ " "); |
2 |
26 Feb 07 |
jari |
// System.out.println(); |
2 |
26 Feb 07 |
jari |
286 |
// } |
2 |
26 Feb 07 |
jari |
287 |
|
2 |
26 Feb 07 |
jari |
//get sorted clusters |
2 |
26 Feb 07 |
jari |
int [][] clusters = getClusters(sampleElementList, hitList); |
2 |
26 Feb 07 |
jari |
290 |
|
2 |
26 Feb 07 |
jari |
algorithmData.addStringArray("category-names", categoryNames); |
2 |
26 Feb 07 |
jari |
algorithmData.addIntMatrix("cluster-matrix", clusters); |
2 |
26 Feb 07 |
jari |
293 |
|
2 |
26 Feb 07 |
jari |
// FloatMatrix means = getMeans(expData, clusters); |
2 |
26 Feb 07 |
jari |
// algorithmData.addMatrix("means", means); |
2 |
26 Feb 07 |
jari |
// algorithmData.addMatrix("variances", getVariances(expData, means, clusters)); |
2 |
26 Feb 07 |
jari |
297 |
|
2 |
26 Feb 07 |
jari |
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 |
* Read in the annotation file and store it in TEASEBench. |
2 |
26 Feb 07 |
jari |
* different for cluster and slide analysis |
2 |
26 Feb 07 |
jari |
* @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 |
//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 |
//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 |
//extract population-list |
2 |
26 Feb 07 |
jari |
//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 |
* 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 |
/** Returns cluster indices |
2 |
26 Feb 07 |
jari |
* @param clusterList list of cluster indices |
2 |
26 Feb 07 |
jari |
* @param hitList List of acc. in each category |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
//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 |
* 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 |
// System.out.println("\nEASEAnalysis 508"); |
2 |
26 Feb 07 |
jari |
// System.out.println("categoryNames size = "+categoryNames.length); |
2 |
26 Feb 07 |
jari |
// System.out.println("orderedIndices size = "+orderedIndices.length); |
2 |
26 Feb 07 |
jari |
//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 |
/** Appends accessions |
2 |
26 Feb 07 |
jari |
* @param resultMatrix Result matrix input. |
2 |
26 Feb 07 |
jari |
* @param fileNames File names. |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
//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 |
* 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 |
* Insert accession numbers if they exist. |
2 |
26 Feb 07 |
jari |
* @param file file object |
2 |
26 Feb 07 |
jari |
* @param result Result data |
2 |
26 Feb 07 |
jari |
* @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 |
* Creates the <CODE>File</CODE> object containing the |
2 |
26 Feb 07 |
jari |
* accessions (or indices) |
2 |
26 Feb 07 |
jari |
* @param fileName File name String |
2 |
26 Feb 07 |
jari |
* @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 |
* Returns header names based on criteria of the analysis mode and |
2 |
26 Feb 07 |
jari |
* depending on if accessions are found. |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
// 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 |
* 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 |
* Returns a matrix of standard deviations grouped by cluster and element |
2 |
26 Feb 07 |
jari |
* @param data Expression data |
2 |
26 Feb 07 |
jari |
* @param means calculated means |
2 |
26 Feb 07 |
jari |
* @param clusters cluster indices |
2 |
26 Feb 07 |
jari |
* @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 |
* Calculates the standard deviation for a set of genes. One SD for each experiment point |
2 |
26 Feb 07 |
jari |
* in the expression vectors. |
2 |
26 Feb 07 |
jari |
* @param data Expression data |
2 |
26 Feb 07 |
jari |
* @param means previously calculated means |
2 |
26 Feb 07 |
jari |
* @param indices gene indices for cluster members |
2 |
26 Feb 07 |
jari |
* @param clusterIndex the index for the cluster to work upon |
2 |
26 Feb 07 |
jari |
* @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 |
* Appends a result onto the main result |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
* Performs the standard Bonferroni correction. |
2 |
26 Feb 07 |
jari |
* @param pValues Raw values |
2 |
26 Feb 07 |
jari |
* @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 |
* Performs the step down Bonferroni correction. |
2 |
26 Feb 07 |
jari |
* @param pValues input values |
2 |
26 Feb 07 |
jari |
* @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 |
//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 |
* Perform Sidak method. |
2 |
26 Feb 07 |
jari |
* @param pValues input |
2 |
26 Feb 07 |
jari |
* @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 |
* performs permutation analysis, bootstrapping selection of random samples from |
2 |
26 Feb 07 |
jari |
* the population. |
2 |
26 Feb 07 |
jari |
* @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 |
//Get a list of categories, have a corresponding accumulator array |
2 |
26 Feb 07 |
jari |
//Have a population Vector of strings |
2 |
26 Feb 07 |
jari |
//take k elements from here to construct a new sample list |
2 |
26 Feb 07 |
jari |
//then from this.bench getList HitsByCategory() and Construct results |
2 |
26 Feb 07 |
jari |
823 |
|
2 |
26 Feb 07 |
jari |
//increment counters indicating the times times when a terms p value falls below |
2 |
26 Feb 07 |
jari |
//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 |
* 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 |
* 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 |
* accumulates list hits results from permutations |
2 |
26 Feb 07 |
jari |
* @param result |
2 |
26 Feb 07 |
jari |
* @param keys |
2 |
26 Feb 07 |
jari |
* @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 |
* 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 |
* 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 |
* Trims the results according to specified criteria. |
2 |
26 Feb 07 |
jari |
* @param trimOption Defines trim mode, "NO_TRIM", "N_TRIM", or "PERCENT_TRIM" |
2 |
26 Feb 07 |
jari |
* @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 |
|