mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/CastClust.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: CastClust.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.4 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:45 $
2 26 Feb 07 jari 9  * $Author: caliente $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.BorderLayout;
2 26 Feb 07 jari 15 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 16 import java.awt.event.ActionListener;
2 26 Feb 07 jari 17 import java.util.Vector;
2 26 Feb 07 jari 18
2 26 Feb 07 jari 19 import javax.swing.JButton;
2 26 Feb 07 jari 20 import javax.swing.JFrame;
2 26 Feb 07 jari 21 import javax.swing.JPanel;
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 27 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 35 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 36 import org.tigr.util.awt.ProgressDialog;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 public class CastClust extends AbstractAlgorithm {
2 26 Feb 07 jari 39     private boolean stop = false;
2 26 Feb 07 jari 40     public boolean runInside = false;
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     private boolean castGenes;
2 26 Feb 07 jari 45     
2 26 Feb 07 jari 46     private FloatMatrix expMatrix;
2 26 Feb 07 jari 47     
2 26 Feb 07 jari 48     private FloatMatrix SimMatrix;
2 26 Feb 07 jari 49     private CTCluster unassigned;
2 26 Feb 07 jari 50     private CTCluster openCluster;
2 26 Feb 07 jari 51     private int CurrentCluster;
2 26 Feb 07 jari 52     private int m; // m = number_of_samples
2 26 Feb 07 jari 53     private int n; //n = number_of_genes
2 26 Feb 07 jari 54     private int maxGene, minGene;
2 26 Feb 07 jari 55     private float maxA, minA;
2 26 Feb 07 jari 56     private int maxIndex, minIndex;
2 26 Feb 07 jari 57     public int clusterCount;
2 26 Feb 07 jari 58     private boolean changesOccur;
2 26 Feb 07 jari 59     private boolean pearson=false;
2 26 Feb 07 jari 60     public float threshold=0.5f;
2 26 Feb 07 jari 61     
2 26 Feb 07 jari 62     private long StartTime;
2 26 Feb 07 jari 63     private long CalculationTime;
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     private boolean Stop;
2 26 Feb 07 jari 66     private int DistanceFunction;
2 26 Feb 07 jari 67     
2 26 Feb 07 jari 68     private ProgressDialog PD;
2 26 Feb 07 jari 69     
2 26 Feb 07 jari 70     private double zeroValue;
2 26 Feb 07 jari 71
2 26 Feb 07 jari 72     private int hcl_function;
2 26 Feb 07 jari 73     private boolean hcl_absolute;    
2 26 Feb 07 jari 74     
2 26 Feb 07 jari 75     public CastClust() {
2 26 Feb 07 jari 76     }
2 26 Feb 07 jari 77     
2 26 Feb 07 jari 78     public CastClust(boolean runInside) {
2 26 Feb 07 jari 79         this.runInside = runInside;
2 26 Feb 07 jari 80     }
2 26 Feb 07 jari 81     
2 26 Feb 07 jari 82     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 83         clusterCount = 0;
2 26 Feb 07 jari 84         AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 85         function = map.getInt("distance-function", EUCLIDEAN);
2 26 Feb 07 jari 86         factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 87         absolute = map.getBoolean("distance-absolute", false);
2 26 Feb 07 jari 88         threshold = map.getFloat("threshold", 0.5f);
2 26 Feb 07 jari 89         castGenes = map.getBoolean("cast-cluster-genes", true);
2 26 Feb 07 jari 90
2 26 Feb 07 jari 91         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 92         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);        
2 26 Feb 07 jari 93         
2 26 Feb 07 jari 94         boolean hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 95         int method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 96         boolean calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 97         boolean calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 98         this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 99         n = this.expMatrix.getRowDimension(); //n = number_of_genes
2 26 Feb 07 jari 100         m = this.expMatrix.getColumnDimension();//m = number_of_samples
2 26 Feb 07 jari 101         SimMatrix = new FloatMatrix(n,n);
2 26 Feb 07 jari 102         
2 26 Feb 07 jari 103         JFrame dummyFrame = new JFrame();
2 26 Feb 07 jari 104         PD = new ProgressDialog(dummyFrame, "CAST Progression", false, 4);
2 26 Feb 07 jari 105
2 26 Feb 07 jari 106         java.awt.Dimension screenDim = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 107         PD.setSize(450,255);
2 26 Feb 07 jari 108         PD.setLocation((screenDim.width - PD.getWidth())/2, (screenDim.height - PD.getHeight())/2);
2 26 Feb 07 jari 109       
2 26 Feb 07 jari 110         JButton abortButton = new JButton(" Cancel ");
2 26 Feb 07 jari 111         abortButton.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
2 26 Feb 07 jari 112         abortButton.setFocusPainted(false);               
2 26 Feb 07 jari 113         abortButton.addActionListener(new ActionListener() {
2 26 Feb 07 jari 114             public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 115                 stop = true;
2 26 Feb 07 jari 116                 PD.dismiss();
2 26 Feb 07 jari 117             }
2 26 Feb 07 jari 118         });
2 26 Feb 07 jari 119        
2 26 Feb 07 jari 120         JPanel progressPanel = PD.getLabelPanel();
2 26 Feb 07 jari 121         JPanel superPanel = new JPanel();
2 26 Feb 07 jari 122         superPanel.setLayout(new BorderLayout());
2 26 Feb 07 jari 123         superPanel.add(progressPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 124         superPanel.add(abortButton, BorderLayout.SOUTH);
2 26 Feb 07 jari 125         PD.setMainPanel(superPanel);
2 26 Feb 07 jari 126         
2 26 Feb 07 jari 127         CTCluster[] clusters = calculate(runInside);
2 26 Feb 07 jari 128         
2 26 Feb 07 jari 129         for (int i = 0; i < clusters.length; i++) {
2 26 Feb 07 jari 130             if (clusters[i] == null) System.out.println("Null Cluster: " + i);
2 26 Feb 07 jari 131         }
2 26 Feb 07 jari 132         
2 26 Feb 07 jari 133         FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 134         FloatMatrix variances = getVariances(clusters, means);
2 26 Feb 07 jari 135         
2 26 Feb 07 jari 136         AlgorithmEvent event = null;
2 26 Feb 07 jari 137         if (hierarchical_tree) {
2 26 Feb 07 jari 138             event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 139             fireValueChanged(event);
2 26 Feb 07 jari 140             event.setIntValue(0);
2 26 Feb 07 jari 141             event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 142             fireValueChanged(event);
2 26 Feb 07 jari 143         }
2 26 Feb 07 jari 144         
2 26 Feb 07 jari 145         Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 146         NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 147         int[] features;
2 26 Feb 07 jari 148         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 149             if (stop) {
2 26 Feb 07 jari 150                 throw new AbortException();
2 26 Feb 07 jari 151             }
2 26 Feb 07 jari 152             features = convert2int(clusters[i].genes);
2 26 Feb 07 jari 153             Node node = new Node(features);
2 26 Feb 07 jari 154             nodeList.addNode(node);
2 26 Feb 07 jari 155             if (hierarchical_tree) {
2 26 Feb 07 jari 156                 node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 157                 event.setIntValue(i+1);
2 26 Feb 07 jari 158                 fireValueChanged(event);
2 26 Feb 07 jari 159             }
2 26 Feb 07 jari 160         }
2 26 Feb 07 jari 161         
2 26 Feb 07 jari 162         // prepare the result
2 26 Feb 07 jari 163         AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 164         result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 165         result.addParam("number-of-clusters", String.valueOf(clusters.length));
2 26 Feb 07 jari 166         result.addMatrix("clusters_means", means);
2 26 Feb 07 jari 167         result.addMatrix("clusters_variances", variances);
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     public void abort() {
2 26 Feb 07 jari 174         stop = true;
2 26 Feb 07 jari 175     }
2 26 Feb 07 jari 176     
2 26 Feb 07 jari 177     
2 26 Feb 07 jari 178     
2 26 Feb 07 jari 179     CTCluster[] calculate(boolean runInside) {
2 26 Feb 07 jari 180         
2 26 Feb 07 jari 181         StartTime = System.currentTimeMillis();
2 26 Feb 07 jari 182         
2 26 Feb 07 jari 183         if (! runInside) {
2 26 Feb 07 jari 184             
2 26 Feb 07 jari 185             PD.setMessage(0, clusterCount+" clusters created.");
2 26 Feb 07 jari 186             if(this.castGenes){
2 26 Feb 07 jari 187                 PD.setMessage(1, 0+" genes have been assigned to clusters.");
2 26 Feb 07 jari 188                 PD.setMessage(2, n+" genes left to be assigned to clusters.");
2 26 Feb 07 jari 189             }
2 26 Feb 07 jari 190             else{
2 26 Feb 07 jari 191                 PD.setMessage(1, 0+" experiments have been assigned to clusters.");
2 26 Feb 07 jari 192                 PD.setMessage(2, n+" experiments left to be assigned to clusters.");
2 26 Feb 07 jari 193             }
2 26 Feb 07 jari 194             PD.setTimerLabel(3,"Running for ", " seconds.", 1000);
2 26 Feb 07 jari 195             PD.setVisible(true);
2 26 Feb 07 jari 196         }
2 26 Feb 07 jari 197         
2 26 Feb 07 jari 198         getSimMatrix();
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         CTCluster[] clusters = new CTCluster[n];
2 26 Feb 07 jari 201         unassigned = new CTCluster();
2 26 Feb 07 jari 202         for (int i = 0; i < n; i++) {
2 26 Feb 07 jari 203             unassigned.add(i);
2 26 Feb 07 jari 204         }
2 26 Feb 07 jari 205         
2 26 Feb 07 jari 206         while (unassigned.count != 0) {
2 26 Feb 07 jari 207             // start a new cluster
2 26 Feb 07 jari 208             openCluster = new CTCluster();
2 26 Feb 07 jari 209             
2 26 Feb 07 jari 210             // reset affinity
2 26 Feb 07 jari 211             for (int i = 0; i < unassigned.count; i++) {
2 26 Feb 07 jari 212                 (unassigned.affinity).set(i,new Float(0));
2 26 Feb 07 jari 213             }
2 26 Feb 07 jari 214             
2 26 Feb 07 jari 215             do{
2 26 Feb 07 jari 216                 changesOccur = false;
2 26 Feb 07 jari 217                 float theFloat;
2 26 Feb 07 jari 218                 
2 26 Feb 07 jari 219                 // ADD:
2 26 Feb 07 jari 220                 while (getMaxAffinityGene() && (maxA >= threshold * openCluster.count)) {
2 26 Feb 07 jari 221                     //System.out.println("adding..."+maxA);
2 26 Feb 07 jari 222                     unassigned.move(maxIndex, openCluster);
2 26 Feb 07 jari 223                     
2 26 Feb 07 jari 224                     for (int i = 0; i < unassigned.count; i++) {
2 26 Feb 07 jari 225                         theFloat = ((Float) unassigned.affinity.elementAt(i)).floatValue();
2 26 Feb 07 jari 226                         theFloat += SimMatrix.get(((Integer)((unassigned.genes).elementAt(i))).intValue(), maxGene);
2 26 Feb 07 jari 227                         unassigned.affinity.setElementAt((new Float(theFloat)), i);
2 26 Feb 07 jari 228                         //System.out.println("Add, unassigned: " + theFloat);
2 26 Feb 07 jari 229                     }
2 26 Feb 07 jari 230                     for (int i = 0; i < openCluster.count; i++) {
2 26 Feb 07 jari 231                         theFloat = ((Float) openCluster.affinity.elementAt(i)).floatValue();
2 26 Feb 07 jari 232                         theFloat += SimMatrix.get(((Integer)((openCluster.genes).elementAt(i))).intValue(), maxGene);
2 26 Feb 07 jari 233                         openCluster.affinity.setElementAt((new Float(theFloat)), i);
2 26 Feb 07 jari 234                         //System.out.println("Add, openCluster: " + theFloat);
2 26 Feb 07 jari 235                     }
2 26 Feb 07 jari 236                     changesOccur = true;
2 26 Feb 07 jari 237                     getMaxAffinityGene();
2 26 Feb 07 jari 238                     
2 26 Feb 07 jari 239                     //System.out.println("+ unassigned = " + unassigned.count);
2 26 Feb 07 jari 240                     //System.out.println("+ openCluster = " + openCluster.count);
2 26 Feb 07 jari 241                     
2 26 Feb 07 jari 242                 }
2 26 Feb 07 jari 243                 
2 26 Feb 07 jari 244                 // REMOVE:
2 26 Feb 07 jari 245                 if (minA != zeroValue) {
2 26 Feb 07 jari 246                     while (getMinAffinityGene() && (minA < threshold * openCluster.count)) {
2 26 Feb 07 jari 247                         
2 26 Feb 07 jari 248                         //System.out.println("removing..."+minA);
2 26 Feb 07 jari 249                         openCluster.move(minIndex, unassigned);
2 26 Feb 07 jari 250                         
2 26 Feb 07 jari 251                         for (int i = 0; i < unassigned.count; i++) {
2 26 Feb 07 jari 252                             theFloat = ((Float) unassigned.affinity.elementAt(i)).floatValue();
2 26 Feb 07 jari 253                             theFloat -= SimMatrix.get(((Integer)((unassigned.genes).elementAt(i))).intValue(), minGene);
2 26 Feb 07 jari 254                             unassigned.affinity.setElementAt((new Float(theFloat)), i);
2 26 Feb 07 jari 255                             //System.out.println("Remove, unassigned: " + theFloat);
2 26 Feb 07 jari 256                         }
2 26 Feb 07 jari 257                         for (int i = 0; i < openCluster.count; i++) {
2 26 Feb 07 jari 258                             theFloat = ((Float) openCluster.affinity.elementAt(i)).floatValue();
2 26 Feb 07 jari 259                             theFloat -= SimMatrix.get(((Integer)((openCluster.genes).elementAt(i))).intValue(), minGene);
2 26 Feb 07 jari 260                             openCluster.affinity.setElementAt((new Float(theFloat)), i);
2 26 Feb 07 jari 261                             //System.out.println("Remove, openCluster: " + theFloat);
2 26 Feb 07 jari 262                         }
2 26 Feb 07 jari 263                         changesOccur = true;
2 26 Feb 07 jari 264                         getMinAffinityGene();
2 26 Feb 07 jari 265                         
2 26 Feb 07 jari 266                         //System.out.println("- unassigned = " + unassigned.count);
2 26 Feb 07 jari 267                         //System.out.println("- openCluster = " + openCluster.count);
2 26 Feb 07 jari 268                         
2 26 Feb 07 jari 269                     }
2 26 Feb 07 jari 270                 }
2 26 Feb 07 jari 271                 
2 26 Feb 07 jari 272             } while (changesOccur);
2 26 Feb 07 jari 273             
2 26 Feb 07 jari 274             //System.out.println("n = " + n);
2 26 Feb 07 jari 275             //System.out.println("Currently: " + clusterCount);
2 26 Feb 07 jari 276             
2 26 Feb 07 jari 277             if (! runInside) {
2 26 Feb 07 jari 278                 PD.setMessage(0, clusterCount+" clusters created.");
2 26 Feb 07 jari 279                 if(this.castGenes){
2 26 Feb 07 jari 280                     PD.setMessage(1, (n-unassigned.count)+" genes have been assigned to clusters.");
2 26 Feb 07 jari 281                     PD.setMessage(2, unassigned.count+" genes left to be assigned to clusters.");
2 26 Feb 07 jari 282                 }
2 26 Feb 07 jari 283                 else{
2 26 Feb 07 jari 284                     PD.setMessage(1, (n-unassigned.count)+" experiments have been assigned to clusters.");
2 26 Feb 07 jari 285                     PD.setMessage(2, unassigned.count+" experiments left to be assigned to clusters.");
2 26 Feb 07 jari 286                 }
2 26 Feb 07 jari 287             }
2 26 Feb 07 jari 288             
2 26 Feb 07 jari 289             if (clusterCount < n) clusters[clusterCount++] = openCluster;
2 26 Feb 07 jari 290             openCluster = null;
2 26 Feb 07 jari 291         }
2 26 Feb 07 jari 292         
2 26 Feb 07 jari 293         if (! runInside) {PD.dismiss();}
2 26 Feb 07 jari 294         
2 26 Feb 07 jari 295         //System.out.println(clusterCount + " clusters found");
2 26 Feb 07 jari 296         //MakeCluster();
2 26 Feb 07 jari 297         
2 26 Feb 07 jari 298         CTCluster[] trueClusters = new CTCluster[clusterCount];
2 26 Feb 07 jari 299         for (int i = 0; i < clusterCount; i++) {
2 26 Feb 07 jari 300             trueClusters[i] = clusters[i];
2 26 Feb 07 jari 301         }
2 26 Feb 07 jari 302         
2 26 Feb 07 jari 303         //GeneClusterPointers=new GeneCluster[clusterCount];
2 26 Feb 07 jari 304         CalculationTime=System.currentTimeMillis()-StartTime;
2 26 Feb 07 jari 305         
2 26 Feb 07 jari 306         //return clusters;
2 26 Feb 07 jari 307         return trueClusters;
2 26 Feb 07 jari 308     }
2 26 Feb 07 jari 309     
2 26 Feb 07 jari 310     
2 26 Feb 07 jari 311     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 312         NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 313         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 314         FloatMatrix experiment;
2 26 Feb 07 jari 315         if(castGenes)
2 26 Feb 07 jari 316             experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 317         else
2 26 Feb 07 jari 318             experiment = getSubExperimentReducedCols(this.expMatrix, features);
2 26 Feb 07 jari 319         data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 320         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 321         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 322         data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 323         HCL hcl = new HCL();
2 26 Feb 07 jari 324         AlgorithmData result;
2 26 Feb 07 jari 325         if (genes) {
2 26 Feb 07 jari 326             data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 327             result = hcl.execute(data);
2 26 Feb 07 jari 328             validate(result);
2 26 Feb 07 jari 329             addNodeValues(nodeList, result);
2 26 Feb 07 jari 330         }
2 26 Feb 07 jari 331         if (experiments) {
2 26 Feb 07 jari 332             data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 333             result = hcl.execute(data);
2 26 Feb 07 jari 334             validate(result);
2 26 Feb 07 jari 335             addNodeValues(nodeList, result);
2 26 Feb 07 jari 336         }
2 26 Feb 07 jari 337         return nodeList;
2 26 Feb 07 jari 338     }
2 26 Feb 07 jari 339     
2 26 Feb 07 jari 340     
2 26 Feb 07 jari 341     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 342         target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 343         target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 344         target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 345         target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 346     }
2 26 Feb 07 jari 347     
2 26 Feb 07 jari 348     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 349         FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 350         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 351             subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 352         }
2 26 Feb 07 jari 353         return subExperiment;
2 26 Feb 07 jari 354     }
2 26 Feb 07 jari 355     
2 26 Feb 07 jari 356     /**
2 26 Feb 07 jari 357      *  Creates a matrix with reduced columns (samples) as during experiment clustering
2 26 Feb 07 jari 358      */
2 26 Feb 07 jari 359     private FloatMatrix getSubExperimentReducedCols(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 360         FloatMatrix copyMatrix = experiment.copy();
2 26 Feb 07 jari 361         FloatMatrix subExperiment = new FloatMatrix(features.length, copyMatrix.getColumnDimension());
2 26 Feb 07 jari 362         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 363             subExperiment.A[i] = copyMatrix.A[features[i]];
2 26 Feb 07 jari 364         }
2 26 Feb 07 jari 365         subExperiment = subExperiment.transpose();
2 26 Feb 07 jari 366         return subExperiment;
2 26 Feb 07 jari 367     }
2 26 Feb 07 jari 368     
2 26 Feb 07 jari 369     /**
2 26 Feb 07 jari 370      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 371      * @throws AlgorithmException, if the result is incorrect.
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         if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 375             throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 376         }
2 26 Feb 07 jari 377         if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 378             throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 379         }
2 26 Feb 07 jari 380         if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 381             throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 382         }
2 26 Feb 07 jari 383         if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 384             throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 385         }
2 26 Feb 07 jari 386     }
2 26 Feb 07 jari 387     
2 26 Feb 07 jari 388     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 389         int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 390         for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 391             int_matrix[i] = (int)((Integer)source.get(i)).intValue();
2 26 Feb 07 jari 392         }
2 26 Feb 07 jari 393         return int_matrix;
2 26 Feb 07 jari 394     }
2 26 Feb 07 jari 395     
2 26 Feb 07 jari 396     
2 26 Feb 07 jari 397     synchronized float getDistance(int gene1, int gene2) {
2 26 Feb 07 jari 398         double distance = 0;
2 26 Feb 07 jari 399         
2 26 Feb 07 jari 400         if((function == Algorithm.DEFAULT)||(function == Algorithm.COSINE)
2 26 Feb 07 jari 401         ||(function == Algorithm.COVARIANCE)||(function == Algorithm.EUCLIDEAN)
2 26 Feb 07 jari 402         ||(function == Algorithm.DOTPRODUCT)||(function == Algorithm.MANHATTAN)
2 26 Feb 07 jari 403         ||(function == Algorithm.SPEARMANRANK)||(function == Algorithm.KENDALLSTAU)
2 26 Feb 07 jari 404         ||(function == Algorithm.MUTUALINFORMATION)){
2 26 Feb 07 jari 405             // ONLY EUCLIDEAN OR PEARSON IS USED IN THE CALCULATION!!!!
2 26 Feb 07 jari 406             distance = ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, Algorithm.EUCLIDEAN, factor, absolute);
2 26 Feb 07 jari 407             
2 26 Feb 07 jari 408         }
2 26 Feb 07 jari 409         else if((function == Algorithm.PEARSON)||(function == Algorithm.PEARSONUNCENTERED)
2 26 Feb 07 jari 410         ||(function == Algorithm.PEARSONSQARED)) {
2 26 Feb 07 jari 411             
2 26 Feb 07 jari 412             if (absolute) {
2 26 Feb 07 jari 413                 distance = Math.abs(ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, Algorithm.PEARSON, factor, absolute));
2 26 Feb 07 jari 414             } else {
2 26 Feb 07 jari 415                 distance = ExperimentUtil.geneDistance(expMatrix, null, gene1, gene2, Algorithm.PEARSON, factor, absolute);
2 26 Feb 07 jari 416             }
2 26 Feb 07 jari 417         }
2 26 Feb 07 jari 418         
2 26 Feb 07 jari 419         //System.out.println(distance);
2 26 Feb 07 jari 420         
2 26 Feb 07 jari 421         return (float) distance;
2 26 Feb 07 jari 422     }
2 26 Feb 07 jari 423     
2 26 Feb 07 jari 424     
2 26 Feb 07 jari 425     synchronized void getSimMatrix(){//calculate the similarity matrix
2 26 Feb 07 jari 426         int i,j;
2 26 Feb 07 jari 427         float sim;
2 26 Feb 07 jari 428         float maxSim = 0;
2 26 Feb 07 jari 429         
2 26 Feb 07 jari 430         if((function == Algorithm.PEARSON)||(function == Algorithm.PEARSONUNCENTERED)
2 26 Feb 07 jari 431         ||(function == Algorithm.PEARSONSQARED)) {
2 26 Feb 07 jari 432             pearson=true;
2 26 Feb 07 jari 433         }
2 26 Feb 07 jari 434         
2 26 Feb 07 jari 435         if (absolute) {
2 26 Feb 07 jari 436             zeroValue = 0;
2 26 Feb 07 jari 437         } else {
2 26 Feb 07 jari 438             zeroValue = 0.5;
2 26 Feb 07 jari 439         }
2 26 Feb 07 jari 440         
2 26 Feb 07 jari 441         if(pearson){
2 26 Feb 07 jari 442             for (i=0;i<n;i++){
2 26 Feb 07 jari 443                 for(j=0;j<n;j++){
2 26 Feb 07 jari 444                     sim=getDistance(i,j);
2 26 Feb 07 jari 445                     if (!absolute)
2 26 Feb 07 jari 446                         sim = (float)(1.0 - (sim + 1.0) / 2.0);
2 26 Feb 07 jari 447                     else
2 26 Feb 07 jari 448                         sim = (float)((sim + 1.0)/2.0);
2 26 Feb 07 jari 449                     SimMatrix.set(i,j, sim);
2 26 Feb 07 jari 450                 }
2 26 Feb 07 jari 451             }
2 26 Feb 07 jari 452             
2 26 Feb 07 jari 453         }else{
2 26 Feb 07 jari 454             
2 26 Feb 07 jari 455             for (i=0;i<n;i++){
2 26 Feb 07 jari 456                 for(j=0;j<n;j++){
2 26 Feb 07 jari 457                     sim=getDistance(i,j);
2 26 Feb 07 jari 458                     if (sim > maxSim) maxSim = sim;
2 26 Feb 07 jari 459                 }
2 26 Feb 07 jari 460             }
2 26 Feb 07 jari 461             
2 26 Feb 07 jari 462             for (i=0;i<n;i++){
2 26 Feb 07 jari 463                 for(j=0;j<n;j++){
2 26 Feb 07 jari 464                     sim=getDistance(i,j);
2 26 Feb 07 jari 465                     sim = (float) 1 - (sim / maxSim);
2 26 Feb 07 jari 466                     SimMatrix.set(i,j, sim);
2 26 Feb 07 jari 467                 }
2 26 Feb 07 jari 468             }
2 26 Feb 07 jari 469         }
2 26 Feb 07 jari 470     }
2 26 Feb 07 jari 471     
2 26 Feb 07 jari 472     
2 26 Feb 07 jari 473     protected boolean getMaxAffinityGene() {
2 26 Feb 07 jari 474         
2 26 Feb 07 jari 475         if (unassigned.count == 0)
2 26 Feb 07 jari 476             return false;
2 26 Feb 07 jari 477         
2 26 Feb 07 jari 478         maxIndex = 0;
2 26 Feb 07 jari 479         maxA = ((Float)((unassigned.affinity).elementAt(0))).floatValue();
2 26 Feb 07 jari 480         for (int i = 1; i < unassigned.count; i++) {
2 26 Feb 07 jari 481             if (((Float)((unassigned.affinity).elementAt(i))).floatValue()> maxA) {
2 26 Feb 07 jari 482                 maxA = ((Float)((unassigned.affinity).elementAt(i))).floatValue();
2 26 Feb 07 jari 483                 maxIndex = i;
2 26 Feb 07 jari 484             }
2 26 Feb 07 jari 485         }
2 26 Feb 07 jari 486         maxGene =((Integer)((unassigned.genes).elementAt(maxIndex))).intValue();
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     protected boolean getMinAffinityGene() {
2 26 Feb 07 jari 491         if (openCluster.count == 0)
2 26 Feb 07 jari 492             return false;
2 26 Feb 07 jari 493         
2 26 Feb 07 jari 494         minIndex = 0;
2 26 Feb 07 jari 495         minA = ((Float)((openCluster.affinity).elementAt(0))).floatValue();
2 26 Feb 07 jari 496         for (int i = 1; i < openCluster.count; i++) {
2 26 Feb 07 jari 497             if (((Float)((openCluster.affinity).elementAt(i))).floatValue() < minA) {
2 26 Feb 07 jari 498                 minA = ((Float)((openCluster.affinity).elementAt(i))).floatValue();
2 26 Feb 07 jari 499                 minIndex = i;
2 26 Feb 07 jari 500             }
2 26 Feb 07 jari 501         }
2 26 Feb 07 jari 502         minGene = ((Integer)((openCluster.genes).elementAt(minIndex))).intValue();
2 26 Feb 07 jari 503         return true;
2 26 Feb 07 jari 504     }
2 26 Feb 07 jari 505     
2 26 Feb 07 jari 506     //inner class
2 26 Feb 07 jari 507     private class CTCluster{
2 26 Feb 07 jari 508         int count=0;
2 26 Feb 07 jari 509         Vector genes;
2 26 Feb 07 jari 510         Vector affinity;
2 26 Feb 07 jari 511         
2 26 Feb 07 jari 512         public CTCluster() {
2 26 Feb 07 jari 513             genes=new Vector();
2 26 Feb 07 jari 514             affinity = new Vector();
2 26 Feb 07 jari 515             
2 26 Feb 07 jari 516         }
2 26 Feb 07 jari 517         
2 26 Feb 07 jari 518         public Vector fGenes() {
2 26 Feb 07 jari 519             Vector floatVector = new Vector();
2 26 Feb 07 jari 520             
2 26 Feb 07 jari 521             for (int i = 0; i < genes.size(); i++) {
2 26 Feb 07 jari 522                 floatVector.addElement(new Float(((Integer) genes.elementAt(i)).intValue()));
2 26 Feb 07 jari 523             }
2 26 Feb 07 jari 524             
2 26 Feb 07 jari 525             return floatVector;
2 26 Feb 07 jari 526         }
2 26 Feb 07 jari 527         
2 26 Feb 07 jari 528         public void add(int g) {
2 26 Feb 07 jari 529             add(g, 0);
2 26 Feb 07 jari 530         }
2 26 Feb 07 jari 531         
2 26 Feb 07 jari 532         public void add(int g, float a) {
2 26 Feb 07 jari 533             genes.add(count,new Integer(g));
2 26 Feb 07 jari 534             affinity.add(count,new Float(a));
2 26 Feb 07 jari 535             count++;
2 26 Feb 07 jari 536             
2 26 Feb 07 jari 537         }
2 26 Feb 07 jari 538         
2 26 Feb 07 jari 539         
2 26 Feb 07 jari 540         public void remove(int g) {
2 26 Feb 07 jari 541             int index = -1;
2 26 Feb 07 jari 542             for (int i = 1; i <= count; i++) {
2 26 Feb 07 jari 543                 if (((Integer)genes.elementAt(i)).intValue() == g) {
2 26 Feb 07 jari 544                     index = i;
2 26 Feb 07 jari 545                     break;
2 26 Feb 07 jari 546                 }
2 26 Feb 07 jari 547             }
2 26 Feb 07 jari 548             if (index == -1) {
2 26 Feb 07 jari 549                 System.err.println("cluster doesn't contain " + g);
2 26 Feb 07 jari 550                 System.exit(1);
2 26 Feb 07 jari 551             }
2 26 Feb 07 jari 552             removeIndex(index);
2 26 Feb 07 jari 553         }
2 26 Feb 07 jari 554         
2 26 Feb 07 jari 555         
2 26 Feb 07 jari 556         public void removeIndex(int index) {
2 26 Feb 07 jari 557             genes.remove(index);
2 26 Feb 07 jari 558             affinity.remove(index);
2 26 Feb 07 jari 559             count--;
2 26 Feb 07 jari 560         }
2 26 Feb 07 jari 561         
2 26 Feb 07 jari 562         
2 26 Feb 07 jari 563         public void move(int index, CTCluster c){
2 26 Feb 07 jari 564             c.add(((Integer)(genes.elementAt(index))).intValue(), ((Float)(affinity.elementAt(index))).floatValue());
2 26 Feb 07 jari 565             removeIndex(index);
2 26 Feb 07 jari 566         }
2 26 Feb 07 jari 567         
2 26 Feb 07 jari 568         protected FloatMatrix getMean() {
2 26 Feb 07 jari 569             FloatMatrix mean = new FloatMatrix(1, m);
2 26 Feb 07 jari 570             float currentMean;
2 26 Feb 07 jari 571             int k = genes.size();
2 26 Feb 07 jari 572             int denom;
2 26 Feb 07 jari 573             float value;
2 26 Feb 07 jari 574             for (int i=0; i<m; i++) {
2 26 Feb 07 jari 575                 currentMean = 0f;
2 26 Feb 07 jari 576                 denom = 0;
2 26 Feb 07 jari 577                 for (int j=0; j<k; j++) {
2 26 Feb 07 jari 578                     value = expMatrix.get(((Integer) genes.get(j)).intValue(), i);
2 26 Feb 07 jari 579                     if (!Float.isNaN(value)) {
2 26 Feb 07 jari 580                         currentMean += value;
2 26 Feb 07 jari 581                         denom++;
2 26 Feb 07 jari 582                     }
2 26 Feb 07 jari 583                 }
2 26 Feb 07 jari 584                 mean.set(0, i, currentMean/(float)denom);
2 26 Feb 07 jari 585             }
2 26 Feb 07 jari 586             
2 26 Feb 07 jari 587             return mean;
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     private FloatMatrix getMeans(CTCluster[] clusters) {
2 26 Feb 07 jari 593         FloatMatrix means = new FloatMatrix(clusters.length, m);
2 26 Feb 07 jari 594         FloatMatrix mean;
2 26 Feb 07 jari 595         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 596             mean = clusters[i].getMean();
2 26 Feb 07 jari 597             means.A[i] = mean.A[0];
2 26 Feb 07 jari 598         }
2 26 Feb 07 jari 599         return means;
2 26 Feb 07 jari 600     }
2 26 Feb 07 jari 601     
2 26 Feb 07 jari 602     private FloatMatrix getVariances(CTCluster[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 603         final int rows = means.getRowDimension();
2 26 Feb 07 jari 604         final int columns = means.getColumnDimension();
2 26 Feb 07 jari 605         FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 606         for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 607             for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 608                 variances.set(row, column, getSampleVariance(clusters[row], column, means.get(row, column)));
2 26 Feb 07 jari 609             }
2 26 Feb 07 jari 610         }
2 26 Feb 07 jari 611         return variances;
2 26 Feb 07 jari 612     }
2 26 Feb 07 jari 613     
2 26 Feb 07 jari 614     int validN;
2 26 Feb 07 jari 615     
2 26 Feb 07 jari 616     private float getSampleNormalizedSum(CTCluster cluster, int column, float mean) {
2 26 Feb 07 jari 617         final int size = cluster.genes.size();
2 26 Feb 07 jari 618         float sum = 0f;
2 26 Feb 07 jari 619         float value;
2 26 Feb 07 jari 620         validN = 0;
2 26 Feb 07 jari 621         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 622             value = expMatrix.get(((Integer)cluster.genes.get(i)).intValue(), column);
2 26 Feb 07 jari 623             if (!Float.isNaN(value)) {
2 26 Feb 07 jari 624                 sum += Math.pow(value-mean, 2);
2 26 Feb 07 jari 625                 validN++;
2 26 Feb 07 jari 626             }
2 26 Feb 07 jari 627         }
2 26 Feb 07 jari 628         return sum;
2 26 Feb 07 jari 629     }
2 26 Feb 07 jari 630     
2 26 Feb 07 jari 631     private float getSampleVariance(CTCluster cluster, int column, float mean) {
2 26 Feb 07 jari 632         return(float)Math.sqrt(getSampleNormalizedSum(cluster, column, mean)/(float)(validN-1));
2 26 Feb 07 jari 633     }
2 26 Feb 07 jari 634     
2 26 Feb 07 jari 635     
2 26 Feb 07 jari 636 }