mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/hcl/HCLGUI.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: HCLGUI.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.5 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:51 $
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.gui.impl.hcl;
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
2 26 Feb 07 jari 17 import javax.swing.JOptionPane;
2 26 Feb 07 jari 18 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 19
2 26 Feb 07 jari 20 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmFactory;
2 26 Feb 07 jari 25 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmListener;
2 26 Feb 07 jari 26 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
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.IClusterGUI;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.gui.IDistanceMenu;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.DialogListener;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Progress;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.script.scriptGUI.IScriptGUI;
2 26 Feb 07 jari 36 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 public class HCLGUI implements IClusterGUI, IScriptGUI {
2 26 Feb 07 jari 39     
2 26 Feb 07 jari 40     private Algorithm algorithm;
2 26 Feb 07 jari 41     private Progress progress;
2 26 Feb 07 jari 42     
2 26 Feb 07 jari 43     /**
2 26 Feb 07 jari 44      * Inits the algorithm parameters, runs calculation and returns
2 26 Feb 07 jari 45      * a result to be inserted into the framework analysis node.
2 26 Feb 07 jari 46      */
2 26 Feb 07 jari 47     public DefaultMutableTreeNode execute(IFramework framework) throws AlgorithmException {
2 26 Feb 07 jari 48         
2 26 Feb 07 jari 49         IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 50         int function = menu.getDistanceFunction();
2 26 Feb 07 jari 51         if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 52             function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 53         }        
2 26 Feb 07 jari 54         
2 26 Feb 07 jari 55         HCLInitDialog dialog = new HCLInitDialog(framework.getFrame(), menu.getFunctionName(function), menu.isAbsoluteDistance(), true);
2 26 Feb 07 jari 56         if (dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 57             return null;
2 26 Feb 07 jari 58         }
2 26 Feb 07 jari 59         int method = dialog.getMethod();
2 26 Feb 07 jari 60         function = dialog.getDistanceMetric();       
2 26 Feb 07 jari 61         Listener listener = new Listener();
2 26 Feb 07 jari 62         
2 26 Feb 07 jari 63         try {
2 26 Feb 07 jari 64             Experiment experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 65             AlgorithmFactory factory = framework.getAlgorithmFactory();
2 26 Feb 07 jari 66             
2 26 Feb 07 jari 67             this.algorithm = factory.getAlgorithm("HCL");
2 26 Feb 07 jari 68             algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 69             AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 70             data.addMatrix("experiment", experiment.getMatrix());
2 26 Feb 07 jari 71
2 26 Feb 07 jari 72             data.addParam("hcl-distance-function", String.valueOf(function));
2 26 Feb 07 jari 73             data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 74             data.addParam("hcl-distance-absolute", String.valueOf(dialog.getAbsoluteSelection()));
2 26 Feb 07 jari 75             data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 76             
2 26 Feb 07 jari 77             this.progress = new Progress(framework.getFrame(), "", listener);
2 26 Feb 07 jari 78             this.progress.show();
2 26 Feb 07 jari 79             
2 26 Feb 07 jari 80             long start = System.currentTimeMillis();
2 26 Feb 07 jari 81             AlgorithmData genes_result = null;
2 26 Feb 07 jari 82             if (dialog.isClusterGenes()) {
2 26 Feb 07 jari 83                 progress.setTitle("Clustering by Genes");
2 26 Feb 07 jari 84                 data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 85                 genes_result = algorithm.execute(data);
2 26 Feb 07 jari 86                 validate(genes_result);
2 26 Feb 07 jari 87             }
2 26 Feb 07 jari 88             AlgorithmData samples_result = null;
2 26 Feb 07 jari 89             if (dialog.isClusterExperiments()) {
2 26 Feb 07 jari 90                 progress.setTitle("Clustering by Examples");
2 26 Feb 07 jari 91                 data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 92                 samples_result = algorithm.execute(data);
2 26 Feb 07 jari 93                 validate(samples_result);
2 26 Feb 07 jari 94             }
2 26 Feb 07 jari 95             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 96             
2 26 Feb 07 jari 97             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 98             info.time = time;
2 26 Feb 07 jari 99             info.method = method;
2 26 Feb 07 jari 100             info.function = menu.getFunctionName(function);
2 26 Feb 07 jari 101             return createResultTree(experiment, genes_result, samples_result, info);
2 26 Feb 07 jari 102             
2 26 Feb 07 jari 103         } finally {
2 26 Feb 07 jari 104             if (algorithm != null) {
2 26 Feb 07 jari 105                 algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 106             }
2 26 Feb 07 jari 107             if (progress != null) {
2 26 Feb 07 jari 108                 progress.dispose();
2 26 Feb 07 jari 109             }
2 26 Feb 07 jari 110         }
2 26 Feb 07 jari 111     }
2 26 Feb 07 jari 112     
2 26 Feb 07 jari 113     
2 26 Feb 07 jari 114     
2 26 Feb 07 jari 115     /*
2 26 Feb 07 jari 116      * Scripting Methods
2 26 Feb 07 jari 117      */
2 26 Feb 07 jari 118     
2 26 Feb 07 jari 119     public AlgorithmData getScriptParameters(IFramework framework) {
2 26 Feb 07 jari 120         IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 121         int function = menu.getDistanceFunction();
2 26 Feb 07 jari 122         if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 123             function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 124         }        
2 26 Feb 07 jari 125         
2 26 Feb 07 jari 126         HCLInitDialog dialog = new HCLInitDialog(framework.getFrame(), menu.getFunctionName(function), menu.isAbsoluteDistance(), true);
2 26 Feb 07 jari 127
2 26 Feb 07 jari 128         if (dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 129             return null;
2 26 Feb 07 jari 130         }
2 26 Feb 07 jari 131         int method = dialog.getMethod();
2 26 Feb 07 jari 132         function = dialog.getDistanceMetric();  
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 135                 
2 26 Feb 07 jari 136         data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 137         data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 138         data.addParam("distance-absolute", String.valueOf(dialog.getAbsoluteSelection()));
2 26 Feb 07 jari 139         data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 140         
2 26 Feb 07 jari 141         if (dialog.isClusterGenes())
2 26 Feb 07 jari 142             data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 143         
2 26 Feb 07 jari 144         if (dialog.isClusterExperiments())
2 26 Feb 07 jari 145             data.addParam("calculate-experiments", String.valueOf(true));
2 26 Feb 07 jari 146         
2 26 Feb 07 jari 147         //script control parameters
2 26 Feb 07 jari 148         
2 26 Feb 07 jari 149         // alg name
2 26 Feb 07 jari 150         data.addParam("name", "HCL");
2 26 Feb 07 jari 151         
2 26 Feb 07 jari 152         // alg type
2 26 Feb 07 jari 153         data.addParam("alg-type", "cluster");
2 26 Feb 07 jari 154         
2 26 Feb 07 jari 155         // output class
2 26 Feb 07 jari 156         data.addParam("output-class", "single-output");
2 26 Feb 07 jari 157         
2 26 Feb 07 jari 158         //output nodes
2 26 Feb 07 jari 159         String [] outputNodes = new String[1];
2 26 Feb 07 jari 160         outputNodes[0] = "Single Ordered Output";
2 26 Feb 07 jari 161         data.addStringArray("output-nodes", outputNodes);
2 26 Feb 07 jari 162         
2 26 Feb 07 jari 163         return data;
2 26 Feb 07 jari 164     }
2 26 Feb 07 jari 165     
2 26 Feb 07 jari 166     
2 26 Feb 07 jari 167     public DefaultMutableTreeNode executeScript(IFramework framework, AlgorithmData algData, Experiment experiment) throws AlgorithmException {
2 26 Feb 07 jari 168         Listener listener = new Listener();
2 26 Feb 07 jari 169         
2 26 Feb 07 jari 170         try {
2 26 Feb 07 jari 171             algData.addMatrix("experiment", experiment.getMatrix());
2 26 Feb 07 jari 172             
2 26 Feb 07 jari 173             AlgorithmParameters params = algData.getParams();
2 26 Feb 07 jari 174             boolean clusterGenes = params.getBoolean("calculate-genes");
2 26 Feb 07 jari 175             boolean clusterExperiments = params.getBoolean("calculate-experiments");
2 26 Feb 07 jari 176             
2 26 Feb 07 jari 177             AlgorithmFactory factory = framework.getAlgorithmFactory();
2 26 Feb 07 jari 178             this.algorithm = factory.getAlgorithm("HCL");
2 26 Feb 07 jari 179             algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 180             
2 26 Feb 07 jari 181             this.progress = new Progress(framework.getFrame(), "", listener);
2 26 Feb 07 jari 182             this.progress.show();
2 26 Feb 07 jari 183             
2 26 Feb 07 jari 184             long start = System.currentTimeMillis();
2 26 Feb 07 jari 185             
2 26 Feb 07 jari 186             AlgorithmData genes_result = null;
2 26 Feb 07 jari 187             if (clusterGenes) {
2 26 Feb 07 jari 188                 progress.setTitle("Clustering by Genes");
2 26 Feb 07 jari 189                 algData.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 190                 genes_result = algorithm.execute(algData);
2 26 Feb 07 jari 191                 validate(genes_result);
2 26 Feb 07 jari 192             }
2 26 Feb 07 jari 193             AlgorithmData samples_result = null;
2 26 Feb 07 jari 194             if (clusterExperiments) {
2 26 Feb 07 jari 195                 progress.setTitle("Clustering by Examples");
2 26 Feb 07 jari 196                 algData.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 197                 samples_result = algorithm.execute(algData);
2 26 Feb 07 jari 198                 validate(samples_result);
2 26 Feb 07 jari 199             }
2 26 Feb 07 jari 200             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 201             
2 26 Feb 07 jari 202             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 203             info.time = time;
2 26 Feb 07 jari 204             info.method = params.getInt("method-linkage");
2 26 Feb 07 jari 205             info.function = framework.getDistanceMenu().getFunctionName(params.getInt("distance-function"));
2 26 Feb 07 jari 206             return createResultTree(experiment, genes_result, samples_result, info);
2 26 Feb 07 jari 207             
2 26 Feb 07 jari 208         } finally {
2 26 Feb 07 jari 209             if (algorithm != null) {
2 26 Feb 07 jari 210                 algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 211             }
2 26 Feb 07 jari 212             if (progress != null) {
2 26 Feb 07 jari 213                 progress.dispose();
2 26 Feb 07 jari 214             }
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      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 221      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 222      */
2 26 Feb 07 jari 223     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 224         if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 225             throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 226         }
2 26 Feb 07 jari 227         if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 228             throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 229         }
2 26 Feb 07 jari 230         if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 231             throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 232         }
2 26 Feb 07 jari 233         if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 234             throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 235         }
2 26 Feb 07 jari 236     }
2 26 Feb 07 jari 237     
2 26 Feb 07 jari 238     /**
2 26 Feb 07 jari 239      * Creates a result tree.
2 26 Feb 07 jari 240      */
2 26 Feb 07 jari 241     private DefaultMutableTreeNode createResultTree(Experiment experiment, AlgorithmData genes_result, AlgorithmData samples_result, GeneralInfo info) {
2 26 Feb 07 jari 242         DefaultMutableTreeNode root = new DefaultMutableTreeNode("HCL");
2 26 Feb 07 jari 243         root.add(new DefaultMutableTreeNode(new LeafInfo("HCL Tree", createHCLViewer(experiment, genes_result, samples_result, root))));
2 26 Feb 07 jari 244         if(genes_result != null)
2 26 Feb 07 jari 245             root.add(new DefaultMutableTreeNode(new LeafInfo("Gene Node Height Plot", new HCLNodeHeightGraph(getHCLTreeData(genes_result), true))));
2 26 Feb 07 jari 246         if(samples_result != null)
2 26 Feb 07 jari 247             root.add(new DefaultMutableTreeNode(new LeafInfo("Sample Node Height Plot", new HCLNodeHeightGraph(getHCLTreeData(samples_result), false))));
2 26 Feb 07 jari 248         addGeneralInfo(root, info);
2 26 Feb 07 jari 249         return root;
2 26 Feb 07 jari 250     }
2 26 Feb 07 jari 251     
2 26 Feb 07 jari 252     /**
2 26 Feb 07 jari 253      * Returns a hcl tree data from the specified AlgorithmData structure.
2 26 Feb 07 jari 254      */
2 26 Feb 07 jari 255     private HCLTreeData getHCLTreeData(AlgorithmData result) {
2 26 Feb 07 jari 256         if (result == null) {
2 26 Feb 07 jari 257             return null;
2 26 Feb 07 jari 258         }
2 26 Feb 07 jari 259         HCLTreeData data = new HCLTreeData();
2 26 Feb 07 jari 260         data.child_1_array = result.getIntArray("child-1-array");
2 26 Feb 07 jari 261         data.child_2_array = result.getIntArray("child-2-array");
2 26 Feb 07 jari 262         data.node_order = result.getIntArray("node-order");
2 26 Feb 07 jari 263         data.height = result.getMatrix("height").getRowPackedCopy();
2 26 Feb 07 jari 264         return data;
2 26 Feb 07 jari 265     }
2 26 Feb 07 jari 266     
2 26 Feb 07 jari 267     /**
2 26 Feb 07 jari 268      * Creates an <code>HCLViewer</code>.
2 26 Feb 07 jari 269      */
2 26 Feb 07 jari 270     private IViewer createHCLViewer(Experiment experiment, AlgorithmData genes_result, AlgorithmData samples_result, DefaultMutableTreeNode root) {
2 26 Feb 07 jari 271         return new HCLViewer(experiment, null, getHCLTreeData(genes_result), getHCLTreeData(samples_result), root);
2 26 Feb 07 jari 272     }
2 26 Feb 07 jari 273     
2 26 Feb 07 jari 274     /**
2 26 Feb 07 jari 275      * Adds node with general iformation.
2 26 Feb 07 jari 276      */
2 26 Feb 07 jari 277     private void addGeneralInfo(DefaultMutableTreeNode root, GeneralInfo info) {
2 26 Feb 07 jari 278         DefaultMutableTreeNode node = new DefaultMutableTreeNode("General Information");
2 26 Feb 07 jari 279         node.add(new DefaultMutableTreeNode("Linkage Method: "+info.getMethodName()));
2 26 Feb 07 jari 280         node.add(new DefaultMutableTreeNode("Time: "+String.valueOf(info.time)+" ms"));
2 26 Feb 07 jari 281         node.add(new DefaultMutableTreeNode(info.function));
2 26 Feb 07 jari 282         root.add(node);
2 26 Feb 07 jari 283     }
2 26 Feb 07 jari 284     
2 26 Feb 07 jari 285     
2 26 Feb 07 jari 286     /**
2 26 Feb 07 jari 287      * The class to listen to algorithm events.
2 26 Feb 07 jari 288      */
2 26 Feb 07 jari 289     private class Listener extends DialogListener implements AlgorithmListener {
2 26 Feb 07 jari 290         
2 26 Feb 07 jari 291         public void valueChanged(AlgorithmEvent event) {
2 26 Feb 07 jari 292             switch (event.getId()) {
2 26 Feb 07 jari 293                 case AlgorithmEvent.SET_UNITS:
2 26 Feb 07 jari 294                     progress.setUnits(event.getIntValue());
2 26 Feb 07 jari 295                     progress.setDescription(event.getDescription());
2 26 Feb 07 jari 296                     break;
2 26 Feb 07 jari 297                 case AlgorithmEvent.PROGRESS_VALUE:
2 26 Feb 07 jari 298                     progress.setValue(event.getIntValue());
2 26 Feb 07 jari 299                     progress.setDescription(event.getDescription());
2 26 Feb 07 jari 300                     break;
2 26 Feb 07 jari 301             }
2 26 Feb 07 jari 302         }
2 26 Feb 07 jari 303         
2 26 Feb 07 jari 304         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 305             String command = e.getActionCommand();
2 26 Feb 07 jari 306             if (command.equals("cancel-command")) {
2 26 Feb 07 jari 307                 algorithm.abort();
2 26 Feb 07 jari 308                 progress.dispose();
2 26 Feb 07 jari 309             }
2 26 Feb 07 jari 310         }
2 26 Feb 07 jari 311         
2 26 Feb 07 jari 312         public void windowClosing(WindowEvent e) {
2 26 Feb 07 jari 313             algorithm.abort();
2 26 Feb 07 jari 314             progress.dispose();
2 26 Feb 07 jari 315         }
2 26 Feb 07 jari 316     }
2 26 Feb 07 jari 317     
2 26 Feb 07 jari 318     /**
2 26 Feb 07 jari 319      * General info structure.
2 26 Feb 07 jari 320      */
2 26 Feb 07 jari 321     public static class GeneralInfo {
2 26 Feb 07 jari 322         public long time;
2 26 Feb 07 jari 323         public int method;
2 26 Feb 07 jari 324         public String function;
2 26 Feb 07 jari 325         
2 26 Feb 07 jari 326         public String getMethodName() {
2 26 Feb 07 jari 327             return getMethodName(method);
2 26 Feb 07 jari 328         }
2 26 Feb 07 jari 329         
2 26 Feb 07 jari 330         public static String getMethodName(int method) {
2 26 Feb 07 jari 331             method = method == -1 ? 2 : method;
2 26 Feb 07 jari 332             return methods[method];
2 26 Feb 07 jari 333         }
2 26 Feb 07 jari 334         
2 26 Feb 07 jari 335         private static String[] methods = {"average linkage", "complete linkage", "single linkage"};
2 26 Feb 07 jari 336     }
2 26 Feb 07 jari 337     
2 26 Feb 07 jari 338     public static void printResult(AlgorithmData result) {
2 26 Feb 07 jari 339         FloatMatrix similarity = result.getMatrix("similarity-matrix");
2 26 Feb 07 jari 340         similarity.print(5, 2);
2 26 Feb 07 jari 341         int[] parent = result.getIntArray("parent-array");
2 26 Feb 07 jari 342         int[] child1 = result.getIntArray("child-1-array");
2 26 Feb 07 jari 343         int[] child2 = result.getIntArray("child-2-array");
2 26 Feb 07 jari 344         int[] nodeOrder = result.getIntArray("node-order");
2 26 Feb 07 jari 345         int[] nodeHeight = result.getIntArray("node-height");
2 26 Feb 07 jari 346         int[] numberOfChildren = result.getIntArray("number-of-children");
2 26 Feb 07 jari 347         float[] height = result.getMatrix("height").getRowPackedCopy();
2 26 Feb 07 jari 348     }
2 26 Feb 07 jari 349 }