mev-4.0.01/source/org/tigr/microarray/util/SlideDataSorter.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: SlideDataSorter.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2005/03/10 15:39:21 $
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.util;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import org.tigr.microarray.mev.ISlideData;
2 26 Feb 07 jari 15 import org.tigr.microarray.mev.ISlideMetaData;
2 26 Feb 07 jari 16 import org.tigr.microarray.mev.cluster.gui.IData;
2 26 Feb 07 jari 17
2 26 Feb 07 jari 18 public class SlideDataSorter {
2 26 Feb 07 jari 19     
2 26 Feb 07 jari 20     // Sort Modes
2 26 Feb 07 jari 21     public final static int SORT_BY_LOCATION = 9000;
2 26 Feb 07 jari 22     public final static int SORT_BY_RATIO = 9001;
2 26 Feb 07 jari 23     
2 26 Feb 07 jari 24     private ISlideData slideData;
2 26 Feb 07 jari 25     
2 26 Feb 07 jari 26     /**
2 26 Feb 07 jari 27      * Constructs a <code>SlideDataSorter</code>
2 26 Feb 07 jari 28      */
2 26 Feb 07 jari 29     public SlideDataSorter() {
2 26 Feb 07 jari 30     }
2 26 Feb 07 jari 31     
2 26 Feb 07 jari 32     /**
2 26 Feb 07 jari 33      * Constructs a <code>SlideDataSorter</code> with specified data.
2 26 Feb 07 jari 34      * @see ISlideData
2 26 Feb 07 jari 35      */
2 26 Feb 07 jari 36     public SlideDataSorter(ISlideData slideData) {
2 26 Feb 07 jari 37         if (slideData == null) {
2 26 Feb 07 jari 38             throw new IllegalArgumentException("SlideData is null.");
2 26 Feb 07 jari 39         }
2 26 Feb 07 jari 40         this.slideData = slideData;
2 26 Feb 07 jari 41     }
2 26 Feb 07 jari 42     
2 26 Feb 07 jari 43     /**
2 26 Feb 07 jari 44      * Sets a microarray data for this sorter.
2 26 Feb 07 jari 45      */
2 26 Feb 07 jari 46     public void setSlideData(ISlideData slideData) {
2 26 Feb 07 jari 47         this.slideData = slideData;
2 26 Feb 07 jari 48     }
2 26 Feb 07 jari 49     
2 26 Feb 07 jari 50     /**
2 26 Feb 07 jari 51      * Applies sorting an array of indices according to
2 26 Feb 07 jari 52      * a wrapped microarray data and type of sort.
2 26 Feb 07 jari 53      */
2 26 Feb 07 jari 54     public int[] sort(int[] indices, int type) {
2 26 Feb 07 jari 55         sort(indices, new IndicesComparator(type));
2 26 Feb 07 jari 56         return indices;
2 26 Feb 07 jari 57     }
2 26 Feb 07 jari 58     
2 26 Feb 07 jari 59     /**
2 26 Feb 07 jari 60      * The class to compare a microarray elements by its indices
2 26 Feb 07 jari 61      * and sort type.
2 26 Feb 07 jari 62      */
2 26 Feb 07 jari 63     private class IndicesComparator {
2 26 Feb 07 jari 64         private int type;
2 26 Feb 07 jari 65         
2 26 Feb 07 jari 66         /**
2 26 Feb 07 jari 67          * Constructs an <code>IndicesComparator</code> with specified type of sort.
2 26 Feb 07 jari 68          */
2 26 Feb 07 jari 69         public IndicesComparator(int type) {
2 26 Feb 07 jari 70             this.type = type;
2 26 Feb 07 jari 71         }
2 26 Feb 07 jari 72         
2 26 Feb 07 jari 73         /**
2 26 Feb 07 jari 74          * Compare two elements with specified indices.
2 26 Feb 07 jari 75          */
2 26 Feb 07 jari 76         public int compare(int index1, int index2) {
2 26 Feb 07 jari 77             switch (type) {
2 26 Feb 07 jari 78                 case SORT_BY_LOCATION: {
2 26 Feb 07 jari 79                     ISlideMetaData meta = slideData.getSlideMetaData();
2 26 Feb 07 jari 80                     final int columns = meta.getColumns();
2 26 Feb 07 jari 81                     if (meta.getRow(index1)*columns + meta.getColumn(index1) <
2 26 Feb 07 jari 82                     meta.getRow(index2)*columns + meta.getColumn(index2)) {
2 26 Feb 07 jari 83                         return -1;
2 26 Feb 07 jari 84                     } else {
2 26 Feb 07 jari 85                         return 1;
2 26 Feb 07 jari 86                     }
2 26 Feb 07 jari 87                 }
2 26 Feb 07 jari 88                 case SORT_BY_RATIO: {
2 26 Feb 07 jari 89                     //alter to compare NaN values to real numbers
2 26 Feb 07 jari 90                     float value1, value2;
2 26 Feb 07 jari 91                     value1 = slideData.getRatio(index1, IData.LINEAR);
2 26 Feb 07 jari 92                     value2 = slideData.getRatio(index2, IData.LINEAR);
2 26 Feb 07 jari 93                     if(Float.isNaN(value1) && Float.isNaN(value2))
2 26 Feb 07 jari 94                         return -1;
2 26 Feb 07 jari 95                     if(Float.isNaN(value1) && !Float.isNaN(value2))
2 26 Feb 07 jari 96                         return -1;
2 26 Feb 07 jari 97                     if(!Float.isNaN(value1) && Float.isNaN(value2))
2 26 Feb 07 jari 98                         return 1;
2 26 Feb 07 jari 99                     //  if (slideData.getRatio(index1, IData.LINEAR) < slideData.getRatio(index2, IData.LINEAR)) {
2 26 Feb 07 jari 100                     if(value1 < value2){
2 26 Feb 07 jari 101                         return -1;
2 26 Feb 07 jari 102                 } else {
2 26 Feb 07 jari 103                     return 1;
2 26 Feb 07 jari 104                 }
2 26 Feb 07 jari 105             }
2 26 Feb 07 jari 106             default: {
2 26 Feb 07 jari 107                 ISlideMetaData meta = slideData.getSlideMetaData();
2 26 Feb 07 jari 108                 String value1 = meta.getValueAt(index1, type);
2 26 Feb 07 jari 109                 String value2 = meta.getValueAt(index2, type);
2 26 Feb 07 jari 110                 return value1.compareTo(value2);
2 26 Feb 07 jari 111             }
2 26 Feb 07 jari 112         }
2 26 Feb 07 jari 113     }
2 26 Feb 07 jari 114 }
2 26 Feb 07 jari 115
2 26 Feb 07 jari 116 //====== copied from Arrays.java ==========
2 26 Feb 07 jari 117
2 26 Feb 07 jari 118 public static void sort(int[] a, IndicesComparator c) {
2 26 Feb 07 jari 119     int[] aux = cloneArray(a);
2 26 Feb 07 jari 120     mergeSort(aux, a, 0, a.length, c);
2 26 Feb 07 jari 121 }
2 26 Feb 07 jari 122
2 26 Feb 07 jari 123 private static int[] cloneArray(int[] a) {
2 26 Feb 07 jari 124     int[] clone = new int[a.length];
2 26 Feb 07 jari 125     for (int i = a.length; --i >= 0;) {
2 26 Feb 07 jari 126         clone[i] = a[i];
2 26 Feb 07 jari 127     }
2 26 Feb 07 jari 128     return clone;
2 26 Feb 07 jari 129 }
2 26 Feb 07 jari 130
2 26 Feb 07 jari 131 private static void swap(int[] x, int a, int b) {
2 26 Feb 07 jari 132     int t = x[a];
2 26 Feb 07 jari 133     x[a] = x[b];
2 26 Feb 07 jari 134     x[b] = t;
2 26 Feb 07 jari 135 }
2 26 Feb 07 jari 136
2 26 Feb 07 jari 137 private static void mergeSort(int[] src, int[] dest, int low, int high, IndicesComparator c) {
2 26 Feb 07 jari 138     int length = high - low;
2 26 Feb 07 jari 139     
2 26 Feb 07 jari 140     // Insertion sort on smallest arrays
2 26 Feb 07 jari 141     if (length < 7) {
2 26 Feb 07 jari 142         for (int i=low; i<high; i++)
2 26 Feb 07 jari 143             for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
2 26 Feb 07 jari 144                 swap(dest, j, j-1);
2 26 Feb 07 jari 145         return;
2 26 Feb 07 jari 146     }
2 26 Feb 07 jari 147     
2 26 Feb 07 jari 148     // Recursively sort halves of dest into src
2 26 Feb 07 jari 149     int mid = (low + high)/2;
2 26 Feb 07 jari 150     mergeSort(dest, src, low, mid, c);
2 26 Feb 07 jari 151     mergeSort(dest, src, mid, high, c);
2 26 Feb 07 jari 152     
2 26 Feb 07 jari 153     // If list is already sorted, just copy from src to dest.  This is an
2 26 Feb 07 jari 154     // optimization that results in faster sorts for nearly ordered lists.
2 26 Feb 07 jari 155     if (c.compare(src[mid-1], src[mid]) <= 0) {
2 26 Feb 07 jari 156         System.arraycopy(src, low, dest, low, length);
2 26 Feb 07 jari 157         return;
2 26 Feb 07 jari 158     }
2 26 Feb 07 jari 159     
2 26 Feb 07 jari 160     // Merge sorted halves (now in src) into dest
2 26 Feb 07 jari 161     for (int i = low, p = low, q = mid; i < high; i++) {
2 26 Feb 07 jari 162         if (q>=high || p<mid && c.compare(src[p], src[q]) <= 0)
2 26 Feb 07 jari 163             dest[i] = src[p++];
2 26 Feb 07 jari 164         else
2 26 Feb 07 jari 165             dest[i] = src[q++];
2 26 Feb 07 jari 166     }
2 26 Feb 07 jari 167 }
2 26 Feb 07 jari 168 }
2 26 Feb 07 jari 169