mev-4.0.01/source/org/tigr/microarray/mev/cluster/algorithm/impl/GSH.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  * $Id$
2 26 Feb 07 jari 7  *
2 26 Feb 07 jari 8  * Created 11/26/2001
2 26 Feb 07 jari 9  *
2 26 Feb 07 jari 10  * Description:
2 26 Feb 07 jari 11  *
2 26 Feb 07 jari 12  * Copyright (C) 2002 TIGR
2 26 Feb 07 jari 13  *
2 26 Feb 07 jari 14  */
2 26 Feb 07 jari 15 package org.tigr.microarray.mev.cluster.algorithm.impl;
2 26 Feb 07 jari 16
2 26 Feb 07 jari 17 import java.awt.BorderLayout;
2 26 Feb 07 jari 18 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 19 import java.awt.event.ActionListener;
2 26 Feb 07 jari 20 import java.util.Random;
2 26 Feb 07 jari 21 import java.util.Vector;
2 26 Feb 07 jari 22
2 26 Feb 07 jari 23 import javax.swing.JButton;
2 26 Feb 07 jari 24 import javax.swing.JFrame;
2 26 Feb 07 jari 25 import javax.swing.JLabel;
2 26 Feb 07 jari 26 import javax.swing.JPanel;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28 import org.tigr.microarray.mev.cluster.Cluster;
2 26 Feb 07 jari 29 import org.tigr.microarray.mev.cluster.Node;
2 26 Feb 07 jari 30 import org.tigr.microarray.mev.cluster.NodeList;
2 26 Feb 07 jari 31 import org.tigr.microarray.mev.cluster.NodeValue;
2 26 Feb 07 jari 32 import org.tigr.microarray.mev.cluster.NodeValueList;
2 26 Feb 07 jari 33 import org.tigr.microarray.mev.cluster.algorithm.AbortException;
2 26 Feb 07 jari 34 import org.tigr.microarray.mev.cluster.algorithm.AbstractAlgorithm;
2 26 Feb 07 jari 35 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmData;
2 26 Feb 07 jari 36 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmEvent;
2 26 Feb 07 jari 37 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmException;
2 26 Feb 07 jari 38 import org.tigr.microarray.mev.cluster.algorithm.AlgorithmParameters;
2 26 Feb 07 jari 39 import org.tigr.microarray.util.Adjustment;
2 26 Feb 07 jari 40 import org.tigr.util.FloatMatrix;
2 26 Feb 07 jari 41 import org.tigr.util.awt.ProgressDialog;
2 26 Feb 07 jari 42
2 26 Feb 07 jari 43 import Jama.Matrix;
2 26 Feb 07 jari 44
2 26 Feb 07 jari 45 public class GSH extends AbstractAlgorithm {
2 26 Feb 07 jari 46     
2 26 Feb 07 jari 47     private long StartTime;
2 26 Feb 07 jari 48     private long CalculationTime;
2 26 Feb 07 jari 49     
2 26 Feb 07 jari 50     private JLabel StatusLabel;
2 26 Feb 07 jari 51     private int CurrentCluster, CreatedCluster;
2 26 Feb 07 jari 52     
2 26 Feb 07 jari 53     private GSCluster clusters[];
2 26 Feb 07 jari 54     private GSCluster resultClusters[];
2 26 Feb 07 jari 55     private boolean gshGenes;
2 26 Feb 07 jari 56     private int m;
2 26 Feb 07 jari 57     private int n;
2 26 Feb 07 jari 58     private int k; // number of expected clusters;
2 26 Feb 07 jari 59     private int fakedMatrix;
2 26 Feb 07 jari 60     private int swapTime;
2 26 Feb 07 jari 61     private int matrixSize;
2 26 Feb 07 jari 62     private int geneAssaigned=0;
2 26 Feb 07 jari 63     //private GeneCluster[] GeneClusterPointers;
2 26 Feb 07 jari 64     
2 26 Feb 07 jari 65     private int validN;
2 26 Feb 07 jari 66     
2 26 Feb 07 jari 67     private Jama.Matrix dataMatrix;
2 26 Feb 07 jari 68     private Jama.Matrix workingMatrix;
2 26 Feb 07 jari 69     private Jama.SingularValueDecomposition SVD;
2 26 Feb 07 jari 70     private Jama.EigenvalueDecomposition EVD;
2 26 Feb 07 jari 71     private double[][] values;
2 26 Feb 07 jari 72     private Jama.Matrix eigenVector;
2 26 Feb 07 jari 73     private double[] prinCom;
2 26 Feb 07 jari 74     private double[] currentGene;
2 26 Feb 07 jari 75     private GSCluster unassigned;
2 26 Feb 07 jari 76     //private boolean drawTrees;
2 26 Feb 07 jari 77     
2 26 Feb 07 jari 78     
2 26 Feb 07 jari 79     private boolean stop = false;
2 26 Feb 07 jari 80     
2 26 Feb 07 jari 81     private int function;
2 26 Feb 07 jari 82     //private int DistanceFunction;
2 26 Feb 07 jari 83     private float factor;
2 26 Feb 07 jari 84     private boolean absolute;
2 26 Feb 07 jari 85     ProgressDialog PD;
2 26 Feb 07 jari 86     
2 26 Feb 07 jari 87     private int number_of_genes;
2 26 Feb 07 jari 88     private int number_of_samples;
2 26 Feb 07 jari 89     
2 26 Feb 07 jari 90     private FloatMatrix expMatrix;
2 26 Feb 07 jari 91     
2 26 Feb 07 jari 92     private int hcl_function;
2 26 Feb 07 jari 93     private boolean hcl_absolute;    
2 26 Feb 07 jari 94     
2 26 Feb 07 jari 95     public AlgorithmData execute(AlgorithmData data) throws AlgorithmException {
2 26 Feb 07 jari 96         
2 26 Feb 07 jari 97         AlgorithmParameters map = data.getParams();
2 26 Feb 07 jari 98         
2 26 Feb 07 jari 99         function = map.getInt("distance-function", EUCLIDEAN);
2 26 Feb 07 jari 100         factor   = map.getFloat("distance-factor", 1.0f);
2 26 Feb 07 jari 101         absolute = map.getBoolean("distance-absolute", false);
2 26 Feb 07 jari 102         gshGenes = map.getBoolean("gsh-cluster-genes", true);
2 26 Feb 07 jari 103         
2 26 Feb 07 jari 104         int number_of_fakedMatrix = map.getInt("number-of-fakedMatrix", 20);
2 26 Feb 07 jari 105         fakedMatrix=number_of_fakedMatrix;
2 26 Feb 07 jari 106         int number_of_swap = map.getInt("number-of-swap", 5);
2 26 Feb 07 jari 107         swapTime=number_of_swap;
2 26 Feb 07 jari 108         int number_of_clusters = map.getInt("number-of-clusters", 5);
2 26 Feb 07 jari 109         k=number_of_clusters;
2 26 Feb 07 jari 110         
2 26 Feb 07 jari 111         boolean hierarchical_tree = map.getBoolean("hierarchical-tree", false);
2 26 Feb 07 jari 112         int method_linkage = map.getInt("method-linkage", 0);
2 26 Feb 07 jari 113         boolean calculate_genes = map.getBoolean("calculate-genes", false);
2 26 Feb 07 jari 114         boolean calculate_experiments = map.getBoolean("calculate-experiments", false);
2 26 Feb 07 jari 115         
2 26 Feb 07 jari 116         hcl_function = map.getInt("hcl-distance-function", EUCLIDEAN);
2 26 Feb 07 jari 117         hcl_absolute = map.getBoolean("hcl-distance-absolute", false);        
2 26 Feb 07 jari 118
2 26 Feb 07 jari 119         this.expMatrix = data.getMatrix("experiment");
2 26 Feb 07 jari 120         
2 26 Feb 07 jari 121         number_of_genes   = this.expMatrix.getRowDimension();
2 26 Feb 07 jari 122         n=number_of_genes;
2 26 Feb 07 jari 123         number_of_samples = this.expMatrix.getColumnDimension();
2 26 Feb 07 jari 124         m=number_of_samples;
2 26 Feb 07 jari 125         values = new double[n][m];
2 26 Feb 07 jari 126         prinCom = new double[m];
2 26 Feb 07 jari 127         
2 26 Feb 07 jari 128         JFrame dummyFrame = new JFrame();
2 26 Feb 07 jari 129         if(gshGenes)
2 26 Feb 07 jari 130             PD = new ProgressDialog(dummyFrame, "Gene Shaving -- Progress", false, 6);
2 26 Feb 07 jari 131         else
2 26 Feb 07 jari 132             PD = new ProgressDialog(dummyFrame, "Sample Shaving -- Progress", false, 6);
2 26 Feb 07 jari 133         
2 26 Feb 07 jari 134         JPanel progressPanel = PD.getLabelPanel();
2 26 Feb 07 jari 135         JPanel superPanel = new JPanel();
2 26 Feb 07 jari 136         superPanel.setLayout(new BorderLayout());
2 26 Feb 07 jari 137         JButton abortButton = new JButton(" Cancel ");
2 26 Feb 07 jari 138         abortButton.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
2 26 Feb 07 jari 139         abortButton.setFocusPainted(false);       
2 26 Feb 07 jari 140         
2 26 Feb 07 jari 141         abortButton.addActionListener(new ActionListener() {
2 26 Feb 07 jari 142             public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 143                 stop = true;
2 26 Feb 07 jari 144                 PD.dismiss();
2 26 Feb 07 jari 145             }
2 26 Feb 07 jari 146         });
2 26 Feb 07 jari 147         
2 26 Feb 07 jari 148         superPanel.add(progressPanel, BorderLayout.CENTER);
2 26 Feb 07 jari 149         superPanel.add(abortButton, BorderLayout.SOUTH);
2 26 Feb 07 jari 150         PD.setMainPanel(superPanel);
2 26 Feb 07 jari 151         PD.setSize(450,200);
2 26 Feb 07 jari 152         
2 26 Feb 07 jari 153         calculate();
2 26 Feb 07 jari 154         FloatMatrix means = getMeans(clusters);
2 26 Feb 07 jari 155         FloatMatrix variances = getVariances(clusters, means);
2 26 Feb 07 jari 156         
2 26 Feb 07 jari 157         AlgorithmEvent event = null;
2 26 Feb 07 jari 158         if (hierarchical_tree) {
2 26 Feb 07 jari 159             event = new AlgorithmEvent(this, AlgorithmEvent.SET_UNITS, clusters.length, "Calculate Hierarchical Trees");
2 26 Feb 07 jari 160             fireValueChanged(event);
2 26 Feb 07 jari 161             event.setIntValue(0);
2 26 Feb 07 jari 162             event.setId(AlgorithmEvent.PROGRESS_VALUE);
2 26 Feb 07 jari 163             fireValueChanged(event);
2 26 Feb 07 jari 164         }
2 26 Feb 07 jari 165         
2 26 Feb 07 jari 166         Cluster result_cluster = new Cluster();
2 26 Feb 07 jari 167         NodeList nodeList = result_cluster.getNodeList();
2 26 Feb 07 jari 168         int[] features;
2 26 Feb 07 jari 169         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 170             if (stop) {
2 26 Feb 07 jari 171                 throw new AbortException();
2 26 Feb 07 jari 172             }
2 26 Feb 07 jari 173             features = convert2int(clusters[i]);
2 26 Feb 07 jari 174             Node node = new Node(features);
2 26 Feb 07 jari 175             nodeList.addNode(node);
2 26 Feb 07 jari 176             if (hierarchical_tree) {
2 26 Feb 07 jari 177                 node.setValues(calculateHierarchicalTree(features, method_linkage, calculate_genes, calculate_experiments));
2 26 Feb 07 jari 178                 event.setIntValue(i+1);
2 26 Feb 07 jari 179                 fireValueChanged(event);
2 26 Feb 07 jari 180             }
2 26 Feb 07 jari 181         }
2 26 Feb 07 jari 182         
2 26 Feb 07 jari 183         // prepare the result
2 26 Feb 07 jari 184         AlgorithmData result = new AlgorithmData();
2 26 Feb 07 jari 185         result.addCluster("cluster", result_cluster);
2 26 Feb 07 jari 186         result.addParam("number-of-clusters", String.valueOf(clusters.length));
2 26 Feb 07 jari 187         result.addMatrix("clusters-means", means);
2 26 Feb 07 jari 188         result.addMatrix("clusters-variances", variances);
2 26 Feb 07 jari 189         //result.addParam("iterations", String.valueOf(getIterations()));
2 26 Feb 07 jari 190         //result.addParam("converged", String.valueOf(getConverged()));
2 26 Feb 07 jari 191         return result;
2 26 Feb 07 jari 192     }
2 26 Feb 07 jari 193     
2 26 Feb 07 jari 194     
2 26 Feb 07 jari 195     
2 26 Feb 07 jari 196     public void getMatrix(){
2 26 Feb 07 jari 197         int i,j;
2 26 Feb 07 jari 198         
2 26 Feb 07 jari 199         double[][] temp = new double[n][m];
2 26 Feb 07 jari 200         
2 26 Feb 07 jari 201         for(i=0;i<n;i++){
2 26 Feb 07 jari 202             for(j=0;j<m;j++){
2 26 Feb 07 jari 203                 temp[i][j] = expMatrix.A[i][j];
2 26 Feb 07 jari 204             }
2 26 Feb 07 jari 205         }
2 26 Feb 07 jari 206         
2 26 Feb 07 jari 207         Adjustment.meanCenterSpots(expMatrix);
2 26 Feb 07 jari 208         
2 26 Feb 07 jari 209         for(i=0;i<n;i++){
2 26 Feb 07 jari 210             
2 26 Feb 07 jari 211             for(j=0;j<m;j++){
2 26 Feb 07 jari 212                 
2 26 Feb 07 jari 213                 values[i][j]=(double)expMatrix.A[i][j];
2 26 Feb 07 jari 214                 expMatrix.A[i][j] = (float) temp[i][j];
2 26 Feb 07 jari 215             }
2 26 Feb 07 jari 216         }
2 26 Feb 07 jari 217         
2 26 Feb 07 jari 218         dataMatrix=new Matrix(values);
2 26 Feb 07 jari 219     }
2 26 Feb 07 jari 220     
2 26 Feb 07 jari 221     
2 26 Feb 07 jari 222     public void calculate(){
2 26 Feb 07 jari 223         
2 26 Feb 07 jari 224         PD.setMessage(0, "Distance: " + AbstractAlgorithm.getDistanceName(function));
2 26 Feb 07 jari 225         PD.setMessage(1, "Clusters to be created: " + k);
2 26 Feb 07 jari 226         PD.setMessage(2, "0 clusters created.");
2 26 Feb 07 jari 227         PD.setMessage(3, geneAssaigned+" genes have been assigned to clusters.");
2 26 Feb 07 jari 228         PD.setMessage(4, (n-geneAssaigned)+" genes left to be assigned to clusters.");
2 26 Feb 07 jari 229         PD.setTimerLabel(5,"Running for ", " seconds.", 1000);
2 26 Feb 07 jari 230         PD.setVisible(true);
2 26 Feb 07 jari 231         
2 26 Feb 07 jari 232         
2 26 Feb 07 jari 233         getMatrix();
2 26 Feb 07 jari 234         CreatedCluster=0;
2 26 Feb 07 jari 235         
2 26 Feb 07 jari 236         resultClusters=new GSCluster[k + 1];
2 26 Feb 07 jari 237         
2 26 Feb 07 jari 238         //GeneClusterPointers=new GeneCluster[k + 1]; //For 'k' clusters plus the final cluster of unassigned genes
2 26 Feb 07 jari 239         
2 26 Feb 07 jari 240         resultClusters[k] = new GSCluster();
2 26 Feb 07 jari 241         for (int i = 0; i < n; i++) {
2 26 Feb 07 jari 242             resultClusters[k].add(new Integer(i));
2 26 Feb 07 jari 243         }
2 26 Feb 07 jari 244         
2 26 Feb 07 jari 245         while(CreatedCluster<k){
2 26 Feb 07 jari 246             
2 26 Feb 07 jari 247             //System.out.println("CreatedCluster: " + CreatedCluster);
2 26 Feb 07 jari 248             
2 26 Feb 07 jari 249             CurrentCluster=0;
2 26 Feb 07 jari 250             unassigned = new GSCluster();
2 26 Feb 07 jari 251             
2 26 Feb 07 jari 252             //get sequence of clusters
2 26 Feb 07 jari 253             
2 26 Feb 07 jari 254             for (int i=0;i<n;i++){
2 26 Feb 07 jari 255                 
2 26 Feb 07 jari 256                 unassigned.add(new Integer(i));
2 26 Feb 07 jari 257             }
2 26 Feb 07 jari 258             
2 26 Feb 07 jari 259             int iter=getIteration();
2 26 Feb 07 jari 260             
2 26 Feb 07 jari 261             clusters=new GSCluster[iter];
2 26 Feb 07 jari 262             for (int i = 0; i < clusters.length; i++) {
2 26 Feb 07 jari 263                 clusters[i] = new GSCluster();
2 26 Feb 07 jari 264             }
2 26 Feb 07 jari 265             
2 26 Feb 07 jari 266             for(int i=0; i<iter; i++){
2 26 Feb 07 jari 267                 
2 26 Feb 07 jari 268                 //System.out.println("CurrentCluster: " + CurrentCluster);
2 26 Feb 07 jari 269                 
2 26 Feb 07 jari 270                 matrixSize=unassigned.size();
2 26 Feb 07 jari 271                 
2 26 Feb 07 jari 272                 double[] scores=new double[matrixSize];
2 26 Feb 07 jari 273                 int[] indexs=new int[matrixSize];
2 26 Feb 07 jari 274                 
2 26 Feb 07 jari 275                 for(int r=0; r<matrixSize;r++) {
2 26 Feb 07 jari 276                     indexs[r]=((Integer)(unassigned.elementAt(r))).intValue();
2 26 Feb 07 jari 277                 }
2 26 Feb 07 jari 278                 
2 26 Feb 07 jari 279                 workingMatrix=dataMatrix.getMatrix(indexs,0,m-1);
2 26 Feb 07 jari 280                 
2 26 Feb 07 jari 281                 getPrincipleComponent();
2 26 Feb 07 jari 282                 
2 26 Feb 07 jari 283                 for(int j=0; j< matrixSize;j++){
2 26 Feb 07 jari 284                     
2 26 Feb 07 jari 285                     //currentGene=getGene(((Integer)(unassigned.elementAt(j))).intValue());
2 26 Feb 07 jari 286                     currentGene=getGene(j);
2 26 Feb 07 jari 287                     
2 26 Feb 07 jari 288                     scores[j]=getInnerProduct(prinCom,currentGene);
2 26 Feb 07 jari 289                 }
2 26 Feb 07 jari 290                 
2 26 Feb 07 jari 291                 shaveGene(scores);
2 26 Feb 07 jari 292                 CurrentCluster++;
2 26 Feb 07 jari 293             }
2 26 Feb 07 jari 294             
2 26 Feb 07 jari 295             //get cluster size
2 26 Feb 07 jari 296             int maxIndex=0;
2 26 Feb 07 jari 297             double maxGap=0.0d;
2 26 Feb 07 jari 298             double currentGap;
2 26 Feb 07 jari 299             
2 26 Feb 07 jari 300             for(int i=0;i<clusters.length;i++){
2 26 Feb 07 jari 301                 
2 26 Feb 07 jari 302                 workingMatrix=(Matrix)dataMatrix.clone();
2 26 Feb 07 jari 303                 
2 26 Feb 07 jari 304                 currentGap=getDk(clusters[i])-getD_k(clusters[i]);
2 26 Feb 07 jari 305                 if (currentGap>maxGap){
2 26 Feb 07 jari 306                     
2 26 Feb 07 jari 307                     maxGap=currentGap;
2 26 Feb 07 jari 308                     maxIndex=i;
2 26 Feb 07 jari 309                 }
2 26 Feb 07 jari 310             }
2 26 Feb 07 jari 311             
2 26 Feb 07 jari 312             resultClusters[CreatedCluster]=(GSCluster)clusters[maxIndex].clone();
2 26 Feb 07 jari 313             
2 26 Feb 07 jari 314             geneAssaigned+=resultClusters[CreatedCluster].size();
2 26 Feb 07 jari 315             
2 26 Feb 07 jari 316             PD.setMessage(2, (CreatedCluster + 1) +" clusters created.");
2 26 Feb 07 jari 317             if(gshGenes){
2 26 Feb 07 jari 318                 PD.setMessage(3, geneAssaigned+" genes have been assigned to clusters.");
2 26 Feb 07 jari 319                 PD.setMessage(4, (n-geneAssaigned)+" genes left to be assigned to clusters.");
2 26 Feb 07 jari 320             }
2 26 Feb 07 jari 321             else{
2 26 Feb 07 jari 322                 PD.setMessage(3, geneAssaigned+" experiments have been assigned to clusters.");
2 26 Feb 07 jari 323                 PD.setMessage(4, (n-geneAssaigned)+" experiments left to be assigned to clusters.");
2 26 Feb 07 jari 324             }
2 26 Feb 07 jari 325             updateMatrix();
2 26 Feb 07 jari 326             CreatedCluster++;
2 26 Feb 07 jari 327         }
2 26 Feb 07 jari 328         
2 26 Feb 07 jari 329         //Figure out which genes have not been assigned
2 26 Feb 07 jari 330         for (int i = 0; i < resultClusters.length - 1; i++) {
2 26 Feb 07 jari 331             for (int j = 0; j < resultClusters[i].size(); j++) {
2 26 Feb 07 jari 332                 try {
2 26 Feb 07 jari 333                     resultClusters[k].removeElement(resultClusters[i].elementAt(j));
2 26 Feb 07 jari 334                 } catch (Exception e) {
2 26 Feb 07 jari 335                     System.out.println("Exception when removing elements");
2 26 Feb 07 jari 336                 }
2 26 Feb 07 jari 337             }
2 26 Feb 07 jari 338         }
2 26 Feb 07 jari 339         
2 26 Feb 07 jari 340         //Create a final cluster out of unassigned genes
2 26 Feb 07 jari 341         
2 26 Feb 07 jari 342         // Output messages
2 26 Feb 07 jari 343         for (int i = 0; i < resultClusters.length; i++) {
2 26 Feb 07 jari 344             //System.out.println("Cluster " + i);
2 26 Feb 07 jari 345             for (int j = 0; j < resultClusters[i].size(); j++) {
2 26 Feb 07 jari 346                 //System.out.println("Gene " + resultClusters[i].elementAt(j));
2 26 Feb 07 jari 347             }
2 26 Feb 07 jari 348         }
2 26 Feb 07 jari 349         
2 26 Feb 07 jari 350         clusters = resultClusters;
2 26 Feb 07 jari 351         PD.dismiss();
2 26 Feb 07 jari 352     }
2 26 Feb 07 jari 353     
2 26 Feb 07 jari 354     public void abort() {
2 26 Feb 07 jari 355         stop=true;
2 26 Feb 07 jari 356     }
2 26 Feb 07 jari 357     
2 26 Feb 07 jari 358     public void getPrincipleComponent(){
2 26 Feb 07 jari 359         
2 26 Feb 07 jari 360         double[][] EV= new double[1][matrixSize];
2 26 Feb 07 jari 361         
2 26 Feb 07 jari 362         //
2 26 Feb 07 jari 363         EVD= (workingMatrix.times(workingMatrix.transpose())).eig();
2 26 Feb 07 jari 364         
2 26 Feb 07 jari 365         Matrix D=EVD.getD();
2 26 Feb 07 jari 366         Matrix U=EVD.getV();
2 26 Feb 07 jari 367         
2 26 Feb 07 jari 368         
2 26 Feb 07 jari 369         for(int i=0;i<matrixSize;i++){
2 26 Feb 07 jari 370             EV[0][i]=U.get(i, 0);
2 26 Feb 07 jari 371             //  System.out.println("EV[0][" + i + "]: " + EV[0][i]);
2 26 Feb 07 jari 372         }
2 26 Feb 07 jari 373         
2 26 Feb 07 jari 374         eigenVector=new Matrix(EV);
2 26 Feb 07 jari 375         Matrix PC = eigenVector.times(workingMatrix);
2 26 Feb 07 jari 376         for(int i=0;i<m;i++){
2 26 Feb 07 jari 377             
2 26 Feb 07 jari 378             prinCom[i]=PC.get(0,i);
2 26 Feb 07 jari 379             //  System.out.println("prinCom[" + i + "]: " + prinCom[i]);
2 26 Feb 07 jari 380         }
2 26 Feb 07 jari 381         
2 26 Feb 07 jari 382         
2 26 Feb 07 jari 383     }
2 26 Feb 07 jari 384     
2 26 Feb 07 jari 385     public int getIteration(){
2 26 Feb 07 jari 386         int count=0;
2 26 Feb 07 jari 387         int totalGenes = n;
2 26 Feb 07 jari 388         while(totalGenes > 1){
2 26 Feb 07 jari 389             totalGenes-=Math.max((int)(totalGenes*0.1),1);
2 26 Feb 07 jari 390             //totalGenes-=Math.max((int)(totalGenes*0.2),1); //Try 20% instead of 10% for max cluster size
2 26 Feb 07 jari 391             count++;
2 26 Feb 07 jari 392         }
2 26 Feb 07 jari 393         return count;
2 26 Feb 07 jari 394         
2 26 Feb 07 jari 395     }
2 26 Feb 07 jari 396     
2 26 Feb 07 jari 397     public double getInnerProduct(double[] x, double[] y){
2 26 Feb 07 jari 398         int count = 0;
2 26 Feb 07 jari 399         double add=0.0d;
2 26 Feb 07 jari 400         
2 26 Feb 07 jari 401         if(x.length!=y.length){
2 26 Feb 07 jari 402             System.out.println("Vector has different number of elements!");
2 26 Feb 07 jari 403         }else{count=x.length;}
2 26 Feb 07 jari 404         
2 26 Feb 07 jari 405         for(int i=0;i<count; i++) {
2 26 Feb 07 jari 406             
2 26 Feb 07 jari 407             add+=x[i]*y[i];
2 26 Feb 07 jari 408         }
2 26 Feb 07 jari 409         return add;
2 26 Feb 07 jari 410         
2 26 Feb 07 jari 411     }
2 26 Feb 07 jari 412     
2 26 Feb 07 jari 413     public double[] getGene(int row){
2 26 Feb 07 jari 414         
2 26 Feb 07 jari 415         double[] aGene=new double[m];
2 26 Feb 07 jari 416         
2 26 Feb 07 jari 417         for(int i=0;i<m;i++){
2 26 Feb 07 jari 418             
2 26 Feb 07 jari 419             aGene[i]=workingMatrix.get(row,i);
2 26 Feb 07 jari 420         }
2 26 Feb 07 jari 421         return aGene;
2 26 Feb 07 jari 422         
2 26 Feb 07 jari 423     }
2 26 Feb 07 jari 424     
2 26 Feb 07 jari 425     public void shaveGene(double[] scores){
2 26 Feb 07 jari 426         
2 26 Feb 07 jari 427         int cutNo=Math.max((int)(unassigned.size()*0.1),1);
2 26 Feb 07 jari 428         //int cutNo=Math.max((int)(unassigned.size()*0.2),1); //Try 20% instead of 10% for max cluster size
2 26 Feb 07 jari 429         int[] cutIndex=new int[cutNo];
2 26 Feb 07 jari 430         double minValue;
2 26 Feb 07 jari 431         int minIndex;
2 26 Feb 07 jari 432         Integer spaceHolder=new Integer(-1);
2 26 Feb 07 jari 433         
2 26 Feb 07 jari 434         for (int j=0;j<cutNo;j++){
2 26 Feb 07 jari 435             
2 26 Feb 07 jari 436             minValue=scores[0];
2 26 Feb 07 jari 437             minIndex=0;
2 26 Feb 07 jari 438             
2 26 Feb 07 jari 439             for(int i=0;i<matrixSize;i++){
2 26 Feb 07 jari 440                 
2 26 Feb 07 jari 441                 if(minValue>scores[i]){
2 26 Feb 07 jari 442                     
2 26 Feb 07 jari 443                     minValue=scores[i];
2 26 Feb 07 jari 444                     minIndex=i;
2 26 Feb 07 jari 445                 }
2 26 Feb 07 jari 446             }
2 26 Feb 07 jari 447             cutIndex[j]=minIndex;
2 26 Feb 07 jari 448             scores[minIndex]=Double.MAX_VALUE;//to set it a big value so that it will not be chosen again.
2 26 Feb 07 jari 449         }
2 26 Feb 07 jari 450         
2 26 Feb 07 jari 451         for (int j=0;j<cutNo;j++){
2 26 Feb 07 jari 452             clusters[CurrentCluster].add((Integer)(unassigned.elementAt(cutIndex[j])));
2 26 Feb 07 jari 453             unassigned.setElementAt(spaceHolder, cutIndex[j]);
2 26 Feb 07 jari 454         }
2 26 Feb 07 jari 455         
2 26 Feb 07 jari 456         for (int j=0;j<cutNo;j++){
2 26 Feb 07 jari 457             
2 26 Feb 07 jari 458             unassigned.removeElement(spaceHolder);
2 26 Feb 07 jari 459             
2 26 Feb 07 jari 460         }
2 26 Feb 07 jari 461         
2 26 Feb 07 jari 462     }
2 26 Feb 07 jari 463     
2 26 Feb 07 jari 464     public double getDk(GSCluster gs) {
2 26 Feb 07 jari 465         
2 26 Feb 07 jari 466         float x_a=0.0f,v_b=0.0f;
2 26 Feb 07 jari 467         double R2,v_w=0.0d;
2 26 Feb 07 jari 468         double value;
2 26 Feb 07 jari 469         
2 26 Feb 07 jari 470         FloatMatrix Ave=gs.getAveGene();
2 26 Feb 07 jari 471         
2 26 Feb 07 jari 472         for (int i=0; i<m; i++) {
2 26 Feb 07 jari 473             x_a+=Ave.get(0,i);
2 26 Feb 07 jari 474         }
2 26 Feb 07 jari 475         x_a/=m;
2 26 Feb 07 jari 476         
2 26 Feb 07 jari 477         for (int i=0; i<m; i++) {
2 26 Feb 07 jari 478             v_b+=Math.pow((Ave.get(0,i)-x_a),2);
2 26 Feb 07 jari 479         }
2 26 Feb 07 jari 480         v_b/=m;
2 26 Feb 07 jari 481         
2 26 Feb 07 jari 482         for (int i=0; i<m; i++) {
2 26 Feb 07 jari 483             
2 26 Feb 07 jari 484             for (int j=0; j<gs.size(); j++) {
2 26 Feb 07 jari 485                 value=workingMatrix.get(((Integer)gs.get(j)).intValue(),i);
2 26 Feb 07 jari 486                 v_w+=Math.pow((value-Ave.get(0,i)),2);
2 26 Feb 07 jari 487             }
2 26 Feb 07 jari 488             
2 26 Feb 07 jari 489         }
2 26 Feb 07 jari 490         v_w/=(m*gs.size());
2 26 Feb 07 jari 491         
2 26 Feb 07 jari 492         R2=(v_b/v_w)/(1+v_b/v_w);
2 26 Feb 07 jari 493         
2 26 Feb 07 jari 494         return R2;
2 26 Feb 07 jari 495     }
2 26 Feb 07 jari 496     
2 26 Feb 07 jari 497     public double getD_k(GSCluster gs) {
2 26 Feb 07 jari 498         
2 26 Feb 07 jari 499         double R_2=0.0d;
2 26 Feb 07 jari 500         //iterate for 20 times(default)
2 26 Feb 07 jari 501         for (int iter=0; iter<fakedMatrix; iter++){
2 26 Feb 07 jari 502             
2 26 Feb 07 jari 503             getPermutedMatrix();
2 26 Feb 07 jari 504             R_2+=getDk(gs);
2 26 Feb 07 jari 505         }
2 26 Feb 07 jari 506         R_2/=fakedMatrix;
2 26 Feb 07 jari 507         return R_2;
2 26 Feb 07 jari 508         
2 26 Feb 07 jari 509     }
2 26 Feb 07 jari 510     
2 26 Feb 07 jari 511     public void getPermutedMatrix(){
2 26 Feb 07 jari 512         
2 26 Feb 07 jari 513         double temp;
2 26 Feb 07 jari 514         int gene1, gene2;
2 26 Feb 07 jari 515         for(int i=0;i<n;i++){
2 26 Feb 07 jari 516             //permute 5 elements for each row
2 26 Feb 07 jari 517             for (int j=0;j<swapTime;j++) {
2 26 Feb 07 jari 518                 Random MyRandom= new Random();
2 26 Feb 07 jari 519                 gene1=(int)Math.floor(MyRandom.nextFloat()*m);
2 26 Feb 07 jari 520                 gene1=Math.min(gene1,m-1);
2 26 Feb 07 jari 521                 temp=workingMatrix.get(i, gene1);
2 26 Feb 07 jari 522                 gene2=(int)Math.floor(MyRandom.nextFloat()*m);
2 26 Feb 07 jari 523                 gene2=Math.min(gene2,m-1);
2 26 Feb 07 jari 524                 workingMatrix.set(i, gene1, workingMatrix.get(i, gene2));
2 26 Feb 07 jari 525                 workingMatrix.set(i, gene2, temp);
2 26 Feb 07 jari 526             }
2 26 Feb 07 jari 527         }
2 26 Feb 07 jari 528     }
2 26 Feb 07 jari 529     
2 26 Feb 07 jari 530     public void updateMatrix(){
2 26 Feb 07 jari 531         
2 26 Feb 07 jari 532         double[][] AveGene= new double[1][m];
2 26 Feb 07 jari 533         
2 26 Feb 07 jari 534         //workingMatrix=(Matrix)dataMatrix.clone();
2 26 Feb 07 jari 535         FloatMatrix AG=resultClusters[CreatedCluster].getAveGene();
2 26 Feb 07 jari 536         for(int i=0; i<m; i++){
2 26 Feb 07 jari 537             
2 26 Feb 07 jari 538             AveGene[0][i]=(double)AG.get(0,i);
2 26 Feb 07 jari 539         }
2 26 Feb 07 jari 540         Matrix AveG=new Matrix(AveGene);
2 26 Feb 07 jari 541         Matrix I = Matrix.identity(m,m);
2 26 Feb 07 jari 542         Matrix Projector= I.minus((AveG.transpose()).times(AveG));
2 26 Feb 07 jari 543         dataMatrix=dataMatrix.times(Projector);
2 26 Feb 07 jari 544         
2 26 Feb 07 jari 545     }
2 26 Feb 07 jari 546     
2 26 Feb 07 jari 547     /**********************************************/
2 26 Feb 07 jari 548     
2 26 Feb 07 jari 549     private NodeValueList calculateHierarchicalTree(int[] features, int method, boolean genes, boolean experiments) throws AlgorithmException {
2 26 Feb 07 jari 550         NodeValueList nodeList = new NodeValueList();
2 26 Feb 07 jari 551         AlgorithmData data = new AlgorithmData();
2 26 Feb 07 jari 552         FloatMatrix experiment;
2 26 Feb 07 jari 553         
2 26 Feb 07 jari 554         if(gshGenes)
2 26 Feb 07 jari 555             experiment = getSubExperiment(this.expMatrix, features);
2 26 Feb 07 jari 556         else
2 26 Feb 07 jari 557             experiment = getSubExperimentReducedCols(this.expMatrix, features);
2 26 Feb 07 jari 558         
2 26 Feb 07 jari 559         data.addMatrix("experiment", experiment);
2 26 Feb 07 jari 560         data.addParam("hcl-distance-function", String.valueOf(this.hcl_function));
2 26 Feb 07 jari 561         data.addParam("hcl-distance-absolute", String.valueOf(this.hcl_absolute));
2 26 Feb 07 jari 562         data.addParam("method-linkage", String.valueOf(method));
2 26 Feb 07 jari 563         HCL hcl = new HCL();
2 26 Feb 07 jari 564         AlgorithmData result;
2 26 Feb 07 jari 565         if (genes) {
2 26 Feb 07 jari 566             data.addParam("calculate-genes", String.valueOf(true));
2 26 Feb 07 jari 567             result = hcl.execute(data);
2 26 Feb 07 jari 568             validate(result);
2 26 Feb 07 jari 569             addNodeValues(nodeList, result);
2 26 Feb 07 jari 570         }
2 26 Feb 07 jari 571         if (experiments) {
2 26 Feb 07 jari 572             data.addParam("calculate-genes", String.valueOf(false));
2 26 Feb 07 jari 573             result = hcl.execute(data);
2 26 Feb 07 jari 574             validate(result);
2 26 Feb 07 jari 575             addNodeValues(nodeList, result);
2 26 Feb 07 jari 576         }
2 26 Feb 07 jari 577         return nodeList;
2 26 Feb 07 jari 578     }
2 26 Feb 07 jari 579     
2 26 Feb 07 jari 580     private void addNodeValues(NodeValueList target_list, AlgorithmData source_result) {
2 26 Feb 07 jari 581         target_list.addNodeValue(new NodeValue("child-1-array", source_result.getIntArray("child-1-array")));
2 26 Feb 07 jari 582         target_list.addNodeValue(new NodeValue("child-2-array", source_result.getIntArray("child-2-array")));
2 26 Feb 07 jari 583         target_list.addNodeValue(new NodeValue("node-order", source_result.getIntArray("node-order")));
2 26 Feb 07 jari 584         target_list.addNodeValue(new NodeValue("height", source_result.getMatrix("height").getRowPackedCopy()));
2 26 Feb 07 jari 585     }
2 26 Feb 07 jari 586     
2 26 Feb 07 jari 587     private FloatMatrix getSubExperiment(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 588         FloatMatrix subExperiment = new FloatMatrix(features.length, experiment.getColumnDimension());
2 26 Feb 07 jari 589         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 590             subExperiment.A[i] = experiment.A[features[i]];
2 26 Feb 07 jari 591         }
2 26 Feb 07 jari 592         return subExperiment;
2 26 Feb 07 jari 593     }
2 26 Feb 07 jari 594     
2 26 Feb 07 jari 595     /**
2 26 Feb 07 jari 596      *  Creates a matrix with reduced columns (samples) as during experiment clustering
2 26 Feb 07 jari 597      */
2 26 Feb 07 jari 598     private FloatMatrix getSubExperimentReducedCols(FloatMatrix experiment, int[] features) {
2 26 Feb 07 jari 599         FloatMatrix copyMatrix = experiment.copy();
2 26 Feb 07 jari 600         FloatMatrix subExperiment = new FloatMatrix(features.length, copyMatrix.getColumnDimension());
2 26 Feb 07 jari 601         for (int i=0; i<features.length; i++) {
2 26 Feb 07 jari 602             subExperiment.A[i] = copyMatrix.A[features[i]];
2 26 Feb 07 jari 603         }
2 26 Feb 07 jari 604         subExperiment = subExperiment.transpose();
2 26 Feb 07 jari 605         return subExperiment;
2 26 Feb 07 jari 606     }
2 26 Feb 07 jari 607     
2 26 Feb 07 jari 608     /**
2 26 Feb 07 jari 609      * Checking the result of hcl algorithm calculation.
2 26 Feb 07 jari 610      * @throws AlgorithmException, if the result is incorrect.
2 26 Feb 07 jari 611      */
2 26 Feb 07 jari 612     private void validate(AlgorithmData result) throws AlgorithmException {
2 26 Feb 07 jari 613         if (result.getIntArray("child-1-array") == null) {
2 26 Feb 07 jari 614             throw new AlgorithmException("parameter 'child-1-array' is null");
2 26 Feb 07 jari 615         }
2 26 Feb 07 jari 616         if (result.getIntArray("child-2-array") == null) {
2 26 Feb 07 jari 617             throw new AlgorithmException("parameter 'child-2-array' is null");
2 26 Feb 07 jari 618         }
2 26 Feb 07 jari 619         if (result.getIntArray("node-order") == null) {
2 26 Feb 07 jari 620             throw new AlgorithmException("parameter 'node-order' is null");
2 26 Feb 07 jari 621         }
2 26 Feb 07 jari 622         if (result.getMatrix("height") == null) {
2 26 Feb 07 jari 623             throw new AlgorithmException("parameter 'height' is null");
2 26 Feb 07 jari 624         }
2 26 Feb 07 jari 625     }
2 26 Feb 07 jari 626     
2 26 Feb 07 jari 627     private int[] convert2int(Vector source) {
2 26 Feb 07 jari 628         int[] int_matrix = new int[source.size()];
2 26 Feb 07 jari 629         for (int i=0; i<int_matrix.length; i++) {
2 26 Feb 07 jari 630             int_matrix[i] = ((Integer) source.get(i)).intValue();
2 26 Feb 07 jari 631         }
2 26 Feb 07 jari 632         return int_matrix;
2 26 Feb 07 jari 633     }
2 26 Feb 07 jari 634     
2 26 Feb 07 jari 635     
2 26 Feb 07 jari 636     
2 26 Feb 07 jari 637     private FloatMatrix getMeans(GSCluster[] clusters) {
2 26 Feb 07 jari 638         FloatMatrix means = new FloatMatrix(clusters.length, number_of_samples);
2 26 Feb 07 jari 639         FloatMatrix mean;
2 26 Feb 07 jari 640         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 641             mean = clusters[i].getMean();
2 26 Feb 07 jari 642             means.A[i] = mean.A[0];
2 26 Feb 07 jari 643         }
2 26 Feb 07 jari 644         return means;
2 26 Feb 07 jari 645     }
2 26 Feb 07 jari 646     
2 26 Feb 07 jari 647     private FloatMatrix getVariances(GSCluster[] clusters, FloatMatrix means) {
2 26 Feb 07 jari 648         final int rows = means.getRowDimension();
2 26 Feb 07 jari 649         final int columns = means.getColumnDimension();
2 26 Feb 07 jari 650         FloatMatrix variances = new FloatMatrix(rows, columns);
2 26 Feb 07 jari 651         for (int row=0; row<rows; row++) {
2 26 Feb 07 jari 652             for (int column=0; column<columns; column++) {
2 26 Feb 07 jari 653                 variances.set(row, column, getSampleVariance(clusters[row], column, means.get(row, column)));
2 26 Feb 07 jari 654             }
2 26 Feb 07 jari 655         }
2 26 Feb 07 jari 656         return variances;
2 26 Feb 07 jari 657     }
2 26 Feb 07 jari 658     
2 26 Feb 07 jari 659     private float getSampleNormalizedSum(GSCluster cluster, int column, float mean) {
2 26 Feb 07 jari 660         final int size = cluster.size();
2 26 Feb 07 jari 661         float sum = 0f;
2 26 Feb 07 jari 662         float value;
2 26 Feb 07 jari 663         
2 26 Feb 07 jari 664         validN = 0;
2 26 Feb 07 jari 665         
2 26 Feb 07 jari 666         for (int i=0; i<size; i++) {
2 26 Feb 07 jari 667             value = expMatrix.get(((Integer) cluster.get(i)).intValue(), column);
2 26 Feb 07 jari 668             if (!Float.isNaN(value)) {
2 26 Feb 07 jari 669                 sum += Math.pow(value-mean, 2);
2 26 Feb 07 jari 670                 validN++;
2 26 Feb 07 jari 671             }
2 26 Feb 07 jari 672         }
2 26 Feb 07 jari 673         return sum;
2 26 Feb 07 jari 674     }
2 26 Feb 07 jari 675     
2 26 Feb 07 jari 676     private float getSampleVariance(GSCluster cluster, int column, float mean) {
2 26 Feb 07 jari 677         return(float)Math.sqrt(getSampleNormalizedSum(cluster, column, mean)/(float) (validN - 1));
2 26 Feb 07 jari 678     }
2 26 Feb 07 jari 679     
2 26 Feb 07 jari 680     /***********************************************/
2 26 Feb 07 jari 681     
2 26 Feb 07 jari 682     
2 26 Feb 07 jari 683     private class GSCluster extends Vector {
2 26 Feb 07 jari 684         
2 26 Feb 07 jari 685         private FloatMatrix AveGene = new FloatMatrix(1,m);
2 26 Feb 07 jari 686         private FloatMatrix mean = new FloatMatrix(1,m);
2 26 Feb 07 jari 687         
2 26 Feb 07 jari 688         public GSCluster(){}
2 26 Feb 07 jari 689         
2 26 Feb 07 jari 690         public FloatMatrix getAveGene() {
2 26 Feb 07 jari 691             double CurrentMean;
2 26 Feb 07 jari 692             int n=size();
2 26 Feb 07 jari 693             float Value;
2 26 Feb 07 jari 694             for (int i=0; i<m; i++) {
2 26 Feb 07 jari 695                 CurrentMean=0.0d;
2 26 Feb 07 jari 696                 for (int j=0; j<n; j++) {
2 26 Feb 07 jari 697                     Value= (float) workingMatrix.get(((Integer)get(j)).intValue(),i);
2 26 Feb 07 jari 698                     if (!Float.isNaN(Value)) CurrentMean += Value;
2 26 Feb 07 jari 699                 }
2 26 Feb 07 jari 700                 AveGene.set(0,i,(float)(CurrentMean/(double)n));
2 26 Feb 07 jari 701             }
2 26 Feb 07 jari 702             return AveGene;
2 26 Feb 07 jari 703         }
2 26 Feb 07 jari 704         
2 26 Feb 07 jari 705         public Vector fGenes() {
2 26 Feb 07 jari 706             Vector floatVector = new Vector();
2 26 Feb 07 jari 707             
2 26 Feb 07 jari 708             for (int i = 0; i < this.size(); i++) {
2 26 Feb 07 jari 709                 floatVector.addElement(new Float(((Integer) this.elementAt(i)).intValue()));
2 26 Feb 07 jari 710             }
2 26 Feb 07 jari 711             
2 26 Feb 07 jari 712             return floatVector;
2 26 Feb 07 jari 713         }
2 26 Feb 07 jari 714         
2 26 Feb 07 jari 715         public void calculateMean() {
2 26 Feb 07 jari 716             float currentMean;
2 26 Feb 07 jari 717             int n = size();
2 26 Feb 07 jari 718             int denom;
2 26 Feb 07 jari 719             float value;
2 26 Feb 07 jari 720             
2 26 Feb 07 jari 721             for (int i=0; i<number_of_samples; i++) {
2 26 Feb 07 jari 722                 currentMean = 0f;
2 26 Feb 07 jari 723                 denom = 0;
2 26 Feb 07 jari 724                 for (int j=0; j<n; j++) {
2 26 Feb 07 jari 725                     value = expMatrix.get(((Integer) get(j)).intValue(), i);
2 26 Feb 07 jari 726                     if (!Float.isNaN(value)) {
2 26 Feb 07 jari 727                         currentMean += value;
2 26 Feb 07 jari 728                         denom++;
2 26 Feb 07 jari 729                     }
2 26 Feb 07 jari 730                 }
2 26 Feb 07 jari 731                 mean.set(0, i, currentMean/(float) denom);
2 26 Feb 07 jari 732             }
2 26 Feb 07 jari 733         }
2 26 Feb 07 jari 734         
2 26 Feb 07 jari 735         public FloatMatrix getMean() {
2 26 Feb 07 jari 736             calculateMean();
2 26 Feb 07 jari 737             return mean;
2 26 Feb 07 jari 738         }
2 26 Feb 07 jari 739     }
2 26 Feb 07 jari 740     
2 26 Feb 07 jari 741     
2 26 Feb 07 jari 742 }
2 26 Feb 07 jari 743
2 26 Feb 07 jari 744