mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/ease/EASEGUI.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: EASEGUI.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.8 $
2 26 Feb 07 jari 8  * $Date: 2006/02/23 20:59:50 $
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 /*
2 26 Feb 07 jari 13  * EASEGUI.java
2 26 Feb 07 jari 14  *
2 26 Feb 07 jari 15  * Created on August 22, 2003, 1:28 PM
2 26 Feb 07 jari 16  */
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 package org.tigr.microarray.mev.cluster.gui.impl.ease;
2 26 Feb 07 jari 19
2 26 Feb 07 jari 20 import java.io.BufferedReader;
2 26 Feb 07 jari 21 import java.io.File;
2 26 Feb 07 jari 22 import java.io.FileReader;
2 26 Feb 07 jari 23 import java.io.IOException;
2 26 Feb 07 jari 24 import java.util.Vector;
2 26 Feb 07 jari 25
2 26 Feb 07 jari 26 import javax.swing.JOptionPane;
2 26 Feb 07 jari 27 import javax.swing.tree.DefaultMutableTreeNode;
2 26 Feb 07 jari 28
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.algorithm.Algorithm;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmListener;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.clusterUtil.Cluster;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.clusterUtil.ClusterRepository;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.gui.Experiment;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.gui.IClusterGUI;
2 26 Feb 07 jari 39 import org.tigr.microarray.mev.cluster.gui.IFramework;
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.cluster.gui.IViewer;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.cluster.gui.LeafInfo;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.cluster.gui.helpers.CentroidUserObject;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.DialogListener;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Logger;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.cluster.gui.impl.dialogs.Progress;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.cluster.gui.impl.ease.gotree.GOTreeViewer;
2 26 Feb 07 jari 47 import org.tigr.microarray.mev.script.scriptGUI.IScriptGUI;
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49
2 26 Feb 07 jari 50 /** The <CODE>EASEGUI</CODE> class contains code to gather parameters
2 26 Feb 07 jari 51  * for EASE annotation analysis, to run the analysis, and to display
2 26 Feb 07 jari 52  * various results from the analysis.
2 26 Feb 07 jari 53  */
2 26 Feb 07 jari 54 public class EASEGUI implements IClusterGUI, IScriptGUI {
2 26 Feb 07 jari 55     
2 26 Feb 07 jari 56     /** The algorithm class for execution of EASE.
2 26 Feb 07 jari 57      */
2 26 Feb 07 jari 58     private Algorithm algorithm;
2 26 Feb 07 jari 59     /** The <CODE>AlgorithmData<\CODE> object to encapsulate parameters, input data, and results
2 26 Feb 07 jari 60      */
2 26 Feb 07 jari 61     private AlgorithmData algorithmData;
2 26 Feb 07 jari 62     /** The <CODE>Experiment</CODE> data wrapper class.
2 26 Feb 07 jari 63      */
2 26 Feb 07 jari 64     private Experiment experiment;
2 26 Feb 07 jari 65     /** The input <CODE>Cluster</CODE> object for cluster analysis
2 26 Feb 07 jari 66      */
2 26 Feb 07 jari 67     private Cluster cluster;
2 26 Feb 07 jari 68     /** Encapsulates the indices of clusters created by the analysis.
2 26 Feb 07 jari 69      */
2 26 Feb 07 jari 70     private int [][] clusters;
2 26 Feb 07 jari 71     /** Names of the theme categories found in the gene list.
2 26 Feb 07 jari 72      */
2 26 Feb 07 jari 73     private String [] categoryNames;
2 26 Feb 07 jari 74     /** The main result matrix for table display.
2 26 Feb 07 jari 75      */
2 26 Feb 07 jari 76     private String [][] resultMatrix;
2 26 Feb 07 jari 77     /** Indicates if accession numbers were appended.
2 26 Feb 07 jari 78      */
2 26 Feb 07 jari 79     private boolean haveAccessionNumbers;
2 26 Feb 07 jari 80     /** Indicates if the mode is cluster analysis (or if not then a survey)
2 26 Feb 07 jari 81      */
2 26 Feb 07 jari 82     private boolean isClusterAnalysis;
2 26 Feb 07 jari 83     /** Verbose progress dialog
2 26 Feb 07 jari 84      */
2 26 Feb 07 jari 85     private Logger logger;
2 26 Feb 07 jari 86     /** Optional progress bar.
2 26 Feb 07 jari 87      */
2 26 Feb 07 jari 88     private Progress progress;
2 26 Feb 07 jari 89     /** Algorithm event listener.
2 26 Feb 07 jari 90      */
2 26 Feb 07 jari 91     private Listener listener;
2 26 Feb 07 jari 92     
2 26 Feb 07 jari 93     boolean stop = false;
2 26 Feb 07 jari 94     /** Annotation type to use as a key (annotation field name)
2 26 Feb 07 jari 95      */
2 26 Feb 07 jari 96     private String annotationKeyType;
2 26 Feb 07 jari 97     /** Indicates path of EASE base file system for this analysis
2 26 Feb 07 jari 98      */
2 26 Feb 07 jari 99     private String baseFileSystem;
2 26 Feb 07 jari 100     /** Indicates if the algorithm run is via a script execution
2 26 Feb 07 jari 101      */
2 26 Feb 07 jari 102     boolean isScripting = false;
2 26 Feb 07 jari 103     
2 26 Feb 07 jari 104     /** Creates a new instance of EASEGUI */
2 26 Feb 07 jari 105     public EASEGUI() {
2 26 Feb 07 jari 106     }
2 26 Feb 07 jari 107     
2 26 Feb 07 jari 108     /** Accumulates parameters for execution of the EASE analysis
2 26 Feb 07 jari 109      * calls algorithm class and coordinates result viewer
2 26 Feb 07 jari 110      * creation.
2 26 Feb 07 jari 111      * @param framework The framework object
2 26 Feb 07 jari 112      * @throws AlgorithmException
2 26 Feb 07 jari 113      * @return
2 26 Feb 07 jari 114      */
2 26 Feb 07 jari 115     public DefaultMutableTreeNode execute(IFramework framework) throws AlgorithmException {
2 26 Feb 07 jari 116         
2 26 Feb 07 jari 117         algorithmData = new AlgorithmData();
2 26 Feb 07 jari 118         
2 26 Feb 07 jari 119         ClusterRepository repository = framework.getClusterRepository(Cluster.GENE_CLUSTER);
2 26 Feb 07 jari 120         
2 26 Feb 07 jari 121         EASEInitDialog dialog = new EASEInitDialog(framework.getFrame(), repository, framework.getData().getFieldNames());
2 26 Feb 07 jari 122         
2 26 Feb 07 jari 123         if(dialog.showModal() != JOptionPane.OK_OPTION)
2 26 Feb 07 jari 124             return null;
2 26 Feb 07 jari 125         
2 26 Feb 07 jari 126         listener = new Listener();
2 26 Feb 07 jari 127         logger = new Logger(framework.getFrame(), "EASE Analysis", listener);
2 26 Feb 07 jari 128         logger.show();
2 26 Feb 07 jari 129         progress = new Progress(framework.getFrame(), "Probability Analysis Resampling Progress", listener);
2 26 Feb 07 jari 130         
2 26 Feb 07 jari 131         baseFileSystem = dialog.getBaseFileLocation();
2 26 Feb 07 jari 132         algorithmData.addParam("base-file-system", baseFileSystem);
2 26 Feb 07 jari 133         isClusterAnalysis = dialog.isClusterModeSelected();
2 26 Feb 07 jari 134         String converterFileName = dialog.getConverterFileName();
2 26 Feb 07 jari 135         annotationKeyType = dialog.getAnnotationKeyType();
2 26 Feb 07 jari 136         String [] annotationFileList = dialog.getAnnToGOFileList();
2 26 Feb 07 jari 137         int minClusterSize = dialog.getMinClusterSize();
2 26 Feb 07 jari 138         int [] indices;
2 26 Feb 07 jari 139         boolean isPvalueCorrectionSelected;
2 26 Feb 07 jari 140         experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 141         
2 26 Feb 07 jari 142         if(isClusterAnalysis){
2 26 Feb 07 jari 143             cluster = dialog.getSelectedCluster();
2 26 Feb 07 jari 144             experiment = cluster.getExperiment();   //asign proper experiment object
2 26 Feb 07 jari 145             indices = cluster.getIndices();  //**These map to IDATA**
2 26 Feb 07 jari 146             algorithmData.addParam("report-ease-score", String.valueOf(dialog.isEaseScoreSelected()));
2 26 Feb 07 jari 147             isPvalueCorrectionSelected = dialog.isCorrectPvaluesSelected();
2 26 Feb 07 jari 148             algorithmData.addParam("p-value-corrections", String.valueOf(isPvalueCorrectionSelected));
2 26 Feb 07 jari 149             if(isPvalueCorrectionSelected){
2 26 Feb 07 jari 150                 algorithmData.addParam("bonferroni-correction", String.valueOf(dialog.isBonferroniSelected()));
2 26 Feb 07 jari 151                 algorithmData.addParam("bonferroni-step-down-correction", String.valueOf(dialog.isStepDownBonferroniSelected()));
2 26 Feb 07 jari 152                 algorithmData.addParam("sidak-correction", String.valueOf(dialog.isSidakSelected()));
2 26 Feb 07 jari 153             }
2 26 Feb 07 jari 154             
2 26 Feb 07 jari 155             algorithmData.addParam("run-permutation-analysis", String.valueOf(dialog.isPermutationAnalysisSelected()));
2 26 Feb 07 jari 156             if(dialog.isPermutationAnalysisSelected())
2 26 Feb 07 jari 157                 algorithmData.addParam("permutation-count", String.valueOf(dialog.getPermutationCount()));
2 26 Feb 07 jari 158             
2 26 Feb 07 jari 159             logger.append("Extracting Annotation Key Lists\n");
2 26 Feb 07 jari 160             String [] clusterKeys = framework.getData().getAnnotationList(annotationKeyType, indices);
2 26 Feb 07 jari 161             algorithmData.addStringArray("sample-list", clusterKeys);
2 26 Feb 07 jari 162             algorithmData.addIntArray("sample-indices", cluster.getExperimentIndices());  //drop in experiment indices
2 26 Feb 07 jari 163         }
2 26 Feb 07 jari 164         
2 26 Feb 07 jari 165         //Use file or IData for population, only permit file use for cluster analysis
2 26 Feb 07 jari 166         String [] populationKeys;
2 26 Feb 07 jari 167         if(isClusterAnalysis && dialog.isPopFileModeSelected()) {
2 26 Feb 07 jari 168             try {
2 26 Feb 07 jari 169                 populationKeys = getPopulationKeysFromFile(dialog.getPopulationFileName());
2 26 Feb 07 jari 170                 algorithmData.addParam("population-file-name", dialog.getPopulationFileName());
2 26 Feb 07 jari 171                 if(populationKeys == null) {
2 26 Feb 07 jari 172                     return null;
2 26 Feb 07 jari 173                 }
2 26 Feb 07 jari 174             } catch (IOException ioe) {
2 26 Feb 07 jari 175                 //Bad file format
2 26 Feb 07 jari 176                 JOptionPane.showMessageDialog(framework.getFrame(), "Error loading population file.", "Population File Load Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 177                 return null;
2 26 Feb 07 jari 178             }
2 26 Feb 07 jari 179         } else {
2 26 Feb 07 jari 180             //populationKeys = framework.getData().getAnnotationList(annotationKeyType, experiment.getRowMappingArrayCopy());
2 26 Feb 07 jari 181             populationKeys = framework.getData().getAnnotationList(annotationKeyType, framework.getData().getExperiment().getRowMappingArrayCopy());            
2 26 Feb 07 jari 182         }
2 26 Feb 07 jari 183         
2 26 Feb 07 jari 184         algorithmData.addParam("perform-cluster-analysis", String.valueOf(isClusterAnalysis));
2 26 Feb 07 jari 185         algorithmData.addStringArray("population-list", populationKeys);
2 26 Feb 07 jari 186         if(converterFileName != null)
2 26 Feb 07 jari 187             algorithmData.addParam("converter-file-name", converterFileName);
2 26 Feb 07 jari 188         algorithmData.addStringArray("annotation-file-list", annotationFileList);
2 26 Feb 07 jari 189         algorithmData.addMatrix("expression", experiment.getMatrix());
2 26 Feb 07 jari 190         
2 26 Feb 07 jari 191         //Trim options
2 26 Feb 07 jari 192         String [] trimOptions = dialog.getTrimOptions();
2 26 Feb 07 jari 193         algorithmData.addParam("trim-option", trimOptions[0]);
2 26 Feb 07 jari 194         algorithmData.addParam("trim-value", trimOptions[1]);
2 26 Feb 07 jari 195         
2 26 Feb 07 jari 196         algorithm = framework.getAlgorithmFactory().getAlgorithm("EASE");
2 26 Feb 07 jari 197         algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 198         algorithm.execute(algorithmData);
2 26 Feb 07 jari 199         
2 26 Feb 07 jari 200         if(stop)
2 26 Feb 07 jari 201             return null;
2 26 Feb 07 jari 202         
2 26 Feb 07 jari 203         progress.dispose();
2 26 Feb 07 jari 204         categoryNames = algorithmData.getStringArray("category-names");
2 26 Feb 07 jari 205         
2 26 Feb 07 jari 206         clusters = algorithmData.getIntMatrix("cluster-matrix");
2 26 Feb 07 jari 207         resultMatrix = (String [][])algorithmData.getObjectMatrix("result-matrix");
2 26 Feb 07 jari 208         haveAccessionNumbers = algorithmData.getParams().getBoolean("have-accession-numbers", false);
2 26 Feb 07 jari 209         
2 26 Feb 07 jari 210         DefaultMutableTreeNode node;
2 26 Feb 07 jari 211         logger.append("Creating Result Viewers\n");
2 26 Feb 07 jari 212         
2 26 Feb 07 jari 213         if(resultMatrix == null)
2 26 Feb 07 jari 214             node = createEmptyResultNode(algorithmData);
2 26 Feb 07 jari 215         else
2 26 Feb 07 jari 216             node = createResultNode(algorithmData, clusters);
2 26 Feb 07 jari 217         
2 26 Feb 07 jari 218         if (algorithm != null) {
2 26 Feb 07 jari 219             algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 220         }
2 26 Feb 07 jari 221         if (logger != null) logger.dispose();
2 26 Feb 07 jari 222         
2 26 Feb 07 jari 223         return node;
2 26 Feb 07 jari 224     }
2 26 Feb 07 jari 225     
2 26 Feb 07 jari 226     
2 26 Feb 07 jari 227     
2 26 Feb 07 jari 228     public AlgorithmData getScriptParameters(IFramework framework) {
2 26 Feb 07 jari 229         algorithmData = new AlgorithmData();
2 26 Feb 07 jari 230         
2 26 Feb 07 jari 231         //  ClusterRepository repository = framework.getClusterRepository(Cluster.GENE_CLUSTER);
2 26 Feb 07 jari 232         
2 26 Feb 07 jari 233         EASEInitDialog dialog = new EASEInitDialog(framework.getFrame(), framework.getData().getFieldNames());
2 26 Feb 07 jari 234         
2 26 Feb 07 jari 235         if(dialog.showModal() != JOptionPane.OK_OPTION)
2 26 Feb 07 jari 236             return null;
2 26 Feb 07 jari 237
2 26 Feb 07 jari 238         baseFileSystem = dialog.getBaseFileLocation();
2 26 Feb 07 jari 239         algorithmData.addParam("base-file-system", baseFileSystem);
2 26 Feb 07 jari 240         isClusterAnalysis = dialog.isClusterModeSelected();
2 26 Feb 07 jari 241         String converterFileName = dialog.getConverterFileName();
2 26 Feb 07 jari 242         annotationKeyType = dialog.getAnnotationKeyType();
2 26 Feb 07 jari 243         algorithmData.addParam("annotation-key-type", annotationKeyType);
2 26 Feb 07 jari 244         String [] annotationFileList = dialog.getAnnToGOFileList();
2 26 Feb 07 jari 245         int minClusterSize = dialog.getMinClusterSize();
2 26 Feb 07 jari 246         int [] indices;
2 26 Feb 07 jari 247         boolean isPvalueCorrectionSelected;
2 26 Feb 07 jari 248         experiment = framework.getData().getExperiment();
2 26 Feb 07 jari 249         
2 26 Feb 07 jari 250         if(isClusterAnalysis){
2 26 Feb 07 jari 251             algorithmData.addParam("report-ease-score", String.valueOf(dialog.isEaseScoreSelected()));
2 26 Feb 07 jari 252             isPvalueCorrectionSelected = dialog.isCorrectPvaluesSelected();
2 26 Feb 07 jari 253             algorithmData.addParam("p-value-corrections", String.valueOf(isPvalueCorrectionSelected));
2 26 Feb 07 jari 254             if(isPvalueCorrectionSelected){
2 26 Feb 07 jari 255                 algorithmData.addParam("bonferroni-correction", String.valueOf(dialog.isBonferroniSelected()));
2 26 Feb 07 jari 256                 algorithmData.addParam("bonferroni-step-down-correction", String.valueOf(dialog.isStepDownBonferroniSelected()));
2 26 Feb 07 jari 257                 algorithmData.addParam("sidak-correction", String.valueOf(dialog.isSidakSelected()));
2 26 Feb 07 jari 258             }
2 26 Feb 07 jari 259             
2 26 Feb 07 jari 260             algorithmData.addParam("run-permutation-analysis", String.valueOf(dialog.isPermutationAnalysisSelected()));
2 26 Feb 07 jari 261             if(dialog.isPermutationAnalysisSelected())
2 26 Feb 07 jari 262                 algorithmData.addParam("permutation-count", String.valueOf(dialog.getPermutationCount()));
2 26 Feb 07 jari 263         }
2 26 Feb 07 jari 264         
2 26 Feb 07 jari 265         //Use file or IData for population, only permit file use for cluster analysis
2 26 Feb 07 jari 266         String [] populationKeys;
2 26 Feb 07 jari 267         if(isClusterAnalysis && dialog.isPopFileModeSelected()) {
2 26 Feb 07 jari 268             // try {
2 26 Feb 07 jari 269             // populationKeys = getPopulationKeysFromFile(dialog.getPopulationFileName());
2 26 Feb 07 jari 270             algorithmData.addParam("population-file-name", dialog.getPopulationFileName());
2 26 Feb 07 jari 271             //     if(populationKeys == null) {
2 26 Feb 07 jari 272             //        return null;
2 26 Feb 07 jari 273             //   }
2 26 Feb 07 jari 274             //  } catch (IOException ioe) {
2 26 Feb 07 jari 275             //Bad file format
2 26 Feb 07 jari 276             //       JOptionPane.showMessageDialog(framework.getFrame(), "Error loading population file.", "Population File Load Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 277             //      return null;
2 26 Feb 07 jari 278             //  }
2 26 Feb 07 jari 279         } //else {
2 26 Feb 07 jari 280         //   populationKeys = framework.getData().getAnnotationList(annotationKeyType, experiment.getRowMappingArrayCopy());
2 26 Feb 07 jari 281         // }
2 26 Feb 07 jari 282         
2 26 Feb 07 jari 283         algorithmData.addParam("perform-cluster-analysis", String.valueOf(isClusterAnalysis));
2 26 Feb 07 jari 284         // algorithmData.addStringArray("population-list", populationKeys);
2 26 Feb 07 jari 285         if(converterFileName != null)
2 26 Feb 07 jari 286             algorithmData.addParam("converter-file-name", converterFileName);
2 26 Feb 07 jari 287         algorithmData.addStringArray("annotation-file-list", annotationFileList);
2 26 Feb 07 jari 288         //  algorithmData.addMatrix("expression", experiment.getMatrix());
2 26 Feb 07 jari 289         
2 26 Feb 07 jari 290         //Trim options
2 26 Feb 07 jari 291         String [] trimOptions = dialog.getTrimOptions();
2 26 Feb 07 jari 292         algorithmData.addParam("trim-option", trimOptions[0]);
2 26 Feb 07 jari 293         algorithmData.addParam("trim-value", trimOptions[1]);
2 26 Feb 07 jari 294         
2 26 Feb 07 jari 295         //script control parameters
2 26 Feb 07 jari 296         
2 26 Feb 07 jari 297         // alg name
2 26 Feb 07 jari 298         algorithmData.addParam("name", "EASE");
2 26 Feb 07 jari 299         
2 26 Feb 07 jari 300         // alg type
2 26 Feb 07 jari 301         algorithmData.addParam("alg-type", "cluster-genes");
2 26 Feb 07 jari 302         
2 26 Feb 07 jari 303         // output class
2 26 Feb 07 jari 304         algorithmData.addParam("output-class", "multi-gene-cluster-output");
2 26 Feb 07 jari 305         
2 26 Feb 07 jari 306         //output nodes
2 26 Feb 07 jari 307         String [] outputNodes = new String[1];
2 26 Feb 07 jari 308         outputNodes[0] = "Multi-cluster";
2 26 Feb 07 jari 309         algorithmData.addStringArray("output-nodes", outputNodes);
2 26 Feb 07 jari 310         return algorithmData;
2 26 Feb 07 jari 311     }
2 26 Feb 07 jari 312     
2 26 Feb 07 jari 313     
2 26 Feb 07 jari 314     
2 26 Feb 07 jari 315     
2 26 Feb 07 jari 316     public DefaultMutableTreeNode executeScript(IFramework framework, AlgorithmData algData, Experiment experiment) throws AlgorithmException {
2 26 Feb 07 jari 317         this.isScripting = true;
2 26 Feb 07 jari 318         this.algorithmData = algData;
2 26 Feb 07 jari 319         this.experiment = experiment;
2 26 Feb 07 jari 320         algData.addMatrix("expression", framework.getData().getExperiment().getMatrix());
2 26 Feb 07 jari 321         
2 26 Feb 07 jari 322         AlgorithmParameters params = algData.getParams();
2 26 Feb 07 jari 323         
2 26 Feb 07 jari 324         this.isClusterAnalysis = params.getBoolean("perform-cluster-analysis");
2 26 Feb 07 jari 325         this.annotationKeyType = params.getString("annotation-key-type");
2 26 Feb 07 jari 326         
2 26 Feb 07 jari 327         
2 26 Feb 07 jari 328         listener = new Listener();
2 26 Feb 07 jari 329         logger = new Logger(framework.getFrame(), "EASE Analysis", listener);
2 26 Feb 07 jari 330         logger.show();
2 26 Feb 07 jari 331         progress = new Progress(framework.getFrame(), "Probability Analysis Resampling Progress", listener);
2 26 Feb 07 jari 332         
2 26 Feb 07 jari 333         if(this.isClusterAnalysis) {
2 26 Feb 07 jari 334             //cluster keys
2 26 Feb 07 jari 335             int indices [] = experiment.getRowMappingArrayCopy(); 
2 26 Feb 07 jari 336             String [] clusterKeys = framework.getData().getAnnotationList(annotationKeyType, indices);
2 26 Feb 07 jari 337             
2 26 Feb 07 jari 338             algData.addStringArray("sample-list", clusterKeys);
2 26 Feb 07 jari 339
2 26 Feb 07 jari 340             //since we have an experiment containing only genes in cluster we can make
2 26 Feb 07 jari 341             //default indices
2 26 Feb 07 jari 342             int [] tempArray = new int[indices.length];
2 26 Feb 07 jari 343             for(int i = 0; i < indices.length; i++) {
2 26 Feb 07 jari 344                 tempArray[i]= i;
2 26 Feb 07 jari 345             }
2 26 Feb 07 jari 346             
2 26 Feb 07 jari 347             algData.addIntArray("sample-indices", tempArray);  //drop in experiment indices
2 26 Feb 07 jari 348         }
2 26 Feb 07 jari 349         
2 26 Feb 07 jari 350         // population keys
2 26 Feb 07 jari 351         String popFileName = params.getString("population-file-name");
2 26 Feb 07 jari 352         String [] populationKeys;
2 26 Feb 07 jari 353         if(isClusterAnalysis && popFileName != null){// && dialog.isPopFileModeSelected()) {
2 26 Feb 07 jari 354             try {
2 26 Feb 07 jari 355                 populationKeys = getPopulationKeysFromFile(params.getString("population-file-name"));
2 26 Feb 07 jari 356                 if(populationKeys == null) {
2 26 Feb 07 jari 357                     return null;
2 26 Feb 07 jari 358                 }
2 26 Feb 07 jari 359             } catch (IOException ioe) {
2 26 Feb 07 jari 360                 //Bad file format
2 26 Feb 07 jari 361                 JOptionPane.showMessageDialog(framework.getFrame(), "Error loading population file.", "Population File Load Error", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 362                 return null;
2 26 Feb 07 jari 363             }
2 26 Feb 07 jari 364         } else {
2 26 Feb 07 jari 365             populationKeys = framework.getData().getAnnotationList(annotationKeyType, framework.getData().getExperiment().getRowMappingArrayCopy());
2 26 Feb 07 jari 366         }
2 26 Feb 07 jari 367         
2 26 Feb 07 jari 368         algData.addStringArray("population-list", populationKeys);
2 26 Feb 07 jari 369         
2 26 Feb 07 jari 370         
2 26 Feb 07 jari 371         algorithm = framework.getAlgorithmFactory().getAlgorithm("EASE");
2 26 Feb 07 jari 372         algorithm.addAlgorithmListener(listener);
2 26 Feb 07 jari 373         algorithm.execute(algorithmData);
2 26 Feb 07 jari 374         
2 26 Feb 07 jari 375         if(stop)
2 26 Feb 07 jari 376             return null;
2 26 Feb 07 jari 377         
2 26 Feb 07 jari 378         progress.dispose();
2 26 Feb 07 jari 379         categoryNames = algorithmData.getStringArray("category-names");
2 26 Feb 07 jari 380         
2 26 Feb 07 jari 381         clusters = algorithmData.getIntMatrix("cluster-matrix");
2 26 Feb 07 jari 382         resultMatrix = (String [][])algorithmData.getObjectMatrix("result-matrix");
2 26 Feb 07 jari 383         haveAccessionNumbers = algorithmData.getParams().getBoolean("have-accession-numbers", false);
2 26 Feb 07 jari 384         
2 26 Feb 07 jari 385         DefaultMutableTreeNode node;
2 26 Feb 07 jari 386         logger.append("Creating Result Viewers\n");
2 26 Feb 07 jari 387         
2 26 Feb 07 jari 388         if(resultMatrix == null)
2 26 Feb 07 jari 389             node = createEmptyResultNode(algorithmData);
2 26 Feb 07 jari 390         else
2 26 Feb 07 jari 391             node = createResultNode(algorithmData, clusters);
2 26 Feb 07 jari 392         
2 26 Feb 07 jari 393         if (algorithm != null) {
2 26 Feb 07 jari 394             algorithm.removeAlgorithmListener(listener);
2 26 Feb 07 jari 395         }
2 26 Feb 07 jari 396         if (logger != null) logger.dispose();
2 26 Feb 07 jari 397         
2 26 Feb 07 jari 398         return node;
2 26 Feb 07 jari 399     }
2 26 Feb 07 jari 400     
2 26 Feb 07 jari 401     
2 26 Feb 07 jari 402     private String [] getPopulationKeysFromFile(String fileName) throws IOException {
2 26 Feb 07 jari 403         File file = new File(fileName);
2 26 Feb 07 jari 404         if(file.exists()) {
2 26 Feb 07 jari 405             BufferedReader reader = new BufferedReader(new FileReader(file));
2 26 Feb 07 jari 406             Vector ann = new Vector();
2 26 Feb 07 jari 407             String key;
2 26 Feb 07 jari 408             while( (key = reader.readLine()) != null ) {
2 26 Feb 07 jari 409                 ann.add(key);
2 26 Feb 07 jari 410             }
2 26 Feb 07 jari 411             String [] annot = new String [ann.size()];
2 26 Feb 07 jari 412             for(int i = 0; i < annot.length; i++) {
2 26 Feb 07 jari 413                 annot[i] = (String)(ann.elementAt(i));
2 26 Feb 07 jari 414             }
2 26 Feb 07 jari 415             return annot;
2 26 Feb 07 jari 416         }
2 26 Feb 07 jari 417         return null;
2 26 Feb 07 jari 418     }
2 26 Feb 07 jari 419     
2 26 Feb 07 jari 420     
2 26 Feb 07 jari 421     /** Creates the result node.
2 26 Feb 07 jari 422      * @param result result matrix
2 26 Feb 07 jari 423      * @param clusters cluster indices
2 26 Feb 07 jari 424      * @return returns the result node
2 26 Feb 07 jari 425      */
2 26 Feb 07 jari 426     private DefaultMutableTreeNode createResultNode(AlgorithmData result, int [][] clusters){
2 26 Feb 07 jari 427         DefaultMutableTreeNode root;
2 26 Feb 07 jari 428         if(this.isClusterAnalysis)
2 26 Feb 07 jari 429             root = new DefaultMutableTreeNode("EASE Analysis");
2 26 Feb 07 jari 430         else
2 26 Feb 07 jari 431             root = new DefaultMutableTreeNode("EASE Survey");
2 26 Feb 07 jari 432         addTableViewer(root, result);
2 26 Feb 07 jari 433         addExpressionViewers(root, result);
2 26 Feb 07 jari 434         addGeneralInfo(root, result);
2 26 Feb 07 jari 435         if(isClusterAnalysis)
2 26 Feb 07 jari 436             addGOTree(root, result);
2 26 Feb 07 jari 437         return root;
2 26 Feb 07 jari 438     }
2 26 Feb 07 jari 439     
2 26 Feb 07 jari 440     private void addGOTree(DefaultMutableTreeNode root, AlgorithmData result) {
2 26 Feb 07 jari 441         String [][] data = (String [][]) (result.getObjectMatrix("result-matrix"));
2 26 Feb 07 jari 442         String [] headerNames = result.getStringArray("header-names");
2 26 Feb 07 jari 443         
2 26 Feb 07 jari 444         String categories = new String("");
2 26 Feb 07 jari 445         
2 26 Feb 07 jari 446         for(int i = 0; i < categoryNames.length; i++)
2 26 Feb 07 jari 447             categories += categoryNames[i];
2 26 Feb 07 jari 448         
2 26 Feb 07 jari 449         if(categories.indexOf("GO Biological Process") != -1) {
2 26 Feb 07 jari 450             DefaultMutableTreeNode node = new DefaultMutableTreeNode();
2 26 Feb 07 jari 451             GOTreeViewer viewer = new GOTreeViewer("GO Biological Process", headerNames, data, root, this.baseFileSystem);
2 26 Feb 07 jari 452             node.setUserObject(new LeafInfo("GO Hierarchy -- Biological Process", viewer));
2 26 Feb 07 jari 453             root.add(node);
2 26 Feb 07 jari 454         }
2 26 Feb 07 jari 455         
2 26 Feb 07 jari 456         if(categories.indexOf("GO Cellular Component") != -1) {
2 26 Feb 07 jari 457             DefaultMutableTreeNode node = new DefaultMutableTreeNode();
2 26 Feb 07 jari 458             GOTreeViewer viewer = new GOTreeViewer("GO Cellular Component", headerNames, data, root, this.baseFileSystem);
2 26 Feb 07 jari 459             node.setUserObject(new LeafInfo("GO Hierarchy -- Cellular Component", viewer));
2 26 Feb 07 jari 460             root.add(node);
2 26 Feb 07 jari 461         }
2 26 Feb 07 jari 462         
2 26 Feb 07 jari 463         if(categories.indexOf("GO Molecular Function") != -1) {
2 26 Feb 07 jari 464             DefaultMutableTreeNode node = new DefaultMutableTreeNode();
2 26 Feb 07 jari 465             GOTreeViewer viewer = new GOTreeViewer("GO Molecular Function", headerNames, data, root, this.baseFileSystem);
2 26 Feb 07 jari 466             node.setUserObject(new LeafInfo("GO Hierarchy -- Molecular Function", viewer));
2 26 Feb 07 jari 467             root.add(node);
2 26 Feb 07 jari 468         }
2 26 Feb 07 jari 469     }
2 26 Feb 07 jari 470     
2 26 Feb 07 jari 471     /** creates an empty result if the result is null.
2 26 Feb 07 jari 472      * @param result
2 26 Feb 07 jari 473      * @return  */
2 26 Feb 07 jari 474     private DefaultMutableTreeNode createEmptyResultNode(AlgorithmData result){
2 26 Feb 07 jari 475         DefaultMutableTreeNode root = new DefaultMutableTreeNode("EASE");
2 26 Feb 07 jari 476         root.add(new DefaultMutableTreeNode("No Annotation Hits"));
2 26 Feb 07 jari 477         addGeneralInfo(root, result);
2 26 Feb 07 jari 478         return root;
2 26 Feb 07 jari 479     }
2 26 Feb 07 jari 480     
2 26 Feb 07 jari 481     /** Adds nodes to display cluster data.
2 26 Feb 07 jari 482      * @param root root node
2 26 Feb 07 jari 483      * @param result result matrix
2 26 Feb 07 jari 484      */
2 26 Feb 07 jari 485     private void addExpressionViewers(DefaultMutableTreeNode root, AlgorithmData result) {
2 26 Feb 07 jari 486         DefaultMutableTreeNode node = new DefaultMutableTreeNode("Expression Viewers");
2 26 Feb 07 jari 487         
2 26 Feb 07 jari 488         IViewer expViewer = new EASEExperimentViewer(this.experiment, this.clusters);
2 26 Feb 07 jari 489         EASECentroidViewer graphViewer = new EASECentroidViewer(this.experiment, this.clusters);
2 26 Feb 07 jari 490         //set means and variances in the graph viewer
2 26 Feb 07 jari 491         graphViewer.setMeans(result.getMatrix("means").A);
2 26 Feb 07 jari 492         graphViewer.setVariances(result.getMatrix("variances").A);
2 26 Feb 07 jari 493         DefaultMutableTreeNode clusterNode, annotNode, popNode;
2 26 Feb 07 jari 494         for (int i=0; i<this.clusters.length; i++) {
2 26 Feb 07 jari 495             clusterNode = new DefaultMutableTreeNode("Term "+String.valueOf(i+1));
2 26 Feb 07 jari 496             clusterNode.add(new DefaultMutableTreeNode(new LeafInfo("Expression Image", expViewer, new Integer(i))));
2 26 Feb 07 jari 497             clusterNode.add(new DefaultMutableTreeNode(new LeafInfo("Centroid Graph", graphViewer, new CentroidUserObject(i, CentroidUserObject.VARIANCES_MODE))));
2 26 Feb 07 jari 498             clusterNode.add(new DefaultMutableTreeNode(new LeafInfo("Expression Graph", graphViewer, new CentroidUserObject(i, CentroidUserObject.VALUES_MODE))));
2 26 Feb 07 jari 499             clusterNode.add(new DefaultMutableTreeNode(resultMatrix[i][1]));
2 26 Feb 07 jari 500             if(this.haveAccessionNumbers)
2 26 Feb 07 jari 501                 clusterNode.add(new DefaultMutableTreeNode(resultMatrix[i][2]));
2 26 Feb 07 jari 502             clusterNode.add(new DefaultMutableTreeNode("Number of Genes: "+this.clusters[i].length));
2 26 Feb 07 jari 503             
2 26 Feb 07 jari 504             node.add(clusterNode);
2 26 Feb 07 jari 505         }
2 26 Feb 07 jari 506         root.add(node);
2 26 Feb 07 jari 507     }
2 26 Feb 07 jari 508     
2 26 Feb 07 jari 509     
2 26 Feb 07 jari 510     /** Adds the table viewer
2 26 Feb 07 jari 511      * @param root root node
2 26 Feb 07 jari 512      * @param result
2 26 Feb 07 jari 513      */
2 26 Feb 07 jari 514     private void addTableViewer(DefaultMutableTreeNode root, AlgorithmData result){
2 26 Feb 07 jari 515         Object [][] data = result.getObjectMatrix("result-matrix");
2 26 Feb 07 jari 516         String [] headerNames = result.getStringArray("header-names");
2 26 Feb 07 jari 517         
2 26 Feb 07 jari 518         if(data == null || data.length < 1)
2 26 Feb 07 jari 519             return;
2 26 Feb 07 jari 520         
2 26 Feb 07 jari 521         EASETableViewer tv = new EASETableViewer(headerNames, data, root, experiment, clusters, haveAccessionNumbers, this.isClusterAnalysis);
2 26 Feb 07 jari 522         DefaultMutableTreeNode node = new DefaultMutableTreeNode(new LeafInfo("Table Viewer", tv));
2 26 Feb 07 jari 523         root.add(node);
2 26 Feb 07 jari 524     }
2 26 Feb 07 jari 525     
2 26 Feb 07 jari 526     /** Returns the indices mapped to IData indices.  Appropriate indices for
2 26 Feb 07 jari 527      * direct access to IData encapsulated annotation.
2 26 Feb 07 jari 528      * @param indices
2 26 Feb 07 jari 529      * @return
2 26 Feb 07 jari 530      */
2 26 Feb 07 jari 531     private int [] getDataIndices(int [] indices){
2 26 Feb 07 jari 532         int [] dataIndices = new int[indices.length];
2 26 Feb 07 jari 533         for(int i = 0; i < dataIndices.length; i++){
2 26 Feb 07 jari 534             dataIndices[i] = this.experiment.getGeneIndexMappedToData(indices[i]);
2 26 Feb 07 jari 535         }
2 26 Feb 07 jari 536         return dataIndices;
2 26 Feb 07 jari 537     }
2 26 Feb 07 jari 538     
2 26 Feb 07 jari 539     /** Adds general algorithm information.
2 26 Feb 07 jari 540      * @param root root node
2 26 Feb 07 jari 541      * @param result
2 26 Feb 07 jari 542      */
2 26 Feb 07 jari 543     private void addGeneralInfo(DefaultMutableTreeNode root, AlgorithmData result){
2 26 Feb 07 jari 544         DefaultMutableTreeNode generalInfo = new DefaultMutableTreeNode("General Information");
2 26 Feb 07 jari 545         String converterFileName = result.getParams().getString("converter-file-name");
2 26 Feb 07 jari 546         DefaultMutableTreeNode newNode;
2 26 Feb 07 jari 547         
2 26 Feb 07 jari 548         if(this.isClusterAnalysis && !isScripting){
2 26 Feb 07 jari 549             newNode = new DefaultMutableTreeNode("Input Cluster Info");
2 26 Feb 07 jari 550             newNode.add(new DefaultMutableTreeNode("Cluster Serial # :"+String.valueOf(this.cluster.getSerialNumber())));
2 26 Feb 07 jari 551             newNode.add(new DefaultMutableTreeNode("Cluster Source: "+String.valueOf(this.cluster.getSource())));
2 26 Feb 07 jari 552             newNode.add(new DefaultMutableTreeNode("Cluster Analysis Node: "+String.valueOf(this.cluster.getAlgorithmName())));
2 26 Feb 07 jari 553             newNode.add(new DefaultMutableTreeNode("Cluster Cluster Node: "+String.valueOf(this.cluster.getClusterID())));
2 26 Feb 07 jari 554             newNode.add(new DefaultMutableTreeNode("Cluster Label: "+String.valueOf(this.cluster.getClusterLabel())));
2 26 Feb 07 jari 555             newNode.add(new DefaultMutableTreeNode("Cluster Size: "+String.valueOf(this.cluster.getSize())));
2 26 Feb 07 jari 556             generalInfo.add(newNode);
2 26 Feb 07 jari 557         }
2 26 Feb 07 jari 558         
2 26 Feb 07 jari 559         if(this.isScripting) {
2 26 Feb 07 jari 560             newNode = new DefaultMutableTreeNode("Input Data: Script Data Input");
2 26 Feb 07 jari 561         }
2 26 Feb 07 jari 562         
2 26 Feb 07 jari 563         newNode = new DefaultMutableTreeNode("Analysis Options");
2 26 Feb 07 jari 564         DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode("Selected Index and Files");
2 26 Feb 07 jari 565         
2 26 Feb 07 jari 566         String popFileName = result.getParams().getString("population-file-name");
2 26 Feb 07 jari 567         if(popFileName == null)
2 26 Feb 07 jari 568             fileNode.add(new DefaultMutableTreeNode("Population Selection: Data in Current Viewer"));
2 26 Feb 07 jari 569         else
2 26 Feb 07 jari 570             fileNode.add(new DefaultMutableTreeNode("Population Selection: File Input ("+popFileName+")"));
2 26 Feb 07 jari 571         
2 26 Feb 07 jari 572         fileNode.add(new DefaultMutableTreeNode("MeV Index: "+this.annotationKeyType));
2 26 Feb 07 jari 573         AlgorithmParameters params = this.algorithmData.getParams();
2 26 Feb 07 jari 574         fileNode.add(new DefaultMutableTreeNode("Conversion File: "+params.getString("converter-file-name", "Not Selected")));
2 26 Feb 07 jari 575         DefaultMutableTreeNode annFileNode = new DefaultMutableTreeNode("Annotation-to-Theme Files");
2 26 Feb 07 jari 576         String [] annFiles = this.algorithmData.getStringArray("annotation-file-list");
2 26 Feb 07 jari 577         if(annFiles != null)
2 26 Feb 07 jari 578             for(int i = 0; i < annFiles.length; i++)
2 26 Feb 07 jari 579                 annFileNode.add(new DefaultMutableTreeNode("File: "+annFiles[i]));
2 26 Feb 07 jari 580         fileNode.add(annFileNode);
2 26 Feb 07 jari 581         newNode.add(fileNode);
2 26 Feb 07 jari 582         
2 26 Feb 07 jari 583         if(this.isClusterAnalysis || !(params.getString("trim-option").equals("NO_TRIM"))){
2 26 Feb 07 jari 584             DefaultMutableTreeNode statNode = new DefaultMutableTreeNode("Stat Parameters");
2 26 Feb 07 jari 585             if(this.isClusterAnalysis){
2 26 Feb 07 jari 586                 statNode.add(new DefaultMutableTreeNode("Reported Statistic:"+  ((params.getBoolean("report-ease-score"))?"EASE Score":"Fisher's Exact")));
2 26 Feb 07 jari 587                 if(params.getBoolean("bonferroni-correction", false))
2 26 Feb 07 jari 588                     statNode.add(new DefaultMutableTreeNode("Mult.-Correct.: Bonferroni"));
2 26 Feb 07 jari 589                 if(params.getBoolean("bonferroni-step-down-correction", false))
2 26 Feb 07 jari 590                     statNode.add(new DefaultMutableTreeNode("Mult.-Correct.: Bonferroni Step Down"));
2 26 Feb 07 jari 591                 if(params.getBoolean("sidak-correction", false))
2 26 Feb 07 jari 592                     statNode.add(new DefaultMutableTreeNode("Mult.-Correct.: Sidak Method"));
2 26 Feb 07 jari 593             }
2 26 Feb 07 jari 594             if(!(params.getString("trim-option").equals("NO_TRIM"))){
2 26 Feb 07 jari 595                 if(params.getString("trim-option").equals("N_TRIM"))
2 26 Feb 07 jari 596                     statNode.add(new DefaultMutableTreeNode("Trim out if hit number < "+params.getInt("trim-value")));
2 26 Feb 07 jari 597                 else
2 26 Feb 07 jari 598                     statNode.add(new DefaultMutableTreeNode("Trim out if hit percent < "+params.getInt("trim-value")));
2 26 Feb 07 jari 599             }
2 26 Feb 07 jari 600             newNode.add(statNode);
2 26 Feb 07 jari 601         }
2 26 Feb 07 jari 602         generalInfo.add(newNode);
2 26 Feb 07 jari 603         
2 26 Feb 07 jari 604         root.add(generalInfo);
2 26 Feb 07 jari 605     }
2 26 Feb 07 jari 606     
2 26 Feb 07 jari 607     
2 26 Feb 07 jari 608     
2 26 Feb 07 jari 609     /** Listens to algorithm events and updates the logger.
2 26 Feb 07 jari 610      */
2 26 Feb 07 jari 611     private class Listener extends DialogListener implements AlgorithmListener{
2 26 Feb 07 jari 612         String eventDescription;
2 26 Feb 07 jari 613         /** Handles algorithm events.
2 26 Feb 07 jari 614          * @param actionEvent event object
2 26 Feb 07 jari 615          */
2 26 Feb 07 jari 616         public void actionPerformed(java.awt.event.ActionEvent actionEvent) {
2 26 Feb 07 jari 617             String command = actionEvent.getActionCommand();
2 26 Feb 07 jari 618             if (command.equals("cancel-command")) {
2 26 Feb 07 jari 619                 System.out.println("abort execution");
2 26 Feb 07 jari 620                 stop = true;
2 26 Feb 07 jari 621                 algorithm.abort();
2 26 Feb 07 jari 622                 progress.dispose();
2 26 Feb 07 jari 623                 logger.dispose();
2 26 Feb 07 jari 624             }
2 26 Feb 07 jari 625         }
2 26 Feb 07 jari 626         
2 26 Feb 07 jari 627         /** Invoked when an algorithm progress value was changed.
2 26 Feb 07 jari 628          *
2 26 Feb 07 jari 629          * @param event a <code>AlgorithmEvent</code> object.
2 26 Feb 07 jari 630          */
2 26 Feb 07 jari 631         public void valueChanged(AlgorithmEvent event) {
2 26 Feb 07 jari 632             if(event.getId() == AlgorithmEvent.MONITOR_VALUE){
2 26 Feb 07 jari 633                 logger.append( event.getDescription() );
2 26 Feb 07 jari 634             } else {  //event to progress
2 26 Feb 07 jari 635                 
2 26 Feb 07 jari 636                 eventDescription = event.getDescription();
2 26 Feb 07 jari 637                 
2 26 Feb 07 jari 638                 if(eventDescription.equals("SET_VALUE")){
2 26 Feb 07 jari 639                     progress.setValue(event.getIntValue());
2 26 Feb 07 jari 640                     return;
2 26 Feb 07 jari 641                 } else if(eventDescription.equals("SET_UNITS")){
2 26 Feb 07 jari 642                     progress.setDescription("Resampling Analysis Iterations");
2 26 Feb 07 jari 643                     progress.setValue(0);
2 26 Feb 07 jari 644                     progress.setUnits(event.getIntValue());
2 26 Feb 07 jari 645                     progress.show();
2 26 Feb 07 jari 646                     java.awt.Point p = progress.getLocation();
2 26 Feb 07 jari 647                     java.awt.Point loggerP = logger.getLocation();
2 26 Feb 07 jari 648                     progress.setLocation(p.x, loggerP.y-progress.getHeight());
2 26 Feb 07 jari 649                     return;
2 26 Feb 07 jari 650                 } else {  //default dispose
2 26 Feb 07 jari 651                     progress.setVisible(false);
2 26 Feb 07 jari 652                     progress.dispose();
2 26 Feb 07 jari 653                 }
2 26 Feb 07 jari 654             }
2 26 Feb 07 jari 655         }
2 26 Feb 07 jari 656     }
2 26 Feb 07 jari 657 }