mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/fom/FOMGUI.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 /*
2 26 Feb 07 jari 2 Copyright @ 1999-2004, 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: FOMGUI.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.8 $
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.fom;
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.JFrame;
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.AbortException;
2 26 Feb 07 jari 21 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 22 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 23 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 24 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
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 FOMGUI 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     private boolean clusterGenes;
2 26 Feb 07 jari 43     
2 26 Feb 07 jari 44     /**
2 26 Feb 07 jari 45      * This method returns a tree with fom calculation results or
2 26 Feb 07 jari 46      * null, if analysis start was canceled.
2 26 Feb 07 jari 47      *
2 26 Feb 07 jari 48      * @param framework the reference to <code>IFramework</code> implementation,
2 26 Feb 07 jari 49      *        which is used to obtain an initial analysis data and parameters.
2 26 Feb 07 jari 50      * @throws AlgorithmException if calculation was failed.
2 26 Feb 07 jari 51      * @throws AbortException if calculation was canceled.
2 26 Feb 07 jari 52      * @see IFramework
2 26 Feb 07 jari 53      */
2 26 Feb 07 jari 54     public DefaultMutableTreeNode execute(IFramework framework) throws AlgorithmException {
2 26 Feb 07 jari 55         FOMInitDialog fom_dialog = new FOMInitDialog((JFrame)framework.getFrame(), true);
2 26 Feb 07 jari 56         fom_dialog.setVisible(true);
2 26 Feb 07 jari 57         /*
2 26 Feb 07 jari 58         if (fom_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 59             return null;
2 26 Feb 07 jari 60         }
2 26 Feb 07 jari 61          */
2 26 Feb 07 jari 62         if (!fom_dialog.isOkPressed()) {
2 26 Feb 07 jari 63             return null;
2 26 Feb 07 jari 64         }
2 26 Feb 07 jari 65         int fomIterations = fom_dialog.getFOMIterations();  //fom iterations
2 26 Feb 07 jari 66         int method = fom_dialog.getMethod();
2 26 Feb 07 jari 67         float interval = fom_dialog.getInterval();          //Cast threshold interval
2 26 Feb 07 jari 68         int numberOfClusters = fom_dialog.getIterations();  //KMC number of clusters (max)
2 26 Feb 07 jari 69         int iterations = fom_dialog.getKMCIterations();     //KMC max number of iterations/kmc run
2 26 Feb 07 jari 70         boolean average = fom_dialog.isAverage();
2 26 Feb 07 jari 71         boolean calculateMeans = fom_dialog.useMeans();
2 26 Feb 07 jari 72         clusterGenes = fom_dialog.isClusterGenes();
2 26 Feb 07 jari 73         
2 26 Feb 07 jari 74         Experiment experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 75         
2 26 Feb 07 jari 76         
2 26 Feb 07 jari 77         Listener listener = new Listener();
2 26 Feb 07 jari 78         try {
2 26 Feb 07 jari 79             this.algorithm = framework.getAlgorithmFactory().getAlgorithm("FOM");
2 26 Feb 07 jari 80             this.algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 81             
2 26 Feb 07 jari 82             int genes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 83             
2 26 Feb 07 jari 84             this.progress = new Progress(framework.getFrame(), "Calculating FOM values", listener);
2 26 Feb 07 jari 85             this.progress.show();
2 26 Feb 07 jari 86             
2 26 Feb 07 jari 87             AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 88             FloatMatrix matrix = experiment.getMatrix();
2 26 Feb 07 jari 89             if(!clusterGenes)
2 26 Feb 07 jari 90                 matrix = matrix.transpose();
2 26 Feb 07 jari 91             data.addMatrix("experiment", matrix);
2 26 Feb 07 jari 92             data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 93             IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 94             data.addParam("distance-absolute", String.valueOf(menu.isAbsoluteDistance()));
2 26 Feb 07 jari 95             int function = menu.getDistanceFunction();
2 26 Feb 07 jari 96             if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 97                 function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 98             }
2 26 Feb 07 jari 99             data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 100             if(method != 2)
2 26 Feb 07 jari 101                 fomIterations = 1;
2 26 Feb 07 jari 102             data.addParam("fom-iterations", String.valueOf(fomIterations));
2 26 Feb 07 jari 103             data.addParam("method", String.valueOf(method));
2 26 Feb 07 jari 104             data.addParam("cluster-genes", String.valueOf(clusterGenes));
2 26 Feb 07 jari 105             data.addParam("number-of-clusters", String.valueOf(numberOfClusters));
2 26 Feb 07 jari 106             data.addParam("interval", String.valueOf(interval));
2 26 Feb 07 jari 107             data.addParam("iterations", String.valueOf(iterations));
2 26 Feb 07 jari 108             data.addParam("average", String.valueOf(average));
2 26 Feb 07 jari 109             data.addParam("calculate-means", String.valueOf(calculateMeans));
2 26 Feb 07 jari 110             
2 26 Feb 07 jari 111             long start = System.currentTimeMillis();
2 26 Feb 07 jari 112             AlgorithmData result = this.algorithm.execute(data);
2 26 Feb 07 jari 113             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 114             // getting the results
2 26 Feb 07 jari 115             float[] fom_values = null;
2 26 Feb 07 jari 116             if(method != 2) {
2 26 Feb 07 jari 117                 FloatMatrix fm = result.getMatrix("fom-values");
2 26 Feb 07 jari 118                 if(fm != null)
2 26 Feb 07 jari 119                     fom_values = fm.A[0];
2 26 Feb 07 jari 120             }
2 26 Feb 07 jari 121             
2 26 Feb 07 jari 122             int[] numOfCastClusters = result.getIntArray("numOfCastClusters");
2 26 Feb 07 jari 123             
2 26 Feb 07 jari 124             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 125             info.fomIterations = fomIterations;
2 26 Feb 07 jari 126             info.average = average;
2 26 Feb 07 jari 127             info.function = menu.getFunctionName(function);
2 26 Feb 07 jari 128             info.interval = interval;
2 26 Feb 07 jari 129             info.iterations = iterations;
2 26 Feb 07 jari 130             info.method = method;
2 26 Feb 07 jari 131             if (method == 2) {
2 26 Feb 07 jari 132                 if(calculateMeans) {
2 26 Feb 07 jari 133                     info.kMeansOrKMedians = "Calculated Means";
2 26 Feb 07 jari 134                 } else {
2 26 Feb 07 jari 135                     info.kMeansOrKMedians = "Calculated Medians";
2 26 Feb 07 jari 136                 }
2 26 Feb 07 jari 137             }
2 26 Feb 07 jari 138             info.time = time;
2 26 Feb 07 jari 139             if(method == 2) {
2 26 Feb 07 jari 140                 FloatMatrix resultMatrix = result.getMatrix("fom-matrix");
2 26 Feb 07 jari 141                 
2 26 Feb 07 jari 142                 float [] means = getMeans(resultMatrix);
2 26 Feb 07 jari 143                 float [] variances = null;
2 26 Feb 07 jari 144                 
2 26 Feb 07 jari 145                 if(resultMatrix != null && resultMatrix.getRowDimension() > 1)
2 26 Feb 07 jari 146                     variances = getVariances(resultMatrix, means);
2 26 Feb 07 jari 147                 
2 26 Feb 07 jari 148                 return createResultTree(means, variances, resultMatrix.A, info, interval, numOfCastClusters);
2 26 Feb 07 jari 149             } else {
2 26 Feb 07 jari 150                 return createResultTree(fom_values, null, null, info, interval, numOfCastClusters);
2 26 Feb 07 jari 151             }
2 26 Feb 07 jari 152             
2 26 Feb 07 jari 153         } finally {
2 26 Feb 07 jari 154             if (this.algorithm != null) {
2 26 Feb 07 jari 155                 this.algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 156             }
2 26 Feb 07 jari 157             if (this.progress != null) {
2 26 Feb 07 jari 158                 this.progress.dispose();
2 26 Feb 07 jari 159             }
2 26 Feb 07 jari 160         }
2 26 Feb 07 jari 161     }
2 26 Feb 07 jari 162     
2 26 Feb 07 jari 163     
2 26 Feb 07 jari 164     
2 26 Feb 07 jari 165     
2 26 Feb 07 jari 166     public AlgorithmData getScriptParameters(IFramework framework) {
2 26 Feb 07 jari 167         FOMInitDialog fom_dialog = new FOMInitDialog((JFrame)framework.getFrame(), true);
2 26 Feb 07 jari 168         fom_dialog.setVisible(true);
2 26 Feb 07 jari 169         /*
2 26 Feb 07 jari 170         if (fom_dialog.showModal() != JOptionPane.OK_OPTION) {
2 26 Feb 07 jari 171             return null;
2 26 Feb 07 jari 172         }
2 26 Feb 07 jari 173          */
2 26 Feb 07 jari 174         if (!fom_dialog.isOkPressed()) {
2 26 Feb 07 jari 175             return null;
2 26 Feb 07 jari 176         }
2 26 Feb 07 jari 177         int fomIterations = fom_dialog.getFOMIterations();  //fom iterations
2 26 Feb 07 jari 178         int method = fom_dialog.getMethod();
2 26 Feb 07 jari 179         float interval = fom_dialog.getInterval();          //Cast threshold interval
2 26 Feb 07 jari 180         int numberOfClusters = fom_dialog.getIterations();  //KMC number of clusters (max)
2 26 Feb 07 jari 181         int iterations = fom_dialog.getKMCIterations();     //KMC max number of iterations/kmc run
2 26 Feb 07 jari 182         boolean average = fom_dialog.isAverage();
2 26 Feb 07 jari 183         boolean calculateMeans = fom_dialog.useMeans();
2 26 Feb 07 jari 184         clusterGenes = fom_dialog.isClusterGenes();
2 26 Feb 07 jari 185         
2 26 Feb 07 jari 186         Experiment experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 187         
2 26 Feb 07 jari 188             int genes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 189
2 26 Feb 07 jari 190             AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 191
2 26 Feb 07 jari 192             data.addParam("distance-factor", String.valueOf(1.0f));
2 26 Feb 07 jari 193             IDistanceMenu menu = framework.getDistanceMenu();
2 26 Feb 07 jari 194             data.addParam("distance-absolute", String.valueOf(menu.isAbsoluteDistance()));
2 26 Feb 07 jari 195             int function = menu.getDistanceFunction();
2 26 Feb 07 jari 196             if (function == Algorithm.DEFAULT) {
2 26 Feb 07 jari 197                 function = Algorithm.EUCLIDEAN;
2 26 Feb 07 jari 198             }
2 26 Feb 07 jari 199             data.addParam("distance-function", String.valueOf(function));
2 26 Feb 07 jari 200             if(method != 2)
2 26 Feb 07 jari 201                 fomIterations = 1;
2 26 Feb 07 jari 202             data.addParam("fom-iterations", String.valueOf(fomIterations));
2 26 Feb 07 jari 203             data.addParam("method", String.valueOf(method));
2 26 Feb 07 jari 204             data.addParam("cluster-genes", String.valueOf(clusterGenes));
2 26 Feb 07 jari 205             data.addParam("number-of-clusters", String.valueOf(numberOfClusters));
2 26 Feb 07 jari 206             data.addParam("interval", String.valueOf(interval));
2 26 Feb 07 jari 207             data.addParam("iterations", String.valueOf(iterations));
2 26 Feb 07 jari 208             data.addParam("average", String.valueOf(average));
2 26 Feb 07 jari 209             data.addParam("calculate-means", String.valueOf(calculateMeans));
2 26 Feb 07 jari 210             
2 26 Feb 07 jari 211             //script control parameters
2 26 Feb 07 jari 212             
2 26 Feb 07 jari 213             // alg name
2 26 Feb 07 jari 214             data.addParam("name", "FOM");
2 26 Feb 07 jari 215             
2 26 Feb 07 jari 216             // alg type
2 26 Feb 07 jari 217             data.addParam("alg-type", "cluster");
2 26 Feb 07 jari 218             
2 26 Feb 07 jari 219             // output class
2 26 Feb 07 jari 220             data.addParam("output-class", "single-output");
2 26 Feb 07 jari 221             
2 26 Feb 07 jari 222             //output nodes
2 26 Feb 07 jari 223             String [] outputNodes = new String[1];
2 26 Feb 07 jari 224             outputNodes[0] = "FOM Result";
2 26 Feb 07 jari 225             data.addStringArray("output-nodes", outputNodes);
2 26 Feb 07 jari 226             
2 26 Feb 07 jari 227             return data;
2 26 Feb 07 jari 228         }
2 26 Feb 07 jari 229     
2 26 Feb 07 jari 230     
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         public DefaultMutableTreeNode executeScript(IFramework framework, AlgorithmData algData, Experiment experiment) throws AlgorithmException {
2 26 Feb 07 jari 233             AlgorithmParameters params = algData.getParams();
2 26 Feb 07 jari 234             this.clusterGenes = params.getBoolean("cluster-genes");  
2 26 Feb 07 jari 235
2 26 Feb 07 jari 236             int method = params.getInt("method");
2 26 Feb 07 jari 237             float interval = params.getFloat("interval");
2 26 Feb 07 jari 238             boolean calculateMeans = true; 
2 26 Feb 07 jari 239             if(method == 2)
2 26 Feb 07 jari 240                 calculateMeans = params.getBoolean("calculate-means");
2 26 Feb 07 jari 241                 
2 26 Feb 07 jari 242             Listener listener = new Listener();
2 26 Feb 07 jari 243         try {
2 26 Feb 07 jari 244             this.algorithm = framework.getAlgorithmFactory().getAlgorithm("FOM");
2 26 Feb 07 jari 245             this.algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 246             
2 26 Feb 07 jari 247             int genes = experiment.getNumberOfGenes();
2 26 Feb 07 jari 248             
2 26 Feb 07 jari 249             this.progress = new Progress(framework.getFrame(), "Calculating FOM values", listener);
2 26 Feb 07 jari 250             this.progress.show();
2 26 Feb 07 jari 251             
2 26 Feb 07 jari 252             AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 253             FloatMatrix matrix = experiment.getMatrix();
2 26 Feb 07 jari 254             if(!clusterGenes)
2 26 Feb 07 jari 255                 matrix = matrix.transpose();
2 26 Feb 07 jari 256             algData.addMatrix("experiment", matrix);
2 26 Feb 07 jari 257             
2 26 Feb 07 jari 258             long start = System.currentTimeMillis();
2 26 Feb 07 jari 259             AlgorithmData result = this.algorithm.execute(algData);
2 26 Feb 07 jari 260             long time = System.currentTimeMillis() - start;
2 26 Feb 07 jari 261             // getting the results
2 26 Feb 07 jari 262             float[] fom_values = null;
2 26 Feb 07 jari 263             if(method != 2) {
2 26 Feb 07 jari 264                 FloatMatrix fm = result.getMatrix("fom-values");
2 26 Feb 07 jari 265                 if(fm != null)
2 26 Feb 07 jari 266                     fom_values = fm.A[0];
2 26 Feb 07 jari 267             }
2 26 Feb 07 jari 268             
2 26 Feb 07 jari 269             int[] numOfCastClusters = result.getIntArray("numOfCastClusters");
2 26 Feb 07 jari 270
2 26 Feb 07 jari 271             GeneralInfo info = new GeneralInfo();
2 26 Feb 07 jari 272             info.fomIterations = params.getInt("fom-iterations");
2 26 Feb 07 jari 273             info.average = params.getBoolean("average");
2 26 Feb 07 jari 274             int function = params.getInt("distance-function");
2 26 Feb 07 jari 275             info.function = framework.getDistanceMenu().getFunctionName(function);
2 26 Feb 07 jari 276             info.interval = params.getFloat("interval");
2 26 Feb 07 jari 277             info.iterations = params.getInt("iterations");
2 26 Feb 07 jari 278             info.method = method;
2 26 Feb 07 jari 279             if (method == 2) {
2 26 Feb 07 jari 280                 if(calculateMeans) {
2 26 Feb 07 jari 281                     info.kMeansOrKMedians = "Calculated Means";
2 26 Feb 07 jari 282                 } else {
2 26 Feb 07 jari 283                     info.kMeansOrKMedians = "Calculated Medians";
2 26 Feb 07 jari 284                 }
2 26 Feb 07 jari 285             }
2 26 Feb 07 jari 286             info.time = time;
2 26 Feb 07 jari 287             if(method == 2) {
2 26 Feb 07 jari 288                 FloatMatrix resultMatrix = result.getMatrix("fom-matrix");
2 26 Feb 07 jari 289                 
2 26 Feb 07 jari 290                 float [] means = getMeans(resultMatrix);
2 26 Feb 07 jari 291                 float [] variances = null;
2 26 Feb 07 jari 292                 
2 26 Feb 07 jari 293                 if(resultMatrix != null && resultMatrix.getRowDimension() > 1)
2 26 Feb 07 jari 294                     variances = getVariances(resultMatrix, means);
2 26 Feb 07 jari 295                 
2 26 Feb 07 jari 296                 return createResultTree(means, variances, resultMatrix.A, info, interval, numOfCastClusters);
2 26 Feb 07 jari 297             } else {
2 26 Feb 07 jari 298                 return createResultTree(fom_values, null, null, info, interval, numOfCastClusters);
2 26 Feb 07 jari 299             }
2 26 Feb 07 jari 300             
2 26 Feb 07 jari 301         } finally {
2 26 Feb 07 jari 302             if (this.algorithm != null) {
2 26 Feb 07 jari 303                 this.algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 304             }
2 26 Feb 07 jari 305             if (this.progress != null) {
2 26 Feb 07 jari 306                 this.progress.dispose();
2 26 Feb 07 jari 307             }
2 26 Feb 07 jari 308         }
2 26 Feb 07 jari 309         }
2 26 Feb 07 jari 310         
2 26 Feb 07 jari 311         
2 26 Feb 07 jari 312         /**
2 26 Feb 07 jari 313          * Creates a result tree to be inserted into the framework analysis node.
2 26 Feb 07 jari 314          */
2 26 Feb 07 jari 315         private DefaultMutableTreeNode createResultTree(float[] fom_values, float[] fom_vars, float [][] iValues, GeneralInfo info, float interval, int[] numOfCastClusters) {
2 26 Feb 07 jari 316             DefaultMutableTreeNode root;
2 26 Feb 07 jari 317             if(this.clusterGenes)
2 26 Feb 07 jari 318                 root = new DefaultMutableTreeNode("FOM - genes");
2 26 Feb 07 jari 319             else
2 26 Feb 07 jari 320                 root = new DefaultMutableTreeNode("FOM - samples");
2 26 Feb 07 jari 321             addResultNodes(root, fom_values, fom_vars, iValues, info, interval, numOfCastClusters);
2 26 Feb 07 jari 322             return root;
2 26 Feb 07 jari 323         }
2 26 Feb 07 jari 324         
2 26 Feb 07 jari 325         /**
2 26 Feb 07 jari 326          * Adds result nodes into the tree root.
2 26 Feb 07 jari 327          */
2 26 Feb 07 jari 328         private void addResultNodes(DefaultMutableTreeNode root, float[] fom_values, float [] fom_vars, float [][] iValues, GeneralInfo info, float interval, int[] numOfCastClusters) {
2 26 Feb 07 jari 329             addGraphViewer(root, fom_values, fom_vars, iValues, info, interval, numOfCastClusters);
2 26 Feb 07 jari 330             addGeneralInfo(root, info);
2 26 Feb 07 jari 331         }
2 26 Feb 07 jari 332         
2 26 Feb 07 jari 333         private void addGraphViewer(DefaultMutableTreeNode root, float[] fom_values, float [] variances, float [][] iValues, GeneralInfo info, float interval, int[] numOfCastClusters) {
2 26 Feb 07 jari 334             IViewer viewer = null;
2 26 Feb 07 jari 335             if (info.method == 2) {
2 26 Feb 07 jari 336                 viewer = new KFOMViewer(fom_values, variances);
2 26 Feb 07 jari 337                 if(variances != null && iValues != null)
2 26 Feb 07 jari 338                     ((KFOMViewer)viewer).setFOMIterationValues(iValues);
2 26 Feb 07 jari 339                 
2 26 Feb 07 jari 340                 root.add(new DefaultMutableTreeNode(new LeafInfo("Graph - FOM value vs. # of Clusters", viewer)));
2 26 Feb 07 jari 341             }
2 26 Feb 07 jari 342             else {
2 26 Feb 07 jari 343                 viewer = new CastFOMViewerA(fom_values, interval, numOfCastClusters);//null;
2 26 Feb 07 jari 344                 IViewer viewer2 = new CastFOMViewerB(fom_values, interval, numOfCastClusters);
2 26 Feb 07 jari 345                 root.add(new DefaultMutableTreeNode(new LeafInfo("Graph - FOM value vs. Threshold", viewer)));
2 26 Feb 07 jari 346                 root.add(new DefaultMutableTreeNode(new LeafInfo("Graph - FOM value vs. # of Clusters", viewer2)));
2 26 Feb 07 jari 347             }
2 26 Feb 07 jari 348             
2 26 Feb 07 jari 349         }
2 26 Feb 07 jari 350         
2 26 Feb 07 jari 351         /**
2 26 Feb 07 jari 352          * Adds node with general iformation.
2 26 Feb 07 jari 353          */
2 26 Feb 07 jari 354         private void addGeneralInfo(DefaultMutableTreeNode root, GeneralInfo info) {
2 26 Feb 07 jari 355             DefaultMutableTreeNode node = new DefaultMutableTreeNode("General Information");
2 26 Feb 07 jari 356             if (info.method == 1) {
2 26 Feb 07 jari 357                 node.add(new DefaultMutableTreeNode("Method: "+info.getMethod()));
2 26 Feb 07 jari 358             }
2 26 Feb 07 jari 359             if (info.method == 2) {
2 26 Feb 07 jari 360                 node.add(new DefaultMutableTreeNode("Method: "+info.getMethod() + " : " + info.kMeansOrKMedians));
2 26 Feb 07 jari 361                 //node.add(new DefaultMutableTreeNode("K-Means or K-Medians: "+ info.kMeansOrKMedians));
2 26 Feb 07 jari 362                 node.add(new DefaultMutableTreeNode("FOM Iterations: "+String.valueOf(info.fomIterations)));
2 26 Feb 07 jari 363                 node.add(new DefaultMutableTreeNode("Max KMC Iterations: "+String.valueOf(info.iterations)));
2 26 Feb 07 jari 364             } else {
2 26 Feb 07 jari 365                 node.add(new DefaultMutableTreeNode("Interval: "+String.valueOf(info.interval)));
2 26 Feb 07 jari 366             }
2 26 Feb 07 jari 367             node.add(new DefaultMutableTreeNode("Average: "+String.valueOf(info.average)));
2 26 Feb 07 jari 368             node.add(new DefaultMutableTreeNode("Time: "+String.valueOf(info.time)+" ms"));
2 26 Feb 07 jari 369             node.add(new DefaultMutableTreeNode(info.function));
2 26 Feb 07 jari 370             root.add(node);
2 26 Feb 07 jari 371         }
2 26 Feb 07 jari 372         
2 26 Feb 07 jari 373         /**
2 26 Feb 07 jari 374          * The class to listen to progress, monitor and algorithms events.
2 26 Feb 07 jari 375          */
2 26 Feb 07 jari 376         private class Listener extends DialogListener implements AlgorithmListener {
2 26 Feb 07 jari 377             
2 26 Feb 07 jari 378             public void valueChanged(AlgorithmEvent event) {
2 26 Feb 07 jari 379                 switch (event.getId()) {
2 26 Feb 07 jari 380                     case AlgorithmEvent.SET_UNITS:
2 26 Feb 07 jari 381                         progress.setUnits(event.getIntValue());
2 26 Feb 07 jari 382                         progress.setDescription(event.getDescription());
2 26 Feb 07 jari 383                         break;
2 26 Feb 07 jari 384                     case AlgorithmEvent.PROGRESS_VALUE:
2 26 Feb 07 jari 385                         progress.setValue(event.getIntValue());
2 26 Feb 07 jari 386                         progress.setDescription(event.getDescription());
2 26 Feb 07 jari 387                         break;
2 26 Feb 07 jari 388                 }
2 26 Feb 07 jari 389             }
2 26 Feb 07 jari 390             
2 26 Feb 07 jari 391             public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 392                 String command = e.getActionCommand();
2 26 Feb 07 jari 393                 if (command.equals("cancel-command")) {
2 26 Feb 07 jari 394                     algorithm.abort();
2 26 Feb 07 jari 395                     progress.dispose();
2 26 Feb 07 jari 396                 }
2 26 Feb 07 jari 397             }
2 26 Feb 07 jari 398             
2 26 Feb 07 jari 399             public void windowClosing(WindowEvent e) {
2 26 Feb 07 jari 400                 algorithm.abort();
2 26 Feb 07 jari 401                 progress.dispose();
2 26 Feb 07 jari 402             }
2 26 Feb 07 jari 403         }
2 26 Feb 07 jari 404         
2 26 Feb 07 jari 405         // the general info structure
2 26 Feb 07 jari 406         private class GeneralInfo {
2 26 Feb 07 jari 407             public int method;
2 26 Feb 07 jari 408             public String kMeansOrKMedians;
2 26 Feb 07 jari 409             public float interval;
2 26 Feb 07 jari 410             public int iterations;
2 26 Feb 07 jari 411             public boolean average;
2 26 Feb 07 jari 412             public long time;
2 26 Feb 07 jari 413             public String function;
2 26 Feb 07 jari 414             public int fomIterations;
2 26 Feb 07 jari 415             
2 26 Feb 07 jari 416             public String getMethod() {
2 26 Feb 07 jari 417                 return method == 1 ? "CAST" : "KMC";
2 26 Feb 07 jari 418             }
2 26 Feb 07 jari 419         }
2 26 Feb 07 jari 420         
2 26 Feb 07 jari 421         
2 26 Feb 07 jari 422         /**
2 26 Feb 07 jari 423          *  Returns a set of means for an element
2 26 Feb 07 jari 424          */
2 26 Feb 07 jari 425         private float [] getMeans(FloatMatrix data){
2 26 Feb 07 jari 426             int nSamples = data.getColumnDimension();
2 26 Feb 07 jari 427             int nFOMI = data.getRowDimension();
2 26 Feb 07 jari 428             float [] means = new float[nSamples];
2 26 Feb 07 jari 429             float sum = 0;
2 26 Feb 07 jari 430             float n = 0;
2 26 Feb 07 jari 431             float value;
2 26 Feb 07 jari 432             for(int i = 0; i < nSamples; i++){
2 26 Feb 07 jari 433                 n = 0;
2 26 Feb 07 jari 434                 sum = 0;
2 26 Feb 07 jari 435                 for(int j = 0; j < nFOMI; j++){
2 26 Feb 07 jari 436                     value = data.get(j,i);
2 26 Feb 07 jari 437                     if(!Float.isNaN(value)){
2 26 Feb 07 jari 438                         sum += value;
2 26 Feb 07 jari 439                         n++;
2 26 Feb 07 jari 440                     }
2 26 Feb 07 jari 441                 }
2 26 Feb 07 jari 442                 if(n > 0)
2 26 Feb 07 jari 443                     means[i] = sum/n;
2 26 Feb 07 jari 444                 else
2 26 Feb 07 jari 445                     means[i] = Float.NaN;
2 26 Feb 07 jari 446             }
2 26 Feb 07 jari 447             return means;
2 26 Feb 07 jari 448         }
2 26 Feb 07 jari 449         
2 26 Feb 07 jari 450         private float [] getVariances(FloatMatrix values, float [] means) {
2 26 Feb 07 jari 451             int iterations = values.getRowDimension();
2 26 Feb 07 jari 452             int nSamples = values.getColumnDimension();
2 26 Feb 07 jari 453             float [] vars = new float[nSamples];
2 26 Feb 07 jari 454             
2 26 Feb 07 jari 455             if(iterations == 1)
2 26 Feb 07 jari 456                 return vars;
2 26 Feb 07 jari 457             
2 26 Feb 07 jari 458             for(int sample = 0; sample < nSamples; sample++) {
2 26 Feb 07 jari 459                 for(int iter = 0; iter < iterations; iter++) {
2 26 Feb 07 jari 460                     vars[sample] += Math.pow(values.A[iter][sample] - means[sample], 2);
2 26 Feb 07 jari 461                 }
2 26 Feb 07 jari 462                 vars[sample] = (float)Math.sqrt(vars[sample]/(iterations-1));
2 26 Feb 07 jari 463             }
2 26 Feb 07 jari 464             return vars;
2 26 Feb 07 jari 465         }
2 26 Feb 07 jari 466         
2 26 Feb 07 jari 467         
2 26 Feb 07 jari 468     }