Changeset 6190


Ignore:
Timestamp:
04/25/10 13:46:15 (10 years ago)
Author:
melissa
Message:
  • Updated remaining readers to respect MetadataOptions.
  • Added bounds checking to MDB Tools' text field retrieval.
  • Reverted one of the changes to RandomAccessInputStream.findString in r6188.
Location:
trunk/components
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/APLReader.java

    r6026 r6190  
    155155    // add full table to metadata hashtable 
    156156 
    157     for (int i=1; i<rows.size(); i++) { 
    158       String[] row = rows.get(i); 
    159       for (int q=0; q<row.length; q++) { 
    160         addGlobalMeta(columnNames[q] + " " + i, row[q]); 
     157    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     158      for (int i=1; i<rows.size(); i++) { 
     159        String[] row = rows.get(i); 
     160        for (int q=0; q<row.length; q++) { 
     161          addGlobalMeta(columnNames[q] + " " + i, row[q]); 
     162        } 
    161163      } 
    162164    } 
     
    209211      if (file.equals("")) continue; 
    210212      file = topDirectory + File.separator + file; 
    211       if (new Location(file).exists() && file.toLowerCase().endsWith(".tif")) { 
    212         seriesIndexes.add(new Integer(i)); 
     213      if (new Location(file).exists() && checkSuffix(file, "tif")) { 
     214        seriesIndexes.add(i); 
    213215      } 
    214216    } 
     
    224226 
    225227    for (int i=0; i<seriesCount; i++) { 
    226       int secondRow = seriesIndexes.get(i).intValue(); 
     228      int secondRow = seriesIndexes.get(i); 
    227229      int firstRow = secondRow - 1; 
    228230      String[] row2 = rows.get(firstRow); 
    229231      String[] row3 = rows.get(secondRow); 
    230232 
    231       try { 
    232         core[i].sizeT = Integer.parseInt(row3[frames]); 
    233       } 
    234       catch (NumberFormatException e) { 
    235         core[i].sizeT = 1; 
    236       } 
    237       try { 
    238         core[i].sizeZ = Integer.parseInt(row3[zLayers]); 
    239       } 
    240       catch (NumberFormatException e) { 
    241         core[i].sizeZ = 1; 
    242       } 
    243       try { 
    244         core[i].sizeC = Integer.parseInt(row3[colorChannels]); 
    245       } 
    246       catch (NumberFormatException e) { 
    247         core[i].sizeC = 1; 
    248       } 
     233      core[i].sizeT = parseDimension(row3[frames]); 
     234      core[i].sizeZ = parseDimension(row3[zLayers]); 
     235      core[i].sizeC = parseDimension(row3[colorChannels]); 
    249236      core[i].dimensionOrder = "XYCZT"; 
    250237 
     
    282269 
    283270    for (int i=0; i<seriesCount; i++) { 
    284       String[] row = rows.get(seriesIndexes.get(i).intValue()); 
     271      String[] row = rows.get(seriesIndexes.get(i)); 
    285272 
    286273      // populate Image data 
     
    288275      store.setImageName(row[imageName], i); 
    289276 
    290       // populate Dimensions data 
    291  
    292       // calculate physical X and Y sizes 
    293  
    294       float realWidth = Float.parseFloat(row[calibratedWidth]); 
    295       float realHeight = Float.parseFloat(row[calibratedHeight]); 
    296  
    297       String units = row[calibrationUnit]; 
    298  
    299       float px = realWidth / core[i].sizeX; 
    300       float py = realHeight / core[i].sizeY; 
    301  
    302       if (units.equals("mm")) { 
    303         px *= 1000; 
    304         py *= 1000; 
    305       } 
    306       // TODO : add cases for other units 
    307  
    308       store.setDimensionsPhysicalSizeX(new Double(px), i, 0); 
    309       store.setDimensionsPhysicalSizeY(new Double(py), i, 0); 
     277      if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     278        // populate Dimensions data 
     279 
     280        // calculate physical X and Y sizes 
     281 
     282        double realWidth = Double.parseDouble(row[calibratedWidth]); 
     283        double realHeight = Double.parseDouble(row[calibratedHeight]); 
     284 
     285        String units = row[calibrationUnit]; 
     286 
     287        double px = realWidth / core[i].sizeX; 
     288        double py = realHeight / core[i].sizeY; 
     289 
     290        if (units.equals("mm")) { 
     291          px *= 1000; 
     292          py *= 1000; 
     293        } 
     294        // TODO : add cases for other units 
     295 
     296        store.setDimensionsPhysicalSizeX(px, i, 0); 
     297        store.setDimensionsPhysicalSizeY(py, i, 0); 
     298      } 
     299    } 
     300  } 
     301 
     302  // -- Helper methods -- 
     303 
     304  /** 
     305   * Parse an integer from the given dimension String. 
     306   * 
     307   * @return the parsed integer, or 1 if parsing failed. 
     308   */ 
     309  private int parseDimension(String dim) { 
     310    try { 
     311      return Integer.parseInt(dim); 
     312    } 
     313    catch (NumberFormatException e) { 
     314      return 1; 
    310315    } 
    311316  } 
  • trunk/components/bio-formats/src/loci/formats/in/AVIReader.java

    r6026 r6190  
    265265 
    266266      if (listString.equals("JUNK")) { 
    267         type = in.readString(4); 
    268         size = in.readInt(); 
     267        readTypeAndSize(); 
    269268 
    270269        if (type.equals("JUNK")) { 
     
    282281          if (type.equals("LIST")) { 
    283282            if (fcc.equals("hdrl")) { 
    284               type = in.readString(4); 
    285               size = in.readInt(); 
     283              readTypeAndSize(); 
    286284              if (type.equals("avih")) { 
    287285                spos = in.getFilePointer(); 
     
    321319          if (type.equals("LIST")) { 
    322320            if (fcc.equals("strl")) { 
    323               type = in.readString(4); 
    324               size = in.readInt(); 
     321              readTypeAndSize(); 
    325322 
    326323              if (type.equals("strh")) { 
     
    337334              } 
    338335 
    339               type = in.readString(4); 
    340               size = in.readInt(); 
     336              readTypeAndSize(); 
    341337              if (type.equals("strf")) { 
    342338                spos = in.getFilePointer(); 
     
    409405 
    410406            spos = in.getFilePointer(); 
    411             type = in.readString(4); 
    412             size = in.readInt(); 
     407            readTypeAndSize(); 
    413408            if (type.equals("strd")) { 
    414409              in.skipBytes(size); 
     
    419414 
    420415            spos = in.getFilePointer(); 
    421             type = in.readString(4); 
    422             size = in.readInt(); 
     416            readTypeAndSize(); 
    423417            if (type.equals("strn")) { 
    424418              in.skipBytes(size); 
     
    448442 
    449443              spos = in.getFilePointer(); 
    450               type = in.readString(4); 
     444              readTypeAndSize(); 
    451445              if (type.startsWith("ix")) { 
    452                 size = in.readInt(); 
    453446                in.skipBytes(size); 
    454                 type = in.readString(4); 
    455                 size = in.readInt(); 
     447                readTypeAndSize(); 
    456448              } 
    457               else { 
    458                 size = in.readInt(); 
    459               } 
    460  
    461               while (type.substring(2).equals("db") || 
    462                 type.substring(2).equals("dc") || 
    463                 type.substring(2).equals("wb")) 
     449 
     450              String check = type.substring(2); 
     451              while (check.equals("db") || check.equals("dc") || 
     452                check.equals("wb")) 
    464453              { 
    465                 if (type.substring(2).equals("db") || 
    466                   type.substring(2).equals("dc")) 
    467                 { 
    468                   if (size > 0) { 
     454                if (check.startsWith("d")) { 
     455                  if (size > 0 || bmpCompression != 0) { 
    469456                    offsets.add(new Long(in.getFilePointer())); 
    470457                    lengths.add(new Long(size)); 
     
    475462                spos = in.getFilePointer(); 
    476463 
    477                 type = in.readString(4); 
    478                 size = in.readInt(); 
     464                readTypeAndSize(); 
    479465                if (type.equals("JUNK")) { 
    480466                  in.skipBytes(size); 
    481467                  spos = in.getFilePointer(); 
    482                   type = in.readString(4); 
    483                   size = in.readInt(); 
    484                 } 
     468                  readTypeAndSize(); 
     469                } 
     470                check = type.substring(2); 
    485471              } 
    486472              in.seek(spos); 
     
    495481      else { 
    496482        // skipping unknown block 
    497         type = in.readString(4); 
     483        readTypeAndSize(); 
    498484        if (in.getFilePointer() + size + 4 <= in.length()) { 
    499           size = in.readInt(); 
    500485          in.skipBytes(size); 
    501486        } 
     
    506491 
    507492    core[0].imageCount = offsets.size(); 
    508  
    509493    core[0].sizeZ = 1; 
    510494    core[0].sizeT = getImageCount(); 
    511495    core[0].littleEndian = true; 
    512496    core[0].interleaved = bmpBitsPerPixel != 16; 
     497 
    513498    if (bmpBitsPerPixel == 32) { 
    514499      core[0].sizeC = 4; 
     
    516501    } 
    517502    else if (bytesPerPlane == 0 || bmpBitsPerPixel == 24) { 
    518       core[0].rgb = bmpBitsPerPixel > 8 || (bmpCompression != 0); 
     503      core[0].rgb = bmpBitsPerPixel > 8 || (bmpCompression != 0 && lut == null); 
    519504      core[0].sizeC = isRGB() ? 3 : 1; 
    520505    } 
     
    595580 
    596581  private void readChunkHeader() throws IOException { 
     582    readTypeAndSize(); 
     583    fcc = in.readString(4); 
     584  } 
     585 
     586  private void readTypeAndSize() throws IOException { 
    597587    type = in.readString(4); 
    598588    size = in.readInt(); 
    599     fcc = in.readString(4); 
    600589  } 
    601590 
  • trunk/components/bio-formats/src/loci/formats/in/ICSReader.java

    r6118 r6190  
    3131import java.util.zip.GZIPInputStream; 
    3232 
     33import loci.common.ByteArrayHandle; 
    3334import loci.common.DateTools; 
    3435import loci.common.Location; 
     
    3839import loci.formats.FormatTools; 
    3940import loci.formats.MetadataTools; 
    40 import loci.formats.codec.ByteVector; 
    4141import loci.formats.meta.FilterMetadata; 
    4242import loci.formats.meta.MetadataStore; 
     
    723723      in.read(data); 
    724724      byte[] buf = new byte[8192]; 
    725       ByteVector v = new ByteVector(); 
     725      ByteArrayHandle v = new ByteArrayHandle(); 
    726726      try { 
    727727        GZIPInputStream r = new GZIPInputStream(new ByteArrayInputStream(data)); 
    728728        int n = r.read(buf, 0, buf.length); 
    729729        while (n > 0) { 
    730           v.add(buf, 0, n); 
     730          v.write(buf, 0, n); 
    731731          n = r.read(buf, 0, buf.length); 
    732732        } 
    733733        r.close(); 
    734         data = v.toByteArray(); 
     734        data = v.getBytes(); 
    735735        Location.mapFile("data.gz", null); 
    736736      } 
  • trunk/components/bio-formats/src/loci/formats/in/MNGReader.java

    r6026 r6190  
    2828import java.io.IOException; 
    2929import java.util.Hashtable; 
    30 import java.util.StringTokenizer; 
    3130import java.util.Vector; 
    3231 
     
    5857  // -- Fields -- 
    5958 
    60   /** Offsets to each plane. */ 
    61   private Vector[] offsets; 
    62  
    63   /** Length (in bytes) of each plane. */ 
    64   private Vector[] lengths; 
     59  private Vector<SeriesInfo> seriesInfo; 
    6560 
    6661  // -- Constructor -- 
     
    8782    FormatTools.checkPlaneParameters(this, no, -1, x, y, w, h); 
    8883 
    89     long offset = ((Long) offsets[series].get(no)).longValue(); 
     84    SeriesInfo info = seriesInfo.get(series); 
     85    long offset = info.offsets.get(no); 
    9086    in.seek(offset); 
    91     long end = ((Long) lengths[series].get(no)).longValue(); 
    92     byte[] b = new byte[(int) (end - offset + 8)]; 
    93     in.read(b, 8, b.length - 8); 
    94     b[0] = (byte) 0x89; 
    95     b[1] = 0x50; 
    96     b[2] = 0x4e; 
    97     b[3] = 0x47; 
    98     b[4] = 0x0d; 
    99     b[5] = 0x0a; 
    100     b[6] = 0x1a; 
    101     b[7] = 0x0a; 
    102  
    103     BufferedImage img = ImageIO.read(new ByteArrayInputStream(b)); 
     87    long end = info.lengths.get(no); 
     88    BufferedImage img = readImage(end); 
    10489    img = img.getSubimage(x, y, w, h); 
    10590 
     
    121106  public void close(boolean fileOnly) throws IOException { 
    122107    super.close(fileOnly); 
    123     if (!fileOnly) offsets = lengths = null; 
     108    if (!fileOnly) seriesInfo = null; 
    124109  } 
    125110 
     
    134119    LOGGER.info("Verifying MNG format"); 
    135120 
    136     offsets = new Vector[1]; 
    137     lengths = new Vector[1]; 
    138  
    139     offsets[0] = new Vector(); 
    140     lengths[0] = new Vector(); 
     121    seriesInfo = new Vector<SeriesInfo>(); 
     122    seriesInfo.add(new SeriesInfo()); 
    141123 
    142124    in.skipBytes(12); 
     
    165147 
    166148      if (code.equals("IHDR")) { 
    167         offsets[0].add(new Long(fp - 8)); 
     149        seriesInfo.get(0).offsets.add(fp - 8); 
    168150      } 
    169151      else if (code.equals("IEND")) { 
    170         lengths[0].add(new Long(fp + len + 4)); 
     152        seriesInfo.get(0).lengths.add(fp + len + 4); 
    171153      } 
    172154      else if (code.equals("LOOP")) { 
    173         stack.add(new Long(fp + len + 4)); 
     155        stack.add(fp + len + 4); 
    174156        in.skipBytes(1); 
    175157        maxIterations = in.readInt(); 
     
    198180    Hashtable<String, Vector> seriesLengths = new Hashtable<String, Vector>(); 
    199181 
    200     for (int i=0; i<offsets[0].size(); i++) { 
    201       long offset = ((Long) offsets[0].get(i)).longValue(); 
     182    SeriesInfo info = seriesInfo.get(0); 
     183    addGlobalMeta("Number of frames", info.offsets.size()); 
     184    for (int i=0; i<info.offsets.size(); i++) { 
     185      long offset = info.offsets.get(i); 
    202186      in.seek(offset); 
    203       long end = ((Long) lengths[0].get(i)).longValue(); 
     187      long end = info.lengths.get(i); 
    204188      if (end < offset) continue; 
    205       byte[] b = new byte[(int) (end - offset + 8)]; 
    206       in.read(b, 8, b.length - 8); 
    207       b[0] = (byte) 0x89; 
    208       b[1] = 0x50; 
    209       b[2] = 0x4e; 
    210       b[3] = 0x47; 
    211       b[4] = 0x0d; 
    212       b[5] = 0x0a; 
    213       b[6] = 0x1a; 
    214       b[7] = 0x0a; 
    215  
    216       BufferedImage img = ImageIO.read(new ByteArrayInputStream(b)); 
     189      BufferedImage img = readImage(end); 
    217190      String data = img.getWidth() + "-" + img.getHeight() + "-" + 
    218         img.getRaster().getNumBands() + "-" + 
    219         AWTImageTools.getPixelType(img); 
    220       Vector v = new Vector(); 
     191        img.getRaster().getNumBands() + "-" + AWTImageTools.getPixelType(img); 
     192      Vector<Long> v = new Vector<Long>(); 
    221193      if (seriesOffsets.containsKey(data)) { 
    222194        v = seriesOffsets.get(data); 
     
    241213    core = new CoreMetadata[keys.length]; 
    242214 
    243     offsets = new Vector[keys.length]; 
    244     lengths = new Vector[keys.length]; 
     215    seriesInfo.clear(); 
    245216    for (int i=0; i<keys.length; i++) { 
    246217      core[i] = new CoreMetadata(); 
    247       StringTokenizer st = new StringTokenizer(keys[i], "-"); 
    248       core[i].sizeX = Integer.parseInt(st.nextToken()); 
    249       core[i].sizeY = Integer.parseInt(st.nextToken()); 
    250       core[i].sizeC = Integer.parseInt(st.nextToken()); 
    251       core[i].pixelType = Integer.parseInt(st.nextToken()); 
     218      String[] tokens = keys[i].split("-"); 
     219      core[i].sizeX = Integer.parseInt(tokens[0]); 
     220      core[i].sizeY = Integer.parseInt(tokens[1]); 
     221      core[i].sizeC = Integer.parseInt(tokens[2]); 
     222      core[i].pixelType = Integer.parseInt(tokens[3]); 
    252223      core[i].rgb = core[i].sizeC > 1; 
    253       offsets[i] = seriesOffsets.get(keys[i]); 
    254       core[i].imageCount = offsets[i].size(); 
    255224      core[i].sizeT = core[i].imageCount; 
    256       lengths[i] = seriesLengths.get(keys[i]); 
    257225      core[i].sizeZ = 1; 
    258226      core[i].dimensionOrder = "XYCZT"; 
     
    262230      core[i].littleEndian = false; 
    263231      core[i].falseColor = false; 
     232 
     233      SeriesInfo inf = new SeriesInfo(); 
     234      inf.offsets = seriesOffsets.get(keys[i]); 
     235      inf.lengths = seriesLengths.get(keys[i]); 
     236      seriesInfo.add(inf); 
     237 
     238      core[i].imageCount = inf.offsets.size(); 
    264239    } 
    265240 
     
    273248  } 
    274249 
     250  // -- Helper methods -- 
     251 
     252  private BufferedImage readImage(long end) throws IOException { 
     253    byte[] b = new byte[(int) (end - in.getFilePointer() + 8)]; 
     254    in.read(b, 8, b.length - 8); 
     255    b[0] = (byte) 0x89; 
     256    b[1] = 0x50; 
     257    b[2] = 0x4e; 
     258    b[3] = 0x47; 
     259    b[4] = 0x0d; 
     260    b[5] = 0x0a; 
     261    b[6] = 0x1a; 
     262    b[7] = 0x0a; 
     263    return ImageIO.read(new ByteArrayInputStream(b)); 
     264  } 
     265 
     266  // -- Helper class -- 
     267 
     268  private class SeriesInfo { 
     269    public Vector<Long> offsets = new Vector<Long>(); 
     270    public Vector<Long> lengths = new Vector<Long>(); 
     271  } 
     272 
    275273} 
  • trunk/components/bio-formats/src/loci/formats/in/MRWReader.java

    r6026 r6190  
    5252  public static final String MRW_MAGIC_STRING = "MRM"; 
    5353 
     54  private static final int[] COLOR_MAP_1 = {0, 1, 1, 2}; 
     55  private static final int[] COLOR_MAP_2 = {1, 2, 0, 1}; 
     56 
    5457  // -- Fields -- 
    5558 
     
    138141    } 
    139142 
    140     int[] colorMap = new int[4]; 
    141     if (bayerPattern == 1) { 
    142       colorMap[0] = 0; 
    143       colorMap[1] = 1; 
    144       colorMap[2] = 1; 
    145       colorMap[3] = 2; 
    146     } 
    147     else { 
    148       colorMap[0] = 1; 
    149       colorMap[1] = 2; 
    150       colorMap[2] = 0; 
    151       colorMap[3] = 1; 
    152     } 
     143    int[] colorMap = bayerPattern == 1 ? COLOR_MAP_1 : COLOR_MAP_2; 
    153144 
    154145    return ImageTools.interpolate(s, buf, colorMap, getSizeX(), getSizeY(), 
     
    205196        } 
    206197      } 
    207       else if (blockName.endsWith("RIF")) { 
    208  
    209       } 
    210       else if (blockName.endsWith("TTW")) { 
     198      else if (blockName.endsWith("TTW") && 
     199        getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) 
     200      { 
    211201        byte[] b = new byte[len]; 
    212202        in.read(b); 
     
    215205        IFDList ifds = tp.getIFDs(); 
    216206 
    217         for (int i=0; i<ifds.size(); i++) { 
    218           IFD ifd = ifds.get(i); 
     207        for (IFD ifd : ifds) { 
    219208          Integer[] keys = (Integer[]) ifd.keySet().toArray(new Integer[0]); 
    220209          // CTR FIXME - getIFDTagName is for debugging only! 
  • trunk/components/bio-formats/src/loci/formats/in/MetamorphReader.java

    r6189 r6190  
    2626import java.io.File; 
    2727import java.io.IOException; 
    28 import java.text.DecimalFormat; 
    2928import java.util.Arrays; 
    3029import java.util.Calendar; 
     
    3231import java.util.Vector; 
    3332 
     33import loci.common.DataTools; 
    3434import loci.common.DateTools; 
    3535import loci.common.Location; 
     
    234234      Location parent = new Location(parentPath).getAbsoluteFile(); 
    235235      LOGGER.info("Looking for STK file in {}", parent.getAbsolutePath()); 
    236       String[] dirList = parent.list(); 
    237       for (int i=0; i<dirList.length; i++) { 
    238         if (dirList[i].indexOf(stkFile) != -1 && 
    239           checkSuffix(dirList[i], STK_SUFFIX)) 
     236      String[] dirList = parent.list(true); 
     237      for (String f : dirList) { 
     238        if (f.indexOf(stkFile) != -1 && checkSuffix(f, STK_SUFFIX)) 
    240239        { 
    241           stkFile = new Location( 
    242             parent.getAbsolutePath(), dirList[i]).getAbsolutePath(); 
     240          stkFile = new Location(parent.getAbsolutePath(), f).getAbsolutePath(); 
    243241          break; 
    244242        } 
     
    261259      // let's check the parent directory for an .nd file 
    262260      Location parent = new Location(id).getAbsoluteFile().getParentFile(); 
    263       String[] list = parent.list(); 
    264       for (int i=0; i<list.length; i++) { 
    265         if (checkSuffix(list[i], ND_SUFFIX)) { 
    266           String prefix = list[i].substring(0, list[i].lastIndexOf(".")); 
     261      String[] list = parent.list(true); 
     262      for (String f : list) { 
     263        if (checkSuffix(f, ND_SUFFIX)) { 
     264          String prefix = f.substring(0, f.lastIndexOf(".")); 
    267265          if (currentId.startsWith(prefix)) { 
    268             ndfile = new Location(parent, list[i]).getAbsoluteFile(); 
     266            ndfile = new Location(parent, f).getAbsoluteFile(); 
    269267            break; 
    270268          } 
     
    279277    { 
    280278      // parse key/value pairs from .nd file 
    281  
    282       ndFilename = ndfile.getAbsolutePath(); 
    283  
    284       RandomAccessInputStream ndStream = 
    285         new RandomAccessInputStream(ndFilename); 
    286       String line = ndStream.readLine().trim(); 
    287279 
    288280      int zc = getSizeZ(), cc = getSizeC(), tc = getSizeT(); 
     
    294286      boolean useWaveNames = true; 
    295287 
    296       while (!line.equals("\"EndFile\"")) { 
     288      ndFilename = ndfile.getAbsolutePath(); 
     289      String[] lines = DataTools.readFile(ndFilename).split("\n"); 
     290 
     291      for (String line : lines) { 
    297292        String key = line.substring(1, line.indexOf(",") - 1).trim(); 
    298293        String value = line.substring(line.indexOf(",") + 1).trim(); 
     
    306301        } 
    307302        else if (key.startsWith("WaveName")) { 
    308           waveNames.add(value); 
     303          waveNames.add(value.substring(1, value.length() - 1)); 
    309304        } 
    310305        else if (key.startsWith("Stage")) { 
     
    323318          useWaveNames = Boolean.parseBoolean(value); 
    324319        } 
    325  
    326         line = ndStream.readLine().trim(); 
    327       } 
    328       ndStream.close(); 
     320      } 
    329321 
    330322      // figure out how many files we need 
     
    382374      prefix = prefix.substring(prefix.lastIndexOf(File.separator) + 1, 
    383375        prefix.lastIndexOf(".")); 
    384  
    385       for (int i=0; i<cc; i++) { 
    386         if (i < waveNames.size() && waveNames.get(i) != null) { 
    387           String name = waveNames.get(i); 
    388           waveNames.setElementAt(name.substring(1, name.length() - 1), i); 
    389         } 
    390       } 
    391376 
    392377      // build list of STK files 
     
    426411        for (int f=0; f<stks[s].length; f++) { 
    427412          Location l = new Location(ndfile.getParent(), stks[s][f]); 
    428           if (!l.exists()) { 
    429             // '%' can be converted to '-' 
    430             if (stks[s][f].indexOf("%") != -1) { 
    431               stks[s][f] = stks[s][f].replaceAll("%", "-"); 
    432               l = new Location(ndfile.getParent(), stks[s][f]); 
    433               if (!l.exists()) { 
    434                 // try replacing extension 
    435                 stks[s][f] = stks[s][f].substring(0, 
    436                   stks[s][f].lastIndexOf(".")) + ".TIF"; 
    437                 l = new Location(ndfile.getParent(), stks[s][f]); 
    438                 if (!l.exists()) { 
    439                   stks[s][f] = stks[s][f].substring(0, 
    440                     stks[s][f].lastIndexOf(".")) + ".tif"; 
    441                   l = new Location(ndfile.getParent(), stks[s][f]); 
    442                   if (!l.exists()) { 
    443                     stks[s][f] = null; 
    444                   } 
    445                 } 
    446               } 
    447             } 
    448  
    449             if (!l.exists()) { 
    450               // try replacing extension 
    451               stks[s][f] = stks[s][f].substring(0, 
    452                 stks[s][f].lastIndexOf(".")) + ".TIF"; 
    453               l = new Location(ndfile.getParent(), stks[s][f]); 
    454               if (!l.exists()) { 
    455                 stks[s][f] = stks[s][f].substring(0, 
    456                   stks[s][f].lastIndexOf(".")) + ".tif"; 
    457                 l = new Location(ndfile.getParent(), stks[s][f]); 
    458                 if (!l.exists()) { 
    459                   stks[s][f] = null; 
    460                 } 
    461               } 
    462             } 
    463           } 
    464           if (stks != null && l.exists()) stks[s][f] = l.getAbsolutePath(); 
    465           else if (stks == null) break; 
    466         } 
    467         if (stks == null) break; 
     413          stks[s][f] = getRealSTKFile(l); 
     414        } 
    468415      } 
    469416 
     
    543490      store.setImageInstrumentRef(instrumentID, i); 
    544491 
    545       String comment = null; 
    546  
    547       if (stks != null && stks[i][0] != null) { 
    548         RandomAccessInputStream stream = 
    549           new RandomAccessInputStream(stks[i][0]); 
    550         TiffParser tp = new TiffParser(stream); 
    551         IFD ifd = tp.getFirstIFD(); 
    552         stream.close(); 
    553         comment = ifd.getComment(); 
    554       } 
    555       else { 
    556         comment = ifds.get(0).getComment(); 
    557       } 
     492      String comment = getFirstComment(i); 
    558493      if (comment != null && comment.startsWith("<MetaData>")) { 
    559494        XMLTools.parseXML(comment, handler); 
     
    566501      else if (i > 0) MetadataTools.setDefaultCreationDate(store, id, i); 
    567502 
    568       String name = ""; 
    569       if (stageNames != null && stageNames.size() > 0) { 
    570         int stagePosition = i / (getSeriesCount() / stageNames.size()); 
    571         name += "Stage " + stageNames.get(stagePosition) + "; "; 
    572       } 
    573  
    574       if (firstSeriesChannels != null) { 
    575         for (int c=0; c<firstSeriesChannels.length; c++) { 
    576           if (firstSeriesChannels[c] == ((i % 2) == 0) && c < waveNames.size()) 
    577           { 
    578             name += waveNames.get(c) + "/"; 
    579           } 
    580         } 
    581         if (name.length() > 0) { 
    582           name = name.substring(0, name.length() - 1); 
    583         } 
    584       } 
    585  
    586       store.setImageName(name, i); 
     503      store.setImageName(makeImageName(i), i); 
     504 
     505      if (getMetadataOptions().getMetadataLevel() != MetadataLevel.ALL) { 
     506        continue; 
     507      } 
    587508      store.setImageDescription("", i); 
    588509 
    589       store.setImagingEnvironmentTemperature( 
    590         new Double(handler.getTemperature()), i); 
    591       store.setDimensionsPhysicalSizeX( 
    592         new Double(handler.getPixelSizeX()), i, 0); 
    593       store.setDimensionsPhysicalSizeY( 
    594         new Double(handler.getPixelSizeY()), i, 0); 
     510      store.setImagingEnvironmentTemperature(handler.getTemperature(), i); 
     511      store.setDimensionsPhysicalSizeX(handler.getPixelSizeX(), i, 0); 
     512      store.setDimensionsPhysicalSizeY(handler.getPixelSizeY(), i, 0); 
    595513      if (zDistances != null) { 
    596514        stepSize = zDistances[0]; 
     
    622540        } 
    623541        if (handler.getReadOutRate() != 0) { 
    624           store.setDetectorSettingsReadOutRate( 
    625             new Double(handler.getReadOutRate()), i, c); 
     542          store.setDetectorSettingsReadOutRate(handler.getReadOutRate(), i, c); 
    626543        } 
    627544        store.setDetectorSettingsDetector(detectorID, i, c); 
     
    630547          (int) wave[waveIndex] >= 1) 
    631548        { 
    632           store.setLightSourceSettingsWavelength( 
    633             new Integer((int) wave[waveIndex]), i, c); 
     549          store.setLightSourceSettingsWavelength((int) wave[waveIndex], i, c); 
    634550 
    635551          // link LightSource to Image 
     
    731647    setSeries(0); 
    732648 
    733     store.setDetectorID(detectorID, 0, 0); 
    734     store.setDetectorZoom(zoom, 0, 0); 
    735     if (handler != null && handler.getZoom() != 0) { 
    736       store.setDetectorZoom(handler.getZoom(), 0, 0); 
    737     } 
    738     store.setDetectorType("Unknown", 0, 0); 
     649    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     650      store.setDetectorID(detectorID, 0, 0); 
     651      store.setDetectorZoom(zoom, 0, 0); 
     652      if (handler != null && handler.getZoom() != 0) { 
     653        store.setDetectorZoom(handler.getZoom(), 0, 0); 
     654      } 
     655      store.setDetectorType("Unknown", 0, 0); 
     656    } 
    739657  } 
    740658 
     
    757675      mmPlanes = uic4tagEntry.getValueCount(); 
    758676      parseUIC2Tags(uic2tagEntry.getValueOffset()); 
    759       parseUIC4Tags(uic4tagEntry.getValueOffset()); 
    760       parseUIC1Tags(uic1tagEntry.getValueOffset(), 
    761         uic1tagEntry.getValueCount()); 
     677      if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     678        parseUIC4Tags(uic4tagEntry.getValueOffset()); 
     679        parseUIC1Tags(uic1tagEntry.getValueOffset(), 
     680          uic1tagEntry.getValueCount()); 
     681      } 
    762682      in.seek(uic4tagEntry.getValueOffset()); 
    763683    } 
     
    958878 
    959879  // -- Helper methods -- 
     880 
     881  /** 
     882   * Check that the given STK file exists.  If it does, then return the 
     883   * absolute path.  If it does not, then apply various formatting rules until 
     884   * an existing file is found. 
     885   * 
     886   * @return the absolute path of an STK file, or null if no STK file is found. 
     887   */ 
     888  private String getRealSTKFile(Location l) { 
     889    if (l.exists()) return l.getAbsolutePath(); 
     890    String name = l.getName(); 
     891    String parent = l.getParent(); 
     892 
     893    // '%' can be converted to '-' 
     894    if (name.indexOf("%") != -1) { 
     895      name = name.replaceAll("%", "-"); 
     896      l = new Location(parent, name); 
     897      if (!l.exists()) { 
     898        // try replacing extension 
     899        name = name.substring(0, name.lastIndexOf(".")) + ".TIF"; 
     900        l = new Location(parent, name); 
     901        if (!l.exists()) { 
     902          name = name.substring(0, name.lastIndexOf(".")) + ".tif"; 
     903          l = new Location(parent, name); 
     904          return l.exists() ? l.getAbsolutePath() : null; 
     905        } 
     906      } 
     907    } 
     908 
     909    if (!l.exists()) { 
     910      // try replacing extension 
     911      name = name.substring(0, name.lastIndexOf(".")) + ".TIF"; 
     912      l = new Location(parent, name); 
     913      if (!l.exists()) { 
     914        name = name.substring(0, name.lastIndexOf(".")) + ".tif"; 
     915        l = new Location(parent, name); 
     916        return l.exists() ? l.getAbsolutePath() : null; 
     917      } 
     918    } 
     919    return null; 
     920  } 
     921 
     922  /** 
     923   * Returns the TIFF comment from the first IFD of the first STK file in the 
     924   * given series. 
     925   */ 
     926  private String getFirstComment(int i) throws IOException { 
     927    if (stks != null && stks[i][0] != null) { 
     928      RandomAccessInputStream stream = new RandomAccessInputStream(stks[i][0]); 
     929      TiffParser tp = new TiffParser(stream); 
     930      String comment = tp.getComment(); 
     931      stream.close(); 
     932      return comment; 
     933    } 
     934    return ifds.get(0).getComment(); 
     935  } 
     936 
     937  /** Create an appropriate name for the given series. */ 
     938  private String makeImageName(int i) { 
     939    String name = ""; 
     940    if (stageNames != null && stageNames.size() > 0) { 
     941      int stagePosition = i / (getSeriesCount() / stageNames.size()); 
     942      name += "Stage " + stageNames.get(stagePosition) + "; "; 
     943    } 
     944 
     945    if (firstSeriesChannels != null) { 
     946      for (int c=0; c<firstSeriesChannels.length; c++) { 
     947        if (firstSeriesChannels[c] == ((i % 2) == 0) && c < waveNames.size()) { 
     948          name += waveNames.get(c) + "/"; 
     949        } 
     950      } 
     951      if (name.length() > 0) { 
     952        name = name.substring(0, name.length() - 1); 
     953      } 
     954    } 
     955    return name; 
     956  } 
    960957 
    961958  /** 
     
    12651262  /** Formats an integer value with leading 0s if needed. */ 
    12661263  public static String intFormat(int myint, int digits) { 
    1267     DecimalFormat df = new DecimalFormat(); 
    1268     df.setMaximumIntegerDigits(digits); 
    1269     df.setMinimumIntegerDigits(digits); 
    1270     return df.format(myint); 
     1264    return String.format("%0" + digits + "d", myint); 
    12711265  } 
    12721266 
  • trunk/components/bio-formats/src/loci/formats/in/MicromanagerReader.java

    r6073 r6190  
    185185 
    186186    Location file = new Location(currentId).getAbsoluteFile(); 
    187     metadataFile = file.exists() ? new Location(file.getParentFile(), 
    188       METADATA).getAbsolutePath() : METADATA; 
     187    Location parentFile = file.getParentFile(); 
     188    metadataFile = METADATA; 
     189    String parent = ""; 
     190    if (file.exists()) { 
     191      metadataFile = new Location(parentFile, METADATA).getAbsolutePath(); 
     192      parent = parentFile.getAbsolutePath() + File.separator; 
     193    } 
    189194    in = new RandomAccessInputStream(metadataFile); 
    190     String parent = file.exists() ? 
    191       file.getParentFile().getAbsolutePath() + File.separator : ""; 
    192195 
    193196    // usually a small file, so we can afford to read it into memory 
     
    352355    // build list of TIFF files 
    353356 
    354     String prefix = ""; 
    355     if (baseTiff.indexOf(File.separator) != -1) { 
    356       prefix = baseTiff.substring(0, baseTiff.lastIndexOf(File.separator) + 1); 
    357       baseTiff = baseTiff.substring(baseTiff.lastIndexOf(File.separator) + 1); 
    358     } 
    359  
    360     String[] blocks = baseTiff.split("_"); 
    361     StringBuffer filename = new StringBuffer(); 
    362     for (int t=0; t<getSizeT(); t++) { 
    363       for (int c=0; c<getSizeC(); c++) { 
    364         for (int z=0; z<getSizeZ(); z++) { 
    365           // file names are of format: 
    366           // img_<T>_<channel name>_<T>.tif 
    367           filename.append(prefix); 
    368           filename.append(blocks[0]); 
    369           filename.append("_"); 
    370  
    371           int zeros = blocks[1].length() - String.valueOf(t).length(); 
    372           for (int q=0; q<zeros; q++) { 
    373             filename.append("0"); 
    374           } 
    375           filename.append(t); 
    376           filename.append("_"); 
    377  
    378           filename.append(channels[c]); 
    379           filename.append("_"); 
    380  
    381           zeros = blocks[3].length() - String.valueOf(z).length() - 4; 
    382           for (int q=0; q<zeros; q++) { 
    383             filename.append("0"); 
    384           } 
    385           filename.append(z); 
    386           filename.append(".tif"); 
    387  
    388           tiffs.add(filename.toString()); 
    389           filename.delete(0, filename.length()); 
    390         } 
    391       } 
    392     } 
     357    buildTIFFList(baseTiff); 
    393358 
    394359    if (tiffs.size() == 0) { 
     
    402367      for (String f : files) { 
    403368        if (checkSuffix(f, "tif") || checkSuffix(f, "tiff")) { 
    404           blocks = f.split("_"); 
     369          String[] blocks = f.split("_"); 
    405370          if (!uniqueT.contains(blocks[1])) uniqueT.add(blocks[1]); 
    406371          if (!uniqueC.contains(blocks[2])) uniqueC.add(blocks[2]); 
     
    440405      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    441406    MetadataTools.populatePixels(store, this, true); 
    442     store.setImageDescription(comment, 0); 
    443407    if (time != null) { 
    444408      long stamp = DateTools.getTime(time, DATE_FORMAT); 
     
    448412    else MetadataTools.setDefaultCreationDate(store, id, 0); 
    449413 
    450     // link Instrument and Image 
    451     String instrumentID = MetadataTools.createLSID("Instrument", 0); 
    452     store.setInstrumentID(instrumentID, 0); 
    453     store.setImageInstrumentRef(instrumentID, 0); 
    454  
    455     for (int i=0; i<channels.length; i++) { 
    456       store.setLogicalChannelName(channels[i], 0, i); 
    457     } 
    458  
    459     store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
    460     store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
    461     store.setDimensionsPhysicalSizeZ(sliceThickness, 0, 0); 
    462  
    463     for (int i=0; i<getImageCount(); i++) { 
    464       store.setPlaneTimingExposureTime(exposureTime, 0, 0, i); 
    465       if (i < timestamps.length) { 
    466         store.setPlaneTimingDeltaT(timestamps[i], 0, 0, i); 
    467       } 
    468     } 
    469  
    470     if (detectorID == null) { 
    471       detectorID = MetadataTools.createLSID("Detector", 0, 0); 
    472     } 
    473     else { 
    474       detectorID = detectorID.substring(detectorID.lastIndexOf(":") + 1); 
    475       detectorID = "Detector:" + detectorID.trim(); 
    476     } 
    477  
    478     for (int i=0; i<channels.length; i++) { 
    479       store.setDetectorSettingsBinning(binning, 0, i); 
    480       store.setDetectorSettingsGain(new Double(gain), 0, i); 
    481       if (i < voltage.size()) { 
    482         store.setDetectorSettingsVoltage(voltage.get(i), 0, i); 
    483       } 
    484       store.setDetectorSettingsDetector(detectorID, 0, i); 
    485     } 
    486  
    487     store.setDetectorID(detectorID, 0, 0); 
    488     if (detectorModel != null) { 
    489       store.setDetectorModel(detectorModel, 0, 0); 
    490     } 
    491  
    492     if (detectorManufacturer != null) { 
    493       store.setDetectorManufacturer(detectorManufacturer, 0, 0); 
    494     } 
    495  
    496     if (cameraMode == null) cameraMode = "Unknown"; 
    497     store.setDetectorType(cameraMode, 0, 0); 
    498  
    499     store.setImagingEnvironmentTemperature(temperature, 0); 
     414    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     415      store.setImageDescription(comment, 0); 
     416 
     417      // link Instrument and Image 
     418      String instrumentID = MetadataTools.createLSID("Instrument", 0); 
     419      store.setInstrumentID(instrumentID, 0); 
     420      store.setImageInstrumentRef(instrumentID, 0); 
     421 
     422      for (int i=0; i<channels.length; i++) { 
     423        store.setLogicalChannelName(channels[i], 0, i); 
     424      } 
     425 
     426      store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
     427      store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
     428      store.setDimensionsPhysicalSizeZ(sliceThickness, 0, 0); 
     429 
     430      for (int i=0; i<getImageCount(); i++) { 
     431        store.setPlaneTimingExposureTime(exposureTime, 0, 0, i); 
     432        if (i < timestamps.length) { 
     433          store.setPlaneTimingDeltaT(timestamps[i], 0, 0, i); 
     434        } 
     435      } 
     436 
     437      if (detectorID == null) { 
     438        detectorID = MetadataTools.createLSID("Detector", 0, 0); 
     439      } 
     440      else { 
     441        detectorID = detectorID.substring(detectorID.lastIndexOf(":") + 1); 
     442        detectorID = "Detector:" + detectorID.trim(); 
     443      } 
     444 
     445      for (int i=0; i<channels.length; i++) { 
     446        store.setDetectorSettingsBinning(binning, 0, i); 
     447        store.setDetectorSettingsGain(new Double(gain), 0, i); 
     448        if (i < voltage.size()) { 
     449          store.setDetectorSettingsVoltage(voltage.get(i), 0, i); 
     450        } 
     451        store.setDetectorSettingsDetector(detectorID, 0, i); 
     452      } 
     453 
     454      store.setDetectorID(detectorID, 0, 0); 
     455      if (detectorModel != null) { 
     456        store.setDetectorModel(detectorModel, 0, 0); 
     457      } 
     458 
     459      if (detectorManufacturer != null) { 
     460        store.setDetectorManufacturer(detectorManufacturer, 0, 0); 
     461      } 
     462 
     463      if (cameraMode == null) cameraMode = "Unknown"; 
     464      store.setDetectorType(cameraMode, 0, 0); 
     465 
     466      store.setImagingEnvironmentTemperature(temperature, 0); 
     467    } 
     468  } 
     469 
     470  // -- Helper methods -- 
     471 
     472  /** 
     473   * Populate the list of TIFF files using the given file name as a pattern. 
     474   */ 
     475  private void buildTIFFList(String baseTiff) { 
     476    LOGGER.info("Building list of TIFFs"); 
     477    String prefix = ""; 
     478    if (baseTiff.indexOf(File.separator) != -1) { 
     479      prefix = baseTiff.substring(0, baseTiff.lastIndexOf(File.separator) + 1); 
     480      baseTiff = baseTiff.substring(baseTiff.lastIndexOf(File.separator) + 1); 
     481    } 
     482 
     483    String[] blocks = baseTiff.split("_"); 
     484    StringBuffer filename = new StringBuffer(); 
     485    for (int t=0; t<getSizeT(); t++) { 
     486      for (int c=0; c<getSizeC(); c++) { 
     487        for (int z=0; z<getSizeZ(); z++) { 
     488          // file names are of format: 
     489          // img_<T>_<channel name>_<T>.tif 
     490          filename.append(prefix); 
     491          filename.append(blocks[0]); 
     492          filename.append("_"); 
     493 
     494          int zeros = blocks[1].length() - String.valueOf(t).length(); 
     495          for (int q=0; q<zeros; q++) { 
     496            filename.append("0"); 
     497          } 
     498          filename.append(t); 
     499          filename.append("_"); 
     500 
     501          filename.append(channels[c]); 
     502          filename.append("_"); 
     503 
     504          zeros = blocks[3].length() - String.valueOf(z).length() - 4; 
     505          for (int q=0; q<zeros; q++) { 
     506            filename.append("0"); 
     507          } 
     508          filename.append(z); 
     509          filename.append(".tif"); 
     510 
     511          tiffs.add(filename.toString()); 
     512          filename.delete(0, filename.length()); 
     513        } 
     514      } 
     515    } 
    500516  } 
    501517 
  • trunk/components/bio-formats/src/loci/formats/in/NativeND2Reader.java

    r6154 r6190  
    3030import java.util.Vector; 
    3131 
     32import loci.common.ByteArrayHandle; 
    3233import loci.common.Location; 
    3334import loci.common.RandomAccessInputStream; 
     
    3839import loci.formats.FormatTools; 
    3940import loci.formats.MetadataTools; 
    40 import loci.formats.codec.ByteVector; 
    4141import loci.formats.codec.Codec; 
    4242import loci.formats.codec.CodecOptions; 
     
    243243      Vector<int[]> customDataLengths = new Vector<int[]>(); 
    244244 
    245       ByteVector xml = new ByteVector(); 
     245      ByteArrayHandle xml = new ByteArrayHandle(); 
    246246      StringBuffer name = new StringBuffer(); 
    247247 
     
    303303              } 
    304304            } 
    305             xml.add(b, off, b.length - off); 
     305            xml.write(b, off, b.length - off); 
    306306          } 
    307307          skip = 0; 
     
    332332      DefaultHandler handler = new ND2Handler(); 
    333333 
    334       String xmlString = new String(xml.toByteArray()); 
     334      String xmlString = new String(xml.getBytes(), 0, (int) xml.length()); 
    335335      xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ND2>" + 
    336336        xmlString + "</ND2>"; 
  • trunk/components/bio-formats/src/loci/formats/in/NativeQTReader.java

    r6118 r6190  
    286286    LOGGER.info("Populating metadata"); 
    287287 
    288     int bytesPerPixel = (bitsPerPixel / 8) % 4; 
    289     core[0].pixelType = 
    290       FormatTools.pixelTypeFromBytes(bytesPerPixel, false, false); 
     288    int bytes = (bitsPerPixel / 8) % 4; 
     289    core[0].pixelType = bytes == 2 ? FormatTools.UINT16 : FormatTools.UINT8; 
    291290 
    292291    core[0].sizeZ = 1; 
     
    621620  /** Cut off header bytes from a resource fork file. */ 
    622621  private void stripHeader() throws IOException { 
    623     // seek to 4 bytes before first occurence of 'moov' 
    624  
    625     // read 8K at a time, for efficiency 
    626     long fp = in.getFilePointer(); 
    627     byte[] buf = new byte[8192]; 
    628     int index = -1; 
    629     while (true) { 
    630       int r = in.read(buf, 3, buf.length - 3); 
    631       if (r <= 0) break; 
    632       // search buffer for "moov" 
    633       for (int i=0; i<buf.length-3; i++) { 
    634         if (buf[i] == 'm' && buf[i+1] == 'o' && 
    635           buf[i+2] == 'o' && buf[i+3] == 'v') 
    636         { 
    637           index = i - 3; // first three characters are zeroes or leftovers 
    638           break; 
    639         } 
    640       } 
    641       if (index >= 0) break; 
    642  
    643       // save last three bytes of buffer 
    644       fp += r; 
    645       buf[0] = buf[buf.length - 3]; 
    646       buf[1] = buf[buf.length - 2]; 
    647       buf[2] = buf[buf.length - 1]; 
    648     } 
    649     if (index >= 0) in.seek(fp + index - 4); 
     622    in.findString("moov"); 
     623    in.seek(in.getFilePointer() - 4); 
    650624  } 
    651625 
  • trunk/components/bio-formats/src/loci/formats/in/NikonTiffReader.java

    r6055 r6190  
    102102    super.initStandardMetadata(); 
    103103 
     104    if (getMetadataOptions().getMetadataLevel() != MetadataLevel.ALL) return; 
     105 
    104106    filterModels = new Vector<String>(); 
    105107    dichroicModels = new Vector<String>(); 
     
    209211    MetadataTools.populatePixels(store, this); 
    210212 
    211     store.setImageDescription("", 0); 
    212  
    213     store.setDimensionsPhysicalSizeX(physicalSizeX, 0, 0); 
    214     store.setDimensionsPhysicalSizeY(physicalSizeY, 0, 0); 
    215     store.setDimensionsPhysicalSizeZ(physicalSizeZ, 0, 0); 
    216  
    217     String instrumentID = MetadataTools.createLSID("Instrument", 0); 
    218     store.setInstrumentID(instrumentID, 0); 
    219     store.setImageInstrumentRef(instrumentID, 0); 
    220  
    221     String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
    222     store.setObjectiveID(objectiveID, 0, 0); 
    223     store.setObjectiveSettingsObjective(objectiveID, 0); 
    224     store.setObjectiveNominalMagnification(magnification, 0, 0); 
    225  
    226     if (correction == null) correction = "Unknown"; 
    227     store.setObjectiveCorrection(correction, 0, 0); 
    228     store.setObjectiveLensNA(lensNA, 0, 0); 
    229     store.setObjectiveWorkingDistance(workingDistance, 0, 0); 
    230     if (immersion == null) immersion = "Unknown"; 
    231     store.setObjectiveImmersion(immersion, 0, 0); 
    232  
    233     for (int i=0; i<wavelength.size(); i++) { 
    234       String laser = MetadataTools.createLSID("LightSource", 0, i); 
    235       store.setLightSourceID(laser, 0, i); 
    236       store.setLightSourceModel(laserIDs.get(i), 0, i); 
    237       store.setLaserWavelength(wavelength.get(i), 0, i); 
    238       store.setLaserType("Unknown", 0, i); 
    239       store.setLaserLaserMedium("Unknown", 0, i); 
    240     } 
    241  
    242     for (int i=0; i<gain.size(); i++) { 
    243       store.setDetectorGain(gain.get(i), 0, i); 
    244       store.setDetectorType("Unknown", 0, i); 
    245     } 
    246  
    247     for (int c=0; c<getEffectiveSizeC(); c++) { 
    248       store.setLogicalChannelPinholeSize(pinholeSize, 0, c); 
    249       if (c < exWave.size()) { 
    250         store.setLogicalChannelExWave(exWave.get(c), 0, c); 
    251       } 
    252       if (c < emWave.size()) { 
    253         store.setLogicalChannelEmWave(emWave.get(c), 0, c); 
    254       } 
    255     } 
    256  
    257     for (int i=0; i<filterModels.size(); i++) { 
    258       String filter = MetadataTools.createLSID("Filter", 0, i); 
    259       store.setFilterID(filter, 0, i); 
    260       store.setFilterModel(filterModels.get(i), 0, i); 
    261     } 
    262  
    263     for (int i=0; i<dichroicModels.size(); i++) { 
    264       String dichroic = MetadataTools.createLSID("Dichroic", 0, i); 
    265       store.setDichroicID(dichroic, 0, i); 
    266       store.setDichroicModel(dichroicModels.get(i), 0, i); 
     213    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     214      store.setImageDescription("", 0); 
     215 
     216      store.setDimensionsPhysicalSizeX(physicalSizeX, 0, 0); 
     217      store.setDimensionsPhysicalSizeY(physicalSizeY, 0, 0); 
     218      store.setDimensionsPhysicalSizeZ(physicalSizeZ, 0, 0); 
     219 
     220      String instrumentID = MetadataTools.createLSID("Instrument", 0); 
     221      store.setInstrumentID(instrumentID, 0); 
     222      store.setImageInstrumentRef(instrumentID, 0); 
     223 
     224      String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
     225      store.setObjectiveID(objectiveID, 0, 0); 
     226      store.setObjectiveSettingsObjective(objectiveID, 0); 
     227      store.setObjectiveNominalMagnification(magnification, 0, 0); 
     228 
     229      if (correction == null) correction = "Unknown"; 
     230      store.setObjectiveCorrection(correction, 0, 0); 
     231      store.setObjectiveLensNA(lensNA, 0, 0); 
     232      store.setObjectiveWorkingDistance(workingDistance, 0, 0); 
     233      if (immersion == null) immersion = "Unknown"; 
     234      store.setObjectiveImmersion(immersion, 0, 0); 
     235 
     236      for (int i=0; i<wavelength.size(); i++) { 
     237        String laser = MetadataTools.createLSID("LightSource", 0, i); 
     238        store.setLightSourceID(laser, 0, i); 
     239        store.setLightSourceModel(laserIDs.get(i), 0, i); 
     240        store.setLaserWavelength(wavelength.get(i), 0, i); 
     241        store.setLaserType("Unknown", 0, i); 
     242        store.setLaserLaserMedium("Unknown", 0, i); 
     243      } 
     244 
     245      for (int i=0; i<gain.size(); i++) { 
     246        store.setDetectorGain(gain.get(i), 0, i); 
     247        store.setDetectorType("Unknown", 0, i); 
     248      } 
     249 
     250      for (int c=0; c<getEffectiveSizeC(); c++) { 
     251        store.setLogicalChannelPinholeSize(pinholeSize, 0, c); 
     252        if (c < exWave.size()) { 
     253          store.setLogicalChannelExWave(exWave.get(c), 0, c); 
     254        } 
     255        if (c < emWave.size()) { 
     256          store.setLogicalChannelEmWave(emWave.get(c), 0, c); 
     257        } 
     258      } 
     259 
     260      for (int i=0; i<filterModels.size(); i++) { 
     261        String filter = MetadataTools.createLSID("Filter", 0, i); 
     262        store.setFilterID(filter, 0, i); 
     263        store.setFilterModel(filterModels.get(i), 0, i); 
     264      } 
     265 
     266      for (int i=0; i<dichroicModels.size(); i++) { 
     267        String dichroic = MetadataTools.createLSID("Dichroic", 0, i); 
     268        store.setDichroicID(dichroic, 0, i); 
     269        store.setDichroicModel(dichroicModels.get(i), 0, i); 
     270      } 
    267271    } 
    268272  } 
  • trunk/components/bio-formats/src/loci/formats/in/PhotoshopTiffReader.java

    r6129 r6190  
    2626import java.io.IOException; 
    2727 
     28import loci.common.ByteArrayHandle; 
    2829import loci.common.RandomAccessInputStream; 
    2930import loci.formats.CoreMetadata; 
     
    3132import loci.formats.FormatTools; 
    3233import loci.formats.MetadataTools; 
    33 import loci.formats.codec.ByteVector; 
    3434import loci.formats.codec.Codec; 
    3535import loci.formats.codec.CodecOptions; 
     
    108108      CodecOptions options = new CodecOptions(); 
    109109      options.maxBytes = FormatTools.getPlaneSize(this) / getSizeC(); 
    110       ByteVector pix = new ByteVector(); 
     110      ByteArrayHandle pix = new ByteArrayHandle(); 
    111111      for (int c=0; c<getSizeC(); c++) { 
    112112        int index = channelOrder[getSeries() - 1][c]; 
    113113        tag.seek(layerOffset[(getSeries() - 1) * getSizeC() + index]); 
    114         byte[] p = codec.decompress(tag, options); 
    115         pix.add(p); 
     114        pix.write(codec.decompress(tag, options)); 
    116115      } 
    117       RandomAccessInputStream plane = 
    118         new RandomAccessInputStream(pix.toByteArray()); 
     116      RandomAccessInputStream plane = new RandomAccessInputStream(pix); 
     117      plane.seek(0); 
    119118      readPlane(plane, x, y, w, h, buf); 
    120119      plane.close(); 
  • trunk/components/bio-formats/src/loci/formats/in/PictReader.java

    r6156 r6190  
    3434import loci.formats.FormatTools; 
    3535import loci.formats.MetadataTools; 
    36 import loci.formats.codec.ByteVector; 
    3736import loci.formats.codec.CodecOptions; 
    3837import loci.formats.codec.JPEGCodec; 
  • trunk/components/bio-formats/src/loci/formats/in/SEQReader.java

    r6129 r6190  
    2525 
    2626import java.io.IOException; 
    27 import java.util.StringTokenizer; 
    2827 
    2928import loci.common.RandomAccessInputStream; 
     
    8382    core[0].sizeT = 0; 
    8483 
     84    MetadataLevel level = getMetadataOptions().getMetadataLevel(); 
    8585    for (IFD ifd : ifds) { 
    86       short[] tag1 = (short[]) ifd.getIFDValue(IMAGE_PRO_TAG_1); 
     86      if (level == MetadataLevel.ALL) { 
     87        short[] tag1 = (short[]) ifd.getIFDValue(IMAGE_PRO_TAG_1); 
    8788 
    88       if (tag1 != null) { 
    89         String seqId = ""; 
    90         for (int i=0; i<tag1.length; i++) seqId = seqId + tag1[i]; 
    91         addGlobalMeta("Image-Pro SEQ ID", seqId); 
     89        if (tag1 != null) { 
     90          String seqId = ""; 
     91          for (int i=0; i<tag1.length; i++) seqId = seqId + tag1[i]; 
     92          addGlobalMeta("Image-Pro SEQ ID", seqId); 
     93        } 
    9294      } 
    9395 
     
    119121    metadata.remove("Comment"); 
    120122    if (descr != null) { 
    121       StringTokenizer tokenizer = new StringTokenizer(descr, "\n"); 
    122       while (tokenizer.hasMoreTokens()) { 
    123         String token = tokenizer.nextToken().trim(); 
     123      String[] lines = descr.split("\n"); 
     124      for (String token : lines) { 
     125        token = token.trim(); 
    124126        int eq = token.indexOf("="); 
    125127        if (eq == -1) eq = token.indexOf(":"); 
  • trunk/components/bio-formats/src/loci/formats/in/SVSReader.java

    r6026 r6190  
    9393      core[i] = new CoreMetadata(); 
    9494 
    95       String comment = ifds.get(i).getComment(); 
    96       String[] lines = comment.split("\n"); 
    97       String[] tokens; 
    98       String key, value; 
    99       for (String line : lines) { 
    100         tokens = line.split("|"); 
    101         for (String t : tokens) { 
    102           if (t.indexOf("=") == -1) addGlobalMeta("Comment", t); 
    103           else { 
    104             key = t.substring(0, t.indexOf("=")).trim(); 
    105             value = t.substring(t.indexOf("=") + 1).trim(); 
    106             addSeriesMeta(key, value); 
    107             if (key.equals("MPP")) pixelSize[i] = Float.parseFloat(value); 
     95      if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     96        String comment = ifds.get(i).getComment(); 
     97        String[] lines = comment.split("\n"); 
     98        String[] tokens; 
     99        String key, value; 
     100        for (String line : lines) { 
     101          tokens = line.split("|"); 
     102          for (String t : tokens) { 
     103            if (t.indexOf("=") == -1) addGlobalMeta("Comment", t); 
     104            else { 
     105              key = t.substring(0, t.indexOf("=")).trim(); 
     106              value = t.substring(t.indexOf("=") + 1).trim(); 
     107              addSeriesMeta(key, value); 
     108              if (key.equals("MPP")) pixelSize[i] = Float.parseFloat(value); 
     109            } 
    108110          } 
    109111        } 
  • trunk/components/bio-formats/src/loci/formats/in/SlidebookReader.java

    r6026 r6190  
    514514    MetadataTools.populatePixels(store, this); 
    515515 
    516     // link Instrument and Image 
    517     String instrumentID = MetadataTools.createLSID("Instrument", 0); 
    518     store.setInstrumentID(instrumentID, 0); 
    519     store.setImageInstrumentRef(instrumentID, 0); 
    520  
    521     int index = 0; 
    522  
    523     // populate Objective data 
    524     store.setObjectiveModel(objective, 0, 0); 
    525     store.setObjectiveCorrection("Unknown", 0, 0); 
    526     store.setObjectiveImmersion("Unknown", 0, 0); 
    527  
    528     // link Objective to Image 
    529     String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
    530     store.setObjectiveID(objectiveID, 0, 0); 
    531     store.setObjectiveSettingsObjective(objectiveID, 0); 
    532  
    533516    // populate Image data 
    534517 
     
    538521    } 
    539522 
    540     // populate Dimensions data 
    541  
    542     for (int i=0; i<getSeriesCount(); i++) { 
    543       store.setDimensionsPhysicalSizeX(new Double(pixelSize), i, 0); 
    544       store.setDimensionsPhysicalSizeY(new Double(pixelSize), i, 0); 
    545       int idx = 0; 
    546       for (int q=0; q<i; q++) { 
    547         idx += core[q].sizeC; 
    548       } 
    549  
    550       if (idx < pixelSizeZ.size() && pixelSizeZ.get(idx) != null) { 
    551         store.setDimensionsPhysicalSizeZ(pixelSizeZ.get(idx), i, 0); 
    552       } 
    553     } 
    554  
    555     // populate LogicalChannel data 
    556  
    557     for (int i=0; i<getSeriesCount(); i++) { 
    558       setSeries(i); 
    559       for (int c=0; c<getSizeC(); c++) { 
    560         if (index < channelNames.size() && channelNames.get(index) != null) { 
    561           store.setLogicalChannelName(channelNames.get(index), i, c); 
    562           addSeriesMeta("channel " + c, channelNames.get(index)); 
    563         } 
    564         if (index < ndFilters.size() && ndFilters.get(index) != null) { 
    565           store.setLogicalChannelNdFilter(ndFilters.get(index), i, c); 
    566           addSeriesMeta("channel " + c + " Neutral density", 
    567             ndFilters.get(index)); 
    568         } 
    569         index++; 
    570       } 
    571     } 
    572     setSeries(0); 
     523    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     524      // link Instrument and Image 
     525      String instrumentID = MetadataTools.createLSID("Instrument", 0); 
     526      store.setInstrumentID(instrumentID, 0); 
     527      store.setImageInstrumentRef(instrumentID, 0); 
     528 
     529      int index = 0; 
     530 
     531      // populate Objective data 
     532      store.setObjectiveModel(objective, 0, 0); 
     533      store.setObjectiveCorrection("Unknown", 0, 0); 
     534      store.setObjectiveImmersion("Unknown", 0, 0); 
     535 
     536      // link Objective to Image 
     537      String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
     538      store.setObjectiveID(objectiveID, 0, 0); 
     539      store.setObjectiveSettingsObjective(objectiveID, 0); 
     540 
     541      // populate Dimensions data 
     542 
     543      for (int i=0; i<getSeriesCount(); i++) { 
     544        store.setDimensionsPhysicalSizeX(new Double(pixelSize), i, 0); 
     545        store.setDimensionsPhysicalSizeY(new Double(pixelSize), i, 0); 
     546        int idx = 0; 
     547        for (int q=0; q<i; q++) { 
     548          idx += core[q].sizeC; 
     549        } 
     550 
     551        if (idx < pixelSizeZ.size() && pixelSizeZ.get(idx) != null) { 
     552          store.setDimensionsPhysicalSizeZ(pixelSizeZ.get(idx), i, 0); 
     553        } 
     554      } 
     555 
     556      // populate LogicalChannel data 
     557 
     558      for (int i=0; i<getSeriesCount(); i++) { 
     559        setSeries(i); 
     560        for (int c=0; c<getSizeC(); c++) { 
     561          if (index < channelNames.size() && channelNames.get(index) != null) { 
     562            store.setLogicalChannelName(channelNames.get(index), i, c); 
     563            addSeriesMeta("channel " + c, channelNames.get(index)); 
     564          } 
     565          if (index < ndFilters.size() && ndFilters.get(index) != null) { 
     566            store.setLogicalChannelNdFilter(ndFilters.get(index), i, c); 
     567            addSeriesMeta("channel " + c + " Neutral density", 
     568              ndFilters.get(index)); 
     569          } 
     570          index++; 
     571        } 
     572      } 
     573      setSeries(0); 
     574    } 
    573575  } 
    574576 
  • trunk/components/bio-formats/src/loci/formats/in/TiffReader.java

    r6054 r6190  
    121121    // which may contain additional metadata 
    122122 
    123     Integer[] tags = ifds.get(0).keySet().toArray(new Integer[0]); 
    124     for (Integer tag : tags) { 
    125       if (tag.intValue() >= 65000) { 
    126         Object value = ifds.get(0).get(tag); 
    127         if (value instanceof short[]) { 
    128           short[] s = (short[]) value; 
    129           byte[] b = new byte[s.length]; 
    130           for (int i=0; i<b.length; i++) { 
    131             b[i] = (byte) s[i]; 
    132           } 
    133           String metadata = DataTools.stripString(new String(b)); 
    134           if (metadata.indexOf("xml") != -1) { 
    135             metadata = metadata.substring(metadata.indexOf("<")); 
    136             metadata = "<root>" + XMLTools.sanitizeXML(metadata) + "</root>"; 
    137             Hashtable<String, String> xmlMetadata = XMLTools.parseXML(metadata); 
    138             for (String key : xmlMetadata.keySet()) { 
    139               addGlobalMeta(key, xmlMetadata.get(key)); 
     123    MetadataLevel level = getMetadataOptions().getMetadataLevel(); 
     124    if (level == MetadataLevel.ALL) { 
     125      Integer[] tags = ifds.get(0).keySet().toArray(new Integer[0]); 
     126      for (Integer tag : tags) { 
     127        if (tag.intValue() >= 65000) { 
     128          Object value = ifds.get(0).get(tag); 
     129          if (value instanceof short[]) { 
     130            short[] s = (short[]) value; 
     131            byte[] b = new byte[s.length]; 
     132            for (int i=0; i<b.length; i++) { 
     133              b[i] = (byte) s[i]; 
    140134            } 
    141           } 
    142           else { 
    143             addGlobalMeta(tag.toString(), metadata); 
     135            String metadata = DataTools.stripString(new String(b)); 
     136            if (metadata.indexOf("xml") != -1) { 
     137              metadata = metadata.substring(metadata.indexOf("<")); 
     138              metadata = "<root>" + XMLTools.sanitizeXML(metadata) + "</root>"; 
     139              Hashtable<String, String> xmlMetadata = 
     140                XMLTools.parseXML(metadata); 
     141              for (String key : xmlMetadata.keySet()) { 
     142                addGlobalMeta(key, xmlMetadata.get(key)); 
     143              } 
     144            } 
     145            else { 
     146              addGlobalMeta(tag.toString(), metadata); 
     147            } 
    144148          } 
    145149        } 
     
    153157    // check for MetaMorph-style TIFF comment 
    154158    boolean metamorph = checkCommentMetamorph(comment); 
    155     if (metamorph) parseCommentMetamorph(comment); 
     159    if (metamorph && level == MetadataLevel.ALL) parseCommentMetamorph(comment); 
    156160    put("MetaMorph", metamorph ? "yes" : "no"); 
    157161 
    158162    // check for other INI-style comment 
    159     if (!ij && !metamorph) parseCommentGeneric(comment); 
     163    if (!ij && !metamorph && level == MetadataLevel.ALL) { 
     164      parseCommentGeneric(comment); 
     165    } 
    160166 
    161167    // check for another file with the same name 
  • trunk/components/bio-formats/src/loci/formats/in/TillVisionReader.java

    r6118 r6190  
    2424package loci.formats.in; 
    2525 
     26import java.io.BufferedReader; 
    2627import java.io.File; 
     28import java.io.FileReader; 
    2729import java.io.IOException; 
    2830import java.util.Arrays; 
    2931import java.util.Hashtable; 
    30 import java.util.StringTokenizer; 
    3132import java.util.Vector; 
    3233 
    33 import loci.common.DataTools; 
    3434import loci.common.DateTools; 
     35import loci.common.IniList; 
     36import loci.common.IniParser; 
     37import loci.common.IniTable; 
    3538import loci.common.Location; 
    3639import loci.common.RandomAccessInputStream; 
     
    6972  private Hashtable<Integer, Double> exposureTimes; 
    7073  private boolean embeddedImages; 
    71   private int embeddedOffset; 
     74  private long embeddedOffset; 
     75 
     76  private Vector<String> imageNames = new Vector<String>(); 
     77  private Vector<String> waves = new Vector<String>(); 
     78  private Vector<String> types = new Vector<String>(); 
     79  private Vector<String> dates = new Vector<String>(); 
    7280 
    7381  // -- Constructor -- 
     
    94102      readPlane(in, x, y, w, h, buf); 
    95103    } 
    96     else { 
     104    else if ((no + 1) * plane <= pixelsStream[series].length()) { 
    97105      pixelsStream[series].seek(no * plane); 
    98106      readPlane(pixelsStream[series], x, y, w, h, buf); 
     
    115123      embeddedImages = false; 
    116124      exposureTimes = null; 
     125      imageNames.clear(); 
     126      waves.clear(); 
     127      types.clear(); 
     128      dates.clear(); 
    117129    } 
    118130  } 
     
    138150    Vector<String> documents = poi.getDocumentList(); 
    139151 
    140     MetadataStore store = 
    141       new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    142  
    143     Vector<String> imageNames = new Vector<String>(); 
    144     Vector<String> waves = new Vector<String>(); 
    145     Vector<String> types = new Vector<String>(); 
    146     Vector<String> dates = new Vector<String>(); 
    147152    int nImages = 0; 
    148153 
    149154    Hashtable tmpSeriesMetadata = new Hashtable(); 
    150155 
    151     for (int i=0; i<documents.size(); i++) { 
    152       String name = documents.get(i); 
     156    for (String name : documents) { 
    153157      LOGGER.debug("Reading {}", name); 
    154158 
    155159      if (name.equals("Root Entry" + File.separator + "Contents")) { 
    156160        RandomAccessInputStream s = poi.getDocumentStream(name); 
    157  
    158         byte[] b = new byte[(int) s.length()]; 
    159         s.read(b); 
    160         int pos = 0; 
     161        s.order(true); 
    161162        int nFound = 0; 
    162163 
    163         embeddedImages = b[0] == 1; 
     164        embeddedImages = s.read() == 1; 
    164165        LOGGER.debug("Images are {}embedded", embeddedImages ? "" : "not "); 
    165166 
    166167        if (embeddedImages) { 
    167           int len = DataTools.bytesToShort(b, 13, 2, true); 
    168           String type = new String(b, 15, len); 
     168          s.skipBytes(12); 
     169          int len = s.readShort(); 
     170          String type = s.readString(len); 
    169171          if (!type.equals("CImage")) { 
    170172            embeddedImages = false; 
     
    172174          } 
    173175 
    174           int offset = 27; 
    175           len = b[offset++] & 0xff; 
     176          s.seek(27); 
     177          len = s.read(); 
    176178          while (len != 0) { 
    177             offset += len; 
    178             len = b[offset++] & 0xff; 
    179           } 
    180  
    181           offset += 1243; 
    182  
    183           core[0].sizeX = DataTools.bytesToInt(b, offset, 4, true); 
    184           offset += 4; 
    185           core[0].sizeY = DataTools.bytesToInt(b, offset, 4, true); 
    186           offset += 4; 
    187           core[0].sizeZ = DataTools.bytesToInt(b, offset, 4, true); 
    188           offset += 4; 
    189           core[0].sizeC = DataTools.bytesToInt(b, offset, 4, true); 
    190           offset += 4; 
    191           core[0].sizeT = DataTools.bytesToInt(b, offset, 4, true); 
    192           offset += 4; 
    193           core[0].pixelType = 
    194             convertPixelType(DataTools.bytesToInt(b, offset, 4, true)); 
    195           embeddedOffset = offset + 32; 
     179            s.skipBytes(len); 
     180            len = s.read(); 
     181          } 
     182 
     183          s.skipBytes(1243); 
     184 
     185          core[0].sizeX = s.readInt(); 
     186          core[0].sizeY = s.readInt(); 
     187          core[0].sizeZ = s.readInt(); 
     188          core[0].sizeC = s.readInt(); 
     189          core[0].sizeT = s.readInt(); 
     190          core[0].pixelType = convertPixelType(s.readInt()); 
     191          embeddedOffset = s.getFilePointer() + 28; 
    196192          in = poi.getDocumentStream(name); 
    197193          nImages++; 
     
    199195        } 
    200196 
    201         byte[] marker = getMarker(b); 
     197        byte[] marker = getMarker(s); 
    202198        if (marker == null) { 
    203199          throw new FormatException("Could not find known marker."); 
     
    210206          LOGGER.debug("  Looking for image at {}", s.getFilePointer()); 
    211207          s.order(false); 
    212           s.seek(findNextOffset(b, marker, (int) s.getFilePointer())); 
    213           if (s.getFilePointer() < 0) break; 
     208          int nextOffset = findNextOffset(s, marker); 
     209          if (nextOffset < 0 || nextOffset >= s.length()) break; 
     210          s.seek(nextOffset); 
    214211          s.skipBytes(3); 
    215212          int len = s.readShort(); 
     
    252249                types.add(value); 
    253250              } 
    254               else if (key.equals("Monochromator wavelength [nm]")) { 
    255  
    256               } 
    257251              else if (key.equals("Monochromator wavelength increment[nm]")) { 
    258252                waves.add(value); 
     
    291285      // look for appropriate pixels files 
    292286 
    293       String[] files = directory.list(); 
     287      String[] files = directory.list(true); 
    294288 
    295289      int nextFile = 0; 
    296290 
    297       for (int i=0; i<files.length; i++) { 
    298         if (files[i].endsWith(".pst")) { 
    299           Location pst = new Location(directory, files[i]); 
     291      for (String f : files) { 
     292        if (f.endsWith(".pst")) { 
     293          Location pst = new Location(directory, f); 
    300294          if (pst.isDirectory()) { 
    301             String[] subfiles = pst.list(); 
    302             for (int q=0; q<subfiles.length; q++) { 
    303               if (subfiles[q].endsWith(".pst") && nextFile < nImages) { 
    304                 pixelsFile[nextFile++] = 
    305                   files[i] + File.separator + subfiles[q]; 
     295            String[] subfiles = pst.list(true); 
     296            for (String q : subfiles) { 
     297              if (q.endsWith(".pst") && nextFile < nImages) { 
     298                pixelsFile[nextFile++] = f + File.separator + q; 
    306299              } 
    307300            } 
    308301          } 
    309302          else if (nextFile < nImages) { 
    310             pixelsFile[nextFile++] = files[i]; 
     303            pixelsFile[nextFile++] = f; 
    311304          } 
    312305        } 
     
    322315 
    323316    Object[] metadataKeys = tmpSeriesMetadata.keySet().toArray(); 
     317    IniParser parser = new IniParser(); 
    324318 
    325319    for (int i=0; i<getSeriesCount(); i++) { 
    326320      if (!embeddedImages) { 
    327321        core[i] = new CoreMetadata(); 
     322        setSeries(i); 
    328323 
    329324        // make sure that pixels file exists 
     
    351346 
    352347        int dot = file.lastIndexOf("."); 
    353         String infFile = file.substring(0, dot) + ".inf"; 
    354  
    355         String data = DataTools.readFile(infFile); 
    356         StringTokenizer lines = new StringTokenizer(data); 
    357  
    358         while (lines.hasMoreTokens()) { 
    359           String line = lines.nextToken().trim(); 
    360           if (line.startsWith("[") || line.indexOf("=") == -1) { 
    361             continue; 
    362           } 
    363  
    364           int equal = line.indexOf("="); 
    365           String key = line.substring(0, equal).trim(); 
    366           String value = line.substring(equal + 1).trim(); 
    367  
    368           addGlobalMeta(key, value); 
    369  
    370           if (key.equals("Width")) core[i].sizeX = Integer.parseInt(value); 
    371           else if (key.equals("Height")) { 
    372             core[i].sizeY = Integer.parseInt(value); 
    373           } 
    374           else if (key.equals("Bands")) core[i].sizeC = Integer.parseInt(value); 
    375           else if (key.equals("Slices")) { 
    376             core[i].sizeZ = Integer.parseInt(value); 
    377           } 
    378           else if (key.equals("Frames")) { 
    379             core[i].sizeT = Integer.parseInt(value); 
    380           } 
    381           else if (key.equals("Datatype")) { 
    382             core[i].pixelType = convertPixelType(Integer.parseInt(value)); 
     348        String inf = file.substring(0, dot) + ".inf"; 
     349 
     350        IniList data = parser.parseINI(new BufferedReader(new FileReader(inf))); 
     351        IniTable infoTable = data.getTable("Info"); 
     352 
     353        core[i].sizeX = Integer.parseInt(infoTable.get("Width")); 
     354        core[i].sizeY = Integer.parseInt(infoTable.get("Height")); 
     355        core[i].sizeC = Integer.parseInt(infoTable.get("Bands")); 
     356        core[i].sizeZ = Integer.parseInt(infoTable.get("Slices")); 
     357        core[i].sizeT = Integer.parseInt(infoTable.get("Frames")); 
     358        int dataType = Integer.parseInt(infoTable.get("Datatype")); 
     359        core[i].pixelType = convertPixelType(dataType); 
     360 
     361        if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     362          for (IniTable table : data) { 
     363            for (String key : table.keySet()) { 
     364              addSeriesMeta(key, table.get(key)); 
     365            } 
    383366          } 
    384367        } 
     
    400383    } 
    401384    tmpSeriesMetadata = null; 
    402  
     385    populateMetadataStore(); 
     386  } 
     387 
     388  // -- Helper methods -- 
     389 
     390  private void populateMetadataStore() { 
     391    MetadataStore store = 
     392      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    403393    MetadataTools.populatePixels(store, this, true); 
    404394 
     
    412402        store.setImageCreationDate(date, i); 
    413403      } 
    414       else MetadataTools.setDefaultCreationDate(store, id, i); 
    415  
    416       // populate PlaneTiming data 
    417  
    418       for (int q=0; q<core[i].imageCount; q++) { 
    419         store.setPlaneTimingExposureTime( 
    420           exposureTimes.get(new Integer(i)), i, 0, q); 
    421       } 
    422  
    423       // populate Dimensions data 
    424  
    425       if (i < waves.size()) { 
    426         int waveIncrement = Integer.parseInt(waves.get(i)); 
    427         if (waveIncrement > 0) { 
    428           store.setDimensionsWaveIncrement(waveIncrement, i, 0); 
    429         } 
    430       } 
    431  
    432       // populate Experiment data 
    433  
    434       if (i < types.size()) { 
    435         store.setExperimentType(types.get(i), i); 
    436       } 
    437     } 
    438   } 
    439  
    440   // -- Helper methods -- 
     404      else MetadataTools.setDefaultCreationDate(store, currentId, i); 
     405    } 
     406 
     407    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     408      for (int i=0; i<getSeriesCount(); i++) { 
     409        // populate PlaneTiming data 
     410 
     411        for (int q=0; q<core[i].imageCount; q++) { 
     412          store.setPlaneTimingExposureTime(exposureTimes.get(i), i, 0, q); 
     413        } 
     414 
     415        // populate Dimensions data 
     416 
     417        if (i < waves.size()) { 
     418          int waveIncrement = Integer.parseInt(waves.get(i)); 
     419          if (waveIncrement > 0) { 
     420            store.setDimensionsWaveIncrement(waveIncrement, i, 0); 
     421          } 
     422        } 
     423 
     424        // populate Experiment data 
     425 
     426        if (i < types.size()) { 
     427          store.setExperimentType(types.get(i), i); 
     428        } 
     429      } 
     430    } 
     431  } 
    441432 
    442433  private int convertPixelType(int type) throws FormatException { 
     
    446437  } 
    447438 
    448   private byte[] getMarker(byte[] s) throws IOException { 
    449     int offset = findNextOffset(s, MARKER_0, 0); 
     439  private byte[] getMarker(RandomAccessInputStream s) throws IOException { 
     440    s.seek(0); 
     441    int offset = findNextOffset(s, MARKER_0); 
    450442    if (offset != -1) return MARKER_0; 
    451     offset = findNextOffset(s, MARKER_1, 0); 
     443    s.seek(0); 
     444    offset = findNextOffset(s, MARKER_1); 
    452445    return offset == -1 ? null : MARKER_1; 
    453446  } 
    454447 
    455   private int findNextOffset(byte[] s, byte[] marker, int pos) 
     448  private int findNextOffset(RandomAccessInputStream s, byte[] marker) 
    456449    throws IOException 
    457450  { 
    458     for (int i=pos; i<s.length-marker.length; i++) { 
     451    for (long i=s.getFilePointer(); i<s.length()-marker.length; i++) { 
     452      s.seek(i); 
    459453      boolean found = true; 
    460454      for (int q=0; q<marker.length; q++) { 
    461         if (marker[q] != s[i + q]) { 
     455        if (marker[q] != s.readByte()) { 
    462456          found = false; 
    463457          break; 
    464458        } 
    465459      } 
    466       if (found) return i + marker.length; 
     460      if (found) return (int) (i + marker.length); 
    467461    } 
    468462    return -1; 
  • trunk/components/bio-formats/src/loci/formats/in/VisitechReader.java

    r6118 r6190  
    2626import java.io.File; 
    2727import java.io.IOException; 
    28 import java.util.StringTokenizer; 
    2928import java.util.Vector; 
    3029 
     
    167166      "[sS][cC][rR][iI][pP][tT]>", ""); 
    168167 
    169     StringTokenizer st = new StringTokenizer(s, "\n"); 
    170     String token = null, key = null, value = null; 
     168    String key = null, value = null; 
    171169    int numSeries = 0; 
    172     while (st.hasMoreTokens()) { 
    173       token = st.nextToken().trim(); 
     170    String[] tokens = s.split("\n"); 
     171    for (String token : tokens) { 
     172      token = token.trim(); 
    174173 
    175174      if ((token.startsWith("<") && !token.startsWith("</")) || 
  • trunk/components/common/src/loci/common/RandomAccessInputStream.java

    r6188 r6190  
    220220 
    221221    // ensure that we don't try to read more bytes than are in the file 
    222     if (blockSize > maxLen) { 
    223       blockSize = (int) maxLen; 
     222    if (blockSize > maxLen / 2) { 
     223      blockSize = (int) maxLen / 2; 
    224224    } 
    225225 
  • trunk/components/forks/mdbtools/src/mdbtools/libmdb/Data.java

    r6026 r6190  
    663663    { 
    664664      /* inline memo field */ 
    665       text = new String(mdb.pg_buf,start+Constants.MDB_MEMO_OVERHEAD + 2,size - Constants.MDB_MEMO_OVERHEAD - 2); 
     665      int begin = start + Constants.MDB_MEMO_OVERHEAD + 2; 
     666      int end = size - Constants.MDB_MEMO_OVERHEAD - 2; 
     667      if (begin >= 0 && begin < mdb.pg_buf.length && end > 0 && 
     668        begin + end <= mdb.pg_buf.length) 
     669      { 
     670        text = new String(mdb.pg_buf, begin, end); 
     671      } 
    666672//      strncpy(text, &mdb->pg_buf[start + MDB_MEMO_OVERHEAD],size - MDB_MEMO_OVERHEAD); 
    667673//      text[size - MDB_MEMO_OVERHEAD]='\0'; 
Note: See TracChangeset for help on using the changeset viewer.