mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/SAM.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: SAM.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.9 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 15:45:28 $
2 26 Feb 07 jari 9  * $Author: braistedj $
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 /*
2 26 Feb 07 jari 14  * SAM.java
2 26 Feb 07 jari 15  *
2 26 Feb 07 jari 16  * Created on December 16, 2002, 12:55 PM
2 26 Feb 07 jari 17  */
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 20
2 26 Feb 07 jari 21 import java.io.File;
2 26 Feb 07 jari 22 import java.io.FileOutputStream;
2 26 Feb 07 jari 23 import java.io.PrintWriter;
2 26 Feb 07 jari 24 import java.util.HashSet;
2 26 Feb 07 jari 25 import java.util.Random;
2 26 Feb 07 jari 26 import java.util.Vector;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.gui.impl.sam.SAMGUI;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.impl.sam.SAMGraph;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.impl.sam.SAMInitDialog;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.impl.sam.SAMState;
2 26 Feb 07 jari 43 import org.tigr.util.Combinations;
2 26 Feb 07 jari 44 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 45 import org.tigr.util.Permutations;
2 26 Feb 07 jari 46 import org.tigr.util.QSort;
2 26 Feb 07 jari 47
2 26 Feb 07 jari 48 /**
2 26 Feb 07 jari 49  *
2 26 Feb 07 jari 50  * @author  nbhagaba
2 26 Feb 07 jari 51  * @version 
2 26 Feb 07 jari 52  */
2 26 Feb 07 jari 53 public class SAM extends AbstractAlgorithm {
2 26 Feb 07 jari 54     
2 26 Feb 07 jari 55     private boolean stop = false;
2 26 Feb 07 jari 56     
2 26 Feb 07 jari 57     private int function;
2 26 Feb 07 jari 58     private float factor;
2 26 Feb 07 jari 59     private boolean absolute;
2 26 Feb 07 jari 60     private FloatMatrix expMatrix;
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     private FloatMatrix imputedMatrix;    
2 26 Feb 07 jari 63     
2 26 Feb 07 jari 64     private Vector[] clusters;
2 26 Feb 07 jari 65     private int k; // # of clusters    
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     private int numGenes, numExps;    
2 26 Feb 07 jari 68     
2 26 Feb 07 jari 69     private int[] groupAssignments, pairedGroupAExpts, pairedGroupBExpts;
2 26 Feb 07 jari 70     private boolean[] inSurvivalAnalysis, isCensored, useAllPerms;
2 26 Feb 07 jari 71     private int studyDesign;
2 26 Feb 07 jari 72     private int numMultiClassGroups = 0;
2 26 Feb 07 jari 73     private int numCombs, numUniquePerms;
2 26 Feb 07 jari 74     //private boolean useAllCombs;
2 26 Feb 07 jari 75     private boolean useKNearest, drawSigTreesOnly ;
2 26 Feb 07 jari 76     private int numNeighbors;
2 26 Feb 07 jari 77     //private boolean useAllUniquePerms;
2 26 Feb 07 jari 78     private double sNought = 0.0f;
2 26 Feb 07 jari 79     private double s0Percentile, oneClassMean;
2 26 Feb 07 jari 80     
2 26 Feb 07 jari 81     private double[] dArray, rArray, sortedDArray, dBarValues, survivalTimes, zkArray, globalAllSValues, globalAllQValues, globalSortedAllSValues;
2 26 Feb 07 jari 82     private int[] dkArray;
2 26 Feb 07 jari 83     private int[][] rkArray;
2 26 Feb 07 jari 84     private long[] randomSeeds;
2 26 Feb 07 jari 85
2 26 Feb 07 jari 86     private int hcl_function;
2 26 Feb 07 jari 87     private boolean hcl_absolute;
2 26 Feb 07 jari 88     
2 26 Feb 07 jari 89     //private boolean passedThisPoint = false; // just for debugging purposes, delete this variable later
2 26 Feb 07 jari 90     
2 26 Feb 07 jari 91     /** Creates new SAM */
2 26 Feb 07 jari 92     public SAM() {
2 26 Feb 07 jari 93     }
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95     /**
2 26 Feb 07 jari 96      * This method should interrupt the calculation.
2 26 Feb 07 jari 97      */
2 26 Feb 07 jari 98
2 26 Feb 07 jari 99     
2 26 Feb 07 jari 100     /**
2 26 Feb 07 jari 101      * This method execute calculation and return result,
2 26 Feb 07 jari 102      * stored in <code>AlgorithmData</code> class.
2 26 Feb 07 jari 103      *
2 26 Feb 07 jari 104      * @param data the data to be calculated.
2 26 Feb 07 jari 105      */
2 26 Feb 07 jari 106     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 107         //System.out.println("SAM: execute entered");
2 26 Feb 07 jari 108   groupAssignments = data.getIntArray("group-assignments");
2 26 Feb 07 jari 109   
2 26 Feb 07 jari 110   AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 111   function = map.getInt("distance-function", EUCLIDEAN);
2 26 Feb 07 jari 112   factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 113   absolute = map.getBoolean("distance-absolute", false);
2 26 Feb 07 jari 114
2 26 Feb 07 jari 115         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 116         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);
2 26 Feb 07 jari 117         
2 26 Feb 07 jari 118   boolean hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 119         if (hierarchical_tree) {
2 26 Feb 07 jari 120             drawSigTreesOnly = map.getBoolean("draw-sig-trees-only");
2 26 Feb 07 jari 121         }        
2 26 Feb 07 jari 122   int method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 123   boolean calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 124   boolean calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 125   boolean saveImputedMatrix = map.getBoolean("saveImputedMatrix", false);
2 26 Feb 07 jari 126         boolean usePreviousGraph = map.getBoolean("use-previous-graph", false);
2 26 Feb 07 jari 127         
2 26 Feb 07 jari 128         double userPercentile = (double)(map.getFloat("userPercentile", 0.0f));
2 26 Feb 07 jari 129         boolean useTusherEtAlS0 = map.getBoolean("useTusherEtAlS0", false);
2 26 Feb 07 jari 130         boolean calculateQLowestFDR = map.getBoolean("calculateQLowestFDR", false);
2 26 Feb 07 jari 131         boolean useAllUniquePerms = map.getBoolean("useAllUniquePerms", false);
2 26 Feb 07 jari 132         numUniquePerms = map.getInt("numUniquePerms", 0);
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134   this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 135   
2 26 Feb 07 jari 136   numGenes = this.expMatrix.getRowDimension();
2 26 Feb 07 jari 137   numExps = this.expMatrix.getColumnDimension();  
2 26 Feb 07 jari 138         inSurvivalAnalysis = new boolean[numExps];
2 26 Feb 07 jari 139         isCensored = new boolean[numExps];
2 26 Feb 07 jari 140         survivalTimes = new double[numExps];
2 26 Feb 07 jari 141         studyDesign = map.getInt("study-design", SAMInitDialog.TWO_CLASS_UNPAIRED);
2 26 Feb 07 jari 142         if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 143             FloatMatrix pairedAExptsMatrix = data.getMatrix("pairedAExptsMatrix");
2 26 Feb 07 jari 144             FloatMatrix pairedBExptsMatrix = data.getMatrix("pairedBExptsMatrix");
2 26 Feb 07 jari 145             pairedGroupAExpts = new int[pairedAExptsMatrix.getRowDimension()];
2 26 Feb 07 jari 146             pairedGroupBExpts = new int[pairedBExptsMatrix.getRowDimension()];
2 26 Feb 07 jari 147             for (int i = 0; i < pairedAExptsMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 148                 pairedGroupAExpts[i] = (int)(pairedAExptsMatrix.A[i][0]);
2 26 Feb 07 jari 149                 pairedGroupBExpts[i] = (int)(pairedBExptsMatrix.A[i][0]);
2 26 Feb 07 jari 150             }
2 26 Feb 07 jari 151         }
2 26 Feb 07 jari 152         if (studyDesign == SAMInitDialog.MULTI_CLASS) {
2 26 Feb 07 jari 153             numMultiClassGroups = map.getInt("numMultiClassGroups", 0);
2 26 Feb 07 jari 154         }
2 26 Feb 07 jari 155         if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 156             oneClassMean = (double)(map.getFloat("oneClassMean", 0.0f));
2 26 Feb 07 jari 157         }
2 26 Feb 07 jari 158         if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 159             FloatMatrix inAnalysisMatrix = data.getMatrix("inAnalysisMatrix");
2 26 Feb 07 jari 160             FloatMatrix isCensoredMatrix = data.getMatrix("isCensoredMatrix");
2 26 Feb 07 jari 161             FloatMatrix survivalTimesMatrix = data.getMatrix("survivalTimesMatrix");
2 26 Feb 07 jari 162             
2 26 Feb 07 jari 163             for (int i = 0; i < inAnalysisMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 164                 if (inAnalysisMatrix.A[i][0] == 0.0f) {
2 26 Feb 07 jari 165                     inSurvivalAnalysis[i] = false;
2 26 Feb 07 jari 166                 } else {
2 26 Feb 07 jari 167                     inSurvivalAnalysis[i] = true;
2 26 Feb 07 jari 168                 }
2 26 Feb 07 jari 169                 if (isCensoredMatrix.A[i][0] == 0.0f) {
2 26 Feb 07 jari 170                     isCensored[i] = false;
2 26 Feb 07 jari 171                 } else {
2 26 Feb 07 jari 172                     isCensored[i] = true;
2 26 Feb 07 jari 173                 }
2 26 Feb 07 jari 174                 survivalTimes[i] = (double)survivalTimesMatrix.A[i][0];
2 26 Feb 07 jari 175             }
2 26 Feb 07 jari 176         }
2 26 Feb 07 jari 177         
2 26 Feb 07 jari 178         /*
2 26 Feb 07 jari 179         for (int i = 0; i < inSurvivalAnalysis.length; i++) {
2 26 Feb 07 jari 180             System.out.println("inSurvivalAnalysis[" + i + "] =" + inSurvivalAnalysis[i]);
2 26 Feb 07 jari 181         }
2 26 Feb 07 jari 182         for (int i = 0; i < isCensored.length; i++) {
2 26 Feb 07 jari 183             System.out.println("isCensored[" + i + "] =" + isCensored[i]);
2 26 Feb 07 jari 184         }  
2 26 Feb 07 jari 185         for (int i = 0; i < survivalTimes.length; i++) {
2 26 Feb 07 jari 186             System.out.println("survivalTimes[" + i + "] =" + survivalTimes[i]);
2 26 Feb 07 jari 187         }  
2 26 Feb 07 jari 188          */      
2 26 Feb 07 jari 189         
2 26 Feb 07 jari 190         numCombs = map.getInt("num-combs", 100);
2 26 Feb 07 jari 191         if (useAllUniquePerms) {
2 26 Feb 07 jari 192             numCombs = numUniquePerms;
2 26 Feb 07 jari 193         }
2 26 Feb 07 jari 194         //useAllCombs = map.getBoolean("use-all-combs", false);
2 26 Feb 07 jari 195         useKNearest = map.getBoolean("use-k-nearest", true);
2 26 Feb 07 jari 196         numNeighbors = map.getInt("num-neighbors", 10);
2 26 Feb 07 jari 197         
2 26 Feb 07 jari 198         double pi0Hat = 0; 
2 26 Feb 07 jari 199         double delta = 0.0d;
2 26 Feb 07 jari 200         double[] deltaGrid = new double[1001];
2 26 Feb 07 jari 201         int[] numSigGenesByDelta = new int[1];
2 26 Feb 07 jari 202         int[] sortedDArrayIndices = new int[1];
2 26 Feb 07 jari 203         double[] medNumFalselyCalledGenesByDelta = new double[1];
2 26 Feb 07 jari 204         double[] ninetiethPercentileFalselyCalledGenesByDelta = new double[1];
2 26 Feb 07 jari 205         double[] FDRmedian = new double[1];
2 26 Feb 07 jari 206         double[] FDR90thPercentile = new double[1]; 
2 26 Feb 07 jari 207         double[] qLowestFDR = new double[1];
2 26 Feb 07 jari 208         
2 26 Feb 07 jari 209         if (!usePreviousGraph) { 
2 26 Feb 07 jari 210         
2 26 Feb 07 jari 211             imputedMatrix = new FloatMatrix(numGenes, numExps);
2 26 Feb 07 jari 212             
2 26 Feb 07 jari 213             if (useKNearest) {
2 26 Feb 07 jari 214                 imputedMatrix = imputeKNearestMatrix(expMatrix, numNeighbors);
2 26 Feb 07 jari 215             } else {
2 26 Feb 07 jari 216                 imputedMatrix = imputeRowAverageMatrix(expMatrix);
2 26 Feb 07 jari 217             }
2 26 Feb 07 jari 218             
2 26 Feb 07 jari 219             /*
2 26 Feb 07 jari 220             if (saveImputedMatrix) {
2 26 Feb 07 jari 221                 final JFileChooser fc = new JFileChooser();
2 26 Feb 07 jari 222                 fc.setCurrentDirectory(new File("Data"));   
2 26 Feb 07 jari 223                 int returnVal = fc.showSaveDialog(SAMGUI.SAMFrame);
2 26 Feb 07 jari 224                 if (returnVal == JFileChooser.APPROVE_OPTION) {
2 26 Feb 07 jari 225                     File file = fc.getSelectedFile();
2 26 Feb 07 jari 226                     try {
2 26 Feb 07 jari 227                         PrintWriter out = new PrintWriter(new FileOutputStream(file));
2 26 Feb 07 jari 228                         //int[] groupAssgn = getGroupAssignments();
2 26 Feb 07 jari 229                         //
2 26 Feb 07 jari 230                         for (int i = 0; i < groupAssgn.length; i++) {
2 26 Feb 07 jari 231                             out.print(groupAssgn[i]);
2 26 Feb 07 jari 232                             if (i < groupAssgn.length - 1) {
2 26 Feb 07 jari 233                                 out.print("\t");
2 26 Feb 07 jari 234                             }
2 26 Feb 07 jari 235                         }
2 26 Feb 07 jari 236                         out.println();
2 26 Feb 07 jari 237                          //
2 26 Feb 07 jari 238                         out.flush();
2 26 Feb 07 jari 239                         out.close();
2 26 Feb 07 jari 240                     } catch (Exception e) {
2 26 Feb 07 jari 241                         //e.printStackTrace();
2 26 Feb 07 jari 242                     }
2 26 Feb 07 jari 243                     //this is where a real application would save the file.
2 26 Feb 07 jari 244                     //log.append("Saving: " + file.getName() + "." + newline);
2 26 Feb 07 jari 245                 } else {
2 26 Feb 07 jari 246                     //log.append("Save command cancelled by user." + newline);
2 26 Feb 07 jari 247                 }
2 26 Feb 07 jari 248             }
2 26 Feb 07 jari 249              */
2 26 Feb 07 jari 250
2 26 Feb 07 jari 251             SAMState.imputedMatrix = imputedMatrix;
2 26 Feb 07 jari 252
2 26 Feb 07 jari 253             //The following three statements are just for initialization purposes
2 26 Feb 07 jari 254             zkArray = new double[1];
2 26 Feb 07 jari 255             rkArray = new int[1][];
2 26 Feb 07 jari 256             dkArray = new int[1];
2 26 Feb 07 jari 257                 
2 26 Feb 07 jari 258             if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 259                 zkArray = getZkArray();
2 26 Feb 07 jari 260                 rkArray = getRkArray();
2 26 Feb 07 jari 261                 dkArray = getDkArray();
2 26 Feb 07 jari 262             }
2 26 Feb 07 jari 263             
2 26 Feb 07 jari 264             /*
2 26 Feb 07 jari 265             for (int i = 0; i < zkArray.length; i++) {
2 26 Feb 07 jari 266                 System.out.println("zkArray[" + i + "] = " + zkArray[i]);
2 26 Feb 07 jari 267             }
2 26 Feb 07 jari 268             
2 26 Feb 07 jari 269             for (int i = 0; i < dkArray.length; i++) {
2 26 Feb 07 jari 270                 System.out.println("dkArray[" + i + "] = " + dkArray[i]);
2 26 Feb 07 jari 271             }  
2 26 Feb 07 jari 272             
2 26 Feb 07 jari 273             for (int i = 0; i < rkArray.length; i++) {
2 26 Feb 07 jari 274                 System.out.println("rkArray[" + i + "] :");
2 26 Feb 07 jari 275                 for (int j = 0; j < rkArray[i].length; j++) {
2 26 Feb 07 jari 276                     System.out.println("rkArray[" + i + "][" + j + "] =" + rkArray[i][j]);
2 26 Feb 07 jari 277                 }
2 26 Feb 07 jari 278             }
2 26 Feb 07 jari 279              */
2 26 Feb 07 jari 280             
2 26 Feb 07 jari 281             /*
2 26 Feb 07 jari 282             try {
2 26 Feb 07 jari 283                 printMatrix(imputedMatrix, "imputedMatrix.txt");
2 26 Feb 07 jari 284                 printMatrix(expMatrix, "origExpMatrix.txt");
2 26 Feb 07 jari 285             } catch (Exception e) {
2 26 Feb 07 jari 286                 e.printStackTrace();
2 26 Feb 07 jari 287             }
2 26 Feb 07 jari 288              */
2 26 Feb 07 jari 289             globalAllSValues = getAllSValues();
2 26 Feb 07 jari 290             QSort sortSValues = new QSort(globalAllSValues);
2 26 Feb 07 jari 291             globalSortedAllSValues = sortSValues.getSortedDouble();            
2 26 Feb 07 jari 292         
2 26 Feb 07 jari 293             //System.out.println("sAlpha(0.59) = " + getSAlpha(59.0d));
2 26 Feb 07 jari 294             if (useTusherEtAlS0) {
2 26 Feb 07 jari 295                 /*
2 26 Feb 07 jari 296                 globalAllSValues = getAllSValues();
2 26 Feb 07 jari 297                 QSort sortSValues = new QSort(globalAllSValues);
2 26 Feb 07 jari 298                 globalSortedAllSValues = sortSValues.getSortedDouble();    
2 26 Feb 07 jari 299                  */           
2 26 Feb 07 jari 300                 globalAllQValues = getQValues();
2 26 Feb 07 jari 301                 sNought = getSNought(); 
2 26 Feb 07 jari 302                 SAMState.sNought = sNought;
2 26 Feb 07 jari 303                 SAMState.s0Percentile = s0Percentile;
2 26 Feb 07 jari 304             } else {
2 26 Feb 07 jari 305                 sNought = getSAlpha(userPercentile); 
2 26 Feb 07 jari 306                 SAMState.sNought = sNought; 
2 26 Feb 07 jari 307                 s0Percentile = userPercentile; 
2 26 Feb 07 jari 308                 SAMState.s0Percentile = userPercentile;
2 26 Feb 07 jari 309             }
2 26 Feb 07 jari 310             //System.out.println("s0 = " + sNought);
2 26 Feb 07 jari 311
2 26 Feb 07 jari 312             dArray = new double[numGenes];
2 26 Feb 07 jari 313             rArray = new double[numGenes];
2 26 Feb 07 jari 314             for (int i = 0; i < dArray.length; i++) {
2 26 Feb 07 jari 315                 //System.out.println("current gene = " + i);
2 26 Feb 07 jari 316                 dArray[i] = getD(i, imputedMatrix); //  UNCOMMENT
2 26 Feb 07 jari 317                 rArray[i] = getR(i, imputedMatrix);
2 26 Feb 07 jari 318                 //System.out.println("dArray[" + i + "] = " + dArray[i]);
2 26 Feb 07 jari 319             }
2 26 Feb 07 jari 320             
2 26 Feb 07 jari 321             SAMState.dArray = dArray;
2 26 Feb 07 jari 322             SAMState.rArray = rArray;
2 26 Feb 07 jari 323             
2 26 Feb 07 jari 324             /*
2 26 Feb 07 jari 325             try {
2 26 Feb 07 jari 326                 File outfile = new File("nameVsD_and_r.txt");
2 26 Feb 07 jari 327                 PrintWriter out = new PrintWriter(new FileOutputStream(outfile));  
2 26 Feb 07 jari 328                 for (int i = 0; i < dArray.length; i++) {
2 26 Feb 07 jari 329                     out.print(dArray[i] +"\t"); // UNCOMMENT
2 26 Feb 07 jari 330                     out.print(getR(i, imputedMatrix) + "\t");
2 26 Feb 07 jari 331                     out.print(getS(i, imputedMatrix));
2 26 Feb 07 jari 332                     out.print("\n");
2 26 Feb 07 jari 333                 }
2 26 Feb 07 jari 334                 out.flush();
2 26 Feb 07 jari 335                 out.close();
2 26 Feb 07 jari 336             } catch (Exception e) {
2 26 Feb 07 jari 337                 e.printStackTrace();
2 26 Feb 07 jari 338             }
2 26 Feb 07 jari 339             */
2 26 Feb 07 jari 340             
2 26 Feb 07 jari 341          
2 26 Feb 07 jari 342          
2 26 Feb 07 jari 343         //passedThisPoint = true; //for debugging only, remove this later
2 26 Feb 07 jari 344         
2 26 Feb 07 jari 345         //System.out.println("SAM.execute(): after populating dArray[]");
2 26 Feb 07 jari 346         
2 26 Feb 07 jari 347             QSort sortDArray = new QSort(dArray);
2 26 Feb 07 jari 348             sortedDArray = sortDArray.getSortedDouble();
2 26 Feb 07 jari 349             SAMState.sortedDArray = sortedDArray;
2 26 Feb 07 jari 350             sortedDArrayIndices = sortDArray.getOrigIndx();
2 26 Feb 07 jari 351             SAMState.sortedDArrayIndices = sortedDArrayIndices;
2 26 Feb 07 jari 352             double[][] permutedDValues = new double[numCombs][numGenes];
2 26 Feb 07 jari 353             //if (useAllUniquePerms) {
2 26 Feb 07 jari 354             //}
2 26 Feb 07 jari 355
2 26 Feb 07 jari 356             AlgorithmEvent event2 = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numCombs);
2 26 Feb 07 jari 357             if (useAllUniquePerms) {
2 26 Feb 07 jari 358                 event2 = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numUniquePerms);
2 26 Feb 07 jari 359             }
2 26 Feb 07 jari 360             fireValueChanged(event2);
2 26 Feb 07 jari 361             event2.setId(AlgorithmEvent.PROGRESS_VALUE);   
2 26 Feb 07 jari 362             
2 26 Feb 07 jari 363             Random rand  = new Random();
2 26 Feb 07 jari 364             randomSeeds  = new long[numCombs];
2 26 Feb 07 jari 365             for (int i = 0; i < numCombs; i++) {
2 26 Feb 07 jari 366                 randomSeeds[i] = rand.nextLong();
2 26 Feb 07 jari 367             }
2 26 Feb 07 jari 368             
2 26 Feb 07 jari 369             if (!useAllUniquePerms) {
2 26 Feb 07 jari 370                 for (int i = 0; i < numCombs; i++) {
2 26 Feb 07 jari 371                     if (stop) {
2 26 Feb 07 jari 372                         throw new AbortException();
2 26 Feb 07 jari 373                     }  
2 26 Feb 07 jari 374                     event2.setIntValue(i);
2 26 Feb 07 jari 375                     event2.setDescription("Permuting matrix: Current permutation = " + (i+1));
2 26 Feb 07 jari 376                     fireValueChanged(event2);            
2 26 Feb 07 jari 377                     //System.out.println("execute(): permutation " + i);
2 26 Feb 07 jari 378                     int[] permutedExpts = new int[1];
2 26 Feb 07 jari 379                     boolean[] changeSign = new boolean[1];
2 26 Feb 07 jari 380                     if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) || (studyDesign == SAMInitDialog.MULTI_CLASS) || (studyDesign == SAMInitDialog.CENSORED_SURVIVAL)) {
2 26 Feb 07 jari 381                         //System.out.print("Permutation " + i + ": ");
2 26 Feb 07 jari 382                         Vector validExpts = new Vector();
2 26 Feb 07 jari 383                         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 384                             for (int j = 0; j < groupAssignments.length; j++) {
2 26 Feb 07 jari 385                                 if (groupAssignments[j] != SAMInitDialog.NEITHER_GROUP) {
2 26 Feb 07 jari 386                                     validExpts.add(new Integer(j));
2 26 Feb 07 jari 387                                 }
2 26 Feb 07 jari 388                             }                        
2 26 Feb 07 jari 389                         } else if (studyDesign == SAMInitDialog.MULTI_CLASS) {
2 26 Feb 07 jari 390                             for (int j = 0; j < groupAssignments.length; j++) {
2 26 Feb 07 jari 391                                 if (groupAssignments[j] != 0) {
2 26 Feb 07 jari 392                                     validExpts.add(new Integer(j));
2 26 Feb 07 jari 393                                 }
2 26 Feb 07 jari 394                             }
2 26 Feb 07 jari 395                         } else if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 396                             for (int j = 0; j < inSurvivalAnalysis.length; j++) {
2 26 Feb 07 jari 397                                 if (inSurvivalAnalysis[j]) {
2 26 Feb 07 jari 398                                     validExpts.add(new Integer(j));
2 26 Feb 07 jari 399                                 }
2 26 Feb 07 jari 400                             }
2 26 Feb 07 jari 401                         } 
2 26 Feb 07 jari 402
2 26 Feb 07 jari 403                         int[] validArray = new int[validExpts.size()];
2 26 Feb 07 jari 404                         for (int j = 0; j < validArray.length; j++) {
2 26 Feb 07 jari 405                             validArray[j] = ((Integer)(validExpts.get(j))).intValue();
2 26 Feb 07 jari 406                         } 
2 26 Feb 07 jari 407                         //System.out.print("valid array: ");
2 26 Feb 07 jari 408                         //printIntArray(validArray);
2 26 Feb 07 jari 409                         permutedExpts = getPermutedValues(numExps, validArray); //returns an int array of size "numExps", with the valid values permuted 
2 26 Feb 07 jari 410                         //printIntArray(permutedExpts);
2 26 Feb 07 jari 411                     } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 412                         //System.out.print("Permutation " + i + ": ");
2 26 Feb 07 jari 413                         permutedExpts = permuteWithinPairs(randomSeeds[i]); //returns an int array with some paired experiment indices permuted
2 26 Feb 07 jari 414                         //System.out.println();
2 26 Feb 07 jari 415                     } else if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 416                         Vector validExpts = new Vector();
2 26 Feb 07 jari 417                         for (int j = 0; j < groupAssignments.length; j++) {
2 26 Feb 07 jari 418                             if (groupAssignments[j] == 1) {
2 26 Feb 07 jari 419                                 validExpts.add(new Integer(j));
2 26 Feb 07 jari 420                             }
2 26 Feb 07 jari 421                         } 
2 26 Feb 07 jari 422
2 26 Feb 07 jari 423                         int[] validArray = new int[validExpts.size()];
2 26 Feb 07 jari 424                         for (int j = 0; j < validArray.length; j++) {
2 26 Feb 07 jari 425                             validArray[j] = ((Integer)(validExpts.get(j))).intValue();
2 26 Feb 07 jari 426                         }                    
2 26 Feb 07 jari 427
2 26 Feb 07 jari 428                         changeSign = getOneClassChangeSignArray(randomSeeds[i], validArray);
2 26 Feb 07 jari 429                     }
2 26 Feb 07 jari 430
2 26 Feb 07 jari 431                     // *** DONE UP TO HERE 5/30/03 ***
2 26 Feb 07 jari 432
2 26 Feb 07 jari 433                     //printIntArray(permutedExpts);
2 26 Feb 07 jari 434                     FloatMatrix permutedMatrix;
2 26 Feb 07 jari 435                     if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 436                         permutedMatrix = getOneClassPermMatrix(imputedMatrix, changeSign);
2 26 Feb 07 jari 437                     } else {
2 26 Feb 07 jari 438                         permutedMatrix = getPermutedMatrix(imputedMatrix, permutedExpts);
2 26 Feb 07 jari 439                     }
2 26 Feb 07 jari 440
2 26 Feb 07 jari 441                     // ****DONE UP TO HERE 10/29/03
2 26 Feb 07 jari 442
2 26 Feb 07 jari 443                     double[] permDArray = new double[permutedMatrix.getRowDimension()];
2 26 Feb 07 jari 444                     for (int j = 0; j < permutedMatrix.getRowDimension(); j++) {
2 26 Feb 07 jari 445                         permDArray[j] = getD(j, permutedMatrix);
2 26 Feb 07 jari 446                     }
2 26 Feb 07 jari 447
2 26 Feb 07 jari 448                     QSort sortPermDArray = new QSort(permDArray);
2 26 Feb 07 jari 449                     double[] sortedPermDArray = sortPermDArray.getSortedDouble();
2 26 Feb 07 jari 450
2 26 Feb 07 jari 451                     for (int j = 0; j < sortedPermDArray.length; j++) {
2 26 Feb 07 jari 452                         permutedDValues[i][j] = sortedPermDArray[j];
2 26 Feb 07 jari 453                     }
2 26 Feb 07 jari 454
2 26 Feb 07 jari 455                 }
2 26 Feb 07 jari 456                 
2 26 Feb 07 jari 457             } else { // if (useAllPerms)
2 26 Feb 07 jari 458                 int[] permutedExpts = new int[numExps];
2 26 Feb 07 jari 459                 
2 26 Feb 07 jari 460                 for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 461                     permutedExpts[i] = i;
2 26 Feb 07 jari 462                 }
2 26 Feb 07 jari 463                 
2 26 Feb 07 jari 464                 if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 465                     Vector usedExptsVector = new Vector();
2 26 Feb 07 jari 466                     int numGroupAValues = 0;
2 26 Feb 07 jari 467                     for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 468                         if (groupAssignments[i] != SAMInitDialog.NEITHER_GROUP) {
2 26 Feb 07 jari 469                            usedExptsVector.add(new Integer(i));
2 26 Feb 07 jari 470                         } 
2 26 Feb 07 jari 471                         if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 472                             numGroupAValues++;
2 26 Feb 07 jari 473                         }
2 26 Feb 07 jari 474                     }
2 26 Feb 07 jari 475                     int[] usedExptsArray = new int[usedExptsVector.size()];
2 26 Feb 07 jari 476                     
2 26 Feb 07 jari 477                     for (int i = 0; i < usedExptsArray.length; i++) {
2 26 Feb 07 jari 478                         usedExptsArray[i] = ((Integer)(usedExptsVector.get(i))).intValue();
2 26 Feb 07 jari 479                     }
2 26 Feb 07 jari 480                     
2 26 Feb 07 jari 481                     int[] combArray = new int[numGroupAValues];
2 26 Feb 07 jari 482                     for (int i = 0; i < combArray.length; i++) {
2 26 Feb 07 jari 483                         combArray[i] = -1;
2 26 Feb 07 jari 484                     }  
2 26 Feb 07 jari 485                     
2 26 Feb 07 jari 486                     int numGroupBValues = usedExptsArray.length - numGroupAValues;
2 26 Feb 07 jari 487
2 26 Feb 07 jari 488                     int permCounter = 0;
2 26 Feb 07 jari 489                     
2 26 Feb 07 jari 490                     while (Combinations.enumerateCombinations(usedExptsArray.length, numGroupAValues, combArray)) {
2 26 Feb 07 jari 491                         
2 26 Feb 07 jari 492                         if (stop) {
2 26 Feb 07 jari 493                             throw new AbortException();
2 26 Feb 07 jari 494                         }
2 26 Feb 07 jari 495                         event2.setIntValue(permCounter);
2 26 Feb 07 jari 496                         event2.setDescription("Permuting matrix: Current permutation = " + (permCounter+1));
2 26 Feb 07 jari 497                         fireValueChanged(event2); 
2 26 Feb 07 jari 498                         
2 26 Feb 07 jari 499                         int[] notInCombArray = new int[numGroupBValues];
2 26 Feb 07 jari 500                         int notCombCounter = 0;                 
2 26 Feb 07 jari 501                         
2 26 Feb 07 jari 502                         for (int i = 0; i < usedExptsArray.length; i++) {
2 26 Feb 07 jari 503                             if(!belongsInArray(i, combArray)) {
2 26 Feb 07 jari 504                                 notInCombArray[notCombCounter] = i;
2 26 Feb 07 jari 505                                 notCombCounter++;
2 26 Feb 07 jari 506                             }                            
2 26 Feb 07 jari 507                         }
2 26 Feb 07 jari 508                         
2 26 Feb 07 jari 509                         for (int i = 0; i < combArray.length; i++) {
2 26 Feb 07 jari 510                             permutedExpts[usedExptsArray[i]] = usedExptsArray[combArray[i]];
2 26 Feb 07 jari 511                         }
2 26 Feb 07 jari 512                         for (int i = 0; i < notInCombArray.length; i++) {
2 26 Feb 07 jari 513                             permutedExpts[usedExptsArray[combArray.length + i]] = usedExptsArray[notInCombArray[i]];
2 26 Feb 07 jari 514                         }
2 26 Feb 07 jari 515                         
2 26 Feb 07 jari 516                         FloatMatrix permutedMatrix = getPermutedMatrix(imputedMatrix, permutedExpts);  
2 26 Feb 07 jari 517                         
2 26 Feb 07 jari 518                         double[] permDArray = new double[permutedMatrix.getRowDimension()];
2 26 Feb 07 jari 519                         for (int j = 0; j < permutedMatrix.getRowDimension(); j++) {
2 26 Feb 07 jari 520                             permDArray[j] = getD(j, permutedMatrix);
2 26 Feb 07 jari 521                         }
2 26 Feb 07 jari 522                         
2 26 Feb 07 jari 523                         QSort sortPermDArray = new QSort(permDArray);
2 26 Feb 07 jari 524                         double[] sortedPermDArray = sortPermDArray.getSortedDouble();
2 26 Feb 07 jari 525                         
2 26 Feb 07 jari 526                         for (int j = 0; j < sortedPermDArray.length; j++) {
2 26 Feb 07 jari 527                             permutedDValues[permCounter][j] = sortedPermDArray[j];
2 26 Feb 07 jari 528                         } 
2 26 Feb 07 jari 529                         
2 26 Feb 07 jari 530                         permCounter++;                        
2 26 Feb 07 jari 531                     }
2 26 Feb 07 jari 532                     
2 26 Feb 07 jari 533                 } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 534                     for (int i = 0; i < numUniquePerms; i++) {
2 26 Feb 07 jari 535                         
2 26 Feb 07 jari 536                         if (stop) {
2 26 Feb 07 jari 537                             throw new AbortException();
2 26 Feb 07 jari 538                         }                     
2 26 Feb 07 jari 539                         event2.setIntValue(i);
2 26 Feb 07 jari 540                         event2.setDescription("Permuting matrix: Current permutation = " + (i+1));
2 26 Feb 07 jari 541                         fireValueChanged(event2);                     
2 26 Feb 07 jari 542                         permutedExpts = permuteWithinPairsAllPerms(i);
2 26 Feb 07 jari 543                         
2 26 Feb 07 jari 544                         FloatMatrix permutedMatrix = getPermutedMatrix(imputedMatrix, permutedExpts);  
2 26 Feb 07 jari 545                         
2 26 Feb 07 jari 546                         double[] permDArray = new double[permutedMatrix.getRowDimension()];
2 26 Feb 07 jari 547                         for (int j = 0; j < permutedMatrix.getRowDimension(); j++) {
2 26 Feb 07 jari 548                             permDArray[j] = getD(j, permutedMatrix);
2 26 Feb 07 jari 549                         }
2 26 Feb 07 jari 550                         
2 26 Feb 07 jari 551                         QSort sortPermDArray = new QSort(permDArray);
2 26 Feb 07 jari 552                         double[] sortedPermDArray = sortPermDArray.getSortedDouble();
2 26 Feb 07 jari 553                         
2 26 Feb 07 jari 554                         for (int j = 0; j < sortedPermDArray.length; j++) {
2 26 Feb 07 jari 555                             permutedDValues[i][j] = sortedPermDArray[j];
2 26 Feb 07 jari 556                         }                        
2 26 Feb 07 jari 557                     }
2 26 Feb 07 jari 558                     
2 26 Feb 07 jari 559                 } else if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 560                     for (int i = 0; i < numUniquePerms; i++) {
2 26 Feb 07 jari 561                         if (stop) {
2 26 Feb 07 jari 562                             throw new AbortException();
2 26 Feb 07 jari 563                         }                     
2 26 Feb 07 jari 564                         event2.setIntValue(i);
2 26 Feb 07 jari 565                         event2.setDescription("Permuting matrix: Current permutation = " + (i+1));
2 26 Feb 07 jari 566                         fireValueChanged(event2);   
2 26 Feb 07 jari 567                         
2 26 Feb 07 jari 568                         Vector validExpts = new Vector();
2 26 Feb 07 jari 569                         for (int j = 0; j < groupAssignments.length; j++) {
2 26 Feb 07 jari 570                             if (groupAssignments[j] == 1) {
2 26 Feb 07 jari 571                                 validExpts.add(new Integer(j));
2 26 Feb 07 jari 572                             }
2 26 Feb 07 jari 573                         } 
2 26 Feb 07 jari 574
2 26 Feb 07 jari 575                         int[] validArray = new int[validExpts.size()];
2 26 Feb 07 jari 576                         for (int j = 0; j < validArray.length; j++) {
2 26 Feb 07 jari 577                             validArray[j] = ((Integer)(validExpts.get(j))).intValue();
2 26 Feb 07 jari 578                         }                    
2 26 Feb 07 jari 579
2 26 Feb 07 jari 580                         boolean[] changeSign = getOneClassChangeSignArrayAllUniquePerms(i, validArray);      
2 26 Feb 07 jari 581                         
2 26 Feb 07 jari 582                         FloatMatrix permutedMatrix = getOneClassPermMatrix(imputedMatrix, changeSign);
2 26 Feb 07 jari 583                         
2 26 Feb 07 jari 584                         double[] permDArray = new double[permutedMatrix.getRowDimension()];
2 26 Feb 07 jari 585                         for (int j = 0; j < permutedMatrix.getRowDimension(); j++) {
2 26 Feb 07 jari 586                             permDArray[j] = getD(j, permutedMatrix);
2 26 Feb 07 jari 587                         }
2 26 Feb 07 jari 588                         
2 26 Feb 07 jari 589                         QSort sortPermDArray = new QSort(permDArray);
2 26 Feb 07 jari 590                         double[] sortedPermDArray = sortPermDArray.getSortedDouble();
2 26 Feb 07 jari 591                         
2 26 Feb 07 jari 592                         for (int j = 0; j < sortedPermDArray.length; j++) {
2 26 Feb 07 jari 593                             permutedDValues[i][j] = sortedPermDArray[j];
2 26 Feb 07 jari 594                         }                        
2 26 Feb 07 jari 595                     }
2 26 Feb 07 jari 596                     
2 26 Feb 07 jari 597                 } else if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 598                     Vector validExpts = new Vector();
2 26 Feb 07 jari 599                     
2 26 Feb 07 jari 600                     for (int j = 0; j < inSurvivalAnalysis.length; j++) {
2 26 Feb 07 jari 601                         if (inSurvivalAnalysis[j]) {
2 26 Feb 07 jari 602                             validExpts.add(new Integer(j));
2 26 Feb 07 jari 603                         } 
2 26 Feb 07 jari 604                     }
2 26 Feb 07 jari 605                     
2 26 Feb 07 jari 606                     int[] validArray = new int[validExpts.size()];
2 26 Feb 07 jari 607                     for (int j = 0; j < validArray.length; j++) {
2 26 Feb 07 jari 608                         validArray[j] = ((Integer)(validExpts.get(j))).intValue();
2 26 Feb 07 jari 609                     }                    
2 26 Feb 07 jari 610                     
2 26 Feb 07 jari 611                     int[] comb = new int[validArray.length];
2 26 Feb 07 jari 612                     for (int i = 0; i < comb.length; i++) {
2 26 Feb 07 jari 613                         comb[i] = -1;
2 26 Feb 07 jari 614                     }                    
2 26 Feb 07 jari 615                     
2 26 Feb 07 jari 616                     int permCounter = 0;
2 26 Feb 07 jari 617                     while (Permutations.enumeratePermutations(validArray.length, validArray.length, comb)) {
2 26 Feb 07 jari 618                         if (stop) {
2 26 Feb 07 jari 619                             throw new AbortException();
2 26 Feb 07 jari 620                         }
2 26 Feb 07 jari 621                         event2.setIntValue(permCounter);
2 26 Feb 07 jari 622                         event2.setDescription("Permuting matrix: Current permutation = " + (permCounter+1));
2 26 Feb 07 jari 623                         fireValueChanged(event2);       
2 26 Feb 07 jari 624                         
2 26 Feb 07 jari 625                         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 626                             permutedExpts[validArray[i]] = validArray[comb[i]]; 
2 26 Feb 07 jari 627                         }    
2 26 Feb 07 jari 628                         
2 26 Feb 07 jari 629                         FloatMatrix permutedMatrix = getPermutedMatrix(imputedMatrix, permutedExpts); 
2 26 Feb 07 jari 630                         
2 26 Feb 07 jari 631                         double[] permDArray = new double[permutedMatrix.getRowDimension()];
2 26 Feb 07 jari 632                         for (int j = 0; j < permutedMatrix.getRowDimension(); j++) {
2 26 Feb 07 jari 633                             permDArray[j] = getD(j, permutedMatrix);
2 26 Feb 07 jari 634                         }
2 26 Feb 07 jari 635                         
2 26 Feb 07 jari 636                         QSort sortPermDArray = new QSort(permDArray);
2 26 Feb 07 jari 637                         double[] sortedPermDArray = sortPermDArray.getSortedDouble();
2 26 Feb 07 jari 638                         
2 26 Feb 07 jari 639                         for (int j = 0; j < sortedPermDArray.length; j++) {
2 26 Feb 07 jari 640                             permutedDValues[permCounter][j] = sortedPermDArray[j];
2 26 Feb 07 jari 641                         }                         
2 26 Feb 07 jari 642                         
2 26 Feb 07 jari 643                         permCounter++;
2 26 Feb 07 jari 644                     }
2 26 Feb 07 jari 645                 }
2 26 Feb 07 jari 646                                 
2 26 Feb 07 jari 647               
2 26 Feb 07 jari 648             }
2 26 Feb 07 jari 649
2 26 Feb 07 jari 650             dBarValues = new double[numGenes];
2 26 Feb 07 jari 651
2 26 Feb 07 jari 652             for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 653                 double[] currentGene = new double[numCombs];
2 26 Feb 07 jari 654                 for (int j = 0; j < numCombs; j++) {
2 26 Feb 07 jari 655                     currentGene[j] = permutedDValues[j][i];
2 26 Feb 07 jari 656                 }
2 26 Feb 07 jari 657                 dBarValues[i] = getMean(currentGene);
2 26 Feb 07 jari 658             }
2 26 Feb 07 jari 659             
2 26 Feb 07 jari 660             SAMState.dBarValues = dBarValues;
2 26 Feb 07 jari 661             /*
2 26 Feb 07 jari 662             try {
2 26 Feb 07 jari 663                 Thread.sleep(10);
2 26 Feb 07 jari 664             } catch (Exception e) {
2 26 Feb 07 jari 665                 e.printStackTrace();
2 26 Feb 07 jari 666             }
2 26 Feb 07 jari 667              */
2 26 Feb 07 jari 668
2 26 Feb 07 jari 669             double[] oneDimPermutedDValues = new double[numCombs*numGenes];
2 26 Feb 07 jari 670             int counter1 = 0;
2 26 Feb 07 jari 671             //System.out.println("Creating oneDimPermutedDValues ....");
2 26 Feb 07 jari 672             for (int i = 0; i < numCombs; i++) {
2 26 Feb 07 jari 673                 for (int j = 0; j < numGenes; j++) {
2 26 Feb 07 jari 674                     oneDimPermutedDValues[counter1] = permutedDValues[i][j];
2 26 Feb 07 jari 675                     counter1++;
2 26 Feb 07 jari 676                 }
2 26 Feb 07 jari 677             }
2 26 Feb 07 jari 678             //System.out.println("oneDimPermutedDValues created.");
2 26 Feb 07 jari 679             
2 26 Feb 07 jari 680             //System.out.println("sorting oneDimPermutedDValues ....");
2 26 Feb 07 jari 681             QSort sortAllPermutedDValues = new QSort(oneDimPermutedDValues);
2 26 Feb 07 jari 682             double[] sortedAllPermutedDValues = sortAllPermutedDValues.getSortedDouble();
2 26 Feb 07 jari 683             //System.out.println("Sorting complete.");
2 26 Feb 07 jari 684             int[] sortedAllPermutedDValuesIndices = sortAllPermutedDValues.getOrigIndx();
2 26 Feb 07 jari 685             int percentile25thIndex = (int)Math.round((sortedAllPermutedDValues.length)*0.25 - 1);  
2 26 Feb 07 jari 686             if (percentile25thIndex < 0) {
2 26 Feb 07 jari 687                 percentile25thIndex = 0;
2 26 Feb 07 jari 688             } else if (percentile25thIndex >= sortedAllPermutedDValues.length) {
2 26 Feb 07 jari 689                 percentile25thIndex = sortedAllPermutedDValues.length - 1;
2 26 Feb 07 jari 690             }
2 26 Feb 07 jari 691             int percentile75thIndex = (int)Math.round((sortedAllPermutedDValues.length)*0.75 - 1); 
2 26 Feb 07 jari 692             if (percentile75thIndex < 0) {
2 26 Feb 07 jari 693                 percentile75thIndex = 0;
2 26 Feb 07 jari 694             } else if (percentile75thIndex >= sortedAllPermutedDValues.length) {
2 26 Feb 07 jari 695                 percentile75thIndex = sortedAllPermutedDValues.length - 1;
2 26 Feb 07 jari 696             }        
2 26 Feb 07 jari 697
2 26 Feb 07 jari 698             double q25 = sortedAllPermutedDValues[percentile25thIndex];
2 26 Feb 07 jari 699             double q75 = sortedAllPermutedDValues[percentile75thIndex];
2 26 Feb 07 jari 700
2 26 Feb 07 jari 701             //System.out.println("q25 = " + q25 + ", q75 =" + q75);
2 26 Feb 07 jari 702
2 26 Feb 07 jari 703             int piCounter = 0;
2 26 Feb 07 jari 704
2 26 Feb 07 jari 705             for (int i = 0; i < dArray.length; i++) {
2 26 Feb 07 jari 706                 if ((dArray[i] > q25) && (dArray[i]< q75)) {
2 26 Feb 07 jari 707                     piCounter++;
2 26 Feb 07 jari 708                 }
2 26 Feb 07 jari 709             }
2 26 Feb 07 jari 710
2 26 Feb 07 jari 711             pi0Hat = (double)(piCounter/(0.5d*numGenes));
2 26 Feb 07 jari 712             
2 26 Feb 07 jari 713             pi0Hat = Math.min(pi0Hat, 1.0d);
2 26 Feb 07 jari 714             SAMState.pi0Hat = pi0Hat;
2 26 Feb 07 jari 715              
2 26 Feb 07 jari 716             
2 26 Feb 07 jari 717             //System.out.println("piHat = " + pi0Hat);
2 26 Feb 07 jari 718
2 26 Feb 07 jari 719             double maximum = getMax(dArray);
2 26 Feb 07 jari 720             double minimum = getMin(dArray);
2 26 Feb 07 jari 721
2 26 Feb 07 jari 722             //System.out.println("maximum = " + maximum + ", minimum = " + minimum);
2 26 Feb 07 jari 723
2 26 Feb 07 jari 724             
2 26 Feb 07 jari 725             //float maxDelta = 0.0f;
2 26 Feb 07 jari 726             if (Math.abs(maximum) > Math.abs(minimum)) {
2 26 Feb 07 jari 727                 delta = (float)(0.25*Math.abs(maximum));
2 26 Feb 07 jari 728                 //maxDelta = Math.abs(maximum);
2 26 Feb 07 jari 729             } else {
2 26 Feb 07 jari 730                 delta = (float)(0.25*Math.abs(minimum));
2 26 Feb 07 jari 731                 //maxDelta = Math.abs(minimum);
2 26 Feb 07 jari 732             }
2 26 Feb 07 jari 733
2 26 Feb 07 jari 734
2 26 Feb 07 jari 735             double[] diffValues = new double[sortedDArray.length];
2 26 Feb 07 jari 736
2 26 Feb 07 jari 737             for (int i = 0; i < diffValues.length; i++) {
2 26 Feb 07 jari 738                 diffValues[i] = Math.abs(sortedDArray[i] - dBarValues[i]);
2 26 Feb 07 jari 739             }
2 26 Feb 07 jari 740
2 26 Feb 07 jari 741             double maxDelta = getMax(diffValues);
2 26 Feb 07 jari 742             double minDelta = getMin(diffValues);
2 26 Feb 07 jari 743             //System.out.println("maxDelta = " + maxDelta + ", minDelta = " + minDelta);
2 26 Feb 07 jari 744
2 26 Feb 07 jari 745             double deltaIncrement = (double)((maxDelta - minDelta)/1000d);
2 26 Feb 07 jari 746             
2 26 Feb 07 jari 747             double currentDelta = minDelta;
2 26 Feb 07 jari 748             for (int i = 0 ; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 749                 deltaGrid[i] = currentDelta;
2 26 Feb 07 jari 750                 currentDelta = currentDelta + deltaIncrement;
2 26 Feb 07 jari 751             }
2 26 Feb 07 jari 752             
2 26 Feb 07 jari 753             SAMState.deltaGrid = deltaGrid;
2 26 Feb 07 jari 754             
2 26 Feb 07 jari 755             double[] cutUp = new double[deltaGrid.length];
2 26 Feb 07 jari 756             double[] cutLow = new double[deltaGrid.length];
2 26 Feb 07 jari 757             
2 26 Feb 07 jari 758             //System.out.println("Calculating cutUp and cutLow ....");
2 26 Feb 07 jari 759             for (int i = 0; i < cutUp.length; i++) {
2 26 Feb 07 jari 760                 cutUp[i] = getCutUp(deltaGrid[i]);
2 26 Feb 07 jari 761                 cutLow[i] = getCutLow(deltaGrid[i]);
2 26 Feb 07 jari 762             }
2 26 Feb 07 jari 763             
2 26 Feb 07 jari 764             //System.out.println("cutUp and cutLow calculated");
2 26 Feb 07 jari 765
2 26 Feb 07 jari 766             numSigGenesByDelta = new int[deltaGrid.length];
2 26 Feb 07 jari 767             
2 26 Feb 07 jari 768             //System.out.println("calculating numSigGenesByDelta ...");
2 26 Feb 07 jari 769             
2 26 Feb 07 jari 770             for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 771                 numSigGenesByDelta[i] = getNumSigGenesByDelta(cutUp[i], cutLow[i]);
2 26 Feb 07 jari 772             }
2 26 Feb 07 jari 773             
2 26 Feb 07 jari 774             //System.out.println("numSigGenesByDelta calcuated");
2 26 Feb 07 jari 775             
2 26 Feb 07 jari 776             SAMState.numSigGenesByDelta = numSigGenesByDelta;
2 26 Feb 07 jari 777
2 26 Feb 07 jari 778             medNumFalselyCalledGenesByDelta = new double[deltaGrid.length];
2 26 Feb 07 jari 779             ninetiethPercentileFalselyCalledGenesByDelta = new double[deltaGrid.length];
2 26 Feb 07 jari 780             
2 26 Feb 07 jari 781             //System.out.println("calculating FDR median and 90th percentile ...");
2 26 Feb 07 jari 782             
2 26 Feb 07 jari 783             for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 784                 medNumFalselyCalledGenesByDelta[i] = getMedNumFalselyCalledGenesByDelta(permutedDValues, cutUp[i], cutLow[i]);
2 26 Feb 07 jari 785                 ninetiethPercentileFalselyCalledGenesByDelta[i] = getNinetiethPercentileFalselyCalledGenesByDelta(permutedDValues, cutUp[i], cutLow[i]);
2 26 Feb 07 jari 786             }
2 26 Feb 07 jari 787             for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 788                 medNumFalselyCalledGenesByDelta[i] = pi0Hat*medNumFalselyCalledGenesByDelta[i];
2 26 Feb 07 jari 789                 ninetiethPercentileFalselyCalledGenesByDelta[i] = pi0Hat*ninetiethPercentileFalselyCalledGenesByDelta[i];
2 26 Feb 07 jari 790             }   
2 26 Feb 07 jari 791             
2 26 Feb 07 jari 792             
2 26 Feb 07 jari 793             SAMState.medNumFalselyCalledGenesByDelta = medNumFalselyCalledGenesByDelta;
2 26 Feb 07 jari 794             SAMState.ninetiethPercentileFalselyCalledGenesByDelta = ninetiethPercentileFalselyCalledGenesByDelta;
2 26 Feb 07 jari 795
2 26 Feb 07 jari 796             FDRmedian = new double[deltaGrid.length];
2 26 Feb 07 jari 797             FDR90thPercentile = new double[deltaGrid.length];
2 26 Feb 07 jari 798
2 26 Feb 07 jari 799             for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 800                 FDRmedian[i] = (medNumFalselyCalledGenesByDelta[i]*100d)/numSigGenesByDelta[i];
2 26 Feb 07 jari 801                 FDR90thPercentile[i] = ninetiethPercentileFalselyCalledGenesByDelta[i]*100d/numSigGenesByDelta[i];
2 26 Feb 07 jari 802             }
2 26 Feb 07 jari 803
2 26 Feb 07 jari 804             //System.out.println("FDR median and 90th percentile calculated.");
2 26 Feb 07 jari 805             
2 26 Feb 07 jari 806             SAMState.FDRmedian = FDRmedian;
2 26 Feb 07 jari 807             SAMState.FDR90thPercentile = FDR90thPercentile;
2 26 Feb 07 jari 808             
2 26 Feb 07 jari 809             //qLowestFDR = new double[numGenes]; 
2 26 Feb 07 jari 810                         
2 26 Feb 07 jari 811             // THIS PORTION DELETED FOR SIMON; PROBABLY MAKE OPTIONAL ANYWAY 
2 26 Feb 07 jari 812              
2 26 Feb 07 jari 813             //System.out.println("Calculating qLowesrFDRs ...");
2 26 Feb 07 jari 814            /*
2 26 Feb 07 jari 815             if (calculateQLowestFDR) {
2 26 Feb 07 jari 816                 qLowestFDR = new double[numGenes];
2 26 Feb 07 jari 817                 
2 26 Feb 07 jari 818                 AlgorithmEvent event3 = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, qLowestFDR.length);
2 26 Feb 07 jari 819                 fireValueChanged(event3);
2 26 Feb 07 jari 820                 event3.setId(AlgorithmEvent.PROGRESS_VALUE);  
2 26 Feb 07 jari 821                 
2 26 Feb 07 jari 822                 for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 823                     if (stop) {
2 26 Feb 07 jari 824                         throw new AbortException();
2 26 Feb 07 jari 825                     }
2 26 Feb 07 jari 826                     event3.setIntValue(i);
2 26 Feb 07 jari 827                     event3.setDescription("Calculating q values: Current gene = " + (i+ 1));
2 26 Feb 07 jari 828                     fireValueChanged(event3);
2 26 Feb 07 jari 829                     
2 26 Feb 07 jari 830                     Vector sigDeltaIndices = new Vector();
2 26 Feb 07 jari 831                     for (int j = 0; j < deltaGrid.length; j++) {
2 26 Feb 07 jari 832                         if (isSignificant(i, cutUp[j], cutLow[j])) {
2 26 Feb 07 jari 833                             sigDeltaIndices.add(new Integer(j));
2 26 Feb 07 jari 834                         }
2 26 Feb 07 jari 835                     }
2 26 Feb 07 jari 836                     
2 26 Feb 07 jari 837                     double[] currentGeneFDRs = new double[sigDeltaIndices.size()];
2 26 Feb 07 jari 838                     for (int j = 0; j < sigDeltaIndices.size(); j++) {
2 26 Feb 07 jari 839                         int currentDeltaIndex = ((Integer)sigDeltaIndices.get(j)).intValue();
2 26 Feb 07 jari 840                         double currDelta = deltaGrid[currentDeltaIndex];
2 26 Feb 07 jari 841                         currentGeneFDRs[j] = getMedNumFalselyCalledGenesByDelta(permutedDValues, getCutUp(currDelta), getCutLow(currDelta));
2 26 Feb 07 jari 842                         currentGeneFDRs[j] = (double)(currentGeneFDRs[j]*pi0Hat*100d)/(double)numSigGenesByDelta[currentDeltaIndex];
2 26 Feb 07 jari 843                     }
2 26 Feb 07 jari 844                     if (currentGeneFDRs.length > 0) {
2 26 Feb 07 jari 845                         
2 26 Feb 07 jari 846                         qLowestFDR[i] = getMin(currentGeneFDRs);
2 26 Feb 07 jari 847                         
2 26 Feb 07 jari 848                     } else {
2 26 Feb 07 jari 849                         qLowestFDR[i] = Double.NaN;
2 26 Feb 07 jari 850                     }
2 26 Feb 07 jari 851                     //System.out.println("qLowestFDR[" + i + "] = " + qLowestFDR[i]);
2 26 Feb 07 jari 852                 }
2 26 Feb 07 jari 853             } 
2 26 Feb 07 jari 854             */
2 26 Feb 07 jari 855             
2 26 Feb 07 jari 856             if (calculateQLowestFDR){
2 26 Feb 07 jari 857                 qLowestFDR = new double[numGenes];
2 26 Feb 07 jari 858                 
2 26 Feb 07 jari 859                 AlgorithmEvent event3 = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, qLowestFDR.length);
2 26 Feb 07 jari 860                 fireValueChanged(event3);
2 26 Feb 07 jari 861                 event3.setId(AlgorithmEvent.PROGRESS_VALUE);  
2 26 Feb 07 jari 862                 
2 26 Feb 07 jari 863                 for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 864                     if (stop) {
2 26 Feb 07 jari 865                         throw new AbortException();
2 26 Feb 07 jari 866                     }
2 26 Feb 07 jari 867                     event3.setIntValue(i);
2 26 Feb 07 jari 868                     event3.setDescription("Calculating q values: Current gene = " + (i+ 1));
2 26 Feb 07 jari 869                     fireValueChanged(event3);
2 26 Feb 07 jari 870                     
2 26 Feb 07 jari 871                     //Vector sigDeltaIndices = new Vector();
2 26 Feb 07 jari 872                     int sigDeltaIndex = 0;
2 26 Feb 07 jari 873                     boolean sigFound = false;
2 26 Feb 07 jari 874                     for (int j = deltaGrid.length - 1; j >= 0; j--) {
2 26 Feb 07 jari 875                         if (isSignificant(i, cutUp[j], cutLow[j])) {
2 26 Feb 07 jari 876                             //sigDeltaIndices.add(new Integer(j));
2 26 Feb 07 jari 877                             sigDeltaIndex = j;
2 26 Feb 07 jari 878                             sigFound = true;
2 26 Feb 07 jari 879                             break;
2 26 Feb 07 jari 880                         }
2 26 Feb 07 jari 881                     }
2 26 Feb 07 jari 882                     
2 26 Feb 07 jari 883                     //double[] currentGeneFDRs = new double[sigDeltaIndices.size()];
2 26 Feb 07 jari 884                     //for (int j = 0; j < sigDeltaIndices.size(); j++) {
2 26 Feb 07 jari 885                         //int currentDeltaIndex = ((Integer)sigDeltaIndices.get(j)).intValue();
2 26 Feb 07 jari 886
2 26 Feb 07 jari 887                     //}
2 26 Feb 07 jari 888                     if (sigFound) {
2 26 Feb 07 jari 889                         double currDelta = deltaGrid[sigDeltaIndex];
2 26 Feb 07 jari 890                         qLowestFDR[i] = getMedNumFalselyCalledGenesByDelta(permutedDValues, getCutUp(currDelta), getCutLow(currDelta));
2 26 Feb 07 jari 891                         qLowestFDR[i] = (double)(qLowestFDR[i]*pi0Hat*100d)/(double)numSigGenesByDelta[sigDeltaIndex];                        
2 26 Feb 07 jari 892                         //qLowestFDR[i] = getMin(currentGeneFDRs);                        
2 26 Feb 07 jari 893                     } else {
2 26 Feb 07 jari 894                         qLowestFDR[i] = Double.NaN;
2 26 Feb 07 jari 895                     }
2 26 Feb 07 jari 896                     //System.out.println("qLowestFDR[" + i + "] = " + qLowestFDR[i]);
2 26 Feb 07 jari 897                 }                
2 26 Feb 07 jari 898             } else {
2 26 Feb 07 jari 899                 qLowestFDR = new double[numGenes];
2 26 Feb 07 jari 900             }
2 26 Feb 07 jari 901             
2 26 Feb 07 jari 902             //System.out.println("qLowestFDRs calculated.");
2 26 Feb 07 jari 903             
2 26 Feb 07 jari 904             SAMState.qLowestFDR = qLowestFDR;
2 26 Feb 07 jari 905
2 26 Feb 07 jari 906             FloatMatrix qLowestFDRMatrix = new FloatMatrix(qLowestFDR.length, 1);
2 26 Feb 07 jari 907
2 26 Feb 07 jari 908             for (int i = 0; i < qLowestFDR.length; i++) {
2 26 Feb 07 jari 909                 qLowestFDRMatrix.A[i][0] = (float)(qLowestFDR[i]);
2 26 Feb 07 jari 910             }
2 26 Feb 07 jari 911
2 26 Feb 07 jari 912             /*
2 26 Feb 07 jari 913             try {
2 26 Feb 07 jari 914                 File outfile = new File("deltaGrid_values.txt");
2 26 Feb 07 jari 915                 PrintWriter out = new PrintWriter(new FileOutputStream(outfile));
2 26 Feb 07 jari 916                 out.print("Delta\tMedian # false\t90th percentile false\t#genes called\tFDR% Median\tFDR% 90th percentile\n");
2 26 Feb 07 jari 917                 for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 918                     out.print(deltaGrid[i] +"\t");
2 26 Feb 07 jari 919                     out.print(medNumFalselyCalledGenesByDelta[i] + "\t");
2 26 Feb 07 jari 920                     out.print(ninetiethPercentileFalselyCalledGenesByDelta[i] + "\t");
2 26 Feb 07 jari 921                     out.print(numSigGenesByDelta[i] + "\t");
2 26 Feb 07 jari 922                     out.print(FDRmedian[i] + "\t");
2 26 Feb 07 jari 923                     out.print(FDR90thPercentile[i] + "\t\n");
2 26 Feb 07 jari 924                 }
2 26 Feb 07 jari 925                 out.flush();
2 26 Feb 07 jari 926                 out.close();
2 26 Feb 07 jari 927
2 26 Feb 07 jari 928             } catch (Exception e) {
2 26 Feb 07 jari 929                 e.printStackTrace();
2 26 Feb 07 jari 930             }
2 26 Feb 07 jari 931         
2 26 Feb 07 jari 932
2 26 Feb 07 jari 933             try {
2 26 Feb 07 jari 934                 File outfile = new File("qValues_by_Genes.txt");
2 26 Feb 07 jari 935                 PrintWriter out = new PrintWriter(new FileOutputStream(outfile));
2 26 Feb 07 jari 936
2 26 Feb 07 jari 937                 for (int i = 0; i < qLowestFDR.length; i++) {
2 26 Feb 07 jari 938                     out.print(qLowestFDR[i] +"\n");
2 26 Feb 07 jari 939
2 26 Feb 07 jari 940                 }
2 26 Feb 07 jari 941                 out.flush();
2 26 Feb 07 jari 942                 out.close();
2 26 Feb 07 jari 943
2 26 Feb 07 jari 944             } catch (Exception e) {
2 26 Feb 07 jari 945                 e.printStackTrace();
2 26 Feb 07 jari 946             }
2 26 Feb 07 jari 947              */
2 26 Feb 07 jari 948
2 26 Feb 07 jari 949         } else { // if (usePreviousGraph)
2 26 Feb 07 jari 950             imputedMatrix = SAMState.imputedMatrix;
2 26 Feb 07 jari 951             //oneClassMean = SAMState.oneClassMean;
2 26 Feb 07 jari 952             dBarValues = SAMState.dBarValues;
2 26 Feb 07 jari 953             sortedDArray = SAMState.sortedDArray;
2 26 Feb 07 jari 954             sortedDArrayIndices = SAMState.sortedDArrayIndices;
2 26 Feb 07 jari 955             delta = SAMState.delta;
2 26 Feb 07 jari 956             deltaGrid = SAMState.deltaGrid;
2 26 Feb 07 jari 957             numSigGenesByDelta = SAMState.numSigGenesByDelta;
2 26 Feb 07 jari 958             medNumFalselyCalledGenesByDelta = SAMState.medNumFalselyCalledGenesByDelta;
2 26 Feb 07 jari 959             sNought = SAMState.sNought;
2 26 Feb 07 jari 960             s0Percentile = SAMState.s0Percentile;
2 26 Feb 07 jari 961             pi0Hat = SAMState.pi0Hat;
2 26 Feb 07 jari 962             ninetiethPercentileFalselyCalledGenesByDelta = SAMState.ninetiethPercentileFalselyCalledGenesByDelta;
2 26 Feb 07 jari 963             FDRmedian = SAMState.FDRmedian;
2 26 Feb 07 jari 964             FDR90thPercentile = SAMState.FDR90thPercentile;
2 26 Feb 07 jari 965             qLowestFDR = SAMState.qLowestFDR;
2 26 Feb 07 jari 966             dArray = SAMState.dArray;
2 26 Feb 07 jari 967             rArray =SAMState.rArray;
2 26 Feb 07 jari 968         }
2 26 Feb 07 jari 969         
2 26 Feb 07 jari 970
2 26 Feb 07 jari 971         FloatMatrix dValuesMatrix = new FloatMatrix(dArray.length, 1); // to send to AlgorithmData result
2 26 Feb 07 jari 972         FloatMatrix rValuesMatrix = new FloatMatrix(rArray.length, 1); // to send to AlgorithmData result
2 26 Feb 07 jari 973         for (int i = 0; i < dArray.length; i++) {
2 26 Feb 07 jari 974             dValuesMatrix.A[i][0] = (float)dArray[i];
2 26 Feb 07 jari 975             rValuesMatrix.A[i][0] = (float)rArray[i];
2 26 Feb 07 jari 976         }
2 26 Feb 07 jari 977         
2 26 Feb 07 jari 978         FloatMatrix deltaGridMatrix = new FloatMatrix(deltaGrid.length, 1);
2 26 Feb 07 jari 979         FloatMatrix medNumFalseMatrix = new FloatMatrix(medNumFalselyCalledGenesByDelta.length, 1);
2 26 Feb 07 jari 980         FloatMatrix false90thMatrix = new FloatMatrix(ninetiethPercentileFalselyCalledGenesByDelta.length, 1);
2 26 Feb 07 jari 981         FloatMatrix numSigMatrix = new FloatMatrix(numSigGenesByDelta.length, 1);
2 26 Feb 07 jari 982         FloatMatrix FDRMedianMatrix = new FloatMatrix(FDRmedian.length, 1);
2 26 Feb 07 jari 983         FloatMatrix FDR90thMatrix = new FloatMatrix(FDR90thPercentile.length, 1);
2 26 Feb 07 jari 984         
2 26 Feb 07 jari 985         for (int i = 0; i < deltaGrid.length; i++) {
2 26 Feb 07 jari 986             deltaGridMatrix.A[i][0] = (float)deltaGrid[i];
2 26 Feb 07 jari 987             medNumFalseMatrix.A[i][0] = (float)medNumFalselyCalledGenesByDelta[i];
2 26 Feb 07 jari 988             false90thMatrix.A[i][0] = (float)ninetiethPercentileFalselyCalledGenesByDelta[i];
2 26 Feb 07 jari 989             numSigMatrix.A[i][0] = (float)numSigGenesByDelta[i];
2 26 Feb 07 jari 990             FDRMedianMatrix.A[i][0] = (float)FDRmedian[i];
2 26 Feb 07 jari 991             FDR90thMatrix.A[i][0] = (float)FDR90thPercentile[i];
2 26 Feb 07 jari 992         }   
2 26 Feb 07 jari 993         
2 26 Feb 07 jari 994         FloatMatrix qLowestFDRMatrix = new FloatMatrix(qLowestFDR.length, 1);
2 26 Feb 07 jari 995         
2 26 Feb 07 jari 996         for (int i = 0; i < qLowestFDR.length; i++) {
2 26 Feb 07 jari 997             qLowestFDRMatrix.A[i][0] = (float)(qLowestFDR[i]);
2 26 Feb 07 jari 998         }       
2 26 Feb 07 jari 999         
2 26 Feb 07 jari 1000         //************** DONE UP TO HERE 1/21/03 ***********************
2 26 Feb 07 jari 1001         
2 26 Feb 07 jari 1002         //double delta = (double)(0.25*maxDelta); 
2 26 Feb 07 jari 1003         
2 26 Feb 07 jari 1004         
2 26 Feb 07 jari 1005         
2 26 Feb 07 jari 1006         
2 26 Feb 07 jari 1007         
2 26 Feb 07 jari 1008         //SCRIPTING SUPPORT (JCB)
2 26 Feb 07 jari 1009         
2 26 Feb 07 jari 1010         //check if delta value is deliverd
2 26 Feb 07 jari 1011         float scriptDelta = data.getParams().getFloat("delta", -1f);        
2 26 Feb 07 jari 1012         //if we are scripting this can be T or F, else it's T
2 26 Feb 07 jari 1013         boolean graphInteraction = data.getParams().getBoolean("permit-graph-interaction", true);
2 26 Feb 07 jari 1014         
2 26 Feb 07 jari 1015         if(scriptDelta != -1)
2 26 Feb 07 jari 1016             delta = (double)scriptDelta;        
2 26 Feb 07 jari 1017                    
2 26 Feb 07 jari 1018         SAMGraph sg = new SAMGraph(SAMGUI.SAMFrame, studyDesign, dBarValues, sortedDArray,/* dArray,*/ delta, deltaGrid, numSigGenesByDelta, medNumFalselyCalledGenesByDelta, ninetiethPercentileFalselyCalledGenesByDelta, FDRmedian, FDR90thPercentile, true);
2 26 Feb 07 jari 1019         
2 26 Feb 07 jari 1020         if(graphInteraction) { //if true set the sg visible and get delta from there
2 26 Feb 07 jari 1021              sg.setVisible(true);        
2 26 Feb 07 jari 1022             delta = sg.getDelta();
2 26 Feb 07 jari 1023         }         
2 26 Feb 07 jari 1024         //END SCRIPTING SUPPORT CHANGES (JCB)
2 26 Feb 07 jari 1025         
2 26 Feb 07 jari 1026         
2 26 Feb 07 jari 1027         
2 26 Feb 07 jari 1028         
2 26 Feb 07 jari 1029         delta = sg.getDelta();
2 26 Feb 07 jari 1030         SAMState.delta = delta;
2 26 Feb 07 jari 1031         String numSig = sg.getNumSig();
2 26 Feb 07 jari 1032         String numFalseSigMed = sg.getNumFalseSigMed();
2 26 Feb 07 jari 1033         String numFalseSig90th = sg.getNumFalseSig90th();
2 26 Feb 07 jari 1034         String FDRMedian = sg.getFDRMedian();
2 26 Feb 07 jari 1035         String FDR90th =sg.getFDR90th();
2 26 Feb 07 jari 1036         
2 26 Feb 07 jari 1037         double upperCutoff = getCutUp(delta);
2 26 Feb 07 jari 1038         double lowerCutoff = getCutLow(delta);
2 26 Feb 07 jari 1039         
2 26 Feb 07 jari 1040         FloatMatrix dBarMatrix = new FloatMatrix(dBarValues.length, 1);
2 26 Feb 07 jari 1041         FloatMatrix sortedDMatrix = new FloatMatrix(sortedDArray.length, 1);
2 26 Feb 07 jari 1042         
2 26 Feb 07 jari 1043         for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1044             dBarMatrix.A[i][0] = (float)dBarValues[i];
2 26 Feb 07 jari 1045         }
2 26 Feb 07 jari 1046         for (int i = 0; i < sortedDArray.length; i++) {
2 26 Feb 07 jari 1047             sortedDMatrix.A[i][0] = (float)sortedDArray[i];
2 26 Feb 07 jari 1048         }    
2 26 Feb 07 jari 1049
2 26 Feb 07 jari 1050         FloatMatrix foldChangeMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 1051         if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED)||(studyDesign == SAMInitDialog.TWO_CLASS_PAIRED)) {
2 26 Feb 07 jari 1052             for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 1053                 foldChangeMatrix.A[i][0] = (float)getFoldChange(i);
2 26 Feb 07 jari 1054             }
2 26 Feb 07 jari 1055         }
2 26 Feb 07 jari 1056         
2 26 Feb 07 jari 1057         Vector posSigGenes = new Vector();
2 26 Feb 07 jari 1058         Vector negSigGenes = new Vector();
2 26 Feb 07 jari 1059         Vector nonSigGenes = new Vector();
2 26 Feb 07 jari 1060         
2 26 Feb 07 jari 1061         boolean posSigEncountered = false;
2 26 Feb 07 jari 1062         boolean negSigEncountered = false;
2 26 Feb 07 jari 1063         
2 26 Feb 07 jari 1064         int lowestPosSigIndex = 0;
2 26 Feb 07 jari 1065         int highestNegSigIndex = 0;
2 26 Feb 07 jari 1066         
2 26 Feb 07 jari 1067         for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1068             if ( (dBarValues[i] > 0.0d) && ((sortedDArray[i] - dBarValues[i]) > delta) ) {
2 26 Feb 07 jari 1069                 lowestPosSigIndex = i;
2 26 Feb 07 jari 1070                 posSigEncountered = true;
2 26 Feb 07 jari 1071                 break;
2 26 Feb 07 jari 1072             }
2 26 Feb 07 jari 1073         }
2 26 Feb 07 jari 1074         
2 26 Feb 07 jari 1075         for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1076             if ( (dBarValues[i] < 0.0d) && ((dBarValues[i] - sortedDArray[i]) > delta) ) {
2 26 Feb 07 jari 1077                 highestNegSigIndex = i;
2 26 Feb 07 jari 1078                 negSigEncountered = true; 
2 26 Feb 07 jari 1079             }
2 26 Feb 07 jari 1080         }
2 26 Feb 07 jari 1081         
2 26 Feb 07 jari 1082         //System.out.println("sortedDArrayIndices.length = " + sortedDArrayIndices.length);
2 26 Feb 07 jari 1083         
2 26 Feb 07 jari 1084         boolean useFoldChange = sg.useFoldChange();
2 26 Feb 07 jari 1085         double foldChange = 0d;
2 26 Feb 07 jari 1086         if ((useFoldChange)&& ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) || (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED))) {
2 26 Feb 07 jari 1087             foldChange = sg.getFoldChangeValue();
2 26 Feb 07 jari 1088             
2 26 Feb 07 jari 1089             if ((posSigEncountered)&&(negSigEncountered)) {
2 26 Feb 07 jari 1090                 for (int i = 0; i < (highestNegSigIndex + 1); i++) {
2 26 Feb 07 jari 1091                     if (satisfiesNegFoldChangeCriterion(foldChange, sortedDArrayIndices[i])) {
2 26 Feb 07 jari 1092                         negSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1093                     } else {
2 26 Feb 07 jari 1094                         nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1095                     }
2 26 Feb 07 jari 1096                 }
2 26 Feb 07 jari 1097                 
2 26 Feb 07 jari 1098                 for (int i = (highestNegSigIndex + 1); i < lowestPosSigIndex; i++) {
2 26 Feb 07 jari 1099                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1100                 }
2 26 Feb 07 jari 1101                 
2 26 Feb 07 jari 1102                 for (int i = lowestPosSigIndex; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1103                     if (satisfiesPosFoldChangeCriterion(foldChange, sortedDArrayIndices[i])) {
2 26 Feb 07 jari 1104                         posSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1105                     } else {
2 26 Feb 07 jari 1106                         nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1107                     }
2 26 Feb 07 jari 1108                 }
2 26 Feb 07 jari 1109                 
2 26 Feb 07 jari 1110             } else if((posSigEncountered)&&(!negSigEncountered)) {
2 26 Feb 07 jari 1111                 for (int i = 0; i < lowestPosSigIndex; i++) {
2 26 Feb 07 jari 1112                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1113                 }
2 26 Feb 07 jari 1114                 
2 26 Feb 07 jari 1115                 for (int i = lowestPosSigIndex; i < dBarValues.length; i++) {                    
2 26 Feb 07 jari 1116                     if (satisfiesPosFoldChangeCriterion(foldChange, sortedDArrayIndices[i])) {
2 26 Feb 07 jari 1117                         posSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1118                     } else {
2 26 Feb 07 jari 1119                         nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1120                     }
2 26 Feb 07 jari 1121                 }
2 26 Feb 07 jari 1122             } else if ((!posSigEncountered) && (negSigEncountered)) {
2 26 Feb 07 jari 1123                 for (int i = 0; i < (highestNegSigIndex + 1); i++) {
2 26 Feb 07 jari 1124                     if (satisfiesNegFoldChangeCriterion(foldChange, sortedDArrayIndices[i])) {
2 26 Feb 07 jari 1125                         negSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1126                     } else {
2 26 Feb 07 jari 1127                         nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1128                     }
2 26 Feb 07 jari 1129                 }
2 26 Feb 07 jari 1130                 for (int i = (highestNegSigIndex + 1); i < dBarValues.length; i++) {
2 26 Feb 07 jari 1131                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1132                 }
2 26 Feb 07 jari 1133             } else if ((!posSigEncountered) && (!negSigEncountered)) {
2 26 Feb 07 jari 1134                 for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1135                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1136                 }
2 26 Feb 07 jari 1137             }            
2 26 Feb 07 jari 1138             
2 26 Feb 07 jari 1139         } else {
2 26 Feb 07 jari 1140            
2 26 Feb 07 jari 1141             if ((posSigEncountered)&&(negSigEncountered)) {
2 26 Feb 07 jari 1142                 for (int i = 0; i < (highestNegSigIndex + 1); i++) {
2 26 Feb 07 jari 1143                     negSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1144                 }
2 26 Feb 07 jari 1145                 
2 26 Feb 07 jari 1146                 for (int i = (highestNegSigIndex + 1); i < lowestPosSigIndex; i++) {
2 26 Feb 07 jari 1147                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1148                 }
2 26 Feb 07 jari 1149                 
2 26 Feb 07 jari 1150                 for (int i = lowestPosSigIndex; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1151                     posSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1152                 }
2 26 Feb 07 jari 1153                 
2 26 Feb 07 jari 1154             } else if((posSigEncountered)&&(!negSigEncountered)) {
2 26 Feb 07 jari 1155                 for (int i = 0; i < lowestPosSigIndex; i++) {
2 26 Feb 07 jari 1156                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1157                 }
2 26 Feb 07 jari 1158                 
2 26 Feb 07 jari 1159                 for (int i = lowestPosSigIndex; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1160                     posSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1161                 }
2 26 Feb 07 jari 1162             } else if ((!posSigEncountered) && (negSigEncountered)) {
2 26 Feb 07 jari 1163                 for (int i = 0; i < (highestNegSigIndex + 1); i++) {
2 26 Feb 07 jari 1164                     negSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1165                 }
2 26 Feb 07 jari 1166                 for (int i = (highestNegSigIndex + 1); i < dBarValues.length; i++) {
2 26 Feb 07 jari 1167                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1168                 }
2 26 Feb 07 jari 1169             } else if ((!posSigEncountered) && (!negSigEncountered)) {
2 26 Feb 07 jari 1170                 for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1171                     nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1172                 }
2 26 Feb 07 jari 1173             }
2 26 Feb 07 jari 1174         }
2 26 Feb 07 jari 1175         
2 26 Feb 07 jari 1176
2 26 Feb 07 jari 1177         /*
2 26 Feb 07 jari 1178         for (int i = 0; i < dArray.length; i++) {
2 26 Feb 07 jari 1179             if ( ((sortedDArray[i] - dBarValues[i]) > delta) && (sortedDArray[i] > 0.0d) ) {
2 26 Feb 07 jari 1180                 posSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1181             } else if ( ((sortedDArray[i] - dBarValues[i]) < (-1.0d)*delta) && (sortedDArray[i] < 0.0d) ) {
2 26 Feb 07 jari 1182                 negSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1183             } else {
2 26 Feb 07 jari 1184                 nonSigGenes.add(new Integer(sortedDArrayIndices[i]));
2 26 Feb 07 jari 1185             }
2 26 Feb 07 jari 1186         }
2 26 Feb 07 jari 1187          */
2 26 Feb 07 jari 1188         
2 26 Feb 07 jari 1189         /*
2 26 Feb 07 jari 1190         FloatMatrix fakeMatrix = new FloatMatrix(numGenes, 2); //just to print out d and dBar Values to a file for debugging
2 26 Feb 07 jari 1191         
2 26 Feb 07 jari 1192         
2 26 Feb 07 jari 1193         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 1194             fakeMatrix.A[i][0] = sortedDArray[i];
2 26 Feb 07 jari 1195             fakeMatrix.A[i][1] = dBarValues[i];
2 26 Feb 07 jari 1196         }
2 26 Feb 07 jari 1197         try {
2 26 Feb 07 jari 1198             printMatrix(fakeMatrix, "dVsdBar.txt");
2 26 Feb 07 jari 1199         } catch (Exception e) {
2 26 Feb 07 jari 1200             e.printStackTrace();
2 26 Feb 07 jari 1201         }
2 26 Feb 07 jari 1202          */
2 26 Feb 07 jari 1203         
2 26 Feb 07 jari 1204         //System.out.println("posSigGenes.size() = " + posSigGenes.size() + ", negSigGenes.size() = " + negSigGenes.size() + ", nonSigGenes.size() = " + nonSigGenes.size());
2 26 Feb 07 jari 1205         
2 26 Feb 07 jari 1206         Vector allSigGenes = new Vector();
2 26 Feb 07 jari 1207         allSigGenes.addAll(posSigGenes);
2 26 Feb 07 jari 1208         allSigGenes.addAll(negSigGenes);
2 26 Feb 07 jari 1209         
2 26 Feb 07 jari 1210         if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) || (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) || (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) || (studyDesign == SAMInitDialog.ONE_CLASS)) {
2 26 Feb 07 jari 1211             k = 4; //# of clusters;
2 26 Feb 07 jari 1212         } else {
2 26 Feb 07 jari 1213             k = 2;
2 26 Feb 07 jari 1214         }
2 26 Feb 07 jari 1215         clusters = new Vector[k];
2 26 Feb 07 jari 1216         if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) || (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) || (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) || (studyDesign == SAMInitDialog.ONE_CLASS)) {        
2 26 Feb 07 jari 1217             clusters[0] = posSigGenes;
2 26 Feb 07 jari 1218             clusters[1] = negSigGenes;
2 26 Feb 07 jari 1219             clusters[2] = allSigGenes;
2 26 Feb 07 jari 1220             clusters[3] = nonSigGenes;
2 26 Feb 07 jari 1221         } else {
2 26 Feb 07 jari 1222             clusters[0] = posSigGenes;
2 26 Feb 07 jari 1223             clusters[1] = nonSigGenes;            
2 26 Feb 07 jari 1224         }
2 26 Feb 07 jari 1225         
2 26 Feb 07 jari 1226   FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 1227   FloatMatrix variances = getVariances(clusters, means);        
2 26 Feb 07 jari 1228         
2 26 Feb 07 jari 1229         AlgorithmEvent event = null;
2 26 Feb 07 jari 1230   if (hierarchical_tree) {
2 26 Feb 07 jari 1231       event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 1232       fireValueChanged(event);
2 26 Feb 07 jari 1233       event.setIntValue(0);
2 26 Feb 07 jari 1234       event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 1235       fireValueChanged(event);
2 26 Feb 07 jari 1236   }
2 26 Feb 07 jari 1237         
2 26 Feb 07 jari 1238   Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 1239   NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 1240   int[] features;        
2 26 Feb 07 jari 1241   for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 1242       if (stop) {
2 26 Feb 07 jari 1243     throw new AbortException();
2 26 Feb 07 jari 1244       }
2 26 Feb 07 jari 1245       features = convert2int(clusters[i]);
2 26 Feb 07 jari 1246       Node node = new Node(features);
2 26 Feb 07 jari 1247       nodeList.addNode(node);
2 26 Feb 07 jari 1248       if (hierarchical_tree) {
2 26 Feb 07 jari 1249                if (drawSigTreesOnly) {
2 26 Feb 07 jari 1250                    if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) || (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) || (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) || (studyDesign == SAMInitDialog.ONE_CLASS)) {
2 26 Feb 07 jari 1251                        if ((i == 0) || (i == 1) || (i == 2)) {
2 26 Feb 07 jari 1252                            node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 1253                            event.setIntValue(i+1);
2 26 Feb 07 jari 1254                            fireValueChanged(event);
2 26 Feb 07 jari 1255                        }                
2 26 Feb 07 jari 1256                    } else {
2 26 Feb 07 jari 1257                        if (i == 0) {
2 26 Feb 07 jari 1258                            node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 1259                            event.setIntValue(i+1);
2 26 Feb 07 jari 1260                            fireValueChanged(event);
2 26 Feb 07 jari 1261                        }                       
2 26 Feb 07 jari 1262                    }
2 26 Feb 07 jari 1263                    
2 26 Feb 07 jari 1264                } else {
2 26 Feb 07 jari 1265     node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 1266     event.setIntValue(i+1);
2 26 Feb 07 jari 1267     fireValueChanged(event);
2 26 Feb 07 jari 1268                }
2 26 Feb 07 jari 1269       }
2 26 Feb 07 jari 1270   }  
2 26 Feb 07 jari 1271         
2 26 Feb 07 jari 1272   // prepare the result
2 26 Feb 07 jari 1273   AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 1274   result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 1275   result.addParam("number-of-clusters", String.valueOf(clusters.length));
2 26 Feb 07 jari 1276         result.addParam("numSigGenes", String.valueOf(numSig));
2 26 Feb 07 jari 1277         result.addParam("numFalseSigMed", String.valueOf(numFalseSigMed));
2 26 Feb 07 jari 1278         result.addParam("numFalseSig90th", numFalseSig90th);
2 26 Feb 07 jari 1279         result.addParam("FDRMedian", FDRMedian);
2 26 Feb 07 jari 1280         result.addParam("FDR90th", FDR90th);
2 26 Feb 07 jari 1281         result.addParam("useFoldChange", String.valueOf(useFoldChange));
2 26 Feb 07 jari 1282         result.addParam("foldChangeValue", String.valueOf((float)foldChange));
2 26 Feb 07 jari 1283   //result.addParam("unassigned-genes-exist", String.valueOf(unassignedExists));
2 26 Feb 07 jari 1284   result.addMatrix("clusters_means", means);
2 26 Feb 07 jari 1285   result.addMatrix("clusters_variances", variances);
2 26 Feb 07 jari 1286         result.addParam("delta", String.valueOf((float)delta));
2 26 Feb 07 jari 1287         if (Double.isInfinite(upperCutoff)) {
2 26 Feb 07 jari 1288             result.addParam("upperCutoff", String.valueOf(Float.POSITIVE_INFINITY));
2 26 Feb 07 jari 1289         } else {
2 26 Feb 07 jari 1290             result.addParam("upperCutoff", String.valueOf((float)upperCutoff));
2 26 Feb 07 jari 1291         }
2 26 Feb 07 jari 1292         if (Double.isInfinite(lowerCutoff)) {
2 26 Feb 07 jari 1293             result.addParam("lowerCutoff", String.valueOf(Float.NEGATIVE_INFINITY));
2 26 Feb 07 jari 1294         } else {
2 26 Feb 07 jari 1295             result.addParam("lowerCutoff", String.valueOf((float)lowerCutoff));
2 26 Feb 07 jari 1296         }
2 26 Feb 07 jari 1297         result.addParam("sNought", String.valueOf((float)sNought));
2 26 Feb 07 jari 1298         result.addParam("s0Percentile", String.valueOf((float)s0Percentile));
2 26 Feb 07 jari 1299         result.addParam("pi0Hat", String.valueOf((float)pi0Hat));
2 26 Feb 07 jari 1300         result.addMatrix("dValuesMatrix", dValuesMatrix);
2 26 Feb 07 jari 1301         result.addMatrix("rValuesMatrix", rValuesMatrix);
2 26 Feb 07 jari 1302         result.addMatrix("foldChangeMatrix", foldChangeMatrix);
2 26 Feb 07 jari 1303         result.addMatrix("dBarMatrixX", dBarMatrix);
2 26 Feb 07 jari 1304         result.addMatrix("sortedDMatrixY", sortedDMatrix);
2 26 Feb 07 jari 1305         result.addMatrix("qLowestFDRMatrix", qLowestFDRMatrix);
2 26 Feb 07 jari 1306         result.addMatrix("deltaGridMatrix", deltaGridMatrix);
2 26 Feb 07 jari 1307         result.addMatrix("medNumFalseMatrix", medNumFalseMatrix);
2 26 Feb 07 jari 1308         result.addMatrix("false90thMatrix", false90thMatrix);
2 26 Feb 07 jari 1309         result.addMatrix("numSigMatrix", numSigMatrix);
2 26 Feb 07 jari 1310         result.addMatrix("FDRMedianMatrix", FDRMedianMatrix);
2 26 Feb 07 jari 1311         result.addMatrix("FDR90thMatrix", FDR90thMatrix);
2 26 Feb 07 jari 1312         result.addMatrix("imputedMatrix", imputedMatrix);
2 26 Feb 07 jari 1313         //result.addParam("study-design", String.valueOf(studyDesign));
2 26 Feb 07 jari 1314   return result;        
2 26 Feb 07 jari 1315         //System.out.println("Matrices imputed");
2 26 Feb 07 jari 1316         
2 26 Feb 07 jari 1317         /*
2 26 Feb 07 jari 1318         try {
2 26 Feb 07 jari 1319             printMatrix(expMatrix, "expMatrix.txt");
2 26 Feb 07 jari 1320             printMatrix(imputedMatrix, "imputedMatrix.txt");
2 26 Feb 07 jari 1321         } catch (Exception e) {
2 26 Feb 07 jari 1322             e.printStackTrace();
2 26 Feb 07 jari 1323         }
2 26 Feb 07 jari 1324          */
2 26 Feb 07 jari 1325          
2 26 Feb 07 jari 1326     }
2 26 Feb 07 jari 1327     
2 26 Feb 07 jari 1328     public void abort() {
2 26 Feb 07 jari 1329         stop = true;
2 26 Feb 07 jari 1330     }
2 26 Feb 07 jari 1331
2 26 Feb 07 jari 1332     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 1333   NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 1334   AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 1335   FloatMatrix experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 1336   data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 1337         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 1338         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 1339         data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 1340   HCL hcl = new HCL();
2 26 Feb 07 jari 1341   AlgorithmData result;
2 26 Feb 07 jari 1342   if (genes) {
2 26 Feb 07 jari 1343       data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 1344       result = hcl.execute(data);
2 26 Feb 07 jari 1345       validate(result);
2 26 Feb 07 jari 1346       addNodeValues(nodeList, result);
2 26 Feb 07 jari 1347   }
2 26 Feb 07 jari 1348   if (experiments) {
2 26 Feb 07 jari 1349       data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 1350       result = hcl.execute(data);
2 26 Feb 07 jari 1351       validate(result);
2 26 Feb 07 jari 1352       addNodeValues(nodeList, result);
2 26 Feb 07 jari 1353   }
2 26 Feb 07 jari 1354   return nodeList;
2 26 Feb 07 jari 1355     }
2 26 Feb 07 jari 1356     
2 26 Feb 07 jari 1357     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 1358   target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 1359   target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 1360   target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 1361   target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 1362     } 
2 26 Feb 07 jari 1363     
2 26 Feb 07 jari 1364     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 1365   FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 1366   for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 1367       subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 1368   }
2 26 Feb 07 jari 1369   return subExperiment;
2 26 Feb 07 jari 1370     }  
2 26 Feb 07 jari 1371     
2 26 Feb 07 jari 1372     /**
2 26 Feb 07 jari 1373      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 1374      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 1375      */
2 26 Feb 07 jari 1376     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 1377   if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 1378       throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 1379   }
2 26 Feb 07 jari 1380   if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 1381       throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 1382   }
2 26 Feb 07 jari 1383   if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 1384       throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 1385   }
2 26 Feb 07 jari 1386   if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 1387       throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 1388   }
2 26 Feb 07 jari 1389     }    
2 26 Feb 07 jari 1390
2 26 Feb 07 jari 1391     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 1392   int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 1393   for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 1394       int_matrix[i] = (int)((Integer)source.get(i)).intValue();
2 26 Feb 07 jari 1395   }
2 26 Feb 07 jari 1396   return int_matrix;
2 26 Feb 07 jari 1397     }
2 26 Feb 07 jari 1398     
2 26 Feb 07 jari 1399     private FloatMatrix getMeans(Vector[] clusters) {
2 26 Feb 07 jari 1400   FloatMatrix means = new FloatMatrix(clusters.length, numExps);
2 26 Feb 07 jari 1401   FloatMatrix mean;
2 26 Feb 07 jari 1402   for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 1403       mean = getMean(clusters[i]);
2 26 Feb 07 jari 1404       means.A[i] = mean.A[0];
2 26 Feb 07 jari 1405   }
2 26 Feb 07 jari 1406   return means;
2 26 Feb 07 jari 1407     }   
2 26 Feb 07 jari 1408     
2 26 Feb 07 jari 1409     private FloatMatrix getMean(Vector cluster) {
2 26 Feb 07 jari 1410   FloatMatrix mean = new FloatMatrix(1, numExps);
2 26 Feb 07 jari 1411   float currentMean;
2 26 Feb 07 jari 1412   int n = cluster.size();
2 26 Feb 07 jari 1413   int denom = 0;
2 26 Feb 07 jari 1414   float value;
2 26 Feb 07 jari 1415   for (int i=0; i<numExps; i++) {
2 26 Feb 07 jari 1416             //System.out.println("getMean(): i = " + i);
2 26 Feb 07 jari 1417       currentMean = 0f;
2 26 Feb 07 jari 1418       denom = 0;
2 26 Feb 07 jari 1419       for (int j=0; j<n; j++) {
2 26 Feb 07 jari 1420                 //System.out.println("getMean(): j = " + j);
2 26 Feb 07 jari 1421     value = expMatrix.get(((Integer) cluster.get(j)).intValue(), i);
2 26 Feb 07 jari 1422     if (!Float.isNaN(value)) {
2 26 Feb 07 jari 1423         currentMean += value;
2 26 Feb 07 jari 1424         denom++;
2 26 Feb 07 jari 1425     }
2 26 Feb 07 jari 1426       }
2 26 Feb 07 jari 1427       mean.set(0, i, currentMean/(float)denom);
2 26 Feb 07 jari 1428   }
2 26 Feb 07 jari 1429   
2 26 Feb 07 jari 1430   return mean;
2 26 Feb 07 jari 1431     }  
2 26 Feb 07 jari 1432     
2 26 Feb 07 jari 1433     private FloatMatrix getVariances(Vector[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 1434   final int rows = means.getRowDimension();
2 26 Feb 07 jari 1435   final int columns = means.getColumnDimension();
2 26 Feb 07 jari 1436   FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 1437   for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 1438       for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 1439     variances.set(row, column, getSampleVariance(clusters[row], column, means.get(row, column)));
2 26 Feb 07 jari 1440       }
2 26 Feb 07 jari 1441   }
2 26 Feb 07 jari 1442   return variances;
2 26 Feb 07 jari 1443     } 
2 26 Feb 07 jari 1444     
2 26 Feb 07 jari 1445     int validN;
2 26 Feb 07 jari 1446     
2 26 Feb 07 jari 1447     private float getSampleNormalizedSum(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 1448   final int size = cluster.size();
2 26 Feb 07 jari 1449   float sum = 0f;
2 26 Feb 07 jari 1450   float value;
2 26 Feb 07 jari 1451   validN = 0;
2 26 Feb 07 jari 1452   for (int i=0; i<size; i++) {
2 26 Feb 07 jari 1453       value = expMatrix.get(((Integer) cluster.get(i)).intValue(), column);
2 26 Feb 07 jari 1454       if (!Float.isNaN(value)) {
2 26 Feb 07 jari 1455     sum += Math.pow(value-mean, 2);
2 26 Feb 07 jari 1456     validN++;
2 26 Feb 07 jari 1457       }
2 26 Feb 07 jari 1458   }
2 26 Feb 07 jari 1459   return sum;
2 26 Feb 07 jari 1460     }  
2 26 Feb 07 jari 1461     
2 26 Feb 07 jari 1462     private float getSampleVariance(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 1463   return(float)Math.sqrt(getSampleNormalizedSum(cluster, column, mean)/(float)(validN-1));
2 26 Feb 07 jari 1464   
2 26 Feb 07 jari 1465     } 
2 26 Feb 07 jari 1466     
2 26 Feb 07 jari 1467     
2 26 Feb 07 jari 1468     private boolean belongsInArray(int i, int[] arr) {
2 26 Feb 07 jari 1469   boolean belongs = false;
2 26 Feb 07 jari 1470   
2 26 Feb 07 jari 1471   for (int j = 0; j < arr.length; j++) {
2 26 Feb 07 jari 1472       if (i == arr[j]) {
2 26 Feb 07 jari 1473     belongs = true;
2 26 Feb 07 jari 1474     break;
2 26 Feb 07 jari 1475       }
2 26 Feb 07 jari 1476   }
2 26 Feb 07 jari 1477   
2 26 Feb 07 jari 1478   return belongs;
2 26 Feb 07 jari 1479     }    
2 26 Feb 07 jari 1480     
2 26 Feb 07 jari 1481     private double getFoldChange(int gene) {
2 26 Feb 07 jari 1482         float[] currentGene = new float[numExps];
2 26 Feb 07 jari 1483         for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 1484             currentGene[i] = imputedMatrix.A[gene][i];
2 26 Feb 07 jari 1485         }
2 26 Feb 07 jari 1486         double unloggedCurrentGene[] = new double[currentGene.length];
2 26 Feb 07 jari 1487         
2 26 Feb 07 jari 1488         for (int i = 0; i < unloggedCurrentGene.length; i++) {
2 26 Feb 07 jari 1489             unloggedCurrentGene[i] = Math.pow(2, (double)currentGene[i]);
2 26 Feb 07 jari 1490         }
2 26 Feb 07 jari 1491         
2 26 Feb 07 jari 1492         double[] groupAValues = new double[1];
2 26 Feb 07 jari 1493         double[] groupBValues = new double[1];
2 26 Feb 07 jari 1494
2 26 Feb 07 jari 1495         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 1496             int groupACounter = 0;
2 26 Feb 07 jari 1497             int groupBCounter = 0;
2 26 Feb 07 jari 1498             
2 26 Feb 07 jari 1499             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1500                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1501                     groupACounter++;
2 26 Feb 07 jari 1502                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1503                     groupBCounter++;
2 26 Feb 07 jari 1504                 }
2 26 Feb 07 jari 1505             }
2 26 Feb 07 jari 1506             
2 26 Feb 07 jari 1507             groupAValues = new double[groupACounter];
2 26 Feb 07 jari 1508             groupBValues = new double[groupBCounter];
2 26 Feb 07 jari 1509             int groupAIndex = 0;
2 26 Feb 07 jari 1510             int groupBIndex = 0;
2 26 Feb 07 jari 1511             
2 26 Feb 07 jari 1512             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1513                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1514                     groupAValues[groupAIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1515                     groupAIndex++;
2 26 Feb 07 jari 1516                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1517                     groupBValues[groupBIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1518                     groupBIndex++;
2 26 Feb 07 jari 1519                 }
2 26 Feb 07 jari 1520             }
2 26 Feb 07 jari 1521             
2 26 Feb 07 jari 1522         } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 1523             groupAValues = new double[pairedGroupAExpts.length];
2 26 Feb 07 jari 1524             groupBValues = new double[pairedGroupBExpts.length];
2 26 Feb 07 jari 1525             
2 26 Feb 07 jari 1526             for (int i = 0; i < groupAValues.length; i++) {
2 26 Feb 07 jari 1527                 groupAValues[i] = unloggedCurrentGene[pairedGroupAExpts[i]];
2 26 Feb 07 jari 1528                 groupBValues[i] = unloggedCurrentGene[pairedGroupBExpts[i]];
2 26 Feb 07 jari 1529             }
2 26 Feb 07 jari 1530         }
2 26 Feb 07 jari 1531         
2 26 Feb 07 jari 1532         double meanA = getMean(groupAValues);
2 26 Feb 07 jari 1533         double meanB = getMean(groupBValues);   
2 26 Feb 07 jari 1534         
2 26 Feb 07 jari 1535         return (double)(meanB/meanA);
2 26 Feb 07 jari 1536     }
2 26 Feb 07 jari 1537     
2 26 Feb 07 jari 1538     private boolean satisfiesPosFoldChangeCriterion(double fold, int gene) {
2 26 Feb 07 jari 1539         //System.out.println("Pos: fold = " + fold);
2 26 Feb 07 jari 1540         boolean satisfies = false;
2 26 Feb 07 jari 1541         float[] currentGene = new float[numExps];
2 26 Feb 07 jari 1542         for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 1543             currentGene[i] = imputedMatrix.A[gene][i];
2 26 Feb 07 jari 1544         }
2 26 Feb 07 jari 1545         double unloggedCurrentGene[] = new double[currentGene.length];
2 26 Feb 07 jari 1546         
2 26 Feb 07 jari 1547         for (int i = 0; i < unloggedCurrentGene.length; i++) {
2 26 Feb 07 jari 1548             unloggedCurrentGene[i] = Math.pow(2, (double)currentGene[i]);
2 26 Feb 07 jari 1549         }
2 26 Feb 07 jari 1550         
2 26 Feb 07 jari 1551         double[] groupAValues = new double[1];
2 26 Feb 07 jari 1552         double[] groupBValues = new double[1];        
2 26 Feb 07 jari 1553
2 26 Feb 07 jari 1554         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 1555             int groupACounter = 0;
2 26 Feb 07 jari 1556             int groupBCounter = 0;
2 26 Feb 07 jari 1557             
2 26 Feb 07 jari 1558             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1559                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1560                     groupACounter++;
2 26 Feb 07 jari 1561                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1562                     groupBCounter++;
2 26 Feb 07 jari 1563                 }
2 26 Feb 07 jari 1564             }
2 26 Feb 07 jari 1565             
2 26 Feb 07 jari 1566             groupAValues = new double[groupACounter];
2 26 Feb 07 jari 1567             groupBValues = new double[groupBCounter];
2 26 Feb 07 jari 1568             int groupAIndex = 0;
2 26 Feb 07 jari 1569             int groupBIndex = 0;
2 26 Feb 07 jari 1570             
2 26 Feb 07 jari 1571             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1572                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1573                     groupAValues[groupAIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1574                     groupAIndex++;
2 26 Feb 07 jari 1575                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1576                     groupBValues[groupBIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1577                     groupBIndex++;
2 26 Feb 07 jari 1578                 }
2 26 Feb 07 jari 1579             }
2 26 Feb 07 jari 1580         } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 1581             groupAValues = new double[pairedGroupAExpts.length];
2 26 Feb 07 jari 1582             groupBValues = new double[pairedGroupBExpts.length];
2 26 Feb 07 jari 1583             
2 26 Feb 07 jari 1584             for (int i = 0; i < groupAValues.length; i++) {
2 26 Feb 07 jari 1585                 groupAValues[i] = unloggedCurrentGene[pairedGroupAExpts[i]];
2 26 Feb 07 jari 1586                 groupBValues[i] = unloggedCurrentGene[pairedGroupBExpts[i]];
2 26 Feb 07 jari 1587             }            
2 26 Feb 07 jari 1588         }
2 26 Feb 07 jari 1589         
2 26 Feb 07 jari 1590         double meanA = getMean(groupAValues);
2 26 Feb 07 jari 1591         double meanB = getMean(groupBValues);
2 26 Feb 07 jari 1592         
2 26 Feb 07 jari 1593         if ((meanA <= 0)|| (meanB <= 0)) {
2 26 Feb 07 jari 1594             return false;
2 26 Feb 07 jari 1595         }
2 26 Feb 07 jari 1596         
2 26 Feb 07 jari 1597         if (Math.abs((double)(meanB/meanA)) >=  fold) {
2 26 Feb 07 jari 1598             //System.out.println("Pos: gene " + gene + ", fold change = " +  (float)Math.abs((double)(meanB/meanA)) + ", getFoldChange(" + gene + ") = " + getFoldChange(gene) );
2 26 Feb 07 jari 1599             return true;
2 26 Feb 07 jari 1600         } else {
2 26 Feb 07 jari 1601             return false;
2 26 Feb 07 jari 1602         }
2 26 Feb 07 jari 1603         
2 26 Feb 07 jari 1604         //return false;
2 26 Feb 07 jari 1605     }
2 26 Feb 07 jari 1606
2 26 Feb 07 jari 1607     private boolean satisfiesNegFoldChangeCriterion(double fold, int gene) {
2 26 Feb 07 jari 1608         //System.out.println("Neg: fold = " + fold);
2 26 Feb 07 jari 1609         boolean satisfies = false;
2 26 Feb 07 jari 1610         float[] currentGene = new float[numExps];
2 26 Feb 07 jari 1611         for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 1612             currentGene[i] = imputedMatrix.A[gene][i];
2 26 Feb 07 jari 1613         }
2 26 Feb 07 jari 1614         double unloggedCurrentGene[] = new double[currentGene.length];
2 26 Feb 07 jari 1615         
2 26 Feb 07 jari 1616         for (int i = 0; i < unloggedCurrentGene.length; i++) {
2 26 Feb 07 jari 1617             unloggedCurrentGene[i] = Math.pow(2, (double)currentGene[i]);
2 26 Feb 07 jari 1618         }
2 26 Feb 07 jari 1619         
2 26 Feb 07 jari 1620         double[] groupAValues = new double[1];
2 26 Feb 07 jari 1621         double[] groupBValues = new double[1];        
2 26 Feb 07 jari 1622
2 26 Feb 07 jari 1623         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 1624             int groupACounter = 0;
2 26 Feb 07 jari 1625             int groupBCounter = 0;
2 26 Feb 07 jari 1626             
2 26 Feb 07 jari 1627             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1628                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1629                     groupACounter++;
2 26 Feb 07 jari 1630                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1631                     groupBCounter++;
2 26 Feb 07 jari 1632                 }
2 26 Feb 07 jari 1633             }
2 26 Feb 07 jari 1634             
2 26 Feb 07 jari 1635             groupAValues = new double[groupACounter];
2 26 Feb 07 jari 1636             groupBValues = new double[groupBCounter];
2 26 Feb 07 jari 1637             int groupAIndex = 0;
2 26 Feb 07 jari 1638             int groupBIndex = 0;
2 26 Feb 07 jari 1639             
2 26 Feb 07 jari 1640             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1641                 if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 1642                     groupAValues[groupAIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1643                     groupAIndex++;
2 26 Feb 07 jari 1644                 } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 1645                     groupBValues[groupBIndex] = unloggedCurrentGene[i];
2 26 Feb 07 jari 1646                     groupBIndex++;
2 26 Feb 07 jari 1647                 }
2 26 Feb 07 jari 1648             }
2 26 Feb 07 jari 1649             
2 26 Feb 07 jari 1650         } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 1651             groupAValues = new double[pairedGroupAExpts.length];
2 26 Feb 07 jari 1652             groupBValues = new double[pairedGroupBExpts.length];
2 26 Feb 07 jari 1653             
2 26 Feb 07 jari 1654             for (int i = 0; i < groupAValues.length; i++) {
2 26 Feb 07 jari 1655                 groupAValues[i] = unloggedCurrentGene[pairedGroupAExpts[i]];
2 26 Feb 07 jari 1656                 groupBValues[i] = unloggedCurrentGene[pairedGroupBExpts[i]];
2 26 Feb 07 jari 1657             }              
2 26 Feb 07 jari 1658         }
2 26 Feb 07 jari 1659         
2 26 Feb 07 jari 1660         double meanA = getMean(groupAValues);
2 26 Feb 07 jari 1661         double meanB = getMean(groupBValues);
2 26 Feb 07 jari 1662         
2 26 Feb 07 jari 1663         if ((meanA <= 0)|| (meanB <= 0)) {
2 26 Feb 07 jari 1664             return false;
2 26 Feb 07 jari 1665         }
2 26 Feb 07 jari 1666         
2 26 Feb 07 jari 1667         if (Math.abs((double)(meanB/meanA)) <= (double)(1/fold)) {
2 26 Feb 07 jari 1668             //System.out.println("Neg: gene " + gene + ", fold change = " +  (float)Math.abs((double)(meanA/meanB)) + ", getFoldChange(" + gene + ") = " + getFoldChange(gene) );
2 26 Feb 07 jari 1669             return true;
2 26 Feb 07 jari 1670         } else {
2 26 Feb 07 jari 1671             return false;
2 26 Feb 07 jari 1672         }
2 26 Feb 07 jari 1673         
2 26 Feb 07 jari 1674         //return false;
2 26 Feb 07 jari 1675     }    
2 26 Feb 07 jari 1676     
2 26 Feb 07 jari 1677     private void printIntArray(int[] intArray) {
2 26 Feb 07 jari 1678         for (int i = 0; i < intArray.length; i++) {
2 26 Feb 07 jari 1679             System.out.print(""+ intArray[i]);
2 26 Feb 07 jari 1680         }
2 26 Feb 07 jari 1681         System.out.println();
2 26 Feb 07 jari 1682     }
2 26 Feb 07 jari 1683     
2 26 Feb 07 jari 1684     private boolean isSignificant(int gene, double currentCutUp, double currentCutLow) {
2 26 Feb 07 jari 1685         boolean isSig = false;
2 26 Feb 07 jari 1686         if ((dArray[gene] >= currentCutUp) || (dArray[gene] <= currentCutLow)) {
2 26 Feb 07 jari 1687             isSig = true;
2 26 Feb 07 jari 1688         }
2 26 Feb 07 jari 1689         return isSig;
2 26 Feb 07 jari 1690     }
2 26 Feb 07 jari 1691     
2 26 Feb 07 jari 1692   
2 26 Feb 07 jari 1693     private double getMedNumFalselyCalledGenesByDelta(double permDVals[][], double currentCutUp, double currentCutLow) {
2 26 Feb 07 jari 1694         double[] falselyCalledGenes = new double[permDVals.length];
2 26 Feb 07 jari 1695         for (int i = 0; i < falselyCalledGenes.length; i++) {
2 26 Feb 07 jari 1696             double[] currentPerm = new double[permDVals[i].length];
2 26 Feb 07 jari 1697             for (int j = 0; j < currentPerm.length; j++) {
2 26 Feb 07 jari 1698                 currentPerm[j] = permDVals[i][j];
2 26 Feb 07 jari 1699             }
2 26 Feb 07 jari 1700             int numFalse = 0;
2 26 Feb 07 jari 1701             
2 26 Feb 07 jari 1702             for (int j = 0; j < currentPerm.length; j++) {
2 26 Feb 07 jari 1703                 if ((currentPerm[j] >= currentCutUp) || (currentPerm[j] <= currentCutLow)) {
2 26 Feb 07 jari 1704                     numFalse++;
2 26 Feb 07 jari 1705                 }
2 26 Feb 07 jari 1706             }
2 26 Feb 07 jari 1707             falselyCalledGenes[i] = (double)numFalse;
2 26 Feb 07 jari 1708         }
2 26 Feb 07 jari 1709         
2 26 Feb 07 jari 1710         return getMedian(falselyCalledGenes);
2 26 Feb 07 jari 1711     }
2 26 Feb 07 jari 1712     
2 26 Feb 07 jari 1713     private double getNinetiethPercentileFalselyCalledGenesByDelta(double permDVals[][], double currentCutUp, double currentCutLow) {
2 26 Feb 07 jari 1714         double[] falselyCalledGenes = new double[permDVals.length];
2 26 Feb 07 jari 1715         for (int i = 0; i < falselyCalledGenes.length; i++) {
2 26 Feb 07 jari 1716             double[] currentPerm = new double[permDVals[i].length];
2 26 Feb 07 jari 1717             for (int j = 0; j < currentPerm.length; j++) {
2 26 Feb 07 jari 1718                 currentPerm[j] = permDVals[i][j];
2 26 Feb 07 jari 1719             }
2 26 Feb 07 jari 1720             int numFalse = 0;
2 26 Feb 07 jari 1721             
2 26 Feb 07 jari 1722             for (int j = 0; j < currentPerm.length; j++) {
2 26 Feb 07 jari 1723                 if ((currentPerm[j] >= currentCutUp) || (currentPerm[j] <= currentCutLow)) {
2 26 Feb 07 jari 1724                     numFalse++;
2 26 Feb 07 jari 1725                 }
2 26 Feb 07 jari 1726             }
2 26 Feb 07 jari 1727             falselyCalledGenes[i] = (double)numFalse;
2 26 Feb 07 jari 1728         }
2 26 Feb 07 jari 1729         
2 26 Feb 07 jari 1730         QSort sortFalselyCalled = new QSort(falselyCalledGenes);
2 26 Feb 07 jari 1731         double[] sortedFalselyCalledGenes = sortFalselyCalled.getSortedDouble();
2 26 Feb 07 jari 1732         int ninetiethPercentileIndex = (int)Math.round((sortedFalselyCalledGenes.length)*0.90 - 1);
2 26 Feb 07 jari 1733         
2 26 Feb 07 jari 1734         return sortedFalselyCalledGenes[ninetiethPercentileIndex];
2 26 Feb 07 jari 1735         
2 26 Feb 07 jari 1736         //return getMedian(falselyCalledGenes);
2 26 Feb 07 jari 1737     }    
2 26 Feb 07 jari 1738     
2 26 Feb 07 jari 1739     private double getCutUp(double currentDelta) {
2 26 Feb 07 jari 1740         boolean posSigEncountered = false;
2 26 Feb 07 jari 1741         //boolean negSigEncountered = false;
2 26 Feb 07 jari 1742         double cutUp = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 1743         int lowestPosSigIndex = 0;
2 26 Feb 07 jari 1744         int highestNegSigIndex = 0;
2 26 Feb 07 jari 1745         
2 26 Feb 07 jari 1746         for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1747             if ( (dBarValues[i] > 0.0d) && ((sortedDArray[i] - dBarValues[i]) > currentDelta) ) {
2 26 Feb 07 jari 1748                 lowestPosSigIndex = i;
2 26 Feb 07 jari 1749                 posSigEncountered = true;
2 26 Feb 07 jari 1750                 break;
2 26 Feb 07 jari 1751             }
2 26 Feb 07 jari 1752         }
2 26 Feb 07 jari 1753         
2 26 Feb 07 jari 1754         if (posSigEncountered) {
2 26 Feb 07 jari 1755             cutUp = sortedDArray[lowestPosSigIndex];
2 26 Feb 07 jari 1756         } else {
2 26 Feb 07 jari 1757             cutUp = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 1758         }
2 26 Feb 07 jari 1759         
2 26 Feb 07 jari 1760         return cutUp;
2 26 Feb 07 jari 1761     }
2 26 Feb 07 jari 1762     
2 26 Feb 07 jari 1763     
2 26 Feb 07 jari 1764     private double getCutLow(double currentDelta) {
2 26 Feb 07 jari 1765        int highestNegSigIndex = 0; 
2 26 Feb 07 jari 1766        boolean negSigEncountered = false;
2 26 Feb 07 jari 1767        double cutLow = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 1768        
2 26 Feb 07 jari 1769         for (int i = 0; i < dBarValues.length; i++) {
2 26 Feb 07 jari 1770             if ( (dBarValues[i] < 0.0d) && ((dBarValues[i] - sortedDArray[i]) > currentDelta) ) {
2 26 Feb 07 jari 1771                 highestNegSigIndex = i;
2 26 Feb 07 jari 1772                 negSigEncountered = true; 
2 26 Feb 07 jari 1773             }
2 26 Feb 07 jari 1774         }  
2 26 Feb 07 jari 1775        
2 26 Feb 07 jari 1776        if (negSigEncountered) {
2 26 Feb 07 jari 1777            cutLow = sortedDArray[highestNegSigIndex];
2 26 Feb 07 jari 1778        } else {
2 26 Feb 07 jari 1779            cutLow = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 1780        }
2 26 Feb 07 jari 1781        return cutLow;
2 26 Feb 07 jari 1782     }
2 26 Feb 07 jari 1783     
2 26 Feb 07 jari 1784     private int getNumSigGenesByDelta(double currentCutUp, double currentCutLow) {
2 26 Feb 07 jari 1785         int numSigGenes = 0;
2 26 Feb 07 jari 1786         for (int i = 0; i < sortedDArray.length; i++) {
2 26 Feb 07 jari 1787             if ((sortedDArray[i] >= currentCutUp)||(sortedDArray[i] <= currentCutLow)) {
2 26 Feb 07 jari 1788                 numSigGenes++;
2 26 Feb 07 jari 1789             }
2 26 Feb 07 jari 1790         }
2 26 Feb 07 jari 1791         return numSigGenes;
2 26 Feb 07 jari 1792     }
2 26 Feb 07 jari 1793     
2 26 Feb 07 jari 1794     private FloatMatrix getPermutedMatrix(FloatMatrix inputMatrix, int[] permExpts) {
2 26 Feb 07 jari 1795         FloatMatrix permutedMatrix = new FloatMatrix(inputMatrix.getRowDimension(), inputMatrix.getColumnDimension());
2 26 Feb 07 jari 1796         for (int i = 0; i < inputMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 1797             for (int j = 0; j < inputMatrix.getColumnDimension(); j++) {
2 26 Feb 07 jari 1798                 permutedMatrix.A[i][j] = inputMatrix.A[i][permExpts[j]];
2 26 Feb 07 jari 1799             }
2 26 Feb 07 jari 1800         }
2 26 Feb 07 jari 1801         return permutedMatrix;
2 26 Feb 07 jari 1802     }
2 26 Feb 07 jari 1803     
2 26 Feb 07 jari 1804     private FloatMatrix getOneClassPermMatrix(FloatMatrix inputMatrix, boolean[] changeSign) {
2 26 Feb 07 jari 1805         FloatMatrix permutedMatrix = new FloatMatrix(inputMatrix.getRowDimension(), inputMatrix.getColumnDimension());
2 26 Feb 07 jari 1806
2 26 Feb 07 jari 1807         for (int i = 0; i < inputMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 1808             for (int j = 0; j < inputMatrix.getColumnDimension(); j++) {
2 26 Feb 07 jari 1809                 if (changeSign[j]) {
2 26 Feb 07 jari 1810                     permutedMatrix.A[i][j] = (float)(inputMatrix.A[i][j] - 2.0f*(inputMatrix.A[i][j] - oneClassMean));
2 26 Feb 07 jari 1811                 } else {
2 26 Feb 07 jari 1812                     permutedMatrix.A[i][j] = inputMatrix.A[i][j];
2 26 Feb 07 jari 1813                 }
2 26 Feb 07 jari 1814             }
2 26 Feb 07 jari 1815         }
2 26 Feb 07 jari 1816         
2 26 Feb 07 jari 1817         return permutedMatrix;
2 26 Feb 07 jari 1818     }
2 26 Feb 07 jari 1819     
2 26 Feb 07 jari 1820     private int[] permuteWithinPairs(long seed) {
2 26 Feb 07 jari 1821         int[] permutedValues = new int[numExps];
2 26 Feb 07 jari 1822         for (int i = 0; i < permutedValues.length; i++) {
2 26 Feb 07 jari 1823             permutedValues[i] = i;
2 26 Feb 07 jari 1824         }
2 26 Feb 07 jari 1825         
2 26 Feb 07 jari 1826         int temp;
2 26 Feb 07 jari 1827         Random generator2 =new Random(seed);
2 26 Feb 07 jari 1828         for (int i = 0; i < pairedGroupAExpts.length; i++) {
2 26 Feb 07 jari 1829             
2 26 Feb 07 jari 1830             boolean swap = generator2.nextBoolean();
2 26 Feb 07 jari 1831             //System.out.print(swap + " ");
2 26 Feb 07 jari 1832             if (swap) {
2 26 Feb 07 jari 1833                 temp = permutedValues[pairedGroupBExpts[i]];
2 26 Feb 07 jari 1834                 permutedValues[pairedGroupBExpts[i]] = permutedValues[pairedGroupAExpts[i]];
2 26 Feb 07 jari 1835                 permutedValues[pairedGroupAExpts[i]] = temp;
2 26 Feb 07 jari 1836             }
2 26 Feb 07 jari 1837         }
2 26 Feb 07 jari 1838         
2 26 Feb 07 jari 1839         try {
2 26 Feb 07 jari 1840             Thread.sleep(10);
2 26 Feb 07 jari 1841         } catch (Exception exc) {
2 26 Feb 07 jari 1842             exc.printStackTrace();
2 26 Feb 07 jari 1843         }        
2 26 Feb 07 jari 1844         
2 26 Feb 07 jari 1845         return permutedValues;
2 26 Feb 07 jari 1846     }
2 26 Feb 07 jari 1847     
2 26 Feb 07 jari 1848     private int[] permuteWithinPairsAllPerms(int num) {
2 26 Feb 07 jari 1849         int[] permutedValues = new int[numExps];
2 26 Feb 07 jari 1850         for (int i = 0; i < permutedValues.length; i++) {
2 26 Feb 07 jari 1851             permutedValues[i] = i;
2 26 Feb 07 jari 1852         }
2 26 Feb 07 jari 1853         
2 26 Feb 07 jari 1854         int temp;
2 26 Feb 07 jari 1855         //Random generator2 =new Random(seed);
2 26 Feb 07 jari 1856         boolean[] changeSign = getChangeSignArrayForAllPairedPerms(num);
2 26 Feb 07 jari 1857         for (int i = 0; i < pairedGroupAExpts.length; i++) {
2 26 Feb 07 jari 1858             
2 26 Feb 07 jari 1859             boolean swap = changeSign[i];
2 26 Feb 07 jari 1860             //System.out.print(swap + " ");
2 26 Feb 07 jari 1861             if (swap) {
2 26 Feb 07 jari 1862                 temp = permutedValues[pairedGroupBExpts[i]];
2 26 Feb 07 jari 1863                 permutedValues[pairedGroupBExpts[i]] = permutedValues[pairedGroupAExpts[i]];
2 26 Feb 07 jari 1864                 permutedValues[pairedGroupAExpts[i]] = temp;
2 26 Feb 07 jari 1865             }
2 26 Feb 07 jari 1866         }
2 26 Feb 07 jari 1867         /*
2 26 Feb 07 jari 1868         try {
2 26 Feb 07 jari 1869             Thread.sleep(10);
2 26 Feb 07 jari 1870         } catch (Exception exc) {
2 26 Feb 07 jari 1871             exc.printStackTrace();
2 26 Feb 07 jari 1872         } 
2 26 Feb 07 jari 1873          */       
2 26 Feb 07 jari 1874         
2 26 Feb 07 jari 1875         return permutedValues;
2 26 Feb 07 jari 1876     }    
2 26 Feb 07 jari 1877     
2 26 Feb 07 jari 1878     boolean[] getChangeSignArrayForAllPairedPerms(int num) {
2 26 Feb 07 jari 1879         boolean[] permutArray = new boolean[pairedGroupAExpts.length];
2 26 Feb 07 jari 1880         
2 26 Feb 07 jari 1881         for (int i = 0; i < permutArray.length; i++) {
2 26 Feb 07 jari 1882             permutArray[i] = false;
2 26 Feb 07 jari 1883         }
2 26 Feb 07 jari 1884         
2 26 Feb 07 jari 1885         int numPairs = pairedGroupAExpts.length;
2 26 Feb 07 jari 1886         
2 26 Feb 07 jari 1887         String binaryString = Integer.toBinaryString(num);
2 26 Feb 07 jari 1888         //System.out.println(binaryString);
2 26 Feb 07 jari 1889         char[] binArray = binaryString.toCharArray();
2 26 Feb 07 jari 1890         if (binArray.length < numPairs) {
2 26 Feb 07 jari 1891             Vector binVector = new Vector();
2 26 Feb 07 jari 1892             for (int i = 0; i < (numPairs - binArray.length); i++) {
2 26 Feb 07 jari 1893                 binVector.add(new Character('0'));
2 26 Feb 07 jari 1894             }
2 26 Feb 07 jari 1895             
2 26 Feb 07 jari 1896             for (int i = 0; i < binArray.length; i++) {
2 26 Feb 07 jari 1897                 binVector.add(new Character(binArray[i]));
2 26 Feb 07 jari 1898             }
2 26 Feb 07 jari 1899             binArray = new char[binVector.size()]; 
2 26 Feb 07 jari 1900             
2 26 Feb 07 jari 1901             for (int i = 0; i < binArray.length; i++) {
2 26 Feb 07 jari 1902                 binArray[i] = ((Character)(binVector.get(i))).charValue();
2 26 Feb 07 jari 1903             }
2 26 Feb 07 jari 1904         } 
2 26 Feb 07 jari 1905         /*
2 26 Feb 07 jari 1906         for (int i = 0; i < binArray.length; i++) {
2 26 Feb 07 jari 1907             System.out.print(binArray[i]);
2 26 Feb 07 jari 1908         }
2 26 Feb 07 jari 1909         System.out.println();
2 26 Feb 07 jari 1910          */
2 26 Feb 07 jari 1911         //int counter = 0;
2 26 Feb 07 jari 1912         
2 26 Feb 07 jari 1913         for (int i = 0; i < permutArray.length; i++) {
2 26 Feb 07 jari 1914
2 26 Feb 07 jari 1915             if (binArray[i] == '1') {
2 26 Feb 07 jari 1916                 permutArray[i] = true;
2 26 Feb 07 jari 1917             } else {
2 26 Feb 07 jari 1918                 permutArray[i] = false;
2 26 Feb 07 jari 1919             }
2 26 Feb 07 jari 1920
2 26 Feb 07 jari 1921         }
2 26 Feb 07 jari 1922         /*
2 26 Feb 07 jari 1923         for (int i = 0; i < oneClassPermutArray.length; i++) {
2 26 Feb 07 jari 1924             System.out.print(oneClassPermutArray[i] + " ");
2 26 Feb 07 jari 1925         }
2 26 Feb 07 jari 1926         System.out.println();
2 26 Feb 07 jari 1927         */
2 26 Feb 07 jari 1928         return permutArray;
2 26 Feb 07 jari 1929     }    
2 26 Feb 07 jari 1930     
2 26 Feb 07 jari 1931     private int[] getPermutedValues(int arrayLength, int[] validArray) {//returns an integer array of length "arrayLength", with the valid values (the currently included experiments) permuted
2 26 Feb 07 jari 1932         int[] permutedValues = new int[arrayLength];
2 26 Feb 07 jari 1933         for (int i = 0; i < permutedValues.length; i++) {
2 26 Feb 07 jari 1934             permutedValues[i] = i;
2 26 Feb 07 jari 1935         }
2 26 Feb 07 jari 1936         /*
2 26 Feb 07 jari 1937         Vector validExpts = new Vector();
2 26 Feb 07 jari 1938         if ((studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED)||(studyDesign == SAMInitDialog.MULTI_CLASS)) {
2 26 Feb 07 jari 1939             for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 1940                 if (groupAssignments[i] != 0) {
2 26 Feb 07 jari 1941                     validExpts.add(new Integer(i));
2 26 Feb 07 jari 1942                 }
2 26 Feb 07 jari 1943             }
2 26 Feb 07 jari 1944         } else if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 1945             for (int i = 0; i < inSurvivalAnalysis.length; i++) {
2 26 Feb 07 jari 1946                 if (inSurvivalAnalysis[i]) {
2 26 Feb 07 jari 1947                     validExpts.add(new Integer(i));
2 26 Feb 07 jari 1948                 }
2 26 Feb 07 jari 1949             }
2 26 Feb 07 jari 1950         }
2 26 Feb 07 jari 1951         
2 26 Feb 07 jari 1952         int[] validArray = new int[validExpts.size()];
2 26 Feb 07 jari 1953         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1954             validArray[i] = ((Integer)(validExpts.get(i))).intValue();
2 26 Feb 07 jari 1955         }
2 26 Feb 07 jari 1956          */
2 26 Feb 07 jari 1957         
2 26 Feb 07 jari 1958         int[] permutedValidArray = new int[validArray.length];
2 26 Feb 07 jari 1959         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1960             permutedValidArray[i] = validArray[i];
2 26 Feb 07 jari 1961         }
2 26 Feb 07 jari 1962         
2 26 Feb 07 jari 1963         for (int i = permutedValidArray.length; i > 1; i--) {
2 26 Feb 07 jari 1964             Random generator2 =new Random();
2 26 Feb 07 jari 1965             //Random generator2 = new Random(randomSeeds[i - 2]);
2 26 Feb 07 jari 1966             int randVal = generator2.nextInt(i - 1);
2 26 Feb 07 jari 1967             int temp = permutedValidArray[randVal];
2 26 Feb 07 jari 1968             permutedValidArray[randVal] = permutedValidArray[i - 1];
2 26 Feb 07 jari 1969             permutedValidArray[i - 1] = temp;
2 26 Feb 07 jari 1970         }  
2 26 Feb 07 jari 1971         
2 26 Feb 07 jari 1972         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1973             //permutedValues[validArray[i]] = permutedValues[permutedValidArray[i]];
2 26 Feb 07 jari 1974             permutedValues[validArray[i]] = permutedValidArray[i];
2 26 Feb 07 jari 1975         }
2 26 Feb 07 jari 1976         
2 26 Feb 07 jari 1977         /*
2 26 Feb 07 jari 1978         long[] randomSeeds = new long[permutedValues.length - 1];
2 26 Feb 07 jari 1979        
2 26 Feb 07 jari 1980         
2 26 Feb 07 jari 1981         for (int i = 0; i < randomSeeds.length; i++) {
2 26 Feb 07 jari 1982             Random generator = new Random(i);
2 26 Feb 07 jari 1983             randomSeeds[i] = generator.nextLong();
2 26 Feb 07 jari 1984             //System.out.println("randomSeeds[" + i + "] =" + randomSeeds[i]);
2 26 Feb 07 jari 1985         }
2 26 Feb 07 jari 1986         */
2 26 Feb 07 jari 1987         /*
2 26 Feb 07 jari 1988         for (int i = permutedValues.length; i > 1; i--) {
2 26 Feb 07 jari 1989             Random generator2 =new Random();
2 26 Feb 07 jari 1990             //Random generator2 = new Random(randomSeeds[i - 2]);
2 26 Feb 07 jari 1991             int randVal = generator2.nextInt(i - 1);
2 26 Feb 07 jari 1992             int temp = permutedValues[randVal];
2 26 Feb 07 jari 1993             permutedValues[randVal] = permutedValues[i - 1];
2 26 Feb 07 jari 1994             permutedValues[i - 1] = temp;
2 26 Feb 07 jari 1995         }
2 26 Feb 07 jari 1996         */
2 26 Feb 07 jari 1997         
2 26 Feb 07 jari 1998         try {
2 26 Feb 07 jari 1999             Thread.sleep(10);
2 26 Feb 07 jari 2000         } catch (Exception exc) {
2 26 Feb 07 jari 2001             exc.printStackTrace();
2 26 Feb 07 jari 2002         }
2 26 Feb 07 jari 2003         
2 26 Feb 07 jari 2004         
2 26 Feb 07 jari 2005         return permutedValues;
2 26 Feb 07 jari 2006         
2 26 Feb 07 jari 2007     }
2 26 Feb 07 jari 2008     
2 26 Feb 07 jari 2009     private boolean[] getOneClassChangeSignArray(long seed, int[] validExpts) {
2 26 Feb 07 jari 2010         boolean[] changeSignArray = new boolean[numExps];
2 26 Feb 07 jari 2011         for (int i = 0; i < changeSignArray.length; i++) {
2 26 Feb 07 jari 2012             changeSignArray[i] = false;            
2 26 Feb 07 jari 2013         }
2 26 Feb 07 jari 2014         
2 26 Feb 07 jari 2015         Random generator2 = new Random(seed);
2 26 Feb 07 jari 2016         for (int i = 0; i < validExpts.length; i++) {
2 26 Feb 07 jari 2017             changeSignArray[validExpts[i]] = generator2.nextBoolean();
2 26 Feb 07 jari 2018         }
2 26 Feb 07 jari 2019         
2 26 Feb 07 jari 2020         return changeSignArray;
2 26 Feb 07 jari 2021     }
2 26 Feb 07 jari 2022     
2 26 Feb 07 jari 2023     private boolean[] getOneClassChangeSignArrayAllUniquePerms(int num, int[] validExpts) {
2 26 Feb 07 jari 2024         boolean[] changeSignArray = new boolean[numExps];
2 26 Feb 07 jari 2025         for (int i = 0; i < changeSignArray.length; i++) {
2 26 Feb 07 jari 2026             changeSignArray[i] = false;            
2 26 Feb 07 jari 2027         }
2 26 Feb 07 jari 2028         
2 26 Feb 07 jari 2029         //Random generator2 = new Random(seed);
2 26 Feb 07 jari 2030         int numValidExps = validExpts.length;
2 26 Feb 07 jari 2031
2 26 Feb 07 jari 2032         String binaryString = Integer.toBinaryString(num);
2 26 Feb 07 jari 2033         //System.out.println(binaryString);
2 26 Feb 07 jari 2034         char[] binArray = binaryString.toCharArray();
2 26 Feb 07 jari 2035         if (binArray.length < numValidExps) {
2 26 Feb 07 jari 2036             Vector binVector = new Vector();
2 26 Feb 07 jari 2037             for (int i = 0; i < (numValidExps - binArray.length); i++) {
2 26 Feb 07 jari 2038                 binVector.add(new Character('0'));
2 26 Feb 07 jari 2039             }
2 26 Feb 07 jari 2040             
2 26 Feb 07 jari 2041             for (int i = 0; i < binArray.length; i++) {
2 26 Feb 07 jari 2042                 binVector.add(new Character(binArray[i]));
2 26 Feb 07 jari 2043             }
2 26 Feb 07 jari 2044             binArray = new char[binVector.size()]; 
2 26 Feb 07 jari 2045             
2 26 Feb 07 jari 2046             for (int i = 0; i < binArray.length; i++) {
2 26 Feb 07 jari 2047                 binArray[i] = ((Character)(binVector.get(i))).charValue();
2 26 Feb 07 jari 2048             }
2 26 Feb 07 jari 2049         }
2 26 Feb 07 jari 2050         
2 26 Feb 07 jari 2051         for (int i = 0; i < validExpts.length; i++) {
2 26 Feb 07 jari 2052             if (binArray[i] == '1') {
2 26 Feb 07 jari 2053                 changeSignArray[validExpts[i]] = true;
2 26 Feb 07 jari 2054             } else {
2 26 Feb 07 jari 2055                 changeSignArray[validExpts[i]] = false;
2 26 Feb 07 jari 2056             }
2 26 Feb 07 jari 2057         }
2 26 Feb 07 jari 2058         
2 26 Feb 07 jari 2059         return changeSignArray;
2 26 Feb 07 jari 2060     }    
2 26 Feb 07 jari 2061     
2 26 Feb 07 jari 2062     private float getMax(float[] array) {
2 26 Feb 07 jari 2063         float max = Float.NEGATIVE_INFINITY;
2 26 Feb 07 jari 2064         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 2065             if (max < array[i]) {
2 26 Feb 07 jari 2066                 max = array[i];
2 26 Feb 07 jari 2067             }
2 26 Feb 07 jari 2068         }
2 26 Feb 07 jari 2069         return max;
2 26 Feb 07 jari 2070     }
2 26 Feb 07 jari 2071     
2 26 Feb 07 jari 2072     private float getMin(float[] array) {
2 26 Feb 07 jari 2073         float min = Float.POSITIVE_INFINITY;
2 26 Feb 07 jari 2074         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 2075             if (min > array[i]) {
2 26 Feb 07 jari 2076                 min = array[i];
2 26 Feb 07 jari 2077             }
2 26 Feb 07 jari 2078         }
2 26 Feb 07 jari 2079         return min;
2 26 Feb 07 jari 2080     }   
2 26 Feb 07 jari 2081     
2 26 Feb 07 jari 2082     private double getMax(double[] array) {
2 26 Feb 07 jari 2083         double max = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 2084         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 2085             if (max < array[i]) {
2 26 Feb 07 jari 2086                 max = array[i];
2 26 Feb 07 jari 2087             }
2 26 Feb 07 jari 2088         }
2 26 Feb 07 jari 2089         return max;
2 26 Feb 07 jari 2090     }
2 26 Feb 07 jari 2091     
2 26 Feb 07 jari 2092     private double getMin(double[] array) {
2 26 Feb 07 jari 2093         double min = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 2094         for (int i = 0; i < array.length; i++) {
2 26 Feb 07 jari 2095             if (min > array[i]) {
2 26 Feb 07 jari 2096                 min = array[i];
2 26 Feb 07 jari 2097             }
2 26 Feb 07 jari 2098         }
2 26 Feb 07 jari 2099         return min;
2 26 Feb 07 jari 2100     }    
2 26 Feb 07 jari 2101     
2 26 Feb 07 jari 2102     private double rTwoClassUnpaired(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2103         float[] groupAValues, groupBValues;
2 26 Feb 07 jari 2104         int groupACount = 0;
2 26 Feb 07 jari 2105         int groupBCount = 0;
2 26 Feb 07 jari 2106         
2 26 Feb 07 jari 2107         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2108             if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 2109                 groupACount++;
2 26 Feb 07 jari 2110             } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 2111                 groupBCount++;
2 26 Feb 07 jari 2112             }
2 26 Feb 07 jari 2113         } 
2 26 Feb 07 jari 2114         
2 26 Feb 07 jari 2115         groupAValues = new float[groupACount];
2 26 Feb 07 jari 2116         groupBValues = new float[groupBCount];
2 26 Feb 07 jari 2117         
2 26 Feb 07 jari 2118         groupACount = 0;
2 26 Feb 07 jari 2119         groupBCount = 0;
2 26 Feb 07 jari 2120         
2 26 Feb 07 jari 2121         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2122         
2 26 Feb 07 jari 2123         /*    
2 26 Feb 07 jari 2124         if (passedThisPoint) {
2 26 Feb 07 jari 2125                 System.out.println("rTwoClassUnpaired(): groupACount = " + groupACount + ", groupBCount = " + groupBCount + ", gene = " + gene + ", i = " + i);
2 26 Feb 07 jari 2126             }
2 26 Feb 07 jari 2127          */
2 26 Feb 07 jari 2128             if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 2129                 groupAValues[groupACount] = matrix.A[gene][i];
2 26 Feb 07 jari 2130                 groupACount++;
2 26 Feb 07 jari 2131             } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 2132                 groupBValues[groupBCount] = matrix.A[gene][i];
2 26 Feb 07 jari 2133                 groupBCount++;                
2 26 Feb 07 jari 2134             }
2 26 Feb 07 jari 2135         }
2 26 Feb 07 jari 2136         
2 26 Feb 07 jari 2137         double r = (double)(getMean(groupBValues) - getMean(groupAValues));
2 26 Feb 07 jari 2138         //System.out.println("rTwoClassUnpaired(" + gene + ") = " + r);
2 26 Feb 07 jari 2139         //return Math.abs(r);
2 26 Feb 07 jari 2140         return r;
2 26 Feb 07 jari 2141     }
2 26 Feb 07 jari 2142     
2 26 Feb 07 jari 2143     private double rTwoClassPaired(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2144         double zk = 0;
2 26 Feb 07 jari 2145         
2 26 Feb 07 jari 2146         for (int k = 0; k < pairedGroupAExpts.length; k++) {
2 26 Feb 07 jari 2147             zk = zk + (matrix.A[gene][pairedGroupBExpts[k]] - matrix.A[gene][pairedGroupAExpts[k]]);
2 26 Feb 07 jari 2148         }
2 26 Feb 07 jari 2149         
2 26 Feb 07 jari 2150         return (double)(zk/(double)(pairedGroupAExpts.length));
2 26 Feb 07 jari 2151     }
2 26 Feb 07 jari 2152     
2 26 Feb 07 jari 2153     private double rOneClass(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2154         int validN = 0;
2 26 Feb 07 jari 2155         double xiBar = 0d;
2 26 Feb 07 jari 2156         
2 26 Feb 07 jari 2157         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2158             if (groupAssignments[i] == 1) {
2 26 Feb 07 jari 2159                 validN++;
2 26 Feb 07 jari 2160                 xiBar = xiBar + (matrix.A[gene][i] - oneClassMean);
2 26 Feb 07 jari 2161             }
2 26 Feb 07 jari 2162         }
2 26 Feb 07 jari 2163         
2 26 Feb 07 jari 2164         return (double)(xiBar/(double)validN);
2 26 Feb 07 jari 2165         
2 26 Feb 07 jari 2166     }
2 26 Feb 07 jari 2167     
2 26 Feb 07 jari 2168     private double rMultiClass(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2169        float[] geneValues = new float[matrix.getColumnDimension()];
2 26 Feb 07 jari 2170        
2 26 Feb 07 jari 2171        for (int i = 0; i < geneValues.length; i++) {
2 26 Feb 07 jari 2172            geneValues[i] = matrix.A[gene][i];
2 26 Feb 07 jari 2173        }
2 26 Feb 07 jari 2174        
2 26 Feb 07 jari 2175        int[] groupCounts = getGroupCounts();
2 26 Feb 07 jari 2176        double[] xBarIK = getXBarIk(geneValues);
2 26 Feb 07 jari 2177        
2 26 Feb 07 jari 2178        double sigmaNK = 0d;
2 26 Feb 07 jari 2179        double piNK = 1d;
2 26 Feb 07 jari 2180        for (int i = 0; i < groupCounts.length; i++) {
2 26 Feb 07 jari 2181            sigmaNK = sigmaNK + groupCounts[i];
2 26 Feb 07 jari 2182            piNK = piNK*groupCounts[i];
2 26 Feb 07 jari 2183        }
2 26 Feb 07 jari 2184        
2 26 Feb 07 jari 2185        double xBar = (double)getMean(geneValues);
2 26 Feb 07 jari 2186        
2 26 Feb 07 jari 2187        double term2 = 0d;
2 26 Feb 07 jari 2188        
2 26 Feb 07 jari 2189        for (int i = 0; i < groupCounts.length; i++) {
2 26 Feb 07 jari 2190            term2 = term2 + groupCounts[i]*Math.pow((xBarIK[i] - xBar), 2);
2 26 Feb 07 jari 2191        }
2 26 Feb 07 jari 2192        
2 26 Feb 07 jari 2193        double r = Math.pow((sigmaNK/piNK)*term2, 0.5d);
2 26 Feb 07 jari 2194        return r;
2 26 Feb 07 jari 2195     }
2 26 Feb 07 jari 2196
2 26 Feb 07 jari 2197     private double sTwoClassPaired(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2198         double r = rTwoClassPaired(gene, matrix);
2 26 Feb 07 jari 2199         double num = 0;
2 26 Feb 07 jari 2200         
2 26 Feb 07 jari 2201         for (int k = 0; k < pairedGroupAExpts.length; k++) {
2 26 Feb 07 jari 2202             num = num + Math.pow(((double)(matrix.A[gene][pairedGroupBExpts[k]]) - (double)(matrix.A[gene][pairedGroupAExpts[k]]) - r), 2d);
2 26 Feb 07 jari 2203         }
2 26 Feb 07 jari 2204         
2 26 Feb 07 jari 2205         int K = pairedGroupAExpts.length;
2 26 Feb 07 jari 2206         return Math.sqrt((double)num/(double)(K*(K - 1)));
2 26 Feb 07 jari 2207     }
2 26 Feb 07 jari 2208     
2 26 Feb 07 jari 2209     private double sOneClass(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2210         double xiBar = rOneClass(gene, matrix);
2 26 Feb 07 jari 2211         double sValue = 0d;
2 26 Feb 07 jari 2212         int validN = 0;
2 26 Feb 07 jari 2213         
2 26 Feb 07 jari 2214         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2215             if (groupAssignments[i] == 1) {
2 26 Feb 07 jari 2216                 validN++;
2 26 Feb 07 jari 2217                 sValue = sValue + Math.pow((matrix.A[gene][i] - xiBar), 2);
2 26 Feb 07 jari 2218             }
2 26 Feb 07 jari 2219         }
2 26 Feb 07 jari 2220         
2 26 Feb 07 jari 2221         return Math.sqrt( (double)(sValue/(double)(validN*(validN - 1))) );
2 26 Feb 07 jari 2222     }
2 26 Feb 07 jari 2223     
2 26 Feb 07 jari 2224     private double sMultiClass(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2225        float[] geneValues = new float[matrix.getColumnDimension()];
2 26 Feb 07 jari 2226        for (int i = 0; i < geneValues.length; i++) {
2 26 Feb 07 jari 2227            geneValues[i] = matrix.A[gene][i];
2 26 Feb 07 jari 2228        }
2 26 Feb 07 jari 2229        double[][] geneValuesByGroups = getGeneValuesByGroups(geneValues);
2 26 Feb 07 jari 2230        /*
2 26 Feb 07 jari 2231        for (int i = 0; i < geneValues.length; i++) {
2 26 Feb 07 jari 2232            geneValues[i] = matrix.A[gene][i];
2 26 Feb 07 jari 2233        }
2 26 Feb 07 jari 2234         */
2 26 Feb 07 jari 2235        
2 26 Feb 07 jari 2236        int[] groupCounts = getGroupCounts();
2 26 Feb 07 jari 2237        double[] xBarIK = getXBarIk(geneValues);
2 26 Feb 07 jari 2238        
2 26 Feb 07 jari 2239        int sumNkMinusOne = 0;
2 26 Feb 07 jari 2240        
2 26 Feb 07 jari 2241        for (int i = 0; i < groupCounts.length; i++) {
2 26 Feb 07 jari 2242            sumNkMinusOne = sumNkMinusOne + (groupCounts[i] - 1);
2 26 Feb 07 jari 2243        }
2 26 Feb 07 jari 2244        
2 26 Feb 07 jari 2245        double term1 = (double)(1/(double)sumNkMinusOne);
2 26 Feb 07 jari 2246        
2 26 Feb 07 jari 2247        double term2 = 0d;
2 26 Feb 07 jari 2248        
2 26 Feb 07 jari 2249        for (int i = 0; i < groupCounts.length; i++) {
2 26 Feb 07 jari 2250            term2 = term2 + (double)(1/(double)groupCounts[i]);
2 26 Feb 07 jari 2251        }
2 26 Feb 07 jari 2252        
2 26 Feb 07 jari 2253        double term3 = 0;
2 26 Feb 07 jari 2254        
2 26 Feb 07 jari 2255        for (int k = 0; k < groupCounts.length; k++) {
2 26 Feb 07 jari 2256            double currentTerm = 0d;
2 26 Feb 07 jari 2257            for (int j = 0; j < groupCounts[k]; j++) {
2 26 Feb 07 jari 2258                currentTerm = currentTerm + Math.pow((geneValuesByGroups[k][j] - xBarIK[k]), 2.0d);
2 26 Feb 07 jari 2259            }
2 26 Feb 07 jari 2260            
2 26 Feb 07 jari 2261            term3 = term3 + currentTerm;
2 26 Feb 07 jari 2262        }
2 26 Feb 07 jari 2263        
2 26 Feb 07 jari 2264        return Math.pow(term1*(term2*term3), 0.5d);
2 26 Feb 07 jari 2265     }
2 26 Feb 07 jari 2266     
2 26 Feb 07 jari 2267     private double rCensoredSurvival(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2268         double r = 0;
2 26 Feb 07 jari 2269         
2 26 Feb 07 jari 2270         //double[] zkArray = getZkArray();
2 26 Feb 07 jari 2271         //int[] dkArray = getDkArray();
2 26 Feb 07 jari 2272         
2 26 Feb 07 jari 2273         for (int k = 0; k < zkArray.length; k++) {
2 26 Feb 07 jari 2274             r = r + (getXStarIK(gene, matrix, k) - dkArray[k]*getXBarIK(gene, matrix, k));
2 26 Feb 07 jari 2275         }
2 26 Feb 07 jari 2276         
2 26 Feb 07 jari 2277         return r;
2 26 Feb 07 jari 2278     }
2 26 Feb 07 jari 2279     
2 26 Feb 07 jari 2280     private double sCensoredSurvival(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2281         double s = 0;
2 26 Feb 07 jari 2282         //double[] zkArray = getZkArray();
2 26 Feb 07 jari 2283         //int[] dkArray = getDkArray(); 
2 26 Feb 07 jari 2284         //int[][] rkArray = getRkArray();
2 26 Feb 07 jari 2285         
2 26 Feb 07 jari 2286         for (int k = 0; k < zkArray.length; k++) {
2 26 Feb 07 jari 2287             double term1 = (double)(dkArray[k]/(double)(rkArray[k].length));
2 26 Feb 07 jari 2288             double term2 = 0;
2 26 Feb 07 jari 2289             double xBarIK = getXBarIK(gene, matrix, k);
2 26 Feb 07 jari 2290             for (int l = 0; l < rkArray[k].length; l++) {
2 26 Feb 07 jari 2291                 int currentExp = rkArray[k][l];
2 26 Feb 07 jari 2292                 //for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 2293                     term2 = term2 + Math.pow(((double)(matrix.A[gene][currentExp]) - xBarIK), 2) ;
2 26 Feb 07 jari 2294                 //}
2 26 Feb 07 jari 2295             }
2 26 Feb 07 jari 2296             
2 26 Feb 07 jari 2297             s = s + term1*term2;
2 26 Feb 07 jari 2298         }
2 26 Feb 07 jari 2299         
2 26 Feb 07 jari 2300         return Math.pow(s, 0.5);
2 26 Feb 07 jari 2301     }
2 26 Feb 07 jari 2302     
2 26 Feb 07 jari 2303     
2 26 Feb 07 jari 2304     
2 26 Feb 07 jari 2305     private int[][] getRkArray() { // indices of samples (observations) at unique death times zk
2 26 Feb 07 jari 2306         //double[] zkArray = getZkArray();
2 26 Feb 07 jari 2307         
2 26 Feb 07 jari 2308         int[][] rkArray = new int[zkArray.length][];
2 26 Feb 07 jari 2309         
2 26 Feb 07 jari 2310         for (int i = 0; i < zkArray.length; i++) {
2 26 Feb 07 jari 2311             Vector currentRkVector = new Vector();
2 26 Feb 07 jari 2312             double currentTime = zkArray[i];
2 26 Feb 07 jari 2313             for (int j = 0; j < numExps; j++) {
2 26 Feb 07 jari 2314                 if ((inSurvivalAnalysis[j]) && (survivalTimes[j] >= currentTime)) {
2 26 Feb 07 jari 2315                     currentRkVector.add(new Integer(j));
2 26 Feb 07 jari 2316                 }
2 26 Feb 07 jari 2317             }
2 26 Feb 07 jari 2318             
2 26 Feb 07 jari 2319             rkArray[i] = new int[currentRkVector.size()];
2 26 Feb 07 jari 2320             
2 26 Feb 07 jari 2321             for (int j = 0; j < rkArray[i].length; j++) {
2 26 Feb 07 jari 2322                 rkArray[i][j] = ((Integer)currentRkVector.get(j)).intValue();
2 26 Feb 07 jari 2323             }
2 26 Feb 07 jari 2324         }
2 26 Feb 07 jari 2325         
2 26 Feb 07 jari 2326         return rkArray;
2 26 Feb 07 jari 2327     }
2 26 Feb 07 jari 2328     
2 26 Feb 07 jari 2329
2 26 Feb 07 jari 2330     private double[] getZkArray() { // unique death times zk
2 26 Feb 07 jari 2331         Vector deathTimes = new Vector();
2 26 Feb 07 jari 2332                 
2 26 Feb 07 jari 2333         for (int i = 0; i < survivalTimes.length; i++) {
2 26 Feb 07 jari 2334             if ((inSurvivalAnalysis[i]) && (!isCensored[i])) {
2 26 Feb 07 jari 2335                 deathTimes.add(new Double(survivalTimes[i]));
2 26 Feb 07 jari 2336             }
2 26 Feb 07 jari 2337         }
2 26 Feb 07 jari 2338         
2 26 Feb 07 jari 2339         HashSet s = new HashSet(deathTimes);
2 26 Feb 07 jari 2340         Vector deathTimesSet = new Vector(s);   
2 26 Feb 07 jari 2341         
2 26 Feb 07 jari 2342         double[] zkArray = new double[deathTimesSet.size()];
2 26 Feb 07 jari 2343         
2 26 Feb 07 jari 2344         for (int i = 0; i < zkArray.length; i++) {
2 26 Feb 07 jari 2345             zkArray[i] = ((Double)deathTimesSet.get(i)).doubleValue();
2 26 Feb 07 jari 2346         }
2 26 Feb 07 jari 2347         
2 26 Feb 07 jari 2348         return zkArray;
2 26 Feb 07 jari 2349     }
2 26 Feb 07 jari 2350     
2 26 Feb 07 jari 2351     private int[] getDkArray() { // array of number of deaths at each unique death time zk
2 26 Feb 07 jari 2352         //double[] zkArray = getZkArray();
2 26 Feb 07 jari 2353         int[] dkArray = new int[zkArray.length];
2 26 Feb 07 jari 2354         
2 26 Feb 07 jari 2355         for (int i = 0; i < zkArray.length; i++) {
2 26 Feb 07 jari 2356             int counter = 0;
2 26 Feb 07 jari 2357             for (int j = 0; j < numExps; j++) {
2 26 Feb 07 jari 2358                 if ((inSurvivalAnalysis[j]) && (survivalTimes[j] == zkArray[i]) && (!isCensored[j])) {
2 26 Feb 07 jari 2359                     counter++;
2 26 Feb 07 jari 2360                 }
2 26 Feb 07 jari 2361             }
2 26 Feb 07 jari 2362             
2 26 Feb 07 jari 2363             dkArray[i] = counter;
2 26 Feb 07 jari 2364         }
2 26 Feb 07 jari 2365         
2 26 Feb 07 jari 2366         return dkArray;
2 26 Feb 07 jari 2367     }
2 26 Feb 07 jari 2368     
2 26 Feb 07 jari 2369     private double getXStarIK(int gene, FloatMatrix matrix, int k) {
2 26 Feb 07 jari 2370         double x = 0;
2 26 Feb 07 jari 2371         //double[] zkArray = getZkArray(); 
2 26 Feb 07 jari 2372         double zk = zkArray[k];
2 26 Feb 07 jari 2373         for (int i = 0; i < inSurvivalAnalysis.length; i++) {
2 26 Feb 07 jari 2374             if (inSurvivalAnalysis[i] && (survivalTimes[i] == zk) && (!isCensored[i])) {
2 26 Feb 07 jari 2375                 //for (int j = 0; j < numGenes; j++) {
2 26 Feb 07 jari 2376                     x = x + (double)matrix.A[gene][i];
2 26 Feb 07 jari 2377                     
2 26 Feb 07 jari 2378                 //}
2 26 Feb 07 jari 2379             }
2 26 Feb 07 jari 2380         }
2 26 Feb 07 jari 2381         
2 26 Feb 07 jari 2382         return x;
2 26 Feb 07 jari 2383     }
2 26 Feb 07 jari 2384     
2 26 Feb 07 jari 2385     private double getXBarIK(int gene, FloatMatrix matrix, int k) { // for censored survival designs 
2 26 Feb 07 jari 2386         double x = 0;
2 26 Feb 07 jari 2387         //int counter = 0;
2 26 Feb 07 jari 2388         //double[] zkArray = getZkArray();
2 26 Feb 07 jari 2389         //int[][] rkArray = getRkArray();
2 26 Feb 07 jari 2390         double zk = zkArray[k]; 
2 26 Feb 07 jari 2391         int mk = rkArray[k].length;
2 26 Feb 07 jari 2392         for (int i = 0; i < inSurvivalAnalysis.length; i++) {
2 26 Feb 07 jari 2393             if (inSurvivalAnalysis[i] && (survivalTimes[i] >= zk)) {
2 26 Feb 07 jari 2394                 //counter++;
2 26 Feb 07 jari 2395                 //for (int j = 0; j < numGenes; j++) {
2 26 Feb 07 jari 2396                     x = x + (double)matrix.A[gene][i];
2 26 Feb 07 jari 2397                     
2 26 Feb 07 jari 2398                 //}
2 26 Feb 07 jari 2399             }
2 26 Feb 07 jari 2400         }
2 26 Feb 07 jari 2401         
2 26 Feb 07 jari 2402         return (double)(x/mk);
2 26 Feb 07 jari 2403     }    
2 26 Feb 07 jari 2404     
2 26 Feb 07 jari 2405     
2 26 Feb 07 jari 2406     
2 26 Feb 07 jari 2407     private double[][] getGeneValuesByGroups(float[] geneValues) {
2 26 Feb 07 jari 2408         int[] groupCounts = getGroupCounts();
2 26 Feb 07 jari 2409         double[][] geneValuesByGroups = new double[groupCounts.length][];
2 26 Feb 07 jari 2410         
2 26 Feb 07 jari 2411         for (int i = 0; i < geneValuesByGroups.length; i++) {
2 26 Feb 07 jari 2412             geneValuesByGroups[i] = new double[groupCounts[i]];
2 26 Feb 07 jari 2413         }
2 26 Feb 07 jari 2414         
2 26 Feb 07 jari 2415         int[] groupCounters = new int[groupCounts.length];
2 26 Feb 07 jari 2416         for (int i = 0; i < groupCounters.length; i++) {
2 26 Feb 07 jari 2417             groupCounters[i] = 0;
2 26 Feb 07 jari 2418         }
2 26 Feb 07 jari 2419         
2 26 Feb 07 jari 2420         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2421             int currentGroup = groupAssignments[i];
2 26 Feb 07 jari 2422             if (currentGroup != 0) {
2 26 Feb 07 jari 2423                 geneValuesByGroups[currentGroup - 1][groupCounters[currentGroup -1]] = (double)geneValues[i];
2 26 Feb 07 jari 2424                 groupCounters[currentGroup - 1]++;
2 26 Feb 07 jari 2425             }
2 26 Feb 07 jari 2426         } 
2 26 Feb 07 jari 2427         
2 26 Feb 07 jari 2428         return geneValuesByGroups;
2 26 Feb 07 jari 2429     }
2 26 Feb 07 jari 2430     
2 26 Feb 07 jari 2431     
2 26 Feb 07 jari 2432     private double[] getXBarIk(float[] geneValues) { //for multi-class model
2 26 Feb 07 jari 2433         int[] groupCounts = getGroupCounts();
2 26 Feb 07 jari 2434         float[][] geneValuesByGroups = new float[groupCounts.length][];
2 26 Feb 07 jari 2435         
2 26 Feb 07 jari 2436         for (int i = 0; i < geneValuesByGroups.length; i++) {
2 26 Feb 07 jari 2437             geneValuesByGroups[i] = new float[groupCounts[i]];
2 26 Feb 07 jari 2438         }
2 26 Feb 07 jari 2439         
2 26 Feb 07 jari 2440         int[] groupCounters = new int[groupCounts.length];
2 26 Feb 07 jari 2441         for (int i = 0; i < groupCounters.length; i++) {
2 26 Feb 07 jari 2442             groupCounters[i] = 0;
2 26 Feb 07 jari 2443         }
2 26 Feb 07 jari 2444         
2 26 Feb 07 jari 2445         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2446             int currentGroup = groupAssignments[i];
2 26 Feb 07 jari 2447             if (currentGroup != 0) {
2 26 Feb 07 jari 2448                 geneValuesByGroups[currentGroup - 1][groupCounters[currentGroup -1]] = geneValues[i];
2 26 Feb 07 jari 2449                 groupCounters[currentGroup - 1]++;
2 26 Feb 07 jari 2450             }
2 26 Feb 07 jari 2451         }
2 26 Feb 07 jari 2452         
2 26 Feb 07 jari 2453         float[] groupMeans = new float[groupCounts.length];
2 26 Feb 07 jari 2454         //DONE UP TO HERE MARCH 03, 2003
2 26 Feb 07 jari 2455         
2 26 Feb 07 jari 2456         for (int i = 0; i < groupMeans.length; i++) {
2 26 Feb 07 jari 2457             groupMeans[i] = getMean(geneValuesByGroups[i]);
2 26 Feb 07 jari 2458         }
2 26 Feb 07 jari 2459         
2 26 Feb 07 jari 2460         double[] convertedGroupMeans = new double[groupMeans.length];
2 26 Feb 07 jari 2461         
2 26 Feb 07 jari 2462         for (int i = 0; i < convertedGroupMeans.length; i++) {
2 26 Feb 07 jari 2463             convertedGroupMeans[i] = (double)(groupMeans[i]);
2 26 Feb 07 jari 2464         }
2 26 Feb 07 jari 2465         return convertedGroupMeans;
2 26 Feb 07 jari 2466     }
2 26 Feb 07 jari 2467     
2 26 Feb 07 jari 2468     private int[] getGroupCounts() { // for multi-class model
2 26 Feb 07 jari 2469        int[] groupCounts = new int[numMultiClassGroups];
2 26 Feb 07 jari 2470        for (int i = 0; i < groupCounts.length; i++) {
2 26 Feb 07 jari 2471            groupCounts[i] = 0;
2 26 Feb 07 jari 2472        }
2 26 Feb 07 jari 2473        for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2474            int currentGroup = groupAssignments[i];
2 26 Feb 07 jari 2475            if (currentGroup != 0) {
2 26 Feb 07 jari 2476             groupCounts[currentGroup - 1]++;
2 26 Feb 07 jari 2477            }
2 26 Feb 07 jari 2478        }
2 26 Feb 07 jari 2479        
2 26 Feb 07 jari 2480        return groupCounts;        
2 26 Feb 07 jari 2481     }
2 26 Feb 07 jari 2482     
2 26 Feb 07 jari 2483     
2 26 Feb 07 jari 2484     
2 26 Feb 07 jari 2485     
2 26 Feb 07 jari 2486     private double sTwoClassUnpaired(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2487         float[] groupAValues, groupBValues;
2 26 Feb 07 jari 2488         int groupACount = 0;
2 26 Feb 07 jari 2489         int groupBCount = 0;
2 26 Feb 07 jari 2490         
2 26 Feb 07 jari 2491         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2492             if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 2493                 groupACount++;
2 26 Feb 07 jari 2494             } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 2495                 groupBCount++;
2 26 Feb 07 jari 2496             }
2 26 Feb 07 jari 2497         } 
2 26 Feb 07 jari 2498         
2 26 Feb 07 jari 2499         groupAValues = new float[groupACount];
2 26 Feb 07 jari 2500         groupBValues = new float[groupBCount];
2 26 Feb 07 jari 2501         //System.out.println("sTwoClassUnpaired(): groupACount = " + groupACount);
2 26 Feb 07 jari 2502         //System.out.println("sTwoClassUnpaired(): groupBCount = " + groupBCount);
2 26 Feb 07 jari 2503         
2 26 Feb 07 jari 2504         groupACount = 0;
2 26 Feb 07 jari 2505         groupBCount = 0;
2 26 Feb 07 jari 2506         
2 26 Feb 07 jari 2507         for (int i = 0; i < groupAssignments.length; i++) {
2 26 Feb 07 jari 2508             if (groupAssignments[i] == SAMInitDialog.GROUP_A) {
2 26 Feb 07 jari 2509                 groupAValues[groupACount] = matrix.A[gene][i];
2 26 Feb 07 jari 2510                 groupACount++;
2 26 Feb 07 jari 2511             } else if (groupAssignments[i] == SAMInitDialog.GROUP_B) {
2 26 Feb 07 jari 2512                 groupBValues[groupBCount] = matrix.A[gene][i];
2 26 Feb 07 jari 2513                 groupBCount++;                
2 26 Feb 07 jari 2514             }
2 26 Feb 07 jari 2515         }
2 26 Feb 07 jari 2516         
2 26 Feb 07 jari 2517         /*
2 26 Feb 07 jari 2518         System.out.print("sTwoClassUnpaired(): groupAValues = ");
2 26 Feb 07 jari 2519         for (int i = 0; i < groupAValues.length; i++) {
2 26 Feb 07 jari 2520             System.out.print(groupAValues[i] + " ");
2 26 Feb 07 jari 2521         }
2 26 Feb 07 jari 2522         System.out.println();
2 26 Feb 07 jari 2523         
2 26 Feb 07 jari 2524         System.out.print("sTwoClassUnpaired(): groupBValues = ");
2 26 Feb 07 jari 2525         for (int i = 0; i < groupBValues.length; i++) {
2 26 Feb 07 jari 2526             System.out.print(groupBValues[i] + " ");
2 26 Feb 07 jari 2527         }
2 26 Feb 07 jari 2528         System.out.println();
2 26 Feb 07 jari 2529          */        
2 26 Feb 07 jari 2530         
2 26 Feb 07 jari 2531         int nA = groupAValues.length;
2 26 Feb 07 jari 2532         int nB = groupBValues.length;
2 26 Feb 07 jari 2533         
2 26 Feb 07 jari 2534         float meanA = getMean(groupAValues);
2 26 Feb 07 jari 2535         float meanB = getMean(groupBValues);
2 26 Feb 07 jari 2536        // System.out.println("nA = " + nA + ", nB = " +nB + ", meanA = " + meanA + ", meanB = " + meanB);
2 26 Feb 07 jari 2537         
2 26 Feb 07 jari 2538         float varA = getVar(groupAValues);
2 26 Feb 07 jari 2539         float varB = getVar(groupBValues);
2 26 Feb 07 jari 2540         //System.out.println("varA = " + varA + ", varB = " + varB);
2 26 Feb 07 jari 2541         
2 26 Feb 07 jari 2542         //double ssquare = (1/nA + 1/nB)*(varA + varB)/(nA + nB - 2);
2 26 Feb 07 jari 2543         //System.out.println("ssquare = " + ssquare);
2 26 Feb 07 jari 2544         //System.out.println("((float)1/nA + (float)1/nB) = " + ((float)1/nA +(float)1/nB) + ", (varA + varB) = " + (varA +varB) + ", (nA + nB - 2) = " + (nA + nB - 2));
2 26 Feb 07 jari 2545         
2 26 Feb 07 jari 2546         double s = Math.sqrt(((float)1/nA + (float)1/nB)*(varA + varB)/(nA + nB - 2));
2 26 Feb 07 jari 2547         
2 26 Feb 07 jari 2548         //float ss = (float)s;
2 26 Feb 07 jari 2549         /*
2 26 Feb 07 jari 2550         if (Float.isNaN(ss)){
2 26 Feb 07 jari 2551             System.out.println("sTwoClassUnpaired(" + gene + ") = " + ss);
2 26 Feb 07 jari 2552             System.out.println("nA = " + nA + ", nB = " + nB + ", varA = " + varA + ", varB = " + varB);
2 26 Feb 07 jari 2553         }
2 26 Feb 07 jari 2554          */
2 26 Feb 07 jari 2555         //System.out.println("s = " +s);
2 26 Feb 07 jari 2556         return s;
2 26 Feb 07 jari 2557         //return ss;
2 26 Feb 07 jari 2558     }
2 26 Feb 07 jari 2559     
2 26 Feb 07 jari 2560     private float getVar(float[] values) {
2 26 Feb 07 jari 2561         float mean = getMean(values);
2 26 Feb 07 jari 2562         float var = 0;
2 26 Feb 07 jari 2563         
2 26 Feb 07 jari 2564         for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2565             if (!Float.isNaN(values[i])) {
2 26 Feb 07 jari 2566                 float sqDev = (values[i] - mean)*(values[i] - mean);
2 26 Feb 07 jari 2567                 var = var + sqDev;
2 26 Feb 07 jari 2568                 
2 26 Feb 07 jari 2569             }
2 26 Feb 07 jari 2570         }
2 26 Feb 07 jari 2571         /*
2 26 Feb 07 jari 2572         if (Float.isNaN(var)) {
2 26 Feb 07 jari 2573             System.out.print("getVar(): values[] = ");
2 26 Feb 07 jari 2574             for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2575                 System.out.print(" " + values[i]);
2 26 Feb 07 jari 2576                 //System.out.println();
2 26 Feb 07 jari 2577             }
2 26 Feb 07 jari 2578             System.out.println();
2 26 Feb 07 jari 2579             System.out.println("getVar(): mean = " + mean);
2 26 Feb 07 jari 2580         }
2 26 Feb 07 jari 2581          */
2 26 Feb 07 jari 2582         
2 26 Feb 07 jari 2583         
2 26 Feb 07 jari 2584         return var;
2 26 Feb 07 jari 2585     }
2 26 Feb 07 jari 2586     
2 26 Feb 07 jari 2587     private double getVar(double[] values) {
2 26 Feb 07 jari 2588         double mean = getMean(values);
2 26 Feb 07 jari 2589         double var = 0;
2 26 Feb 07 jari 2590         for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2591             if (!Double.isNaN(values[i])) {
2 26 Feb 07 jari 2592                 double sqDev = (values[i] - mean)*(values[i] - mean);
2 26 Feb 07 jari 2593                 var = var + sqDev;
2 26 Feb 07 jari 2594             }
2 26 Feb 07 jari 2595         }
2 26 Feb 07 jari 2596         /*
2 26 Feb 07 jari 2597         if (Float.isNaN(var)) {
2 26 Feb 07 jari 2598             System.out.print("getVar(): values[] = ");
2 26 Feb 07 jari 2599             for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2600                 System.out.print(" " + values[i]);
2 26 Feb 07 jari 2601                 //System.out.println();
2 26 Feb 07 jari 2602             }
2 26 Feb 07 jari 2603             System.out.println();
2 26 Feb 07 jari 2604             System.out.println("getVar(): mean = " + mean);
2 26 Feb 07 jari 2605         }
2 26 Feb 07 jari 2606          */
2 26 Feb 07 jari 2607         
2 26 Feb 07 jari 2608         return var;
2 26 Feb 07 jari 2609     }    
2 26 Feb 07 jari 2610     
2 26 Feb 07 jari 2611     private float getVariance(float[] values) {
2 26 Feb 07 jari 2612         float mean = getMean(values);
2 26 Feb 07 jari 2613         float var = 0;
2 26 Feb 07 jari 2614         int validN = 0;
2 26 Feb 07 jari 2615         for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2616             if (!Float.isNaN(values[i])) {
2 26 Feb 07 jari 2617                 float sqDev = (values[i] - mean)*(values[i] - mean);
2 26 Feb 07 jari 2618                 var = var + sqDev;
2 26 Feb 07 jari 2619                 validN++;
2 26 Feb 07 jari 2620             }
2 26 Feb 07 jari 2621         }
2 26 Feb 07 jari 2622         
2 26 Feb 07 jari 2623         if (validN == 1) {
2 26 Feb 07 jari 2624             return 0.0f;
2 26 Feb 07 jari 2625         } else if (validN < 1) {
2 26 Feb 07 jari 2626             return Float.NaN;
2 26 Feb 07 jari 2627         }
2 26 Feb 07 jari 2628         /*
2 26 Feb 07 jari 2629         if (Float.isNaN(var)) {
2 26 Feb 07 jari 2630             System.out.print("getVar(): values[] = ");
2 26 Feb 07 jari 2631             for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2632                 System.out.print(" " + values[i]);
2 26 Feb 07 jari 2633                 //System.out.println();
2 26 Feb 07 jari 2634             }
2 26 Feb 07 jari 2635             System.out.println();
2 26 Feb 07 jari 2636             System.out.println("getVar(): mean = " + mean);
2 26 Feb 07 jari 2637         }
2 26 Feb 07 jari 2638          */
2 26 Feb 07 jari 2639         
2 26 Feb 07 jari 2640         
2 26 Feb 07 jari 2641         return var/validN;
2 26 Feb 07 jari 2642     }
2 26 Feb 07 jari 2643     
2 26 Feb 07 jari 2644     private double getVariance(double[] values) {
2 26 Feb 07 jari 2645         double mean = getMean(values);
2 26 Feb 07 jari 2646         double var = 0;
2 26 Feb 07 jari 2647         int validN = 0;
2 26 Feb 07 jari 2648         for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2649             if (!Double.isNaN(values[i])) {
2 26 Feb 07 jari 2650                 double sqDev = (values[i] - mean)*(values[i] - mean);
2 26 Feb 07 jari 2651                 var = var + sqDev;
2 26 Feb 07 jari 2652                 validN++;
2 26 Feb 07 jari 2653             }
2 26 Feb 07 jari 2654         }
2 26 Feb 07 jari 2655         
2 26 Feb 07 jari 2656         if (validN == 1) {
2 26 Feb 07 jari 2657             return 0.0d;
2 26 Feb 07 jari 2658         } else if (validN < 1) {
2 26 Feb 07 jari 2659             return Double.NaN;
2 26 Feb 07 jari 2660         }        
2 26 Feb 07 jari 2661         /*
2 26 Feb 07 jari 2662         if (Float.isNaN(var)) {
2 26 Feb 07 jari 2663             System.out.print("getVar(): values[] = ");
2 26 Feb 07 jari 2664             for (int i = 0; i < values.length; i++) {
2 26 Feb 07 jari 2665                 System.out.print(" " + values[i]);
2 26 Feb 07 jari 2666                 //System.out.println();
2 26 Feb 07 jari 2667             }
2 26 Feb 07 jari 2668             System.out.println();
2 26 Feb 07 jari 2669             System.out.println("getVar(): mean = " + mean);
2 26 Feb 07 jari 2670         }
2 26 Feb 07 jari 2671          */
2 26 Feb 07 jari 2672         
2 26 Feb 07 jari 2673         return var/validN;
2 26 Feb 07 jari 2674     }
2 26 Feb 07 jari 2675     
2 26 Feb 07 jari 2676     private double[] getQValues() {
2 26 Feb 07 jari 2677         double[] qValues = new double[101];
2 26 Feb 07 jari 2678         qValues[0] = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 2679         for (int i = 1; i < qValues.length; i++) { // ****** NOTE THE INDICES
2 26 Feb 07 jari 2680             qValues[i] = getSAlpha(i);
2 26 Feb 07 jari 2681         }
2 26 Feb 07 jari 2682         
2 26 Feb 07 jari 2683         return qValues;
2 26 Feb 07 jari 2684     }
2 26 Feb 07 jari 2685     
2 26 Feb 07 jari 2686     private double getSNought() throws AlgorithmException {
2 26 Feb 07 jari 2687         double sNot = 0;
2 26 Feb 07 jari 2688         
2 26 Feb 07 jari 2689         /*
2 26 Feb 07 jari 2690         double[] qValues = new double[101];
2 26 Feb 07 jari 2691         qValues[0] = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 2692         for (int i = 1; i < qValues.length; i++) { // ****** NOTE THE INDICES
2 26 Feb 07 jari 2693             //System.out.println("in getSNought(): populating qValues[" + i + "]");
2 26 Feb 07 jari 2694             qValues[i] = getSAlpha(i);
2 26 Feb 07 jari 2695             //System.out.println("qValues[" + i + "] = " + qValues[i]);
2 26 Feb 07 jari 2696         }
2 26 Feb 07 jari 2697          */
2 26 Feb 07 jari 2698  //**** UP TO HERE 12/19/02 
2 26 Feb 07 jari 2699         
2 26 Feb 07 jari 2700         /*
2 26 Feb 07 jari 2701         for (int i = 0; i < qValues.length; i++) {
2 26 Feb 07 jari 2702             System.out.println("inside getSNought(): qValues[" + i + "] = " + qValues[i]);
2 26 Feb 07 jari 2703         }
2 26 Feb 07 jari 2704          */        
2 26 Feb 07 jari 2705         double[] qValues = globalAllQValues;
2 26 Feb 07 jari 2706         //double[] alphaArray = new double[21];
2 26 Feb 07 jari 2707         double[] alphaArray = new double[101];
2 26 Feb 07 jari 2708         double currentAlpha = 0;
2 26 Feb 07 jari 2709         for (int i = 0; i < alphaArray.length; i++) {
2 26 Feb 07 jari 2710             alphaArray[i] = currentAlpha;
2 26 Feb 07 jari 2711             //currentAlpha = currentAlpha + 5;
2 26 Feb 07 jari 2712             currentAlpha = currentAlpha + 1;
2 26 Feb 07 jari 2713             if (currentAlpha > 100) {
2 26 Feb 07 jari 2714                 currentAlpha = 100;
2 26 Feb 07 jari 2715             }
2 26 Feb 07 jari 2716         }
2 26 Feb 07 jari 2717         
2 26 Feb 07 jari 2718         /*
2 26 Feb 07 jari 2719         for (int i = 0; i < alphaArray.length; i++) {
2 26 Feb 07 jari 2720             System.out.println("inside getSNought(): alphaArray[" + i + "] = " + alphaArray[i]);
2 26 Feb 07 jari 2721         }
2 26 Feb 07 jari 2722          */
2 26 Feb 07 jari 2723         
2 26 Feb 07 jari 2724         double[] cvAlphaArray = new double[alphaArray.length];
2 26 Feb 07 jari 2725         
2 26 Feb 07 jari 2726   AlgorithmEvent event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, alphaArray.length);
2 26 Feb 07 jari 2727   fireValueChanged(event);
2 26 Feb 07 jari 2728   event.setId(AlgorithmEvent.PROGRESS_VALUE);        
2 26 Feb 07 jari 2729         
2 26 Feb 07 jari 2730         for (int i = 0; i < alphaArray.length; i++) {
2 26 Feb 07 jari 2731             //System.out.println("inside getSNought(): cvAlphaArray[" +i + "] ");
2 26 Feb 07 jari 2732             if (stop) {
2 26 Feb 07 jari 2733                 throw new AbortException();
2 26 Feb 07 jari 2734             }  
2 26 Feb 07 jari 2735             event.setIntValue(i);
2 26 Feb 07 jari 2736             event.setDescription("Calculating S0: Current alpha = " + alphaArray[i]);
2 26 Feb 07 jari 2737             fireValueChanged(event);            
2 26 Feb 07 jari 2738             cvAlphaArray[i] = getCvAlpha(alphaArray[i], qValues);
2 26 Feb 07 jari 2739             //System.out.println("inside getSNought(): cvAlphaArray[" +i + "] = " + cvAlphaArray[i]);
2 26 Feb 07 jari 2740         }
2 26 Feb 07 jari 2741         /*
2 26 Feb 07 jari 2742         for (int i = 0; i < cvAlphaArray.length; i++) {
2 26 Feb 07 jari 2743             System.out.println("cvAlphaArray[" + i + "] = " + cvAlphaArray[i]);
2 26 Feb 07 jari 2744         }
2 26 Feb 07 jari 2745          */
2 26 Feb 07 jari 2746         
2 26 Feb 07 jari 2747         
2 26 Feb 07 jari 2748         QSort sortCvAlphaArray = new QSort(cvAlphaArray);
2 26 Feb 07 jari 2749         double[] sortedCvAlphaArray = sortCvAlphaArray.getSortedDouble();
2 26 Feb 07 jari 2750         int[] sortedCvAlphaArrayIndices = sortCvAlphaArray.getOrigIndx();
2 26 Feb 07 jari 2751         /*
2 26 Feb 07 jari 2752         for (int i = 0; i < sortedCvAlphaArray.length; i++) {
2 26 Feb 07 jari 2753             System.out.println("sortedCvAlphaArray[" + i + "] = " + sortedCvAlphaArray[i]);
2 26 Feb 07 jari 2754         }   
2 26 Feb 07 jari 2755         
2 26 Feb 07 jari 2756         for (int i = 0; i < sortedCvAlphaArrayIndices.length; i++) {
2 26 Feb 07 jari 2757             System.out.println("sortedCvAlphaArrayIndices[" + i + "] = " + sortedCvAlphaArrayIndices[i]);
2 26 Feb 07 jari 2758         }        
2 26 Feb 07 jari 2759         */
2 26 Feb 07 jari 2760         int minAlphaIndex = sortedCvAlphaArrayIndices[0];
2 26 Feb 07 jari 2761
2 26 Feb 07 jari 2762         double argminAlpha = alphaArray[minAlphaIndex];
2 26 Feb 07 jari 2763         /*
2 26 Feb 07 jari 2764         System.out.println("minAlphaIndex = " + minAlphaIndex + ", argminAlpha = " + argminAlpha);     
2 26 Feb 07 jari 2765         
2 26 Feb 07 jari 2766         for (int i = 0; i < alphaArray.length; i++) {
2 26 Feb 07 jari 2767             System.out.println("sAlpha(" + alphaArray[i] + ") = " + getSAlpha(alphaArray[i]));
2 26 Feb 07 jari 2768         }
2 26 Feb 07 jari 2769          */
2 26 Feb 07 jari 2770         
2 26 Feb 07 jari 2771         sNot = getSAlpha(argminAlpha);
2 26 Feb 07 jari 2772         //IMPLEMENT HERE: TO GET ARGMIN OF CVALPHA
2 26 Feb 07 jari 2773         //System.out.println("sNought = " + sNot);
2 26 Feb 07 jari 2774         s0Percentile = argminAlpha;
2 26 Feb 07 jari 2775         return sNot;
2 26 Feb 07 jari 2776     }
2 26 Feb 07 jari 2777     
2 26 Feb 07 jari 2778
2 26 Feb 07 jari 2779     private double getCvAlpha(double alpha, double[] qValues) {
2 26 Feb 07 jari 2780         //Vector vjValues = new Vector();
2 26 Feb 07 jari 2781         
2 26 Feb 07 jari 2782         /*
2 26 Feb 07 jari 2783         for (int j = 1; j < 101; j++) {
2 26 Feb 07 jari 2784         //for (int j = 1; j < numExps + 1; j++) {
2 26 Feb 07 jari 2785             double vJ = getMAD(j, alpha); //MAD = median absolute deviation
2 26 Feb 07 jari 2786             vjValues.add(new Double(vJ));
2 26 Feb 07 jari 2787         }
2 26 Feb 07 jari 2788          */
2 26 Feb 07 jari 2789         
2 26 Feb 07 jari 2790         //double[] vjValuesArray = new double[vjValues.size()];
2 26 Feb 07 jari 2791         double[] vjValuesArray = new double[100];
2 26 Feb 07 jari 2792         for (int i = 0; i < vjValuesArray.length; i++) {
2 26 Feb 07 jari 2793             //vjValuesArray[i] = ((Double)vjValues.get(i)).doubleValue();
2 26 Feb 07 jari 2794             vjValuesArray[i] = getMAD(i + 1, alpha); //MAD = median absolute deviation
2 26 Feb 07 jari 2795         }
2 26 Feb 07 jari 2796         
2 26 Feb 07 jari 2797         
2 26 Feb 07 jari 2798         double var = getVar(vjValuesArray);
2 26 Feb 07 jari 2799         double mean = getMean(vjValuesArray);
2 26 Feb 07 jari 2800         /*
2 26 Feb 07 jari 2801         for (int i = 0; i < vjValuesArray.length; i++) {
2 26 Feb 07 jari 2802             System.out.println("getCvAlphaA(): alpha = " + alpha + ", vjValuesArray[" + i + "] = " + vjValuesArray[i]);
2 26 Feb 07 jari 2803         }
2 26 Feb 07 jari 2804         System.out.println("getcvAlpha(): alpha = " + alpha + ", Variance (vjValuesArray) = " + var/vjValuesArray.length + ", mean(vjValuesArray) = " + mean);
2 26 Feb 07 jari 2805          */
2 26 Feb 07 jari 2806         
2 26 Feb 07 jari 2807         double n = 0d;
2 26 Feb 07 jari 2808         for (int i = 0; i < vjValuesArray.length; i++) {
2 26 Feb 07 jari 2809             if (!Double.isNaN(vjValuesArray[i])) {
2 26 Feb 07 jari 2810                 n = n + 1;
2 26 Feb 07 jari 2811             }
2 26 Feb 07 jari 2812         }
2 26 Feb 07 jari 2813         
2 26 Feb 07 jari 2814         if (n == 1d) {
2 26 Feb 07 jari 2815             return 0d;
2 26 Feb 07 jari 2816         } else if (n == 0d) {
2 26 Feb 07 jari 2817             return Double.NaN;
2 26 Feb 07 jari 2818         }
2 26 Feb 07 jari 2819         
2 26 Feb 07 jari 2820         double stdDev = (double)Math.sqrt(var/(n - 1));
2 26 Feb 07 jari 2821         
2 26 Feb 07 jari 2822         //System.out.println("getcvAlpha(): alpha = " + alpha + ": " + stdDev/mean);
2 26 Feb 07 jari 2823         
2 26 Feb 07 jari 2824         return (stdDev / mean);
2 26 Feb 07 jari 2825         
2 26 Feb 07 jari 2826     }
2 26 Feb 07 jari 2827     
2 26 Feb 07 jari 2828     private double getMAD(int j, double alpha) { //MAD  = median absolute deviation
2 26 Feb 07 jari 2829         //double[] sValues = getAllSValues();
2 26 Feb 07 jari 2830         double[] sValues = globalAllSValues;
2 26 Feb 07 jari 2831         //System.out.println("getMAD(): sValues.length = " + sValues.length);
2 26 Feb 07 jari 2832         
2 26 Feb 07 jari 2833         /*
2 26 Feb 07 jari 2834         for (int i = 0; i < sValues.length; i++) {
2 26 Feb 07 jari 2835             System.out.println("getMAD(): sValues[" + i + "] = " + sValues[i]);
2 26 Feb 07 jari 2836         }
2 26 Feb 07 jari 2837          */
2 26 Feb 07 jari 2838         
2 26 Feb 07 jari 2839         //double[] qValues = getQValues();
2 26 Feb 07 jari 2840         double[] qValues = globalAllQValues;
2 26 Feb 07 jari 2841         /*
2 26 Feb 07 jari 2842         for (int i = 0; i < qValues.length; i++) {
2 26 Feb 07 jari 2843             System.out.println("getMAD(): qValues[" + i + "] = " + qValues[i]);
2 26 Feb 07 jari 2844         }   
2 26 Feb 07 jari 2845          */     
2 26 Feb 07 jari 2846         //System.out.println("getMAD(): qValues.length = " + qValues.length);
2 26 Feb 07 jari 2847         Vector validSValuesAndGenes = getValidSValuesAndGenes(sValues, qValues, j);
2 26 Feb 07 jari 2848         Vector validSValues = (Vector)validSValuesAndGenes.get(0);
2 26 Feb 07 jari 2849         Vector validGenes = (Vector)validSValuesAndGenes.get(1);
2 26 Feb 07 jari 2850         //System.out.println("getMAD(" + j + ", " + alpha + "): validSValues.size() = " + validSValues.size() + ", validGenes.size() = " + validGenes.size());
2 26 Feb 07 jari 2851                 
2 26 Feb 07 jari 2852         double[] dValues = new double[validSValues.size()];
2 26 Feb 07 jari 2853         //System.out.println("getMAD(): dValues.length = " + dValues.length);
2 26 Feb 07 jari 2854         
2 26 Feb 07 jari 2855         for (int i = 0; i < dValues.length; i++) {
2 26 Feb 07 jari 2856             int currentGene = ((Integer)validGenes.get(i)).intValue();
2 26 Feb 07 jari 2857             //float currentSValue = ((Float)validSValues.get(i)).floatValue();
2 26 Feb 07 jari 2858             //float currentSAlpha = getSAlpha(alpha);
2 26 Feb 07 jari 2859             double currentD = getDAlpha(currentGene, alpha);
2 26 Feb 07 jari 2860             dValues[i] = currentD;
2 26 Feb 07 jari 2861         }
2 26 Feb 07 jari 2862         /*
2 26 Feb 07 jari 2863         for (int i = 0; i < dValues.length; i++) {
2 26 Feb 07 jari 2864             System.out.println("getMAD(): dValues[" + i + "] = " + dValues[i]);
2 26 Feb 07 jari 2865         }
2 26 Feb 07 jari 2866          */
2 26 Feb 07 jari 2867         
2 26 Feb 07 jari 2868         double medianD = getMedian(dValues);
2 26 Feb 07 jari 2869         //double medianD = getMedian(dValues)/0.64d;
2 26 Feb 07 jari 2870         //System.out.println("getMAD(): medianD = " + medianD);
2 26 Feb 07 jari 2871         
2 26 Feb 07 jari 2872         double[] absDevValues = new double[dValues.length];
2 26 Feb 07 jari 2873         
2 26 Feb 07 jari 2874         for (int i = 0; i < dValues.length; i++) {
2 26 Feb 07 jari 2875             absDevValues[i] = Math.abs(dValues[i] - medianD);
2 26 Feb 07 jari 2876         }
2 26 Feb 07 jari 2877         
2 26 Feb 07 jari 2878         //double medianAbsDev = getMedian(absDevValues)/0.64d;
2 26 Feb 07 jari 2879         double medianAbsDev = getMedian(absDevValues)/0.6745d; //SAM manual says 0.64, but apparently it should be 0.6745 to normalize the MAD; from SAM newsgroup and James MacDonald, U. Mich.
2 26 Feb 07 jari 2880         //System.out.println("getMAD(): medianAbsDev = " + medianAbsDev);
2 26 Feb 07 jari 2881         //double medianAbsDev = getMedian(absDevValues);
2 26 Feb 07 jari 2882         return medianAbsDev;
2 26 Feb 07 jari 2883         
2 26 Feb 07 jari 2884         //COMPLETE THIS METHOD
2 26 Feb 07 jari 2885     }
2 26 Feb 07 jari 2886     
2 26 Feb 07 jari 2887     private double getMedian(double[] array) {
2 26 Feb 07 jari 2888         QSort sortArray = new QSort(array);
2 26 Feb 07 jari 2889         double median = 0;
2 26 Feb 07 jari 2890         double[] sortedArray = sortArray.getSortedDouble();
2 26 Feb 07 jari 2891         //System.out.println("getMedian(): sortedArray.length = " + sortedArray.length);
2 26 Feb 07 jari 2892         if ((sortedArray.length)%2 == 0) {
2 26 Feb 07 jari 2893             double mid2 = (double)(sortedArray.length/2);
2 26 Feb 07 jari 2894             //System.out.println("mid2 = " + mid2);
2 26 Feb 07 jari 2895             int midIndex2 = (int)Math.round(mid2);
2 26 Feb 07 jari 2896             //System.out.println("midIndex2 = " + midIndex2);
2 26 Feb 07 jari 2897             int midIndex1 = midIndex2 - 1;
2 26 Feb 07 jari 2898             //System.out.println("midIndex1 = " + midIndex1);
2 26 Feb 07 jari 2899             median = (double)((sortedArray[midIndex2] + sortedArray[midIndex1])/2.0d);
2 26 Feb 07 jari 2900             
2 26 Feb 07 jari 2901         } else {
2 26 Feb 07 jari 2902             double mid = (double)(sortedArray.length/2 - 0.5);
2 26 Feb 07 jari 2903             int midIndex = (int)Math.round(mid);
2 26 Feb 07 jari 2904             median = sortedArray[midIndex];
2 26 Feb 07 jari 2905         }
2 26 Feb 07 jari 2906         
2 26 Feb 07 jari 2907         return median;
2 26 Feb 07 jari 2908     }
2 26 Feb 07 jari 2909     
2 26 Feb 07 jari 2910     
2 26 Feb 07 jari 2911    private Vector getValidSValuesAndGenes(double[] sValues, double[] qValues, int j) {
2 26 Feb 07 jari 2912        Vector validSValuesAndGenes = new Vector();
2 26 Feb 07 jari 2913        Vector validSValues = new Vector();
2 26 Feb 07 jari 2914        Vector validGenes = new Vector();
2 26 Feb 07 jari 2915        /*
2 26 Feb 07 jari 2916        for (int i = 0; i < sValues.length; i++) {
2 26 Feb 07 jari 2917            System.out.println("sValues[" + i + "] = " + sValues[i]);
2 26 Feb 07 jari 2918        }
2 26 Feb 07 jari 2919        System.out.println();
2 26 Feb 07 jari 2920
2 26 Feb 07 jari 2921        for (int i = 0; i < qValues.length; i++) {
2 26 Feb 07 jari 2922            System.out.println("qValues[" + i + "] = " + qValues[i]);
2 26 Feb 07 jari 2923        }
2 26 Feb 07 jari 2924         */
2 26 Feb 07 jari 2925          
2 26 Feb 07 jari 2926        //System.out.println("j = " +j);
2 26 Feb 07 jari 2927        
2 26 Feb 07 jari 2928        if (j == 100) {
2 26 Feb 07 jari 2929            for (int i = 0; i < sValues.length; i++) {
2 26 Feb 07 jari 2930                if (sValues[i] >= qValues[j]) {
2 26 Feb 07 jari 2931                    validSValues.add(new Double(sValues[i]));
2 26 Feb 07 jari 2932                    validGenes.add(new Integer(i));
2 26 Feb 07 jari 2933                } 
2 26 Feb 07 jari 2934            }           
2 26 Feb 07 jari 2935            /*
2 26 Feb 07 jari 2936            for (int i = 0; i < sValues.length; i++) {
2 26 Feb 07 jari 2937                validSValues.add(new Double(sValues[i]));
2 26 Feb 07 jari 2938                validGenes.add(new Integer(i));
2 26 Feb 07 jari 2939            }
2 26 Feb 07 jari 2940             */
2 26 Feb 07 jari 2941        } else {
2 26 Feb 07 jari 2942            //Vector validSValuesVector = new Vector();
2 26 Feb 07 jari 2943            for (int i = 0; i < sValues.length; i++) {
2 26 Feb 07 jari 2944                if ( (sValues[i] >= qValues[j])&&(sValues[i] < qValues[j+1]) ) {
2 26 Feb 07 jari 2945                    validSValues.add(new Double(sValues[i]));
2 26 Feb 07 jari 2946                    validGenes.add(new Integer(i));
2 26 Feb 07 jari 2947                } else if ((sValues[i] == qValues[j])&&(sValues[i] == qValues[j+1])) {
2 26 Feb 07 jari 2948                    validSValues.add(new Double(sValues[i]));
2 26 Feb 07 jari 2949                    validGenes.add(new Integer(i));                   
2 26 Feb 07 jari 2950                }
2 26 Feb 07 jari 2951            }
2 26 Feb 07 jari 2952            
2 26 Feb 07 jari 2953        }
2 26 Feb 07 jari 2954        /*
2 26 Feb 07 jari 2955        for (int i = 0; i < validSValues.size(); i++) {
2 26 Feb 07 jari 2956            int currentGene = ((Integer)validGenes.get(i)).intValue();
2 26 Feb 07 jari 2957            double currentSValue = ((Double)validSValues.get(i)).doubleValue();
2 26 Feb 07 jari 2958            if (j == 100) {
2 26 Feb 07 jari 2959             System.out.println("getValidSValuesAndGenes(): percentile (j) = " + j + "; qValues[" + j + "] = " + qValues[j] +  "; validGene = " + currentGene + ", validSValue = " + currentSValue);   
2 26 Feb 07 jari 2960            } else {
2 26 Feb 07 jari 2961             System.out.println("getValidSValuesAndGenes(): percentile (j) = " + j + "; qValues[" + j + "] = " + qValues[j] + ", qValues[" + (j+1) + "] = " + qValues[j+1] + "; validGene = " + currentGene + ", validSValue = " + currentSValue);
2 26 Feb 07 jari 2962            }
2 26 Feb 07 jari 2963        }
2 26 Feb 07 jari 2964         */
2 26 Feb 07 jari 2965        
2 26 Feb 07 jari 2966        validSValuesAndGenes.add(validSValues);
2 26 Feb 07 jari 2967        validSValuesAndGenes.add(validGenes);
2 26 Feb 07 jari 2968        
2 26 Feb 07 jari 2969        return validSValuesAndGenes;
2 26 Feb 07 jari 2970    }
2 26 Feb 07 jari 2971     
2 26 Feb 07 jari 2972    
2 26 Feb 07 jari 2973    
2 26 Feb 07 jari 2974    private double getD(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 2975        return (getR(gene, matrix)/(getS(gene, matrix) + sNought));
2 26 Feb 07 jari 2976    }
2 26 Feb 07 jari 2977    
2 26 Feb 07 jari 2978     
2 26 Feb 07 jari 2979     private double getDAlpha(int gene, double alpha) {
2 26 Feb 07 jari 2980         return ( getR(gene, imputedMatrix)/(getS(gene, imputedMatrix) + getSAlpha(alpha)) );
2 26 Feb 07 jari 2981     }
2 26 Feb 07 jari 2982     
2 26 Feb 07 jari 2983     private double getSAlpha(double percentile) {
2 26 Feb 07 jari 2984         double sAlpha = 0;
2 26 Feb 07 jari 2985         /*
2 26 Feb 07 jari 2986         double[] sValues = new double[numGenes];
2 26 Feb 07 jari 2987         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 2988             sValues[i] = getS(i, imputedMatrix);
2 26 Feb 07 jari 2989         }
2 26 Feb 07 jari 2990          */
2 26 Feb 07 jari 2991         
2 26 Feb 07 jari 2992         //QSort sortSValues = new QSort(sValues);
2 26 Feb 07 jari 2993        // double[] sortedSValues = sortSValues.getSortedDouble();
2 26 Feb 07 jari 2994         double[] sortedSValues = globalSortedAllSValues;
2 26 Feb 07 jari 2995         //int percentileIndex = (int)Math.round((sortedSValues.length - 1)*percentile/100);
2 26 Feb 07 jari 2996         int percentileIndex = (int)(Math.floor(sortedSValues.length*percentile/100)) - 1;
2 26 Feb 07 jari 2997         if (percentileIndex < 0) {
2 26 Feb 07 jari 2998             percentileIndex = 0;
2 26 Feb 07 jari 2999         } else if (percentileIndex  >= sortedSValues.length) {
2 26 Feb 07 jari 3000             percentileIndex = sortedSValues.length - 1;
2 26 Feb 07 jari 3001         }
2 26 Feb 07 jari 3002         //System.out.println("getSAlpha(): percentile = " + percentile + ", percentileIndex = " + percentileIndex);
2 26 Feb 07 jari 3003         sAlpha = sortedSValues[percentileIndex];
2 26 Feb 07 jari 3004         return sAlpha;
2 26 Feb 07 jari 3005     }
2 26 Feb 07 jari 3006     
2 26 Feb 07 jari 3007     private double[] getAllSValues() {
2 26 Feb 07 jari 3008         double[] sValues = new double[numGenes];
2 26 Feb 07 jari 3009         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 3010             sValues[i] = getS(i, imputedMatrix);
2 26 Feb 07 jari 3011         
2 26 Feb 07 jari 3012         }
2 26 Feb 07 jari 3013         
2 26 Feb 07 jari 3014         return sValues;
2 26 Feb 07 jari 3015     }
2 26 Feb 07 jari 3016     
2 26 Feb 07 jari 3017     private double getS(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 3018         double s  = 0;
2 26 Feb 07 jari 3019         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 3020             //System.out.println("getS(): this block entered");
2 26 Feb 07 jari 3021             return sTwoClassUnpaired(gene, matrix);
2 26 Feb 07 jari 3022         } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 3023             return sTwoClassPaired(gene, matrix);
2 26 Feb 07 jari 3024         } else if (studyDesign == SAMInitDialog.MULTI_CLASS) {
2 26 Feb 07 jari 3025             return sMultiClass(gene, matrix);
2 26 Feb 07 jari 3026         } else if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 3027             return sCensoredSurvival(gene, matrix);
2 26 Feb 07 jari 3028         } else if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 3029             return sOneClass(gene, matrix);
2 26 Feb 07 jari 3030         }
2 26 Feb 07 jari 3031         
2 26 Feb 07 jari 3032         return s;
2 26 Feb 07 jari 3033     }
2 26 Feb 07 jari 3034     
2 26 Feb 07 jari 3035     private double getR(int gene, FloatMatrix matrix) {
2 26 Feb 07 jari 3036         double r = 0;
2 26 Feb 07 jari 3037         
2 26 Feb 07 jari 3038         if (studyDesign == SAMInitDialog.TWO_CLASS_UNPAIRED) {
2 26 Feb 07 jari 3039             return rTwoClassUnpaired(gene, matrix);
2 26 Feb 07 jari 3040         } else if (studyDesign == SAMInitDialog.TWO_CLASS_PAIRED) {
2 26 Feb 07 jari 3041             return rTwoClassPaired(gene, matrix);
2 26 Feb 07 jari 3042         } else if (studyDesign == SAMInitDialog.MULTI_CLASS) {
2 26 Feb 07 jari 3043             return rMultiClass(gene, matrix);
2 26 Feb 07 jari 3044         } else if (studyDesign == SAMInitDialog.CENSORED_SURVIVAL) {
2 26 Feb 07 jari 3045             return rCensoredSurvival(gene, matrix);
2 26 Feb 07 jari 3046         } else if (studyDesign == SAMInitDialog.ONE_CLASS) {
2 26 Feb 07 jari 3047             return rOneClass(gene, matrix);
2 26 Feb 07 jari 3048         }
2 26 Feb 07 jari 3049         
2 26 Feb 07 jari 3050         return r;
2 26 Feb 07 jari 3051     }
2 26 Feb 07 jari 3052     
2 26 Feb 07 jari 3053     private void printMatrix(FloatMatrix mat, String fileName) throws Exception {
2 26 Feb 07 jari 3054         File outFile = new File(fileName);
2 26 Feb 07 jari 3055         PrintWriter out = new PrintWriter(new FileOutputStream(outFile));
2 26 Feb 07 jari 3056         for (int i = 0; i < mat.getRowDimension(); i++) {
2 26 Feb 07 jari 3057             for (int j = 0; j < mat.getColumnDimension(); j++) {
2 26 Feb 07 jari 3058                 out.print(mat.A[i][j]);
2 26 Feb 07 jari 3059                 if (j < mat.getColumnDimension() - 1) {
2 26 Feb 07 jari 3060                     out.print("\t");
2 26 Feb 07 jari 3061                 }
2 26 Feb 07 jari 3062             }
2 26 Feb 07 jari 3063             out.print("\n");
2 26 Feb 07 jari 3064         }
2 26 Feb 07 jari 3065         out.flush();
2 26 Feb 07 jari 3066         out.close();
2 26 Feb 07 jari 3067     }
2 26 Feb 07 jari 3068     
2 26 Feb 07 jari 3069     private FloatMatrix imputeRowAverageMatrix(FloatMatrix inputMatrix) throws AlgorithmException {
2 26 Feb 07 jari 3070         int numRows = inputMatrix.getRowDimension();
2 26 Feb 07 jari 3071         int numCols = inputMatrix.getColumnDimension();
2 26 Feb 07 jari 3072         FloatMatrix resultMatrix = new FloatMatrix(numRows, numCols);
2 26 Feb 07 jari 3073         
2 26 Feb 07 jari 3074         AlgorithmEvent event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numGenes);
2 26 Feb 07 jari 3075         fireValueChanged(event);
2 26 Feb 07 jari 3076         event.setId(AlgorithmEvent.PROGRESS_VALUE);        
2 26 Feb 07 jari 3077         
2 26 Feb 07 jari 3078         for (int i = 0; i < numRows; i++) {
2 26 Feb 07 jari 3079             
2 26 Feb 07 jari 3080             if (stop) {
2 26 Feb 07 jari 3081                 throw new AbortException();
2 26 Feb 07 jari 3082             }          
2 26 Feb 07 jari 3083             event.setIntValue(i);
2 26 Feb 07 jari 3084             event.setDescription("Imputing missing values: Current gene = " + (i+ 1));
2 26 Feb 07 jari 3085             fireValueChanged(event);            
2 26 Feb 07 jari 3086             
2 26 Feb 07 jari 3087             float[] currentRow = new float[numCols];
2 26 Feb 07 jari 3088             float[] currentOrigRow = new float[numCols];
2 26 Feb 07 jari 3089             for (int j = 0; j < numCols; j++) {
2 26 Feb 07 jari 3090                 currentRow[j] = inputMatrix.A[i][j];
2 26 Feb 07 jari 3091                 currentOrigRow[j] = inputMatrix.A[i][j];
2 26 Feb 07 jari 3092             }
2 26 Feb 07 jari 3093             for (int k = 0; k < numCols; k++) {
2 26 Feb 07 jari 3094                 if (Float.isNaN(inputMatrix.A[i][k])) {
2 26 Feb 07 jari 3095                     currentRow[k] = getMean(currentOrigRow);
2 26 Feb 07 jari 3096                 }
2 26 Feb 07 jari 3097             }
2 26 Feb 07 jari 3098             
2 26 Feb 07 jari 3099             for (int l = 0; l < numCols; l++) {
2 26 Feb 07 jari 3100                 resultMatrix.A[i][l] = currentRow[l];
2 26 Feb 07 jari 3101             }
2 26 Feb 07 jari 3102         }
2 26 Feb 07 jari 3103         
2 26 Feb 07 jari 3104         return resultMatrix;
2 26 Feb 07 jari 3105     }
2 26 Feb 07 jari 3106     
2 26 Feb 07 jari 3107     private float getMean(float[] row) {
2 26 Feb 07 jari 3108         float mean = 0.0f;
2 26 Feb 07 jari 3109         int validN = 0;
2 26 Feb 07 jari 3110         
2 26 Feb 07 jari 3111         for (int i = 0; i < row.length; i++) {
2 26 Feb 07 jari 3112             if (!Float.isNaN(row[i])) {
2 26 Feb 07 jari 3113                 mean = mean + row[i];
2 26 Feb 07 jari 3114                 validN++;
2 26 Feb 07 jari 3115             }
2 26 Feb 07 jari 3116         }
2 26 Feb 07 jari 3117         
2 26 Feb 07 jari 3118         if (validN == 0) {
2 26 Feb 07 jari 3119             validN = 1; // if the whole row is NaN, it will be set to zero;
2 26 Feb 07 jari 3120         }
2 26 Feb 07 jari 3121         
2 26 Feb 07 jari 3122         mean = (float)(mean / validN);
2 26 Feb 07 jari 3123         
2 26 Feb 07 jari 3124         return mean;
2 26 Feb 07 jari 3125     }
2 26 Feb 07 jari 3126     
2 26 Feb 07 jari 3127     private double getMean(double[] row) {
2 26 Feb 07 jari 3128         double mean = 0.0f;
2 26 Feb 07 jari 3129         int validN = 0;
2 26 Feb 07 jari 3130         
2 26 Feb 07 jari 3131         for (int i = 0; i < row.length; i++) {
2 26 Feb 07 jari 3132             if (!Double.isNaN(row[i])) {
2 26 Feb 07 jari 3133                 mean = mean + row[i];
2 26 Feb 07 jari 3134                 validN++;
2 26 Feb 07 jari 3135             }
2 26 Feb 07 jari 3136         }
2 26 Feb 07 jari 3137         
2 26 Feb 07 jari 3138         if (validN == 0) {
2 26 Feb 07 jari 3139             validN = 1; // if the whole row is NaN, it will be set to zero;
2 26 Feb 07 jari 3140         }
2 26 Feb 07 jari 3141         
2 26 Feb 07 jari 3142         double finalMean = (double)(mean / validN);
2 26 Feb 07 jari 3143         
2 26 Feb 07 jari 3144         return finalMean;
2 26 Feb 07 jari 3145     }    
2 26 Feb 07 jari 3146     
2 26 Feb 07 jari 3147
2 26 Feb 07 jari 3148     private FloatMatrix imputeKNearestMatrix(FloatMatrix inputMatrix, int k) throws AlgorithmException { 
2 26 Feb 07 jari 3149         int numRows = inputMatrix.getRowDimension();
2 26 Feb 07 jari 3150         int numCols = inputMatrix.getColumnDimension();
2 26 Feb 07 jari 3151         FloatMatrix resultMatrix = new FloatMatrix(numRows, numCols);
2 26 Feb 07 jari 3152         
2 26 Feb 07 jari 3153         AlgorithmEvent event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numGenes);
2 26 Feb 07 jari 3154         fireValueChanged(event);
2 26 Feb 07 jari 3155         event.setId(AlgorithmEvent.PROGRESS_VALUE);      
2 26 Feb 07 jari 3156         
2 26 Feb 07 jari 3157         for (int i = 0; i < numRows; i++) {
2 26 Feb 07 jari 3158             if (stop) {
2 26 Feb 07 jari 3159                 throw new AbortException();
2 26 Feb 07 jari 3160             }          
2 26 Feb 07 jari 3161             event.setIntValue(i);
2 26 Feb 07 jari 3162             event.setDescription("Imputing missing values: Current gene = " + (i+ 1));
2 26 Feb 07 jari 3163             fireValueChanged(event);           
2 26 Feb 07 jari 3164             
2 26 Feb 07 jari 3165             if (isMissingValues(inputMatrix, i)) {
2 26 Feb 07 jari 3166                 //System.out.println("gene " + i + " is missing values");
2 26 Feb 07 jari 3167                 Vector nonMissingExpts = new Vector();
2 26 Feb 07 jari 3168                 for (int j = 0; j < numCols; j++) {
2 26 Feb 07 jari 3169                     if (!Float.isNaN(inputMatrix.A[i][j])) {
2 26 Feb 07 jari 3170                         nonMissingExpts.add(new Integer(j));
2 26 Feb 07 jari 3171                     }
2 26 Feb 07 jari 3172                 }
2 26 Feb 07 jari 3173                 Vector geneSubset = getValidGenes(i, inputMatrix, nonMissingExpts); //getValidGenes() returns a Vector of genes that have valid values for all the non-missing expts
2 26 Feb 07 jari 3174                 
2 26 Feb 07 jari 3175                 //System.out.println(" Valid geneSubset.size() = " + geneSubset.size());
2 26 Feb 07 jari 3176                 
2 26 Feb 07 jari 3177                 /*
2 26 Feb 07 jari 3178                 for (int j = 0; j < geneSubset.size(); j++) {
2 26 Feb 07 jari 3179                     System.out.println(((Integer)geneSubset.get(j)).intValue());
2 26 Feb 07 jari 3180                 }
2 26 Feb 07 jari 3181                  */
2 26 Feb 07 jari 3182                 //System.out.println("imputing KNN: current gene = " + i);
2 26 Feb 07 jari 3183                 Vector kNearestGenes = getKNearestGenes(i, k, inputMatrix, geneSubset, nonMissingExpts);
2 26 Feb 07 jari 3184                 
2 26 Feb 07 jari 3185                 /*
2 26 Feb 07 jari 3186                 System.out.println("k nearest genes of gene " + i + " : ");
2 26 Feb 07 jari 3187                 
2 26 Feb 07 jari 3188                 for (int j = 0; j < kNearestGenes.size(); j++) {
2 26 Feb 07 jari 3189                     System.out.println("" + ((Integer)kNearestGenes.get(j)).intValue());
2 26 Feb 07 jari 3190                 }
2 26 Feb 07 jari 3191                  */
2 26 Feb 07 jari 3192                 
2 26 Feb 07 jari 3193                 //TESTED UPTO HERE -- 12/18/2002***********
2 26 Feb 07 jari 3194                 //
2 26 Feb 07 jari 3195                 /*
2 26 Feb 07 jari 3196                 System.out.print("Gene " + i + " :\t"); 
2 26 Feb 07 jari 3197                 for (int j = 0; j < numCols; j++) {
2 26 Feb 07 jari 3198                     System.out.print("" +inputMatrix.A[i][j]);
2 26 Feb 07 jari 3199                     System.out.print("\t");
2 26 Feb 07 jari 3200                 }
2 26 Feb 07 jari 3201                 System.out.println();
2 26 Feb 07 jari 3202                 System.out.println("Matrix of k Nearest Genes");
2 26 Feb 07 jari 3203                 printSubMatrix(kNearestGenes, inputMatrix);                
2 26 Feb 07 jari 3204                 */    //
2 26 Feb 07 jari 3205                 for (int j = 0; j < numCols; j++) {
2 26 Feb 07 jari 3206                     if (!Float.isNaN(inputMatrix.A[i][j])) {
2 26 Feb 07 jari 3207                         resultMatrix.A[i][j] = inputMatrix.A[i][j]; 
2 26 Feb 07 jari 3208                     } else {
2 26 Feb 07 jari 3209                         
2 26 Feb 07 jari 3210                         //System.out.println("just before entering getExptMean(): kNearestGenes.size() = " + kNearestGenes.size());
2 26 Feb 07 jari 3211
2 26 Feb 07 jari 3212                         //resultMatrix.A[i][j] = getExptMean(j, kNearestGenes, inputMatrix);
2 26 Feb 07 jari 3213                         resultMatrix.A[i][j] = getExptWeightedMean(i, j, kNearestGenes, inputMatrix);
2 26 Feb 07 jari 3214                     }
2 26 Feb 07 jari 3215                 }
2 26 Feb 07 jari 3216                 //DONE UPTO HERE
2 26 Feb 07 jari 3217             }
2 26 Feb 07 jari 3218             
2 26 Feb 07 jari 3219             else {
2 26 Feb 07 jari 3220                 for (int j = 0; j < numCols; j++) {
2 26 Feb 07 jari 3221                     resultMatrix.A[i][j] = inputMatrix.A[i][j];
2 26 Feb 07 jari 3222                 }
2 26 Feb 07 jari 3223             }
2 26 Feb 07 jari 3224         }
2 26 Feb 07 jari 3225         
2 26 Feb 07 jari 3226         return imputeRowAverageMatrix(resultMatrix);
2 26 Feb 07 jari 3227     }
2 26 Feb 07 jari 3228     
2 26 Feb 07 jari 3229     private void printSubMatrix(Vector geneSet, FloatMatrix mat) {
2 26 Feb 07 jari 3230         for (int i = 0; i < geneSet.size(); i++) {
2 26 Feb 07 jari 3231             int currentGene = ((Integer)geneSet.get(i)).intValue();
2 26 Feb 07 jari 3232             System.out.print("Gene " + ((Integer)geneSet.get(i)).intValue() + " :\t");
2 26 Feb 07 jari 3233             for (int j = 0; j < mat.getColumnDimension(); j++) {
2 26 Feb 07 jari 3234                 System.out.print("" + mat.A[currentGene][j] + "\t");
2 26 Feb 07 jari 3235             }
2 26 Feb 07 jari 3236             System.out.println();
2 26 Feb 07 jari 3237         }
2 26 Feb 07 jari 3238         System.out.println();
2 26 Feb 07 jari 3239     }
2 26 Feb 07 jari 3240     
2 26 Feb 07 jari 3241     private float getExptMean(int expt, Vector geneVector, FloatMatrix mat) {
2 26 Feb 07 jari 3242         float mean = 0;
2 26 Feb 07 jari 3243         int validN = 0;
2 26 Feb 07 jari 3244         for (int i = 0; i < geneVector.size(); i++) {
2 26 Feb 07 jari 3245             int currentGene = ((Integer)geneVector.get(i)).intValue();
2 26 Feb 07 jari 3246             if (!Float.isNaN(mat.A[currentGene][expt])) {
2 26 Feb 07 jari 3247                 mean = mean + mat.A[currentGene][expt];
2 26 Feb 07 jari 3248                 validN++;
2 26 Feb 07 jari 3249             }
2 26 Feb 07 jari 3250         }
2 26 Feb 07 jari 3251         
2 26 Feb 07 jari 3252         //System.out.println("mean = " + mean);
2 26 Feb 07 jari 3253         if (validN > 0) {
2 26 Feb 07 jari 3254             mean = mean / validN;
2 26 Feb 07 jari 3255         } else {
2 26 Feb 07 jari 3256             mean = Float.NaN;
2 26 Feb 07 jari 3257         }
2 26 Feb 07 jari 3258         
2 26 Feb 07 jari 3259         //System.out.println(" Inside getExptMean(): mean = " + mean);
2 26 Feb 07 jari 3260         
2 26 Feb 07 jari 3261         return mean;
2 26 Feb 07 jari 3262     }
2 26 Feb 07 jari 3263     
2 26 Feb 07 jari 3264     private float getExptWeightedMean(int gene, int expt, Vector geneVector, FloatMatrix mat) { 
2 26 Feb 07 jari 3265         float weightedMean = 0.0f;
2 26 Feb 07 jari 3266         int validN = 0;
2 26 Feb 07 jari 3267         float numerator = 0.0f;
2 26 Feb 07 jari 3268         float recipNeighborDistances[] = new float[geneVector.size()];
2 26 Feb 07 jari 3269         for (int i = 0; i < recipNeighborDistances.length; i++) {
2 26 Feb 07 jari 3270             int currentGene = ((Integer)geneVector.get(i)).intValue();
2 26 Feb 07 jari 3271             if (!Float.isNaN(mat.A[currentGene][expt])) {
2 26 Feb 07 jari 3272                 float distance = ExperimentUtil.geneEuclidianDistance(mat, null, gene, currentGene, factor);
2 26 Feb 07 jari 3273                 if (distance == 0.0f) {
2 26 Feb 07 jari 3274                     distance = Float.MIN_VALUE;
2 26 Feb 07 jari 3275                 }
2 26 Feb 07 jari 3276                 recipNeighborDistances[i] = (float)(1.0f/distance);
2 26 Feb 07 jari 3277                 numerator = numerator + (float)(recipNeighborDistances[i]*mat.A[currentGene][expt]);
2 26 Feb 07 jari 3278                 validN++;
2 26 Feb 07 jari 3279             } else {
2 26 Feb 07 jari 3280                 recipNeighborDistances[i] = 0.0f;
2 26 Feb 07 jari 3281             }
2 26 Feb 07 jari 3282
2 26 Feb 07 jari 3283         }
2 26 Feb 07 jari 3284         
2 26 Feb 07 jari 3285         float denominator = 0.0f;
2 26 Feb 07 jari 3286         for (int i = 0; i < recipNeighborDistances.length; i++) {
2 26 Feb 07 jari 3287             denominator = denominator + recipNeighborDistances[i];
2 26 Feb 07 jari 3288         }
2 26 Feb 07 jari 3289         
2 26 Feb 07 jari 3290         weightedMean = (float)(numerator/(float)denominator);
2 26 Feb 07 jari 3291         return weightedMean;
2 26 Feb 07 jari 3292     }
2 26 Feb 07 jari 3293     
2 26 Feb 07 jari 3294     
2 26 Feb 07 jari 3295
2 26 Feb 07 jari 3296     Vector getKNearestGenes(int gene, int k, FloatMatrix mat, Vector geneSubset, Vector nonMissingExpts) {
2 26 Feb 07 jari 3297         Vector allValidGenes = new Vector();
2 26 Feb 07 jari 3298         Vector nearestGenes = new Vector();
2 26 Feb 07 jari 3299         Vector geneDistances = new Vector();
2 26 Feb 07 jari 3300         for (int i = 0; i < geneSubset.size(); i++) {
2 26 Feb 07 jari 3301             int currentGene = ((Integer)geneSubset.get(i)).intValue();
2 26 Feb 07 jari 3302             if (gene != currentGene) {
2 26 Feb 07 jari 3303                 float currentDistance = ExperimentUtil.geneEuclidianDistance(mat, null, gene, currentGene, factor);
2 26 Feb 07 jari 3304                 //System.out.println("Current distance = " + currentDistance);
2 26 Feb 07 jari 3305                 geneDistances.add(new Float(currentDistance));
2 26 Feb 07 jari 3306                 allValidGenes.add(new Integer(currentGene));
2 26 Feb 07 jari 3307             }
2 26 Feb 07 jari 3308         }
2 26 Feb 07 jari 3309         
2 26 Feb 07 jari 3310         float[] geneDistancesArray = new float[geneDistances.size()];
2 26 Feb 07 jari 3311         for (int i = 0; i < geneDistances.size(); i++) {
2 26 Feb 07 jari 3312             float currentDist = ((Float)geneDistances.get(i)).floatValue();
2 26 Feb 07 jari 3313             geneDistancesArray[i] = currentDist;
2 26 Feb 07 jari 3314         }
2 26 Feb 07 jari 3315         
2 26 Feb 07 jari 3316         QSort sortGeneDistances = new QSort(geneDistancesArray);
2 26 Feb 07 jari 3317         float[] sortedDistances = sortGeneDistances.getSorted();
2 26 Feb 07 jari 3318         int[] sortedDistanceIndices = sortGeneDistances.getOrigIndx();
2 26 Feb 07 jari 3319         
2 26 Feb 07 jari 3320         for (int i = 0; i < k; i++) {
2 26 Feb 07 jari 3321             int currentGeneIndex = sortedDistanceIndices[i];
2 26 Feb 07 jari 3322             int currentNearestGene = ((Integer)allValidGenes.get(currentGeneIndex)).intValue();
2 26 Feb 07 jari 3323             nearestGenes.add(new Integer(currentNearestGene));
2 26 Feb 07 jari 3324         }
2 26 Feb 07 jari 3325         
2 26 Feb 07 jari 3326         return nearestGenes;
2 26 Feb 07 jari 3327     }
2 26 Feb 07 jari 3328     
2 26 Feb 07 jari 3329     private boolean isMissingValues(FloatMatrix mat, int row) {//returns true if the row of the matrix has any NaN values
2 26 Feb 07 jari 3330                 
2 26 Feb 07 jari 3331         for (int i = 0; i < mat.getColumnDimension(); i++) {
2 26 Feb 07 jari 3332             if (Float.isNaN(mat.A[row][i])) {
2 26 Feb 07 jari 3333                 return true;
2 26 Feb 07 jari 3334             }
2 26 Feb 07 jari 3335         }
2 26 Feb 07 jari 3336         
2 26 Feb 07 jari 3337         return false;
2 26 Feb 07 jari 3338     }
2 26 Feb 07 jari 3339     
2 26 Feb 07 jari 3340     
2 26 Feb 07 jari 3341     private Vector getValidGenes(int gene, FloatMatrix mat, Vector validExpts) { //returns the indices of those genes in "mat" that have valid values for all the validExpts
2 26 Feb 07 jari 3342         Vector validGenes = new Vector();
2 26 Feb 07 jari 3343         
2 26 Feb 07 jari 3344         for (int i = 0; i < mat.getRowDimension(); i++) {
2 26 Feb 07 jari 3345             if ((hasAllExpts(i, mat, validExpts)) && (gene != i)){//returns true if gene i in "mat" has valid values for all the validExpts
2 26 Feb 07 jari 3346                 validGenes.add(new Integer(i));
2 26 Feb 07 jari 3347             }
2 26 Feb 07 jari 3348         }
2 26 Feb 07 jari 3349         
2 26 Feb 07 jari 3350         if (validGenes.size() < numNeighbors) { // if the number of valid genes is < k, other genes will be added to validGenes in increasing order of Euclidean distance until validGenes.size() = k
2 26 Feb 07 jari 3351             int additionalGenesNeeded = numNeighbors - validGenes.size();
2 26 Feb 07 jari 3352             Vector additionalGenes = getAdditionalGenes(gene, additionalGenesNeeded, validGenes, mat);
2 26 Feb 07 jari 3353             for (int i = 0; i < additionalGenes.size(); i++) {
2 26 Feb 07 jari 3354                 validGenes.add(additionalGenes.get(i));
2 26 Feb 07 jari 3355             }
2 26 Feb 07 jari 3356         }
2 26 Feb 07 jari 3357       
2 26 Feb 07 jari 3358         return validGenes;
2 26 Feb 07 jari 3359     }
2 26 Feb 07 jari 3360     
2 26 Feb 07 jari 3361     private Vector getAdditionalGenes(int currentGene, int numGenesNeeded, Vector alreadyPresentGenes, FloatMatrix mat) {
2 26 Feb 07 jari 3362         Vector additionalGenes = new Vector();
2 26 Feb 07 jari 3363         Vector allGenes = new Vector();
2 26 Feb 07 jari 3364         Vector geneDistances = new Vector();
2 26 Feb 07 jari 3365         
2 26 Feb 07 jari 3366         for (int i = 0; i < mat.getRowDimension(); i++) {
2 26 Feb 07 jari 3367             if (i != currentGene) {
2 26 Feb 07 jari 3368                 float currentDistance = ExperimentUtil.geneEuclidianDistance(mat, null, i, currentGene, factor);
2 26 Feb 07 jari 3369                 geneDistances.add(new Float(currentDistance));
2 26 Feb 07 jari 3370                 allGenes.add(new Integer(i));                
2 26 Feb 07 jari 3371             }
2 26 Feb 07 jari 3372         }
2 26 Feb 07 jari 3373         
2 26 Feb 07 jari 3374         float[] geneDistancesArray = new float[geneDistances.size()];
2 26 Feb 07 jari 3375         for (int i = 0; i < geneDistances.size(); i++) {
2 26 Feb 07 jari 3376             float currentDist = ((Float)geneDistances.get(i)).floatValue();
2 26 Feb 07 jari 3377             geneDistancesArray[i] = currentDist;
2 26 Feb 07 jari 3378         }     
2 26 Feb 07 jari 3379         
2 26 Feb 07 jari 3380         QSort sortGeneDistances = new QSort(geneDistancesArray);
2 26 Feb 07 jari 3381         float[] sortedDistances = sortGeneDistances.getSorted();
2 26 Feb 07 jari 3382         int[] sortedDistanceIndices = sortGeneDistances.getOrigIndx();
2 26 Feb 07 jari 3383         
2 26 Feb 07 jari 3384         int counter = 0;
2 26 Feb 07 jari 3385         
2 26 Feb 07 jari 3386         for (int i = 0; i < sortedDistanceIndices.length; i++) {
2 26 Feb 07 jari 3387             int currentIndex = sortedDistanceIndices[i];
2 26 Feb 07 jari 3388             int currentNearestGene = ((Integer)allGenes.get(currentIndex)).intValue(); 
2 26 Feb 07 jari 3389             if (belongsIn(alreadyPresentGenes, currentNearestGene)) {
2 26 Feb 07 jari 3390                 continue;
2 26 Feb 07 jari 3391             } else {
2 26 Feb 07 jari 3392                 additionalGenes.add(new Integer(currentNearestGene));
2 26 Feb 07 jari 3393                 counter++;
2 26 Feb 07 jari 3394                 if (counter >= numGenesNeeded) {
2 26 Feb 07 jari 3395                     break;
2 26 Feb 07 jari 3396                 }
2 26 Feb 07 jari 3397             }
2 26 Feb 07 jari 3398         }
2 26 Feb 07 jari 3399         
2 26 Feb 07 jari 3400         return additionalGenes;
2 26 Feb 07 jari 3401     }
2 26 Feb 07 jari 3402     
2 26 Feb 07 jari 3403     private boolean belongsIn(Vector geneVector, int gene) {
2 26 Feb 07 jari 3404         for (int i = 0; i < geneVector.size(); i++) {
2 26 Feb 07 jari 3405             int currentGene = ((Integer)geneVector.get(i)).intValue();
2 26 Feb 07 jari 3406             if (gene == currentGene) {
2 26 Feb 07 jari 3407                 return true;
2 26 Feb 07 jari 3408             }
2 26 Feb 07 jari 3409         }
2 26 Feb 07 jari 3410         
2 26 Feb 07 jari 3411         return false;
2 26 Feb 07 jari 3412     }
2 26 Feb 07 jari 3413     
2 26 Feb 07 jari 3414     
2 26 Feb 07 jari 3415     private boolean hasAllExpts(int gene, FloatMatrix mat, Vector validExpts) {//returns true if "gene" in "mat" has valid values for all the validExpts
2 26 Feb 07 jari 3416
2 26 Feb 07 jari 3417         for (int i = 0; i < validExpts.size(); i++) {
2 26 Feb 07 jari 3418             int expIndex = ((Integer)validExpts.get(i)).intValue();
2 26 Feb 07 jari 3419             if (Float.isNaN(mat.A[gene][expIndex])) {
2 26 Feb 07 jari 3420                 return false;
2 26 Feb 07 jari 3421             }
2 26 Feb 07 jari 3422         }
2 26 Feb 07 jari 3423         
2 26 Feb 07 jari 3424         return true;
2 26 Feb 07 jari 3425     }
2 26 Feb 07 jari 3426     
2 26 Feb 07 jari 3427 }