mev-4.0.01/source/org/tigr/microarray/mev/file/GenepixFileParser.java

Code
Comments
Other
Rev Date Author Line
2 26 Feb 07 jari 1 package org.tigr.microarray.mev.file;
2 26 Feb 07 jari 2
2 26 Feb 07 jari 3 /**
2 26 Feb 07 jari 4  * <p>Title: GenepixFileParser</p>
2 26 Feb 07 jari 5  * <p>Description: Read a GenePix file, convert to TIGR tav file format, and
2 26 Feb 07 jari 6  *    provide it as an output.
2 26 Feb 07 jari 7  * <br><br> The constructors receive GenePix file or file name.  If using thread to
2 26 Feb 07 jari 8  *    load the file, provide true to the constructor.  It should call isCompleted()
2 26 Feb 07 jari 9  *    method to check if the complement of loading before calling getTavFile() to
2 26 Feb 07 jari 10  *    have the output. The output is in a form of vector that contains a number
2 26 Feb 07 jari 11  *    of vector with 8 elements as following:
2 26 Feb 07 jari 12  * <table boarder=0, cellpadding=1>
2 26 Feb 07 jari 13  * <tr><th>Index</th><th>Data Type</th><th>Contents</th></tr>
2 26 Feb 07 jari 14  * <tr><td>1</td><td>Integer</td><td>Intensity of Channel A</td></tr>
2 26 Feb 07 jari 15  * <tr><td>2</td><td>Integer</td><td>Intensity of Channel B</td></tr>
2 26 Feb 07 jari 16  * <tr><td>3</td><td>Integer</td><td>Slide Row</td></tr>
2 26 Feb 07 jari 17  * <tr><td>4</td><td>Integer</td><td>Slide Column</td></tr>
2 26 Feb 07 jari 18  * <tr><td>5</td><td>Integer</td><td>Meta Row</td></tr>
2 26 Feb 07 jari 19  * <tr><td>6</td><td>Integer</td><td>Meta Column</td></tr>
2 26 Feb 07 jari 20  * <tr><td>7</td><td>String</td><td>Name (in GenePix File)</td></tr>
2 26 Feb 07 jari 21  * <tr><td>8</td><td>String</td><td>ID (in GenePix File)</td></tr>
2 26 Feb 07 jari 22  * </table>
2 26 Feb 07 jari 23  * </p>
2 26 Feb 07 jari 24  * <p>Copyright: Copyright (c) 2003</p>
2 26 Feb 07 jari 25  * <p>Company: The Institute for Genomic Research</p>
2 26 Feb 07 jari 26  * @author Jianwei (Jerry) Li
2 26 Feb 07 jari 27  * @version 1.0
2 26 Feb 07 jari 28  */
2 26 Feb 07 jari 29
2 26 Feb 07 jari 30 import java.io.BufferedReader;
2 26 Feb 07 jari 31 import java.io.File;
2 26 Feb 07 jari 32 import java.io.FileInputStream;
2 26 Feb 07 jari 33 import java.io.IOException;
2 26 Feb 07 jari 34 import java.io.InputStreamReader;
2 26 Feb 07 jari 35 import java.util.StringTokenizer;
2 26 Feb 07 jari 36 import java.util.Vector;
2 26 Feb 07 jari 37
2 26 Feb 07 jari 38 import javax.swing.JOptionPane;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.util.StringSplitter;
2 26 Feb 07 jari 41
2 26 Feb 07 jari 42 public class GenepixFileParser extends Thread{
2 26 Feb 07 jari 43
2 26 Feb 07 jari 44   private final int FIRST_NUM = 1;
2 26 Feb 07 jari 45
2 26 Feb 07 jari 46   private final String BLOCK = "\"Block\"";
2 26 Feb 07 jari 47   private final String BLOCK_N = "Block";
2 26 Feb 07 jari 48   private final String COLUMN = "\"Column\"";
2 26 Feb 07 jari 49   private final String COLUMN_N = "Column";
2 26 Feb 07 jari 50   private final String F_PIX = "\"F Pixels\"";
2 26 Feb 07 jari 51   private final String F_PIX_N = "F Pixels";
2 26 Feb 07 jari 52   private final String ID = "\"ID\"";
2 26 Feb 07 jari 53   private final String ID_N = "ID";
2 26 Feb 07 jari 54   private final String NAME = "\"Name\"";
2 26 Feb 07 jari 55   private final String NAME_N = "Name";
2 26 Feb 07 jari 56   private final String RW = "\"Row\"";
2 26 Feb 07 jari 57   private final String ROW_N = "Row";
2 26 Feb 07 jari 58   private final String WAVE_KEY_1 = "ImageName";
2 26 Feb 07 jari 59   private final String WAVE_KEY_2 = "Wavelengths";
2 26 Feb 07 jari 60   private final String FLAGS = "\"Flags\"";
2 26 Feb 07 jari 61   private final String FLAGS_N = "Flags";
2 26 Feb 07 jari 62   
2 26 Feb 07 jari 63   private boolean ready; // indicates if the process is completed.
2 26 Feb 07 jari 64   private boolean hasError;
2 26 Feb 07 jari 65   private File gprFile;
2 26 Feb 07 jari 66   private int taskEnd, counter;
2 26 Feb 07 jari 67   private int fPixAddr;
2 26 Feb 07 jari 68   private String errorMsg;
2 26 Feb 07 jari 69   private String chA, chB, chAn, chBn;
2 26 Feb 07 jari 70   private String chAs, chAsn, chBs, chBsn;
2 26 Feb 07 jari 71   private String bgChA, bgChB, bgChAn, bgChBn;
2 26 Feb 07 jari 72   private Vector tavFile;
2 26 Feb 07 jari 73
2 26 Feb 07 jari 74   public GenepixFileParser() {
2 26 Feb 07 jari 75     this(new String(""));
2 26 Feb 07 jari 76   }
2 26 Feb 07 jari 77
2 26 Feb 07 jari 78   /****************************************************************************
2 26 Feb 07 jari 79    * <b>Constructor: </b>
2 26 Feb 07 jari 80    * <p><b>Parameters: </b>
2 26 Feb 07 jari 81    * <br> genepixFileName --- the name of GenePix file to be loaded..
2 26 Feb 07 jari 82    *****************************************************************************/
2 26 Feb 07 jari 83   public GenepixFileParser(String genepixFileName) {
2 26 Feb 07 jari 84     this(new File(genepixFileName));
2 26 Feb 07 jari 85   }
2 26 Feb 07 jari 86
2 26 Feb 07 jari 87   /****************************************************************************
2 26 Feb 07 jari 88    * <b>Constructor: </b>
2 26 Feb 07 jari 89    * <p><b>Parameters: </b>
2 26 Feb 07 jari 90    * <br> genepixFile --- the GenePix files to be loaded.
2 26 Feb 07 jari 91    *****************************************************************************/
2 26 Feb 07 jari 92   public GenepixFileParser(File genepixFile) {
2 26 Feb 07 jari 93     this(genepixFile, false);
2 26 Feb 07 jari 94   }
2 26 Feb 07 jari 95
2 26 Feb 07 jari 96  /****************************************************************************
2 26 Feb 07 jari 97    * <b>Constructor: </b>
2 26 Feb 07 jari 98    * <p><b>Parameters: </b>
2 26 Feb 07 jari 99    * <br> genepixFileName --- the name of GenePix file to be loaded.
2 26 Feb 07 jari 100    * <br> useThread --- true for using thread to complete the process.
2 26 Feb 07 jari 101    *****************************************************************************/
2 26 Feb 07 jari 102   public GenepixFileParser(String genepixFileName, boolean useThread) {
2 26 Feb 07 jari 103     this(new File(genepixFileName), useThread);
2 26 Feb 07 jari 104   }
2 26 Feb 07 jari 105
2 26 Feb 07 jari 106   /****************************************************************************
2 26 Feb 07 jari 107    * <b>Constructor: </b>
2 26 Feb 07 jari 108    * <p><b>Parameters: </b>
2 26 Feb 07 jari 109    * <br> genepixFile --- the GenePix files to be loaded.
2 26 Feb 07 jari 110    * <br> useThread --- true for using thread to complete the process.
2 26 Feb 07 jari 111    *****************************************************************************/
2 26 Feb 07 jari 112   public GenepixFileParser(File genepixFile, boolean useThread) {
2 26 Feb 07 jari 113     if(genepixFile != null){
2 26 Feb 07 jari 114       gprFile = genepixFile;
2 26 Feb 07 jari 115       errorMsg = new String("");
2 26 Feb 07 jari 116       ready = false;
2 26 Feb 07 jari 117       hasError = false;
2 26 Feb 07 jari 118       taskEnd = 0;
2 26 Feb 07 jari 119       if(!useThread){
2 26 Feb 07 jari 120         startLoad();
2 26 Feb 07 jari 121         // following codes are for testing.
2 26 Feb 07 jari 122        /* Vector test;
2 26 Feb 07 jari 123         for(int i=0; i<tavFile.size(); i++){
2 26 Feb 07 jari 124           test = (Vector)tavFile.elementAt(i);
2 26 Feb 07 jari 125           for(int j=0; j<test.size(); j++){
2 26 Feb 07 jari 126             if(j<6){
2 26 Feb 07 jari 127               System.out.print((Integer)test.elementAt(j));
2 26 Feb 07 jari 128             } else {
2 26 Feb 07 jari 129               System.out.print((String)test.elementAt(j));
2 26 Feb 07 jari 130             }
2 26 Feb 07 jari 131             System.out.print('\t');
2 26 Feb 07 jari 132           }
2 26 Feb 07 jari 133           System.out.print('\n');
2 26 Feb 07 jari 134         }*/
2 26 Feb 07 jari 135       }
2 26 Feb 07 jari 136     }
2 26 Feb 07 jari 137   }
2 26 Feb 07 jari 138
2 26 Feb 07 jari 139   /***************************************************************************
2 26 Feb 07 jari 140    * <b>Description: </b>
2 26 Feb 07 jari 141    *   returns the current step of the loading.
2 26 Feb 07 jari 142    **************************************************************************/
2 26 Feb 07 jari 143   public int getCurrentStep() { return counter; }
2 26 Feb 07 jari 144
2 26 Feb 07 jari 145   /***************************************************************************
2 26 Feb 07 jari 146    * <b>Description: </b>
2 26 Feb 07 jari 147    *   if error occurs, calling this method to get error message.
2 26 Feb 07 jari 148    **************************************************************************/
2 26 Feb 07 jari 149   public String getErrorMessage() { return errorMsg; }
2 26 Feb 07 jari 150
2 26 Feb 07 jari 151   /***************************************************************************
2 26 Feb 07 jari 152    * <b>Description: </b>
2 26 Feb 07 jari 153    *   returns the total number of the steps for completing the file loading.
2 26 Feb 07 jari 154    *   Normally, this is the number of spots (rows).
2 26 Feb 07 jari 155    **************************************************************************/
2 26 Feb 07 jari 156   public int getProgressEnd() { return taskEnd; }
2 26 Feb 07 jari 157
2 26 Feb 07 jari 158   /***************************************************************************
2 26 Feb 07 jari 159    * <b>Description: </b>
2 26 Feb 07 jari 160    *   returns a vector that contains a number of vector with 8 elements as
2 26 Feb 07 jari 161    *   following:
2 26 Feb 07 jari 162    * <table boarder=0, cellpadding=1>
2 26 Feb 07 jari 163    * <tr><th>Index</th><th>Data Type</th><th>Contents</th></tr>
2 26 Feb 07 jari 164    * <tr><td>1</td><td>Integer</td><td>Intensity of Channel A</td></tr>
2 26 Feb 07 jari 165    * <tr><td>2</td><td>Integer</td><td>Intensity of Channel B</td></tr>
2 26 Feb 07 jari 166    * <tr><td>3</td><td>Integer</td><td>Slide Row</td></tr>
2 26 Feb 07 jari 167    * <tr><td>4</td><td>Integer</td><td>Slide Column</td></tr>
2 26 Feb 07 jari 168    * <tr><td>5</td><td>Integer</td><td>Meta Row</td></tr>
2 26 Feb 07 jari 169    * <tr><td>6</td><td>Integer</td><td>Meta Column</td></tr>
2 26 Feb 07 jari 170    * <tr><td>7</td><td>String</td><td>Name (in GenePix File)</td></tr>
2 26 Feb 07 jari 171    * <tr><td>8</td><td>String</td><td>ID (in GenePix File)</td></tr>
2 26 Feb 07 jari 172    * </table>
2 26 Feb 07 jari 173    * <b>Note: </b> Before calling this method, isCompleted() should be called
2 26 Feb 07 jari 174    * to ensure the loading is completed.
2 26 Feb 07 jari 175    **************************************************************************/
2 26 Feb 07 jari 176   public Vector getTavFile() { return tavFile; }
2 26 Feb 07 jari 177
2 26 Feb 07 jari 178   /***************************************************************************
2 26 Feb 07 jari 179    * <b>Description: </b>
2 26 Feb 07 jari 180    *   return ture if there is an error during the loading; otherwise, false.
2 26 Feb 07 jari 181    **************************************************************************/
2 26 Feb 07 jari 182   public boolean hasError() { return hasError; }
2 26 Feb 07 jari 183
2 26 Feb 07 jari 184   /***************************************************************************
2 26 Feb 07 jari 185    * <b>Description: </b>
2 26 Feb 07 jari 186    *   return ture if the loading is done; otherwise, false.
2 26 Feb 07 jari 187    **************************************************************************/
2 26 Feb 07 jari 188   public boolean isCompleted() { return ready; }
2 26 Feb 07 jari 189
2 26 Feb 07 jari 190   /***************************************************************************
2 26 Feb 07 jari 191    * <b>Description: </b>
2 26 Feb 07 jari 192    *   overrides an abstract method to implement the main function of class.
2 26 Feb 07 jari 193    **************************************************************************/
2 26 Feb 07 jari 194   public void run () {
2 26 Feb 07 jari 195     startLoad();
2 26 Feb 07 jari 196   }
2 26 Feb 07 jari 197
2 26 Feb 07 jari 198   public static void main(String[] args) {
2 26 Feb 07 jari 199     if(args != null){
2 26 Feb 07 jari 200       GenepixFileParser genepixFileLoader1 = new GenepixFileParser(args[0]);
2 26 Feb 07 jari 201     } else {
2 26 Feb 07 jari 202       GenepixFileParser genepixFileLoader1 = new GenepixFileParser();
2 26 Feb 07 jari 203     }
2 26 Feb 07 jari 204   }
2 26 Feb 07 jari 205
2 26 Feb 07 jari 206   /****************************************************************************
2 26 Feb 07 jari 207    * <b>Description: </b>
2 26 Feb 07 jari 208    *   calculate density for a channel
2 26 Feb 07 jari 209    * <p><b>Parameters: </b>
2 26 Feb 07 jari 210    * <br> tuple -- all information in one row
2 26 Feb 07 jari 211    * <br> med -- address for either channel A or B median column
2 26 Feb 07 jari 212    * <br> area -- spot area in number of pixels
2 26 Feb 07 jari 213    * <br> backg -- address for background medien column
2 26 Feb 07 jari 214    * <p><b>Return: </b> the density
2 26 Feb 07 jari 215    ***************************************************************************/
2 26 Feb 07 jari 216   private String calculateDensity(String[] tuple, int med, int sat, int backg){
2 26 Feb 07 jari 217     float fMedian, bMedian, fPix, bPix, fSat;
2 26 Feb 07 jari 218     int temp;
2 26 Feb 07 jari 219     String den = new String("");
2 26 Feb 07 jari 220     fMedian = Float.parseFloat(tuple[med]);
2 26 Feb 07 jari 221     bMedian = Float.parseFloat(tuple[backg]);
2 26 Feb 07 jari 222     //temp = (int)((fMedian - bMedian) * area);
2 26 Feb 07 jari 223
2 26 Feb 07 jari 224     fPix = Float.parseFloat(tuple[fPixAddr]);
2 26 Feb 07 jari 225     fSat = Float.parseFloat(tuple[sat]);
2 26 Feb 07 jari 226     fSat = fSat / 100;
2 26 Feb 07 jari 227     temp = (int)(fPix * (fMedian - bMedian) * ( 1 - fSat));
2 26 Feb 07 jari 228     //temp = (fPix * (fMedian - bMedian) * ( 1 - fSat));
2 26 Feb 07 jari 229
2 26 Feb 07 jari 230     den += temp;
2 26 Feb 07 jari 231     return den;
2 26 Feb 07 jari 232   }
2 26 Feb 07 jari 233
2 26 Feb 07 jari 234   /****************************************************************************
2 26 Feb 07 jari 235    * <b>Description: </b>
2 26 Feb 07 jari 236    *    assignes values to the keys for searching right columns.
2 26 Feb 07 jari 237    * <p><b>Parameter: </b>
2 26 Feb 07 jari 238    * <br> wvs --- the wave lenghts.
2 26 Feb 07 jari 239    ***************************************************************************/
2 26 Feb 07 jari 240   private void defineKeys(String[] wvs) {
2 26 Feb 07 jari 241     chA = new String("\"F" + wvs[0] + " Median\"");
2 26 Feb 07 jari 242     chB = new String("\"F" + wvs[1] + " Median\"");
2 26 Feb 07 jari 243     chAs = new String("\"F" + wvs[0] + " % Sat.\"");
2 26 Feb 07 jari 244     chBs = new String("\"F" + wvs[1] + " % Sat.\"");
2 26 Feb 07 jari 245     bgChA = new String("\"B" + wvs[0] + " Median\"");
2 26 Feb 07 jari 246     bgChB = new String("\"B" + wvs[1] + " Median\"");
2 26 Feb 07 jari 247
2 26 Feb 07 jari 248     chAn = new String("F" + wvs[0] + " Median");
2 26 Feb 07 jari 249     chBn = new String("F" + wvs[1] + " Median");
2 26 Feb 07 jari 250     chAsn = new String("F" + wvs[0] + " % Sat.");
2 26 Feb 07 jari 251     chBsn = new String("F" + wvs[1] + " % Sat.");
2 26 Feb 07 jari 252     bgChAn = new String("B" + wvs[0] + " Median");
2 26 Feb 07 jari 253     bgChBn = new String("B" + wvs[1] + " Median");
2 26 Feb 07 jari 254   }
2 26 Feb 07 jari 255
2 26 Feb 07 jari 256   /****************************************************************************
2 26 Feb 07 jari 257    * <b>Description: </b>
2 26 Feb 07 jari 258    *    find the address of the column that is interested.
2 26 Feb 07 jari 259    * <p><b>Parameters: </b>
2 26 Feb 07 jari 260    * <br> str -- a line of the file
2 26 Feb 07 jari 261    * <br> key -- column name to be searched
2 26 Feb 07 jari 262    * <br> noQuato -- column name withouth quato.
2 26 Feb 07 jari 263    * <P><b>Return: </b> the index of the column
2 26 Feb 07 jari 264    ****************************************************************************/
2 26 Feb 07 jari 265   private int findRightCol(String str[], String key, String noQuato){
2 26 Feb 07 jari 266     int addr = 0;
2 26 Feb 07 jari 267     int size = str.length;
2 26 Feb 07 jari 268     int i;
2 26 Feb 07 jari 269     String temp = new String("");
2 26 Feb 07 jari 270
2 26 Feb 07 jari 271     for(i=0; i<str.length; i++){
2 26 Feb 07 jari 272       if(str[i].equalsIgnoreCase(key) || str[i].equalsIgnoreCase(noQuato)){
2 26 Feb 07 jari 273         addr = i;
2 26 Feb 07 jari 274         i = str.length;
2 26 Feb 07 jari 275       }
2 26 Feb 07 jari 276     }
2 26 Feb 07 jari 277     return addr;
2 26 Feb 07 jari 278   }
2 26 Feb 07 jari 279
2 26 Feb 07 jari 280   /****************************************************************************
2 26 Feb 07 jari 281    * <b>Description: </b>
2 26 Feb 07 jari 282    *    find the wave lengths from the header information
2 26 Feb 07 jari 283    * <p><b>Parameters: </b>
2 26 Feb 07 jari 284    * <br> str -- a line of the file that contains wave lengths.
2 26 Feb 07 jari 285    * <P><b>Return: </b> the wave lengths as an array.
2 26 Feb 07 jari 286    ****************************************************************************/
2 26 Feb 07 jari 287   private String[] getWaveLengths(String str){
2 26 Feb 07 jari 288     int num;
2 26 Feb 07 jari 289     String wv;
2 26 Feb 07 jari 290     String tempWave[] = new String[2];
2 26 Feb 07 jari 291     String wavStr = new String(str.substring(str.indexOf('=')+1, str.lastIndexOf('\"')));
2 26 Feb 07 jari 292     StringTokenizer token = new StringTokenizer(wavStr);
2 26 Feb 07 jari 293
2 26 Feb 07 jari 294     num = 0;
2 26 Feb 07 jari 295     while(token.hasMoreTokens()){
2 26 Feb 07 jari 296       wv = token.nextToken();
2 26 Feb 07 jari 297       if(isNumber(wv)){
2 26 Feb 07 jari 298         tempWave[num] = new String(wv);
2 26 Feb 07 jari 299         num++;
2 26 Feb 07 jari 300       }
2 26 Feb 07 jari 301     }
2 26 Feb 07 jari 302     return tempWave;
2 26 Feb 07 jari 303   }
2 26 Feb 07 jari 304
2 26 Feb 07 jari 305   /****************************************************************************
2 26 Feb 07 jari 306    *<b>Description: </b>
2 26 Feb 07 jari 307    *  check if a parameter is a character.
2 26 Feb 07 jari 308    *<p><b>Parameter: </b>
2 26 Feb 07 jari 309    *<br> x --- the input to be checked.
2 26 Feb 07 jari 310    *<p><b>Return: </b> true if the input is a character; otherwise, false.
2 26 Feb 07 jari 311    ****************************************************************************/
2 26 Feb 07 jari 312   private boolean isChar(char x){
2 26 Feb 07 jari 313     boolean b = true;
2 26 Feb 07 jari 314
2 26 Feb 07 jari 315     switch(x) {
2 26 Feb 07 jari 316       case '1': case '2': case '3': case '4': case '5': case '6': case '7':
2 26 Feb 07 jari 317       case '8': case '9': case '0':
2 26 Feb 07 jari 318       b = false;
2 26 Feb 07 jari 319       break;
2 26 Feb 07 jari 320
2 26 Feb 07 jari 321       default: b = true;
2 26 Feb 07 jari 322     }
2 26 Feb 07 jari 323     return b;
2 26 Feb 07 jari 324   }
2 26 Feb 07 jari 325
2 26 Feb 07 jari 326   /****************************************************************************
2 26 Feb 07 jari 327    *<b>Description: </b>
2 26 Feb 07 jari 328    *  check if a input string is a number.
2 26 Feb 07 jari 329    *<p><b>Parameter: </b>
2 26 Feb 07 jari 330    *<br> x --- the input to be checked.
2 26 Feb 07 jari 331    *<p><b>Return: </b> true if the input is a character; otherwise, false.
2 26 Feb 07 jari 332    ****************************************************************************/
2 26 Feb 07 jari 333   private boolean isNumber(String x){
2 26 Feb 07 jari 334     boolean b = true;
2 26 Feb 07 jari 335     int length = x.length();
2 26 Feb 07 jari 336
2 26 Feb 07 jari 337     for(int i=0; i<length; i++){
2 26 Feb 07 jari 338       if(isChar(x.charAt(i))){
2 26 Feb 07 jari 339         b = false;
2 26 Feb 07 jari 340         i = length;
2 26 Feb 07 jari 341       }
2 26 Feb 07 jari 342     }
2 26 Feb 07 jari 343     return b;
2 26 Feb 07 jari 344   }
2 26 Feb 07 jari 345
2 26 Feb 07 jari 346   /****************************************************************************
2 26 Feb 07 jari 347    *<b>Description: </b>
2 26 Feb 07 jari 348    *  check if a string contains wave length information.
2 26 Feb 07 jari 349    *<p><b>Parameter: </b>
2 26 Feb 07 jari 350    *<br> str --- the input to be checked.
2 26 Feb 07 jari 351    *<p><b>Return: </b> true if the input contains the info; otherwise, false.
2 26 Feb 07 jari 352    ****************************************************************************/
2 26 Feb 07 jari 353   private boolean isWaveLengthDefination(String str){
2 26 Feb 07 jari 354     String temp = str;
2 26 Feb 07 jari 355     if(temp.charAt(0) == '\"' && temp.indexOf('=') > 0){
2 26 Feb 07 jari 356       temp = temp.substring(1, temp.indexOf('='));
2 26 Feb 07 jari 357       if(temp.equalsIgnoreCase(WAVE_KEY_1) || temp.equalsIgnoreCase(WAVE_KEY_2)){
2 26 Feb 07 jari 358         return true;
2 26 Feb 07 jari 359       } else {
2 26 Feb 07 jari 360         return false;
2 26 Feb 07 jari 361       }
2 26 Feb 07 jari 362     } else {
2 26 Feb 07 jari 363       return false;
2 26 Feb 07 jari 364     }
2 26 Feb 07 jari 365   }
2 26 Feb 07 jari 366
2 26 Feb 07 jari 367   /***************************************************************************
2 26 Feb 07 jari 368    * <b>Description: </b>
2 26 Feb 07 jari 369    *    reads the genepix file into a vector; each line in the file is an element
2 26 Feb 07 jari 370    *    in the vector.
2 26 Feb 07 jari 371    * <p>Return: </b> the contents of genepix file.
2 26 Feb 07 jari 372    ***************************************************************************/
2 26 Feb 07 jari 373   private Vector readGenePixFile(){
2 26 Feb 07 jari 374     FileInputStream fileInput;
2 26 Feb 07 jari 375     BufferedReader buf = null;
2 26 Feb 07 jari 376     Vector temp = new Vector(2000, 500);
2 26 Feb 07 jari 377     String aLine = new String("");
2 26 Feb 07 jari 378
2 26 Feb 07 jari 379     try{
2 26 Feb 07 jari 380       fileInput = new FileInputStream(gprFile);
2 26 Feb 07 jari 381       buf = new BufferedReader(new InputStreamReader (fileInput));
2 26 Feb 07 jari 382     } catch (IOException ex){
2 26 Feb 07 jari 383       hasError = true;
2 26 Feb 07 jari 384       errorMsg = "Failed to open " + gprFile.getName() + ": " + ex.getMessage();
2 26 Feb 07 jari 385       return temp;
2 26 Feb 07 jari 386     }
2 26 Feb 07 jari 387
2 26 Feb 07 jari 388     while(true) {
2 26 Feb 07 jari 389       try {
2 26 Feb 07 jari 390         aLine = buf.readLine();
2 26 Feb 07 jari 391         if(aLine == null) break;
2 26 Feb 07 jari 392         temp.add(aLine);
2 26 Feb 07 jari 393       } catch (IOException e) {
2 26 Feb 07 jari 394         hasError = true;
2 26 Feb 07 jari 395         errorMsg = "Failed to read " + gprFile.getName() + ": " + e.getMessage();
2 26 Feb 07 jari 396         temp.removeAllElements();
2 26 Feb 07 jari 397         return temp;
2 26 Feb 07 jari 398       }
2 26 Feb 07 jari 399     }
2 26 Feb 07 jari 400     return temp;
2 26 Feb 07 jari 401   }
2 26 Feb 07 jari 402
2 26 Feb 07 jari 403   /**************************************************************************
2 26 Feb 07 jari 404    * <b>Description: </b>
2 26 Feb 07 jari 405    *   remove the all end spaces from a string, if it contains.
2 26 Feb 07 jari 406    * <p><b>Parameter: </b>
2 26 Feb 07 jari 407    * <br>  str -- the string that has multiple spaces at the end.
2 26 Feb 07 jari 408    * <p><b>Return: </b>  a string without space at the end.
2 26 Feb 07 jari 409    ***************************************************************************/
2 26 Feb 07 jari 410   private String removeAllEndSpaces(String str){
2 26 Feb 07 jari 411     String temp = new String(str);
2 26 Feb 07 jari 412
2 26 Feb 07 jari 413     if(temp.length() > 0){
2 26 Feb 07 jari 414       while(temp.charAt(temp.length()-1) == ' '){
2 26 Feb 07 jari 415         temp = temp.substring(0, temp.length()-1);
2 26 Feb 07 jari 416         if(temp.length() <= 0) break;
2 26 Feb 07 jari 417       }
2 26 Feb 07 jari 418     }
2 26 Feb 07 jari 419     return temp;
2 26 Feb 07 jari 420   }
2 26 Feb 07 jari 421
2 26 Feb 07 jari 422   /**************************************************************************
2 26 Feb 07 jari 423    * <b>Description: </b>
2 26 Feb 07 jari 424    *   remove the all head spaces from a string, if it contains.
2 26 Feb 07 jari 425    * <p><b>Parameter: </b>
2 26 Feb 07 jari 426    * <br>  str -- the string that has multiple spaces at the end.
2 26 Feb 07 jari 427    * <p><b>Return: </b>  a string without space at the end.
2 26 Feb 07 jari 428    ***************************************************************************/
2 26 Feb 07 jari 429   private String removeAllHeadSpaces(String str){
2 26 Feb 07 jari 430     int length, i;
2 26 Feb 07 jari 431     boolean spc = false;
2 26 Feb 07 jari 432     String temp = new String(str);
2 26 Feb 07 jari 433
2 26 Feb 07 jari 434     length = temp.length();
2 26 Feb 07 jari 435
2 26 Feb 07 jari 436     if(length > 0){
2 26 Feb 07 jari 437       while(temp.charAt(0) == ' ') {
2 26 Feb 07 jari 438         temp = temp.substring(1);
2 26 Feb 07 jari 439         if(temp.length() <= 0) break;
2 26 Feb 07 jari 440       }
2 26 Feb 07 jari 441     }
2 26 Feb 07 jari 442     return temp;
2 26 Feb 07 jari 443   }
2 26 Feb 07 jari 444
2 26 Feb 07 jari 445   /****************************************************************************
2 26 Feb 07 jari 446    *<b>Description: </b>
2 26 Feb 07 jari 447    *   splits a string and set the elemet to an array.
2 26 Feb 07 jari 448    *<p><b>Parameter: </b>
2 26 Feb 07 jari 449    *<br> str --- the input to be splited.
2 26 Feb 07 jari 450    *<br> num --- the number of columns.
2 26 Feb 07 jari 451    *<p><b>Return: </b> the name.
2 26 Feb 07 jari 452    ****************************************************************************/
2 26 Feb 07 jari 453   private String[] separateLine(String str){
2 26 Feb 07 jari 454     String name[];
2 26 Feb 07 jari 455     String tempStr = new String("");
2 26 Feb 07 jari 456     StringSplitter spliter = new StringSplitter('\t');
2 26 Feb 07 jari 457     spliter.init(str);
2 26 Feb 07 jari 458
2 26 Feb 07 jari 459     int num = spliter.countTokens()+1;
2 26 Feb 07 jari 460     int length = 0;
2 26 Feb 07 jari 461
2 26 Feb 07 jari 462     name = new String[num];
2 26 Feb 07 jari 463     if(num > 1){
2 26 Feb 07 jari 464         while(spliter.hasMoreTokens()){
2 26 Feb 07 jari 465         tempStr = spliter.nextToken();
2 26 Feb 07 jari 466         tempStr = removeAllEndSpaces(tempStr);
2 26 Feb 07 jari 467         tempStr = removeAllHeadSpaces(tempStr);
2 26 Feb 07 jari 468         name[length++] = tempStr;
2 26 Feb 07 jari 469       }
2 26 Feb 07 jari 470     }
2 26 Feb 07 jari 471     return name;
2 26 Feb 07 jari 472   }
2 26 Feb 07 jari 473
2 26 Feb 07 jari 474
2 26 Feb 07 jari 475   /****************************************************************************
2 26 Feb 07 jari 476    * <b>Description: </b>
2 26 Feb 07 jari 477    *   starts the process to convert the file and ensure output to be ready.
2 26 Feb 07 jari 478    **************************************************************************/
2 26 Feb 07 jari 479   private void startLoad(){
2 26 Feb 07 jari 480     boolean going, noError;
2 26 Feb 07 jari 481     String aLine = new String("");
2 26 Feb 07 jari 482     String densA = new String("");
2 26 Feb 07 jari 483     String densB = new String("");
2 26 Feb 07 jari 484     String name = new String("");
2 26 Feb 07 jari 485     String id = new String("");
2 26 Feb 07 jari 486     String tavFileName;
2 26 Feb 07 jari 487     String colValues[];
2 26 Feb 07 jari 488     String colNames[];
2 26 Feb 07 jari 489     String waves[] = new String[2]; // first for channel A and second for B.
2 26 Feb 07 jari 490     int hLines;
2 26 Feb 07 jari 491     int max = 0;
2 26 Feb 07 jari 492     int maxRow = 0;
2 26 Feb 07 jari 493     int maxCol = 0;
2 26 Feb 07 jari 494     int maxMetaCol, block, row, col, metaRow, metaCol, slideRow, slideCol;
2 26 Feb 07 jari 495     int i;
2 26 Feb 07 jari 496     int flagInt, blockIndex, colIndex, rowIndex, nameIndex, idIndex,flagIndex,flag;
2 26 Feb 07 jari 497     int f635m, b635m, f635s, f532m, f532s, b532m;
2 26 Feb 07 jari 498     int fSize;
2 26 Feb 07 jari 499     Vector gprFileContents;
2 26 Feb 07 jari 500     Vector tavLine;
2 26 Feb 07 jari 501
2 26 Feb 07 jari 502     gprFileContents = readGenePixFile();
2 26 Feb 07 jari 503     taskEnd = gprFileContents.size();
2 26 Feb 07 jari 504     if(taskEnd <= 0){
2 26 Feb 07 jari 505       return;
2 26 Feb 07 jari 506     }
2 26 Feb 07 jari 507
2 26 Feb 07 jari 508     counter = 0;
2 26 Feb 07 jari 509     noError = true;
2 26 Feb 07 jari 510     fSize = gprFileContents.size();
2 26 Feb 07 jari 511
2 26 Feb 07 jari 512       // determing the number of lines for header info
2 26 Feb 07 jari 513     hLines = 0;
2 26 Feb 07 jari 514     going = true;
2 26 Feb 07 jari 515     while(going){
2 26 Feb 07 jari 516       aLine = (String)gprFileContents.elementAt(hLines);
2 26 Feb 07 jari 517       if(aLine.charAt(0) == '"' || isChar(aLine.charAt(0))){
2 26 Feb 07 jari 518         // scanner could use different wavelength for the two chennels
2 26 Feb 07 jari 519         if(isWaveLengthDefination(aLine)){
2 26 Feb 07 jari 520           waves = getWaveLengths(aLine);
2 26 Feb 07 jari 521         }
2 26 Feb 07 jari 522         going = true;
2 26 Feb 07 jari 523         hLines++;
2 26 Feb 07 jari 524       } else {
2 26 Feb 07 jari 525         if(hLines == FIRST_NUM){
2 26 Feb 07 jari 526           going = true;
2 26 Feb 07 jari 527           hLines++;
2 26 Feb 07 jari 528         } else{
2 26 Feb 07 jari 529           going = false;
2 26 Feb 07 jari 530         }
2 26 Feb 07 jari 531       }
2 26 Feb 07 jari 532     }
2 26 Feb 07 jari 533
2 26 Feb 07 jari 534     defineKeys(waves);
2 26 Feb 07 jari 535     aLine = (String)gprFileContents.elementAt(hLines-1);
2 26 Feb 07 jari 536     colNames = separateLine(aLine);
2 26 Feb 07 jari 537
2 26 Feb 07 jari 538     blockIndex = findRightCol(colNames, BLOCK, BLOCK_N);
2 26 Feb 07 jari 539     colIndex = findRightCol(colNames, COLUMN, COLUMN_N);
2 26 Feb 07 jari 540     rowIndex = findRightCol(colNames, RW, ROW_N);
2 26 Feb 07 jari 541     nameIndex = findRightCol(colNames, NAME, NAME_N);
2 26 Feb 07 jari 542     idIndex = findRightCol(colNames, ID, ID_N);
2 26 Feb 07 jari 543     //wwang
2 26 Feb 07 jari 544     flagIndex=findRightCol(colNames,FLAGS , FLAGS_N);
2 26 Feb 07 jari 545     //System.out.print(flagIndex);
2 26 Feb 07 jari 546
2 26 Feb 07 jari 547     aLine = (String)gprFileContents.elementAt(fSize-1);
2 26 Feb 07 jari 548     colValues = separateLine(aLine);
2 26 Feb 07 jari 549
2 26 Feb 07 jari 550     if(colValues.length > 2){
2 26 Feb 07 jari 551       max = Integer.parseInt(colValues[blockIndex]);
2 26 Feb 07 jari 552       maxCol = Integer.parseInt(colValues[colIndex]);
2 26 Feb 07 jari 553       maxRow = Integer.parseInt(colValues[rowIndex]);
2 26 Feb 07 jari 554     } else {
2 26 Feb 07 jari 555       JOptionPane.showMessageDialog(null,
2 26 Feb 07 jari 556         "You might add extra space at the end of file.\n(" + gprFile.getName() +
2 26 Feb 07 jari 557         "). \nPlease remove it and reload again.", "GenePix File Loader",
2 26 Feb 07 jari 558       JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 559       noError = false;
2 26 Feb 07 jari 560     }
2 26 Feb 07 jari 561
2 26 Feb 07 jari 562     if(noError){
2 26 Feb 07 jari 563       if(max <= 12){
2 26 Feb 07 jari 564         maxMetaCol = 2;
2 26 Feb 07 jari 565       } else {
2 26 Feb 07 jari 566         maxMetaCol = 4;
2 26 Feb 07 jari 567       }
2 26 Feb 07 jari 568          // check if the original file has been modified.
2 26 Feb 07 jari 569       noError = true;
2 26 Feb 07 jari 570       /*
2 26 Feb 07 jari 571       if((max * maxCol * maxRow) + hLines != gprFileContents.size()){
2 26 Feb 07 jari 572         JOptionPane.showMessageDialog(null,
2 26 Feb 07 jari 573           "You might have dropped some of your spots in the file \n(" +
2 26 Feb 07 jari 574           gprFile.getName() + ".\nThe GenePix Loader requires an original gpr file.",
2 26 Feb 07 jari 575           "GenePix File Loader", JOptionPane.ERROR_MESSAGE);
2 26 Feb 07 jari 576         noError = false;
2 26 Feb 07 jari 577       }
2 26 Feb 07 jari 578        */
2 26 Feb 07 jari 579       if(noError){
2 26 Feb 07 jari 580         fPixAddr = findRightCol(colNames, F_PIX, F_PIX_N);
2 26 Feb 07 jari 581
2 26 Feb 07 jari 582         f635m = findRightCol(colNames, chA, chAn);
2 26 Feb 07 jari 583         f635s = findRightCol(colNames, chAs, chAsn);
2 26 Feb 07 jari 584         b635m = findRightCol(colNames, bgChA, bgChAn);
2 26 Feb 07 jari 585
2 26 Feb 07 jari 586         f532m = findRightCol(colNames, chB, chBn);
2 26 Feb 07 jari 587         f532s = findRightCol(colNames, chBs, chBsn);
2 26 Feb 07 jari 588         b532m = findRightCol(colNames, bgChB, bgChBn);
2 26 Feb 07 jari 589         //wwang
2 26 Feb 07 jari 590         flagIndex=findRightCol(colNames,FLAGS , FLAGS_N);
2 26 Feb 07 jari 591         
2 26 Feb 07 jari 592         tavFile = new Vector(fSize - hLines, (fSize - hLines)>>2);
2 26 Feb 07 jari 593         counter = hLines;
2 26 Feb 07 jari 594
2 26 Feb 07 jari 595         for(i = hLines; i<fSize; i++){
2 26 Feb 07 jari 596           aLine = (String)gprFileContents.elementAt(i);
2 26 Feb 07 jari 597           colValues = separateLine(aLine);
2 26 Feb 07 jari 598
2 26 Feb 07 jari 599           block = Integer.parseInt(colValues[blockIndex]);
2 26 Feb 07 jari 600           col = Integer.parseInt(colValues[colIndex]);
2 26 Feb 07 jari 601           row = Integer.parseInt(colValues[rowIndex]);
2 26 Feb 07 jari 602           //wwang got flag value
2 26 Feb 07 jari 603           flag = Integer.parseInt(colValues[flagIndex]);
2 26 Feb 07 jari 604           //System.out.print(flag);
2 26 Feb 07 jari 605            // channel A is always for Cy3 and B for Cy3 in .tav file
2 26 Feb 07 jari 606           densA = calculateDensity(colValues, f532m, f532s, b532m);
2 26 Feb 07 jari 607           densB = calculateDensity(colValues, f635m, f635s, b635m);
2 26 Feb 07 jari 608           metaRow = ((block -1) / maxMetaCol) + 1;
2 26 Feb 07 jari 609           metaCol = ((block -1) % maxMetaCol) + 1;
2 26 Feb 07 jari 610           slideRow = (metaRow - 1) * maxRow + row;
2 26 Feb 07 jari 611           slideCol = (metaCol -1 ) * maxCol + col;
2 26 Feb 07 jari 612           name = colValues[nameIndex];
2 26 Feb 07 jari 613           id = colValues[idIndex];
2 26 Feb 07 jari 614           //wwang add loading flag
2 26 Feb 07 jari 615           tavLine = new Vector(9);
2 26 Feb 07 jari 616           tavLine.add(new Integer(densA));
2 26 Feb 07 jari 617           tavLine.add(new Integer(densB));
2 26 Feb 07 jari 618           tavLine.add(new Integer(slideRow));
2 26 Feb 07 jari 619           tavLine.add(new Integer(slideCol));
2 26 Feb 07 jari 620           tavLine.add(new Integer(metaRow));
2 26 Feb 07 jari 621           tavLine.add(new Integer(metaCol));
2 26 Feb 07 jari 622           tavLine.add(name);
2 26 Feb 07 jari 623           tavLine.add(id);
2 26 Feb 07 jari 624           tavLine.add(new Integer(flag));
2 26 Feb 07 jari 625           tavFile.add(tavLine);
2 26 Feb 07 jari 626           counter++;
2 26 Feb 07 jari 627         } // end of the for loop for a single file.
2 26 Feb 07 jari 628
2 26 Feb 07 jari 629         ready = true;
2 26 Feb 07 jari 630         counter = taskEnd;
2 26 Feb 07 jari 631       }
2 26 Feb 07 jari 632     }
2 26 Feb 07 jari 633   }
2 26 Feb 07 jari 634 }