Changeset 3409


Ignore:
Timestamp:
11/26/07 11:47:44 (12 years ago)
Author:
melissa
Message:

Updated reader to support XML companion file.

File:
1 edited

Legend:

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

    r3197 r3409  
    2525package loci.formats.in; 
    2626 
    27 import java.io.IOException; 
     27import java.io.*; 
    2828import java.text.*; 
    2929import java.util.*; 
     30import javax.xml.parsers.*; 
    3031import loci.formats.*; 
     32import loci.formats.in.TiffReader; 
     33import org.xml.sax.Attributes; 
     34import org.xml.sax.SAXException; 
     35import org.xml.sax.helpers.DefaultHandler; 
    3136 
    3237/** 
    33  * TCSReader is the file format reader for Leica TCS TIFF files. 
     38 * TCSReader is the file format reader for Leica TCS TIFF files and their 
     39 * companion XML file. 
    3440 * 
    3541 * <dl><dt><b>Source code:</b></dt> 
    3642 * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/loci/formats/in/TCSReader.java">Trac</a>, 
    3743 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/loci/formats/in/TCSReader.java">SVN</a></dd></dl> 
     44 * 
     45 * @author Melissa Linkert linkert at wisc.edu 
    3846 */ 
    39 public class TCSReader extends BaseTiffReader { 
     47public class TCSReader extends FormatReader { 
     48 
     49  // -- Constants -- 
     50 
     51  /** Factory for generating SAX parsers. */ 
     52  public static final SAXParserFactory SAX_FACTORY = 
     53    SAXParserFactory.newInstance(); 
     54 
     55  // -- Fields -- 
     56 
     57  /** List of TIFF files. */ 
     58  private Vector tiffs; 
     59 
     60  /** Helper readers. */ 
     61  private TiffReader[] tiffReaders; 
     62 
     63  private Vector seriesNames; 
     64  private Vector containerNames; 
     65  private Vector containerCounts; 
     66  private Vector xcal, ycal, zcal; 
     67  private Vector x, y, z, c, t, bits; 
    4068 
    4169  // -- Constructor -- 
    4270 
    4371  public TCSReader() { 
    44     super("Leica TCS TIFF", new String[] {"tif", "tiff"}); 
     72    super("Leica TCS TIFF", new String[] {"tif", "tiff", "xml"}); 
     73  } 
     74 
     75  // -- IFormatReader API methods -- 
     76 
     77  /* @see loci.formats.IFormatReader#isThisType(byte[]) */ 
     78  public boolean isThisType(byte[] block) { 
     79    return false; 
     80  } 
     81 
     82  /* @see loci.formats.IFormatReader#get8BitLookupTable() */ 
     83  public byte[][] get8BitLookupTable() throws FormatException, IOException { 
     84    FormatTools.assertId(currentId, true, 1); 
     85    return tiffReaders[0].get8BitLookupTable(); 
     86  } 
     87 
     88  /* @see loci.formats.IFormatReader#get16BitLookupTable() */ 
     89  public short[][] get16BitLookupTable() throws FormatException, IOException { 
     90    FormatTools.assertId(currentId, true, 1); 
     91    return tiffReaders[0].get16BitLookupTable(); 
     92  } 
     93 
     94  /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
     95  public byte[] openBytes(int no, byte[] buf) 
     96    throws FormatException, IOException 
     97  { 
     98    FormatTools.assertId(currentId, true, 1); 
     99    FormatTools.checkPlaneNumber(this, no); 
     100    FormatTools.checkBufferSize(this, buf.length); 
     101 
     102    int n = 0; 
     103    for (int i=0; i<series; i++) { 
     104      n += core.imageCount[i]; 
     105    } 
     106    n += no; 
     107 
     108    return tiffReaders[n].openBytes(0, buf); 
     109  } 
     110 
     111  /* @see loci.formats.IFormatReader#getUsedFiles() */ 
     112  public String[] getUsedFiles() { 
     113    FormatTools.assertId(currentId, true, 1); 
     114    Vector v = new Vector(); 
     115    for (int i=0; i<tiffs.size(); i++) { 
     116      v.add(tiffs.get(i)); 
     117    } 
     118    return (String[]) v.toArray(new String[0]); 
    45119  } 
    46120 
     
    49123  /* @see loci.formats.IFormatHandler#isThisType(String, boolean) */ 
    50124  public boolean isThisType(String name, boolean open) { 
    51     if (!super.isThisType(name, open)) return false; // check extension 
     125    if (!super.isThisType(name, open) && !name.toLowerCase().endsWith("xml")) { 
     126      return false; // check extension 
     127    } 
    52128    if (!open) return true; // not allowed to check the file contents 
     129 
     130    if (name.toLowerCase().endsWith("xml")) { 
     131      try { 
     132        RandomAccessStream ras = new RandomAccessStream(name); 
     133        String s = ras.readString(20); 
     134        return s.indexOf("Data") != -1; 
     135      } 
     136      catch (IOException exc) { 
     137        return false; 
     138      } 
     139    } 
    53140 
    54141    // just checking the filename isn't enough to differentiate between 
     
    61148 
    62149      String document = (String) ifd.get(new Integer(TiffTools.DOCUMENT_NAME)); 
    63       if (document == null) return false; 
    64       return document.startsWith("CHANNEL"); 
     150      if (document == null) document = ""; 
     151      String software = (String) ifd.get(new Integer(TiffTools.SOFTWARE)); 
     152      if (software == null) software = ""; 
     153      return document.startsWith("CHANNEL") || software.trim().equals("TCSNTV"); 
    65154    } 
    66155    catch (IOException e) { return false; } 
    67156  } 
    68157 
    69   // -- Internal BaseTiffReader API methods -- 
    70  
    71   /* @see BaseTiffReader#initStandardMetadata() */ 
    72   protected void initStandardMetadata() throws FormatException, IOException { 
    73     super.initStandardMetadata(); 
    74  
    75     int[] ch = new int[ifds.length]; 
    76     int[] idx = new int[ifds.length]; 
    77     long[] stamp = new long[ifds.length]; 
    78  
    79     int channelCount = 0; 
    80     SimpleDateFormat fmt = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss.SSS"); 
    81  
    82     for (int i=0; i<ifds.length; i++) { 
    83       String document = 
    84         (String) ifds[i].get(new Integer(TiffTools.DOCUMENT_NAME)); 
    85  
    86       int index = document.indexOf("INDEX"); 
    87       String c = document.substring(8, index).trim(); 
    88       ch[i] = Integer.parseInt(c); 
    89       if (ch[i] > channelCount) channelCount = ch[i]; 
    90  
    91       String n = document.substring(index + 6, 
    92         document.indexOf(" ", index + 6)).trim(); 
    93       idx[i] = Integer.parseInt(n); 
    94  
    95       String date = document.substring(document.indexOf(" ", index + 6), 
    96         document.indexOf("FORMAT")).trim(); 
    97       stamp[i] = fmt.parse(date, new ParsePosition(0)).getTime(); 
    98     } 
    99  
    100     core.sizeT[0] = 0; 
    101     core.currentOrder[0] = core.rgb[0] ? "XYC" : "XY"; 
    102  
    103     // determine the axis sizes and ordering 
    104     boolean unique = true; 
    105     for (int i=0; i<stamp.length; i++) { 
    106       for (int j=i+1; j<stamp.length; j++) { 
    107         if (stamp[j] == stamp[i]) { 
    108           unique = false; 
    109           break; 
    110         } 
    111       } 
    112       if (unique) { 
    113         core.sizeT[0]++; 
    114         if (core.currentOrder[0].indexOf("T") < 0) core.currentOrder[0] += "T"; 
    115       } 
    116       else if (i > 0) { 
    117         if ((ch[i] != ch[i - 1]) && core.currentOrder[0].indexOf("C") < 0) { 
    118           core.currentOrder[0] += "C"; 
    119         } 
    120         else if (core.currentOrder[0].indexOf("Z") < 0) { 
    121           core.currentOrder[0] += "Z"; 
    122         } 
    123       } 
    124       unique = true; 
    125     } 
    126  
    127     if (core.currentOrder[0].indexOf("Z") < 0) core.currentOrder[0] += "Z"; 
    128     if (core.currentOrder[0].indexOf("C") < 0) core.currentOrder[0] += "C"; 
    129     if (core.currentOrder[0].indexOf("T") < 0) core.currentOrder[0] += "T"; 
    130  
    131     if (core.sizeT[0] == 0) core.sizeT[0] = 1; 
    132     if (channelCount == 0) channelCount = 1; 
    133     core.sizeZ[0] = ifds.length / (core.sizeT[0] * channelCount); 
    134     core.sizeC[0] *= channelCount; 
    135     core.imageCount[0] = core.sizeZ[0] * core.sizeT[0] * channelCount; 
    136  
    137     // cut up comment 
    138  
    139     String comment = (String) getMeta("Comment"); 
    140     if (comment != null && comment.startsWith("[")) { 
    141       StringTokenizer st = new StringTokenizer(comment, "\n"); 
    142       while (st.hasMoreTokens()) { 
    143         String token = st.nextToken(); 
    144         if (!token.startsWith("[")) { 
    145           int eq = token.indexOf("="); 
    146           String key = token.substring(0, eq); 
    147           String value = token.substring(eq + 1); 
    148           addMeta(key, value); 
    149         } 
    150       } 
    151       metadata.remove("Comment"); 
     158  /* @see loci.formats.IFormatHandler#close() */ 
     159  public void close() throws IOException { 
     160    super.close(); 
     161    tiffs = null; 
     162    tiffReaders = null; 
     163  } 
     164 
     165  // -- Internal FormatReader API methods -- 
     166 
     167  /* @see loci.formats.FormatReader#initFile(String) */ 
     168  protected void initFile(String id) throws FormatException, IOException { 
     169    if (debug) debug("TCSReader.initFile(" + id + ")"); 
     170 
     171    String lname = id.toLowerCase(); 
     172    if (lname.endsWith("tiff") || lname.endsWith("tif")) { 
     173      // find the associated XML file, if it exists 
     174      Location l = new Location(id).getAbsoluteFile(); 
     175      Location parent = l.getParentFile(); 
     176      String[] list = parent.list(); 
     177      for (int i=0; i<list.length; i++) { 
     178        if (list[i].toLowerCase().endsWith("xml")) { 
     179          initFile(new Location(parent, list[i]).getAbsolutePath()); 
     180          return; 
     181        } 
     182      } 
     183    } 
     184 
     185    super.initFile(id); 
     186 
     187    if (lname.endsWith("xml")) { 
     188      in = new RandomAccessStream(id); 
     189      xcal = new Vector(); 
     190      ycal = new Vector(); 
     191      zcal = new Vector(); 
     192      seriesNames = new Vector(); 
     193      containerNames = new Vector(); 
     194      containerCounts = new Vector(); 
     195      x = new Vector(); 
     196      y = new Vector(); 
     197      z = new Vector(); 
     198      c = new Vector(); 
     199      t = new Vector(); 
     200      bits = new Vector(); 
     201 
     202      // parse XML metadata 
     203 
     204      TCSHandler handler = new TCSHandler(); 
     205      String prefix = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><LEICA>"; 
     206      String suffix = "</LEICA>"; 
     207      String xml = prefix + in.readString((int) in.length()) + suffix; 
     208 
     209      for (int i=0; i<xml.length(); i++) { 
     210        char c = xml.charAt(i); 
     211        if (Character.isISOControl(c) || !Character.isDefined(c)) { 
     212          xml = xml.replace(c, ' '); 
     213        } 
     214      } 
     215 
     216      try { 
     217        SAXParser parser = SAX_FACTORY.newSAXParser(); 
     218        parser.parse(new ByteArrayInputStream(xml.getBytes()), handler); 
     219      } 
     220      catch (ParserConfigurationException exc) { 
     221        throw new FormatException(exc); 
     222      } 
     223      catch (SAXException exc) { 
     224        throw new FormatException(exc); 
     225      } 
     226 
     227      // look for associated TIFF files 
     228 
     229      tiffs = new Vector(); 
     230 
     231      Location parent = new Location(id).getAbsoluteFile().getParentFile(); 
     232      String[] list = parent.list(); 
     233      Arrays.sort(list); 
     234      for (int i=0; i<list.length; i++) { 
     235        String lcase = list[i].toLowerCase(); 
     236        if (lcase.endsWith("tif") || lcase.endsWith("tiff")) { 
     237          String file = new Location(parent, list[i]).getAbsolutePath(); 
     238          Hashtable ifd = TiffTools.getIFDs(new RandomAccessStream(file))[0]; 
     239          String software = 
     240            (String) TiffTools.getIFDValue(ifd, TiffTools.SOFTWARE); 
     241          if (software != null && software.trim().equals("TCSNTV")) { 
     242            tiffs.add(file); 
     243          } 
     244        } 
     245      } 
     246 
     247      tiffReaders = new TiffReader[tiffs.size()]; 
     248 
     249      for (int i=0; i<tiffReaders.length; i++) { 
     250        tiffReaders[i] = new TiffReader(); 
     251        tiffReaders[i].setId((String) tiffs.get(i)); 
     252      } 
     253 
     254      core = new CoreMetadata(x.size()); 
     255      for (int i=0; i<x.size(); i++) { 
     256        core.sizeX[i] = ((Integer) x.get(i)).intValue(); 
     257        core.sizeY[i] = ((Integer) y.get(i)).intValue(); 
     258        if (z.size() > 0) core.sizeZ[i] = ((Integer) z.get(i)).intValue(); 
     259        else core.sizeZ[i] = 1; 
     260        if (c.size() > 0) core.sizeC[i] = ((Integer) c.get(i)).intValue(); 
     261        else core.sizeC[i] = 1; 
     262        if (t.size() > 0) core.sizeT[i] = ((Integer) t.get(i)).intValue(); 
     263        else core.sizeT[i] = 1; 
     264        core.imageCount[i] = core.sizeZ[i] * core.sizeC[i] * core.sizeT[i]; 
     265        int bpp = ((Integer) bits.get(i)).intValue(); 
     266        while (bpp % 8 != 0) bpp++; 
     267        switch (bpp) { 
     268          case 8: 
     269            core.pixelType[i] = FormatTools.UINT8; 
     270            break; 
     271          case 16: 
     272            core.pixelType[i] = FormatTools.UINT16; 
     273            break; 
     274          case 32: 
     275            core.pixelType[i] = FormatTools.FLOAT; 
     276            break; 
     277        } 
     278        if (tiffs.size() < core.imageCount[i]) { 
     279          int div = core.imageCount[i] / core.sizeC[i]; 
     280          core.imageCount[i] = tiffs.size(); 
     281          if (div >= core.sizeZ[i]) core.sizeZ[i] /= div; 
     282          else if (div >= core.sizeT[i]) core.sizeT[i] /= div; 
     283        } 
     284      } 
     285      Arrays.fill(core.currentOrder, 
     286        core.sizeZ[0] > core.sizeT[0] ? "XYCZT" : "XYCTZ"); 
     287      Arrays.fill(core.metadataComplete, true); 
     288      Arrays.fill(core.rgb, false); 
     289      Arrays.fill(core.interleaved, false); 
     290      Arrays.fill(core.indexed, tiffReaders[0].isIndexed()); 
     291      Arrays.fill(core.falseColor, true); 
     292    } 
     293    else { 
     294      tiffs = new Vector(); 
     295      tiffs.add(id); 
     296      tiffReaders = new TiffReader[1]; 
     297      tiffReaders[0] = new TiffReader(); 
     298      tiffReaders[0].setId(id); 
     299      in = new RandomAccessStream(id); 
     300 
     301      Hashtable[] ifds = TiffTools.getIFDs(in); 
     302 
     303      int[] ch = new int[ifds.length]; 
     304      int[] idx = new int[ifds.length]; 
     305      long[] stamp = new long[ifds.length]; 
     306 
     307      int channelCount = 0; 
     308      SimpleDateFormat fmt = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss.SSS"); 
     309 
     310      for (int i=0; i<ifds.length; i++) { 
     311        String document = 
     312          (String) ifds[i].get(new Integer(TiffTools.DOCUMENT_NAME)); 
     313 
     314        int index = document.indexOf("INDEX"); 
     315        String c = document.substring(8, index).trim(); 
     316        ch[i] = Integer.parseInt(c); 
     317        if (ch[i] > channelCount) channelCount = ch[i]; 
     318 
     319        String n = document.substring(index + 6, 
     320          document.indexOf(" ", index + 6)).trim(); 
     321        idx[i] = Integer.parseInt(n); 
     322 
     323        String date = document.substring(document.indexOf(" ", index + 6), 
     324          document.indexOf("FORMAT")).trim(); 
     325        stamp[i] = fmt.parse(date, new ParsePosition(0)).getTime(); 
     326      } 
     327 
     328      core.sizeT[0] = 0; 
     329      core.currentOrder[0] = core.rgb[0] ? "XYC" : "XY"; 
     330 
     331      // determine the axis sizes and ordering 
     332      boolean unique = true; 
     333      for (int i=0; i<stamp.length; i++) { 
     334        for (int j=i+1; j<stamp.length; j++) { 
     335          if (stamp[j] == stamp[i]) { 
     336            unique = false; 
     337            break; 
     338          } 
     339        } 
     340        if (unique) { 
     341          core.sizeT[0]++; 
     342          if (core.currentOrder[0].indexOf("T") < 0) { 
     343            core.currentOrder[0] += "T"; 
     344          } 
     345        } 
     346        else if (i > 0) { 
     347          if ((ch[i] != ch[i - 1]) && core.currentOrder[0].indexOf("C") < 0) { 
     348            core.currentOrder[0] += "C"; 
     349          } 
     350          else if (core.currentOrder[0].indexOf("Z") < 0) { 
     351            core.currentOrder[0] += "Z"; 
     352          } 
     353        } 
     354        unique = true; 
     355      } 
     356 
     357      if (core.currentOrder[0].indexOf("Z") < 0) core.currentOrder[0] += "Z"; 
     358      if (core.currentOrder[0].indexOf("C") < 0) core.currentOrder[0] += "C"; 
     359      if (core.currentOrder[0].indexOf("T") < 0) core.currentOrder[0] += "T"; 
     360 
     361      if (core.sizeT[0] == 0) core.sizeT[0] = 1; 
     362      if (channelCount == 0) channelCount = 1; 
     363      core.sizeZ[0] = ifds.length / (core.sizeT[0] * channelCount); 
     364      core.sizeC[0] *= channelCount; 
     365      core.imageCount[0] = core.sizeZ[0] * core.sizeT[0] * channelCount; 
     366 
     367      // cut up comment 
     368 
     369      String comment = 
     370        (String) TiffTools.getIFDValue(ifds[0], TiffTools.IMAGE_DESCRIPTION); 
     371      if (comment != null && comment.startsWith("[")) { 
     372        StringTokenizer st = new StringTokenizer(comment, "\n"); 
     373        while (st.hasMoreTokens()) { 
     374          String token = st.nextToken(); 
     375          if (!token.startsWith("[")) { 
     376            int eq = token.indexOf("="); 
     377            String key = token.substring(0, eq); 
     378            String value = token.substring(eq + 1); 
     379            addMeta(key, value); 
     380          } 
     381        } 
     382        metadata.remove("Comment"); 
     383      } 
     384      core = tiffReaders[0].getCoreMetadata(); 
     385    } 
     386 
     387  } 
     388 
     389  // -- Helper class -- 
     390 
     391  /** SAX handler for parsing XML. */ 
     392  class TCSHandler extends DefaultHandler { 
     393    private String series = "", fullSeries = ""; 
     394    private int count = 0; 
     395    private boolean firstElement = true; 
     396 
     397    public void startElement(String uri, String localName, String qName, 
     398      Attributes attributes) 
     399    { 
     400      if (qName.equals("Element")) { 
     401        if (!attributes.getValue("Name").equals("DCROISet") && !firstElement) { 
     402          series = attributes.getValue("Name"); 
     403          containerNames.add(series); 
     404          if (fullSeries == null || fullSeries.equals("")) fullSeries = series; 
     405          else fullSeries = "/" + series; 
     406        } 
     407        else if (firstElement) firstElement = false; 
     408      } 
     409      else if (qName.equals("Experiment")) { 
     410        for (int i=0; i<attributes.getLength(); i++) { 
     411          addMeta(attributes.getQName(i), attributes.getValue(i)); 
     412        } 
     413      } 
     414      else if (qName.equals("Image")) { 
     415        containerNames.remove(series); 
     416        if (containerCounts.size() < containerNames.size()) { 
     417          containerCounts.add(new Integer(1)); 
     418        } 
     419        else if (containerCounts.size() > 0) { 
     420          int ndx = containerCounts.size() - 1; 
     421          int n = ((Integer) containerCounts.get(ndx)).intValue(); 
     422          containerCounts.setElementAt(new Integer(n + 1), ndx); 
     423        } 
     424        if (fullSeries == null || fullSeries.equals("")) fullSeries = series; 
     425        seriesNames.add(fullSeries); 
     426      } 
     427      else if (qName.equals("ChannelDescription")) { 
     428        String prefix = fullSeries + " - Channel " + count + " - "; 
     429        for (int i=0; i<attributes.getLength(); i++) { 
     430          addMeta(prefix + attributes.getQName(i), attributes.getValue(i)); 
     431        } 
     432        count++; 
     433        if (c.size() > seriesNames.size() - 1) { 
     434          c.setElementAt(new Integer(count), seriesNames.size() - 1); 
     435        } 
     436        else c.add(new Integer(count)); 
     437      } 
     438      else if (qName.equals("DimensionDescription")) { 
     439        String prefix = fullSeries + " - Dimension " + count + " - "; 
     440        for (int i=0; i<attributes.getLength(); i++) { 
     441          addMeta(prefix + attributes.getQName(i), attributes.getValue(i)); 
     442        } 
     443        int len = Integer.parseInt(attributes.getValue("NumberOfElements")); 
     444        int id = Integer.parseInt(attributes.getValue("DimID")); 
     445        float size = Float.parseFloat(attributes.getValue("Length")); 
     446        if (size < 0) size *= -1; 
     447 
     448        switch (id) { 
     449          case 1: 
     450            x.add(new Integer(len)); 
     451            xcal.add(new Float((size * 1000000) / len)); 
     452            int b = Integer.parseInt(attributes.getValue("BytesInc")); 
     453            bits.add(new Integer(b * 8)); 
     454            break; 
     455          case 2: 
     456            y.add(new Integer(len)); 
     457            ycal.add(new Float((size * 1000000) / len)); 
     458            break; 
     459          case 3: 
     460            z.add(new Integer(len)); 
     461            zcal.add(new Float((size * 1000000) / len)); 
     462            break; 
     463          default: 
     464            t.add(new Integer(len)); 
     465            break; 
     466        } 
     467      } 
     468      else if (qName.equals("ScannerSettingRecord")) { 
     469        String key = attributes.getValue("Identifier") + " - " + 
     470          attributes.getValue("Description"); 
     471        addMeta(fullSeries + " - " + key, attributes.getValue("Variant")); 
     472      } 
     473      else if (qName.equals("FilterSettingRecord")) { 
     474        String key = attributes.getValue("ObjectName") + " - " + 
     475          attributes.getValue("Description") + " - " + 
     476          attributes.getValue("Attribute"); 
     477        for (int i=0; i<attributes.getLength(); i++) { 
     478          addMeta(key + " - " + attributes.getQName(i), 
     479            attributes.getValue(i)); 
     480        } 
     481      } 
     482      else if (qName.equals("ATLConfocalSettingDefinition")) { 
     483        if (fullSeries.endsWith(" - Master sequential setting")) { 
     484          fullSeries = fullSeries.replaceAll(" - Master sequential setting", 
     485            " - Sequential Setting 0"); 
     486        } 
     487 
     488        if (fullSeries.indexOf(" - Sequential Setting ") == -1) { 
     489          fullSeries += " - Master sequential setting"; 
     490        } 
     491        else { 
     492          int ndx = fullSeries.indexOf(" - Sequential Setting ") + 22; 
     493          int n = Integer.parseInt(fullSeries.substring(ndx)) + 1; 
     494          fullSeries = fullSeries.substring(0, ndx) + String.valueOf(n); 
     495        } 
     496        for (int i=0; i<attributes.getLength(); i++) { 
     497          addMeta(fullSeries + " - " + attributes.getQName(i), 
     498            attributes.getValue(i)); 
     499        } 
     500      } 
     501      else if (qName.equals("Wheel")) { 
     502        String prefix = fullSeries + " - Wheel " + count + " - "; 
     503        for (int i=0; i<attributes.getLength(); i++) { 
     504          addMeta(prefix + " - " + attributes.getQName(i), 
     505            attributes.getValue(i)); 
     506        } 
     507        count++; 
     508      } 
     509      else if (qName.equals("WheelName")) { 
     510        String prefix = 
     511          fullSeries + " - Wheel " + (count - 1) + " - WheelName "; 
     512        int ndx = 0; 
     513        while (getMeta(prefix + ndx) != null) ndx++; 
     514        addMeta(prefix + ndx, attributes.getValue("FilterName")); 
     515      } 
     516      else if (qName.equals("MultiBand")) { 
     517        String prefix = fullSeries + " - MultiBand Channel " + 
     518          attributes.getValue("Channel") + " - "; 
     519        for (int i=0; i<attributes.getLength(); i++) { 
     520          addMeta(prefix + " - " + attributes.getQName(i), 
     521            attributes.getValue(i)); 
     522        } 
     523      } 
     524      else if (qName.equals("LaserLineSetting")) { 
     525        String prefix = fullSeries + " - LaserLine " + 
     526          attributes.getValue("LaserLine") + " - "; 
     527        for (int i=0; i<attributes.getLength(); i++) { 
     528          addMeta(prefix + " - " + attributes.getQName(i), 
     529            attributes.getValue(i)); 
     530        } 
     531      } 
     532      else if (qName.equals("Detector")) { 
     533        String prefix = fullSeries + " - Detector Channel "+ 
     534          attributes.getValue("Channel") + " - "; 
     535        for (int i=0; i<attributes.getLength(); i++) { 
     536          addMeta(prefix + " - " + attributes.getQName(i), 
     537            attributes.getValue(i)); 
     538        } 
     539      } 
     540      else if (qName.equals("Laser")) { 
     541        String prefix = fullSeries + " Laser " + 
     542          attributes.getValue("LaserName") + " - "; 
     543        for (int i=0; i<attributes.getLength(); i++) { 
     544          addMeta(prefix + " - " + attributes.getQName(i), 
     545            attributes.getValue(i)); 
     546        } 
     547      } 
     548      else if (qName.equals("TimeStamp")) { 
     549        long high = Long.parseLong(attributes.getValue("HighInteger")); 
     550        long low = Long.parseLong(attributes.getValue("LowInteger")); 
     551 
     552        high <<= 32; 
     553        if ((int) low < 0) { 
     554          low &= 0xffffffffL; 
     555        } 
     556        long stamp = high + low; 
     557        long ms = stamp / 10000; 
     558 
     559        String n = String.valueOf(count); 
     560        while (n.length() < 4) n = "0" + n; 
     561        addMeta(fullSeries + " - TimeStamp " + n, 
     562          DataTools.convertDate(ms, DataTools.COBOL)); 
     563        count++; 
     564      } 
     565      else if (qName.equals("ChannelScalingInfo")) { 
     566        String prefix = fullSeries + " - ChannelScalingInfo " + count + " - "; 
     567        for (int i=0; i<attributes.getLength(); i++) { 
     568          addMeta(prefix + " - " + attributes.getQName(i), 
     569            attributes.getValue(i)); 
     570        } 
     571      } 
     572      else if (qName.equals("RelTimeStamp")) { 
     573        addMeta(fullSeries + " RelTimeStamp " + attributes.getValue("Frame"), 
     574          attributes.getValue("Time")); 
     575      } 
     576      else count = 0; 
    152577    } 
    153578  } 
Note: See TracChangeset for help on using the changeset viewer.