Changeset 3849


Ignore:
Timestamp:
03/27/08 11:13:04 (12 years ago)
Author:
melissa
Message:

Removed string logic for parsing XML.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/in/LIFReader.java

    r3617 r3849  
    7070  private Vector containerNames; 
    7171  private Vector containerCounts; 
     72  private Vector widths; 
     73  private Vector heights; 
     74  private Vector zs; 
     75  private Vector ts; 
     76  private Vector channels; 
     77  private Vector bps; 
     78  private Vector extraDims; 
     79 
     80  private int numDatasets; 
    7281 
    7382  // -- Constructor -- 
     
    211220    seriesNames = new Vector(); 
    212221 
     222    numDatasets = 0; 
     223    widths = new Vector(); 
     224    heights = new Vector(); 
     225    zs = new Vector(); 
     226    ts = new Vector(); 
     227    channels = new Vector(); 
     228    bps = new Vector(); 
     229    extraDims = new Vector(); 
     230 
    213231    LIFHandler handler = new LIFHandler(); 
    214232 
     
    233251    catch (SAXException exc) { 
    234252      throw new FormatException(exc); 
    235     } 
    236  
    237     Vector elements = new Vector(); 
    238  
    239     status("Populating native metadata"); 
    240  
    241     // first parse each element in the XML string 
    242  
    243     StringTokenizer st = new StringTokenizer(xml, ">"); 
    244     while (st.hasMoreTokens()) { 
    245       String token = st.nextToken(); 
    246       elements.add(token.substring(1)); 
    247     } 
    248  
    249     // the first element contains version information 
    250  
    251     String token = (String) elements.get(0); 
    252     String key = token.substring(0, token.indexOf("\"")); 
    253     String value = token.substring(token.indexOf("\"") + 1, token.length()-1); 
    254     addMeta(key, value); 
    255  
    256     // what we have right now is a vector of XML elements, which need to 
    257     // be parsed into the appropriate image dimensions 
    258  
    259     int ndx = 1; 
    260  
    261     // the image data we need starts with the token "ElementName='blah'" and 
    262     // ends with the token "/ImageDescription" 
    263  
    264     int numDatasets = 0; 
    265     Vector widths = new Vector(); 
    266     Vector heights = new Vector(); 
    267     Vector zs = new Vector(); 
    268     Vector ts = new Vector(); 
    269     Vector channels = new Vector(); 
    270     Vector bps = new Vector(); 
    271     Vector extraDims = new Vector(); 
    272  
    273     while (ndx < elements.size()) { 
    274       token = (String) elements.get(ndx); 
    275  
    276       // if the element contains a key/value pair, parse it and put it in 
    277       // the metadata hashtable 
    278  
    279       if (token.startsWith("ScannerSettingRecord")) { 
    280         if (token.indexOf("csScanMode") != -1) { 
    281           int index = token.indexOf("Variant") + 7; 
    282           String ordering = token.substring(index + 2, 
    283             token.indexOf("\"", index + 3)); 
    284           ordering = ordering.toLowerCase(); 
    285  
    286           if (ordering.indexOf("x") == -1 || ordering.indexOf("y") == -1 || 
    287             ordering.indexOf("xy") == -1) 
    288           { 
    289             int xPos = ordering.indexOf("x"); 
    290             int yPos = ordering.indexOf("y"); 
    291             int zPos = ordering.indexOf("z"); 
    292             int tPos = ordering.indexOf("t"); 
    293  
    294             if (xPos < 0) xPos = 0; 
    295             if (yPos < 0) yPos = 1; 
    296             if (zPos < 0) zPos = 2; 
    297             if (tPos < 0) tPos = 3; 
    298  
    299             int x = ((Integer) widths.get(widths.size() - 1)).intValue(); 
    300             int y = ((Integer) heights.get(widths.size() - 1)).intValue(); 
    301             int z = ((Integer) zs.get(widths.size() - 1)).intValue(); 
    302             int t = ((Integer) ts.get(widths.size() - 1)).intValue(); 
    303  
    304             int[] dimensions = {x, y, z, t}; 
    305  
    306             x = dimensions[xPos]; 
    307             y = dimensions[yPos]; 
    308             z = dimensions[zPos]; 
    309             t = dimensions[tPos]; 
    310  
    311             widths.setElementAt(new Integer(x), widths.size() - 1); 
    312             heights.setElementAt(new Integer(y), heights.size() - 1); 
    313             zs.setElementAt(new Integer(z), zs.size() - 1); 
    314             ts.setElementAt(new Integer(t), ts.size() - 1); 
    315           } 
    316         } 
    317         else if (token.indexOf("dblVoxel") != -1) { 
    318           int index = token.indexOf("Variant") + 7; 
    319           String size = token.substring(index + 2, 
    320             token.indexOf("\"", index + 3)); 
    321           float cal = Float.parseFloat(size) * 1000000; 
    322           if (token.indexOf("Z") != -1 && xcal.size() > zcal.size()) { 
    323             zcal.add(new Float(cal)); 
    324           } 
    325         } 
    326       } 
    327       else if (token.startsWith("Element Name")) { 
    328         // loop until we find "/ImageDescription" 
    329  
    330         numDatasets++; 
    331         int numChannels = 0; 
    332         int extras = 1; 
    333  
    334         while (token.indexOf("/ImageDescription") == -1) { 
    335           if (token.indexOf("=") != -1) { 
    336             // create a small hashtable to store just this element's data 
    337  
    338             if (token.startsWith("Element Name")) { 
    339               // hack to override first series name 
    340               int idx = numDatasets - 1; 
    341               if (idx >= seriesNames.size()) { 
    342                 numDatasets = seriesNames.size(); 
    343                 idx = numDatasets - 1; 
    344               } 
    345             } 
    346  
    347             Hashtable tmp = new Hashtable(); 
    348             while (token.length() > 2) { 
    349               key = token.substring(0, token.indexOf("\"") - 1); 
    350               value = token.substring(token.indexOf("\"") + 1, 
    351                 token.indexOf("\"", token.indexOf("\"") + 1)); 
    352  
    353               token = token.substring(key.length() + value.length() + 3); 
    354  
    355               key = key.trim(); 
    356               value = value.trim(); 
    357               tmp.put(key, value); 
    358             } 
    359  
    360             if (tmp.get("ChannelDescription DataType") != null) { 
    361               // found channel description block 
    362               numChannels++; 
    363               if (numChannels == 1) { 
    364                 bps.add(new Integer((String) tmp.get("Resolution"))); 
    365               } 
    366             } 
    367             else if (tmp.get("DimensionDescription DimID") != null) { 
    368               // found dimension description block 
    369  
    370               int w = Integer.parseInt((String) tmp.get("NumberOfElements")); 
    371               int id = Integer.parseInt((String) 
    372                 tmp.get("DimensionDescription DimID")); 
    373               float size = Float.parseFloat((String) tmp.get("Length")); 
    374               if (size < 0) size *= -1; 
    375  
    376               switch (id) { 
    377                 case 1: 
    378                   widths.add(new Integer(w)); 
    379                   xcal.add(new Float((size * 1000000) / w)); 
    380                   break; 
    381                 case 2: 
    382                   heights.add(new Integer(w)); 
    383                   ycal.add(new Float((size * 1000000) / w)); 
    384                   break; 
    385                 case 3: 
    386                   zs.add(new Integer(w)); 
    387                   zcal.add(new Float((size * 1000000) / w)); 
    388                   break; 
    389                 case 4: 
    390                   ts.add(new Integer(w)); 
    391                   break; 
    392                 default: 
    393                   extras *= w; 
    394               } 
    395             } 
    396           } 
    397  
    398           ndx++; 
    399           if (elements != null && ndx < elements.size()) { 
    400             token = (String) elements.get(ndx); 
    401           } 
    402           else break; 
    403         } 
    404         extraDims.add(new Integer(extras)); 
    405         if (numChannels == 0) numChannels++; 
    406         channels.add(new Integer(numChannels)); 
    407  
    408         if (widths.size() < numDatasets && heights.size() < numDatasets) { 
    409           numDatasets--; 
    410         } 
    411         else { 
    412           if (widths.size() < numDatasets) widths.add(new Integer(1)); 
    413           if (heights.size() < numDatasets) heights.add(new Integer(1)); 
    414           if (zs.size() < numDatasets) zs.add(new Integer(1)); 
    415           if (ts.size() < numDatasets) ts.add(new Integer(1)); 
    416           if (bps.size() < numDatasets) bps.add(new Integer(8)); 
    417         } 
    418       } 
    419       ndx++; 
    420253    } 
    421254 
     
    494327 
    495328      // CTR CHECK 
    496 //      for (int j=0; j<core.sizeC[i]; j++) { 
    497 //        store.setLogicalChannel(j, null, null, null, null, null, null, null, 
    498 //          null, null, null, null, null, null, null, null, null, null, null, 
    499 //          null, null, null, null, null, ii); 
    500 //      } 
    501  
    502       // CTR CHECK 
    503329//      String zoom = (String) getMeta(seriesName + " - dblZoom"); 
    504330//      store.setDisplayOptions(zoom == null ? null : new Float(zoom), 
     
    526352    private boolean firstElement = true; 
    527353    private boolean dcroiOpen = false; 
     354    private int numChannels, extras; 
    528355 
    529356    public void endElement(String uri, String localName, String qName) { 
     
    537364        } 
    538365        else fullSeries = ""; 
     366 
     367        extraDims.add(new Integer(extras)); 
     368        if (numChannels == 0) numChannels++; 
     369        channels.add(new Integer(numChannels)); 
     370 
     371        if (widths.size() < numDatasets && heights.size() < numDatasets) { 
     372          numDatasets--; 
     373        } 
     374        else if (widths.size() > numDatasets && heights.size() > numDatasets) { 
     375          numDatasets = widths.size(); 
     376        } 
     377        if (widths.size() < numDatasets) widths.add(new Integer(1)); 
     378        if (heights.size() < numDatasets) heights.add(new Integer(1)); 
     379        if (zs.size() < numDatasets) zs.add(new Integer(1)); 
     380        if (ts.size() < numDatasets) ts.add(new Integer(1)); 
     381        if (bps.size() < numDatasets) bps.add(new Integer(8)); 
     382        numChannels = 0; 
    539383      } 
    540384    } 
     
    555399          dcroiOpen = true; 
    556400        } 
     401 
     402        numDatasets++; 
     403        int idx = numDatasets - 1; 
     404        if (idx >= seriesNames.size()) { 
     405          numDatasets = seriesNames.size(); 
     406        } 
     407 
     408        if (!dcroiOpen) { 
     409          numChannels = 0; 
     410          extras = 1; 
     411        } 
    557412      } 
    558413      else if (qName.equals("Experiment")) { 
     
    576431      else if (qName.equals("ChannelDescription")) { 
    577432        String prefix = fullSeries + " - Channel " + count + " - "; 
    578         addMeta(prefix + "Min", attributes.getValue("Min")); 
    579         addMeta(prefix + "Max", attributes.getValue("Max")); 
    580         addMeta(prefix + "Resolution", attributes.getValue("Resolution")); 
    581         addMeta(prefix + "LUTName", attributes.getValue("LUTName")); 
    582         addMeta(prefix + "IsLUTInverted", attributes.getValue("IsLUTInverted")); 
     433        for (int i=0; i<attributes.getLength(); i++) { 
     434          String name = attributes.getQName(i); 
     435          addMeta(prefix + name, attributes.getValue(name)); 
     436        } 
    583437        count++; 
     438        numChannels++; 
     439        if (numChannels == 1) { 
     440          bps.add(new Integer(attributes.getValue("Resolution"))); 
     441        } 
    584442      } 
    585443      else if (qName.equals("DimensionDescription")) { 
    586444        String prefix = fullSeries + " - Dimension " + count + " - "; 
    587         addMeta(prefix + "NumberOfElements", 
    588           attributes.getValue("NumberOfElements")); 
    589         addMeta(prefix + "Length", attributes.getValue("Length")); 
    590         addMeta(prefix + "Origin", attributes.getValue("Origin")); 
    591         addMeta(prefix + "DimID", attributes.getValue("DimID")); 
     445        for (int i=0; i<attributes.getLength(); i++) { 
     446          String name = attributes.getQName(i); 
     447          addMeta(prefix + name, attributes.getValue(name)); 
     448        } 
     449        Integer w = new Integer(attributes.getValue("NumberOfElements")); 
     450        int id = Integer.parseInt(attributes.getValue("DimID")); 
     451        float size = Float.parseFloat(attributes.getValue("Length")); 
     452        if (size < 0) size *= -1; 
     453        size *= 1000000; 
     454        Float pixelSize = new Float(size / w.intValue()); 
     455 
     456        switch (id) { 
     457          case 1: 
     458            widths.add(w); 
     459            xcal.add(pixelSize); 
     460            break; 
     461          case 2: 
     462            heights.add(w); 
     463            ycal.add(pixelSize); 
     464            break; 
     465          case 3: 
     466            zs.add(w); 
     467            zcal.add(pixelSize); 
     468            break; 
     469          case 4: 
     470            ts.add(w); 
     471            break; 
     472          default: 
     473            extras *= w.intValue(); 
     474        } 
    592475      } 
    593476      else if (qName.equals("ScannerSettingRecord")) { 
     
    595478          attributes.getValue("Description"); 
    596479        addMeta(fullSeries + " - " + key, attributes.getValue("Variant")); 
     480        String identifier = attributes.getValue("Identifier"); 
     481        if ("csScanMode".equals(identifier)) { 
     482          String ordering = attributes.getValue("Variant").toLowerCase(); 
     483 
     484          if (ordering.indexOf("x") == -1 || ordering.indexOf("y") == -1 || 
     485            ordering.indexOf("xy") == -1) 
     486          { 
     487            int xPos = ordering.indexOf("x"); 
     488            int yPos = ordering.indexOf("y"); 
     489            int zPos = ordering.indexOf("z"); 
     490            int tPos = ordering.indexOf("t"); 
     491 
     492            if (xPos < 0) xPos = 0; 
     493            if (yPos < 0) yPos = 1; 
     494            if (zPos < 0) zPos = 2; 
     495            if (tPos < 0) tPos = 3; 
     496 
     497            int index = widths.size() - 1; 
     498 
     499            int x = ((Integer) widths.get(index)).intValue(); 
     500            int y = index < heights.size() ? 
     501              ((Integer) heights.get(index)).intValue() : 1; 
     502            int z = 
     503              index < zs.size() ? ((Integer) zs.get(index)).intValue() : 1; 
     504            int t = 
     505              index < ts.size() ? ((Integer) ts.get(index)).intValue() : 1; 
     506 
     507            int[] dimensions = {x, y, z, t}; 
     508 
     509            x = dimensions[xPos]; 
     510            y = dimensions[yPos]; 
     511            z = dimensions[zPos]; 
     512            t = dimensions[tPos]; 
     513 
     514            widths.setElementAt(new Integer(x), widths.size() - 1); 
     515            if (index < heights.size()) { 
     516              heights.setElementAt(new Integer(y), heights.size() - 1); 
     517            } 
     518            else heights.add(new Integer(y)); 
     519            if (index < zs.size()) { 
     520              zs.setElementAt(new Integer(z), zs.size() - 1); 
     521            } 
     522            else zs.add(new Integer(z)); 
     523            if (index < ts.size()) { 
     524              ts.setElementAt(new Integer(t), ts.size() - 1); 
     525            } 
     526            else ts.add(new Integer(t)); 
     527          } 
     528        } 
     529        else if (identifier.startsWith("dblVoxel")) { 
     530          if (identifier.endsWith("Z") && xcal.size() > zcal.size()) { 
     531            String size = attributes.getValue("Variant"); 
     532            float cal = Float.parseFloat(size) * 1000000; 
     533            zcal.add(new Float(cal)); 
     534          } 
     535        } 
    597536      } 
    598537      else if (qName.equals("FilterSettingRecord")) { 
     
    613552        else { 
    614553          int ndx = fullSeries.indexOf(" - Sequential Setting ") + 22; 
    615           int n = Integer.parseInt(fullSeries.substring(ndx)); 
    616           n++; 
     554          int n = Integer.parseInt(fullSeries.substring(ndx)) + 1; 
    617555          fullSeries = fullSeries.substring(0, ndx) + String.valueOf(n); 
    618556        } 
     
    625563      else if (qName.equals("Wheel")) { 
    626564        String prefix = fullSeries + " - Wheel " + count + " - "; 
    627         addMeta(prefix + "Qualifier", attributes.getValue("Qualifier")); 
    628         addMeta(prefix + "FilterIndex", attributes.getValue("FilterIndex")); 
    629         addMeta(prefix + "FilterSpectrumPos", 
    630           attributes.getValue("FilterSpectrumPos")); 
    631         addMeta(prefix + "IsSpectrumTurnMode", 
    632           attributes.getValue("IsSpectrumTurnMode")); 
    633         addMeta(prefix + "IndexChanged", attributes.getValue("IndexChanged")); 
    634         addMeta(prefix + "SpectrumChanged", 
    635           attributes.getValue("SpectrumChanged")); 
     565        for (int i=0; i<attributes.getLength(); i++) { 
     566          String name = attributes.getQName(i); 
     567          addMeta(prefix + name, attributes.getValue(name)); 
     568        } 
    636569        count++; 
    637570      } 
    638571      else if (qName.equals("WheelName")) { 
    639         String prefix = fullSeries + " - Wheel " + (count - 1) + " - WheelName "; 
     572        String prefix = 
     573          fullSeries + " - Wheel " + (count - 1) + " - WheelName "; 
    640574        int ndx = 0; 
    641575        while (getMeta(prefix + ndx) != null) ndx++; 
     
    653587        String prefix = fullSeries + " - LaserLine " + 
    654588          attributes.getValue("LaserLine") + " - "; 
    655         addMeta(prefix + "IntensityDev", attributes.getValue("IntensityDev")); 
    656         addMeta(prefix + "IntensityLowDev", 
    657           attributes.getValue("IntensityLowDev")); 
    658         addMeta(prefix + "AOBSIntensityDev", 
    659           attributes.getValue("AOBSIntensityDev")); 
    660         addMeta(prefix + "AOBSIntensityLowDev", 
    661           attributes.getValue("AOBSIntensityLowDev")); 
    662         addMeta(prefix + "EnableDoubleMode", 
    663           attributes.getValue("EnableDoubleMode")); 
    664         addMeta(prefix + "LineIndex", attributes.getValue("LineIndex")); 
    665         addMeta(prefix + "Qualifier", attributes.getValue("Qualifier")); 
    666         addMeta(prefix + "SequenceIndex", 
    667           attributes.getValue("SequenceIndex")); 
     589        for (int i=0; i<attributes.getLength(); i++) { 
     590          String name = attributes.getQName(i); 
     591          if (!name.equals("LaserLine")) { 
     592            addMeta(prefix + name, attributes.getValue(name)); 
     593          } 
     594        } 
    668595      } 
    669596      else if (qName.equals("Detector")) { 
    670597        String prefix = fullSeries + " - Detector Channel " + 
    671598          attributes.getValue("Channel") + " - "; 
    672         addMeta(prefix + "IsActive", attributes.getValue("IsActive")); 
    673         addMeta(prefix + "IsReferenceUnitActivatedForCorrection", 
    674           attributes.getValue("IsReferenceUnitActivatedForCorrection")); 
    675         addMeta(prefix + "Gain", attributes.getValue("Gain")); 
    676         addMeta(prefix + "Offset", attributes.getValue("Offset")); 
     599        for (int i=0; i<attributes.getLength(); i++) { 
     600          String name = attributes.getQName(i); 
     601          if (!name.equals("Channel")) { 
     602            addMeta(prefix + name, attributes.getValue(name)); 
     603          } 
     604        } 
    677605      } 
    678606      else if (qName.equals("Laser")) { 
    679607        String prefix = fullSeries + " Laser " + 
    680608          attributes.getValue("LaserName") + " - "; 
    681         addMeta(prefix + "CanDoLinearOutputPower", 
    682           attributes.getValue("CanDoLinearOutputPower")); 
    683         addMeta(prefix + "OutputPower", attributes.getValue("OutputPower")); 
    684         addMeta(prefix + "Wavelength", attributes.getValue("Wavelength")); 
     609        for (int i=0; i<attributes.getLength(); i++) { 
     610          String name = attributes.getQName(i); 
     611          if (!name.equals("LaserName")) { 
     612            addMeta(prefix + name, attributes.getValue(name)); 
     613          } 
     614        } 
    685615      } 
    686616      else if (qName.equals("TimeStamp")) { 
    687  
    688617        long high = Long.parseLong(attributes.getValue("HighInteger")); 
    689618        long low = Long.parseLong(attributes.getValue("LowInteger")); 
     
    706635      else if (qName.equals("ChannelScalingInfo")) { 
    707636        String prefix = fullSeries + " - ChannelScalingInfo " + count + " - "; 
    708         addMeta(prefix + "WhiteValue", attributes.getValue("WhiteValue")); 
    709         addMeta(prefix + "BlackValue", attributes.getValue("BlackValue")); 
    710         addMeta(prefix + "GammaValue", attributes.getValue("GammaValue")); 
    711         addMeta(prefix + "Automatic", attributes.getValue("Automatic")); 
     637        for (int i=0; i<attributes.getLength(); i++) { 
     638          String name = attributes.getQName(i); 
     639          addMeta(prefix + name, attributes.getValue(name)); 
     640        } 
    712641      } 
    713642      else if (qName.equals("RelTimeStamp")) { 
Note: See TracChangeset for help on using the changeset viewer.