mev-4.0.01/source/org/tigr/microarray/mev/cluster/gui/impl/rn/RelevanceNetworkLayout.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: RelevanceNetworkLayout.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 20:39:03 $
2 26 Feb 07 jari 9  * $Author: braistedj $
2 26 Feb 07 jari 10  * $State: Exp $
2 26 Feb 07 jari 11  */
2 26 Feb 07 jari 12 package org.tigr.microarray.mev.cluster.gui.impl.rn;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.util.ArrayList;
2 26 Feb 07 jari 15 import java.util.Arrays;
2 26 Feb 07 jari 16 import java.util.Random;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 import org.tigr.microarray.mev.cluster.gui.impl.util.IntSorter;
2 26 Feb 07 jari 19
2 26 Feb 07 jari 20 /**
2 26 Feb 07 jari 21  * <strong>Note that this implementation is not synchronized.</strong>
2 26 Feb 07 jari 22  */
2 26 Feb 07 jari 23 public class RelevanceNetworkLayout {
2 26 Feb 07 jari 24
2 26 Feb 07 jari 25     public static final int RANDOM_LAYOUT = 0;
2 26 Feb 07 jari 26     public static final int CIRCULAR_LAYOUT = 1;
2 26 Feb 07 jari 27
2 26 Feb 07 jari 28     /**
2 26 Feb 07 jari 29      * Lays out nodes with specified layout type.
2 26 Feb 07 jari 30      * @return an array of nodes coordinaties.
2 26 Feb 07 jari 31      */
2 26 Feb 07 jari 32     public float[][] doLayout(int[][] clusters, float[][] weights, int layout) {
2 26 Feb 07 jari 33         switch (layout) {
2 26 Feb 07 jari 34         case RANDOM_LAYOUT:
2 26 Feb 07 jari 35             return doRandomLayout(clusters, weights);
2 26 Feb 07 jari 36         case CIRCULAR_LAYOUT:
2 26 Feb 07 jari 37             return doCircularLayout(clusters, weights);
2 26 Feb 07 jari 38         }
2 26 Feb 07 jari 39         return null;
2 26 Feb 07 jari 40     }
2 26 Feb 07 jari 41
2 26 Feb 07 jari 42     /**
2 26 Feb 07 jari 43      * Returns array of random coordinaties.
2 26 Feb 07 jari 44      */
2 26 Feb 07 jari 45     private float[][] doRandomLayout(int[][] clusters, float[][] weights) {
2 26 Feb 07 jari 46         float[][] coords = new float[clusters.length][2];
2 26 Feb 07 jari 47         Random random = new Random(0);
2 26 Feb 07 jari 48         for (int i=0; i<coords.length; i++) {
2 26 Feb 07 jari 49             coords[i][0] = Math.abs(random.nextFloat());
2 26 Feb 07 jari 50             coords[i][1] = Math.abs(random.nextFloat());
2 26 Feb 07 jari 51         }
2 26 Feb 07 jari 52         return coords;
2 26 Feb 07 jari 53     }
2 26 Feb 07 jari 54
2 26 Feb 07 jari 55     /**
2 26 Feb 07 jari 56      * Returns nodes coordinaties as a set of circles.
2 26 Feb 07 jari 57      */
2 26 Feb 07 jari 58     private float[][] doCircularLayout(int[][] clusters, float[][] weights) {
2 26 Feb 07 jari 59         float[][] coords = new float[clusters.length][2];
2 26 Feb 07 jari 60         int[][] subnets = formRelevanceNetworks(clusters);
2 26 Feb 07 jari 61         // sort subnets
2 26 Feb 07 jari 62         int[] indices = new int[subnets.length];
2 26 Feb 07 jari 63         for (int i = indices.length; --i >= 0;) {
2 26 Feb 07 jari 64             indices[i] = i;
2 26 Feb 07 jari 65         }
2 26 Feb 07 jari 66         IntSorter.sort(indices, new RelNetComparator(subnets));
2 26 Feb 07 jari 67
2 26 Feb 07 jari 68         int x_size = (int)Math.ceil(Math.sqrt(subnets.length));
2 26 Feb 07 jari 69         int y_size = (int)Math.ceil((float)subnets.length/(float)x_size);
2 26 Feb 07 jari 70         int subnet;
2 26 Feb 07 jari 71         for (int y=0; y<y_size; y++) {
2 26 Feb 07 jari 72             for (int x=0; x<x_size; x++) {
2 26 Feb 07 jari 73                 subnet = y*x_size+x;
2 26 Feb 07 jari 74                 if (subnet >= subnets.length) {
2 26 Feb 07 jari 75                     break;
2 26 Feb 07 jari 76                 }
2 26 Feb 07 jari 77                 arrangeGraph(subnets[indices[subnet]], coords, x, y); // do layout algorithm
2 26 Feb 07 jari 78             }
2 26 Feb 07 jari 79         }
2 26 Feb 07 jari 80         normalize(coords, clusters);
2 26 Feb 07 jari 81         return coords;
2 26 Feb 07 jari 82     }
2 26 Feb 07 jari 83
2 26 Feb 07 jari 84     private void arrangeGraph(int[] subnet, float[][] coords, int x, int y) {
2 26 Feb 07 jari 85         for (int i=0; i<subnet.length; i++) {
2 26 Feb 07 jari 86             coords[subnet[i]][0]=(float)(Math.cos(2*Math.PI*i/subnet.length)+2.5*(x+1)-1.5f);
2 26 Feb 07 jari 87             coords[subnet[i]][1]=(float)(Math.sin(2*Math.PI*i/subnet.length)+2.5*(y+1)-1.5f);
2 26 Feb 07 jari 88         }
2 26 Feb 07 jari 89     }
2 26 Feb 07 jari 90
2 26 Feb 07 jari 91     /**
2 26 Feb 07 jari 92      * Normalize nodes coordinaties to be from 0 to 1.
2 26 Feb 07 jari 93      */
2 26 Feb 07 jari 94     private void normalize(float[][] coords, int[][] clusters) {
2 26 Feb 07 jari 95         float max = 0;
2 26 Feb 07 jari 96         float minX = Float.MAX_VALUE;
2 26 Feb 07 jari 97         float minY = Float.MAX_VALUE;
2 26 Feb 07 jari 98         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 99             if (clusters[i].length > 1) {
2 26 Feb 07 jari 100                 for (int j=0; j<clusters[i].length; j++) {
2 26 Feb 07 jari 101                     minX = Math.min(minX, coords[clusters[i][j]][0]);
2 26 Feb 07 jari 102                     minY = Math.min(minY, coords[clusters[i][j]][1]);
2 26 Feb 07 jari 103                 }
2 26 Feb 07 jari 104             }
2 26 Feb 07 jari 105         }
2 26 Feb 07 jari 106         for (int i=0; i<coords.length; i++) {
2 26 Feb 07 jari 107             coords[i][0] = coords[i][0] - minX;
2 26 Feb 07 jari 108             coords[i][1] = coords[i][1] - minY;
2 26 Feb 07 jari 109         }
2 26 Feb 07 jari 110         for (int i=0; i<clusters.length; i++) {
2 26 Feb 07 jari 111             if (clusters[i].length > 1) {
2 26 Feb 07 jari 112                 for (int j=0; j<clusters[i].length; j++) {
2 26 Feb 07 jari 113                     max = Math.max(max, Math.max(coords[clusters[i][j]][0], coords[clusters[i][j]][1]));
2 26 Feb 07 jari 114                 }
2 26 Feb 07 jari 115             }
2 26 Feb 07 jari 116         }
2 26 Feb 07 jari 117         for (int i=0; i<coords.length; i++) {
2 26 Feb 07 jari 118             coords[i][0] = coords[i][0]/max;
2 26 Feb 07 jari 119             coords[i][1] = coords[i][1]/max;
2 26 Feb 07 jari 120         }
2 26 Feb 07 jari 121     }
2 26 Feb 07 jari 122
2 26 Feb 07 jari 123     /**
2 26 Feb 07 jari 124      * Returns nodes for every subnet in relnet.
2 26 Feb 07 jari 125      */
2 26 Feb 07 jari 126     public int[][] formRelevanceNetworks(int[][] clusters) {
2 26 Feb 07 jari 127         int size = clusters.length;
2 26 Feb 07 jari 128         boolean[] visited = new boolean[size];
2 26 Feb 07 jari 129         Arrays.fill(visited, false);
2 26 Feb 07 jari 130         ArrayList subnets = new ArrayList();
2 26 Feb 07 jari 131         for (int node=0; node<size; node++) {
2 26 Feb 07 jari 132             if (visited[node]) {
2 26 Feb 07 jari 133                 continue;
2 26 Feb 07 jari 134             }
2 26 Feb 07 jari 135             subnets.add(fillSubnet(new ArrayList(), node, visited, clusters));
2 26 Feb 07 jari 136         }
2 26 Feb 07 jari 137         // copy result into a new structure
2 26 Feb 07 jari 138         int subnets_size = subnets.size();
2 26 Feb 07 jari 139         int number_of_subnets = 0;
2 26 Feb 07 jari 140         for (int i=0; i<subnets_size; i++) {
2 26 Feb 07 jari 141             if (((ArrayList)subnets.get(i)).size() > 1) {
2 26 Feb 07 jari 142                 number_of_subnets++;
2 26 Feb 07 jari 143             }
2 26 Feb 07 jari 144         }
2 26 Feb 07 jari 145         int[][] result = new int[number_of_subnets][];
2 26 Feb 07 jari 146         int subnet_pos = 0;
2 26 Feb 07 jari 147         ArrayList subnet;
2 26 Feb 07 jari 148         for (int i=0; i<subnets_size; i++) {
2 26 Feb 07 jari 149             subnet = (ArrayList)subnets.get(i);
2 26 Feb 07 jari 150             if (subnet.size() > 1) {
2 26 Feb 07 jari 151                 result[subnet_pos] = new int[subnet.size()];
2 26 Feb 07 jari 152                 for (int j=0; j<result[subnet_pos].length; j++) {
2 26 Feb 07 jari 153                     result[subnet_pos][j] = ((Integer)subnet.get(j)).intValue();
2 26 Feb 07 jari 154                 }
2 26 Feb 07 jari 155                 subnet_pos++;
2 26 Feb 07 jari 156             }
2 26 Feb 07 jari 157         }
2 26 Feb 07 jari 158         return result;
2 26 Feb 07 jari 159     }
2 26 Feb 07 jari 160
2 26 Feb 07 jari 161     private ArrayList fillSubnet(ArrayList subnet, int root, boolean[] visited, int[][] clusters) {
2 26 Feb 07 jari 162         subnet.add(new Integer(root));
2 26 Feb 07 jari 163         visited[root] = true;
2 26 Feb 07 jari 164         int[] cluster = clusters[root];
2 26 Feb 07 jari 165         int node;
2 26 Feb 07 jari 166         for (int i=1; i<cluster.length; i++) {
2 26 Feb 07 jari 167             node = cluster[i];
2 26 Feb 07 jari 168             if (visited[node]) {
2 26 Feb 07 jari 169                 continue;
2 26 Feb 07 jari 170             }
2 26 Feb 07 jari 171             fillSubnet(subnet, node, visited, clusters);
2 26 Feb 07 jari 172         }
2 26 Feb 07 jari 173         return subnet;
2 26 Feb 07 jari 174     }
2 26 Feb 07 jari 175
2 26 Feb 07 jari 176 }
2 26 Feb 07 jari 177
2 26 Feb 07 jari 178