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

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2
2 26 Feb 07 jari 3 Copyright @ 1999-2003, The Institute for Genomic Research (TIGR).
2 26 Feb 07 jari 4
2 26 Feb 07 jari 5 All rights reserved.
2 26 Feb 07 jari 6
2 26 Feb 07 jari 7 */
2 26 Feb 07 jari 8
2 26 Feb 07 jari 9 /*
2 26 Feb 07 jari 10
2 26 Feb 07 jari 11  * $RCSfile: QTC.java,v $
2 26 Feb 07 jari 12
2 26 Feb 07 jari 13  * $Revision: 1.4 $
2 26 Feb 07 jari 14
2 26 Feb 07 jari 15  * $Date: 2005/03/10 15:45:20 $
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17  * $Author: braistedj $
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19  * $State: Exp $
2 26 Feb 07 jari 20
2 26 Feb 07 jari 21  */
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 24
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26
2 26 Feb 07 jari 27 import java.awt.BorderLayout;
2 26 Feb 07 jari 28 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 29 import java.awt.event.ActionListener;
2 26 Feb 07 jari 30 import java.util.Vector;
2 26 Feb 07 jari 31
2 26 Feb 07 jari 32 import javax.swing.JButton;
2 26 Feb 07 jari 33 import javax.swing.JFrame;
2 26 Feb 07 jari 34 import javax.swing.JPanel;
2 26 Feb 07 jari 35
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 48 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 49 import org.tigr.util.awt.ProgressDialog;
2 26 Feb 07 jari 50
2 26 Feb 07 jari 51 public class QTC extends AbstractAlgorithm {
2 26 Feb 07 jari 52
2 26 Feb 07 jari 53     private boolean stop = false;
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55   private int function;
2 26 Feb 07 jari 56
2 26 Feb 07 jari 57   private float factor;
2 26 Feb 07 jari 58
2 26 Feb 07 jari 59   ProgressDialog progress;
2 26 Feb 07 jari 60
2 26 Feb 07 jari 61   private int number_of_genes;
2 26 Feb 07 jari 62
2 26 Feb 07 jari 63   private int number_of_samples;
2 26 Feb 07 jari 64
2 26 Feb 07 jari 65   boolean useAbsolute;
2 26 Feb 07 jari 66
2 26 Feb 07 jari 67     float diameter;
2 26 Feb 07 jari 68
2 26 Feb 07 jari 69     int minimumClusterSize;
2 26 Feb 07 jari 70
2 26 Feb 07 jari 71     Vector allClusters = new Vector();
2 26 Feb 07 jari 72
2 26 Feb 07 jari 73     private double xMax, xMin;
2 26 Feb 07 jari 74
2 26 Feb 07 jari 75     private int clusterSize = Integer.MAX_VALUE;
2 26 Feb 07 jari 76
2 26 Feb 07 jari 77
2 26 Feb 07 jari 78     private boolean qtcGenes;
2 26 Feb 07 jari 79     
2 26 Feb 07 jari 80
2 26 Feb 07 jari 81     private FloatMatrix expMatrix;
2 26 Feb 07 jari 82
2 26 Feb 07 jari 83     private JackknifedMatrixBySpecifiedExp[] jacked;
2 26 Feb 07 jari 84
2 26 Feb 07 jari 85     private float[][] proximity;
2 26 Feb 07 jari 86
2 26 Feb 07 jari 87     private float adjustedDiameter;
2 26 Feb 07 jari 88     
2 26 Feb 07 jari 89     private int hcl_function;
2 26 Feb 07 jari 90     private boolean hcl_absolute;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92
2 26 Feb 07 jari 93     public synchronized AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 94
2 26 Feb 07 jari 95   AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 96
2 26 Feb 07 jari 97   function = map.getInt("distance-function", PEARSON);
2 26 Feb 07 jari 98
2 26 Feb 07 jari 99   factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 100
2 26 Feb 07 jari 101   qtcGenes = map.getBoolean("qtc-cluster-genes");
2 26 Feb 07 jari 102
2 26 Feb 07 jari 103   useAbsolute = map.getBoolean("use-absolute", false);
2 26 Feb 07 jari 104
2 26 Feb 07 jari 105   diameter = map.getFloat("diameter", 0.2f);
2 26 Feb 07 jari 106
2 26 Feb 07 jari 107   minimumClusterSize = map.getInt("min-cluster-size", 1);
2 26 Feb 07 jari 108         
2 26 Feb 07 jari 109         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 110         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);          
2 26 Feb 07 jari 111
2 26 Feb 07 jari 112   boolean hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 113
2 26 Feb 07 jari 114   int method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 115
2 26 Feb 07 jari 116   boolean calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 117
2 26 Feb 07 jari 118   boolean calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 119
2 26 Feb 07 jari 120   this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 121
2 26 Feb 07 jari 122   this.number_of_genes   = this.expMatrix.getRowDimension();
2 26 Feb 07 jari 123
2 26 Feb 07 jari 124   this.number_of_samples = this.expMatrix.getColumnDimension();
2 26 Feb 07 jari 125
2 26 Feb 07 jari 126   
2 26 Feb 07 jari 127
2 26 Feb 07 jari 128   JFrame dummyFrame = new JFrame();
2 26 Feb 07 jari 129
2 26 Feb 07 jari 130   progress = new ProgressDialog(dummyFrame, "QTClust -- Progress", false, 6);
2 26 Feb 07 jari 131
2 26 Feb 07 jari 132   JPanel progressPanel = progress.getLabelPanel();
2 26 Feb 07 jari 133
2 26 Feb 07 jari 134   JPanel superPanel = new JPanel();
2 26 Feb 07 jari 135
2 26 Feb 07 jari 136   superPanel.setLayout(new BorderLayout());
2 26 Feb 07 jari 137
2 26 Feb 07 jari 138   JButton abortButton = new JButton("Abort");
2 26 Feb 07 jari 139
2 26 Feb 07 jari 140   abortButton.addActionListener(new ActionListener() {
2 26 Feb 07 jari 141
2 26 Feb 07 jari 142       public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 143
2 26 Feb 07 jari 144     stop = true;
2 26 Feb 07 jari 145
2 26 Feb 07 jari 146     progress.dismiss();
2 26 Feb 07 jari 147
2 26 Feb 07 jari 148       }
2 26 Feb 07 jari 149
2 26 Feb 07 jari 150   });
2 26 Feb 07 jari 151
2 26 Feb 07 jari 152   superPanel.add(progressPanel, BorderLayout.NORTH);
2 26 Feb 07 jari 153
2 26 Feb 07 jari 154   superPanel.add(abortButton, BorderLayout.SOUTH);
2 26 Feb 07 jari 155
2 26 Feb 07 jari 156   progress.setMainPanel(superPanel);
2 26 Feb 07 jari 157
2 26 Feb 07 jari 158   
2 26 Feb 07 jari 159
2 26 Feb 07 jari 160   AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 161
2 26 Feb 07 jari 162   if (stop) {
2 26 Feb 07 jari 163
2 26 Feb 07 jari 164       
2 26 Feb 07 jari 165
2 26 Feb 07 jari 166       result.addParam("aborted", "true");
2 26 Feb 07 jari 167
2 26 Feb 07 jari 168       return result;
2 26 Feb 07 jari 169
2 26 Feb 07 jari 170   }
2 26 Feb 07 jari 171
2 26 Feb 07 jari 172   
2 26 Feb 07 jari 173
2 26 Feb 07 jari 174   Vector[] clusters = calculate(useAbsolute, diameter, minimumClusterSize);
2 26 Feb 07 jari 175
2 26 Feb 07 jari 176   
2 26 Feb 07 jari 177
2 26 Feb 07 jari 178   if (stop) {
2 26 Feb 07 jari 179
2 26 Feb 07 jari 180       
2 26 Feb 07 jari 181
2 26 Feb 07 jari 182       result.addParam("aborted", "true");
2 26 Feb 07 jari 183
2 26 Feb 07 jari 184       return result;
2 26 Feb 07 jari 185
2 26 Feb 07 jari 186   }
2 26 Feb 07 jari 187
2 26 Feb 07 jari 188   
2 26 Feb 07 jari 189
2 26 Feb 07 jari 190   FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 191
2 26 Feb 07 jari 192   FloatMatrix variances = getVariances(clusters, means);
2 26 Feb 07 jari 193
2 26 Feb 07 jari 194   
2 26 Feb 07 jari 195
2 26 Feb 07 jari 196   AlgorithmEvent event = null;
2 26 Feb 07 jari 197
2 26 Feb 07 jari 198   if (hierarchical_tree) {
2 26 Feb 07 jari 199
2 26 Feb 07 jari 200       event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 201
2 26 Feb 07 jari 202       fireValueChanged(event);
2 26 Feb 07 jari 203
2 26 Feb 07 jari 204       event.setIntValue(0);
2 26 Feb 07 jari 205
2 26 Feb 07 jari 206       event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 207
2 26 Feb 07 jari 208       fireValueChanged(event);
2 26 Feb 07 jari 209
2 26 Feb 07 jari 210   }
2 26 Feb 07 jari 211
2 26 Feb 07 jari 212   
2 26 Feb 07 jari 213
2 26 Feb 07 jari 214   Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 215
2 26 Feb 07 jari 216   NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 217
2 26 Feb 07 jari 218   int[] features;
2 26 Feb 07 jari 219
2 26 Feb 07 jari 220   for (int i = 0; i < clusters.length; i++) {
2 26 Feb 07 jari 221
2 26 Feb 07 jari 222       if (stop) {
2 26 Feb 07 jari 223
2 26 Feb 07 jari 224     throw new AbortException();
2 26 Feb 07 jari 225
2 26 Feb 07 jari 226       }
2 26 Feb 07 jari 227
2 26 Feb 07 jari 228       features = convert2int(clusters[i]);
2 26 Feb 07 jari 229
2 26 Feb 07 jari 230       Node node = new Node(features);
2 26 Feb 07 jari 231
2 26 Feb 07 jari 232       nodeList.addNode(node);
2 26 Feb 07 jari 233
2 26 Feb 07 jari 234       if (hierarchical_tree) {
2 26 Feb 07 jari 235
2 26 Feb 07 jari 236     node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 237
2 26 Feb 07 jari 238     event.setIntValue(i+1);
2 26 Feb 07 jari 239
2 26 Feb 07 jari 240     fireValueChanged(event);
2 26 Feb 07 jari 241
2 26 Feb 07 jari 242       }
2 26 Feb 07 jari 243
2 26 Feb 07 jari 244   }
2 26 Feb 07 jari 245
2 26 Feb 07 jari 246   
2 26 Feb 07 jari 247
2 26 Feb 07 jari 248   // prepare the result
2 26 Feb 07 jari 249
2 26 Feb 07 jari 250   
2 26 Feb 07 jari 251
2 26 Feb 07 jari 252   result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 253
2 26 Feb 07 jari 254   result.addParam("number-of-clusters", String.valueOf(clusters.length));
2 26 Feb 07 jari 255
2 26 Feb 07 jari 256   result.addMatrix("clusters_means", means);
2 26 Feb 07 jari 257
2 26 Feb 07 jari 258   result.addMatrix("clusters_variances", variances);
2 26 Feb 07 jari 259
2 26 Feb 07 jari 260   return result;
2 26 Feb 07 jari 261
2 26 Feb 07 jari 262   
2 26 Feb 07 jari 263
2 26 Feb 07 jari 264     }
2 26 Feb 07 jari 265
2 26 Feb 07 jari 266     
2 26 Feb 07 jari 267
2 26 Feb 07 jari 268     
2 26 Feb 07 jari 269
2 26 Feb 07 jari 270     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 271
2 26 Feb 07 jari 272   NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 273
2 26 Feb 07 jari 274   AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 275
2 26 Feb 07 jari 276   FloatMatrix experiment;
2 26 Feb 07 jari 277         if(qtcGenes)
2 26 Feb 07 jari 278             experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 279         else
2 26 Feb 07 jari 280             experiment = experiment = getSubExperimentReducedCols(this.expMatrix, features);
2 26 Feb 07 jari 281             
2 26 Feb 07 jari 282   data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 283
2 26 Feb 07 jari 284         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 285         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 286
2 26 Feb 07 jari 287   data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 288
2 26 Feb 07 jari 289   HCL hcl = new HCL();
2 26 Feb 07 jari 290
2 26 Feb 07 jari 291   AlgorithmData result;
2 26 Feb 07 jari 292
2 26 Feb 07 jari 293   if (genes) {
2 26 Feb 07 jari 294
2 26 Feb 07 jari 295       data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 296
2 26 Feb 07 jari 297       result = hcl.execute(data);
2 26 Feb 07 jari 298
2 26 Feb 07 jari 299       validate(result);
2 26 Feb 07 jari 300
2 26 Feb 07 jari 301       addNodeValues(nodeList, result);
2 26 Feb 07 jari 302
2 26 Feb 07 jari 303   }
2 26 Feb 07 jari 304
2 26 Feb 07 jari 305   if (experiments) {
2 26 Feb 07 jari 306
2 26 Feb 07 jari 307       data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 308
2 26 Feb 07 jari 309       result = hcl.execute(data);
2 26 Feb 07 jari 310
2 26 Feb 07 jari 311       validate(result);
2 26 Feb 07 jari 312
2 26 Feb 07 jari 313       addNodeValues(nodeList, result);
2 26 Feb 07 jari 314
2 26 Feb 07 jari 315   }
2 26 Feb 07 jari 316
2 26 Feb 07 jari 317   return nodeList;
2 26 Feb 07 jari 318
2 26 Feb 07 jari 319     }
2 26 Feb 07 jari 320
2 26 Feb 07 jari 321     
2 26 Feb 07 jari 322
2 26 Feb 07 jari 323     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 324
2 26 Feb 07 jari 325   target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 326
2 26 Feb 07 jari 327   target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 328
2 26 Feb 07 jari 329   target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 330
2 26 Feb 07 jari 331   target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 332
2 26 Feb 07 jari 333     }
2 26 Feb 07 jari 334
2 26 Feb 07 jari 335     
2 26 Feb 07 jari 336
2 26 Feb 07 jari 337     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 338
2 26 Feb 07 jari 339   FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 340
2 26 Feb 07 jari 341   for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 342
2 26 Feb 07 jari 343       subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 344
2 26 Feb 07 jari 345   }
2 26 Feb 07 jari 346
2 26 Feb 07 jari 347   return subExperiment;
2 26 Feb 07 jari 348
2 26 Feb 07 jari 349     }
2 26 Feb 07 jari 350
2 26 Feb 07 jari 351     /**
2 26 Feb 07 jari 352      *  Creates a matrix with reduced columns (samples) as during experiment clustering
2 26 Feb 07 jari 353      */
2 26 Feb 07 jari 354     private FloatMatrix getSubExperimentReducedCols(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 355         FloatMatrix copyMatrix = experiment.copy();
2 26 Feb 07 jari 356         FloatMatrix subExperiment = new FloatMatrix(features.length, copyMatrix.getColumnDimension());
2 26 Feb 07 jari 357         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 358             subExperiment.A[i] = copyMatrix.A[features[i]];
2 26 Feb 07 jari 359         }
2 26 Feb 07 jari 360         subExperiment = subExperiment.transpose();
2 26 Feb 07 jari 361         return subExperiment;
2 26 Feb 07 jari 362     }
2 26 Feb 07 jari 363     
2 26 Feb 07 jari 364
2 26 Feb 07 jari 365     /**
2 26 Feb 07 jari 366
2 26 Feb 07 jari 367      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 368
2 26 Feb 07 jari 369      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 370
2 26 Feb 07 jari 371      */
2 26 Feb 07 jari 372
2 26 Feb 07 jari 373     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 374
2 26 Feb 07 jari 375   if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 376
2 26 Feb 07 jari 377       throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 378
2 26 Feb 07 jari 379   }
2 26 Feb 07 jari 380
2 26 Feb 07 jari 381   if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 382
2 26 Feb 07 jari 383       throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 384
2 26 Feb 07 jari 385   }
2 26 Feb 07 jari 386
2 26 Feb 07 jari 387   if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 388
2 26 Feb 07 jari 389       throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 390
2 26 Feb 07 jari 391   }
2 26 Feb 07 jari 392
2 26 Feb 07 jari 393   if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 394
2 26 Feb 07 jari 395       throw new AlgorithmException("parameter 'height' is null");
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
2 26 Feb 07 jari 401     
2 26 Feb 07 jari 402
2 26 Feb 07 jari 403     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 404
2 26 Feb 07 jari 405   int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 406
2 26 Feb 07 jari 407   for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 408
2 26 Feb 07 jari 409       int_matrix[i] = (int)((Integer)source.get(i)).intValue();
2 26 Feb 07 jari 410
2 26 Feb 07 jari 411   }
2 26 Feb 07 jari 412
2 26 Feb 07 jari 413   return int_matrix;
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     private FloatMatrix getMeans(Vector[] clusters) {
2 26 Feb 07 jari 420
2 26 Feb 07 jari 421   FloatMatrix means = new FloatMatrix(clusters.length, number_of_samples);
2 26 Feb 07 jari 422
2 26 Feb 07 jari 423   FloatMatrix mean;
2 26 Feb 07 jari 424
2 26 Feb 07 jari 425   for (int i = 0; i < clusters.length; i++) {
2 26 Feb 07 jari 426
2 26 Feb 07 jari 427           int n = clusters[i].size();
2 26 Feb 07 jari 428
2 26 Feb 07 jari 429           for (int j=0; j < number_of_samples; j++) {
2 26 Feb 07 jari 430
2 26 Feb 07 jari 431             float currentMean = 0f;
2 26 Feb 07 jari 432
2 26 Feb 07 jari 433             int denom = 0;
2 26 Feb 07 jari 434
2 26 Feb 07 jari 435             for (int k=0; k < n; k++) {
2 26 Feb 07 jari 436
2 26 Feb 07 jari 437               float value = expMatrix.get(((Integer) clusters[i].get(k)).intValue(), j);
2 26 Feb 07 jari 438
2 26 Feb 07 jari 439               if (!Float.isNaN(value)) {
2 26 Feb 07 jari 440
2 26 Feb 07 jari 441                 currentMean += value;
2 26 Feb 07 jari 442
2 26 Feb 07 jari 443                 denom++;
2 26 Feb 07 jari 444
2 26 Feb 07 jari 445               }
2 26 Feb 07 jari 446
2 26 Feb 07 jari 447             } // for each member of the cluster
2 26 Feb 07 jari 448
2 26 Feb 07 jari 449             means.set(i, j, currentMean / denom);
2 26 Feb 07 jari 450
2 26 Feb 07 jari 451           } // for each sample
2 26 Feb 07 jari 452
2 26 Feb 07 jari 453   } // for each cluster
2 26 Feb 07 jari 454
2 26 Feb 07 jari 455   return means;
2 26 Feb 07 jari 456
2 26 Feb 07 jari 457     } // end getMeans(...)
2 26 Feb 07 jari 458
2 26 Feb 07 jari 459     
2 26 Feb 07 jari 460
2 26 Feb 07 jari 461
2 26 Feb 07 jari 462
2 26 Feb 07 jari 463     
2 26 Feb 07 jari 464
2 26 Feb 07 jari 465     private FloatMatrix getVariances(Vector[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 466
2 26 Feb 07 jari 467       final int rows = means.getRowDimension();
2 26 Feb 07 jari 468
2 26 Feb 07 jari 469       final int columns = means.getColumnDimension();
2 26 Feb 07 jari 470
2 26 Feb 07 jari 471       FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 472
2 26 Feb 07 jari 473       for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 474
2 26 Feb 07 jari 475         for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 476
2 26 Feb 07 jari 477           float mean = means.get(row, column);
2 26 Feb 07 jari 478
2 26 Feb 07 jari 479           int validN = 0;
2 26 Feb 07 jari 480
2 26 Feb 07 jari 481           int size = clusters[row].size();
2 26 Feb 07 jari 482
2 26 Feb 07 jari 483           float sum = 0f;
2 26 Feb 07 jari 484
2 26 Feb 07 jari 485           float value;
2 26 Feb 07 jari 486
2 26 Feb 07 jari 487           for (int i = 0; i < size; i++) {
2 26 Feb 07 jari 488
2 26 Feb 07 jari 489             value = expMatrix.get(((Integer) clusters[row].get(i)).intValue(), column);
2 26 Feb 07 jari 490
2 26 Feb 07 jari 491             if (!Float.isNaN(value)) {
2 26 Feb 07 jari 492
2 26 Feb 07 jari 493               float diff = value - mean;
2 26 Feb 07 jari 494
2 26 Feb 07 jari 495               sum += diff * diff;
2 26 Feb 07 jari 496
2 26 Feb 07 jari 497               validN++;
2 26 Feb 07 jari 498
2 26 Feb 07 jari 499             }
2 26 Feb 07 jari 500
2 26 Feb 07 jari 501           }
2 26 Feb 07 jari 502
2 26 Feb 07 jari 503           variances.set(row, column, (float)  Math.sqrt(sum) / (validN-1)   );
2 26 Feb 07 jari 504
2 26 Feb 07 jari 505         }
2 26 Feb 07 jari 506
2 26 Feb 07 jari 507       }
2 26 Feb 07 jari 508
2 26 Feb 07 jari 509       return variances;
2 26 Feb 07 jari 510
2 26 Feb 07 jari 511     } // end getVariances(...)
2 26 Feb 07 jari 512
2 26 Feb 07 jari 513     
2 26 Feb 07 jari 514
2 26 Feb 07 jari 515
2 26 Feb 07 jari 516
2 26 Feb 07 jari 517     
2 26 Feb 07 jari 518
2 26 Feb 07 jari 519     public boolean isAborted() {
2 26 Feb 07 jari 520
2 26 Feb 07 jari 521   return stop;
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     
2 26 Feb 07 jari 528
2 26 Feb 07 jari 529     synchronized float getAdjustedDiameter() {
2 26 Feb 07 jari 530
2 26 Feb 07 jari 531       if((function == Algorithm.EUCLIDEAN)||(function == Algorithm.MANHATTAN)){
2 26 Feb 07 jari 532
2 26 Feb 07 jari 533           return (float) (diameter*getMaximumDistance());
2 26 Feb 07 jari 534
2 26 Feb 07 jari 535       } else if( (!useAbsolute) && (function == Algorithm.PEARSON)||(function == Algorithm.SPEARMANRANK)
2 26 Feb 07 jari 536
2 26 Feb 07 jari 537       ||(function == Algorithm.KENDALLSTAU)||(function == Algorithm.MUTUALINFORMATION)
2 26 Feb 07 jari 538
2 26 Feb 07 jari 539       ||(function == Algorithm.PEARSONUNCENTERED)||(function == Algorithm.COSINE)) {      
2 26 Feb 07 jari 540
2 26 Feb 07 jari 541           return 2*diameter;
2 26 Feb 07 jari 542
2 26 Feb 07 jari 543       }
2 26 Feb 07 jari 544
2 26 Feb 07 jari 545       return diameter;
2 26 Feb 07 jari 546
2 26 Feb 07 jari 547     } // end getAdjustedDiameter
2 26 Feb 07 jari 548
2 26 Feb 07 jari 549     
2 26 Feb 07 jari 550
2 26 Feb 07 jari 551     
2 26 Feb 07 jari 552
2 26 Feb 07 jari 553     private double getMaximumDistance() {
2 26 Feb 07 jari 554
2 26 Feb 07 jari 555   
2 26 Feb 07 jari 556
2 26 Feb 07 jari 557   double maxDistance = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 558
2 26 Feb 07 jari 559   double currentDistance;
2 26 Feb 07 jari 560
2 26 Feb 07 jari 561
2 26 Feb 07 jari 562
2 26 Feb 07 jari 563   
2 26 Feb 07 jari 564
2 26 Feb 07 jari 565   for (int i = 0; i < number_of_genes; i++) {
2 26 Feb 07 jari 566
2 26 Feb 07 jari 567       for(int j = 0; j < number_of_genes; j++) {
2 26 Feb 07 jari 568
2 26 Feb 07 jari 569     if (j != i) {
2 26 Feb 07 jari 570
2 26 Feb 07 jari 571         currentDistance = getDistance(expMatrix, i,j);
2 26 Feb 07 jari 572
2 26 Feb 07 jari 573         if (maxDistance < currentDistance) maxDistance = currentDistance;
2 26 Feb 07 jari 574
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
2 26 Feb 07 jari 581   }
2 26 Feb 07 jari 582
2 26 Feb 07 jari 583   
2 26 Feb 07 jari 584
2 26 Feb 07 jari 585   return maxDistance;
2 26 Feb 07 jari 586
2 26 Feb 07 jari 587     }
2 26 Feb 07 jari 588
2 26 Feb 07 jari 589     
2 26 Feb 07 jari 590
2 26 Feb 07 jari 591     
2 26 Feb 07 jari 592
2 26 Feb 07 jari 593     
2 26 Feb 07 jari 594
2 26 Feb 07 jari 595     private double getDistance(FloatMatrix expMatrix, int gene1, int gene2) {
2 26 Feb 07 jari 596
2 26 Feb 07 jari 597   double distance = 0;
2 26 Feb 07 jari 598
2 26 Feb 07 jari 599   double x;
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     if((function == Algorithm.PEARSON)||(function == Algorithm.SPEARMANRANK)
2 26 Feb 07 jari 606
2 26 Feb 07 jari 607       ||(function == Algorithm.KENDALLSTAU)||(function == Algorithm.COSINE)
2 26 Feb 07 jari 608
2 26 Feb 07 jari 609       ||(function == Algorithm.MUTUALINFORMATION)||(function == Algorithm.PEARSONUNCENTERED)
2 26 Feb 07 jari 610
2 26 Feb 07 jari 611       ||(function == Algorithm.PEARSONSQARED)) {
2 26 Feb 07 jari 612
2 26 Feb 07 jari 613         //distance = 1 - ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, function, factor, useAbsolute);
2 26 Feb 07 jari 614
2 26 Feb 07 jari 615           distance = ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, function, factor, useAbsolute);
2 26 Feb 07 jari 616
2 26 Feb 07 jari 617       }
2 26 Feb 07 jari 618
2 26 Feb 07 jari 619      */
2 26 Feb 07 jari 620
2 26 Feb 07 jari 621   if (function == Algorithm.PEARSON) {
2 26 Feb 07 jari 622
2 26 Feb 07 jari 623       distance = ExperimentUtil.genePearson(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 624
2 26 Feb 07 jari 625   } else if (function == Algorithm.SPEARMANRANK) {
2 26 Feb 07 jari 626
2 26 Feb 07 jari 627       distance = ExperimentUtil.geneSpearmanRank(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 628
2 26 Feb 07 jari 629   } else if (function == Algorithm.KENDALLSTAU) {
2 26 Feb 07 jari 630
2 26 Feb 07 jari 631       distance = ExperimentUtil.geneKendallsTau(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 632
2 26 Feb 07 jari 633   } else if (function == Algorithm.COSINE) {
2 26 Feb 07 jari 634
2 26 Feb 07 jari 635       distance = ExperimentUtil.geneCosine(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 636
2 26 Feb 07 jari 637   } else if (function == Algorithm.MUTUALINFORMATION) {
2 26 Feb 07 jari 638
2 26 Feb 07 jari 639       distance = ExperimentUtil.geneMutualInformation(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 640
2 26 Feb 07 jari 641   } else if (function == Algorithm.PEARSONUNCENTERED) {
2 26 Feb 07 jari 642
2 26 Feb 07 jari 643       distance = ExperimentUtil.genePearsonUncentered(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 644
2 26 Feb 07 jari 645   } else if (function == Algorithm.PEARSONSQARED) {
2 26 Feb 07 jari 646
2 26 Feb 07 jari 647             float temp = ExperimentUtil.genePearson(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 648
2 26 Feb 07 jari 649       distance = temp * temp;
2 26 Feb 07 jari 650
2 26 Feb 07 jari 651   }
2 26 Feb 07 jari 652
2 26 Feb 07 jari 653   else if((function == Algorithm.EUCLIDEAN)||(function == Algorithm.MANHATTAN)) {
2 26 Feb 07 jari 654
2 26 Feb 07 jari 655       distance = ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, function, factor, useAbsolute);
2 26 Feb 07 jari 656
2 26 Feb 07 jari 657   } else if (function == Algorithm.COVARIANCE) {
2 26 Feb 07 jari 658
2 26 Feb 07 jari 659       x = ExperimentUtil.geneCovariance(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 660
2 26 Feb 07 jari 661       if (useAbsolute) {
2 26 Feb 07 jari 662
2 26 Feb 07 jari 663     x = Math.abs(x);
2 26 Feb 07 jari 664
2 26 Feb 07 jari 665       }
2 26 Feb 07 jari 666
2 26 Feb 07 jari 667       distance = (xMax - x)/(xMax - xMin);
2 26 Feb 07 jari 668
2 26 Feb 07 jari 669   } else if (function == Algorithm.DOTPRODUCT) {
2 26 Feb 07 jari 670
2 26 Feb 07 jari 671       x = ExperimentUtil.geneDotProduct(expMatrix, null, gene1, gene2, factor);
2 26 Feb 07 jari 672
2 26 Feb 07 jari 673       if (useAbsolute) {
2 26 Feb 07 jari 674
2 26 Feb 07 jari 675     x = Math.abs(x);
2 26 Feb 07 jari 676
2 26 Feb 07 jari 677       }
2 26 Feb 07 jari 678
2 26 Feb 07 jari 679       distance = (xMax - x)/(xMax - xMin);
2 26 Feb 07 jari 680
2 26 Feb 07 jari 681   }
2 26 Feb 07 jari 682
2 26 Feb 07 jari 683   
2 26 Feb 07 jari 684
2 26 Feb 07 jari 685     /*
2 26 Feb 07 jari 686
2 26 Feb 07 jari 687     else if((function == Algorithm.COVARIANCE)||(function == Algorithm.DOTPRODUCT)) {
2 26 Feb 07 jari 688
2 26 Feb 07 jari 689         x = ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, function, factor, useAbsolute);
2 26 Feb 07 jari 690
2 26 Feb 07 jari 691         distance = (xMax - x)/(xMax - xMin);
2 26 Feb 07 jari 692
2 26 Feb 07 jari 693      
2 26 Feb 07 jari 694
2 26 Feb 07 jari 695     }
2 26 Feb 07 jari 696
2 26 Feb 07 jari 697      */
2 26 Feb 07 jari 698
2 26 Feb 07 jari 699   
2 26 Feb 07 jari 700
2 26 Feb 07 jari 701   if((function == Algorithm.PEARSON)||(function == Algorithm.SPEARMANRANK)
2 26 Feb 07 jari 702
2 26 Feb 07 jari 703   ||(function == Algorithm.KENDALLSTAU)||(function == Algorithm.COSINE)
2 26 Feb 07 jari 704
2 26 Feb 07 jari 705   ||(function == Algorithm.MUTUALINFORMATION)||(function == Algorithm.PEARSONUNCENTERED)
2 26 Feb 07 jari 706
2 26 Feb 07 jari 707   ||(function == Algorithm.PEARSONSQARED)) {
2 26 Feb 07 jari 708
2 26 Feb 07 jari 709       if (useAbsolute) {
2 26 Feb 07 jari 710
2 26 Feb 07 jari 711     distance = 1 - Math.abs(distance);
2 26 Feb 07 jari 712
2 26 Feb 07 jari 713       } else {
2 26 Feb 07 jari 714
2 26 Feb 07 jari 715     distance = 1 - distance;
2 26 Feb 07 jari 716
2 26 Feb 07 jari 717       }
2 26 Feb 07 jari 718
2 26 Feb 07 jari 719       
2 26 Feb 07 jari 720
2 26 Feb 07 jari 721   }
2 26 Feb 07 jari 722
2 26 Feb 07 jari 723   
2 26 Feb 07 jari 724
2 26 Feb 07 jari 725   return distance;
2 26 Feb 07 jari 726
2 26 Feb 07 jari 727     }
2 26 Feb 07 jari 728
2 26 Feb 07 jari 729     
2 26 Feb 07 jari 730
2 26 Feb 07 jari 731     
2 26 Feb 07 jari 732
2 26 Feb 07 jari 733     
2 26 Feb 07 jari 734
2 26 Feb 07 jari 735     private double getMaxCovarOrDotProd() {
2 26 Feb 07 jari 736
2 26 Feb 07 jari 737   double xMax = Double.NEGATIVE_INFINITY;
2 26 Feb 07 jari 738
2 26 Feb 07 jari 739   double xCurrent = Double.NEGATIVE_INFINITY;;
2 26 Feb 07 jari 740
2 26 Feb 07 jari 741   
2 26 Feb 07 jari 742
2 26 Feb 07 jari 743   for (int i = 0; i < number_of_genes; i++) {
2 26 Feb 07 jari 744
2 26 Feb 07 jari 745       for(int j = 0; j < number_of_genes; j++) {
2 26 Feb 07 jari 746
2 26 Feb 07 jari 747     if (j != i) {
2 26 Feb 07 jari 748
2 26 Feb 07 jari 749         if (function == Algorithm.DOTPRODUCT) {
2 26 Feb 07 jari 750
2 26 Feb 07 jari 751       xCurrent = ExperimentUtil.geneDotProduct(expMatrix, null, i, j, factor);
2 26 Feb 07 jari 752
2 26 Feb 07 jari 753       if (useAbsolute) {
2 26 Feb 07 jari 754
2 26 Feb 07 jari 755           xCurrent = Math.abs(xCurrent);
2 26 Feb 07 jari 756
2 26 Feb 07 jari 757       }
2 26 Feb 07 jari 758
2 26 Feb 07 jari 759         } else if (function == Algorithm.COVARIANCE) {
2 26 Feb 07 jari 760
2 26 Feb 07 jari 761       xCurrent = ExperimentUtil.geneCovariance(expMatrix, null, i, j, factor);
2 26 Feb 07 jari 762
2 26 Feb 07 jari 763       if (useAbsolute) {
2 26 Feb 07 jari 764
2 26 Feb 07 jari 765           xCurrent = Math.abs(xCurrent);
2 26 Feb 07 jari 766
2 26 Feb 07 jari 767       }
2 26 Feb 07 jari 768
2 26 Feb 07 jari 769       
2 26 Feb 07 jari 770
2 26 Feb 07 jari 771         }
2 26 Feb 07 jari 772
2 26 Feb 07 jari 773         //xCurrent = ExperimentUtil.geneDistance(expMatrix, null, i, j, function, factor, useAbsolute);
2 26 Feb 07 jari 774
2 26 Feb 07 jari 775         if (xMax < xCurrent) xMax = xCurrent;
2 26 Feb 07 jari 776
2 26 Feb 07 jari 777     }
2 26 Feb 07 jari 778
2 26 Feb 07 jari 779       }
2 26 Feb 07 jari 780
2 26 Feb 07 jari 781   }
2 26 Feb 07 jari 782
2 26 Feb 07 jari 783   return xMax;
2 26 Feb 07 jari 784
2 26 Feb 07 jari 785     }
2 26 Feb 07 jari 786
2 26 Feb 07 jari 787     
2 26 Feb 07 jari 788
2 26 Feb 07 jari 789     
2 26 Feb 07 jari 790
2 26 Feb 07 jari 791     
2 26 Feb 07 jari 792
2 26 Feb 07 jari 793     private double getMinCovOrDotProd() {
2 26 Feb 07 jari 794
2 26 Feb 07 jari 795   double xMin = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 796
2 26 Feb 07 jari 797   double xCurrent = Double.POSITIVE_INFINITY;
2 26 Feb 07 jari 798
2 26 Feb 07 jari 799   for (int i = 0; i < number_of_genes; i++) {
2 26 Feb 07 jari 800
2 26 Feb 07 jari 801       for(int j = 0; j < number_of_genes; j++) {
2 26 Feb 07 jari 802
2 26 Feb 07 jari 803     if (j != i) {
2 26 Feb 07 jari 804
2 26 Feb 07 jari 805         if (function == Algorithm.DOTPRODUCT) {
2 26 Feb 07 jari 806
2 26 Feb 07 jari 807       xCurrent = ExperimentUtil.geneDotProduct(expMatrix, null, i, j, factor);
2 26 Feb 07 jari 808
2 26 Feb 07 jari 809       if (useAbsolute) {
2 26 Feb 07 jari 810
2 26 Feb 07 jari 811           xCurrent = Math.abs(xCurrent);
2 26 Feb 07 jari 812
2 26 Feb 07 jari 813       }
2 26 Feb 07 jari 814
2 26 Feb 07 jari 815         } else if (function == Algorithm.COVARIANCE) {
2 26 Feb 07 jari 816
2 26 Feb 07 jari 817       xCurrent = ExperimentUtil.geneCovariance(expMatrix, null, i, j, factor);
2 26 Feb 07 jari 818
2 26 Feb 07 jari 819       if (useAbsolute) {
2 26 Feb 07 jari 820
2 26 Feb 07 jari 821           xCurrent = Math.abs(xCurrent);
2 26 Feb 07 jari 822
2 26 Feb 07 jari 823       }
2 26 Feb 07 jari 824
2 26 Feb 07 jari 825       
2 26 Feb 07 jari 826
2 26 Feb 07 jari 827         }
2 26 Feb 07 jari 828
2 26 Feb 07 jari 829         //xCurrent = ExperimentUtil.geneDistance(expMatrix, null, i, j, function, factor, useAbsolute);
2 26 Feb 07 jari 830
2 26 Feb 07 jari 831         if (xMin > xCurrent) xMin = xCurrent;
2 26 Feb 07 jari 832
2 26 Feb 07 jari 833     }
2 26 Feb 07 jari 834
2 26 Feb 07 jari 835       }
2 26 Feb 07 jari 836
2 26 Feb 07 jari 837   }
2 26 Feb 07 jari 838
2 26 Feb 07 jari 839   return xMin;
2 26 Feb 07 jari 840
2 26 Feb 07 jari 841     }
2 26 Feb 07 jari 842
2 26 Feb 07 jari 843     
2 26 Feb 07 jari 844
2 26 Feb 07 jari 845     
2 26 Feb 07 jari 846
2 26 Feb 07 jari 847     
2 26 Feb 07 jari 848
2 26 Feb 07 jari 849     public void setMinMaxCovOrDotProd() {
2 26 Feb 07 jari 850
2 26 Feb 07 jari 851   this.xMax = getMaxCovarOrDotProd();
2 26 Feb 07 jari 852
2 26 Feb 07 jari 853   this.xMin = getMinCovOrDotProd();
2 26 Feb 07 jari 854
2 26 Feb 07 jari 855     }
2 26 Feb 07 jari 856
2 26 Feb 07 jari 857     
2 26 Feb 07 jari 858
2 26 Feb 07 jari 859     
2 26 Feb 07 jari 860
2 26 Feb 07 jari 861     
2 26 Feb 07 jari 862
2 26 Feb 07 jari 863     private Vector getAllClusters(Vector unassignedUniqueIDIndices) {
2 26 Feb 07 jari 864
2 26 Feb 07 jari 865       if (stop) {return null;}
2 26 Feb 07 jari 866
2 26 Feb 07 jari 867
2 26 Feb 07 jari 868
2 26 Feb 07 jari 869       while (true) {
2 26 Feb 07 jari 870
2 26 Feb 07 jari 871         // main work segment
2 26 Feb 07 jari 872
2 26 Feb 07 jari 873         Vector currentLargestCluster = getLargestCluster(unassignedUniqueIDIndices);
2 26 Feb 07 jari 874
2 26 Feb 07 jari 875         allClusters.add(currentLargestCluster);
2 26 Feb 07 jari 876
2 26 Feb 07 jari 877         int clusterSize = currentLargestCluster.size();
2 26 Feb 07 jari 878
2 26 Feb 07 jari 879
2 26 Feb 07 jari 880
2 26 Feb 07 jari 881         progress.setMessage(4, "# of assigned genes: " + (number_of_genes - unassignedUniqueIDIndices.size()));
2 26 Feb 07 jari 882
2 26 Feb 07 jari 883         progress.setMessage(5, "# of genes not yet assigned: " + unassignedUniqueIDIndices.size());
2 26 Feb 07 jari 884
2 26 Feb 07 jari 885         progress.setMessage(2, "# of clusters formed: " + allClusters.size());
2 26 Feb 07 jari 886
2 26 Feb 07 jari 887         progress.setMessage(3, "size of last cluster formed: " + currentLargestCluster.size());
2 26 Feb 07 jari 888
2 26 Feb 07 jari 889         unassignedUniqueIDIndices.removeAll(currentLargestCluster);
2 26 Feb 07 jari 890
2 26 Feb 07 jari 891         
2 26 Feb 07 jari 892
2 26 Feb 07 jari 893         // terminating conditions
2 26 Feb 07 jari 894
2 26 Feb 07 jari 895         if (clusterSize < minimumClusterSize){ // throw the leftovers into the last cluster.
2 26 Feb 07 jari 896
2 26 Feb 07 jari 897           currentLargestCluster.addAll(unassignedUniqueIDIndices);
2 26 Feb 07 jari 898
2 26 Feb 07 jari 899           return allClusters;
2 26 Feb 07 jari 900
2 26 Feb 07 jari 901         } else if (unassignedUniqueIDIndices.size() == 0) { // insert an empty cluster to indicate it came out evenly.
2 26 Feb 07 jari 902
2 26 Feb 07 jari 903           allClusters.add(new Vector());
2 26 Feb 07 jari 904
2 26 Feb 07 jari 905           return allClusters;
2 26 Feb 07 jari 906
2 26 Feb 07 jari 907         }
2 26 Feb 07 jari 908
2 26 Feb 07 jari 909       } // end while true
2 26 Feb 07 jari 910
2 26 Feb 07 jari 911     } // end getting clusters
2 26 Feb 07 jari 912
2 26 Feb 07 jari 913
2 26 Feb 07 jari 914
2 26 Feb 07 jari 915
2 26 Feb 07 jari 916
2 26 Feb 07 jari 917
2 26 Feb 07 jari 918
2 26 Feb 07 jari 919     /**
2 26 Feb 07 jari 920
2 26 Feb 07 jari 921       * This returns the cluster that a gene would produce. This has specific permission to
2 26 Feb 07 jari 922
2 26 Feb 07 jari 923      * mangle the vector of indices passed to it.
2 26 Feb 07 jari 924
2 26 Feb 07 jari 925      *
2 26 Feb 07 jari 926
2 26 Feb 07 jari 927      * @param candidateIndices does NOT contain an entry for seedIndex.
2 26 Feb 07 jari 928
2 26 Feb 07 jari 929      */
2 26 Feb 07 jari 930
2 26 Feb 07 jari 931     private Vector getClusterForAGene(Integer seedIndex, Vector candidateIndices) {
2 26 Feb 07 jari 932
2 26 Feb 07 jari 933
2 26 Feb 07 jari 934
2 26 Feb 07 jari 935       Vector cluster = new Vector();
2 26 Feb 07 jari 936
2 26 Feb 07 jari 937       cluster.add(seedIndex);
2 26 Feb 07 jari 938
2 26 Feb 07 jari 939       Integer MostRecentAdditionI = seedIndex;
2 26 Feb 07 jari 940
2 26 Feb 07 jari 941       int mostRecentAdditioni = seedIndex.intValue();
2 26 Feb 07 jari 942
2 26 Feb 07 jari 943       
2 26 Feb 07 jari 944
2 26 Feb 07 jari 945       // the potential diameter for the cluster if any one gene is added. The worst of the distances.
2 26 Feb 07 jari 946
2 26 Feb 07 jari 947       float[] geneDiameterSoFar = new float[number_of_genes]; // indexed by absolute indices so it can be non-dynamic and primitive
2 26 Feb 07 jari 948
2 26 Feb 07 jari 949       for (int local = 0; local < candidateIndices.size(); local++)
2 26 Feb 07 jari 950
2 26 Feb 07 jari 951         geneDiameterSoFar[((Integer)candidateIndices.get(local)).intValue()] = Float.NEGATIVE_INFINITY;
2 26 Feb 07 jari 952
2 26 Feb 07 jari 953
2 26 Feb 07 jari 954
2 26 Feb 07 jari 955       while (true) { // exit condition near bottom
2 26 Feb 07 jari 956
2 26 Feb 07 jari 957         int   bestLocalIndex = -1;
2 26 Feb 07 jari 958
2 26 Feb 07 jari 959         float bestDistance   = Float.POSITIVE_INFINITY; // best of the worst distances.
2 26 Feb 07 jari 960
2 26 Feb 07 jari 961         //    initialize the array only for those genes that we're using.
2 26 Feb 07 jari 962
2 26 Feb 07 jari 963         // main loop
2 26 Feb 07 jari 964
2 26 Feb 07 jari 965         CANDIDATE_SEARCH: for (int local = 0; local < candidateIndices.size(); ) { // increment local only if not deleting!
2 26 Feb 07 jari 966
2 26 Feb 07 jari 967           int i = ((Integer)candidateIndices.get(local)).intValue(); // the absolute index at the local index
2 26 Feb 07 jari 968
2 26 Feb 07 jari 969                   // compare this gene to each gene already in the cluster. Keep track of worst match.
2 26 Feb 07 jari 970
2 26 Feb 07 jari 971           geneDiameterSoFar[i] = Math.max(proximity[i][mostRecentAdditioni], geneDiameterSoFar[i]); // potential diameter
2 26 Feb 07 jari 972
2 26 Feb 07 jari 973           if (geneDiameterSoFar[i] > adjustedDiameter) { // never check this gene again
2 26 Feb 07 jari 974
2 26 Feb 07 jari 975             candidateIndices.remove(local); // local now points to the element after the one it used to.
2 26 Feb 07 jari 976
2 26 Feb 07 jari 977             continue CANDIDATE_SEARCH;
2 26 Feb 07 jari 978
2 26 Feb 07 jari 979           } // if the candidate gene is disqualified now
2 26 Feb 07 jari 980
2 26 Feb 07 jari 981         
2 26 Feb 07 jari 982
2 26 Feb 07 jari 983           if ( geneDiameterSoFar[i] < bestDistance) { // if this worst match is the best one so far, make it the leader.
2 26 Feb 07 jari 984
2 26 Feb 07 jari 985             bestDistance = geneDiameterSoFar[i];
2 26 Feb 07 jari 986
2 26 Feb 07 jari 987             bestLocalIndex = local;
2 26 Feb 07 jari 988
2 26 Feb 07 jari 989           }
2 26 Feb 07 jari 990
2 26 Feb 07 jari 991           local++;
2 26 Feb 07 jari 992
2 26 Feb 07 jari 993         } // for each candidate gene
2 26 Feb 07 jari 994
2 26 Feb 07 jari 995         if (bestLocalIndex == -1) break; // if no candidates can join cluster, stop adding them already!
2 26 Feb 07 jari 996
2 26 Feb 07 jari 997         
2 26 Feb 07 jari 998
2 26 Feb 07 jari 999         MostRecentAdditionI = (Integer)candidateIndices.remove(bestLocalIndex); // otherwise, add the best candidate.
2 26 Feb 07 jari 1000
2 26 Feb 07 jari 1001         mostRecentAdditioni = MostRecentAdditionI.intValue();
2 26 Feb 07 jari 1002
2 26 Feb 07 jari 1003         cluster.add(MostRecentAdditionI);
2 26 Feb 07 jari 1004
2 26 Feb 07 jari 1005       } // while can add genes
2 26 Feb 07 jari 1006
2 26 Feb 07 jari 1007   
2 26 Feb 07 jari 1008
2 26 Feb 07 jari 1009       return cluster;
2 26 Feb 07 jari 1010
2 26 Feb 07 jari 1011     }
2 26 Feb 07 jari 1012
2 26 Feb 07 jari 1013     
2 26 Feb 07 jari 1014
2 26 Feb 07 jari 1015     
2 26 Feb 07 jari 1016
2 26 Feb 07 jari 1017     private double getJackknifeDistance(int gene1, int gene2) {
2 26 Feb 07 jari 1018
2 26 Feb 07 jari 1019   JackknifedMatrixBySpecifiedExp jackMatrix = null;
2 26 Feb 07 jari 1020
2 26 Feb 07 jari 1021   double jackknifeDistance, currentDistance;
2 26 Feb 07 jari 1022
2 26 Feb 07 jari 1023   
2 26 Feb 07 jari 1024
2 26 Feb 07 jari 1025   jackknifeDistance = Math.abs(getDistance(expMatrix, gene1, gene2));
2 26 Feb 07 jari 1026
2 26 Feb 07 jari 1027   
2 26 Feb 07 jari 1028
2 26 Feb 07 jari 1029   for (int i = 0; i < number_of_samples; i++) {
2 26 Feb 07 jari 1030
2 26 Feb 07 jari 1031       jackMatrix = jacked[i];
2 26 Feb 07 jari 1032
2 26 Feb 07 jari 1033       currentDistance = getDistance(jackMatrix, gene1, gene2);
2 26 Feb 07 jari 1034
2 26 Feb 07 jari 1035       if (useAbsolute == true) {
2 26 Feb 07 jari 1036
2 26 Feb 07 jari 1037     jackknifeDistance = Math.max(jackknifeDistance, Math.abs(currentDistance));
2 26 Feb 07 jari 1038
2 26 Feb 07 jari 1039       } else {
2 26 Feb 07 jari 1040
2 26 Feb 07 jari 1041     jackknifeDistance = Math.max(jackknifeDistance, currentDistance);
2 26 Feb 07 jari 1042
2 26 Feb 07 jari 1043       }
2 26 Feb 07 jari 1044
2 26 Feb 07 jari 1045   }
2 26 Feb 07 jari 1046
2 26 Feb 07 jari 1047   
2 26 Feb 07 jari 1048
2 26 Feb 07 jari 1049   return jackknifeDistance;
2 26 Feb 07 jari 1050
2 26 Feb 07 jari 1051     }
2 26 Feb 07 jari 1052
2 26 Feb 07 jari 1053     
2 26 Feb 07 jari 1054
2 26 Feb 07 jari 1055     
2 26 Feb 07 jari 1056
2 26 Feb 07 jari 1057     
2 26 Feb 07 jari 1058
2 26 Feb 07 jari 1059     private Vector getLargestCluster(Vector unassignedUIDIndices) {
2 26 Feb 07 jari 1060
2 26 Feb 07 jari 1061   Vector currentCluster;
2 26 Feb 07 jari 1062
2 26 Feb 07 jari 1063   Vector largestClusterTies = new Vector();
2 26 Feb 07 jari 1064
2 26 Feb 07 jari 1065   int largestClusterSize = 0;
2 26 Feb 07 jari 1066
2 26 Feb 07 jari 1067   for(int i = 0; i < unassignedUIDIndices.size(); i++) {
2 26 Feb 07 jari 1068
2 26 Feb 07 jari 1069           Vector tempUnassigned = (Vector) unassignedUIDIndices.clone(); // need to clone because getClusterForAGene mangles the unassigned indices array.
2 26 Feb 07 jari 1070
2 26 Feb 07 jari 1071           Integer seedCandidate = (Integer)tempUnassigned.remove(i);
2 26 Feb 07 jari 1072
2 26 Feb 07 jari 1073           currentCluster = getClusterForAGene(seedCandidate, tempUnassigned);
2 26 Feb 07 jari 1074
2 26 Feb 07 jari 1075           if(currentCluster.size() == largestClusterSize) { // if a tie
2 26 Feb 07 jari 1076
2 26 Feb 07 jari 1077             largestClusterTies.add(currentCluster);
2 26 Feb 07 jari 1078
2 26 Feb 07 jari 1079           } else if (currentCluster.size() > largestClusterSize) {
2 26 Feb 07 jari 1080
2 26 Feb 07 jari 1081             largestClusterTies.clear();
2 26 Feb 07 jari 1082
2 26 Feb 07 jari 1083             largestClusterTies.add(currentCluster);
2 26 Feb 07 jari 1084
2 26 Feb 07 jari 1085             largestClusterSize = currentCluster.size();
2 26 Feb 07 jari 1086
2 26 Feb 07 jari 1087           } // if we have a new record
2 26 Feb 07 jari 1088
2 26 Feb 07 jari 1089   } // for each possible seed gene
2 26 Feb 07 jari 1090
2 26 Feb 07 jari 1091   
2 26 Feb 07 jari 1092
2 26 Feb 07 jari 1093         int randCluster = (int)( Math.random()*largestClusterTies.size() );
2 26 Feb 07 jari 1094
2 26 Feb 07 jari 1095   return (Vector) largestClusterTies.get(randCluster);
2 26 Feb 07 jari 1096
2 26 Feb 07 jari 1097     }
2 26 Feb 07 jari 1098
2 26 Feb 07 jari 1099     
2 26 Feb 07 jari 1100
2 26 Feb 07 jari 1101     
2 26 Feb 07 jari 1102
2 26 Feb 07 jari 1103     
2 26 Feb 07 jari 1104
2 26 Feb 07 jari 1105     public void abort() {
2 26 Feb 07 jari 1106
2 26 Feb 07 jari 1107   stop = true;
2 26 Feb 07 jari 1108
2 26 Feb 07 jari 1109     }
2 26 Feb 07 jari 1110
2 26 Feb 07 jari 1111     
2 26 Feb 07 jari 1112
2 26 Feb 07 jari 1113     
2 26 Feb 07 jari 1114
2 26 Feb 07 jari 1115     private Vector[] calculate(boolean useAbsolute, float diameter, int minimumClusterSize) throws AlgorithmException {
2 26 Feb 07 jari 1116
2 26 Feb 07 jari 1117   long startTime, calculationTime;
2 26 Feb 07 jari 1118
2 26 Feb 07 jari 1119   Vector[] clusters;
2 26 Feb 07 jari 1120
2 26 Feb 07 jari 1121         
2 26 Feb 07 jari 1122
2 26 Feb 07 jari 1123   
2 26 Feb 07 jari 1124
2 26 Feb 07 jari 1125   if (stop) return null;
2 26 Feb 07 jari 1126
2 26 Feb 07 jari 1127   
2 26 Feb 07 jari 1128
2 26 Feb 07 jari 1129   if((function == Algorithm.COVARIANCE)||(function == Algorithm.DOTPRODUCT)) {
2 26 Feb 07 jari 1130
2 26 Feb 07 jari 1131       setMinMaxCovOrDotProd();
2 26 Feb 07 jari 1132
2 26 Feb 07 jari 1133   }
2 26 Feb 07 jari 1134
2 26 Feb 07 jari 1135   
2 26 Feb 07 jari 1136
2 26 Feb 07 jari 1137   progress.setMessage(0, "<html>" + "<p>Distance: " + AbstractAlgorithm.getDistanceName(function) +
2 26 Feb 07 jari 1138
2 26 Feb 07 jari 1139   "<p>Absolute? " + ((useAbsolute == true)?"Yes":"No") +
2 26 Feb 07 jari 1140
2 26 Feb 07 jari 1141   "<p>Minimum cluster size: " + minimumClusterSize +
2 26 Feb 07 jari 1142
2 26 Feb 07 jari 1143   "<p>Threshold diameter: " + diameter +
2 26 Feb 07 jari 1144
2 26 Feb 07 jari 1145   "</html>");
2 26 Feb 07 jari 1146
2 26 Feb 07 jari 1147   progress.setTimerLabel(1, "Running for ", " seconds.", 1000);
2 26 Feb 07 jari 1148
2 26 Feb 07 jari 1149   progress.setMessage(2, "# of clusters formed: 0");
2 26 Feb 07 jari 1150
2 26 Feb 07 jari 1151   progress.setMessage(3, "size of last cluster formed: 0");
2 26 Feb 07 jari 1152
2 26 Feb 07 jari 1153   progress.setMessage(4, "# of assigned genes: 0");
2 26 Feb 07 jari 1154
2 26 Feb 07 jari 1155   progress.setMessage(5, "# of genes not yet assigned: " + number_of_genes);
2 26 Feb 07 jari 1156
2 26 Feb 07 jari 1157   progress.setVisible(true);
2 26 Feb 07 jari 1158
2 26 Feb 07 jari 1159   
2 26 Feb 07 jari 1160
2 26 Feb 07 jari 1161   if (stop) return null;
2 26 Feb 07 jari 1162
2 26 Feb 07 jari 1163   
2 26 Feb 07 jari 1164
2 26 Feb 07 jari 1165   this.adjustedDiameter = getAdjustedDiameter();
2 26 Feb 07 jari 1166
2 26 Feb 07 jari 1167         /* calculate all gene distances now and cache them.
2 26 Feb 07 jari 1168
2 26 Feb 07 jari 1169           This will tremendously speed up later calculations.
2 26 Feb 07 jari 1170
2 26 Feb 07 jari 1171           */
2 26 Feb 07 jari 1172
2 26 Feb 07 jari 1173         this.jacked = new JackknifedMatrixBySpecifiedExp[number_of_samples];
2 26 Feb 07 jari 1174
2 26 Feb 07 jari 1175         for (int i = 0; i < jacked.length; i++) {
2 26 Feb 07 jari 1176
2 26 Feb 07 jari 1177           jacked[i] = new JackknifedMatrixBySpecifiedExp(expMatrix, i);
2 26 Feb 07 jari 1178
2 26 Feb 07 jari 1179         }
2 26 Feb 07 jari 1180
2 26 Feb 07 jari 1181         this.proximity = new float[number_of_genes][number_of_genes];
2 26 Feb 07 jari 1182
2 26 Feb 07 jari 1183         for (int i = 0; i < number_of_genes; i++) {
2 26 Feb 07 jari 1184
2 26 Feb 07 jari 1185           for (int j = 0; j <= i; j++) {
2 26 Feb 07 jari 1186
2 26 Feb 07 jari 1187             proximity[i][j] = (float) getJackknifeDistance(i, j);
2 26 Feb 07 jari 1188
2 26 Feb 07 jari 1189             proximity[j][i] = proximity[i][j];
2 26 Feb 07 jari 1190
2 26 Feb 07 jari 1191           }
2 26 Feb 07 jari 1192
2 26 Feb 07 jari 1193         }
2 26 Feb 07 jari 1194
2 26 Feb 07 jari 1195         // done cacheing distances
2 26 Feb 07 jari 1196
2 26 Feb 07 jari 1197         this.jacked = null;
2 26 Feb 07 jari 1198
2 26 Feb 07 jari 1199         // no longer need the cache of the jacked matrices
2 26 Feb 07 jari 1200
2 26 Feb 07 jari 1201         
2 26 Feb 07 jari 1202
2 26 Feb 07 jari 1203   Vector allUniqueIDIndices = new Vector();
2 26 Feb 07 jari 1204
2 26 Feb 07 jari 1205   Vector clusterVector = new Vector();
2 26 Feb 07 jari 1206
2 26 Feb 07 jari 1207
2 26 Feb 07 jari 1208
2 26 Feb 07 jari 1209         allUniqueIDIndices = new Vector();
2 26 Feb 07 jari 1210
2 26 Feb 07 jari 1211   for(int i = 0; i < number_of_genes; i++) {
2 26 Feb 07 jari 1212
2 26 Feb 07 jari 1213       allUniqueIDIndices.add( new Integer(i));
2 26 Feb 07 jari 1214
2 26 Feb 07 jari 1215   }
2 26 Feb 07 jari 1216
2 26 Feb 07 jari 1217   
2 26 Feb 07 jari 1218
2 26 Feb 07 jari 1219   if (stop) return null;
2 26 Feb 07 jari 1220
2 26 Feb 07 jari 1221   
2 26 Feb 07 jari 1222
2 26 Feb 07 jari 1223   startTime = System.currentTimeMillis();
2 26 Feb 07 jari 1224
2 26 Feb 07 jari 1225   clusterVector = getAllClusters(allUniqueIDIndices); // MAIN WORK FUNCTION
2 26 Feb 07 jari 1226
2 26 Feb 07 jari 1227   
2 26 Feb 07 jari 1228
2 26 Feb 07 jari 1229   if (stop) return null;
2 26 Feb 07 jari 1230
2 26 Feb 07 jari 1231   
2 26 Feb 07 jari 1232
2 26 Feb 07 jari 1233   progress.dismiss();
2 26 Feb 07 jari 1234
2 26 Feb 07 jari 1235   
2 26 Feb 07 jari 1236
2 26 Feb 07 jari 1237   calculationTime = System.currentTimeMillis()-startTime;
2 26 Feb 07 jari 1238
2 26 Feb 07 jari 1239   
2 26 Feb 07 jari 1240
2 26 Feb 07 jari 1241   clusters = (Vector[])clusterVector.toArray(new Vector[clusterVector.size()]);
2 26 Feb 07 jari 1242
2 26 Feb 07 jari 1243   
2 26 Feb 07 jari 1244
2 26 Feb 07 jari 1245   return clusters;
2 26 Feb 07 jari 1246
2 26 Feb 07 jari 1247   
2 26 Feb 07 jari 1248
2 26 Feb 07 jari 1249     }
2 26 Feb 07 jari 1250
2 26 Feb 07 jari 1251     
2 26 Feb 07 jari 1252
2 26 Feb 07 jari 1253     
2 26 Feb 07 jari 1254
2 26 Feb 07 jari 1255     private class JackknifedMatrixBySpecifiedExp extends FloatMatrix {
2 26 Feb 07 jari 1256
2 26 Feb 07 jari 1257   
2 26 Feb 07 jari 1258
2 26 Feb 07 jari 1259   FloatMatrix origMatrix;
2 26 Feb 07 jari 1260
2 26 Feb 07 jari 1261   int removedExperiment;
2 26 Feb 07 jari 1262
2 26 Feb 07 jari 1263   
2 26 Feb 07 jari 1264
2 26 Feb 07 jari 1265   public JackknifedMatrixBySpecifiedExp(FloatMatrix origMatrix, int removedExperiment) {
2 26 Feb 07 jari 1266
2 26 Feb 07 jari 1267       
2 26 Feb 07 jari 1268
2 26 Feb 07 jari 1269       super(origMatrix.m, origMatrix.n - 1);
2 26 Feb 07 jari 1270
2 26 Feb 07 jari 1271       
2 26 Feb 07 jari 1272
2 26 Feb 07 jari 1273       this.origMatrix = origMatrix;
2 26 Feb 07 jari 1274
2 26 Feb 07 jari 1275       this.removedExperiment = removedExperiment;
2 26 Feb 07 jari 1276
2 26 Feb 07 jari 1277       int jackMatrixExpIndex;
2 26 Feb 07 jari 1278
2 26 Feb 07 jari 1279       
2 26 Feb 07 jari 1280
2 26 Feb 07 jari 1281       for (int i = 0; i < m; i++) {
2 26 Feb 07 jari 1282
2 26 Feb 07 jari 1283     
2 26 Feb 07 jari 1284
2 26 Feb 07 jari 1285     jackMatrixExpIndex = 0;
2 26 Feb 07 jari 1286
2 26 Feb 07 jari 1287     
2 26 Feb 07 jari 1288
2 26 Feb 07 jari 1289     for (int j = 0; j < origMatrix.n; j++) {
2 26 Feb 07 jari 1290
2 26 Feb 07 jari 1291         if (j != removedExperiment) {
2 26 Feb 07 jari 1292
2 26 Feb 07 jari 1293       A[i][jackMatrixExpIndex] = origMatrix.A[i][j];
2 26 Feb 07 jari 1294
2 26 Feb 07 jari 1295       jackMatrixExpIndex++;
2 26 Feb 07 jari 1296
2 26 Feb 07 jari 1297         }
2 26 Feb 07 jari 1298
2 26 Feb 07 jari 1299     }
2 26 Feb 07 jari 1300
2 26 Feb 07 jari 1301       }
2 26 Feb 07 jari 1302
2 26 Feb 07 jari 1303   } // end member class constructor
2 26 Feb 07 jari 1304
2 26 Feb 07 jari 1305   
2 26 Feb 07 jari 1306
2 26 Feb 07 jari 1307   
2 26 Feb 07 jari 1308
2 26 Feb 07 jari 1309     } // end JackknifedMatrixBySpecifiedExp class def
2 26 Feb 07 jari 1310
2 26 Feb 07 jari 1311     
2 26 Feb 07 jari 1312
2 26 Feb 07 jari 1313 } // end outer class def
2 26 Feb 07 jari 1314