mev-4.0.01/source/org/tigr/microarray/util/swing/SlideDataLoader.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: SlideDataLoader.java,v $
2 26 Feb 07 jari 7  * $Revision: 1.3 $
2 26 Feb 07 jari 8  * $Date: 2006/03/24 15:52:32 $
2 26 Feb 07 jari 9  * $Author: eleanorahowe $
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.swing;
2 26 Feb 07 jari 13
2 26 Feb 07 jari 14 import java.awt.BorderLayout;
2 26 Feb 07 jari 15 import java.awt.Container;
2 26 Feb 07 jari 16 import java.awt.Dimension;
2 26 Feb 07 jari 17 import java.awt.GridBagConstraints;
2 26 Feb 07 jari 18 import java.awt.GridBagLayout;
2 26 Feb 07 jari 19 import java.awt.Insets;
2 26 Feb 07 jari 20 import java.awt.Toolkit;
2 26 Feb 07 jari 21 import java.awt.event.ActionEvent;
2 26 Feb 07 jari 22 import java.awt.event.ActionListener;
2 26 Feb 07 jari 23 import java.awt.event.WindowAdapter;
2 26 Feb 07 jari 24 import java.awt.event.WindowEvent;
2 26 Feb 07 jari 25 import java.io.BufferedReader;
2 26 Feb 07 jari 26 import java.io.File;
2 26 Feb 07 jari 27 import java.io.FileReader;
2 26 Feb 07 jari 28 import java.io.IOException;
2 26 Feb 07 jari 29 import java.util.Vector;
2 26 Feb 07 jari 30
2 26 Feb 07 jari 31 import javax.swing.JButton;
2 26 Feb 07 jari 32 import javax.swing.JDialog;
2 26 Feb 07 jari 33 import javax.swing.JFrame;
2 26 Feb 07 jari 34 import javax.swing.JLabel;
2 26 Feb 07 jari 35 import javax.swing.JOptionPane;
2 26 Feb 07 jari 36 import javax.swing.JPanel;
2 26 Feb 07 jari 37 import javax.swing.JProgressBar;
2 26 Feb 07 jari 38 import javax.swing.border.BevelBorder;
2 26 Feb 07 jari 39
2 26 Feb 07 jari 40 import org.tigr.microarray.mev.FloatSlideData;
2 26 Feb 07 jari 41 import org.tigr.microarray.mev.ISlideData;
2 26 Feb 07 jari 42 import org.tigr.microarray.mev.ISlideDataElement;
2 26 Feb 07 jari 43 import org.tigr.microarray.mev.ISlideMetaData;
2 26 Feb 07 jari 44 import org.tigr.microarray.mev.SlideData;
2 26 Feb 07 jari 45 import org.tigr.microarray.mev.SlideDataElement;
2 26 Feb 07 jari 46 import org.tigr.microarray.mev.TMEV;
2 26 Feb 07 jari 47 import org.tigr.util.StringSplitter;
2 26 Feb 07 jari 48
2 26 Feb 07 jari 49 public class SlideDataLoader extends JDialog {
2 26 Feb 07 jari 50     
2 26 Feb 07 jari 51     private static final int BUFFER_SIZE = 1024*128;
2 26 Feb 07 jari 52     private int result = JOptionPane.CANCEL_OPTION;
2 26 Feb 07 jari 53     private ISlideData[] data;
2 26 Feb 07 jari 54     private ISlideMetaData meta;
2 26 Feb 07 jari 55     private File[] files;
2 26 Feb 07 jari 56     private boolean stop = false;
2 26 Feb 07 jari 57     private Exception exception;
2 26 Feb 07 jari 58     private LoadingPanel loadingPanel = new LoadingPanel();
2 26 Feb 07 jari 59     private boolean fillMissingSpots = false;
2 26 Feb 07 jari 60     
2 26 Feb 07 jari 61     /**
2 26 Feb 07 jari 62      * Creates a <code>SlideDataLoader</code> to load data from the
2 26 Feb 07 jari 63      * specified file.
2 26 Feb 07 jari 64      */
2 26 Feb 07 jari 65     public SlideDataLoader(JFrame frame, ISlideMetaData meta, File file, boolean fillMissingSpots) {
2 26 Feb 07 jari 66         this(frame, meta, new File[] {file}, fillMissingSpots);
2 26 Feb 07 jari 67     }
2 26 Feb 07 jari 68     
2 26 Feb 07 jari 69     /**
2 26 Feb 07 jari 70      * Creates a <code>SlideDataLoader</code> to load data from the
2 26 Feb 07 jari 71      * specified array of files.
2 26 Feb 07 jari 72      */
2 26 Feb 07 jari 73     public SlideDataLoader(JFrame frame, ISlideMetaData meta, File[] files, boolean fillMissingSpots) {
2 26 Feb 07 jari 74         super(frame, "Slide Data Loading", true);
2 26 Feb 07 jari 75         this.meta = meta;
2 26 Feb 07 jari 76         this.files = files;
2 26 Feb 07 jari 77         this.fillMissingSpots = fillMissingSpots;
2 26 Feb 07 jari 78         Listener listener = new Listener();
2 26 Feb 07 jari 79         
2 26 Feb 07 jari 80         loadingPanel.setFilesCount(files.length);
2 26 Feb 07 jari 81         JPanel btnsPanel = createBtnsPanel(listener);
2 26 Feb 07 jari 82         
2 26 Feb 07 jari 83         Container content = getContentPane();
2 26 Feb 07 jari 84         content.setLayout(new GridBagLayout());
2 26 Feb 07 jari 85         content.add(loadingPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0
2 26 Feb 07 jari 86         ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
2 26 Feb 07 jari 87         content.add(btnsPanel, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0
2 26 Feb 07 jari 88         ,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(4, 8, 4, 8), 0, 0));
2 26 Feb 07 jari 89         
2 26 Feb 07 jari 90         addWindowListener(listener);
2 26 Feb 07 jari 91         pack();
2 26 Feb 07 jari 92     }
2 26 Feb 07 jari 93     
2 26 Feb 07 jari 94     /**
2 26 Feb 07 jari 95      * Shows the dialog.
2 26 Feb 07 jari 96      */
2 26 Feb 07 jari 97     public int showModal() throws Exception {
2 26 Feb 07 jari 98         return showModal(false);
2 26 Feb 07 jari 99     }
2 26 Feb 07 jari 100     
2 26 Feb 07 jari 101     /**
2 26 Feb 07 jari 102      * Shows the dialog to load files with specified type of format.
2 26 Feb 07 jari 103      */
2 26 Feb 07 jari 104     public int showModal(boolean stanford) throws Exception {
2 26 Feb 07 jari 105         Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
2 26 Feb 07 jari 106         setLocation((screenSize.width - getSize().width)/2, (screenSize.height - getSize().height)/2);
2 26 Feb 07 jari 107         Thread thread = new Thread(new Loader(stanford));
2 26 Feb 07 jari 108         thread.setPriority(Thread.MIN_PRIORITY);
2 26 Feb 07 jari 109         thread.start();
2 26 Feb 07 jari 110         show();
2 26 Feb 07 jari 111         // check the thread result
2 26 Feb 07 jari 112         if (isException()) {
2 26 Feb 07 jari 113             throw getException();
2 26 Feb 07 jari 114         }
2 26 Feb 07 jari 115         return result;
2 26 Feb 07 jari 116     }
2 26 Feb 07 jari 117     
2 26 Feb 07 jari 118     /**
2 26 Feb 07 jari 119      * Returns an array of loaded microarrays.
2 26 Feb 07 jari 120      */
2 26 Feb 07 jari 121     public ISlideData[] getData() {
2 26 Feb 07 jari 122         return data;
2 26 Feb 07 jari 123     }
2 26 Feb 07 jari 124     
2 26 Feb 07 jari 125     /**
2 26 Feb 07 jari 126      * Returns data loaded from specified microarray.
2 26 Feb 07 jari 127      */
2 26 Feb 07 jari 128     public ISlideData getData(int index) {
2 26 Feb 07 jari 129         if (data == null || index >= data.length || index < 0) {
2 26 Feb 07 jari 130             return null;
2 26 Feb 07 jari 131         }
2 26 Feb 07 jari 132         return data[index];
2 26 Feb 07 jari 133     }
2 26 Feb 07 jari 134     
2 26 Feb 07 jari 135     /**
2 26 Feb 07 jari 136      * @return true if it was an exception while data loaded.
2 26 Feb 07 jari 137      */
2 26 Feb 07 jari 138     private boolean isException() {
2 26 Feb 07 jari 139         return exception != null;
2 26 Feb 07 jari 140     }
2 26 Feb 07 jari 141     
2 26 Feb 07 jari 142     /**
2 26 Feb 07 jari 143      * Returns a wrapped exception.
2 26 Feb 07 jari 144      */
2 26 Feb 07 jari 145     private Exception getException() {
2 26 Feb 07 jari 146         return exception;
2 26 Feb 07 jari 147     }
2 26 Feb 07 jari 148     
2 26 Feb 07 jari 149     /**
2 26 Feb 07 jari 150      * Sets a wrapped exception.
2 26 Feb 07 jari 151      */
2 26 Feb 07 jari 152     private void setException(Exception e) {
2 26 Feb 07 jari 153         exception = e;
2 26 Feb 07 jari 154     }
2 26 Feb 07 jari 155     
2 26 Feb 07 jari 156     /**
2 26 Feb 07 jari 157      * Loads microarrays data.
2 26 Feb 07 jari 158      */
2 26 Feb 07 jari 159     private ISlideData[] loadData() throws IOException {
2 26 Feb 07 jari 160         if (files.length < 1) {
2 26 Feb 07 jari 161             return null;
2 26 Feb 07 jari 162         }
2 26 Feb 07 jari 163         ISlideData[] slideData = new ISlideData[files.length];
2 26 Feb 07 jari 164         int countOfLines = 0;
2 26 Feb 07 jari 165         for (int i = 0; i < files.length; i++) {
2 26 Feb 07 jari 166             if (stop) {
2 26 Feb 07 jari 167                 return null;
2 26 Feb 07 jari 168             }
2 26 Feb 07 jari 169             loadingPanel.setFilesProgress(i);
2 26 Feb 07 jari 170             loadingPanel.setRemain(files.length-i);
2 26 Feb 07 jari 171             loadingPanel.setFileName(files[i].getPath());
2 26 Feb 07 jari 172             if (i == 0) {
2 26 Feb 07 jari 173                 countOfLines = getCountOfLines(files[i]);
2 26 Feb 07 jari 174                 loadingPanel.setLinesCount(countOfLines);
2 26 Feb 07 jari 175                 if (meta == null) {
2 26 Feb 07 jari 176                     if(fillMissingSpots)
2 26 Feb 07 jari 177                         slideData[i] = loadSlideDataFillAllSpots(files[i]);
2 26 Feb 07 jari 178                     else
2 26 Feb 07 jari 179                         slideData[i] = loadSlideData(files[i]);
2 26 Feb 07 jari 180                     meta = slideData[i].getSlideMetaData();
2 26 Feb 07 jari 181                 } else {
2 26 Feb 07 jari 182                     slideData[i] = loadFloatSlideData(files[i], countOfLines, meta);
2 26 Feb 07 jari 183                 }
2 26 Feb 07 jari 184             } else {
2 26 Feb 07 jari 185                 slideData[i] = loadFloatSlideData(files[i], countOfLines, meta);
2 26 Feb 07 jari 186             }
2 26 Feb 07 jari 187         }
2 26 Feb 07 jari 188         return slideData;
2 26 Feb 07 jari 189     }
2 26 Feb 07 jari 190     
2 26 Feb 07 jari 191     /**
2 26 Feb 07 jari 192      * Loads a microarray float values from the specified file.
2 26 Feb 07 jari 193      */
2 26 Feb 07 jari 194     private ISlideData loadFloatSlideData(final File file, final int countOfLines, ISlideMetaData slideMetaData) throws IOException {
2 26 Feb 07 jari 195         final int coordinatePairCount = TMEV.getCoordinatePairCount()*2;
2 26 Feb 07 jari 196         final int intensityCount = TMEV.getIntensityCount();
2 26 Feb 07 jari 197         final int preSpotRows = TMEV.getHeaderRowCount();
2 26 Feb 07 jari 198         
2 26 Feb 07 jari 199         //FL
2 26 Feb 07 jari 200         //Adjusts index values to make it consistent
2 26 Feb 07 jari 201         if (TMEV.indicesAdjusted() == false) {
2 26 Feb 07 jari 202             TMEV.setUniqueIDIndex(TMEV.getUniqueIDIndex() - 9);
2 26 Feb 07 jari 203             TMEV.setNameIndex(TMEV.getNameIndex() - 9);
2 26 Feb 07 jari 204             TMEV.setIndicesAdjusted(true);
2 26 Feb 07 jari 205         }
2 26 Feb 07 jari 206         
2 26 Feb 07 jari 207         FloatSlideData slideData = new FloatSlideData(slideMetaData);
2 26 Feb 07 jari 208         
2 26 Feb 07 jari 209         BufferedReader reader = new BufferedReader(new FileReader(file), BUFFER_SIZE);
2 26 Feb 07 jari 210         
2 26 Feb 07 jari 211         String currentLine;
2 26 Feb 07 jari 212         StringSplitter ss = new StringSplitter((char)0x09);
2 26 Feb 07 jari 213         float[] intensities = new float[intensityCount];
2 26 Feb 07 jari 214         int header_row = 0;
2 26 Feb 07 jari 215         int index  = 0;
2 26 Feb 07 jari 216         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 217             if (header_row < preSpotRows) {
2 26 Feb 07 jari 218                 header_row++;
2 26 Feb 07 jari 219                 continue;
2 26 Feb 07 jari 220             }
2 26 Feb 07 jari 221             loadingPanel.setFileProgress(index);
2 26 Feb 07 jari 222             ss.init(currentLine);
2 26 Feb 07 jari 223             ss.passTokens(coordinatePairCount);
2 26 Feb 07 jari 224             for (int j = 0; j < intensityCount; j++) {
2 26 Feb 07 jari 225                 intensities[j] = ss.nextFloatToken(0.0f);
2 26 Feb 07 jari 226             }
2 26 Feb 07 jari 227             slideData.setIntensities(index, intensities[0], intensities[1]);
2 26 Feb 07 jari 228             index++;
2 26 Feb 07 jari 229         }
2 26 Feb 07 jari 230         reader.close();
2 26 Feb 07 jari 231         slideData.setSlideDataName(file.getName());
2 26 Feb 07 jari 232         slideData.setSlideFileName(file.getPath());
2 26 Feb 07 jari 233         return slideData;
2 26 Feb 07 jari 234     }
2 26 Feb 07 jari 235     
2 26 Feb 07 jari 236     /**
2 26 Feb 07 jari 237      * Loads full a microarray data from a specified file.
2 26 Feb 07 jari 238      * Fills all missing spots with default missing color.
2 26 Feb 07 jari 239      */
2 26 Feb 07 jari 240     private ISlideData loadSlideDataFillAllSpots(final File file) throws IOException {
2 26 Feb 07 jari 241         
2 26 Feb 07 jari 242         ISlideDataElement slideDataElement;
2 26 Feb 07 jari 243         String currentLine;
2 26 Feb 07 jari 244         
2 26 Feb 07 jari 245         //FL
2 26 Feb 07 jari 246         //Adjusts index values to make it consistent
2 26 Feb 07 jari 247         if (TMEV.indicesAdjusted() == false) {
2 26 Feb 07 jari 248             TMEV.setUniqueIDIndex(TMEV.getUniqueIDIndex() - 9);
2 26 Feb 07 jari 249             TMEV.setNameIndex(TMEV.getNameIndex() - 9);
2 26 Feb 07 jari 250             TMEV.setIndicesAdjusted(true);
2 26 Feb 07 jari 251         }
2 26 Feb 07 jari 252         
2 26 Feb 07 jari 253         int maxRows = 0, maxColumns = 0;
2 26 Feb 07 jari 254         String avoidNullString;
2 26 Feb 07 jari 255         int p, q;
2 26 Feb 07 jari 256         int coordinatePairCount = TMEV.getCoordinatePairCount();
2 26 Feb 07 jari 257         int intensityCount = TMEV.getIntensityCount();
2 26 Feb 07 jari 258         final int preSpotRows = TMEV.getHeaderRowCount();
2 26 Feb 07 jari 259         
2 26 Feb 07 jari 260         int[] rows = new int[coordinatePairCount];
2 26 Feb 07 jari 261         int[] columns = new int[coordinatePairCount];
2 26 Feb 07 jari 262         
2 26 Feb 07 jari 263         float[] intensities = new float[intensityCount];
2 26 Feb 07 jari 264         Vector moreFields = new Vector();
2 26 Feb 07 jari 265         BufferedReader reader = new BufferedReader(new FileReader(file), BUFFER_SIZE);
2 26 Feb 07 jari 266         StringSplitter ss = new StringSplitter((char)0x09);
2 26 Feb 07 jari 267         int currentRow, currentColumn;
2 26 Feb 07 jari 268         int header_row = 0;
2 26 Feb 07 jari 269         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 270             if (header_row < preSpotRows) {
2 26 Feb 07 jari 271                 header_row++;
2 26 Feb 07 jari 272                 continue;
2 26 Feb 07 jari 273             }
2 26 Feb 07 jari 274             ss.init(currentLine);
2 26 Feb 07 jari 275             currentRow = ss.nextIntToken();
2 26 Feb 07 jari 276             currentColumn = ss.nextIntToken();
2 26 Feb 07 jari 277             if (currentRow > maxRows) maxRows = currentRow;
2 26 Feb 07 jari 278             if (currentColumn > maxColumns) maxColumns = currentColumn;
2 26 Feb 07 jari 279         }
2 26 Feb 07 jari 280         SlideData slideData = new SlideData(maxRows, maxColumns);
2 26 Feb 07 jari 281         reader.close();
2 26 Feb 07 jari 282         reader = new BufferedReader(new FileReader(file));
2 26 Feb 07 jari 283         header_row = 0;
2 26 Feb 07 jari 284         int curpos = 0;
2 26 Feb 07 jari 285         
2 26 Feb 07 jari 286         boolean [][] realData = new boolean[maxRows][maxColumns];
2 26 Feb 07 jari 287         
2 26 Feb 07 jari 288         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 289             
2 26 Feb 07 jari 290             if (header_row < preSpotRows) {
2 26 Feb 07 jari 291                 header_row++;
2 26 Feb 07 jari 292                 continue;
2 26 Feb 07 jari 293             }
2 26 Feb 07 jari 294             loadingPanel.setFileProgress(curpos++);
2 26 Feb 07 jari 295             ss.init(currentLine);
2 26 Feb 07 jari 296             for (int j = 0; j < coordinatePairCount; j++) {
2 26 Feb 07 jari 297                 rows[j] = ss.nextIntToken();
2 26 Feb 07 jari 298                 columns[j] = ss.nextIntToken();
2 26 Feb 07 jari 299             }
2 26 Feb 07 jari 300             for (int j = 0; j < intensityCount; j++) {
2 26 Feb 07 jari 301                 intensities[j] = ss.nextFloatToken(0.0f);
2 26 Feb 07 jari 302             }
2 26 Feb 07 jari 303             while(ss.hasMoreTokens()) {
2 26 Feb 07 jari 304                     avoidNullString = ss.nextToken();
2 26 Feb 07 jari 305                 if (avoidNullString.equals("null")) moreFields.add("");
2 26 Feb 07 jari 306                 else moreFields.add(avoidNullString);
2 26 Feb 07 jari 307                 }
2 26 Feb 07 jari 308             String[] allFields = new String[moreFields.size()];
2 26 Feb 07 jari 309             for(int i=0;i<allFields.length;i++) {
2 26 Feb 07 jari 310               allFields[i] = (String)moreFields.get(i);
2 26 Feb 07 jari 311             }
2 26 Feb 07 jari 312             realData[rows[0]-1][columns[0]-1] = true;
2 26 Feb 07 jari 313             slideDataElement = new SlideDataElement(rows, columns, intensities, allFields);
2 26 Feb 07 jari 314             slideData.addSlideDataElement(slideDataElement);
2 26 Feb 07 jari 315         }
2 26 Feb 07 jari 316         reader.close();
2 26 Feb 07 jari 317         intensities[0] = 0.0f;
2 26 Feb 07 jari 318         intensities[1] = 0.0f;
2 26 Feb 07 jari 319         
2 26 Feb 07 jari 320 //        String [] dummyString = new String[allFields.length];
2 26 Feb 07 jari 321 //        for(int i = 0; i < dummyString.length; i++)
2 26 Feb 07 jari 322 //            dummyString[i] = "";
2 26 Feb 07 jari 323         
2 26 Feb 07 jari 324         for(int i = 0; i < maxRows ; i++){
2 26 Feb 07 jari 325             for(int j = 0; j < maxColumns; j++){
2 26 Feb 07 jari 326                 if(!realData[i][j]){
2 26 Feb 07 jari 327                     slideDataElement = new SlideDataElement(new int[]{i+1, 1, 1}, new int[]{j+1, 1,1}, intensities, new String[0]);
2 26 Feb 07 jari 328                     slideData.insertElementAt(slideDataElement, i*maxColumns+j);
2 26 Feb 07 jari 329                 }
2 26 Feb 07 jari 330             }
2 26 Feb 07 jari 331         }
2 26 Feb 07 jari 332         slideData.setSlideDataName(file.getName());
2 26 Feb 07 jari 333         slideData.setSlideFileName(file.getPath());
2 26 Feb 07 jari 334         return slideData;
2 26 Feb 07 jari 335     }
2 26 Feb 07 jari 336     
2 26 Feb 07 jari 337     public static ISlideData fillBlankSpots(ISlideData slideData) {
2 26 Feb 07 jari 338         
2 26 Feb 07 jari 339         //calculate maxRows and maxColumns
2 26 Feb 07 jari 340         int maxRow = 0, maxCol = 0;
2 26 Feb 07 jari 341         int rowVal, colVal;
2 26 Feb 07 jari 342         ISlideDataElement element;
2 26 Feb 07 jari 343         
2 26 Feb 07 jari 344         for(int i = 0; i < slideData.getSize(); i++){
2 26 Feb 07 jari 345             element = slideData.getSlideDataElement(i);
2 26 Feb 07 jari 346             rowVal = element.getRow(0);
2 26 Feb 07 jari 347             colVal = element.getColumn(0);
2 26 Feb 07 jari 348             maxRow = Math.max(maxRow, rowVal);
2 26 Feb 07 jari 349             maxCol = Math.max(maxCol, colVal);
2 26 Feb 07 jari 350         }
2 26 Feb 07 jari 351                 
2 26 Feb 07 jari 352         return fillBlankSpots(slideData, maxRow, maxCol);
2 26 Feb 07 jari 353     }
2 26 Feb 07 jari 354     
2 26 Feb 07 jari 355     public static ISlideData fillBlankSpots(ISlideData slideData, int maxRows, int maxColumns) {
2 26 Feb 07 jari 356 //      String [] dummyString = new String[TMEV.getFieldNames().length];
2 26 Feb 07 jari 357       String [] dummyString = new String[slideData.getSlideMetaData().getFieldNames().length];
2 26 Feb 07 jari 358         float [] intensities = new float[TMEV.getIntensityCount()];
2 26 Feb 07 jari 359         boolean [][] realData = new boolean[maxRows][maxColumns];
2 26 Feb 07 jari 360         ISlideDataElement element;
2 26 Feb 07 jari 361         
2 26 Feb 07 jari 362         if(slideData.getSize() == maxRows*maxColumns)
2 26 Feb 07 jari 363             return slideData;
2 26 Feb 07 jari 364         
2 26 Feb 07 jari 365         for(int i = 0; i < slideData.getSize(); i++){
2 26 Feb 07 jari 366             element = slideData.getSlideDataElement(i);
2 26 Feb 07 jari 367             realData[element.getRow(0)-1][element.getColumn(0)-1] = true;            
2 26 Feb 07 jari 368         }
2 26 Feb 07 jari 369         
2 26 Feb 07 jari 370         for(int i = 0; i < TMEV.getIntensityCount(); i++)
2 26 Feb 07 jari 371             intensities[i] = 0.0f;
2 26 Feb 07 jari 372         
2 26 Feb 07 jari 373         for(int i = 0; i < dummyString.length; i++)
2 26 Feb 07 jari 374             dummyString[i] = "";
2 26 Feb 07 jari 375         
2 26 Feb 07 jari 376         if(slideData instanceof SlideData){
2 26 Feb 07 jari 377             for(int i = 0; i < maxRows ; i++){
2 26 Feb 07 jari 378                 for(int j = 0; j < maxColumns; j++){
2 26 Feb 07 jari 379                     if(!realData[i][j]){
2 26 Feb 07 jari 380                         element = new SlideDataElement(new int[]{i+1, 1, 1}, new int[]{j+1, 1,1}, intensities, dummyString);
2 26 Feb 07 jari 381                         
2 26 Feb 07 jari 382                         ((SlideData)slideData).insertElementAt(element, i*maxColumns+j);
2 26 Feb 07 jari 383                     }
2 26 Feb 07 jari 384                 }
2 26 Feb 07 jari 385             }
2 26 Feb 07 jari 386         }
2 26 Feb 07 jari 387    /*     else if(slideData instanceof FloatSlideData){
2 26 Feb 07 jari 388             for(int i = 0; i < maxRows ; i++){
2 26 Feb 07 jari 389                 for(int j = 0; j < maxColumns; j++){
2 26 Feb 07 jari 390                     if(!realData[i][j]){
2 26 Feb 07 jari 391                         element = new SlideDataElement(new int[]{i+1, 1, 1}, new int[]{j+1, 1,1}, intensities, dummyString);
2 26 Feb 07 jari 392                         
2 26 Feb 07 jari 393                         ((FloatSlideData)slideData).insertElementAt(element, i*maxColumns+j);
2 26 Feb 07 jari 394                     }
2 26 Feb 07 jari 395                 }
2 26 Feb 07 jari 396             }
2 26 Feb 07 jari 397         }
2 26 Feb 07 jari 398     */
2 26 Feb 07 jari 399         return slideData;
2 26 Feb 07 jari 400     }
2 26 Feb 07 jari 401     
2 26 Feb 07 jari 402     /**
2 26 Feb 07 jari 403      * Loads full a microarray data from a specified file.
2 26 Feb 07 jari 404      * Skips missing spots.
2 26 Feb 07 jari 405      */
2 26 Feb 07 jari 406     
2 26 Feb 07 jari 407     private ISlideData loadSlideData(final File file) throws IOException {
2 26 Feb 07 jari 408         
2 26 Feb 07 jari 409         ISlideDataElement slideDataElement;
2 26 Feb 07 jari 410         String currentLine;
2 26 Feb 07 jari 411         
2 26 Feb 07 jari 412         //Adjusts index values to make it consistent
2 26 Feb 07 jari 413         if (TMEV.indicesAdjusted() == false) {
2 26 Feb 07 jari 414             TMEV.setUniqueIDIndex(TMEV.getUniqueIDIndex() - 9);
2 26 Feb 07 jari 415             TMEV.setNameIndex(TMEV.getNameIndex() - 9);
2 26 Feb 07 jari 416             TMEV.setIndicesAdjusted(true);
2 26 Feb 07 jari 417         }
2 26 Feb 07 jari 418         
2 26 Feb 07 jari 419         int maxRows = 0, maxColumns = 0;
2 26 Feb 07 jari 420         String avoidNullString;
2 26 Feb 07 jari 421         int p, q;
2 26 Feb 07 jari 422         int coordinatePairCount = TMEV.getCoordinatePairCount();
2 26 Feb 07 jari 423         int intensityCount = TMEV.getIntensityCount();
2 26 Feb 07 jari 424         final int preSpotRows = TMEV.getHeaderRowCount();
2 26 Feb 07 jari 425         
2 26 Feb 07 jari 426         int[] rows = new int[coordinatePairCount];
2 26 Feb 07 jari 427         int[] columns = new int[coordinatePairCount];
2 26 Feb 07 jari 428         float[] intensities = new float[intensityCount];
2 26 Feb 07 jari 429 //        String[] moreFields = new String[TMEV.getFieldNames().length];
2 26 Feb 07 jari 430         
2 26 Feb 07 jari 431         BufferedReader reader = new BufferedReader(new FileReader(file), BUFFER_SIZE);
2 26 Feb 07 jari 432         StringSplitter ss = new StringSplitter((char)0x09);
2 26 Feb 07 jari 433         int currentRow, currentColumn;
2 26 Feb 07 jari 434         int header_row = 0;
2 26 Feb 07 jari 435         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 436             if (header_row < preSpotRows) {
2 26 Feb 07 jari 437                 header_row++;
2 26 Feb 07 jari 438                 continue;
2 26 Feb 07 jari 439             }
2 26 Feb 07 jari 440             ss.init(currentLine);
2 26 Feb 07 jari 441             currentRow = ss.nextIntToken();
2 26 Feb 07 jari 442             currentColumn = ss.nextIntToken();
2 26 Feb 07 jari 443             if (currentRow > maxRows) maxRows = currentRow;
2 26 Feb 07 jari 444             if (currentColumn > maxColumns) maxColumns = currentColumn;
2 26 Feb 07 jari 445         }
2 26 Feb 07 jari 446         SlideData slideData = new SlideData(maxRows, maxColumns);
2 26 Feb 07 jari 447         reader.close();
2 26 Feb 07 jari 448         reader = new BufferedReader(new FileReader(file));
2 26 Feb 07 jari 449         header_row = 0;
2 26 Feb 07 jari 450         int curpos = 0;
2 26 Feb 07 jari 451         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 452             if (header_row < preSpotRows) {
2 26 Feb 07 jari 453                 header_row++;
2 26 Feb 07 jari 454                 continue;
2 26 Feb 07 jari 455             }
2 26 Feb 07 jari 456             loadingPanel.setFileProgress(curpos++);
2 26 Feb 07 jari 457             ss.init(currentLine);
2 26 Feb 07 jari 458             for (int j = 0; j < coordinatePairCount; j++) {
2 26 Feb 07 jari 459                 rows[j] = ss.nextIntToken();
2 26 Feb 07 jari 460                 columns[j] = ss.nextIntToken();
2 26 Feb 07 jari 461             }
2 26 Feb 07 jari 462             for (int j = 0; j < intensityCount; j++) {
2 26 Feb 07 jari 463                 intensities[j] = ss.nextFloatToken(0.0f);
2 26 Feb 07 jari 464             }
2 26 Feb 07 jari 465             Vector moreFields = new Vector();
2 26 Feb 07 jari 466             while (ss.hasMoreTokens()) {
2 26 Feb 07 jari 467                     avoidNullString = ss.nextToken();
2 26 Feb 07 jari 468                 if (avoidNullString.equals("null")) moreFields.add("");
2 26 Feb 07 jari 469                 else moreFields.add(avoidNullString);
2 26 Feb 07 jari 470                 }
2 26 Feb 07 jari 471             String[] allFields = new String[moreFields.size()];
2 26 Feb 07 jari 472             for (int i=0; i<moreFields.size(); i++) {
2 26 Feb 07 jari 473               allFields[i] = (String)moreFields.get(i);
2 26 Feb 07 jari 474             }
2 26 Feb 07 jari 475             slideDataElement = new SlideDataElement(rows, columns, intensities, allFields);
2 26 Feb 07 jari 476             slideData.addSlideDataElement(slideDataElement);
2 26 Feb 07 jari 477         }
2 26 Feb 07 jari 478         reader.close();
2 26 Feb 07 jari 479         slideData.setSlideDataName(file.getName());
2 26 Feb 07 jari 480         slideData.setSlideFileName(file.getPath());
2 26 Feb 07 jari 481         return slideData;
2 26 Feb 07 jari 482     }
2 26 Feb 07 jari 483     
2 26 Feb 07 jari 484     
2 26 Feb 07 jari 485     /**
2 26 Feb 07 jari 486      * Loads a microarray data from a stanford file.
2 26 Feb 07 jari 487      */
2 26 Feb 07 jari 488     public ISlideData[] loadStanford() throws Exception {
2 26 Feb 07 jari 489         if (this.files.length < 1) {
2 26 Feb 07 jari 490             return null;
2 26 Feb 07 jari 491         }
2 26 Feb 07 jari 492         
2 26 Feb 07 jari 493         //FL
2 26 Feb 07 jari 494         //Adjusts index values to make it consistent
2 26 Feb 07 jari 495         if (TMEV.indicesAdjusted() == false) {
2 26 Feb 07 jari 496             TMEV.setUniqueIDIndex(TMEV.getUniqueIDIndex() - 1);
2 26 Feb 07 jari 497             TMEV.setNameIndex(TMEV.getNameIndex() - 1);
2 26 Feb 07 jari 498             TMEV.setIndicesAdjusted(true);
2 26 Feb 07 jari 499         }
2 26 Feb 07 jari 500         
2 26 Feb 07 jari 501         final int preSpotRows = TMEV.getHeaderRowCount();
2 26 Feb 07 jari 502         final int preExperimentColumns = TMEV.getHeaderColumnCount();
2 26 Feb 07 jari 503         
2 26 Feb 07 jari 504         int spotCount = getCountOfLines(this.files[0]);
2 26 Feb 07 jari 505         if (spotCount <= 0) {
2 26 Feb 07 jari 506             throw new Exception("There are no spot data.");
2 26 Feb 07 jari 507         }
2 26 Feb 07 jari 508         loadingPanel.setFilesProgress(0);
2 26 Feb 07 jari 509         loadingPanel.setRemain(1);
2 26 Feb 07 jari 510         loadingPanel.setFileName(files[0].getPath());
2 26 Feb 07 jari 511         loadingPanel.setLinesCount(spotCount);
2 26 Feb 07 jari 512         
2 26 Feb 07 jari 513         int[] rows = new int[] {0, 1, 0};
2 26 Feb 07 jari 514         int[] columns = new int[] {0, 1, 0};
2 26 Feb 07 jari 515         float cy3, cy5;
2 26 Feb 07 jari 516         String[] moreFields = new String[preExperimentColumns];
2 26 Feb 07 jari 517         
2 26 Feb 07 jari 518         //final int rColumns = (int)Math.ceil(Math.sqrt(spotCount));
2 26 Feb 07 jari 519         //final int rRows    = (int)Math.ceil((float)spotCount/(float)rColumns);
2 26 Feb 07 jari 520         final int rColumns = 1;
2 26 Feb 07 jari 521         final int rRows    = spotCount;
2 26 Feb 07 jari 522         
2 26 Feb 07 jari 523         ISlideData[] slideDataArray = null;
2 26 Feb 07 jari 524         SlideDataElement sde;
2 26 Feb 07 jari 525         
2 26 Feb 07 jari 526         BufferedReader reader = new BufferedReader(new FileReader(this.files[0]));
2 26 Feb 07 jari 527         StringSplitter ss = new StringSplitter((char)0x09);
2 26 Feb 07 jari 528         String currentLine;
2 26 Feb 07 jari 529         int counter, row, column;
2 26 Feb 07 jari 530         counter = 0;
2 26 Feb 07 jari 531         row = column = 1;
2 26 Feb 07 jari 532         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 533             if (stop) {
2 26 Feb 07 jari 534                 return null;
2 26 Feb 07 jari 535             }
2 26 Feb 07 jari 536             ss.init(currentLine);
2 26 Feb 07 jari 537             if (counter == 0) { // parse header
2 26 Feb 07 jari 538                 int experimentCount = ss.countTokens()+1 - preExperimentColumns;
2 26 Feb 07 jari 539                 slideDataArray = new ISlideData[experimentCount];
2 26 Feb 07 jari 540                 slideDataArray[0] = new SlideData(rRows, rColumns);
2 26 Feb 07 jari 541                 for (int i=1; i<slideDataArray.length; i++) {
2 26 Feb 07 jari 542                     slideDataArray[i] = new FloatSlideData(slideDataArray[0].getSlideMetaData(), spotCount);
2 26 Feb 07 jari 543                 }
2 26 Feb 07 jari 544                 ss.passTokens(preExperimentColumns);
2 26 Feb 07 jari 545                 for (int i=0; i<experimentCount; i++) {
2 26 Feb 07 jari 546                     slideDataArray[i].setSlideDataName(ss.nextToken());
2 26 Feb 07 jari 547                 }
2 26 Feb 07 jari 548             } else if (counter >= preSpotRows) { // data rows
2 26 Feb 07 jari 549                 rows[0] = rows[2] = row;
2 26 Feb 07 jari 550                 columns[0] = columns[2] = column;
2 26 Feb 07 jari 551                 if (column == rColumns) {
2 26 Feb 07 jari 552                     column = 1;
2 26 Feb 07 jari 553                     row++;
2 26 Feb 07 jari 554                 } else {
2 26 Feb 07 jari 555                     column++;
2 26 Feb 07 jari 556                 }
2 26 Feb 07 jari 557                 for (int i=0; i<preExperimentColumns; i++) {
2 26 Feb 07 jari 558                     moreFields[i] = ss.nextToken();
2 26 Feb 07 jari 559                 }
2 26 Feb 07 jari 560                 sde = new SlideDataElement(rows, columns, new float[2], moreFields);
2 26 Feb 07 jari 561                 slideDataArray[0].addSlideDataElement(sde);
2 26 Feb 07 jari 562                 for (int i=0; i<slideDataArray.length; i++) {
2 26 Feb 07 jari 563                     cy3 = 100000f;
2 26 Feb 07 jari 564                     try {
2 26 Feb 07 jari 565                         //LOG
2 26 Feb 07 jari 566                         cy5 = (float)(100000f*Math.pow(2.0f, Float.parseFloat(ss.nextToken())));
2 26 Feb 07 jari 567                         //cy5 = (float)(100000f*Math.pow(Math.E, Float.parseFloat(ss.nextToken())));
2 26 Feb 07 jari 568                     } catch (Exception e) {
2 26 Feb 07 jari 569                         cy3 = cy5 = 0f;
2 26 Feb 07 jari 570                     }
2 26 Feb 07 jari 571                     slideDataArray[i].setIntensities(counter - preSpotRows, cy3, cy5);
2 26 Feb 07 jari 572                 }
2 26 Feb 07 jari 573             }
2 26 Feb 07 jari 574             counter++;
2 26 Feb 07 jari 575             loadingPanel.setFileProgress(counter);
2 26 Feb 07 jari 576         }
2 26 Feb 07 jari 577         reader.close();
2 26 Feb 07 jari 578         return slideDataArray;
2 26 Feb 07 jari 579     }
2 26 Feb 07 jari 580     
2 26 Feb 07 jari 581     /**
2 26 Feb 07 jari 582      * Returns number of lines in the specified file.
2 26 Feb 07 jari 583      */
2 26 Feb 07 jari 584     private int getCountOfLines(File file) throws IOException {
2 26 Feb 07 jari 585         int count = 0;
2 26 Feb 07 jari 586         BufferedReader reader = new BufferedReader(new FileReader(file));
2 26 Feb 07 jari 587         String currentLine;
2 26 Feb 07 jari 588         while ((currentLine = reader.readLine()) != null) {
2 26 Feb 07 jari 589             count++;
2 26 Feb 07 jari 590         }
2 26 Feb 07 jari 591         reader.close();
2 26 Feb 07 jari 592         return count-TMEV.getHeaderRowCount();
2 26 Feb 07 jari 593     }
2 26 Feb 07 jari 594     
2 26 Feb 07 jari 595     /**
2 26 Feb 07 jari 596      * Interrupts a loading process.
2 26 Feb 07 jari 597      */
2 26 Feb 07 jari 598     private void abort() {
2 26 Feb 07 jari 599         stop = true;
2 26 Feb 07 jari 600     }
2 26 Feb 07 jari 601     
2 26 Feb 07 jari 602     /**
2 26 Feb 07 jari 603      * Sets a result code of loading process.
2 26 Feb 07 jari 604      */
2 26 Feb 07 jari 605     private void setResult(int option) {
2 26 Feb 07 jari 606         result = option;
2 26 Feb 07 jari 607     }
2 26 Feb 07 jari 608     
2 26 Feb 07 jari 609     /**
2 26 Feb 07 jari 610      * Creates a panel with 'cancel' button.
2 26 Feb 07 jari 611      */
2 26 Feb 07 jari 612     private JPanel createBtnsPanel(ActionListener listener) {
2 26 Feb 07 jari 613         JPanel panel = new JPanel(new BorderLayout());
2 26 Feb 07 jari 614         JButton cancelButton = new JButton("Cancel");
2 26 Feb 07 jari 615         cancelButton.setActionCommand("cancel-command");
2 26 Feb 07 jari 616         cancelButton.addActionListener(listener);
2 26 Feb 07 jari 617         panel.add(cancelButton, BorderLayout.EAST);
2 26 Feb 07 jari 618         getRootPane().setDefaultButton(cancelButton);
2 26 Feb 07 jari 619         return panel;
2 26 Feb 07 jari 620     }
2 26 Feb 07 jari 621     
2 26 Feb 07 jari 622     /**
2 26 Feb 07 jari 623      * The class to listen to window and an action events.
2 26 Feb 07 jari 624      */
2 26 Feb 07 jari 625     private class Listener extends WindowAdapter implements ActionListener {
2 26 Feb 07 jari 626         
2 26 Feb 07 jari 627         public void actionPerformed(ActionEvent e) {
2 26 Feb 07 jari 628             abort();
2 26 Feb 07 jari 629             setResult(JOptionPane.CANCEL_OPTION);
2 26 Feb 07 jari 630             dispose();
2 26 Feb 07 jari 631         }
2 26 Feb 07 jari 632         
2 26 Feb 07 jari 633         public void windowClosing(WindowEvent e) {
2 26 Feb 07 jari 634             abort();
2 26 Feb 07 jari 635             setResult(JOptionPane.CLOSED_OPTION);
2 26 Feb 07 jari 636             dispose();
2 26 Feb 07 jari 637         }
2 26 Feb 07 jari 638     }
2 26 Feb 07 jari 639     
2 26 Feb 07 jari 640     /**
2 26 Feb 07 jari 641      * The panel to display a loading progress.
2 26 Feb 07 jari 642      */
2 26 Feb 07 jari 643     private class LoadingPanel extends JPanel {
2 26 Feb 07 jari 644         
2 26 Feb 07 jari 645         private JProgressBar filesProgress = new JProgressBar();
2 26 Feb 07 jari 646         private JProgressBar fileProgress = new JProgressBar();
2 26 Feb 07 jari 647         private JLabel filesLabel = new JLabel("Remain: ");
2 26 Feb 07 jari 648         private JLabel fileLabel = new JLabel("File: ");
2 26 Feb 07 jari 649         
2 26 Feb 07 jari 650         /**
2 26 Feb 07 jari 651          * Constructs a <code>LoadingPanel</code>.
2 26 Feb 07 jari 652          */
2 26 Feb 07 jari 653         public LoadingPanel() {
2 26 Feb 07 jari 654             setPreferredSize(new Dimension(350, 120));
2 26 Feb 07 jari 655             setBorder(new BevelBorder(BevelBorder.RAISED));
2 26 Feb 07 jari 656             setLayout(new GridBagLayout());
2 26 Feb 07 jari 657             filesProgress.setStringPainted(true);
2 26 Feb 07 jari 658             fileProgress.setStringPainted(true);
2 26 Feb 07 jari 659             add(filesLabel,    new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0
2 26 Feb 07 jari 660             ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 5), 0, 0));
2 26 Feb 07 jari 661             add(filesProgress, new GridBagConstraints(0, 1, 1, 1, 1.0, 1.0
2 26 Feb 07 jari 662             ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));
2 26 Feb 07 jari 663             add(fileLabel,     new GridBagConstraints(0, 2, 1, 1, 1.0, 0.0
2 26 Feb 07 jari 664             ,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 5, 5, 5), 0, 0));
2 26 Feb 07 jari 665             add(fileProgress,  new GridBagConstraints(0, 3, 1, 1, 1.0, 1.0
2 26 Feb 07 jari 666             ,GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 5, 5, 5), 0, 0));
2 26 Feb 07 jari 667         }
2 26 Feb 07 jari 668         
2 26 Feb 07 jari 669         /**
2 26 Feb 07 jari 670          * Sets max value for the 'files' progress bar.
2 26 Feb 07 jari 671          */
2 26 Feb 07 jari 672         public void setFilesCount(int count) {
2 26 Feb 07 jari 673             filesProgress.setMaximum(count);
2 26 Feb 07 jari 674         }
2 26 Feb 07 jari 675         
2 26 Feb 07 jari 676         /**
2 26 Feb 07 jari 677          * Sets max value for the 'file' progress bar.
2 26 Feb 07 jari 678          */
2 26 Feb 07 jari 679         public void setLinesCount(int count) {
2 26 Feb 07 jari 680             fileProgress.setMaximum(count);
2 26 Feb 07 jari 681         }
2 26 Feb 07 jari 682         
2 26 Feb 07 jari 683         /**
2 26 Feb 07 jari 684          * Sets current value of the 'files' progress bar.
2 26 Feb 07 jari 685          */
2 26 Feb 07 jari 686         public void setFilesProgress(int value) {
2 26 Feb 07 jari 687             filesProgress.setValue(value);
2 26 Feb 07 jari 688         }
2 26 Feb 07 jari 689         
2 26 Feb 07 jari 690         /**
2 26 Feb 07 jari 691          * Sets current value of the 'file' progress bar.
2 26 Feb 07 jari 692          */
2 26 Feb 07 jari 693         public void setFileProgress(int value) {
2 26 Feb 07 jari 694             fileProgress.setValue(value);
2 26 Feb 07 jari 695         }
2 26 Feb 07 jari 696         
2 26 Feb 07 jari 697         /**
2 26 Feb 07 jari 698          * Sets name of a loaded file.
2 26 Feb 07 jari 699          */
2 26 Feb 07 jari 700         public void setFileName(String filename) {
2 26 Feb 07 jari 701             fileLabel.setText("File: "+filename);
2 26 Feb 07 jari 702         }
2 26 Feb 07 jari 703         
2 26 Feb 07 jari 704         /**
2 26 Feb 07 jari 705          * Sets common progress description.
2 26 Feb 07 jari 706          */
2 26 Feb 07 jari 707         public void setRemain(int count) {
2 26 Feb 07 jari 708             filesLabel.setText("Remains: "+String.valueOf(count)+" file(s)");
2 26 Feb 07 jari 709         }
2 26 Feb 07 jari 710     }
2 26 Feb 07 jari 711     
2 26 Feb 07 jari 712     /**
2 26 Feb 07 jari 713      * The class to allow run loading process in a separate thread.
2 26 Feb 07 jari 714      */
2 26 Feb 07 jari 715     private class Loader implements Runnable {
2 26 Feb 07 jari 716         
2 26 Feb 07 jari 717         private boolean stanford;
2 26 Feb 07 jari 718         
2 26 Feb 07 jari 719         public Loader(boolean stanford) {
2 26 Feb 07 jari 720             this.stanford = stanford;
2 26 Feb 07 jari 721         }
2 26 Feb 07 jari 722         
2 26 Feb 07 jari 723         public void run() {
2 26 Feb 07 jari 724             try {
2 26 Feb 07 jari 725                 data = stanford ? loadStanford() : loadData();
2 26 Feb 07 jari 726                 if (data == null) {
2 26 Feb 07 jari 727                     setResult(JOptionPane.CANCEL_OPTION);
2 26 Feb 07 jari 728                 } else {
2 26 Feb 07 jari 729                     setResult(JOptionPane.OK_OPTION);
2 26 Feb 07 jari 730                 }
2 26 Feb 07 jari 731             } catch (Exception e) {
2 26 Feb 07 jari 732                 setException(e);
2 26 Feb 07 jari 733             } finally {
2 26 Feb 07 jari 734                 dispose();
2 26 Feb 07 jari 735             }
2 26 Feb 07 jari 736         }
2 26 Feb 07 jari 737         
2 26 Feb 07 jari 738     }
2 26 Feb 07 jari 739 }