mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/kmc/KMCGUI.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: KMCGUI.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.12 $
2 26 Feb 07 jari 8  * $Date: 2006/06/30 15:20:56 $
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 package org.tigr.microarray.mev.cluster.gui.impl.kmc;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 15 import java.awt.event.WindowEvent;
2 26 Feb 07 jari 16 import java.util.Arrays;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 import javax.swing.JFrame;
2 26 Feb 07 jari 19 import javax.swing.JOptionPane;
2 26 Feb 07 jari 20 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 21
2 26 Feb 07 jari 22 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 23
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 27 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.gui.IClusterGUI;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.gui.IDistanceMenu;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.gui.helpers.CentroidUserObject;
2 26 Feb 07 jari 32
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmListener;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Monitor;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Progress;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.DialogListener;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.impl.hcl.HCLInitDialog;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 48 import org.tigr.microarray.mev.cluster.gui.impl.hcl.HCLViewer;
2 26 Feb 07 jari 49 import org.tigr.microarray.mev.cluster.gui.impl.hcl.HCLTreeData;
2 26 Feb 07 jari 50 import org.tigr.microarray.mev.cluster.gui.impl.hcl.HCLGUI;
2 26 Feb 07 jari 51 import org.tigr.microarray.mev.cluster.gui.helpers.ClusterTableViewer;
2 26 Feb 07 jari 52 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentClusterTableViewer;
2 26 Feb 07 jari 53 import org.tigr.microarray.mev.cluster.gui.helpers.ExperimentClusterCentroidViewer;
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55
2 26 Feb 07 jari 56 import org.tigr.microarray.mev.script.scriptGUI.IScriptGUI;
2 26 Feb 07 jari 57
2 26 Feb 07 jari 58 public class KMCGUI implements IClusterGUI, IScriptGUI {
2 26 Feb 07 jari 59     
2 26 Feb 07 jari 60     private Algorithm algorithm;
2 26 Feb 07 jari 61     private Progress progress;
2 26 Feb 07 jari 62     private Monitor monitor;
2 26 Feb 07 jari 63     
2 26 Feb 07 jari 64     private Experiment experiment;
2 26 Feb 07 jari 65     private IData data;
2 26 Feb 07 jari 66     private int[][] clusters;
2 26 Feb 07 jari 67     private FloatMatrix means;
2 26 Feb 07 jari 68     private FloatMatrix variances;
2 26 Feb 07 jari 69     private boolean clusterGenes;
2 26 Feb 07 jari 70     
2 26 Feb 07 jari 71     // jcb 6/29/06 reports iteration of last membership change
2 26 Feb 07 jari 72     // kmc orders cluster by order of convergence and secondly inverse size
2 26 Feb 07 jari 73     // this puts early stable clusters of larger size first in output
2 26 Feb 07 jari 74     private int [] convergenceIteration;     
2 26 Feb 07 jari 75     private int k;
2 26 Feb 07 jari 76     /**
2 26 Feb 07 jari 77      * Default constructor.
2 26 Feb 07 jari 78      */
2 26 Feb 07 jari 79     public KMCGUI() {
2 26 Feb 07 jari 80     }
2 26 Feb 07 jari 81     
2 26 Feb 07 jari 82     /**
2 26 Feb 07 jari 83      * Initialize the algorithm's parameters and execute it.
2 26 Feb 07 jari 84      */
2 26 Feb 07 jari 85     public DefaultMutableTreeNode execute(IFramework framework) throws AlgorithmException {
2 26 Feb 07 jari 86         // the default values
2 26 Feb 07 jari 87         k = 10;
2 26 Feb 07 jari 88         int iterations = 50;
2 26 Feb 07 jari 89         boolean calcMeans = true;
2 26 Feb 07 jari 90         data = framework.getData();
2 26 Feb 07 jari 91         IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 92         int function = menu.getDistanceFunction();        
2 26 Feb 07 jari 93         if (function == Algorithm.DEFAULT) {        
2 26 Feb 07 jari 94             function = Algorithm.EUCLIDEAN;            
2 26 Feb 07 jari 95         }
2 26 Feb 07 jari 96            
2 26 Feb 07 jari 97         KMCInitDialog kmc_dialog = new KMCInitDialog((JFrame)framework.getFrame(), k, iterations, menu.getFunctionName(function),menu.isAbsoluteDistance());
2 26 Feb 07 jari 98         if (kmc_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 99             return null;
2 26 Feb 07 jari 100         }
2 26 Feb 07 jari 101         k = kmc_dialog.getClusters();
2 26 Feb 07 jari 102         iterations = kmc_dialog.getIterations();
2 26 Feb 07 jari 103         calcMeans = kmc_dialog.calculateMeans();
2 26 Feb 07 jari 104         clusterGenes = kmc_dialog.isClusterGenesSelected();
2 26 Feb 07 jari 105         
2 26 Feb 07 jari 106         if (k < 1) {
2 26 Feb 07 jari 107             JOptionPane.showMessageDialog(framework.getFrame(), "Number of clusters must be greater than 0!", "Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 108             return null;
2 26 Feb 07 jari 109         }
2 26 Feb 07 jari 110         if (iterations < 1) {
2 26 Feb 07 jari 111             JOptionPane.showMessageDialog(framework.getFrame(), "Number of iterations must be greater than 0!", "Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 112             return null;
2 26 Feb 07 jari 113         }
2 26 Feb 07 jari 114         boolean isHierarchicalTree = kmc_dialog.isHierarchicalTree();
2 26 Feb 07 jari 115         // hcl init
2 26 Feb 07 jari 116         int hcl_method = 0;
2 26 Feb 07 jari 117         boolean hcl_samples = false;
2 26 Feb 07 jari 118         boolean hcl_genes = false;
2 26 Feb 07 jari 119         int hcl_function = 4;
2 26 Feb 07 jari 120         boolean hcl_absolute = false;
2 26 Feb 07 jari 121         if (isHierarchicalTree) {
2 26 Feb 07 jari 122                                                                                                                                         
2 26 Feb 07 jari 123             HCLInitDialog hcl_dialog = new HCLInitDialog(framework.getFrame(), menu.getFunctionName(kmc_dialog.getDistanceMetric()), kmc_dialog.isAbsoluteDistance(), true);
2 26 Feb 07 jari 124             if (hcl_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 125                 return null;
2 26 Feb 07 jari 126             }
2 26 Feb 07 jari 127             hcl_method = hcl_dialog.getMethod();
2 26 Feb 07 jari 128             hcl_samples = hcl_dialog.isClusterExperiments();
2 26 Feb 07 jari 129             hcl_genes = hcl_dialog.isClusterGenes();
2 26 Feb 07 jari 130             hcl_function = hcl_dialog.getDistanceMetric();
2 26 Feb 07 jari 131             hcl_absolute = hcl_dialog.getAbsoluteSelection();
2 26 Feb 07 jari 132         }
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134         this.experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 135         Listener listener = new Listener();
2 26 Feb 07 jari 136         try {
2 26 Feb 07 jari 137             algorithm = framework.getAlgorithmFactory().getAlgorithm("KMC");
2 26 Feb 07 jari 138             algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 139             
2 26 Feb 07 jari 140             int genes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 141             this.monitor = new Monitor(framework.getFrame(), "Reallocations", 25, 100, 210.0/genes);
2 26 Feb 07 jari 142             this.monitor.setStepXFactor((int)Math.floor(245/iterations));
2 26 Feb 07 jari 143             this.monitor.update(genes);
2 26 Feb 07 jari 144             this.monitor.show();
2 26 Feb 07 jari 145             
2 26 Feb 07 jari 146             this.progress = new Progress(framework.getFrame(), "Calculating clusters", listener);
2 26 Feb 07 jari 147             this.progress.show();
2 26 Feb 07 jari 148             
2 26 Feb 07 jari 149             AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 150             if(clusterGenes){
2 26 Feb 07 jari 151                 data.addMatrix("experiment", experiment.getMatrix());
2 26 Feb 07 jari 152                 data.addParam("kmc-cluster-genes", String.valueOf(true));
2 26 Feb 07 jari 153             }
2 26 Feb 07 jari 154             else{
2 26 Feb 07 jari 155                 data.addMatrix("experiment", experiment.getMatrix().transpose());
2 26 Feb 07 jari 156                 data.addParam("kmc-cluster-genes", String.valueOf(false));
2 26 Feb 07 jari 157             }
2 26 Feb 07 jari 158             data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 159
2 26 Feb 07 jari 160             data.addParam("distance-absolute", String.valueOf(kmc_dialog.isAbsoluteDistance()));
2 26 Feb 07 jari 161             function = kmc_dialog.getDistanceMetric();
2 26 Feb 07 jari 162             if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 163                 function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 164             }
2 26 Feb 07 jari 165             data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 166             data.addParam("number-of-clusters", String.valueOf(k));
2 26 Feb 07 jari 167             data.addParam("number-of-iterations", String.valueOf(iterations));
2 26 Feb 07 jari 168             data.addParam("calculate-means", String.valueOf(calcMeans));
2 26 Feb 07 jari 169             // hcl parameters
2 26 Feb 07 jari 170             if (isHierarchicalTree) {
2 26 Feb 07 jari 171                 data.addParam("hierarchical-tree", String.valueOf(true));
2 26 Feb 07 jari 172                 data.addParam("method-linkage", String.valueOf(hcl_method));
2 26 Feb 07 jari 173                 data.addParam("calculate-genes", String.valueOf(hcl_genes));
2 26 Feb 07 jari 174                 data.addParam("calculate-experiments", String.valueOf(hcl_samples));
2 26 Feb 07 jari 175                 data.addParam("hcl-distance-function", String.valueOf(hcl_function));
2 26 Feb 07 jari 176                 data.addParam("hcl-distance-absolute", String.valueOf(hcl_absolute));
2 26 Feb 07 jari 177             }
2 26 Feb 07 jari 178             
2 26 Feb 07 jari 179             long start = System.currentTimeMillis();
2 26 Feb 07 jari 180             AlgorithmData result = algorithm.execute(data);
2 26 Feb 07 jari 181             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 182             // getting the results
2 26 Feb 07 jari 183             Cluster result_cluster = result.getCluster("cluster");
2 26 Feb 07 jari 184             NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 185             this.clusters = new int[k][];
2 26 Feb 07 jari 186             for (int i=0; i<k; i++) {
2 26 Feb 07 jari 187                 clusters[i] = nodeList.getNode(i).getFeaturesIndexes();
2 26 Feb 07 jari 188             }
2 26 Feb 07 jari 189             this.means = result.getMatrix("clusters_means");
2 26 Feb 07 jari 190             this.variances = result.getMatrix("clusters_variances");
2 26 Feb 07 jari 191             this.convergenceIteration = result.getIntArray("convergence-iterations");
2 26 Feb 07 jari 192             
2 26 Feb 07 jari 193             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 194             info.clusters = k;
2 26 Feb 07 jari 195             info.converged = result.getParams().getBoolean("converged");
2 26 Feb 07 jari 196             info.iterations = result.getParams().getInt("iterations");
2 26 Feb 07 jari 197             info.calculate_means = calcMeans;
2 26 Feb 07 jari 198             info.time = time;
2 26 Feb 07 jari 199             info.function = menu.getFunctionName(function);
2 26 Feb 07 jari 200             info.hcl = isHierarchicalTree;
2 26 Feb 07 jari 201             info.hcl_genes = hcl_genes;
2 26 Feb 07 jari 202             info.hcl_samples = hcl_samples;
2 26 Feb 07 jari 203             info.hcl_method = hcl_method;
2 26 Feb 07 jari 204             return createResultTree(result_cluster, info);
2 26 Feb 07 jari 205             
2 26 Feb 07 jari 206         } finally {
2 26 Feb 07 jari 207             if (algorithm != null) {
2 26 Feb 07 jari 208                 algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 209             }
2 26 Feb 07 jari 210             if (progress != null) {
2 26 Feb 07 jari 211                 progress.dispose();
2 26 Feb 07 jari 212             }
2 26 Feb 07 jari 213             if (monitor != null) {
2 26 Feb 07 jari 214                 monitor.dispose();
2 26 Feb 07 jari 215             }
2 26 Feb 07 jari 216         }
2 26 Feb 07 jari 217     }
2 26 Feb 07 jari 218     
2 26 Feb 07 jari 219     
2 26 Feb 07 jari 220     
2 26 Feb 07 jari 221     /***
2 26 Feb 07 jari 222      *      Script Support
2 26 Feb 07 jari 223      *
2 26 Feb 07 jari 224      */
2 26 Feb 07 jari 225     public AlgorithmData getScriptParameters(IFramework framework) {
2 26 Feb 07 jari 226         k = 10;
2 26 Feb 07 jari 227         int iterations = 50;
2 26 Feb 07 jari 228         boolean calcMeans = true;
2 26 Feb 07 jari 229         
2 26 Feb 07 jari 230         IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 231         int function = menu.getDistanceFunction();        
2 26 Feb 07 jari 232         if (function == Algorithm.DEFAULT) {        
2 26 Feb 07 jari 233             function = Algorithm.EUCLIDEAN;            
2 26 Feb 07 jari 234         }
2 26 Feb 07 jari 235         KMCInitDialog kmc_dialog = new KMCInitDialog((JFrame)framework.getFrame(), k, iterations, menu.getFunctionName(menu.getDistanceFunction()),menu.isAbsoluteDistance());
2 26 Feb 07 jari 236  
2 26 Feb 07 jari 237         if (kmc_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 238             return null;
2 26 Feb 07 jari 239         }
2 26 Feb 07 jari 240         k = kmc_dialog.getClusters();
2 26 Feb 07 jari 241         iterations = kmc_dialog.getIterations();
2 26 Feb 07 jari 242         calcMeans = kmc_dialog.calculateMeans();
2 26 Feb 07 jari 243         clusterGenes = kmc_dialog.isClusterGenesSelected();
2 26 Feb 07 jari 244         
2 26 Feb 07 jari 245         if (k < 1) {
2 26 Feb 07 jari 246             JOptionPane.showMessageDialog(framework.getFrame(), "Number of clusters must be greater than 0!", "Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 247             return null;
2 26 Feb 07 jari 248         }
2 26 Feb 07 jari 249         if (iterations < 1) {
2 26 Feb 07 jari 250             JOptionPane.showMessageDialog(framework.getFrame(), "Number of iterations must be greater than 0!", "Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 251             return null;
2 26 Feb 07 jari 252         }
2 26 Feb 07 jari 253         boolean isHierarchicalTree = kmc_dialog.isHierarchicalTree();
2 26 Feb 07 jari 254         // hcl init
2 26 Feb 07 jari 255         int hcl_method = 0;
2 26 Feb 07 jari 256         boolean hcl_samples = false;
2 26 Feb 07 jari 257         boolean hcl_genes = false;
2 26 Feb 07 jari 258
2 26 Feb 07 jari 259         int hcl_function = 4;
2 26 Feb 07 jari 260         boolean hcl_absolute = false;
2 26 Feb 07 jari 261         if (isHierarchicalTree) {
2 26 Feb 07 jari 262                                                                                                                                         
2 26 Feb 07 jari 263             HCLInitDialog hcl_dialog = new HCLInitDialog(framework.getFrame(), menu.getFunctionName(kmc_dialog.getDistanceMetric()), kmc_dialog.isAbsoluteDistance(), true);
2 26 Feb 07 jari 264             if (hcl_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 265                 return null;
2 26 Feb 07 jari 266             }
2 26 Feb 07 jari 267             hcl_method = hcl_dialog.getMethod();
2 26 Feb 07 jari 268             hcl_samples = hcl_dialog.isClusterExperiments();
2 26 Feb 07 jari 269             hcl_genes = hcl_dialog.isClusterGenes();
2 26 Feb 07 jari 270             hcl_function = hcl_dialog.getDistanceMetric();
2 26 Feb 07 jari 271             hcl_absolute = hcl_dialog.getAbsoluteSelection();
2 26 Feb 07 jari 272         }
2 26 Feb 07 jari 273         
2 26 Feb 07 jari 274         this.experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 275         Listener listener = new Listener();
2 26 Feb 07 jari 276         
2 26 Feb 07 jari 277         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 278         if(clusterGenes){
2 26 Feb 07 jari 279             data.addParam("kmc-cluster-genes", String.valueOf(true));
2 26 Feb 07 jari 280         }
2 26 Feb 07 jari 281         else{
2 26 Feb 07 jari 282             data.addParam("kmc-cluster-genes", String.valueOf(false));
2 26 Feb 07 jari 283         }
2 26 Feb 07 jari 284         data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 285         data.addParam("distance-absolute", String.valueOf(kmc_dialog.isAbsoluteDistance()));
2 26 Feb 07 jari 286         function = kmc_dialog.getDistanceMetric();
2 26 Feb 07 jari 287         if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 288             function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 289         }
2 26 Feb 07 jari 290         data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 291         data.addParam("number-of-clusters", String.valueOf(k));
2 26 Feb 07 jari 292         data.addParam("number-of-iterations", String.valueOf(iterations));
2 26 Feb 07 jari 293         data.addParam("calculate-means", String.valueOf(calcMeans));
2 26 Feb 07 jari 294         // hcl parameters
2 26 Feb 07 jari 295         if (isHierarchicalTree) {
2 26 Feb 07 jari 296             data.addParam("hierarchical-tree", String.valueOf(true));
2 26 Feb 07 jari 297             data.addParam("method-linkage", String.valueOf(hcl_method));
2 26 Feb 07 jari 298             data.addParam("calculate-genes", String.valueOf(hcl_genes));
2 26 Feb 07 jari 299             data.addParam("calculate-experiments", String.valueOf(hcl_samples));
2 26 Feb 07 jari 300             data.addParam("hcl-distance-function", String.valueOf(hcl_function));
2 26 Feb 07 jari 301             data.addParam("hcl-distance-absolute", String.valueOf(hcl_absolute));
2 26 Feb 07 jari 302         }
2 26 Feb 07 jari 303         
2 26 Feb 07 jari 304         //script control parameters
2 26 Feb 07 jari 305         
2 26 Feb 07 jari 306         // alg name
2 26 Feb 07 jari 307         data.addParam("name", "KMC");
2 26 Feb 07 jari 308         
2 26 Feb 07 jari 309         // alg type
2 26 Feb 07 jari 310         if(clusterGenes)
2 26 Feb 07 jari 311             data.addParam("alg-type", "cluster-genes");
2 26 Feb 07 jari 312         else
2 26 Feb 07 jari 313             data.addParam("alg-type", "cluster-experiments");
2 26 Feb 07 jari 314         
2 26 Feb 07 jari 315         // output class
2 26 Feb 07 jari 316         if(clusterGenes)
2 26 Feb 07 jari 317             data.addParam("output-class", "multi-gene-cluster-output");
2 26 Feb 07 jari 318         else
2 26 Feb 07 jari 319             data.addParam("output-class", "multi-experiment-cluster-output");
2 26 Feb 07 jari 320         
2 26 Feb 07 jari 321         //output nodes
2 26 Feb 07 jari 322         String [] outputNodes = new String[1];
2 26 Feb 07 jari 323         outputNodes[0] = "Multi-cluster";
2 26 Feb 07 jari 324         data.addStringArray("output-nodes", outputNodes);
2 26 Feb 07 jari 325         
2 26 Feb 07 jari 326         
2 26 Feb 07 jari 327         return data;
2 26 Feb 07 jari 328     }
2 26 Feb 07 jari 329     
2 26 Feb 07 jari 330     public DefaultMutableTreeNode executeScript(IFramework framework, AlgorithmData algData, Experiment experiment) throws AlgorithmException {
2 26 Feb 07 jari 331         AlgorithmData data = algData;
2 26 Feb 07 jari 332         
2 26 Feb 07 jari 333         //extract some key paramters
2 26 Feb 07 jari 334         AlgorithmParameters params = data.getParams();
2 26 Feb 07 jari 335         k = params.getInt("number-of-clusters", 10);
2 26 Feb 07 jari 336         this.clusterGenes = params.getBoolean("kmc-cluster-genes");
2 26 Feb 07 jari 337         int iterations = params.getInt("number-of-iterations");
2 26 Feb 07 jari 338         
2 26 Feb 07 jari 339         if(clusterGenes){
2 26 Feb 07 jari 340             data.addMatrix("experiment", experiment.getMatrix());
2 26 Feb 07 jari 341         }
2 26 Feb 07 jari 342         else{
2 26 Feb 07 jari 343             data.addMatrix("experiment", experiment.getMatrix().transpose());
2 26 Feb 07 jari 344         }
2 26 Feb 07 jari 345         
2 26 Feb 07 jari 346         this.data = framework.getData();
2 26 Feb 07 jari 347         this.experiment = experiment;
2 26 Feb 07 jari 348         Listener listener = new Listener();
2 26 Feb 07 jari 349         try {
2 26 Feb 07 jari 350             algorithm = framework.getAlgorithmFactory().getAlgorithm("KMC");
2 26 Feb 07 jari 351             algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 352             
2 26 Feb 07 jari 353             int genes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 354             this.monitor = new Monitor(framework.getFrame(), "Reallocations", 25, 100, 210.0/genes);
2 26 Feb 07 jari 355             this.monitor.setStepXFactor((int)Math.floor(245/iterations));
2 26 Feb 07 jari 356             this.monitor.update(genes);
2 26 Feb 07 jari 357             this.monitor.show();
2 26 Feb 07 jari 358             
2 26 Feb 07 jari 359             this.progress = new Progress(framework.getFrame(), "Calculating clusters", listener);
2 26 Feb 07 jari 360             this.progress.show();
2 26 Feb 07 jari 361             
2 26 Feb 07 jari 362             long start = System.currentTimeMillis();
2 26 Feb 07 jari 363             AlgorithmData result = algorithm.execute(data);
2 26 Feb 07 jari 364             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 365             // getting the results
2 26 Feb 07 jari 366             Cluster result_cluster = result.getCluster("cluster");
2 26 Feb 07 jari 367             NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 368             this.clusters = new int[k][];
2 26 Feb 07 jari 369             for (int i=0; i<k; i++) {
2 26 Feb 07 jari 370                 clusters[i] = nodeList.getNode(i).getFeaturesIndexes();
2 26 Feb 07 jari 371             }
2 26 Feb 07 jari 372             this.means = result.getMatrix("clusters_means");
2 26 Feb 07 jari 373             this.variances = result.getMatrix("clusters_variances");
2 26 Feb 07 jari 374             this.convergenceIteration = result.getIntArray("convergence-iterations");
2 26 Feb 07 jari 375             
2 26 Feb 07 jari 376             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 377             info.clusters = k;
2 26 Feb 07 jari 378             info.converged = result.getParams().getBoolean("converged");
2 26 Feb 07 jari 379             info.iterations = result.getParams().getInt("iterations");
2 26 Feb 07 jari 380             info.calculate_means = params.getBoolean("calculate-means");
2 26 Feb 07 jari 381             info.time = time;
2 26 Feb 07 jari 382             info.function = framework.getDistanceMenu().getFunctionName(params.getInt("distance-function"));
2 26 Feb 07 jari 383             info.hcl = params.getBoolean("hierarchical-tree");
2 26 Feb 07 jari 384             
2 26 Feb 07 jari 385             info.hcl_genes = params.getBoolean("calculate-genes");
2 26 Feb 07 jari 386             info.hcl_samples = params.getBoolean("calculate-experiments");
2 26 Feb 07 jari 387             if(info.hcl)
2 26 Feb 07 jari 388                 info.hcl_method = params.getInt("method-linkage");
2 26 Feb 07 jari 389             else
2 26 Feb 07 jari 390                 info.hcl_method = 0;
2 26 Feb 07 jari 391             
2 26 Feb 07 jari 392             return createResultTree(result_cluster, info);
2 26 Feb 07 jari 393             
2 26 Feb 07 jari 394         } finally {
2 26 Feb 07 jari 395             if (algorithm != null) {
2 26 Feb 07 jari 396                 algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 397             }
2 26 Feb 07 jari 398             if (progress != null) {
2 26 Feb 07 jari 399                 progress.dispose();
2 26 Feb 07 jari 400             }
2 26 Feb 07 jari 401             if (monitor != null) {
2 26 Feb 07 jari 402                 monitor.dispose();
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     
2 26 Feb 07 jari 409     
2 26 Feb 07 jari 410     /**
2 26 Feb 07 jari 411      * Creates a result tree to be inserted into the framework analysis node.
2 26 Feb 07 jari 412      */
2 26 Feb 07 jari 413     private DefaultMutableTreeNode createResultTree(Cluster result_cluster, GeneralInfo info) {
2 26 Feb 07 jari 414         DefaultMutableTreeNode root;
2 26 Feb 07 jari 415         if(clusterGenes)
2 26 Feb 07 jari 416             root = new DefaultMutableTreeNode("KMC - genes");
2 26 Feb 07 jari 417         else
2 26 Feb 07 jari 418             root = new DefaultMutableTreeNode("KMC - samples");
2 26 Feb 07 jari 419         addResultNodes(root, result_cluster, info);
2 26 Feb 07 jari 420         return root;
2 26 Feb 07 jari 421     }
2 26 Feb 07 jari 422     
2 26 Feb 07 jari 423     /**
2 26 Feb 07 jari 424      * Adds result nodes into the tree root.
2 26 Feb 07 jari 425      */
2 26 Feb 07 jari 426     private void addResultNodes(DefaultMutableTreeNode root, Cluster result_cluster, GeneralInfo info) {
2 26 Feb 07 jari 427         addExpressionImages(root);
2 26 Feb 07 jari 428         addHierarchicalTrees(root, result_cluster, info);
2 26 Feb 07 jari 429         addCentroidViews(root);
2 26 Feb 07 jari 430         addClusterTableViews(root);
2 26 Feb 07 jari 431         addClusterInfo(root);
2 26 Feb 07 jari 432         addGeneralInfo(root, info);
2 26 Feb 07 jari 433     }
2 26 Feb 07 jari 434     
2 26 Feb 07 jari 435     
2 26 Feb 07 jari 436     /**
2 26 Feb 07 jari 437      * Adds nodes to display clusters data.
2 26 Feb 07 jari 438      */
2 26 Feb 07 jari 439     private void addExpressionImages(DefaultMutableTreeNode root) {
2 26 Feb 07 jari 440         DefaultMutableTreeNode node = new DefaultMutableTreeNode("Expression Images");
2 26 Feb 07 jari 441         IViewer expViewer;
2 26 Feb 07 jari 442         if(clusterGenes)
2 26 Feb 07 jari 443             expViewer = new KMCExperimentViewer(this.experiment, this.clusters);
2 26 Feb 07 jari 444         else
2 26 Feb 07 jari 445             expViewer = new KMCExperimentClusterViewer(this.experiment, this.clusters);
2 26 Feb 07 jari 446         
2 26 Feb 07 jari 447         for (int i=0; i<this.clusters.length; i++) {
2 26 Feb 07 jari 448             node.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), expViewer, new Integer(i))));
2 26 Feb 07 jari 449         }
2 26 Feb 07 jari 450         root.add(node);
2 26 Feb 07 jari 451     }
2 26 Feb 07 jari 452     
2 26 Feb 07 jari 453     private void addClusterTableViews(DefaultMutableTreeNode root) {
2 26 Feb 07 jari 454         DefaultMutableTreeNode node = new DefaultMutableTreeNode("Table views");
2 26 Feb 07 jari 455         IViewer tableViewer;
2 26 Feb 07 jari 456         if (clusterGenes) {
2 26 Feb 07 jari 457             tableViewer = new ClusterTableViewer(this.experiment, this.clusters, data);
2 26 Feb 07 jari 458         } else {// placeholder for ExperimentClusterTableViewer
2 26 Feb 07 jari 459             tableViewer = new ExperimentClusterTableViewer(this.experiment, this.clusters, data);
2 26 Feb 07 jari 460             //return;
2 26 Feb 07 jari 461         }
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         for (int i=0; i<this.clusters.length; i++) {
2 26 Feb 07 jari 464             node.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), tableViewer, new Integer(i))));
2 26 Feb 07 jari 465         }
2 26 Feb 07 jari 466         root.add(node);
2 26 Feb 07 jari 467     }
2 26 Feb 07 jari 468     
2 26 Feb 07 jari 469     /**
2 26 Feb 07 jari 470      * Adds nodes to display hierarchical trees.
2 26 Feb 07 jari 471      */
2 26 Feb 07 jari 472     private void addHierarchicalTrees(DefaultMutableTreeNode root, Cluster result_cluster, GeneralInfo info) {
2 26 Feb 07 jari 473         if (!info.hcl) {
2 26 Feb 07 jari 474             return;
2 26 Feb 07 jari 475         }
2 26 Feb 07 jari 476         DefaultMutableTreeNode node = new DefaultMutableTreeNode("Hierarchical Trees");
2 26 Feb 07 jari 477         NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 478         int [][] clusters = null;
2 26 Feb 07 jari 479         
2 26 Feb 07 jari 480         if(!this.clusterGenes){
2 26 Feb 07 jari 481             clusters = new int[k][];
2 26 Feb 07 jari 482             for (int i=0; i<k; i++) {
2 26 Feb 07 jari 483                 clusters[i] = nodeList.getNode(i).getFeaturesIndexes();
2 26 Feb 07 jari 484             }
2 26 Feb 07 jari 485             if(info.hcl_samples)
2 26 Feb 07 jari 486                 clusters = getOrderedIndices(nodeList, clusters, info.hcl_genes);
2 26 Feb 07 jari 487         }
2 26 Feb 07 jari 488         for (int i=0; i<nodeList.getSize(); i++) {
2 26 Feb 07 jari 489             if(this.clusterGenes)
2 26 Feb 07 jari 490                 node.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), createHCLViewer(nodeList.getNode(i), info, null))));
2 26 Feb 07 jari 491             else
2 26 Feb 07 jari 492                 node.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), createHCLViewer(nodeList.getNode(i), info, clusters), new Integer(i))));
2 26 Feb 07 jari 493         }
2 26 Feb 07 jari 494         root.add(node);
2 26 Feb 07 jari 495     }
2 26 Feb 07 jari 496     
2 26 Feb 07 jari 497     /**
2 26 Feb 07 jari 498      * Creates an <code>HCLViewer</code>.
2 26 Feb 07 jari 499      */
2 26 Feb 07 jari 500     private IViewer createHCLViewer(Node clusterNode, GeneralInfo info, int [][] sampleClusters) {
2 26 Feb 07 jari 501         HCLTreeData genes_result = info.hcl_genes ? getResult(clusterNode, 0) : null;
2 26 Feb 07 jari 502         HCLTreeData samples_result = info.hcl_samples ? getResult(clusterNode, info.hcl_genes ? 4 : 0) : null;
2 26 Feb 07 jari 503         if(this.clusterGenes)
2 26 Feb 07 jari 504             return new HCLViewer(this.experiment, clusterNode.getFeaturesIndexes(), genes_result, samples_result);
2 26 Feb 07 jari 505         else
2 26 Feb 07 jari 506             return new HCLViewer(this.experiment, clusterNode.getFeaturesIndexes(), genes_result, samples_result, sampleClusters, true);
2 26 Feb 07 jari 507     }
2 26 Feb 07 jari 508     
2 26 Feb 07 jari 509     /**
2 26 Feb 07 jari 510      * Returns a hcl tree data from the specified cluster node.
2 26 Feb 07 jari 511      */
2 26 Feb 07 jari 512     private HCLTreeData getResult(Node clusterNode, int pos) {
2 26 Feb 07 jari 513         HCLTreeData data = new HCLTreeData();
2 26 Feb 07 jari 514         NodeValueList valueList = clusterNode.getValues();
2 26 Feb 07 jari 515         data.child_1_array = (int[])valueList.getNodeValue(pos).value;
2 26 Feb 07 jari 516         data.child_2_array = (int[])valueList.getNodeValue(pos+1).value;
2 26 Feb 07 jari 517         data.node_order = (int[])valueList.getNodeValue(pos+2).value;
2 26 Feb 07 jari 518         data.height = (float[])valueList.getNodeValue(pos+3).value;
2 26 Feb 07 jari 519         return data;
2 26 Feb 07 jari 520     }
2 26 Feb 07 jari 521     
2 26 Feb 07 jari 522     /***************************************************************************************
2 26 Feb 07 jari 523      * Code to order sample clustering results based on HCL runs.  sampleClusters contain an array
2 26 Feb 07 jari 524      * of sample indices for each experiment cluster.  Note that these indicies are ordered in
2 26 Feb 07 jari 525      * an order which matches HCL input matrix sample order so that HCL results (node-order) can
2 26 Feb 07 jari 526      * be used to order leaf indices to match HCL samples results
2 26 Feb 07 jari 527      */
2 26 Feb 07 jari 528     private int [][] getOrderedIndices(NodeList nodeList, int [][] sampleClusters, boolean calcGeneHCL){
2 26 Feb 07 jari 529         HCLTreeData result;
2 26 Feb 07 jari 530         for(int i = 0; i < sampleClusters.length ; i++){
2 26 Feb 07 jari 531             if(sampleClusters[i].length > 0){
2 26 Feb 07 jari 532                 result = getResult(nodeList.getNode(i), calcGeneHCL ? 4 : 0);  //get sample Result
2 26 Feb 07 jari 533                 sampleClusters[i] = getSampleOrder(result, sampleClusters[i]);
2 26 Feb 07 jari 534             }
2 26 Feb 07 jari 535         }
2 26 Feb 07 jari 536         return sampleClusters;
2 26 Feb 07 jari 537     }
2 26 Feb 07 jari 538     
2 26 Feb 07 jari 539     private int[] getSampleOrder(HCLTreeData result, int[] indices) {
2 26 Feb 07 jari 540         return getLeafOrder(result.node_order, result.child_1_array, result.child_2_array, indices);
2 26 Feb 07 jari 541     }
2 26 Feb 07 jari 542     
2 26 Feb 07 jari 543     private int[] getLeafOrder(int[] nodeOrder, int[] child1, int[] child2, int[] indices) {
2 26 Feb 07 jari 544         int[] leafOrder = new int[nodeOrder.length];
2 26 Feb 07 jari 545         Arrays.fill(leafOrder, -1);
2 26 Feb 07 jari 546         fillLeafOrder(leafOrder, child1, child2, 0, child1.length-2, indices);
2 26 Feb 07 jari 547         return leafOrder;
2 26 Feb 07 jari 548     }
2 26 Feb 07 jari 549     
2 26 Feb 07 jari 550     private int fillLeafOrder(int[] leafOrder, int[] child1, int[] child2, int pos, int index, int[] indices) {
2 26 Feb 07 jari 551         if (child1[index] != -1) {
2 26 Feb 07 jari 552             pos = fillLeafOrder(leafOrder, child1, child2, pos, child1[index], indices);
2 26 Feb 07 jari 553         }
2 26 Feb 07 jari 554         if (child2[index] != -1) {
2 26 Feb 07 jari 555             pos = fillLeafOrder(leafOrder, child1, child2, pos, child2[index], indices);
2 26 Feb 07 jari 556         } else {
2 26 Feb 07 jari 557             leafOrder[pos] = indices == null ? index : indices[index];
2 26 Feb 07 jari 558             pos++;
2 26 Feb 07 jari 559         }
2 26 Feb 07 jari 560         return pos;
2 26 Feb 07 jari 561     }
2 26 Feb 07 jari 562     
2 26 Feb 07 jari 563     /****************************************************************************************
2 26 Feb 07 jari 564      * End of Sample Cluster index ordering code
2 26 Feb 07 jari 565      */
2 26 Feb 07 jari 566     
2 26 Feb 07 jari 567     
2 26 Feb 07 jari 568     /**
2 26 Feb 07 jari 569      * Adds node with cluster information.
2 26 Feb 07 jari 570      */
2 26 Feb 07 jari 571     private void addClusterInfo(DefaultMutableTreeNode root) {
2 26 Feb 07 jari 572         DefaultMutableTreeNode node = new DefaultMutableTreeNode("Cluster Information");
2 26 Feb 07 jari 573         if(this.clusterGenes)
2 26 Feb 07 jari 574             node.add(new DefaultMutableTreeNode(new LeafInfo("Genes in Clusters (#,%)", new KMCInfoViewer(this.clusters, this.experiment.getNumberOfGenes(), convergenceIteration))));
2 26 Feb 07 jari 575         else
2 26 Feb 07 jari 576             node.add(new DefaultMutableTreeNode(new LeafInfo("Samples in Clusters (#,%)", new KMCInfoViewer(this.clusters, this.experiment.getNumberOfSamples(), convergenceIteration, false))));
2 26 Feb 07 jari 577         root.add(node);
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      * Adds nodes to display centroid charts.
2 26 Feb 07 jari 583      */
2 26 Feb 07 jari 584     private void addCentroidViews(DefaultMutableTreeNode root) {
2 26 Feb 07 jari 585         DefaultMutableTreeNode centroidNode = new DefaultMutableTreeNode("Centroid Graphs");
2 26 Feb 07 jari 586         DefaultMutableTreeNode expressionNode = new DefaultMutableTreeNode("Expression Graphs");
2 26 Feb 07 jari 587         
2 26 Feb 07 jari 588         KMCCentroidViewer centroidViewer;
2 26 Feb 07 jari 589         ExperimentClusterCentroidViewer expCentroidViewer;
2 26 Feb 07 jari 590         if(clusterGenes){
2 26 Feb 07 jari 591             centroidViewer = new KMCCentroidViewer(this.experiment, clusters);
2 26 Feb 07 jari 592             centroidViewer.setMeans(this.means.A);
2 26 Feb 07 jari 593             centroidViewer.setVariances(this.variances.A);
2 26 Feb 07 jari 594             for (int i=0; i<this.clusters.length; i++) {
2 26 Feb 07 jari 595                 centroidNode.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), centroidViewer, new CentroidUserObject(i, CentroidUserObject.VARIANCES_MODE))));
2 26 Feb 07 jari 596                 expressionNode.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), centroidViewer, new CentroidUserObject(i, CentroidUserObject.VALUES_MODE))));
2 26 Feb 07 jari 597             }
2 26 Feb 07 jari 598             
2 26 Feb 07 jari 599             KMCCentroidsViewer centroidsViewer = new KMCCentroidsViewer(this.experiment, clusters);
2 26 Feb 07 jari 600             centroidsViewer.setMeans(this.means.A);
2 26 Feb 07 jari 601             centroidsViewer.setVariances(this.variances.A);
2 26 Feb 07 jari 602             
2 26 Feb 07 jari 603             centroidNode.add(new DefaultMutableTreeNode(new LeafInfo("All Clusters", centroidsViewer, new Integer(CentroidUserObject.VARIANCES_MODE))));
2 26 Feb 07 jari 604             expressionNode.add(new DefaultMutableTreeNode(new LeafInfo("All Clusters", centroidsViewer, new Integer(CentroidUserObject.VALUES_MODE))));
2 26 Feb 07 jari 605             
2 26 Feb 07 jari 606         }
2 26 Feb 07 jari 607         else{
2 26 Feb 07 jari 608             expCentroidViewer = new KMCExperimentCentroidViewer(this.experiment, clusters);
2 26 Feb 07 jari 609             
2 26 Feb 07 jari 610             expCentroidViewer.setMeans(this.means.A);
2 26 Feb 07 jari 611             expCentroidViewer.setVariances(this.variances.A);
2 26 Feb 07 jari 612             for (int i=0; i<this.clusters.length; i++) {
2 26 Feb 07 jari 613                 centroidNode.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), expCentroidViewer, new CentroidUserObject(i, CentroidUserObject.VARIANCES_MODE))));
2 26 Feb 07 jari 614                 expressionNode.add(new DefaultMutableTreeNode(new LeafInfo("Cluster "+String.valueOf(i+1), expCentroidViewer, new CentroidUserObject(i, CentroidUserObject.VALUES_MODE))));
2 26 Feb 07 jari 615             }
2 26 Feb 07 jari 616             KMCExperimentCentroidsViewer expCentroidsViewer = new KMCExperimentCentroidsViewer(this.experiment, clusters);
2 26 Feb 07 jari 617             expCentroidsViewer.setMeans(this.means.A);
2 26 Feb 07 jari 618             expCentroidsViewer.setVariances(this.variances.A);
2 26 Feb 07 jari 619             
2 26 Feb 07 jari 620             centroidNode.add(new DefaultMutableTreeNode(new LeafInfo("All Clusters", expCentroidsViewer, new Integer(CentroidUserObject.VARIANCES_MODE))));
2 26 Feb 07 jari 621             expressionNode.add(new DefaultMutableTreeNode(new LeafInfo("All Clusters", expCentroidsViewer, new Integer(CentroidUserObject.VALUES_MODE))));
2 26 Feb 07 jari 622             
2 26 Feb 07 jari 623             
2 26 Feb 07 jari 624         }
2 26 Feb 07 jari 625         root.add(centroidNode);
2 26 Feb 07 jari 626         root.add(expressionNode);
2 26 Feb 07 jari 627     }
2 26 Feb 07 jari 628     
2 26 Feb 07 jari 629     /**
2 26 Feb 07 jari 630      * Adds node with general iformation.
2 26 Feb 07 jari 631      */
2 26 Feb 07 jari 632     private void addGeneralInfo(DefaultMutableTreeNode root, GeneralInfo info) {
2 26 Feb 07 jari 633         DefaultMutableTreeNode node = new DefaultMutableTreeNode("General Information");
2 26 Feb 07 jari 634         if(info.calculate_means)
2 26 Feb 07 jari 635             node.add(new DefaultMutableTreeNode("KMC mode: Calculated Means"));
2 26 Feb 07 jari 636         else
2 26 Feb 07 jari 637             node.add(new DefaultMutableTreeNode("KMC mode: Calculated Medians"));
2 26 Feb 07 jari 638         node.add(new DefaultMutableTreeNode("Clusters: "+String.valueOf(info.clusters)));
2 26 Feb 07 jari 639         node.add(new DefaultMutableTreeNode("Converged: "+String.valueOf(info.converged)));
2 26 Feb 07 jari 640         node.add(new DefaultMutableTreeNode("Iterations: "+String.valueOf(info.iterations)));
2 26 Feb 07 jari 641         node.add(new DefaultMutableTreeNode("HCL: "+info.getMethodName()));
2 26 Feb 07 jari 642         node.add(new DefaultMutableTreeNode("Time: "+String.valueOf(info.time)+" ms"));
2 26 Feb 07 jari 643         node.add(new DefaultMutableTreeNode(info.function));
2 26 Feb 07 jari 644         root.add(node);
2 26 Feb 07 jari 645     }
2 26 Feb 07 jari 646     
2 26 Feb 07 jari 647     
2 26 Feb 07 jari 648     /**
2 26 Feb 07 jari 649      * The class to listen to progress, monitor and algorithms events.
2 26 Feb 07 jari 650      */
2 26 Feb 07 jari 651     private class Listener extends DialogListener implements AlgorithmListener {
2 26 Feb 07 jari 652         
2 26 Feb 07 jari 653         public void valueChanged(AlgorithmEvent event) {
2 26 Feb 07 jari 654             switch (event.getId()) {
2 26 Feb 07 jari 655                 case AlgorithmEvent.SET_UNITS:
2 26 Feb 07 jari 656                     progress.setUnits(event.getIntValue());
2 26 Feb 07 jari 657                     progress.setDescription(event.getDescription());
2 26 Feb 07 jari 658                     break;
2 26 Feb 07 jari 659                 case AlgorithmEvent.PROGRESS_VALUE:
2 26 Feb 07 jari 660                     progress.setValue(event.getIntValue());
2 26 Feb 07 jari 661                     progress.setDescription(event.getDescription());
2 26 Feb 07 jari 662                     break;
2 26 Feb 07 jari 663                 case AlgorithmEvent.MONITOR_VALUE:
2 26 Feb 07 jari 664                     int value = event.getIntValue();
2 26 Feb 07 jari 665                     if (value == -1) {
2 26 Feb 07 jari 666                         monitor.dispose();
2 26 Feb 07 jari 667                     } else {
2 26 Feb 07 jari 668                         
2 26 Feb 07 jari 669                         //monitor.update(value);
2 26 Feb 07 jari 670                     }
2 26 Feb 07 jari 671                     break;
2 26 Feb 07 jari 672             }
2 26 Feb 07 jari 673         }
2 26 Feb 07 jari 674         
2 26 Feb 07 jari 675         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 676             String command = e.getActionCommand();
2 26 Feb 07 jari 677             if (command.equals("cancel-command")) {
2 26 Feb 07 jari 678                 algorithm.abort();
2 26 Feb 07 jari 679                 progress.dispose();
2 26 Feb 07 jari 680                 monitor.dispose();
2 26 Feb 07 jari 681             }
2 26 Feb 07 jari 682         }
2 26 Feb 07 jari 683         
2 26 Feb 07 jari 684         public void windowClosing(WindowEvent e) {
2 26 Feb 07 jari 685             algorithm.abort();
2 26 Feb 07 jari 686             progress.dispose();
2 26 Feb 07 jari 687             monitor.dispose();
2 26 Feb 07 jari 688         }
2 26 Feb 07 jari 689     }
2 26 Feb 07 jari 690     
2 26 Feb 07 jari 691     // the general info structure
2 26 Feb 07 jari 692     private class GeneralInfo {
2 26 Feb 07 jari 693         public int clusters;
2 26 Feb 07 jari 694         public boolean converged;
2 26 Feb 07 jari 695         public int iterations;
2 26 Feb 07 jari 696         public long time;
2 26 Feb 07 jari 697         public String function;
2 26 Feb 07 jari 698         public boolean calculate_means;
2 26 Feb 07 jari 699         
2 26 Feb 07 jari 700         private boolean hcl;
2 26 Feb 07 jari 701         private int hcl_method;
2 26 Feb 07 jari 702         private boolean hcl_genes;
2 26 Feb 07 jari 703         private boolean hcl_samples;
2 26 Feb 07 jari 704         
2 26 Feb 07 jari 705         public String getMethodName() {
2 26 Feb 07 jari 706             return hcl ? HCLGUI.GeneralInfo.getMethodName(hcl_method) : "no linkage";
2 26 Feb 07 jari 707         }
2 26 Feb 07 jari 708         
2 26 Feb 07 jari 709     }
2 26 Feb 07 jari 710 }