mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/KMCSupport.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: KMCSupport.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.6 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 15:45:21 $
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 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15 import java.util.HashSet;
2 26 Feb 07 jari 16 import java.util.Vector;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 19 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 27 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 30 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 31    
2 26 Feb 07 jari 32 /**
2 26 Feb 07 jari 33  *
2 26 Feb 07 jari 34  * @author  nbhagaba
2 26 Feb 07 jari 35  * @version
2 26 Feb 07 jari 36  */
2 26 Feb 07 jari 37 public class KMCSupport extends AbstractAlgorithm {
2 26 Feb 07 jari 38     
2 26 Feb 07 jari 39     private boolean stop = false;
2 26 Feb 07 jari 40     
2 26 Feb 07 jari 41     private int function;
2 26 Feb 07 jari 42     private float factor;
2 26 Feb 07 jari 43     private boolean absolute;
2 26 Feb 07 jari 44     
2 26 Feb 07 jari 45     private Vector clusterVector = new Vector();
2 26 Feb 07 jari 46     boolean[] assigned;// = new boolean[numGenes];
2 26 Feb 07 jari 47     private Vector[] clusters;
2 26 Feb 07 jari 48     private boolean kmcGenes;
2 26 Feb 07 jari 49     private int numGenes, numSamples, numReps;
2 26 Feb 07 jari 50     private int k; // # of clusters
2 26 Feb 07 jari 51     private float thresholdPercent;
2 26 Feb 07 jari 52     private short[][] geneMatrix;
2 26 Feb 07 jari 53     private int userK;
2 26 Feb 07 jari 54     
2 26 Feb 07 jari 55     private FloatMatrix expMatrix;
2 26 Feb 07 jari 56     private int iterations;
2 26 Feb 07 jari 57     private boolean converged;
2 26 Feb 07 jari 58     private boolean unassignedExists;
2 26 Feb 07 jari 59     private boolean calculateMeans;
2 26 Feb 07 jari 60     HashSet unassignedGeneSet = new HashSet();
2 26 Feb 07 jari 61
2 26 Feb 07 jari 62     private int hcl_function;
2 26 Feb 07 jari 63     private boolean hcl_absolute;    
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 66         
2 26 Feb 07 jari 67         AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 68         
2 26 Feb 07 jari 69         function = map.getInt("distance-function", EUCLIDEAN);
2 26 Feb 07 jari 70         factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 71         absolute = map.getBoolean("distance-absolute", false);
2 26 Feb 07 jari 72
2 26 Feb 07 jari 73         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 74         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);        
2 26 Feb 07 jari 75         
2 26 Feb 07 jari 76         iterations = map.getInt("number-of-iterations", 50);
2 26 Feb 07 jari 77         kmcGenes = map.getBoolean("kmc-cluster-genes", true);
2 26 Feb 07 jari 78         //int number_of_clusters = map.getInt("number_of_clusters", 5);
2 26 Feb 07 jari 79         
2 26 Feb 07 jari 80         boolean hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 81         int method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 82         boolean calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 83         boolean calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 84         
2 26 Feb 07 jari 85         this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 86         
2 26 Feb 07 jari 87         numGenes = this.expMatrix.getRowDimension();
2 26 Feb 07 jari 88         numSamples = this.expMatrix.getColumnDimension();
2 26 Feb 07 jari 89         numReps = map.getInt("number-of-repetitions", 0);
2 26 Feb 07 jari 90         thresholdPercent = map.getFloat("threshold-percent", 80);
2 26 Feb 07 jari 91         userK = map.getInt("number-of-desired-clusters", 5);
2 26 Feb 07 jari 92         calculateMeans = map.getBoolean("calculate-means", true);
2 26 Feb 07 jari 93         
2 26 Feb 07 jari 94         geneMatrix = new short[numGenes][];
2 26 Feb 07 jari 95         assigned = new boolean[numGenes];
2 26 Feb 07 jari 96         unassignedExists = false;
2 26 Feb 07 jari 97         for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 98             assigned[i] = false;
2 26 Feb 07 jari 99         }
2 26 Feb 07 jari 100         
2 26 Feb 07 jari 101         for(int i = 1; i < numGenes; i++) {
2 26 Feb 07 jari 102             geneMatrix[i] = new short[i];
2 26 Feb 07 jari 103             for(int j = 0; j < geneMatrix[i].length; j++) {
2 26 Feb 07 jari 104                 geneMatrix[i][j] = 0;
2 26 Feb 07 jari 105             }
2 26 Feb 07 jari 106         }
2 26 Feb 07 jari 107         
2 26 Feb 07 jari 108         populateGeneMatrix();
2 26 Feb 07 jari 109         createClusters();
2 26 Feb 07 jari 110         
2 26 Feb 07 jari 111         k = clusterVector.size();
2 26 Feb 07 jari 112         
2 26 Feb 07 jari 113         clusters = new Vector[k];
2 26 Feb 07 jari 114         
2 26 Feb 07 jari 115         for (int i = 0; i < k; i++) {
2 26 Feb 07 jari 116             clusters[i] = (Vector)(clusterVector.get(i));
2 26 Feb 07 jari 117         }
2 26 Feb 07 jari 118         
2 26 Feb 07 jari 119         FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 120         FloatMatrix variances = getVariances(clusters, means);
2 26 Feb 07 jari 121         
2 26 Feb 07 jari 122         AlgorithmEvent event = null;
2 26 Feb 07 jari 123         if (hierarchical_tree) {
2 26 Feb 07 jari 124             event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 125             fireValueChanged(event);
2 26 Feb 07 jari 126             event.setIntValue(0);
2 26 Feb 07 jari 127             event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 128             fireValueChanged(event);
2 26 Feb 07 jari 129         }
2 26 Feb 07 jari 130         
2 26 Feb 07 jari 131         Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 132         NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 133         int[] features;
2 26 Feb 07 jari 134         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 135             if (stop) {
2 26 Feb 07 jari 136                 throw new AbortException();
2 26 Feb 07 jari 137             }
2 26 Feb 07 jari 138             features = convert2int(clusters[i]);
2 26 Feb 07 jari 139             Node node = new Node(features);
2 26 Feb 07 jari 140             nodeList.addNode(node);
2 26 Feb 07 jari 141             if (hierarchical_tree) {
2 26 Feb 07 jari 142                 node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 143                 event.setIntValue(i+1);
2 26 Feb 07 jari 144                 fireValueChanged(event);
2 26 Feb 07 jari 145             }
2 26 Feb 07 jari 146         }
2 26 Feb 07 jari 147         
2 26 Feb 07 jari 148         // prepare the result
2 26 Feb 07 jari 149         AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 150         result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 151         result.addParam("number-of-clusters", String.valueOf(clusters.length));
2 26 Feb 07 jari 152         result.addParam("unassigned-genes-exist", String.valueOf(unassignedExists));
2 26 Feb 07 jari 153         result.addMatrix("clusters_means", means);
2 26 Feb 07 jari 154         result.addMatrix("clusters_variances", variances);
2 26 Feb 07 jari 155         return result;
2 26 Feb 07 jari 156         
2 26 Feb 07 jari 157     }
2 26 Feb 07 jari 158     
2 26 Feb 07 jari 159         private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 160   NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 161   AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 162   FloatMatrix experiment;
2 26 Feb 07 jari 163         if(kmcGenes)
2 26 Feb 07 jari 164             experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 165         else
2 26 Feb 07 jari 166             experiment = getSubExperimentReducedCols(this.expMatrix, features);
2 26 Feb 07 jari 167         
2 26 Feb 07 jari 168   data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 169         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 170         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 171   data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 172   HCL hcl = new HCL();
2 26 Feb 07 jari 173   AlgorithmData result;
2 26 Feb 07 jari 174         
2 26 Feb 07 jari 175   if (genes) {
2 26 Feb 07 jari 176       data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 177       result = hcl.execute(data);
2 26 Feb 07 jari 178       validate(result);
2 26 Feb 07 jari 179       addNodeValues(nodeList, result);
2 26 Feb 07 jari 180   }
2 26 Feb 07 jari 181   if (experiments) {
2 26 Feb 07 jari 182       data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 183       result = hcl.execute(data);
2 26 Feb 07 jari 184       validate(result);
2 26 Feb 07 jari 185       addNodeValues(nodeList, result);
2 26 Feb 07 jari 186   }
2 26 Feb 07 jari 187   return nodeList;
2 26 Feb 07 jari 188     }
2 26 Feb 07 jari 189     /*
2 26 Feb 07 jari 190     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 191         NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 192         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 193         FloatMatrix experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 194         data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 195         data.addParam("distance-function", String.valueOf(this.function));
2 26 Feb 07 jari 196         data.addParam("distance-absolute", String.valueOf(this.absolute));
2 26 Feb 07 jari 197         data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 198         HCL hcl = new HCL();
2 26 Feb 07 jari 199         AlgorithmData result;
2 26 Feb 07 jari 200         if (genes) {
2 26 Feb 07 jari 201             data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 202             result = hcl.execute(data);
2 26 Feb 07 jari 203             validate(result);
2 26 Feb 07 jari 204             addNodeValues(nodeList, result);
2 26 Feb 07 jari 205         }
2 26 Feb 07 jari 206         if (experiments) {
2 26 Feb 07 jari 207             data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 208             result = hcl.execute(data);
2 26 Feb 07 jari 209             validate(result);
2 26 Feb 07 jari 210             addNodeValues(nodeList, result);
2 26 Feb 07 jari 211         }
2 26 Feb 07 jari 212         return nodeList;
2 26 Feb 07 jari 213     }
2 26 Feb 07 jari 214     */
2 26 Feb 07 jari 215     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 216         target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 217         target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 218         target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 219         target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 220     }
2 26 Feb 07 jari 221     
2 26 Feb 07 jari 222     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 223         FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 224         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 225             subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 226         }
2 26 Feb 07 jari 227         return subExperiment;
2 26 Feb 07 jari 228     }
2 26 Feb 07 jari 229     
2 26 Feb 07 jari 230     /**
2 26 Feb 07 jari 231      *  Creates a matrix with reduced columns (samples) as during experiment clustering
2 26 Feb 07 jari 232      */
2 26 Feb 07 jari 233     private FloatMatrix getSubExperimentReducedCols(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 234         FloatMatrix copyMatrix = experiment.copy();
2 26 Feb 07 jari 235         FloatMatrix subExperiment = new FloatMatrix(features.length, copyMatrix.getColumnDimension());
2 26 Feb 07 jari 236         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 237             subExperiment.A[i] = copyMatrix.A[features[i]];
2 26 Feb 07 jari 238         }
2 26 Feb 07 jari 239         subExperiment = subExperiment.transpose();
2 26 Feb 07 jari 240         return subExperiment;
2 26 Feb 07 jari 241     }
2 26 Feb 07 jari 242     
2 26 Feb 07 jari 243     /**
2 26 Feb 07 jari 244      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 245      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 246      */
2 26 Feb 07 jari 247     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 248         if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 249             throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 250         }
2 26 Feb 07 jari 251         if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 252             throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 253         }
2 26 Feb 07 jari 254         if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 255             throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 256         }
2 26 Feb 07 jari 257         if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 258             throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 259         }
2 26 Feb 07 jari 260     }
2 26 Feb 07 jari 261     
2 26 Feb 07 jari 262     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 263         int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 264         for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 265             int_matrix[i] = (int)((Integer)source.get(i)).intValue();
2 26 Feb 07 jari 266         }
2 26 Feb 07 jari 267         return int_matrix;
2 26 Feb 07 jari 268     }
2 26 Feb 07 jari 269     
2 26 Feb 07 jari 270     private FloatMatrix getMeans(Vector[] clusters) {
2 26 Feb 07 jari 271         FloatMatrix means = new FloatMatrix(clusters.length, numSamples);
2 26 Feb 07 jari 272         FloatMatrix mean;
2 26 Feb 07 jari 273         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 274             mean = getMean(clusters[i]);
2 26 Feb 07 jari 275             means.A[i] = mean.A[0];
2 26 Feb 07 jari 276         }
2 26 Feb 07 jari 277         return means;
2 26 Feb 07 jari 278     }
2 26 Feb 07 jari 279     
2 26 Feb 07 jari 280     private FloatMatrix getMean(Vector cluster) {
2 26 Feb 07 jari 281         FloatMatrix mean = new FloatMatrix(1, numSamples);
2 26 Feb 07 jari 282         float currentMean;
2 26 Feb 07 jari 283         int n = cluster.size();
2 26 Feb 07 jari 284         int denom;
2 26 Feb 07 jari 285         float value;
2 26 Feb 07 jari 286         for (int i=0; i<numSamples; i++) {
2 26 Feb 07 jari 287             currentMean = 0f;
2 26 Feb 07 jari 288             denom = 0;
2 26 Feb 07 jari 289             for (int j=0; j<n; j++) {
2 26 Feb 07 jari 290                 value = expMatrix.get(((Integer) cluster.get(j)).intValue(), i);
2 26 Feb 07 jari 291                 if (!Float.isNaN(value)) {
2 26 Feb 07 jari 292                     currentMean += value;
2 26 Feb 07 jari 293                     denom++;
2 26 Feb 07 jari 294                 }
2 26 Feb 07 jari 295             }
2 26 Feb 07 jari 296             mean.set(0, i, currentMean/(float)denom);
2 26 Feb 07 jari 297         }
2 26 Feb 07 jari 298         
2 26 Feb 07 jari 299         return mean;
2 26 Feb 07 jari 300     }
2 26 Feb 07 jari 301     
2 26 Feb 07 jari 302     private FloatMatrix getVariances(Vector[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 303         final int rows = means.getRowDimension();
2 26 Feb 07 jari 304         final int columns = means.getColumnDimension();
2 26 Feb 07 jari 305         FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 306         for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 307             for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 308                 variances.set(row, column, getSampleVariance(clusters[row], column, means.get(row, column)));
2 26 Feb 07 jari 309             }
2 26 Feb 07 jari 310         }
2 26 Feb 07 jari 311         return variances;
2 26 Feb 07 jari 312     }
2 26 Feb 07 jari 313     
2 26 Feb 07 jari 314     int validN;
2 26 Feb 07 jari 315     
2 26 Feb 07 jari 316     private float getSampleNormalizedSum(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 317         final int size = cluster.size();
2 26 Feb 07 jari 318         float sum = 0f;
2 26 Feb 07 jari 319         validN = 0;
2 26 Feb 07 jari 320         float value;
2 26 Feb 07 jari 321         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 322             value = expMatrix.get(((Integer) cluster.get(i)).intValue(), column);
2 26 Feb 07 jari 323             if (!Float.isNaN(value)) {
2 26 Feb 07 jari 324                 sum += Math.pow(value-mean, 2);
2 26 Feb 07 jari 325                 validN++;
2 26 Feb 07 jari 326             }
2 26 Feb 07 jari 327         }
2 26 Feb 07 jari 328         return sum;
2 26 Feb 07 jari 329     }
2 26 Feb 07 jari 330     
2 26 Feb 07 jari 331     private float getSampleVariance(Vector cluster, int column, float mean) {
2 26 Feb 07 jari 332         return(float)Math.sqrt(getSampleNormalizedSum(cluster, column, mean)/(float)(validN-1));
2 26 Feb 07 jari 333         
2 26 Feb 07 jari 334     }
2 26 Feb 07 jari 335     
2 26 Feb 07 jari 336     void populateGeneMatrix() throws AlgorithmException {
2 26 Feb 07 jari 337         
2 26 Feb 07 jari 338         Algorithm sub_algo = new KMC();
2 26 Feb 07 jari 339         
2 26 Feb 07 jari 340         AlgorithmData sub_algo_data = new AlgorithmData();
2 26 Feb 07 jari 341         sub_algo_data.addMatrix("experiment", expMatrix);
2 26 Feb 07 jari 342         sub_algo_data.addParam("distance-factor", String.valueOf(factor));
2 26 Feb 07 jari 343         sub_algo_data.addParam("distance-absolute", String.valueOf(absolute));
2 26 Feb 07 jari 344         sub_algo_data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 345         sub_algo_data.addParam("number-of-iterations", String.valueOf(iterations));
2 26 Feb 07 jari 346         sub_algo_data.addParam("number-of-clusters", String.valueOf(userK));
2 26 Feb 07 jari 347         sub_algo_data.addParam("calculate-means", String.valueOf(calculateMeans));
2 26 Feb 07 jari 348         
2 26 Feb 07 jari 349         AlgorithmEvent event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, numReps);
2 26 Feb 07 jari 350         fireValueChanged(event);
2 26 Feb 07 jari 351         event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 352         
2 26 Feb 07 jari 353         AlgorithmData sub_algo_result;
2 26 Feb 07 jari 354         Cluster sub_algo_clusters;
2 26 Feb 07 jari 355         
2 26 Feb 07 jari 356         for (int i = 0; i < numReps; i++) {
2 26 Feb 07 jari 357             //myKMC = new KMC(ParentFrame, ExpMatrix, ResultFolder, Tree, StatusLabel, AntiAliasingMenuItem); //ARE THE PARAMETERS PASSED CORRECTLY?
2 26 Feb 07 jari 358             //myKMC.k = userK;
2 26 Feb 07 jari 359             //myKMC.Calculate(true);
2 26 Feb 07 jari 360             //Vector myKMCClusters = myKMC.getKMClustersVector();
2 26 Feb 07 jari 361             
2 26 Feb 07 jari 362                         /*
2 26 Feb 07 jari 363                         int cLength = myKMC.clusters.length;
2 26 Feb 07 jari 364                         for (int ii = 0; ii < cLength; ii++) {
2 26 Feb 07 jari 365                                 myKMCClusters.addElement(myKMC.clusters[ii]); //will this work?
2 26 Feb 07 jari 366                         }
2 26 Feb 07 jari 367                          */
2 26 Feb 07 jari 368             
2 26 Feb 07 jari 369             if (stop) {
2 26 Feb 07 jari 370                 throw new AbortException();
2 26 Feb 07 jari 371             }
2 26 Feb 07 jari 372             
2 26 Feb 07 jari 373             event.setIntValue(i);
2 26 Feb 07 jari 374             event.setDescription("Current repetition = " + (i + 1));
2 26 Feb 07 jari 375             fireValueChanged(event);
2 26 Feb 07 jari 376             
2 26 Feb 07 jari 377             sub_algo_result = sub_algo.execute(sub_algo_data);
2 26 Feb 07 jari 378             
2 26 Feb 07 jari 379             sub_algo_clusters = sub_algo_result.getCluster("cluster");
2 26 Feb 07 jari 380             
2 26 Feb 07 jari 381             //Vector myKMCClusters = getClusterVector(sub_algo_clusters);
2 26 Feb 07 jari 382             int[][] myKMCClusters = getClusterArray(sub_algo_clusters);
2 26 Feb 07 jari 383             
2 26 Feb 07 jari 384             //System.out.println("Finished up to getClusterVector(), i = " + i);
2 26 Feb 07 jari 385             
2 26 Feb 07 jari 386             for(int j = 1; j < numGenes; j++) {
2 26 Feb 07 jari 387                 for(int k = 0; k < j; k++) {
2 26 Feb 07 jari 388                     if(occurInSameCluster(j,k, myKMCClusters)) {//write the method "occurInSameCluster(int, int, Vector)"
2 26 Feb 07 jari 389                         geneMatrix[j][k] = (short)(geneMatrix[j][k] + 1);
2 26 Feb 07 jari 390                         //System.out.println("genes " + j + " and " + k + " occur in the same cluster");
2 26 Feb 07 jari 391                     }
2 26 Feb 07 jari 392                 }
2 26 Feb 07 jari 393             }
2 26 Feb 07 jari 394             
2 26 Feb 07 jari 395             //System.out.println("Finished occurInSameCluster(), i = " + i);
2 26 Feb 07 jari 396             
2 26 Feb 07 jari 397         }
2 26 Feb 07 jari 398         
2 26 Feb 07 jari 399 /*        
2 26 Feb 07 jari 400         for(int j = 1; j < numGenes; j++) {
2 26 Feb 07 jari 401             for(int k = 0; k < j; k++) {
2 26 Feb 07 jari 402                 geneMatrix[j][k] = (geneMatrix[j][k]/numReps)*100;
2 26 Feb 07 jari 403             }
2 26 Feb 07 jari 404         }
2 26 Feb 07 jari 405  */
2 26 Feb 07 jari 406         
2 26 Feb 07 jari 407         /*
2 26 Feb 07 jari 408         for (int p = 1; p < geneMatrix.length; p++) {
2 26 Feb 07 jari 409             for (int q = 0; q < geneMatrix[p].length; q++) {
2 26 Feb 07 jari 410                 if (geneMatrix[p][q] > 0.0f) {
2 26 Feb 07 jari 411                     System.out.println("geneMatrix[" + p + "][" + q + "] = " + geneMatrix[p][q]);
2 26 Feb 07 jari 412                 }
2 26 Feb 07 jari 413             }
2 26 Feb 07 jari 414         }
2 26 Feb 07 jari 415          */
2 26 Feb 07 jari 416         
2 26 Feb 07 jari 417         
2 26 Feb 07 jari 418     }
2 26 Feb 07 jari 419     
2 26 Feb 07 jari 420 /*    
2 26 Feb 07 jari 421     private Vector getClusterVector(Cluster clusters) {
2 26 Feb 07 jari 422         NodeList nodeList = clusters.getNodeList();
2 26 Feb 07 jari 423         final int number_of_clusters = nodeList.getSize();
2 26 Feb 07 jari 424         int[] cluster;
2 26 Feb 07 jari 425         
2 26 Feb 07 jari 426         Vector cVector = new Vector();
2 26 Feb 07 jari 427         
2 26 Feb 07 jari 428         for (int j=0; j<number_of_clusters; j++) {
2 26 Feb 07 jari 429             cluster = nodeList.getNode(j).getFeaturesIndexes();
2 26 Feb 07 jari 430             Vector currentCluster = new Vector();
2 26 Feb 07 jari 431             
2 26 Feb 07 jari 432             for (int i = 0; i < cluster.length; i++) {
2 26 Feb 07 jari 433                 currentCluster.add(new Integer(cluster[i]));
2 26 Feb 07 jari 434             }
2 26 Feb 07 jari 435             
2 26 Feb 07 jari 436             cVector.add(currentCluster);
2 26 Feb 07 jari 437         }
2 26 Feb 07 jari 438         
2 26 Feb 07 jari 439         return cVector;
2 26 Feb 07 jari 440     }
2 26 Feb 07 jari 441  */
2 26 Feb 07 jari 442     
2 26 Feb 07 jari 443     private int[][] getClusterArray(Cluster  clusters) {
2 26 Feb 07 jari 444         NodeList nodeList = clusters.getNodeList();
2 26 Feb 07 jari 445         final int number_of_clusters = nodeList.getSize();
2 26 Feb 07 jari 446         int[] cluster;
2 26 Feb 07 jari 447         
2 26 Feb 07 jari 448         int[][] cArray = new int[number_of_clusters][];
2 26 Feb 07 jari 449         
2 26 Feb 07 jari 450         for (int j = 0; j < number_of_clusters; j++) {
2 26 Feb 07 jari 451             cluster = nodeList.getNode(j).getFeaturesIndexes();
2 26 Feb 07 jari 452             
2 26 Feb 07 jari 453             cArray[j] = new int[cluster.length];
2 26 Feb 07 jari 454             for (int i = 0; i < cluster.length; i++) {
2 26 Feb 07 jari 455                 cArray[j][i] = cluster[i];
2 26 Feb 07 jari 456                 //currentCluster.add(new Integer(cluster[i]));
2 26 Feb 07 jari 457             }            
2 26 Feb 07 jari 458         }
2 26 Feb 07 jari 459         
2 26 Feb 07 jari 460         return cArray;
2 26 Feb 07 jari 461     }
2 26 Feb 07 jari 462     
2 26 Feb 07 jari 463 /*    
2 26 Feb 07 jari 464     boolean occurInSameCluster(int gene1, int gene2, Vector clustVect) {
2 26 Feb 07 jari 465         boolean occurs = false;
2 26 Feb 07 jari 466         
2 26 Feb 07 jari 467         for (int i = 0; i < clustVect.size(); i++) {
2 26 Feb 07 jari 468             Vector currCluster = (Vector)clustVect.get(i);
2 26 Feb 07 jari 469             if( (isFound(gene1, currCluster)) && (isFound(gene2, currCluster)) ) {
2 26 Feb 07 jari 470                 occurs = true;
2 26 Feb 07 jari 471                 break;
2 26 Feb 07 jari 472             }
2 26 Feb 07 jari 473         }
2 26 Feb 07 jari 474         
2 26 Feb 07 jari 475         return occurs;
2 26 Feb 07 jari 476     }
2 26 Feb 07 jari 477  */
2 26 Feb 07 jari 478     
2 26 Feb 07 jari 479     boolean occurInSameCluster(int gene1, int gene2, int[][] clustArr) {
2 26 Feb 07 jari 480         boolean occurs = false;
2 26 Feb 07 jari 481         
2 26 Feb 07 jari 482         for (int i = 0; i < clustArr.length; i++) {
2 26 Feb 07 jari 483             int[] currCluster = clustArr[i];
2 26 Feb 07 jari 484             if( (isFound(gene1, currCluster)) && (isFound(gene2, currCluster)) ) {
2 26 Feb 07 jari 485                 //occurs = true;
2 26 Feb 07 jari 486                 //break;
2 26 Feb 07 jari 487                 return true;
2 26 Feb 07 jari 488             }
2 26 Feb 07 jari 489         }
2 26 Feb 07 jari 490         
2 26 Feb 07 jari 491         return occurs;
2 26 Feb 07 jari 492     }    
2 26 Feb 07 jari 493     
2 26 Feb 07 jari 494     
2 26 Feb 07 jari 495     void createClusters() throws AlgorithmException {
2 26 Feb 07 jari 496         
2 26 Feb 07 jari 497         
2 26 Feb 07 jari 498         int currentGene, comparisonGene;
2 26 Feb 07 jari 499         //boolean[] assigned = new boolean[numGenes];
2 26 Feb 07 jari 500                 /*
2 26 Feb 07 jari 501                 for (int i = 0; i < numGenes; i++) {
2 26 Feb 07 jari 502                         assigned[i] = false;
2 26 Feb 07 jari 503                 }
2 26 Feb 07 jari 504                  */
2 26 Feb 07 jari 505         for (currentGene = 1; currentGene < numGenes; currentGene++) {
2 26 Feb 07 jari 506             
2 26 Feb 07 jari 507             for (comparisonGene = 0; comparisonGene < currentGene; comparisonGene++) {
2 26 Feb 07 jari 508                 if ( (float)(((float)(geneMatrix[currentGene][comparisonGene])/numReps)*100) >= thresholdPercent) {
2 26 Feb 07 jari 509                     if (assigned[comparisonGene]) {
2 26 Feb 07 jari 510                         addToCluster(currentGene, comparisonGene);
2 26 Feb 07 jari 511                         assigned[currentGene] = true;
2 26 Feb 07 jari 512                         break;
2 26 Feb 07 jari 513                     } else {
2 26 Feb 07 jari 514                         Vector currentCluster = new Vector();
2 26 Feb 07 jari 515                         currentCluster.add(new Integer(currentGene));
2 26 Feb 07 jari 516                         currentCluster.add(new Integer(comparisonGene));
2 26 Feb 07 jari 517                         clusterVector.add(currentCluster);
2 26 Feb 07 jari 518                         assigned[currentGene] = true;
2 26 Feb 07 jari 519                         assigned[comparisonGene] = true;
2 26 Feb 07 jari 520                         break;
2 26 Feb 07 jari 521                     }
2 26 Feb 07 jari 522                 }
2 26 Feb 07 jari 523             }
2 26 Feb 07 jari 524         }
2 26 Feb 07 jari 525         
2 26 Feb 07 jari 526         
2 26 Feb 07 jari 527         //Vector unassignedGeneCluster = new Vector();
2 26 Feb 07 jari 528         for(int i = 0; i < assigned.length; i++) {
2 26 Feb 07 jari 529             if (!assigned[i]) {
2 26 Feb 07 jari 530                 //System.out.println("" + i);
2 26 Feb 07 jari 531                 //unassignedExists = true;
2 26 Feb 07 jari 532                 unassignedGeneSet.add(new Integer(i));
2 26 Feb 07 jari 533             }
2 26 Feb 07 jari 534         }
2 26 Feb 07 jari 535         //System.out.println();
2 26 Feb 07 jari 536         
2 26 Feb 07 jari 537         Vector workingClusterVector = new Vector();
2 26 Feb 07 jari 538         
2 26 Feb 07 jari 539         for (int i = 0; i < clusterVector.size(); i++) {
2 26 Feb 07 jari 540             Vector currentClust = (Vector)(clusterVector.get(i));
2 26 Feb 07 jari 541             Vector weededOutCluster = weedOutLowerThanThreshGenes(currentClust);
2 26 Feb 07 jari 542             if (weededOutCluster.size() > 0) {
2 26 Feb 07 jari 543                 workingClusterVector.add(weededOutCluster);
2 26 Feb 07 jari 544             }
2 26 Feb 07 jari 545         }
2 26 Feb 07 jari 546         
2 26 Feb 07 jari 547         clusterVector = workingClusterVector;
2 26 Feb 07 jari 548         
2 26 Feb 07 jari 549         if (unassignedGeneSet.size() > 0) {
2 26 Feb 07 jari 550             for (int i = 0; i < clusterVector.size(); i++) {
2 26 Feb 07 jari 551                 Vector currentClust = (Vector)(clusterVector.get(i));
2 26 Feb 07 jari 552                 Vector recheckedCluster = recheckWithUnassigned(currentClust);
2 26 Feb 07 jari 553                 clusterVector.set(i, recheckedCluster);
2 26 Feb 07 jari 554             }
2 26 Feb 07 jari 555         }
2 26 Feb 07 jari 556         
2 26 Feb 07 jari 557         
2 26 Feb 07 jari 558         
2 26 Feb 07 jari 559         if (unassignedGeneSet.size() > 0) {
2 26 Feb 07 jari 560             //System.out.println("Unassigned Unique ID Indices: ");
2 26 Feb 07 jari 561             unassignedExists = true;
2 26 Feb 07 jari 562             Vector unassignedVector = new Vector(unassignedGeneSet);
2 26 Feb 07 jari 563                     /*
2 26 Feb 07 jari 564                     for (int i = 0; i < unassignedVector.size(); i++) {
2 26 Feb 07 jari 565                         int unassignedGene = ((Integer)(unassignedVector.get(i))).intValue();
2 26 Feb 07 jari 566                         System.out.println(unassignedGene);
2 26 Feb 07 jari 567                     }*/
2 26 Feb 07 jari 568             clusterVector.add(unassignedVector);
2 26 Feb 07 jari 569         }
2 26 Feb 07 jari 570         
2 26 Feb 07 jari 571         
2 26 Feb 07 jari 572                /*
2 26 Feb 07 jari 573                 if (unassignedExists) {
2 26 Feb 07 jari 574                     clusterVector.add(unassignedGeneCluster);
2 26 Feb 07 jari 575                 }
2 26 Feb 07 jari 576                 */
2 26 Feb 07 jari 577         
2 26 Feb 07 jari 578         
2 26 Feb 07 jari 579                 /*
2 26 Feb 07 jari 580                 for(int i = 0; i < clusterVector.size(); i++) {
2 26 Feb 07 jari 581                         System.out.println("Cluster " + i);
2 26 Feb 07 jari 582                         Vector currClust = (Vector)clusterVector.get(i);
2 26 Feb 07 jari 583                         for (int j = 0; j < currClust.size(); j++) {
2 26 Feb 07 jari 584                                 System.out.println("" + ((Integer)currClust.get(j)).intValue());
2 26 Feb 07 jari 585                         }
2 26 Feb 07 jari 586                         System.out.println();
2 26 Feb 07 jari 587                 }
2 26 Feb 07 jari 588                  */
2 26 Feb 07 jari 589         
2 26 Feb 07 jari 590         for (int k = 0; k < numGenes; k++) {
2 26 Feb 07 jari 591             int found = 0;
2 26 Feb 07 jari 592             for (int l = 0; l < clusterVector.size(); l++) {
2 26 Feb 07 jari 593                 if (isFound(k, (Vector)clusterVector.get(l))) found++;
2 26 Feb 07 jari 594             }
2 26 Feb 07 jari 595             
2 26 Feb 07 jari 596             if (found > 1) System.out.println("Warning: UniqueID[" + k + "] is found in " + found + "clusters");
2 26 Feb 07 jari 597             
2 26 Feb 07 jari 598             errorCheck1(k);
2 26 Feb 07 jari 599             errorCheck2(k);
2 26 Feb 07 jari 600         }
2 26 Feb 07 jari 601         
2 26 Feb 07 jari 602         
2 26 Feb 07 jari 603     }
2 26 Feb 07 jari 604     
2 26 Feb 07 jari 605     
2 26 Feb 07 jari 606     private Vector weedOutLowerThanThreshGenes(Vector geneCluster) {
2 26 Feb 07 jari 607         
2 26 Feb 07 jari 608         HashSet weededOutGenes = new HashSet();
2 26 Feb 07 jari 609         
2 26 Feb 07 jari 610         for (int i = 0; i < (geneCluster.size() - 1); i++) {
2 26 Feb 07 jari 611             int currentGene = ((Integer)(geneCluster.get(i))).intValue();
2 26 Feb 07 jari 612             for (int j = i+1; j < geneCluster.size(); j++) {
2 26 Feb 07 jari 613                 int gene = ((Integer)(geneCluster.get(j))).intValue();
2 26 Feb 07 jari 614                 if (currentGene > gene) {
2 26 Feb 07 jari 615                     if ( (float)(((float)(geneMatrix[currentGene][gene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 616                         unassignedGeneSet.add(new Integer(currentGene));
2 26 Feb 07 jari 617                         unassignedGeneSet.add(new Integer(gene));
2 26 Feb 07 jari 618                         weededOutGenes.add(new Integer(currentGene));
2 26 Feb 07 jari 619                         weededOutGenes.add(new Integer(gene));
2 26 Feb 07 jari 620                     }
2 26 Feb 07 jari 621                 } else if (currentGene < gene) {
2 26 Feb 07 jari 622                     if ( (float)(((float)(geneMatrix[gene][currentGene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 623                         unassignedGeneSet.add(new Integer(currentGene));
2 26 Feb 07 jari 624                         unassignedGeneSet.add(new Integer(gene));
2 26 Feb 07 jari 625                         weededOutGenes.add(new Integer(currentGene));
2 26 Feb 07 jari 626                         weededOutGenes.add(new Integer(gene));
2 26 Feb 07 jari 627                     }
2 26 Feb 07 jari 628                 }
2 26 Feb 07 jari 629             }
2 26 Feb 07 jari 630         }
2 26 Feb 07 jari 631         
2 26 Feb 07 jari 632         geneCluster.removeAll(weededOutGenes);
2 26 Feb 07 jari 633         return geneCluster;
2 26 Feb 07 jari 634         
2 26 Feb 07 jari 635     }
2 26 Feb 07 jari 636     
2 26 Feb 07 jari 637     private Vector recheckWithUnassigned(Vector geneCluster) { // checks the unassigend genes with the current clusters to see if they belong in there
2 26 Feb 07 jari 638         Vector localUnassignedVect = new Vector(unassignedGeneSet);
2 26 Feb 07 jari 639         for (int i = 0; i < localUnassignedVect.size(); i++) {
2 26 Feb 07 jari 640             int unassignedGene = ((Integer)(localUnassignedVect.get(i))).intValue();
2 26 Feb 07 jari 641             if (belongsInCluster(unassignedGene, geneCluster)) {
2 26 Feb 07 jari 642                 geneCluster.add(new Integer(unassignedGene));
2 26 Feb 07 jari 643                 unassignedGeneSet.remove(new Integer(unassignedGene));
2 26 Feb 07 jari 644             }
2 26 Feb 07 jari 645         }
2 26 Feb 07 jari 646         
2 26 Feb 07 jari 647         return geneCluster;
2 26 Feb 07 jari 648     }
2 26 Feb 07 jari 649     
2 26 Feb 07 jari 650     private boolean belongsInCluster(int gene, Vector geneCluster) {
2 26 Feb 07 jari 651         boolean belongs = true;
2 26 Feb 07 jari 652         
2 26 Feb 07 jari 653         for (int i = 0; i < geneCluster.size(); i++) {
2 26 Feb 07 jari 654             int currentGene = ((Integer)(geneCluster.get(i))).intValue();
2 26 Feb 07 jari 655             if (gene == currentGene) {
2 26 Feb 07 jari 656                 belongs = true;
2 26 Feb 07 jari 657                 break;
2 26 Feb 07 jari 658             } else if (gene > currentGene) {
2 26 Feb 07 jari 659                 if ( (float)(((float)(geneMatrix[gene][currentGene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 660                     belongs = false;
2 26 Feb 07 jari 661                     break;
2 26 Feb 07 jari 662                 }
2 26 Feb 07 jari 663             } else if (gene < currentGene) {
2 26 Feb 07 jari 664                 if ( (float)(((float)(geneMatrix[currentGene][gene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 665                     belongs = false;
2 26 Feb 07 jari 666                     break;
2 26 Feb 07 jari 667                 }
2 26 Feb 07 jari 668             }
2 26 Feb 07 jari 669             
2 26 Feb 07 jari 670         }
2 26 Feb 07 jari 671         return belongs;
2 26 Feb 07 jari 672     }
2 26 Feb 07 jari 673         /*
2 26 Feb 07 jari 674         private float[][] createMatrix(Vector geneCluster) {
2 26 Feb 07 jari 675             float[][] currentMatrix = new float[geneCluster.size()][];
2 26 Feb 07 jari 676          
2 26 Feb 07 jari 677         }
2 26 Feb 07 jari 678          */
2 26 Feb 07 jari 679     
2 26 Feb 07 jari 680     
2 26 Feb 07 jari 681     void addToCluster(int geneToBeAdded, int geneInTargetCluster) {
2 26 Feb 07 jari 682         
2 26 Feb 07 jari 683         for(int i = 0; i < clusterVector.size(); i++) {
2 26 Feb 07 jari 684             Vector currentCluster = (Vector)clusterVector.get(i);
2 26 Feb 07 jari 685             if (isFound(geneInTargetCluster, currentCluster)) {
2 26 Feb 07 jari 686                 currentCluster.add(new Integer(geneToBeAdded));
2 26 Feb 07 jari 687                 clusterVector.set(i, currentCluster);
2 26 Feb 07 jari 688                 break;
2 26 Feb 07 jari 689             }
2 26 Feb 07 jari 690         }
2 26 Feb 07 jari 691         
2 26 Feb 07 jari 692     }
2 26 Feb 07 jari 693     
2 26 Feb 07 jari 694     
2 26 Feb 07 jari 695     boolean isFound(int gene, Vector clustVect) {
2 26 Feb 07 jari 696         boolean found = false;
2 26 Feb 07 jari 697         
2 26 Feb 07 jari 698         for (int i = 0; i < clustVect.size(); i++) {
2 26 Feb 07 jari 699             //System.out.println(clustVect.get(i));
2 26 Feb 07 jari 700             if (gene == ((Integer) clustVect.get(i)).intValue()) {
2 26 Feb 07 jari 701                 //found =true;
2 26 Feb 07 jari 702                 //break;
2 26 Feb 07 jari 703                 return true;
2 26 Feb 07 jari 704             }
2 26 Feb 07 jari 705         }
2 26 Feb 07 jari 706         
2 26 Feb 07 jari 707         return found;
2 26 Feb 07 jari 708     }
2 26 Feb 07 jari 709
2 26 Feb 07 jari 710     
2 26 Feb 07 jari 711     boolean isFound(int gene, int[] clustArr) {
2 26 Feb 07 jari 712         boolean found = false;
2 26 Feb 07 jari 713         
2 26 Feb 07 jari 714         for (int i = 0; i < clustArr.length; i++) {
2 26 Feb 07 jari 715             //System.out.println(clustVect.get(i));
2 26 Feb 07 jari 716             if (gene == clustArr[i]) {
2 26 Feb 07 jari 717                 //found =true;
2 26 Feb 07 jari 718                 //break;
2 26 Feb 07 jari 719                 return true;
2 26 Feb 07 jari 720             }
2 26 Feb 07 jari 721         }
2 26 Feb 07 jari 722         
2 26 Feb 07 jari 723         return found;
2 26 Feb 07 jari 724     }    
2 26 Feb 07 jari 725     
2 26 Feb 07 jari 726     public boolean unassignedGenesExist() {
2 26 Feb 07 jari 727         return unassignedExists;
2 26 Feb 07 jari 728     }
2 26 Feb 07 jari 729     
2 26 Feb 07 jari 730     
2 26 Feb 07 jari 731     void errorCheck1(int gene) {//CHECK IF A GENE REMAINS UNASSIGNED EVEN IF IT EQUALS OR EXCEEDS THE THRESHOLD PERCENTAGE FOR AT LEAST ONE ENTRY
2 26 Feb 07 jari 732         boolean error1 = false;
2 26 Feb 07 jari 733         if (gene == 0) {
2 26 Feb 07 jari 734             if(!assigned[gene]) {
2 26 Feb 07 jari 735                 for (int i = 1; i < numGenes; i++) {
2 26 Feb 07 jari 736                     if ( (float)(((float)(geneMatrix[i][0])/numReps)*100) >= thresholdPercent) {
2 26 Feb 07 jari 737                         error1 = true;
2 26 Feb 07 jari 738                         break;
2 26 Feb 07 jari 739                     }
2 26 Feb 07 jari 740                 }
2 26 Feb 07 jari 741             }
2 26 Feb 07 jari 742         } else {
2 26 Feb 07 jari 743             
2 26 Feb 07 jari 744             if (!assigned[gene]) {
2 26 Feb 07 jari 745                 for (int i = 0; i < gene; i++) {
2 26 Feb 07 jari 746                     if ( (float)(((float)(geneMatrix[gene][i])/numReps)*100) >= thresholdPercent){
2 26 Feb 07 jari 747                         error1 = true;
2 26 Feb 07 jari 748                         break;
2 26 Feb 07 jari 749                     }
2 26 Feb 07 jari 750                 }
2 26 Feb 07 jari 751             }
2 26 Feb 07 jari 752         }
2 26 Feb 07 jari 753         
2 26 Feb 07 jari 754         if (error1) {
2 26 Feb 07 jari 755             System.out.println("Warning: UniqueID[" + gene + "] not assigned even though it equals or exceeds the threshold % for at least one entry");
2 26 Feb 07 jari 756         }
2 26 Feb 07 jari 757     }
2 26 Feb 07 jari 758     
2 26 Feb 07 jari 759     
2 26 Feb 07 jari 760     void errorCheck2(int gene) {//CHECK IF GENE GETS ASSIGNED TO WRONG CLUSTER, I.E., GETS ASSIGNED TO A CLUSTER WITH WHICH ITS "AFFINITY" IS LESS THAN THE THRESHOLD PERCENTAGE
2 26 Feb 07 jari 761         boolean error2 = false;
2 26 Feb 07 jari 762         Vector foundInClusters = new Vector();
2 26 Feb 07 jari 763         
2 26 Feb 07 jari 764         for (int j = 0; j < clusterVector.size(); j++) {
2 26 Feb 07 jari 765             if (isFound(gene, (Vector)clusterVector.get(j))) {
2 26 Feb 07 jari 766                 foundInClusters.add(new Integer(j));
2 26 Feb 07 jari 767             }
2 26 Feb 07 jari 768         }
2 26 Feb 07 jari 769         
2 26 Feb 07 jari 770         out:
2 26 Feb 07 jari 771             for (int i = 0; i < foundInClusters.size(); i++) {
2 26 Feb 07 jari 772                 int clusterNumber = ((Integer)foundInClusters.get(i)).intValue();
2 26 Feb 07 jari 773                 Vector currClust = (Vector)clusterVector.get(clusterNumber);
2 26 Feb 07 jari 774                 for (int l = 0; l< currClust.size(); l++) {
2 26 Feb 07 jari 775                     int currGene = ((Integer)currClust.get(l)).intValue();
2 26 Feb 07 jari 776                     if (currGene == gene) {
2 26 Feb 07 jari 777                         continue;
2 26 Feb 07 jari 778                     } else if (currGene > gene) {
2 26 Feb 07 jari 779                         if ( (float)(((float)(geneMatrix[currGene][gene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 780                             error2 = true;
2 26 Feb 07 jari 781                             if ((unassignedExists)&&(clusterNumber == (clusterVector.size() - 1))) {
2 26 Feb 07 jari 782                             } else {
2 26 Feb 07 jari 783                                 System.out.println("Warning: UniqueID[" + gene + "] got assigned to cluster" + clusterNumber +" where its 'affinity' to at least one gene is less than the threshold %");
2 26 Feb 07 jari 784                                 System.out.println("geneMatrix[" + currGene + "][" + gene + "] = " + geneMatrix[currGene][gene]);
2 26 Feb 07 jari 785                             }
2 26 Feb 07 jari 786                             break out;
2 26 Feb 07 jari 787                         }
2 26 Feb 07 jari 788                     } else {
2 26 Feb 07 jari 789                         if ( (float)(((float)(geneMatrix[gene][currGene])/numReps)*100) < thresholdPercent) {
2 26 Feb 07 jari 790                             error2 = true;
2 26 Feb 07 jari 791                             if ((unassignedExists)&&(clusterNumber == (clusterVector.size() - 1))) {
2 26 Feb 07 jari 792                             } else {
2 26 Feb 07 jari 793                                 System.out.println("Warning: UniqueID[" + gene + "] got assigned to cluster" + clusterNumber +" where its 'affinity' to at least one gene is less than the threshold %");
2 26 Feb 07 jari 794                                 System.out.println("geneMatrix[" + gene + "][" + currGene + "] = " + geneMatrix[gene][currGene]);
2 26 Feb 07 jari 795                             }
2 26 Feb 07 jari 796                             break out;
2 26 Feb 07 jari 797                             
2 26 Feb 07 jari 798                         }
2 26 Feb 07 jari 799                     }
2 26 Feb 07 jari 800                 }
2 26 Feb 07 jari 801             }
2 26 Feb 07 jari 802             
2 26 Feb 07 jari 803                 /*
2 26 Feb 07 jari 804                 if (error2) {
2 26 Feb 07 jari 805                         System.out.println("Warning: UniqueID[" + gene + "] got assigned to a cluster where its 'affinity' to at least one gene is less than the threshold %");
2 26 Feb 07 jari 806                 }
2 26 Feb 07 jari 807                  */
2 26 Feb 07 jari 808             
2 26 Feb 07 jari 809     }
2 26 Feb 07 jari 810     
2 26 Feb 07 jari 811     
2 26 Feb 07 jari 812     public Vector itf(Vector integerVector) {
2 26 Feb 07 jari 813         Vector floatVector = new Vector();
2 26 Feb 07 jari 814         
2 26 Feb 07 jari 815         for (int i = 0; i < integerVector.size(); i++) {
2 26 Feb 07 jari 816             floatVector.addElement(new Float(((Integer) integerVector.elementAt(i)).intValue()));
2 26 Feb 07 jari 817         }
2 26 Feb 07 jari 818         
2 26 Feb 07 jari 819         return floatVector;
2 26 Feb 07 jari 820     }
2 26 Feb 07 jari 821     
2 26 Feb 07 jari 822     public void abort() {
2 26 Feb 07 jari 823         stop = true;
2 26 Feb 07 jari 824     }
2 26 Feb 07 jari 825 }