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

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2  * TFA.java
2 26 Feb 07 jari 3  *
2 26 Feb 07 jari 4  * Created on February 12, 2004, 11:22 AM
2 26 Feb 07 jari 5  */
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9 import java.util.Random;
2 26 Feb 07 jari 10 import java.util.Vector;
2 26 Feb 07 jari 11
2 26 Feb 07 jari 12 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 13 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 14 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 15 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 16 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 17 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 23 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 24
2 26 Feb 07 jari 25 import JSci.maths.statistics.FDistribution;
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 /**
2 26 Feb 07 jari 28  *
2 26 Feb 07 jari 29  * @author  nbhagaba
2 26 Feb 07 jari 30  */
2 26 Feb 07 jari 31 public class TFA extends AbstractAlgorithm {
2 26 Feb 07 jari 32     
2 26 Feb 07 jari 33     public static final int JUST_ALPHA = 4;
2 26 Feb 07 jari 34     public static final int STD_BONFERRONI = 5;
2 26 Feb 07 jari 35     public static final int ADJ_BONFERRONI = 6;    
2 26 Feb 07 jari 36     public static final int MAX_T = 9;
2 26 Feb 07 jari 37     public static final int MIN_P = 10;  
2 26 Feb 07 jari 38     
2 26 Feb 07 jari 39     public static final int HAS_EMPTY_CELL = 21;
2 26 Feb 07 jari 40     public static final int ALL_CELLS_HAVE_ONE_SAMPLE = 22;
2 26 Feb 07 jari 41     public static final int SOME_CELLS_HAVE_ONE_SAMPLE = 23;
2 26 Feb 07 jari 42     public static final int BALANCED_WITH_REPLICATION = 24;
2 26 Feb 07 jari 43     public static final int UNBALANCED_WITH_REPLICATION = 25;
2 26 Feb 07 jari 44
2 26 Feb 07 jari 45     private boolean stop = false;
2 26 Feb 07 jari 46     private int function;
2 26 Feb 07 jari 47     private float factor;
2 26 Feb 07 jari 48     private boolean absolute;
2 26 Feb 07 jari 49     private FloatMatrix expMatrix;
2 26 Feb 07 jari 50     
2 26 Feb 07 jari 51     boolean hierarchical_tree;
2 26 Feb 07 jari 52     int method_linkage;
2 26 Feb 07 jari 53     boolean calculate_genes;
2 26 Feb 07 jari 54     boolean calculate_experiments;    
2 26 Feb 07 jari 55     
2 26 Feb 07 jari 56     private Vector[] clusters;
2 26 Feb 07 jari 57     private int k; // # of clusters    
2 26 Feb 07 jari 58     
2 26 Feb 07 jari 59     private int numGenes, numExps; 
2 26 Feb 07 jari 60     
2 26 Feb 07 jari 61     private int[] numFactorLevels, factorAAssignments, factorBAssignments;
2 26 Feb 07 jari 62     private boolean allCellsHaveOneSample, isBalancedDesign, usePerms, drawSigTreesOnly;
2 26 Feb 07 jari 63     private int adjustmentMethod;
2 26 Feb 07 jari 64     private float alpha;
2 26 Feb 07 jari 65     //private Vector[][] bothFactorAssignments;
2 26 Feb 07 jari 66     private int numPerms;
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     double[] origFactorAPValues, origFactorBPValues, origInteractionPValues, factorAFValues, factorBFValues, interactionFValues; 
2 26 Feb 07 jari 69     double[] factorADfValues, factorBDfValues, interactionDfValues, errorDfValues;
2 26 Feb 07 jari 70     double[] adjFactorAPValues, adjFactorBPValues, adjInteractionPValues;
2 26 Feb 07 jari 71     
2 26 Feb 07 jari 72     private int hcl_function;
2 26 Feb 07 jari 73     private boolean hcl_absolute;
2 26 Feb 07 jari 74     
2 26 Feb 07 jari 75     /**
2 26 Feb 07 jari 76      * This method should interrupt the calculation.
2 26 Feb 07 jari 77      *
2 26 Feb 07 jari 78      */
2 26 Feb 07 jari 79     public void abort() {
2 26 Feb 07 jari 80         stop = true;
2 26 Feb 07 jari 81     }
2 26 Feb 07 jari 82     
2 26 Feb 07 jari 83     /**
2 26 Feb 07 jari 84      * This method execute calculation and return result,
2 26 Feb 07 jari 85      *
2 26 Feb 07 jari 86      * stored in <code>AlgorithmData</code> class.
2 26 Feb 07 jari 87      *
2 26 Feb 07 jari 88      *
2 26 Feb 07 jari 89      *
2 26 Feb 07 jari 90      * @param data the data to be calculated.
2 26 Feb 07 jari 91      *
2 26 Feb 07 jari 92      */
2 26 Feb 07 jari 93     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 94         
2 26 Feb 07 jari 95         //bothFactorAssignments = (Vector[][])(data.getObjectMatrix("bothFactorAssignments"));
2 26 Feb 07 jari 96         numFactorLevels = data.getIntArray("numFactorLevels");
2 26 Feb 07 jari 97         factorAAssignments = data.getIntArray("factorAAssignments");
2 26 Feb 07 jari 98         factorBAssignments = data.getIntArray("factorBAssignments");
2 26 Feb 07 jari 99         
2 26 Feb 07 jari 100         AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 101         function = map.getInt("distance-function", EUCLIDEAN);
2 26 Feb 07 jari 102         factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 103         absolute = map.getBoolean("distance-absolute", false);
2 26 Feb 07 jari 104
2 26 Feb 07 jari 105         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 106         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);        
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 109         if (hierarchical_tree) {
2 26 Feb 07 jari 110             drawSigTreesOnly = map.getBoolean("draw-sig-trees-only");
2 26 Feb 07 jari 111         }        
2 26 Feb 07 jari 112         method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 113         calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 114         calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 115         
2 26 Feb 07 jari 116         this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 117         
2 26 Feb 07 jari 118         numGenes = this.expMatrix.getRowDimension();
2 26 Feb 07 jari 119         numExps = this.expMatrix.getColumnDimension();        
2 26 Feb 07 jari 120         
2 26 Feb 07 jari 121         allCellsHaveOneSample = map.getBoolean("allCellsHaveOneSample", false);
2 26 Feb 07 jari 122         isBalancedDesign = map.getBoolean("isBalancedDesign", false);
2 26 Feb 07 jari 123         usePerms = map.getBoolean("usePerms", true);
2 26 Feb 07 jari 124         adjustmentMethod = map.getInt("adjustmentMethod", JUST_ALPHA);
2 26 Feb 07 jari 125         alpha = map.getFloat("alpha", 0.01f);
2 26 Feb 07 jari 126         numPerms = map.getInt("numPerms", 1000);
2 26 Feb 07 jari 127         
2 26 Feb 07 jari 128         /*
2 26 Feb 07 jari 129         System.out.println("numFactorLevels[0] = " + numFactorLevels[0]);
2 26 Feb 07 jari 130         System.out.println("numFactorLevels[1] = " + numFactorLevels[1]);
2 26 Feb 07 jari 131         System.out.println("allCellsHaveOneSample = " + String.valueOf(allCellsHaveOneSample));
2 26 Feb 07 jari 132         System.out.println("isBalancedDesign = " + String.valueOf(isBalancedDesign));
2 26 Feb 07 jari 133         System.out.println("usePerms = " + String.valueOf(usePerms));
2 26 Feb 07 jari 134         System.out.println("adjustmentMethod = " + adjustmentMethod);
2 26 Feb 07 jari 135         System.out.println("alpha = " + alpha);
2 26 Feb 07 jari 136         System.out.println("numPerms = " + numPerms);
2 26 Feb 07 jari 137         for (int i = 0; i < bothFactorAssignments.length; i++) {
2 26 Feb 07 jari 138             for (int j = 0; j < bothFactorAssignments[i].length; j++) {
2 26 Feb 07 jari 139                 System.out.println("bothFactorAssignments[" + i + "][" + j +"].size() = " + bothFactorAssignments[i][j].size());
2 26 Feb 07 jari 140             }
2 26 Feb 07 jari 141         }
2 26 Feb 07 jari 142          */
2 26 Feb 07 jari 143         
2 26 Feb 07 jari 144         origFactorAPValues = new double[numGenes];
2 26 Feb 07 jari 145         origFactorBPValues = new double[numGenes];
2 26 Feb 07 jari 146         origInteractionPValues = new double[numGenes];
2 26 Feb 07 jari 147         
2 26 Feb 07 jari 148         adjFactorAPValues = new double[numGenes];
2 26 Feb 07 jari 149         adjFactorBPValues = new double[numGenes];
2 26 Feb 07 jari 150         adjInteractionPValues = new double[numGenes];     
2 26 Feb 07 jari 151         
2 26 Feb 07 jari 152         factorAFValues = new double[numGenes];
2 26 Feb 07 jari 153         factorBFValues = new double[numGenes];
2 26 Feb 07 jari 154         interactionFValues = new double[numGenes];
2 26 Feb 07 jari 155         factorADfValues = new double[numGenes]; 
2 26 Feb 07 jari 156         factorBDfValues = new double[numGenes];
2 26 Feb 07 jari 157         interactionDfValues = new double[numGenes];
2 26 Feb 07 jari 158         errorDfValues = new double[numGenes];
2 26 Feb 07 jari 159         
2 26 Feb 07 jari 160         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 161             origFactorAPValues[i] = 0d;
2 26 Feb 07 jari 162             origFactorBPValues[i] = 0d;
2 26 Feb 07 jari 163             origInteractionPValues[i] = 0d;
2 26 Feb 07 jari 164         }
2 26 Feb 07 jari 165         
2 26 Feb 07 jari 166         AlgorithmEvent event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numGenes);
2 26 Feb 07 jari 167         fireValueChanged(event);
2 26 Feb 07 jari 168         event.setId(AlgorithmEvent.PROGRESS_VALUE);      
2 26 Feb 07 jari 169         
2 26 Feb 07 jari 170         int nonMissingDataGenes = 0;
2 26 Feb 07 jari 171         boolean[] hasMissingValues = new boolean[numGenes];
2 26 Feb 07 jari 172         for (int i = 0; i < hasMissingValues.length; i++) {
2 26 Feb 07 jari 173             hasMissingValues[i] = false;
2 26 Feb 07 jari 174         }
2 26 Feb 07 jari 175         
2 26 Feb 07 jari 176         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 177             //System.out.println("i = " + i);
2 26 Feb 07 jari 178             boolean missing = false;
2 26 Feb 07 jari 179             for (int j = 0; j < numExps; j++) {
2 26 Feb 07 jari 180                 if ( (factorAAssignments[j] != 0) && (factorBAssignments[j] != 0) && (Float.isNaN(expMatrix.A[i][j])) ) {
2 26 Feb 07 jari 181                     missing = true;
2 26 Feb 07 jari 182                     break;
2 26 Feb 07 jari 183                 }
2 26 Feb 07 jari 184             }
2 26 Feb 07 jari 185             if (missing) {
2 26 Feb 07 jari 186                 hasMissingValues[i] = true;
2 26 Feb 07 jari 187             } else {
2 26 Feb 07 jari 188                 nonMissingDataGenes++;
2 26 Feb 07 jari 189             }
2 26 Feb 07 jari 190         }
2 26 Feb 07 jari 191         
2 26 Feb 07 jari 192         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 193             if (stop) {
2 26 Feb 07 jari 194                 throw new AbortException();
2 26 Feb 07 jari 195             }
2 26 Feb 07 jari 196             
2 26 Feb 07 jari 197             event.setIntValue(i);
2 26 Feb 07 jari 198             event.setDescription("Calculating unadjusted p-values: Current gene = " + (i + 1));
2 26 Feb 07 jari 199             fireValueChanged(event);   
2 26 Feb 07 jari 200             
2 26 Feb 07 jari 201             //Vector[][] currentGeneAssignments = getCurrentGeneAssignments(i);
2 26 Feb 07 jari 202             Vector[][] currentGeneFactorValues = getCurrentGeneFactorValues(i);
2 26 Feb 07 jari 203             int currGeneFactorCondition = getCurrGeneFactorCondition(currentGeneFactorValues);
2 26 Feb 07 jari 204             //System.out.println("currGeneFactorCondition = " + currGeneFactorCondition);
2 26 Feb 07 jari 205             if (currGeneFactorCondition == HAS_EMPTY_CELL) {// not analyzed
2 26 Feb 07 jari 206                 origFactorAPValues[i] = Double.NaN;
2 26 Feb 07 jari 207                 origFactorBPValues[i] = Double.NaN;
2 26 Feb 07 jari 208                 origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 209                 
2 26 Feb 07 jari 210                 adjFactorAPValues[i] = Double.NaN;
2 26 Feb 07 jari 211                 adjFactorBPValues[i] = Double.NaN;
2 26 Feb 07 jari 212                 adjInteractionPValues[i] = Double.NaN;                
2 26 Feb 07 jari 213                 
2 26 Feb 07 jari 214                 factorAFValues[i] = Double.NaN;
2 26 Feb 07 jari 215                 factorBFValues[i] = Double.NaN;
2 26 Feb 07 jari 216                 interactionFValues[i] = Double.NaN;
2 26 Feb 07 jari 217                 factorADfValues[i] = Double.NaN;
2 26 Feb 07 jari 218                 factorBDfValues[i] = Double.NaN;
2 26 Feb 07 jari 219                 interactionDfValues[i] = Double.NaN;
2 26 Feb 07 jari 220                 errorDfValues[i] = Double.NaN;  
2 26 Feb 07 jari 221                 
2 26 Feb 07 jari 222             } else if (currGeneFactorCondition == SOME_CELLS_HAVE_ONE_SAMPLE) {// not analyzed; unclear on how to analyze
2 26 Feb 07 jari 223                 origFactorAPValues[i] = Double.NaN;
2 26 Feb 07 jari 224                 origFactorBPValues[i] = Double.NaN;
2 26 Feb 07 jari 225                 origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 226                 
2 26 Feb 07 jari 227                 adjFactorAPValues[i] = Double.NaN;
2 26 Feb 07 jari 228                 adjFactorBPValues[i] = Double.NaN;
2 26 Feb 07 jari 229                 adjInteractionPValues[i] = Double.NaN;                
2 26 Feb 07 jari 230                 
2 26 Feb 07 jari 231                 factorAFValues[i] = Double.NaN;
2 26 Feb 07 jari 232                 factorBFValues[i] = Double.NaN;
2 26 Feb 07 jari 233                 interactionFValues[i] = Double.NaN;
2 26 Feb 07 jari 234                 factorADfValues[i] = Double.NaN;
2 26 Feb 07 jari 235                 factorBDfValues[i] = Double.NaN;
2 26 Feb 07 jari 236                 interactionDfValues[i] = Double.NaN;
2 26 Feb 07 jari 237                 errorDfValues[i] = Double.NaN; 
2 26 Feb 07 jari 238                 
2 26 Feb 07 jari 239             } else if (currGeneFactorCondition == BALANCED_WITH_REPLICATION) {
2 26 Feb 07 jari 240                 double[] fValuesAndDfs = getBalancedFValuesAndDfs(currentGeneFactorValues);
2 26 Feb 07 jari 241                 factorAFValues[i] = fValuesAndDfs[0];
2 26 Feb 07 jari 242                 factorBFValues[i] = fValuesAndDfs[1];
2 26 Feb 07 jari 243                 interactionFValues[i] = fValuesAndDfs[2];
2 26 Feb 07 jari 244                 factorADfValues[i] = fValuesAndDfs[3];
2 26 Feb 07 jari 245                 factorBDfValues[i] = fValuesAndDfs[4];
2 26 Feb 07 jari 246                 interactionDfValues[i] = fValuesAndDfs[5];
2 26 Feb 07 jari 247                 errorDfValues[i] = fValuesAndDfs[6];
2 26 Feb 07 jari 248                 if (!usePerms) {
2 26 Feb 07 jari 249                     //System.out.println("i = " + i);
2 26 Feb 07 jari 250                     //System.out.println("factorA: " + factorAFValues[i] +  ", " + (int)(factorADfValues[i]) + ", " + (int)(errorDfValues[i]));
2 26 Feb 07 jari 251                     //System.out.println("factorB: " + factorBFValues[i] +  ", " + (int)(factorBDfValues[i]) + ", " + (int)(errorDfValues[i]));
2 26 Feb 07 jari 252                     //System.out.println("interaction: " + interactionFValues[i] + ", " + (int)(interactionDfValues[i]) + ", " + (int)(errorDfValues[i]));
2 26 Feb 07 jari 253                     origFactorAPValues[i] = getPValueFromFDist(factorAFValues[i], (int)(factorADfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 254                     origFactorBPValues[i] = getPValueFromFDist(factorBFValues[i], (int)(factorBDfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 255                     origInteractionPValues[i] = getPValueFromFDist(interactionFValues[i], (int)(interactionDfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 256                 } else { // if (usePerms)
2 26 Feb 07 jari 257                     if (hasMissingValues[i]) {
2 26 Feb 07 jari 258                         //origFactorAPValues[i] = 0d;
2 26 Feb 07 jari 259                         //origFactorBPValues[i] = 0d;
2 26 Feb 07 jari 260                         //origInteractionPValues[i] = 0d;
2 26 Feb 07 jari 261                         for (int j = 0; j < numPerms; j++) {
2 26 Feb 07 jari 262                             Vector[][] currentGenePermutedFactorValues = getCurrentGenePermutedFactorValues(i);
2 26 Feb 07 jari 263                             double[] permFValuesAndDfs = getBalancedFValuesAndDfs(currentGenePermutedFactorValues);
2 26 Feb 07 jari 264                             double permFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 265                             double permFBValue = permFValuesAndDfs[1];
2 26 Feb 07 jari 266                             double permInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 267                             
2 26 Feb 07 jari 268                             if (permFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 269                             if (permFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 270                             if (permInteractionFValue >= interactionFValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;
2 26 Feb 07 jari 271                             // UP TO HERE 03/01/2004
2 26 Feb 07 jari 272                         }
2 26 Feb 07 jari 273                         //origFactorAPValues[i] = origFactorAPValues[i]/(double)numPerms;
2 26 Feb 07 jari 274                         //origFactorBPValues[i] = origFactorBPValues[i]/(double)numPerms;
2 26 Feb 07 jari 275                         //origInteractionPValues[i] = origInteractionPValues[i]/(double)numPerms;
2 26 Feb 07 jari 276                     }
2 26 Feb 07 jari 277                 }
2 26 Feb 07 jari 278             }  else if (currGeneFactorCondition == UNBALANCED_WITH_REPLICATION) {
2 26 Feb 07 jari 279                 double[] fValuesAndDfs = getUnbalancedFValuesAndDfs(currentGeneFactorValues);                
2 26 Feb 07 jari 280                 factorAFValues[i] = fValuesAndDfs[0];
2 26 Feb 07 jari 281                 factorBFValues[i] = fValuesAndDfs[1];
2 26 Feb 07 jari 282                 interactionFValues[i] = fValuesAndDfs[2];
2 26 Feb 07 jari 283                 factorADfValues[i] = fValuesAndDfs[3];
2 26 Feb 07 jari 284                 factorBDfValues[i] = fValuesAndDfs[4];
2 26 Feb 07 jari 285                 interactionDfValues[i] = fValuesAndDfs[5];
2 26 Feb 07 jari 286                 errorDfValues[i] = fValuesAndDfs[6];
2 26 Feb 07 jari 287                 if (!usePerms) {
2 26 Feb 07 jari 288                     origFactorAPValues[i] = getPValueFromFDist(factorAFValues[i], (int)(factorADfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 289                     origFactorBPValues[i] = getPValueFromFDist(factorBFValues[i], (int)(factorBDfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 290                     origInteractionPValues[i] = getPValueFromFDist(interactionFValues[i], (int)(interactionDfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 291                 } else { // if (usePerms)
2 26 Feb 07 jari 292                     if (hasMissingValues[i]) {
2 26 Feb 07 jari 293                         //origFactorAPValues[i] = 0d;
2 26 Feb 07 jari 294                         //origFactorBPValues[i] = 0d;
2 26 Feb 07 jari 295                         //origInteractionPValues[i] = 0d;
2 26 Feb 07 jari 296                         for (int j = 0; j < numPerms; j++) {
2 26 Feb 07 jari 297                             Vector[][] currentGenePermutedFactorValues = getCurrentGenePermutedFactorValues(i);
2 26 Feb 07 jari 298                             double[] permFValuesAndDfs = getUnbalancedFValuesAndDfs(currentGenePermutedFactorValues);
2 26 Feb 07 jari 299                             double permFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 300                             double permFBValue = permFValuesAndDfs[1];
2 26 Feb 07 jari 301                             double permInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 302                             
2 26 Feb 07 jari 303                             if (permFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 304                             if (permFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 305                             if (permInteractionFValue >= interactionFValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;
2 26 Feb 07 jari 306                             // UP TO HERE 03/01/2004
2 26 Feb 07 jari 307                         }
2 26 Feb 07 jari 308                         //origFactorAPValues[i] = origFactorAPValues[i]/(double)numPerms;
2 26 Feb 07 jari 309                         //origFactorBPValues[i] = origFactorBPValues[i]/(double)numPerms;
2 26 Feb 07 jari 310                         //origInteractionPValues[i] = origInteractionPValues[i]/(double)numPerms;
2 26 Feb 07 jari 311                     }
2 26 Feb 07 jari 312                 }                
2 26 Feb 07 jari 313                 
2 26 Feb 07 jari 314             } else if (currGeneFactorCondition == ALL_CELLS_HAVE_ONE_SAMPLE) {
2 26 Feb 07 jari 315                 double[] fValuesAndDfs = getBalancedMainEffectsFValuesAndDfs(currentGeneFactorValues);
2 26 Feb 07 jari 316                 factorAFValues[i] = fValuesAndDfs[0];
2 26 Feb 07 jari 317                 factorBFValues[i] = fValuesAndDfs[1]; 
2 26 Feb 07 jari 318                 interactionFValues[i] = Double.NaN;
2 26 Feb 07 jari 319                 factorADfValues[i] = fValuesAndDfs[2];
2 26 Feb 07 jari 320                 factorBDfValues[i] = fValuesAndDfs[3];
2 26 Feb 07 jari 321                 interactionDfValues[i] = Double.NaN;
2 26 Feb 07 jari 322                 errorDfValues[i] = fValuesAndDfs[4]; 
2 26 Feb 07 jari 323                 origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 324                 if (!usePerms) {
2 26 Feb 07 jari 325                     origFactorAPValues[i] = getPValueFromFDist(factorAFValues[i], (int)(factorADfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 326                     origFactorBPValues[i] = getPValueFromFDist(factorBFValues[i], (int)(factorBDfValues[i]), (int)(errorDfValues[i]));
2 26 Feb 07 jari 327                     //origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 328                 }    else { // if (usePerms)
2 26 Feb 07 jari 329                     if (hasMissingValues[i]) {
2 26 Feb 07 jari 330                         for (int j = 0; j < numPerms; j++) {
2 26 Feb 07 jari 331                             Vector[][] currentGenePermutedFactorValues = getCurrentGenePermutedFactorValues(i);
2 26 Feb 07 jari 332                             double[] permFValuesAndDfs = getBalancedMainEffectsFValuesAndDfs(currentGenePermutedFactorValues);
2 26 Feb 07 jari 333                             double permFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 334                             double permFBValue = permFValuesAndDfs[1];
2 26 Feb 07 jari 335                             //double permInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 336                             
2 26 Feb 07 jari 337                             if (permFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 338                             if (permFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 339                             //if (permInteractionFValue >= origInteractionPValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;
2 26 Feb 07 jari 340                             
2 26 Feb 07 jari 341                         }                        
2 26 Feb 07 jari 342                     }
2 26 Feb 07 jari 343                 }
2 26 Feb 07 jari 344             }
2 26 Feb 07 jari 345             
2 26 Feb 07 jari 346         }
2 26 Feb 07 jari 347         
2 26 Feb 07 jari 348         if ((usePerms) && (nonMissingDataGenes > 0)) {// speeds up the calculation for genes with complete data, 
2 26 Feb 07 jari 349                                                       // as the entire matrix can be permuted at once instead of permuting each gene individually
2 26 Feb 07 jari 350             int firstNonMissingGene = -1;
2 26 Feb 07 jari 351             
2 26 Feb 07 jari 352             for (int i = 0; i < hasMissingValues.length; i++) {
2 26 Feb 07 jari 353                 if (!hasMissingValues[i]) {
2 26 Feb 07 jari 354                     firstNonMissingGene = i;
2 26 Feb 07 jari 355                     break;
2 26 Feb 07 jari 356                 }
2 26 Feb 07 jari 357             }
2 26 Feb 07 jari 358             
2 26 Feb 07 jari 359             Vector[][] geneFactorValues = getCurrentGeneFactorValues(firstNonMissingGene);
2 26 Feb 07 jari 360             int geneFactorCondition = getCurrGeneFactorCondition(geneFactorValues);            
2 26 Feb 07 jari 361             
2 26 Feb 07 jari 362             Vector validIndices = new Vector();
2 26 Feb 07 jari 363             for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 364                 if ((factorAAssignments[i] !=0)&&(factorBAssignments[i] != 0) ) {
2 26 Feb 07 jari 365                     validIndices.add(new Integer(i));
2 26 Feb 07 jari 366                 }
2 26 Feb 07 jari 367             }
2 26 Feb 07 jari 368             int[] validArray = new int[validIndices.size()];
2 26 Feb 07 jari 369             for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 370                 validArray[i] = ((Integer)(validIndices.get(i))).intValue();
2 26 Feb 07 jari 371             }
2 26 Feb 07 jari 372             
2 26 Feb 07 jari 373             event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numPerms);
2 26 Feb 07 jari 374             fireValueChanged(event);
2 26 Feb 07 jari 375             event.setId(AlgorithmEvent.PROGRESS_VALUE);            
2 26 Feb 07 jari 376             
2 26 Feb 07 jari 377             for (int j = 0; j < numPerms; j++) {
2 26 Feb 07 jari 378                 if (stop) {
2 26 Feb 07 jari 379                     throw new AbortException();
2 26 Feb 07 jari 380                 }
2 26 Feb 07 jari 381                 
2 26 Feb 07 jari 382                 event.setIntValue(j);
2 26 Feb 07 jari 383                 event.setDescription("Calculating unadjusted p-values for some genes: Current permutation = " + (j + 1));
2 26 Feb 07 jari 384                 fireValueChanged(event);
2 26 Feb 07 jari 385                 
2 26 Feb 07 jari 386                 int[] permutedExpts = getPermutedValues(numExps, validArray); //returns an int array of size "numExps", with the valid values permuted
2 26 Feb 07 jari 387                 FloatMatrix permutedMatrix = getPermutedMatrix(expMatrix, permutedExpts);
2 26 Feb 07 jari 388                 
2 26 Feb 07 jari 389                 if (geneFactorCondition == BALANCED_WITH_REPLICATION) {
2 26 Feb 07 jari 390                     for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 391                         if (!hasMissingValues[i]) {
2 26 Feb 07 jari 392                             Vector[][] currentGenePermFactorValues = getCurrentGeneFactorValuesFromPermMatrix(permutedMatrix, i);
2 26 Feb 07 jari 393                             //int currGenePermFactorCondition = getCurrGeneFactorCondition(currentGenePermFactorValues);
2 26 Feb 07 jari 394                             double[] permFValuesAndDfs = getBalancedFValuesAndDfs(currentGenePermFactorValues);
2 26 Feb 07 jari 395                             double currGenePermFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 396                             double currGenePermFBValue = permFValuesAndDfs[1];                            
2 26 Feb 07 jari 397                             double currGenePermInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 398                             
2 26 Feb 07 jari 399                             if (currGenePermFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 400                             if (currGenePermFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 401                             if (currGenePermInteractionFValue >= interactionFValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;                                               
2 26 Feb 07 jari 402                         }
2 26 Feb 07 jari 403                     }
2 26 Feb 07 jari 404                 } else if (geneFactorCondition == UNBALANCED_WITH_REPLICATION) {
2 26 Feb 07 jari 405                     for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 406                         if (!hasMissingValues[i]) {
2 26 Feb 07 jari 407                             Vector[][] currentGenePermFactorValues = getCurrentGeneFactorValuesFromPermMatrix(permutedMatrix, i);
2 26 Feb 07 jari 408                             //int currGenePermFactorCondition = getCurrGeneFactorCondition(currentGenePermFactorValues);
2 26 Feb 07 jari 409                             double[] permFValuesAndDfs = getUnbalancedFValuesAndDfs(currentGenePermFactorValues);
2 26 Feb 07 jari 410                             double currGenePermFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 411                             double currGenePermFBValue = permFValuesAndDfs[1];                            
2 26 Feb 07 jari 412                             double currGenePermInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 413                             
2 26 Feb 07 jari 414                             if (currGenePermFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 415                             if (currGenePermFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 416                             if (currGenePermInteractionFValue >= interactionFValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;                                               
2 26 Feb 07 jari 417                         }
2 26 Feb 07 jari 418                     }                    
2 26 Feb 07 jari 419                 } else if (geneFactorCondition == ALL_CELLS_HAVE_ONE_SAMPLE) {
2 26 Feb 07 jari 420                     for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 421                         if (!hasMissingValues[i]) {
2 26 Feb 07 jari 422                             Vector[][] currentGenePermFactorValues = getCurrentGeneFactorValuesFromPermMatrix(permutedMatrix, i);
2 26 Feb 07 jari 423                             //int currGenePermFactorCondition = getCurrGeneFactorCondition(currentGenePermFactorValues);
2 26 Feb 07 jari 424                             double[] permFValuesAndDfs = getBalancedMainEffectsFValuesAndDfs(currentGenePermFactorValues);
2 26 Feb 07 jari 425                             double currGenePermFAValue = permFValuesAndDfs[0];
2 26 Feb 07 jari 426                             double currGenePermFBValue = permFValuesAndDfs[1];                            
2 26 Feb 07 jari 427                             //double currGenePermInteractionFValue = permFValuesAndDfs[2];
2 26 Feb 07 jari 428                             
2 26 Feb 07 jari 429                             if (currGenePermFAValue >= factorAFValues[i]) origFactorAPValues[i] = origFactorAPValues[i] + 1d;
2 26 Feb 07 jari 430                             if (currGenePermFBValue >= factorBFValues[i]) origFactorBPValues[i] = origFactorBPValues[i] + 1d;
2 26 Feb 07 jari 431                             //origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 432                             //if (currGenePermInteractionFValue >= origInteractionPValues[i]) origInteractionPValues[i] = origInteractionPValues[i] + 1d;                                               
2 26 Feb 07 jari 433                         }                        
2 26 Feb 07 jari 434                     }
2 26 Feb 07 jari 435                 }
2 26 Feb 07 jari 436             }           
2 26 Feb 07 jari 437
2 26 Feb 07 jari 438         }
2 26 Feb 07 jari 439         
2 26 Feb 07 jari 440         if (usePerms) {
2 26 Feb 07 jari 441             for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 442                 origFactorAPValues[i] = origFactorAPValues[i]/(double)numPerms;
2 26 Feb 07 jari 443                 origFactorBPValues[i] = origFactorBPValues[i]/(double)numPerms;                
2 26 Feb 07 jari 444                 origInteractionPValues[i] = origInteractionPValues[i]/(double)numPerms;                
2 26 Feb 07 jari 445             }
2 26 Feb 07 jari 446         }
2 26 Feb 07 jari 447         
2 26 Feb 07 jari 448         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 449             if (Double.isNaN(factorAFValues[i])) origFactorAPValues[i] = Double.NaN;
2 26 Feb 07 jari 450             if (Double.isNaN(factorBFValues[i])) origFactorBPValues[i] = Double.NaN;
2 26 Feb 07 jari 451             if (Double.isNaN(interactionFValues[i])) origInteractionPValues[i] = Double.NaN;
2 26 Feb 07 jari 452         }
2 26 Feb 07 jari 453         
2 26 Feb 07 jari 454         if (adjustmentMethod == JUST_ALPHA) {
2 26 Feb 07 jari 455             for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 456                 adjFactorAPValues[i] = origFactorAPValues[i];
2 26 Feb 07 jari 457                 adjFactorBPValues[i] = origFactorBPValues[i];
2 26 Feb 07 jari 458                 adjInteractionPValues[i] = origInteractionPValues[i];
2 26 Feb 07 jari 459             }
2 26 Feb 07 jari 460         } else {// for other adjustment methods
2 26 Feb 07 jari 461         }
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         Vector clusterVector = new Vector();
2 26 Feb 07 jari 464         
2 26 Feb 07 jari 465         Vector sigAGenes = new Vector();
2 26 Feb 07 jari 466         Vector nonSigAGenes = new Vector();
2 26 Feb 07 jari 467         Vector sigBGenes = new Vector();
2 26 Feb 07 jari 468         Vector nonSigBGenes = new Vector();
2 26 Feb 07 jari 469         Vector sigInteractionGenes = new Vector();
2 26 Feb 07 jari 470         Vector nonSigInteractionGenes = new Vector();
2 26 Feb 07 jari 471         Vector nonSigAllGenes = new Vector();
2 26 Feb 07 jari 472         
2 26 Feb 07 jari 473         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 474             if ((float)(adjFactorAPValues[i]) <= alpha) {
2 26 Feb 07 jari 475                 sigAGenes.add(new Integer(i));
2 26 Feb 07 jari 476             } 
2 26 Feb 07 jari 477             if ((float)(adjFactorBPValues[i]) <= alpha) {
2 26 Feb 07 jari 478                 sigBGenes.add(new Integer(i));
2 26 Feb 07 jari 479             } 
2 26 Feb 07 jari 480             if ((float)(adjInteractionPValues[i]) <= alpha) {
2 26 Feb 07 jari 481                 sigInteractionGenes.add(new Integer(i));
2 26 Feb 07 jari 482             }
2 26 Feb 07 jari 483         };
2 26 Feb 07 jari 484         
2 26 Feb 07 jari 485         Vector allGenes = new Vector();        
2 26 Feb 07 jari 486         
2 26 Feb 07 jari 487         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 488             allGenes.add(new Integer(i));
2 26 Feb 07 jari 489         }
2 26 Feb 07 jari 490         
2 26 Feb 07 jari 491         //System.out.println("allGenes.size() = " + allGenes.size());
2 26 Feb 07 jari 492         
2 26 Feb 07 jari 493         nonSigAGenes = (Vector)(allGenes.clone());
2 26 Feb 07 jari 494         nonSigAGenes.removeAll(sigAGenes);
2 26 Feb 07 jari 495         
2 26 Feb 07 jari 496         //System.out.println("allGenes.size() = " + allGenes.size());
2 26 Feb 07 jari 497         
2 26 Feb 07 jari 498         nonSigBGenes = (Vector)(allGenes.clone());
2 26 Feb 07 jari 499         nonSigBGenes.removeAll(sigBGenes);  
2 26 Feb 07 jari 500         
2 26 Feb 07 jari 501         nonSigInteractionGenes = (Vector)(allGenes.clone());
2 26 Feb 07 jari 502         nonSigInteractionGenes.removeAll(sigInteractionGenes);
2 26 Feb 07 jari 503         
2 26 Feb 07 jari 504         nonSigAllGenes = (Vector)(allGenes.clone());
2 26 Feb 07 jari 505         nonSigAllGenes.removeAll(sigAGenes);
2 26 Feb 07 jari 506         nonSigAllGenes.removeAll(sigBGenes);
2 26 Feb 07 jari 507         nonSigAllGenes.removeAll(sigInteractionGenes);
2 26 Feb 07 jari 508         
2 26 Feb 07 jari 509         clusterVector.add(sigAGenes);
2 26 Feb 07 jari 510         clusterVector.add(sigBGenes);
2 26 Feb 07 jari 511         clusterVector.add(sigInteractionGenes);
2 26 Feb 07 jari 512         clusterVector.add(nonSigAGenes);        
2 26 Feb 07 jari 513         clusterVector.add(nonSigBGenes);  
2 26 Feb 07 jari 514         clusterVector.add(nonSigInteractionGenes);
2 26 Feb 07 jari 515         clusterVector.add(nonSigAllGenes);       
2 26 Feb 07 jari 516         
2 26 Feb 07 jari 517         k = clusterVector.size();
2 26 Feb 07 jari 518         
2 26 Feb 07 jari 519         FloatMatrix factorAFValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 520         FloatMatrix factorBFValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 521         FloatMatrix interactionFValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 522         
2 26 Feb 07 jari 523         FloatMatrix factorADfValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 524         FloatMatrix factorBDfValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 525         FloatMatrix interactionDfValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 526         FloatMatrix errorDfValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 527         
2 26 Feb 07 jari 528         FloatMatrix origFactorAPValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 529         FloatMatrix origFactorBPValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 530         FloatMatrix origInteractionPValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 531         
2 26 Feb 07 jari 532         FloatMatrix adjFactorAPValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 533         FloatMatrix adjFactorBPValuesMatrix = new FloatMatrix(numGenes, 1);
2 26 Feb 07 jari 534         FloatMatrix adjInteractionPValuesMatrix = new FloatMatrix(numGenes, 1);        
2 26 Feb 07 jari 535         
2 26 Feb 07 jari 536         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 537             factorAFValuesMatrix.A[i][0] = (float)(factorAFValues[i]);
2 26 Feb 07 jari 538             factorBFValuesMatrix.A[i][0] = (float)(factorBFValues[i]);
2 26 Feb 07 jari 539             interactionFValuesMatrix.A[i][0] = (float)(interactionFValues[i]);
2 26 Feb 07 jari 540             
2 26 Feb 07 jari 541             factorADfValuesMatrix.A[i][0] = (float)(factorADfValues[i]);
2 26 Feb 07 jari 542             factorBDfValuesMatrix.A[i][0] = (float)(factorBDfValues[i]);
2 26 Feb 07 jari 543             interactionDfValuesMatrix.A[i][0] = (float)(interactionDfValues[i]);
2 26 Feb 07 jari 544             errorDfValuesMatrix.A[i][0] = (float)(errorDfValues[i]);
2 26 Feb 07 jari 545             
2 26 Feb 07 jari 546             origFactorAPValuesMatrix.A[i][0] = (float)(origFactorAPValues[i]);
2 26 Feb 07 jari 547             origFactorBPValuesMatrix.A[i][0] = (float)(origFactorBPValues[i]);
2 26 Feb 07 jari 548             origInteractionPValuesMatrix.A[i][0] = (float)(origInteractionPValues[i]);            
2 26 Feb 07 jari 549             
2 26 Feb 07 jari 550             adjFactorAPValuesMatrix.A[i][0] = (float)(adjFactorAPValues[i]);
2 26 Feb 07 jari 551             adjFactorBPValuesMatrix.A[i][0] = (float)(adjFactorBPValues[i]);
2 26 Feb 07 jari 552             adjInteractionPValuesMatrix.A[i][0] = (float)(adjInteractionPValues[i]);
2 26 Feb 07 jari 553         }
2 26 Feb 07 jari 554         
2 26 Feb 07 jari 555   clusters = new Vector[k];
2 26 Feb 07 jari 556   
2 26 Feb 07 jari 557   for (int i = 0; i < k; i++) {
2 26 Feb 07 jari 558       clusters[i] = (Vector)(clusterVector.get(i));
2 26 Feb 07 jari 559   }
2 26 Feb 07 jari 560   
2 26 Feb 07 jari 561   FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 562   FloatMatrix variances = getVariances(clusters, means);         
2 26 Feb 07 jari 563         
2 26 Feb 07 jari 564   event = null;
2 26 Feb 07 jari 565   if (hierarchical_tree) {
2 26 Feb 07 jari 566       event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 567       fireValueChanged(event);
2 26 Feb 07 jari 568       event.setIntValue(0);
2 26 Feb 07 jari 569       event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 570       fireValueChanged(event);
2 26 Feb 07 jari 571   }         
2 26 Feb 07 jari 572         
2 26 Feb 07 jari 573   Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 574   NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 575   int[] features;        
2 26 Feb 07 jari 576   for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 577       if (stop) {
2 26 Feb 07 jari 578     throw new AbortException();
2 26 Feb 07 jari 579       }
2 26 Feb 07 jari 580       features = convert2int(clusters[i]);
2 26 Feb 07 jari 581       Node node = new Node(features);
2 26 Feb 07 jari 582       nodeList.addNode(node);
2 26 Feb 07 jari 583       if (hierarchical_tree) {
2 26 Feb 07 jari 584                 if (drawSigTreesOnly) {
2 26 Feb 07 jari 585                     if (i <= 2) {
2 26 Feb 07 jari 586                         node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 587                         event.setIntValue(i+1);
2 26 Feb 07 jari 588                         fireValueChanged(event);                        
2 26 Feb 07 jari 589                     }
2 26 Feb 07 jari 590                 } else {
2 26 Feb 07 jari 591                     node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 592                     event.setIntValue(i+1);
2 26 Feb 07 jari 593                     fireValueChanged(event);
2 26 Feb 07 jari 594                 }
2 26 Feb 07 jari 595       }
2 26 Feb 07 jari 596   }       
2 26 Feb 07 jari 597         
2 26 Feb 07 jari 598   // prepare the result
2 26 Feb 07 jari 599   AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 600   result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 601   result.addParam("number-of-clusters", String.valueOf(clusters.length));    
2 26 Feb 07 jari 602   result.addMatrix("clusters_means", means);
2 26 Feb 07 jari 603   result.addMatrix("clusters_variances", variances); 
2 26 Feb 07 jari 604         result.addMatrix("factorAFValuesMatrix", factorAFValuesMatrix);
2 26 Feb 07 jari 605         result.addMatrix("factorBFValuesMatrix", factorBFValuesMatrix);
2 26 Feb 07 jari 606         result.addMatrix("interactionFValuesMatrix", interactionFValuesMatrix);
2 26 Feb 07 jari 607         result.addMatrix("factorADfValuesMatrix", factorADfValuesMatrix);
2 26 Feb 07 jari 608         result.addMatrix("factorBDfValuesMatrix", factorBDfValuesMatrix);
2 26 Feb 07 jari 609         result.addMatrix("interactionDfValuesMatrix", interactionDfValuesMatrix);
2 26 Feb 07 jari 610         result.addMatrix("errorDfValuesMatrix", errorDfValuesMatrix);
2 26 Feb 07 jari 611         result.addMatrix("origFactorAPValuesMatrix", origFactorAPValuesMatrix);
2 26 Feb 07 jari 612         result.addMatrix("origFactorBPValuesMatrix", origFactorBPValuesMatrix);
2 26 Feb 07 jari 613         result.addMatrix("origInteractionPValuesMatrix", origInteractionPValuesMatrix);
2 26 Feb 07 jari 614         result.addMatrix("adjFactorAPValuesMatrix", adjFactorAPValuesMatrix);
2 26 Feb 07 jari 615         result.addMatrix("adjFactorBPValuesMatrix", adjFactorBPValuesMatrix);
2 26 Feb 07 jari 616         result.addMatrix("adjInteractionPValuesMatrix", adjInteractionPValuesMatrix);        
2 26 Feb 07 jari 617         
2 26 Feb 07 jari 618         return result;        
2 26 Feb 07 jari 619         //return null; //for now
2 26 Feb 07 jari 620     }
2 26 Feb 07 jari 621     
2 26 Feb 07 jari 622     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 623   NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 624   AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 625   FloatMatrix experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 626   data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 627         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 628         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 629   data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 630   HCL hcl = new HCL();
2 26 Feb 07 jari 631   AlgorithmData result;
2 26 Feb 07 jari 632   if (genes) {
2 26 Feb 07 jari 633       data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 634       result = hcl.execute(data);
2 26 Feb 07 jari 635       validate(result);
2 26 Feb 07 jari 636       addNodeValues(nodeList, result);
2 26 Feb 07 jari 637   }
2 26 Feb 07 jari 638   if (experiments) {
2 26 Feb 07 jari 639       data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 640       result = hcl.execute(data);
2 26 Feb 07 jari 641       validate(result);
2 26 Feb 07 jari 642       addNodeValues(nodeList, result);
2 26 Feb 07 jari 643   }
2 26 Feb 07 jari 644   return nodeList;
2 26 Feb 07 jari 645     }
2 26 Feb 07 jari 646     
2 26 Feb 07 jari 647     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 648   target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 649   target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 650   target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 651   target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 652     }
2 26 Feb 07 jari 653     
2 26 Feb 07 jari 654     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 655   FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 656   for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 657       subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 658   }
2 26 Feb 07 jari 659   return subExperiment;
2 26 Feb 07 jari 660     }
2 26 Feb 07 jari 661     
2 26 Feb 07 jari 662     /**
2 26 Feb 07 jari 663      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 664      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 665      */
2 26 Feb 07 jari 666     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 667   if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 668       throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 669   }
2 26 Feb 07 jari 670   if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 671       throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 672   }
2 26 Feb 07 jari 673   if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 674       throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 675   }
2 26 Feb 07 jari 676   if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 677       throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 678   }
2 26 Feb 07 jari 679     }
2 26 Feb 07 jari 680     
2 26 Feb 07 jari 681     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 682   int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 683   for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 684       int_matrix[i] = (int)((Integer)source.get(i)).intValue();
2 26 Feb 07 jari 685   }
2 26 Feb 07 jari 686   return int_matrix;
2 26 Feb 07 jari 687     }
2 26 Feb 07 jari 688     
2 26 Feb 07 jari 689     private FloatMatrix getMeans(Vector[] clusters) {
2 26 Feb 07 jari 690   FloatMatrix means = new FloatMatrix(clusters.length, numExps);
2 26 Feb 07 jari 691   FloatMatrix mean;
2 26 Feb 07 jari 692   for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 693       mean = getMean(clusters[i]);
2 26 Feb 07 jari 694       means.A[i] = mean.A[0];
2 26 Feb 07 jari 695   }
2 26 Feb 07 jari 696   return means;
2 26 Feb 07 jari 697     }
2 26 Feb 07 jari 698     
2 26 Feb 07 jari 699     private FloatMatrix getMean(Vector cluster) {
2 26 Feb 07 jari 700   FloatMatrix mean = new FloatMatrix(1, numExps);
2 26 Feb 07 jari 701   float currentMean;
2 26 Feb 07 jari 702   int n = cluster.size();
2 26 Feb 07 jari 703   int denom = 0;
2 26 Feb 07 jari 704   float value;
2 26 Feb 07 jari 705   for (int i=0; i<numExps; i++) {
2 26 Feb 07 jari 706       currentMean = 0f;
2 26 Feb 07 jari 707       denom = 0;
2 26 Feb 07 jari 708       for (int j=0; j<n; j++) {
2 26 Feb 07 jari 709     value = expMatrix.get(((Integer) cluster.get(j)).intValue(), i);
2 26 Feb 07 jari 710     if (!Float.isNaN(value)) {
2 26 Feb 07 jari 711         currentMean += value;
2 26 Feb 07 jari 712         denom++;
2 26 Feb 07 jari 713     }
2 26 Feb 07 jari 714       }
2 26 Feb 07 jari 715       mean.set(0, i, currentMean/(float)denom);
2 26 Feb 07 jari 716   }
2 26 Feb 07 jari 717   
2 26 Feb 07 jari 718   return mean;
2 26 Feb 07 jari 719     }
2 26 Feb 07 jari 720     
2 26 Feb 07 jari 721     private FloatMatrix getVariances(Vector[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 722   final int rows = means.getRowDimension();
2 26 Feb 07 jari 723   final int columns = means.getColumnDimension();
2 26 Feb 07 jari 724   FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 725   for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 726       for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 727     variances.set(row, column, getSampleVariance(clusters[row], column, means.get(row, column)));
2 26 Feb 07 jari 728       }
2 26 Feb 07 jari 729   }
2 26 Feb 07 jari 730   return variances;
2 26 Feb 07 jari 731     }
2 26 Feb 07 jari 732     
2 26 Feb 07 jari 733     int validN;
2 26 Feb 07 jari 734     
2 26 Feb 07 jari 735     private float getSampleNormalizedSum(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 736   final int size = cluster.size();
2 26 Feb 07 jari 737   float sum = 0f;
2 26 Feb 07 jari 738   float value;
2 26 Feb 07 jari 739   validN = 0;
2 26 Feb 07 jari 740   for (int i=0; i<size; i++) {
2 26 Feb 07 jari 741       value = expMatrix.get(((Integer) cluster.get(i)).intValue(), column);
2 26 Feb 07 jari 742       if (!Float.isNaN(value)) {
2 26 Feb 07 jari 743     sum += Math.pow(value-mean, 2);
2 26 Feb 07 jari 744     validN++;
2 26 Feb 07 jari 745       }
2 26 Feb 07 jari 746   }
2 26 Feb 07 jari 747   return sum;
2 26 Feb 07 jari 748     }
2 26 Feb 07 jari 749     
2 26 Feb 07 jari 750     private float getSampleVariance(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 751   return(float)Math.sqrt(getSampleNormalizedSum(cluster, column, mean)/(float)(validN-1));
2 26 Feb 07 jari 752   
2 26 Feb 07 jari 753     }    
2 26 Feb 07 jari 754     
2 26 Feb 07 jari 755     /*
2 26 Feb 07 jari 756     private double getFactorAPValueBalanced(int gene) {
2 26 Feb 07 jari 757         //double FA = getBalancedFA(gene);
2 26 Feb 07 jari 758         
2 26 Feb 07 jari 759     }*/
2 26 Feb 07 jari 760     
2 26 Feb 07 jari 761     private double getPValueFromFDist(double fValue, int groupsDF, int errorDF) {
2 26 Feb 07 jari 762         FDistribution fDist = new FDistribution(groupsDF, errorDF);
2 26 Feb 07 jari 763         double cumulProb = fDist.cumulative(fValue);
2 26 Feb 07 jari 764         double pValue = 1 - cumulProb; // (1 - cumulProb) is the two-tailed test p-value
2 26 Feb 07 jari 765         
2 26 Feb 07 jari 766         if (pValue > 1) {
2 26 Feb 07 jari 767             pValue = 1.0d;
2 26 Feb 07 jari 768         }     
2 26 Feb 07 jari 769         
2 26 Feb 07 jari 770         return pValue;
2 26 Feb 07 jari 771     }
2 26 Feb 07 jari 772     
2 26 Feb 07 jari 773     private double convertNegFValues (double fValue) { //sometimes, if variance is very low, an F Value may be slightly negative due to 
2 26 Feb 07 jari 774         // loss of precision in computation (effectively, F is zero). This makes such values slightly positive (Double.MIN_VALUE)
2 26 Feb 07 jari 775         double convFValue;
2 26 Feb 07 jari 776         if ((fValue > (-0.001)) && (fValue < 0)) {
2 26 Feb 07 jari 777             convFValue = Double.MIN_VALUE;
2 26 Feb 07 jari 778         }   else {
2 26 Feb 07 jari 779             convFValue = fValue;
2 26 Feb 07 jari 780         }
2 26 Feb 07 jari 781         return convFValue;
2 26 Feb 07 jari 782     }
2 26 Feb 07 jari 783     
2 26 Feb 07 jari 784     private double[] getUnbalancedFValuesAndDfs(Vector[][] currGeneFactorValues) {
2 26 Feb 07 jari 785         double[][] unadjCellSums = getCellSums(currGeneFactorValues);
2 26 Feb 07 jari 786         double[][] cellMeans = new double[currGeneFactorValues.length][currGeneFactorValues[0].length];
2 26 Feb 07 jari 787         
2 26 Feb 07 jari 788         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 789             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 790                 cellMeans[i][j] = unadjCellSums[i][j]/(double)(currGeneFactorValues[i][j].size());
2 26 Feb 07 jari 791             }
2 26 Feb 07 jari 792         } 
2 26 Feb 07 jari 793         
2 26 Feb 07 jari 794         double sumRecipCellSizes = 0;
2 26 Feb 07 jari 795         int dfError = 0;
2 26 Feb 07 jari 796         
2 26 Feb 07 jari 797         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 798             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 799                 sumRecipCellSizes = sumRecipCellSizes + 1d/(double)(currGeneFactorValues[i][j].size());
2 26 Feb 07 jari 800                 dfError = dfError + (currGeneFactorValues[i][j].size() - 1);
2 26 Feb 07 jari 801             }
2 26 Feb 07 jari 802         }
2 26 Feb 07 jari 803         
2 26 Feb 07 jari 804         double harmonicCellSize = (double)(numFactorLevels[0]*numFactorLevels[1])/sumRecipCellSizes;
2 26 Feb 07 jari 805         
2 26 Feb 07 jari 806         double[][] adjustedCellSums = new double[currGeneFactorValues.length][currGeneFactorValues[0].length];
2 26 Feb 07 jari 807         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 808             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 809                 adjustedCellSums[i][j] = (cellMeans[i][j])*harmonicCellSize;
2 26 Feb 07 jari 810             }
2 26 Feb 07 jari 811         }
2 26 Feb 07 jari 812         
2 26 Feb 07 jari 813         int dfA = numFactorLevels[0] - 1;
2 26 Feb 07 jari 814         int dfB = numFactorLevels[1] - 1;
2 26 Feb 07 jari 815         int dfInteraction = dfA*dfB;   
2 26 Feb 07 jari 816         
2 26 Feb 07 jari 817         
2 26 Feb 07 jari 818         double T = getTUnbalanced(adjustedCellSums, harmonicCellSize);
2 26 Feb 07 jari 819         double A = getAUnbalanced(adjustedCellSums, harmonicCellSize);
2 26 Feb 07 jari 820         double B = getBUnbalanced(adjustedCellSums, harmonicCellSize);
2 26 Feb 07 jari 821         double AB = getABUnbalanced(adjustedCellSums, harmonicCellSize);
2 26 Feb 07 jari 822         
2 26 Feb 07 jari 823         double msA = (A - T)/(double)dfA;
2 26 Feb 07 jari 824         double msB = (B - T)/(double)dfB;
2 26 Feb 07 jari 825         double msInteraction = (AB - A - B + T)/(double)dfInteraction;     
2 26 Feb 07 jari 826         
2 26 Feb 07 jari 827         double ssError = 0d;
2 26 Feb 07 jari 828         
2 26 Feb 07 jari 829         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 830             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 831                 Vector vect = currGeneFactorValues[i][j];
2 26 Feb 07 jari 832                 ssError = ssError + getSumSquaredDiffs(vect);
2 26 Feb 07 jari 833             }
2 26 Feb 07 jari 834         }
2 26 Feb 07 jari 835         
2 26 Feb 07 jari 836         double msError = ssError/(double)dfError;  
2 26 Feb 07 jari 837         
2 26 Feb 07 jari 838         double fA = msA / msError;
2 26 Feb 07 jari 839         double fB = msB / msError;
2 26 Feb 07 jari 840         double fInteraction = msInteraction/msError;        
2 26 Feb 07 jari 841         
2 26 Feb 07 jari 842         double[] fValuesAndDfs = new double[7];
2 26 Feb 07 jari 843         fValuesAndDfs[0] = convertNegFValues(fA);
2 26 Feb 07 jari 844         fValuesAndDfs[1] = convertNegFValues(fB);
2 26 Feb 07 jari 845         fValuesAndDfs[2] = convertNegFValues(fInteraction);
2 26 Feb 07 jari 846         fValuesAndDfs[3] = (double)dfA;
2 26 Feb 07 jari 847         fValuesAndDfs[4] = (double)dfB;
2 26 Feb 07 jari 848         fValuesAndDfs[5] = (double)dfInteraction;
2 26 Feb 07 jari 849         fValuesAndDfs[6] = (double)dfError;        
2 26 Feb 07 jari 850         return fValuesAndDfs;
2 26 Feb 07 jari 851     }
2 26 Feb 07 jari 852     
2 26 Feb 07 jari 853     private double[] getBalancedFValuesAndDfs(Vector[][] currGeneFactorValues) {
2 26 Feb 07 jari 854         double[][] cellSums = getCellSums(currGeneFactorValues);
2 26 Feb 07 jari 855         int sampleSizePerCell = currGeneFactorValues[0][0].size();
2 26 Feb 07 jari 856         
2 26 Feb 07 jari 857         int dfA = numFactorLevels[0] - 1;
2 26 Feb 07 jari 858         int dfB = numFactorLevels[1] - 1;
2 26 Feb 07 jari 859         int dfInteraction = dfA*dfB;
2 26 Feb 07 jari 860         int dfError = numFactorLevels[0]*numFactorLevels[1]*(sampleSizePerCell - 1);
2 26 Feb 07 jari 861         
2 26 Feb 07 jari 862         double Y = getYBalanced(currGeneFactorValues);
2 26 Feb 07 jari 863         double AB = getABBalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 864         double T = getTBalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 865         double A = getABalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 866         double B = getBBalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 867         
2 26 Feb 07 jari 868         double msA = (A - T)/(double)dfA;
2 26 Feb 07 jari 869         double msB = (B - T)/(double)dfB;
2 26 Feb 07 jari 870         double msInteraction = (AB - A - B + T)/(double)dfInteraction;
2 26 Feb 07 jari 871         double msError = (Y - AB)/(double)dfError;
2 26 Feb 07 jari 872         
2 26 Feb 07 jari 873         //System.out.println("A = " + A + ", T = " + T +  ", A - T = " + (A - T) + ", msA = " + msA + ", msB = " + msB + ", msInt = " + msInteraction + ", msErr = " + msError);
2 26 Feb 07 jari 874         
2 26 Feb 07 jari 875         double fA = msA / msError;
2 26 Feb 07 jari 876         double fB = msB / msError;
2 26 Feb 07 jari 877         double fInteraction = msInteraction/msError;
2 26 Feb 07 jari 878         
2 26 Feb 07 jari 879         double[] fValuesAndDfs = new double[7];
2 26 Feb 07 jari 880         fValuesAndDfs[0] = convertNegFValues(fA);
2 26 Feb 07 jari 881         fValuesAndDfs[1] = convertNegFValues(fB);
2 26 Feb 07 jari 882         fValuesAndDfs[2] = convertNegFValues(fInteraction);
2 26 Feb 07 jari 883         fValuesAndDfs[3] = (double)dfA;
2 26 Feb 07 jari 884         fValuesAndDfs[4] = (double)dfB;
2 26 Feb 07 jari 885         fValuesAndDfs[5] = (double)dfInteraction;
2 26 Feb 07 jari 886         fValuesAndDfs[6] = (double)dfError;
2 26 Feb 07 jari 887         
2 26 Feb 07 jari 888         return fValuesAndDfs;
2 26 Feb 07 jari 889     }
2 26 Feb 07 jari 890     
2 26 Feb 07 jari 891
2 26 Feb 07 jari 892     
2 26 Feb 07 jari 893     private double[] getBalancedMainEffectsFValuesAndDfs(Vector[][] currGeneFactorValues) {
2 26 Feb 07 jari 894         // implemented as in Biostatistical Analysis by Zar 4th ed. pg 249. 
2 26 Feb 07 jari 895         //Without replication in cells, only main effects are tested, and Remainder (Error) terms are the same as
2 26 Feb 07 jari 896         //the interaction terms in the case with equal replication.
2 26 Feb 07 jari 897         double[][] cellSums = getCellSums(currGeneFactorValues);
2 26 Feb 07 jari 898         //int sampleSizePerCell = currGeneFactorValues[0][0].size();
2 26 Feb 07 jari 899         
2 26 Feb 07 jari 900         int dfA = numFactorLevels[0] - 1;
2 26 Feb 07 jari 901         int dfB = numFactorLevels[1] - 1;  
2 26 Feb 07 jari 902         int dfRemainder = dfA*dfB;//numFactorLevels[0]*numFactorLevels[1]*(sampleSizePerCell - 1); 
2 26 Feb 07 jari 903
2 26 Feb 07 jari 904         double Y = getYBalanced(currGeneFactorValues); 
2 26 Feb 07 jari 905         double AB = getABBalanced(currGeneFactorValues, cellSums);        
2 26 Feb 07 jari 906         double T = getTBalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 907         double A = getABalanced(currGeneFactorValues, cellSums);
2 26 Feb 07 jari 908         double B = getBBalanced(currGeneFactorValues, cellSums);  
2 26 Feb 07 jari 909         
2 26 Feb 07 jari 910         double msA = (A - T)/(double)dfA;
2 26 Feb 07 jari 911         double msB = (B - T)/(double)dfB;  
2 26 Feb 07 jari 912         double msRemainder = (AB - A - B + T)/(double)dfRemainder;//(Y - AB)/(double)dfError; 
2 26 Feb 07 jari 913         
2 26 Feb 07 jari 914         double fA = msA / msRemainder;
2 26 Feb 07 jari 915         double fB = msB / msRemainder;  
2 26 Feb 07 jari 916         
2 26 Feb 07 jari 917         double[] fValuesAndDfs = new double[5]; 
2 26 Feb 07 jari 918         fValuesAndDfs[0] = convertNegFValues(fA);
2 26 Feb 07 jari 919         fValuesAndDfs[1] = convertNegFValues(fB);
2 26 Feb 07 jari 920         fValuesAndDfs[2] = (double)dfA;
2 26 Feb 07 jari 921         fValuesAndDfs[3] = (double)dfB;
2 26 Feb 07 jari 922         fValuesAndDfs[4] = (double)dfRemainder;
2 26 Feb 07 jari 923         
2 26 Feb 07 jari 924         return fValuesAndDfs;        
2 26 Feb 07 jari 925     }
2 26 Feb 07 jari 926      
2 26 Feb 07 jari 927     
2 26 Feb 07 jari 928     /*
2 26 Feb 07 jari 929     private double getBalancedFA(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 930         //Vector[][] currGeneFactorVals = getCurrentGeneFactorValues(gene);
2 26 Feb 07 jari 931         double A = getABalanced(currGeneFactorVals);
2 26 Feb 07 jari 932         double T = getTBalanced(currGeneFactorVals);
2 26 Feb 07 jari 933         
2 26 Feb 07 jari 934         double ssA = A - T;
2 26 Feb 07 jari 935         int dfA = numFactorLevels[0] - 1;
2 26 Feb 07 jari 936         
2 26 Feb 07 jari 937         double msA = ssA/(double)dfA;        
2 26 Feb 07 jari 938         double msError = getMSErrorBalanced(currGeneFactorVals);
2 26 Feb 07 jari 939         
2 26 Feb 07 jari 940         double fValue = msA/msError;
2 26 Feb 07 jari 941         
2 26 Feb 07 jari 942         return fValue;
2 26 Feb 07 jari 943     }
2 26 Feb 07 jari 944     
2 26 Feb 07 jari 945     private double getBalancedFB(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 946         double B = getBBalanced(currGeneFactorVals);
2 26 Feb 07 jari 947         double T = getTBalanced(currGeneFactorVals);
2 26 Feb 07 jari 948         
2 26 Feb 07 jari 949         double ssB = B - T;
2 26 Feb 07 jari 950         int dfB = numFactorLevels[1] - 1;
2 26 Feb 07 jari 951         
2 26 Feb 07 jari 952         double msB = ssB/(double)dfB;        
2 26 Feb 07 jari 953         double msError = getMSErrorBalanced(currGeneFactorVals);
2 26 Feb 07 jari 954         
2 26 Feb 07 jari 955         double fValue = msB/msError;
2 26 Feb 07 jari 956         
2 26 Feb 07 jari 957         return fValue;        
2 26 Feb 07 jari 958     }
2 26 Feb 07 jari 959     
2 26 Feb 07 jari 960     private double getMSErrorBalanced(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 961         double Y = 0;
2 26 Feb 07 jari 962         for (int i = 0; i < currGeneFactorVals.length; i++) {
2 26 Feb 07 jari 963             for (int j = 0; j < currGeneFactorVals[i].length; j++) {
2 26 Feb 07 jari 964                 for (int k = 0; k < currGeneFactorVals[i][j].size(); i++) {
2 26 Feb 07 jari 965                     double currVal = ((Float)(currGeneFactorVals[i][j].get(k))).doubleValue();
2 26 Feb 07 jari 966                     Y = Y + currVal*currVal;
2 26 Feb 07 jari 967                 }
2 26 Feb 07 jari 968             }
2 26 Feb 07 jari 969         }
2 26 Feb 07 jari 970         
2 26 Feb 07 jari 971         double sumSquaresCellSums = 0;
2 26 Feb 07 jari 972         double[][] cellSums = getCellSums(currGeneFactorVals);    
2 26 Feb 07 jari 973         
2 26 Feb 07 jari 974         for (int i = 0; i < cellSums.length; i++) {
2 26 Feb 07 jari 975             for (int j = 0; j < cellSums[i].length; j++) {
2 26 Feb 07 jari 976                 sumSquaresCellSums = sumSquaresCellSums + cellSums[i][j]*cellSums[i][j];
2 26 Feb 07 jari 977             }
2 26 Feb 07 jari 978         }
2 26 Feb 07 jari 979         
2 26 Feb 07 jari 980         int sampleSizePerCell = currGeneFactorVals[0][0].size();
2 26 Feb 07 jari 981         
2 26 Feb 07 jari 982         double AB = sumSquaresCellSums/(double)(sampleSizePerCell);
2 26 Feb 07 jari 983         
2 26 Feb 07 jari 984         double ssError = Y - AB;
2 26 Feb 07 jari 985         int dfError = numFactorLevels[0]*numFactorLevels[1]*(sampleSizePerCell - 1);
2 26 Feb 07 jari 986         
2 26 Feb 07 jari 987         double msError = ssError/(double)(dfError);
2 26 Feb 07 jari 988         
2 26 Feb 07 jari 989         return msError;
2 26 Feb 07 jari 990     }
2 26 Feb 07 jari 991     */
2 26 Feb 07 jari 992     
2 26 Feb 07 jari 993     private double getYBalanced(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 994         double Y = 0;
2 26 Feb 07 jari 995         for (int i = 0; i < currGeneFactorVals.length; i++) {
2 26 Feb 07 jari 996             for (int j = 0; j < currGeneFactorVals[i].length; j++) {
2 26 Feb 07 jari 997                 for (int k = 0; k < currGeneFactorVals[i][j].size(); k++) {
2 26 Feb 07 jari 998                     double currVal = ((Float)(currGeneFactorVals[i][j].get(k))).doubleValue();
2 26 Feb 07 jari 999                     Y = Y + currVal*currVal;
2 26 Feb 07 jari 1000                 }
2 26 Feb 07 jari 1001             }
2 26 Feb 07 jari 1002         }
2 26 Feb 07 jari 1003         
2 26 Feb 07 jari 1004         return Y;
2 26 Feb 07 jari 1005     }
2 26 Feb 07 jari 1006     
2 26 Feb 07 jari 1007     private double getABUnbalanced(double[][] adjCellSums, double adjSampleSize) {
2 26 Feb 07 jari 1008         double sumSquaresCellSums = 0;
2 26 Feb 07 jari 1009         
2 26 Feb 07 jari 1010         for (int i = 0; i < adjCellSums.length; i++) {
2 26 Feb 07 jari 1011             for (int j = 0; j < adjCellSums[i].length; j++) {
2 26 Feb 07 jari 1012                 sumSquaresCellSums = sumSquaresCellSums + adjCellSums[i][j]*adjCellSums[i][j];
2 26 Feb 07 jari 1013             }
2 26 Feb 07 jari 1014         }  
2 26 Feb 07 jari 1015         
2 26 Feb 07 jari 1016         double ABUnbalanced = sumSquaresCellSums/adjSampleSize;
2 26 Feb 07 jari 1017         return ABUnbalanced;
2 26 Feb 07 jari 1018     }
2 26 Feb 07 jari 1019     
2 26 Feb 07 jari 1020     private double getABBalanced(Vector[][] currGeneFactorVals, double[][] cellSums) {
2 26 Feb 07 jari 1021         double sumSquaresCellSums = 0;
2 26 Feb 07 jari 1022         //double[][] cellSums = getCellSums(currGeneFactorVals);    
2 26 Feb 07 jari 1023         
2 26 Feb 07 jari 1024         for (int i = 0; i < cellSums.length; i++) {
2 26 Feb 07 jari 1025             for (int j = 0; j < cellSums[i].length; j++) {
2 26 Feb 07 jari 1026                 sumSquaresCellSums = sumSquaresCellSums + cellSums[i][j]*cellSums[i][j];
2 26 Feb 07 jari 1027             }
2 26 Feb 07 jari 1028         }
2 26 Feb 07 jari 1029         
2 26 Feb 07 jari 1030         int sampleSizePerCell = currGeneFactorVals[0][0].size();
2 26 Feb 07 jari 1031         
2 26 Feb 07 jari 1032         double AB = sumSquaresCellSums/(double)(sampleSizePerCell);
2 26 Feb 07 jari 1033         
2 26 Feb 07 jari 1034         return AB;
2 26 Feb 07 jari 1035     }
2 26 Feb 07 jari 1036     
2 26 Feb 07 jari 1037     private double getAUnbalanced(double[][] adjCellSums, double adjSampleSize) {
2 26 Feb 07 jari 1038         double sumSquaresA = 0d;
2 26 Feb 07 jari 1039         
2 26 Feb 07 jari 1040         for (int i = 0; i < adjCellSums.length; i++) {
2 26 Feb 07 jari 1041             double currLevelASum = 0d;
2 26 Feb 07 jari 1042             for (int j = 0; j < adjCellSums[i].length; j++) {
2 26 Feb 07 jari 1043                 currLevelASum = currLevelASum + adjCellSums[i][j];
2 26 Feb 07 jari 1044             }
2 26 Feb 07 jari 1045             
2 26 Feb 07 jari 1046             sumSquaresA = sumSquaresA + currLevelASum*currLevelASum;
2 26 Feb 07 jari 1047         }      
2 26 Feb 07 jari 1048         
2 26 Feb 07 jari 1049         double AUnbalanced = sumSquaresA/(double)(numFactorLevels[1]*adjSampleSize);
2 26 Feb 07 jari 1050         return AUnbalanced;
2 26 Feb 07 jari 1051     }
2 26 Feb 07 jari 1052     
2 26 Feb 07 jari 1053     private double getABalanced(Vector[][] currGeneFactorVals, double[][] cellSums) {
2 26 Feb 07 jari 1054         //double[] sumsA = new double[numFactorLevels[0]];
2 26 Feb 07 jari 1055         //double[][] cellSums = getCellSums(currGeneFactorVals);
2 26 Feb 07 jari 1056         double sumSquaresA = 0d;
2 26 Feb 07 jari 1057         
2 26 Feb 07 jari 1058         for (int i = 0; i < cellSums.length; i++) {
2 26 Feb 07 jari 1059             double currLevelASum = 0d;
2 26 Feb 07 jari 1060             for (int j = 0; j < cellSums[i].length; j++) {
2 26 Feb 07 jari 1061                 currLevelASum = currLevelASum + cellSums[i][j];
2 26 Feb 07 jari 1062             }
2 26 Feb 07 jari 1063             
2 26 Feb 07 jari 1064             sumSquaresA = sumSquaresA + currLevelASum*currLevelASum;
2 26 Feb 07 jari 1065         }
2 26 Feb 07 jari 1066         
2 26 Feb 07 jari 1067         int sampleSizePerCell = currGeneFactorVals[0][0].size();
2 26 Feb 07 jari 1068         
2 26 Feb 07 jari 1069         double ABalanced = sumSquaresA/(double)(numFactorLevels[1]*sampleSizePerCell);
2 26 Feb 07 jari 1070         
2 26 Feb 07 jari 1071         return ABalanced;
2 26 Feb 07 jari 1072     }
2 26 Feb 07 jari 1073     
2 26 Feb 07 jari 1074     private double getBUnbalanced(double[][] adjCellSums, double adjSampleSize) {
2 26 Feb 07 jari 1075         double sumSquaresB = 0d;    
2 26 Feb 07 jari 1076         
2 26 Feb 07 jari 1077         for (int i = 0; i < adjCellSums[0].length; i++) {
2 26 Feb 07 jari 1078             double currLevelBSum = 0d;
2 26 Feb 07 jari 1079             for (int j = 0; j < adjCellSums.length; j++) {
2 26 Feb 07 jari 1080                 currLevelBSum = currLevelBSum + adjCellSums[j][i];
2 26 Feb 07 jari 1081             }
2 26 Feb 07 jari 1082             
2 26 Feb 07 jari 1083             sumSquaresB = sumSquaresB + currLevelBSum*currLevelBSum;
2 26 Feb 07 jari 1084         } 
2 26 Feb 07 jari 1085         
2 26 Feb 07 jari 1086         double BUnbalanced = sumSquaresB/(double)(numFactorLevels[0]*adjSampleSize); 
2 26 Feb 07 jari 1087         return BUnbalanced;
2 26 Feb 07 jari 1088     }
2 26 Feb 07 jari 1089     
2 26 Feb 07 jari 1090     private double getBBalanced(Vector[][] currGeneFactorVals, double[][] cellSums) {
2 26 Feb 07 jari 1091         //double[][] cellSums = getCellSums(currGeneFactorVals);
2 26 Feb 07 jari 1092         double sumSquaresB = 0d;    
2 26 Feb 07 jari 1093         
2 26 Feb 07 jari 1094         for (int i = 0; i < cellSums[0].length; i++) {
2 26 Feb 07 jari 1095             double currLevelBSum = 0d;
2 26 Feb 07 jari 1096             for (int j = 0; j < cellSums.length; j++) {
2 26 Feb 07 jari 1097                 currLevelBSum = currLevelBSum + cellSums[j][i];
2 26 Feb 07 jari 1098             }
2 26 Feb 07 jari 1099             
2 26 Feb 07 jari 1100             sumSquaresB = sumSquaresB + currLevelBSum*currLevelBSum;
2 26 Feb 07 jari 1101         }
2 26 Feb 07 jari 1102         
2 26 Feb 07 jari 1103         int sampleSizePerCell = currGeneFactorVals[0][0].size();
2 26 Feb 07 jari 1104         
2 26 Feb 07 jari 1105         double BBalanced = sumSquaresB/(double)(numFactorLevels[0]*sampleSizePerCell);    
2 26 Feb 07 jari 1106         
2 26 Feb 07 jari 1107         return BBalanced;
2 26 Feb 07 jari 1108     }
2 26 Feb 07 jari 1109     
2 26 Feb 07 jari 1110     private double getTBalanced(Vector[][] currGeneFactorVals, double[][] cellSums) {
2 26 Feb 07 jari 1111         //double[][] cellSums = getCellSums(currGeneFactorVals);
2 26 Feb 07 jari 1112         double totalSum = 0;
2 26 Feb 07 jari 1113         for (int i = 0; i < cellSums.length; i++) {
2 26 Feb 07 jari 1114             for (int j = 0; j < cellSums[i].length; j++) {
2 26 Feb 07 jari 1115                 totalSum = totalSum + cellSums[i][j];
2 26 Feb 07 jari 1116             }
2 26 Feb 07 jari 1117         }
2 26 Feb 07 jari 1118         
2 26 Feb 07 jari 1119         int sampleSizePerCell = currGeneFactorVals[0][0].size();
2 26 Feb 07 jari 1120         
2 26 Feb 07 jari 1121         double TBalanced = (totalSum*totalSum)/(double)(numFactorLevels[0]*numFactorLevels[1]*sampleSizePerCell);
2 26 Feb 07 jari 1122         return TBalanced;
2 26 Feb 07 jari 1123     }
2 26 Feb 07 jari 1124     
2 26 Feb 07 jari 1125     private double getTUnbalanced(double[][] adjCellSums, double adjSampleSize) {
2 26 Feb 07 jari 1126         double adjTotalSum = 0d;
2 26 Feb 07 jari 1127         
2 26 Feb 07 jari 1128         for (int i = 0; i < adjCellSums.length; i++) {
2 26 Feb 07 jari 1129             for (int j = 0; j < adjCellSums[i].length; j++) {
2 26 Feb 07 jari 1130                 adjTotalSum = adjTotalSum + adjCellSums[i][j];
2 26 Feb 07 jari 1131             }
2 26 Feb 07 jari 1132         }  
2 26 Feb 07 jari 1133         
2 26 Feb 07 jari 1134         double TUnbalanced = (adjTotalSum*adjTotalSum)/(double)(numFactorLevels[0]*numFactorLevels[1]*adjSampleSize);
2 26 Feb 07 jari 1135         return TUnbalanced;
2 26 Feb 07 jari 1136     }
2 26 Feb 07 jari 1137     
2 26 Feb 07 jari 1138     private double[][] getCellSums(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 1139         double[][] cellSums = new double[currGeneFactorVals.length][currGeneFactorVals[0].length];
2 26 Feb 07 jari 1140         
2 26 Feb 07 jari 1141         //int cellSumsCounter = 0;
2 26 Feb 07 jari 1142         for (int i = 0; i < currGeneFactorVals.length; i++) {
2 26 Feb 07 jari 1143             for (int j = 0; j < currGeneFactorVals[i].length; j++) {
2 26 Feb 07 jari 1144                 cellSums[i][j] = getSum(currGeneFactorVals[i][j]);
2 26 Feb 07 jari 1145                 //cellSumsCounter++;
2 26 Feb 07 jari 1146             }
2 26 Feb 07 jari 1147         }
2 26 Feb 07 jari 1148         
2 26 Feb 07 jari 1149         return cellSums;
2 26 Feb 07 jari 1150     }
2 26 Feb 07 jari 1151     
2 26 Feb 07 jari 1152     private double[][] getCellMeans(Vector[][] currGeneFactorVals) {
2 26 Feb 07 jari 1153         double[][] cellMeans = new double[currGeneFactorVals.length][currGeneFactorVals[0].length];
2 26 Feb 07 jari 1154         
2 26 Feb 07 jari 1155         //int cellSumsCounter = 0;
2 26 Feb 07 jari 1156         for (int i = 0; i < currGeneFactorVals.length; i++) {
2 26 Feb 07 jari 1157             for (int j = 0; j < currGeneFactorVals[i].length; j++) {
2 26 Feb 07 jari 1158                 cellMeans[i][j] = getSum(currGeneFactorVals[i][j]);
2 26 Feb 07 jari 1159                 //cellSumsCounter++;
2 26 Feb 07 jari 1160             }
2 26 Feb 07 jari 1161         }
2 26 Feb 07 jari 1162         
2 26 Feb 07 jari 1163         for (int i = 0; i < currGeneFactorVals.length; i++) {
2 26 Feb 07 jari 1164             for (int j = 0; j < currGeneFactorVals[i].length; j++) {
2 26 Feb 07 jari 1165                 cellMeans[i][j] = cellMeans[i][j]/(double)(currGeneFactorVals[i][j].size());
2 26 Feb 07 jari 1166             }
2 26 Feb 07 jari 1167         }
2 26 Feb 07 jari 1168         
2 26 Feb 07 jari 1169         return cellMeans;
2 26 Feb 07 jari 1170     }    
2 26 Feb 07 jari 1171     
2 26 Feb 07 jari 1172     private double getSum(Vector vect) {
2 26 Feb 07 jari 1173         double sum = 0d;        
2 26 Feb 07 jari 1174         for (int i = 0; i < vect.size(); i++) {
2 26 Feb 07 jari 1175             sum = sum + ((Float)(vect.get(i))).doubleValue();
2 26 Feb 07 jari 1176         }
2 26 Feb 07 jari 1177         
2 26 Feb 07 jari 1178         return sum;
2 26 Feb 07 jari 1179     }
2 26 Feb 07 jari 1180     
2 26 Feb 07 jari 1181     private double getSumSquares(Vector vect) {
2 26 Feb 07 jari 1182         double sumSquares = 0d;
2 26 Feb 07 jari 1183         for (int i = 0; i < vect.size(); i++) {
2 26 Feb 07 jari 1184             sumSquares = sumSquares + (((Float)(vect.get(i))).doubleValue())*(((Float)(vect.get(i))).doubleValue());            
2 26 Feb 07 jari 1185         }  
2 26 Feb 07 jari 1186         
2 26 Feb 07 jari 1187         return sumSquares;
2 26 Feb 07 jari 1188     }
2 26 Feb 07 jari 1189     
2 26 Feb 07 jari 1190     private double getSumSquaredDiffs(Vector vect) {
2 26 Feb 07 jari 1191         return ( getSumSquares(vect) - ((getSum(vect)*getSum(vect))/(double)(vect.size())) );
2 26 Feb 07 jari 1192     }
2 26 Feb 07 jari 1193     
2 26 Feb 07 jari 1194     /*
2 26 Feb 07 jari 1195     private Vector[][] getCurrentGeneAssignments(int gene) {
2 26 Feb 07 jari 1196         Vector[][] currGeneAssignments = new Vector[numFactorLevels[0]][numFactorLevels[1]];
2 26 Feb 07 jari 1197         
2 26 Feb 07 jari 1198         for (int i = 0; i < currGeneAssignments.length; i++) {
2 26 Feb 07 jari 1199             for (int j = 0; j < currGeneAssignments[i].length; j++) {
2 26 Feb 07 jari 1200                 currGeneAssignments[i][j] = new Vector();
2 26 Feb 07 jari 1201             }
2 26 Feb 07 jari 1202         }        
2 26 Feb 07 jari 1203         
2 26 Feb 07 jari 1204         for (int i = 0; i < factorAAssignments.length; i++) {
2 26 Feb 07 jari 1205             if ((factorAAssignments[i] != 0)&&(factorBAssignments[i] != 0) && !Float.isNaN(expMatrix.A[gene][i])) {
2 26 Feb 07 jari 1206                 currGeneAssignments[factorAAssignments[i] - 1][factorBAssignments[i] - 1].add(new Integer(i));
2 26 Feb 07 jari 1207             }
2 26 Feb 07 jari 1208         }
2 26 Feb 07 jari 1209         
2 26 Feb 07 jari 1210         return currGeneAssignments;        
2 26 Feb 07 jari 1211     }
2 26 Feb 07 jari 1212      */
2 26 Feb 07 jari 1213     
2 26 Feb 07 jari 1214     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 1215         int[] permutedValues = new int[arrayLength];
2 26 Feb 07 jari 1216         for (int i = 0; i < permutedValues.length; i++) {
2 26 Feb 07 jari 1217             permutedValues[i] = i;
2 26 Feb 07 jari 1218         }
2 26 Feb 07 jari 1219        
2 26 Feb 07 jari 1220         int[] permutedValidArray = new int[validArray.length];
2 26 Feb 07 jari 1221         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1222             permutedValidArray[i] = validArray[i];
2 26 Feb 07 jari 1223         }
2 26 Feb 07 jari 1224         
2 26 Feb 07 jari 1225         for (int i = permutedValidArray.length; i > 1; i--) {
2 26 Feb 07 jari 1226             Random generator2 =new Random();
2 26 Feb 07 jari 1227             //Random generator2 = new Random(randomSeeds[i - 2]);
2 26 Feb 07 jari 1228             int randVal = generator2.nextInt(i - 1);
2 26 Feb 07 jari 1229             int temp = permutedValidArray[randVal];
2 26 Feb 07 jari 1230             permutedValidArray[randVal] = permutedValidArray[i - 1];
2 26 Feb 07 jari 1231             permutedValidArray[i - 1] = temp;
2 26 Feb 07 jari 1232         }  
2 26 Feb 07 jari 1233         
2 26 Feb 07 jari 1234         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1235             //permutedValues[validArray[i]] = permutedValues[permutedValidArray[i]];
2 26 Feb 07 jari 1236             permutedValues[validArray[i]] = permutedValidArray[i];
2 26 Feb 07 jari 1237         }
2 26 Feb 07 jari 1238         
2 26 Feb 07 jari 1239         try {
2 26 Feb 07 jari 1240             Thread.sleep(10);
2 26 Feb 07 jari 1241         } catch (Exception exc) {
2 26 Feb 07 jari 1242             exc.printStackTrace();
2 26 Feb 07 jari 1243         }
2 26 Feb 07 jari 1244         
2 26 Feb 07 jari 1245         
2 26 Feb 07 jari 1246         return permutedValues;
2 26 Feb 07 jari 1247         
2 26 Feb 07 jari 1248     }    
2 26 Feb 07 jari 1249     
2 26 Feb 07 jari 1250     private FloatMatrix getPermutedMatrix(FloatMatrix inputMatrix, int[] permExpts) {
2 26 Feb 07 jari 1251         FloatMatrix permutedMatrix = new FloatMatrix(inputMatrix.getRowDimension(), inputMatrix.getColumnDimension());
2 26 Feb 07 jari 1252         for (int i = 0; i < inputMatrix.getRowDimension(); i++) {
2 26 Feb 07 jari 1253             for (int j = 0; j < inputMatrix.getColumnDimension(); j++) {
2 26 Feb 07 jari 1254                 permutedMatrix.A[i][j] = inputMatrix.A[i][permExpts[j]];
2 26 Feb 07 jari 1255             }
2 26 Feb 07 jari 1256         }
2 26 Feb 07 jari 1257         return permutedMatrix;
2 26 Feb 07 jari 1258     }    
2 26 Feb 07 jari 1259     
2 26 Feb 07 jari 1260     private Vector[][] getCurrentGenePermutedFactorValues(int gene) {
2 26 Feb 07 jari 1261         Vector[][] permutedCurrGeneFactorValues = new Vector[numFactorLevels[0]][numFactorLevels[1]];
2 26 Feb 07 jari 1262         Vector validIndices = new Vector();
2 26 Feb 07 jari 1263         for (int i = 0; i < numExps; i++) {
2 26 Feb 07 jari 1264             if ((factorAAssignments[i] !=0)&&(factorBAssignments[i] != 0) && !Float.isNaN(expMatrix.A[gene][i])) {
2 26 Feb 07 jari 1265                 validIndices.add(new Integer(i));
2 26 Feb 07 jari 1266             }
2 26 Feb 07 jari 1267         }
2 26 Feb 07 jari 1268         int[] validArray = new int[validIndices.size()];
2 26 Feb 07 jari 1269         for (int i = 0; i < validArray.length; i++) {
2 26 Feb 07 jari 1270             validArray[i] = ((Integer)(validIndices.get(i))).intValue();
2 26 Feb 07 jari 1271         }
2 26 Feb 07 jari 1272         
2 26 Feb 07 jari 1273         int[] permutedFactorAIndices = getPermutedValues(numExps, validArray);
2 26 Feb 07 jari 1274         int[] permutedFactorBIndices = getPermutedValues(numExps, validArray);
2 26 Feb 07 jari 1275         
2 26 Feb 07 jari 1276         int[] permutedFactorAAssignments = new int[permutedFactorAIndices.length];
2 26 Feb 07 jari 1277         int[] permutedFactorBAssignments = new int[permutedFactorBIndices.length];
2 26 Feb 07 jari 1278         
2 26 Feb 07 jari 1279         for (int i = 0; i < permutedFactorAIndices.length; i++) {
2 26 Feb 07 jari 1280             permutedFactorAAssignments[i] = factorAAssignments[permutedFactorAIndices[i]];
2 26 Feb 07 jari 1281             permutedFactorBAssignments[i] = factorBAssignments[permutedFactorBIndices[i]];
2 26 Feb 07 jari 1282         }
2 26 Feb 07 jari 1283         
2 26 Feb 07 jari 1284         for (int i = 0; i < permutedCurrGeneFactorValues.length; i++) {
2 26 Feb 07 jari 1285             for (int j = 0; j < permutedCurrGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 1286                 permutedCurrGeneFactorValues[i][j] = new Vector();
2 26 Feb 07 jari 1287             }
2 26 Feb 07 jari 1288         }   
2 26 Feb 07 jari 1289         
2 26 Feb 07 jari 1290         for (int i = 0; i < permutedFactorAAssignments.length; i++) {
2 26 Feb 07 jari 1291             if ((permutedFactorAAssignments[i] != 0)&&(permutedFactorBAssignments[i] != 0) && !Float.isNaN(expMatrix.A[gene][i])) {
2 26 Feb 07 jari 1292                 permutedCurrGeneFactorValues[permutedFactorAAssignments[i] - 1][permutedFactorBAssignments[i] - 1].add(new Float(expMatrix.A[gene][i]));
2 26 Feb 07 jari 1293             }
2 26 Feb 07 jari 1294         } 
2 26 Feb 07 jari 1295         
2 26 Feb 07 jari 1296         return permutedCurrGeneFactorValues;
2 26 Feb 07 jari 1297     }
2 26 Feb 07 jari 1298     
2 26 Feb 07 jari 1299     private Vector[][] getCurrentGeneFactorValues(int gene) {
2 26 Feb 07 jari 1300         Vector[][] currGeneFactorValues = new Vector[numFactorLevels[0]][numFactorLevels[1]]; 
2 26 Feb 07 jari 1301         
2 26 Feb 07 jari 1302         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 1303             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 1304                 currGeneFactorValues[i][j] = new Vector();
2 26 Feb 07 jari 1305             }
2 26 Feb 07 jari 1306         }  
2 26 Feb 07 jari 1307         
2 26 Feb 07 jari 1308         for (int i = 0; i < factorAAssignments.length; i++) {
2 26 Feb 07 jari 1309             if ((factorAAssignments[i] != 0)&&(factorBAssignments[i] != 0) && !Float.isNaN(expMatrix.A[gene][i])) {
2 26 Feb 07 jari 1310                 currGeneFactorValues[factorAAssignments[i] - 1][factorBAssignments[i] - 1].add(new Float(expMatrix.A[gene][i]));
2 26 Feb 07 jari 1311             }
2 26 Feb 07 jari 1312         }  
2 26 Feb 07 jari 1313         
2 26 Feb 07 jari 1314         return currGeneFactorValues;
2 26 Feb 07 jari 1315     }
2 26 Feb 07 jari 1316     
2 26 Feb 07 jari 1317     private Vector[][] getCurrentGeneFactorValuesFromPermMatrix(FloatMatrix permMatrix, int gene) {
2 26 Feb 07 jari 1318         Vector[][] currGeneFactorValues = new Vector[numFactorLevels[0]][numFactorLevels[1]]; 
2 26 Feb 07 jari 1319         
2 26 Feb 07 jari 1320         for (int i = 0; i < currGeneFactorValues.length; i++) {
2 26 Feb 07 jari 1321             for (int j = 0; j < currGeneFactorValues[i].length; j++) {
2 26 Feb 07 jari 1322                 currGeneFactorValues[i][j] = new Vector();
2 26 Feb 07 jari 1323             }
2 26 Feb 07 jari 1324         }  
2 26 Feb 07 jari 1325         
2 26 Feb 07 jari 1326         for (int i = 0; i < factorAAssignments.length; i++) {
2 26 Feb 07 jari 1327             if ((factorAAssignments[i] != 0)&&(factorBAssignments[i] != 0) && !Float.isNaN(permMatrix.A[gene][i])) {
2 26 Feb 07 jari 1328                 currGeneFactorValues[factorAAssignments[i] - 1][factorBAssignments[i] - 1].add(new Float(permMatrix.A[gene][i]));
2 26 Feb 07 jari 1329             }
2 26 Feb 07 jari 1330         }  
2 26 Feb 07 jari 1331         
2 26 Feb 07 jari 1332         return currGeneFactorValues;        
2 26 Feb 07 jari 1333     }
2 26 Feb 07 jari 1334     
2 26 Feb 07 jari 1335     private int getCurrGeneFactorCondition(Vector[][] currGeneFactorAssignments) {
2 26 Feb 07 jari 1336         int[] cellSizes =new int[currGeneFactorAssignments.length*currGeneFactorAssignments[0].length];
2 26 Feb 07 jari 1337         int cellCounter = 0;
2 26 Feb 07 jari 1338         for (int i = 0; i < currGeneFactorAssignments.length; i++) {
2 26 Feb 07 jari 1339             for (int j = 0; j < currGeneFactorAssignments[i].length; j++) {
2 26 Feb 07 jari 1340                 cellSizes[cellCounter] = currGeneFactorAssignments[i][j].size();
2 26 Feb 07 jari 1341                 cellCounter++;
2 26 Feb 07 jari 1342             }
2 26 Feb 07 jari 1343         }
2 26 Feb 07 jari 1344         
2 26 Feb 07 jari 1345         for (int i = 0; i < cellSizes.length; i++) {
2 26 Feb 07 jari 1346             if (cellSizes[i] == 0) {
2 26 Feb 07 jari 1347                 return HAS_EMPTY_CELL;
2 26 Feb 07 jari 1348             }
2 26 Feb 07 jari 1349         }
2 26 Feb 07 jari 1350         
2 26 Feb 07 jari 1351         if (cellSizes[0] == 1) {
2 26 Feb 07 jari 1352             boolean allOne = true;
2 26 Feb 07 jari 1353             for (int i = 1; i < cellSizes.length; i++) {
2 26 Feb 07 jari 1354                 if (cellSizes[i] != 1) {
2 26 Feb 07 jari 1355                     allOne = false;
2 26 Feb 07 jari 1356                     break;
2 26 Feb 07 jari 1357                 }
2 26 Feb 07 jari 1358             }
2 26 Feb 07 jari 1359             
2 26 Feb 07 jari 1360             if (allOne) {
2 26 Feb 07 jari 1361                 return ALL_CELLS_HAVE_ONE_SAMPLE;
2 26 Feb 07 jari 1362             } 
2 26 Feb 07 jari 1363         }
2 26 Feb 07 jari 1364         
2 26 Feb 07 jari 1365         for (int i = 0; i < cellSizes.length; i++) {
2 26 Feb 07 jari 1366             if (cellSizes[i] == 1) return SOME_CELLS_HAVE_ONE_SAMPLE;
2 26 Feb 07 jari 1367         }
2 26 Feb 07 jari 1368         
2 26 Feb 07 jari 1369         int firstCellCount = cellSizes[0];
2 26 Feb 07 jari 1370         boolean balanced = true;
2 26 Feb 07 jari 1371         for (int i = 1; i < cellSizes.length; i++) {
2 26 Feb 07 jari 1372             if (cellSizes[i] != firstCellCount) {
2 26 Feb 07 jari 1373                 balanced = false;
2 26 Feb 07 jari 1374                 break;
2 26 Feb 07 jari 1375             }
2 26 Feb 07 jari 1376         }
2 26 Feb 07 jari 1377         
2 26 Feb 07 jari 1378         if (balanced) {
2 26 Feb 07 jari 1379             return BALANCED_WITH_REPLICATION;
2 26 Feb 07 jari 1380         } else {
2 26 Feb 07 jari 1381             return UNBALANCED_WITH_REPLICATION;
2 26 Feb 07 jari 1382         }        
2 26 Feb 07 jari 1383         //return -1;
2 26 Feb 07 jari 1384     }
2 26 Feb 07 jari 1385     
2 26 Feb 07 jari 1386 }