Changeset 6113


Ignore:
Timestamp:
04/09/10 14:27:39 (10 years ago)
Author:
melissa
Message:

Fixed various whitespace issues in AmiraParameters, and updated a few more readers to respect MetadataOptions.

Location:
trunk/components/bio-formats/src/loci/formats
Files:
4 edited

Legend:

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

    r6026 r6113  
    4444/** 
    4545 * This is a file format reader for AmiraMesh data. 
     46 * 
     47 * <dl><dt><b>Source code:</b></dt> 
     48 * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/bio-formats/src/loci/formats/in/AmiraReader.java">Trac</a>, 
     49 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/bio-formats/src/loci/formats/in/AmiraReader.java">SVN</a></dd></dl> 
     50 * 
    4651 * @author Gregory Jefferis jefferis at gmail.com 
    4752 * @author Johannes Schindelin johannes.schindelin at gmx.de 
     
    4954public class AmiraReader extends FormatReader { 
    5055 
     56  // -- Fields -- 
     57 
    5158  AmiraParameters parameters; 
    5259  long offsetOfFirstStream; 
     
    5764  // for labels 
    5865  byte[][] lut; 
     66 
     67  // -- Constructor -- 
    5968 
    6069  public AmiraReader() { 
     
    6372  } 
    6473 
     74  // -- IFormatReader API methods -- 
     75 
    6576  /* (non-Javadoc) 
    6677   * @see loci.formats.FormatReader#openBytes(int, byte[], int, int, int, int) 
    6778   */ 
    68   public byte[] openBytes(int no, byte[] buf, int x, int y, int width, 
    69       int height) throws FormatException, IOException 
     79  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
     80    throws FormatException, IOException 
    7081  { 
    71     FormatTools.checkPlaneParameters(this, no, buf.length, x, y, width, height); 
     82    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
    7283 
    7384    int planeSize = FormatTools.getPlaneSize(this); 
    7485    if (planeReader != null) { 
    75       if (x == 0 && y == 0 && 
    76           width == parameters.width && height == parameters.height) 
     86      if (x == 0 && y == 0 && w == parameters.width && h == parameters.height) { 
    7787        return planeReader.read(no, buf); 
     88      } 
    7889 
    7990      // plane readers can only read whole planes, so we need to blit 
     
    8192      byte[] planeBuf = new byte[planeSize]; 
    8293      planeReader.read(no, planeBuf); 
    83       for (int j = y; j < y + height; j++) 
     94      for (int j = y; j < y + h; j++) { 
    8495        System.arraycopy(planeBuf, (x + j * parameters.width) * bytesPerPixel, 
    85           buf, (j - y) * width * bytesPerPixel, width * bytesPerPixel); 
    86       return buf; 
    87     } 
    88  
    89     in.seek(offsetOfFirstStream + no * planeSize); 
    90     readPlane(in, x, y, width, height, buf); 
     96          buf, (j - y) * w * bytesPerPixel, w * bytesPerPixel); 
     97      } 
     98    } 
     99    else { 
     100      in.seek(offsetOfFirstStream + no * planeSize); 
     101      readPlane(in, x, y, w, h, buf); 
     102    } 
    91103 
    92104    return buf; 
    93   } 
    94  
    95   /* (non-Javadoc) 
    96    * @see loci.formats.FormatReader#getUsedFiles() 
    97    */ 
    98   public String[] getUsedFiles() { 
    99     return super.getUsedFiles(); 
    100105  } 
    101106 
     
    130135    core[0].dimensionOrder = "XYCZT"; 
    131136 
    132     if (parameters.streamTypes[0].toLowerCase().equals("byte")) { 
     137    String streamType = parameters.streamTypes[0].toLowerCase(); 
     138    if (streamType.equals("byte")) { 
    133139      core[0].pixelType = FormatTools.UINT8; 
    134140    } 
    135     else if (parameters.streamTypes[0].toLowerCase().equals("short")) { 
     141    else if (streamType.equals("short")) { 
    136142      core[0].pixelType = FormatTools.INT16; 
    137143      addGlobalMeta("Bits per pixel", 16); 
    138144    } 
    139     else if (parameters.streamTypes[0].toLowerCase().equals("ushort")) { 
     145    else if (streamType.equals("ushort")) { 
    140146      core[0].pixelType = FormatTools.UINT16; 
    141147      addGlobalMeta("Bits per pixel", 16); 
    142148    } 
    143     else if (parameters.streamTypes[0].toLowerCase().equals("int")) { 
     149    else if (streamType.equals("int")) { 
    144150      core[0].pixelType = FormatTools.INT32; 
    145151      addGlobalMeta("Bits per pixel", 32); 
    146152    } 
    147     else if (parameters.streamTypes[0].toLowerCase().equals("float")) { 
     153    else if (streamType.equals("float")) { 
    148154      core[0].pixelType = FormatTools.FLOAT; 
    149155      addGlobalMeta("Bits per pixel", 32); 
    150156    } 
    151157    else { 
    152       System.err.println("Assuming data type is byte"); 
     158      LOGGER.warn("Assuming data type is byte"); 
    153159      core[0].pixelType = FormatTools.UINT8; 
    154160    } 
     
    162168    // Note that Amira specifies a bounding box, not pixel sizes. 
    163169    // The bounding box is the range of the centre of the voxels 
    164     double pixelWidth = (double) (parameters.x1 - parameters.x0) / 
    165       (parameters.width - 1); 
    166     double pixelHeight = (double) (parameters.y1 - parameters.y0) / 
    167       (parameters.height - 1); 
    168     // TODO - what is correct setting if single slice? 
    169     double pixelDepth = (double) (parameters.z1 - parameters.z0) / 
    170       (parameters.depth - 1); 
    171  
    172     // Amira does not have a standard form for encoding units, so we just 
    173     // have to assume microns for microscopy data 
    174     addGlobalMeta("Pixels per meter (X)", 1e6 / pixelWidth); 
    175     addGlobalMeta("Pixels per meter (Y)", 1e6 / pixelHeight); 
    176     addGlobalMeta("Pixels per meter (Z)", 1e6 / pixelDepth); 
    177  
    178     // NB these methods expects pixels sizes in microns 
    179     store.setDimensionsPhysicalSizeX(new Double(pixelWidth), 0, 0); 
    180     store.setDimensionsPhysicalSizeY(new Double(pixelHeight), 0, 0); 
    181     store.setDimensionsPhysicalSizeZ(new Double(pixelDepth), 0, 0); 
    182  
    183     if (parameters.ascii) 
     170    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     171      double pixelWidth = (double) (parameters.x1 - parameters.x0) / 
     172        (parameters.width - 1); 
     173      double pixelHeight = (double) (parameters.y1 - parameters.y0) / 
     174        (parameters.height - 1); 
     175      // TODO - what is correct setting if single slice? 
     176      double pixelDepth = (double) (parameters.z1 - parameters.z0) / 
     177        (parameters.depth - 1); 
     178 
     179      // Amira does not have a standard form for encoding units, so we just 
     180      // have to assume microns for microscopy data 
     181      addGlobalMeta("Pixels per meter (X)", 1e6 / pixelWidth); 
     182      addGlobalMeta("Pixels per meter (Y)", 1e6 / pixelHeight); 
     183      addGlobalMeta("Pixels per meter (Z)", 1e6 / pixelDepth); 
     184 
     185      store.setDimensionsPhysicalSizeX(new Double(pixelWidth), 0, 0); 
     186      store.setDimensionsPhysicalSizeY(new Double(pixelHeight), 0, 0); 
     187      store.setDimensionsPhysicalSizeZ(new Double(pixelDepth), 0, 0); 
     188    } 
     189 
     190    if (parameters.ascii) { 
    184191      planeReader = new ASCII(core[0].pixelType, 
    185192        parameters.width * parameters.height); 
     193    } 
    186194 
    187195    int compressionType = 0; 
     
    217225  public boolean isThisType(RandomAccessInputStream stream) throws IOException { 
    218226    if (!FormatTools.validStream(stream, 50, false)) return false; 
    219     String c=stream.readLine().toString(); 
     227    String c = stream.readLine(); 
    220228 
    221229    Matcher amiraMeshDef = Pattern.compile("#\\s+AmiraMesh.*?" + 
    222         "(BINARY|ASCII)(-LITTLE-ENDIAN)*").matcher(c); 
     230      "(BINARY|ASCII)(-LITTLE-ENDIAN)*").matcher(c); 
    223231    return amiraMeshDef.find(); 
    224232  } 
     
    226234  /* @see IFormatReader#get8BitLookupTable() */ 
    227235  public byte[][] get8BitLookupTable() { 
     236    FormatTools.assertId(currentId, true ,1); 
    228237    return lut; 
    229238  } 
     239 
     240  // -- Helper methods -- 
    230241 
    231242  byte[][] getLookupTable(Map materials) throws FormatException { 
     
    235246      i++; 
    236247      Object object = materials.get(label); 
    237       if (!(object instanceof Map)) 
     248      if (!(object instanceof Map)) { 
    238249        throw new FormatException("Invalid material: " + label); 
     250      } 
    239251      Map material = (Map) object; 
    240252      object = material.get("Color"); 
    241       if (object == null) 
    242         continue; // black 
    243       if (!(object instanceof Number[])) 
     253      if (object == null) continue; // black 
     254      if (!(object instanceof Number[])) { 
    244255        throw new FormatException("Invalid material: " + label); 
     256      } 
    245257      Number[] color = (Number[]) object; 
    246       if (color.length != 3) 
     258      if (color.length != 3) { 
    247259        throw new FormatException("Invalid color: " + 
    248260          color.length + " channels"); 
    249       for (int j = 0; j < 3; j++) 
     261      } 
     262      for (int j = 0; j < 3; j++) { 
    250263        result[j][i] = (byte) (int) (255 * color[j].floatValue()); 
     264      } 
    251265    } 
    252266    return result; 
     
    283297      if (offsets[no] == 0) { 
    284298        int i = no - 1; 
    285         while (offsets[i] == 0) 
     299        while (offsets[i] == 0) { 
    286300          i--; 
     301        } 
    287302        in.seek(offsets[i]); 
    288303        while (i < no) { 
    289           for (int j = 0; j < pixelsPerPlane; j++) 
     304          for (int j = 0; j < pixelsPerPlane; j++) { 
    290305            readNumberString(); 
    291           i++; 
    292           offsets[i] = in.getFilePointer(); 
    293         } 
    294       } 
    295       else 
     306          } 
     307          offsets[++i] = in.getFilePointer(); 
     308        } 
     309      } 
     310      else { 
    296311        in.seek(offsets[no]); 
     312      } 
    297313      for (int j = 0; j < pixelsPerPlane; j++) { 
    298314        int offset = j * bytesPerPixel; 
     
    303319          Float.floatToIntBits((float) number) : 
    304320          (long) number; 
    305         DataTools.unpackBytes(value, buf, offset, 
    306             bytesPerPixel, false); 
     321        DataTools.unpackBytes(value, buf, offset, bytesPerPixel, false); 
    307322      } 
    308323      offsets[no + 1] = in.getFilePointer(); 
     
    314329      for (int i = 1;; i++) { 
    315330        byte c = in.readByte(); 
    316         if (!(c >= '0' && c <= '9') && c != '.') 
     331        if (!(c >= '0' && c <= '9') && c != '.') { 
    317332          return Double.parseDouble(new String(numberBuffer, 0, i)); 
     333        } 
    318334        numberBuffer[i] = c; 
    319335      } 
     
    323339      for (;;) { 
    324340        byte c = in.readByte(); 
    325         if (c != ' ' && c != '\t' && c != '\n') 
     341        if (c != ' ' && c != '\t' && c != '\n') { 
    326342          return c; 
     343        } 
    327344      } 
    328345    } 
     
    355372 
    356373    public byte[] read(int no, byte[] buf) throws FormatException, IOException { 
    357       if (no < currentNo) 
     374      if (no < currentNo) { 
    358375        initDecompressor(); 
     376      } 
    359377      for (; currentNo <= no; currentNo++) { 
    360378        int offset = 0, len = planeSize; 
    361379        while (len > 0) { 
    362380          int count = decompressor.read(buf, offset, len); 
    363           if (count <= 0) 
    364             return null; 
     381          if (count <= 0) return null; 
    365382          offset += count; 
    366383          len -= count; 
     
    396413        if (insn < 0) { 
    397414          insn = (insn & 0x7f); 
    398           if (insn > len) 
     415          if (insn > len) { 
    399416            throw new FormatException("Slice " + currentNo + " is unaligned!"); 
     417          } 
    400418          while (insn > 0) { 
    401419            int count = in.read(buf, off, insn); 
    402             if (count < 0) 
    403               throw new IOException("End of file!"); 
     420            if (count < 0) throw new IOException("End of file!"); 
    404421            insn -= count; 
    405422            len -= count; 
     
    408425        } 
    409426        else { 
    410           if (insn > len) 
     427          if (insn > len) { 
    411428            throw new FormatException("Slice " + currentNo + " is unaligned!"); 
     429          } 
    412430          Arrays.fill(buf, off, off + insn, in.readByte()); 
    413431          len -= insn; 
     
    419437    public byte[] read(int no, byte[] buf) throws FormatException, IOException { 
    420438      if (maxOffsetIndex < no) { 
    421         if (currentNo != maxOffsetIndex) 
     439        if (currentNo != maxOffsetIndex) { 
    422440          in.seek(offsets[maxOffsetIndex]); 
     441        } 
    423442        while (maxOffsetIndex < no) { 
    424443          read(buf, planeSize); 
     
    427446      } 
    428447      else { 
    429         if (currentNo != no) 
     448        if (currentNo != no) { 
    430449          in.seek(offsets[no]); 
     450        } 
    431451        read(buf, planeSize); 
    432         if (maxOffsetIndex == no) 
     452        if (maxOffsetIndex == no) { 
    433453          offsets[++maxOffsetIndex] = in.getFilePointer(); 
     454        } 
    434455      } 
    435456      currentNo = no + 1; 
  • trunk/components/bio-formats/src/loci/formats/in/BioRadGelReader.java

    r6070 r6113  
    7878    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
    7979 
    80  
    8180    if (offset > PIXEL_OFFSET) { 
    8281      in.seek(offset + 1285); 
     
    108107    int skip = in.readInt() - 28; 
    109108 
    110     in.seek(348 + skip - 8187); 
    111     String scannerName = in.readCString(); 
    112     in.skipBytes(8); 
    113     in.readCString(); 
    114     in.skipBytes(8); 
    115     String imageArea = in.readCString(); 
     109    double physicalWidth = 0d, physicalHeight = 0d; 
     110    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     111      in.seek(348 + skip - 8187); 
     112      String scannerName = in.readCString(); 
     113      in.skipBytes(8); 
     114      in.readCString(); 
     115      in.skipBytes(8); 
     116      String imageArea = in.readCString(); 
    116117 
    117     scannerName = scannerName.substring(scannerName.indexOf(":") + 1).trim(); 
    118     addGlobalMeta("Scanner name", scannerName); 
     118      scannerName = scannerName.substring(scannerName.indexOf(":") + 1).trim(); 
     119      addGlobalMeta("Scanner name", scannerName); 
    119120 
    120     imageArea = imageArea.substring(imageArea.indexOf(":") + 1).trim(); 
    121     double physicalWidth = 0d, physicalHeight = 0d; 
    122     int xIndex = imageArea.indexOf("x"); 
    123     if (xIndex > 0) { 
    124       String width = imageArea.substring(1, imageArea.indexOf(" ")); 
    125       String height = 
    126         imageArea.substring(xIndex + 1, imageArea.indexOf(" ", xIndex + 2)); 
    127       physicalWidth = Double.parseDouble(width.trim()) * 1000; 
    128       physicalHeight = Double.parseDouble(height.trim()) * 1000; 
     121      imageArea = imageArea.substring(imageArea.indexOf(":") + 1).trim(); 
     122      int xIndex = imageArea.indexOf("x"); 
     123      if (xIndex > 0) { 
     124        String width = imageArea.substring(1, imageArea.indexOf(" ")); 
     125        String height = 
     126          imageArea.substring(xIndex + 1, imageArea.indexOf(" ", xIndex + 2)); 
     127        physicalWidth = Double.parseDouble(width.trim()) * 1000; 
     128        physicalHeight = Double.parseDouble(height.trim()) * 1000; 
     129      } 
    129130    } 
    130131 
     
    175176 
    176177    store.setImageCreationDate(date, 0); 
    177     store.setDimensionsPhysicalSizeX(physicalWidth / getSizeX(), 0, 0); 
    178     store.setDimensionsPhysicalSizeY(physicalHeight / getSizeY(), 0, 0); 
     178    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     179      store.setDimensionsPhysicalSizeX(physicalWidth / getSizeX(), 0, 0); 
     180      store.setDimensionsPhysicalSizeY(physicalHeight / getSizeY(), 0, 0); 
     181    } 
    179182  } 
    180183 
  • trunk/components/bio-formats/src/loci/formats/in/BioRadReader.java

    r6107 r6113  
    9595  public static final int NOTE_TYPE_4D_SERIES = 22; 
    9696 
     97  /** Structure labels. */ 
     98  public static final String[] STRUCTURE_LABELS_1 = { 
     99    "Scan Channel", "Both mode", "Speed", "Filter", "Factor", "Number of scans", 
     100    "Photon counting mode (channel 1)", "Photon counting detector (channel 1)", 
     101    "Photon counting mode (channel 2)", "Photon counting detector (channel 2)", 
     102    "Photon mode", "Objective magnification", "Zoom factor", "Motor on", 
     103    "Z Step Size" 
     104  }; 
     105 
     106  public static final String[] STRUCTURE_LABELS_2 = { 
     107    "Z Start", "Z Stop", "Scan area X coordinate", "Scan area Y coordinate", 
     108    "Scan area width", "Scan area height" 
     109  }; 
     110 
     111  public static final String[] STRUCTURE_LABELS_3 = { 
     112    "Iris for PMT", "Gain for PMT", "Black level for PMT", 
     113    "Emission filter for PMT", "Multiplier for channel" 
     114  }; 
     115 
     116  public static final String[] STRUCTURE_LABELS_4 = { 
     117    "enhanced", "PMT 1 percentage", "PMT 2 percentage", 
     118    "Transmission 1 percentage", "Transmission 2 percentage", 
     119    "Transmission 3 percentage" 
     120  }; 
     121 
     122  public static final String[] STRUCTURE_LABELS_5 = { 
     123    "laser ", "excitation filter for laser ", "ND filter for laser ", 
     124    "emission filter for laser " 
     125  }; 
     126 
     127  public static final String[] STRUCTURE_LABELS_6 = { 
     128    "Part number for laser 3", "Part number for excitation filter for laser 3", 
     129    "Part number for ND filter for laser 3", 
     130    "Part number for emission filter for laser 3", 
     131    "Part number for filter block 1", "Part number for filter block 2" 
     132  }; 
     133 
    97134  public static final String[] PIC_SUFFIX = {"pic"}; 
    98135 
     
    272309    } 
    273310 
    274     int merged = in.readShort(); 
    275     int color1 = in.readShort(); 
    276     int fileId = in.readShort(); 
    277     int ramp2min = in.readShort(); 
    278     int ramp2max = in.readShort(); 
    279     int color2 = in.readShort(); 
    280     int edited = in.readShort(); 
    281     int lens = in.readShort(); 
    282     float magFactor = in.readFloat(); 
    283  
    284     // check validity of header 
    285     if (fileId != PIC_FILE_ID) { 
    286       throw new FormatException("Invalid file header : " + fileId); 
    287     } 
    288  
    289     // populate metadata fields 
    290     addGlobalMeta("nx", getSizeX()); 
    291     addGlobalMeta("ny", getSizeY()); 
    292     addGlobalMeta("npic", getImageCount()); 
    293     addGlobalMeta("ramp1_min", ramp1min); 
    294     addGlobalMeta("ramp1_max", ramp1max); 
    295     addGlobalMeta("notes", notes); 
    296     addGlobalMeta("image_number", imageNumber); 
    297     addGlobalMeta("name", name); 
    298     addGlobalMeta("merged", MERGE_NAMES[merged]); 
    299     addGlobalMeta("color1", color1); 
    300     addGlobalMeta("file_id", fileId); 
    301     addGlobalMeta("ramp2_min", ramp2min); 
    302     addGlobalMeta("ramp2_max", ramp2max); 
    303     addGlobalMeta("color2", color2); 
    304     addGlobalMeta("edited", edited); 
    305     addGlobalMeta("lens", lens); 
    306     addGlobalMeta("mag_factor", magFactor); 
     311    float magFactor = 1f; 
     312    int lens = 0; 
     313 
     314    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     315      int merged = in.readShort(); 
     316      int color1 = in.readShort(); 
     317      int fileId = in.readShort(); 
     318      int ramp2min = in.readShort(); 
     319      int ramp2max = in.readShort(); 
     320      int color2 = in.readShort(); 
     321      int edited = in.readShort(); 
     322      lens = in.readShort(); 
     323      magFactor = in.readFloat(); 
     324 
     325      // check validity of header 
     326      if (fileId != PIC_FILE_ID) { 
     327        throw new FormatException("Invalid file header : " + fileId); 
     328      } 
     329 
     330      // populate metadata fields 
     331      addGlobalMeta("nx", getSizeX()); 
     332      addGlobalMeta("ny", getSizeY()); 
     333      addGlobalMeta("npic", getImageCount()); 
     334      addGlobalMeta("ramp1_min", ramp1min); 
     335      addGlobalMeta("ramp1_max", ramp1max); 
     336      addGlobalMeta("notes", notes); 
     337      addGlobalMeta("image_number", imageNumber); 
     338      addGlobalMeta("name", name); 
     339      addGlobalMeta("merged", MERGE_NAMES[merged]); 
     340      addGlobalMeta("color1", color1); 
     341      addGlobalMeta("file_id", fileId); 
     342      addGlobalMeta("ramp2_min", ramp2min); 
     343      addGlobalMeta("ramp2_max", ramp2max); 
     344      addGlobalMeta("color2", color2); 
     345      addGlobalMeta("edited", edited); 
     346      addGlobalMeta("lens", lens); 
     347      addGlobalMeta("mag_factor", magFactor); 
     348    } 
     349    else in.skipBytes(20); 
    307350 
    308351    // skip image data 
     
    332375    MetadataStore store = 
    333376      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
    334  
    335     int nLasers = 0; 
    336377 
    337378    // read notes 
     
    381422    core[0].dimensionOrder = "XYCTZ"; 
    382423 
    383     int nextDetector = 0; 
    384  
     424    boolean multipleFiles = parseNotes(store); 
     425 
     426    if (multipleFiles && isGroupFiles() && pics.size() == 0) { 
     427      // do file grouping 
     428      used.remove(currentId); 
     429      long length = new Location(currentId).length(); 
     430      FilePattern pattern = new FilePattern(new Location(id).getAbsoluteFile()); 
     431      String[] patternFiles = pattern.getFiles(); 
     432      for (String file : patternFiles) { 
     433        Location f = new Location(file); 
     434        if (f.length() == length) { 
     435          pics.add(file); 
     436          used.add(file); 
     437        } 
     438      } 
     439      if (pics.size() == 1) core[0].sizeC = 1; 
     440    } 
     441 
     442    picFiles = pics.toArray(new String[pics.size()]); 
     443    Arrays.sort(picFiles); 
     444    if (picFiles.length > 0) { 
     445      if (getSizeC() == 0) core[0].sizeC = 1; 
     446      core[0].imageCount = npic * picFiles.length; 
     447      if (multipleFiles) { 
     448        core[0].sizeT = getImageCount() / (getSizeZ() * getSizeC()); 
     449      } 
     450      else core[0].sizeC = getImageCount() / (getSizeZ() * getSizeT()); 
     451    } 
     452    else picFiles = null; 
     453 
     454    if (getEffectiveSizeC() != getSizeC() && !isRGB()) { 
     455      core[0].sizeC = 1; 
     456    } 
     457 
     458    LOGGER.info("Reading lookup tables"); 
     459 
     460    lut = new byte[getEffectiveSizeC()][][]; 
     461    for (int channel=0; channel<lut.length; channel++) { 
     462      int plane = getIndex(0, channel, 0); 
     463      String file = 
     464        picFiles == null ? currentId : picFiles[plane % picFiles.length]; 
     465      LOGGER.trace("reading table for C = {} from {}", channel, file); 
     466      RandomAccessInputStream s = new RandomAccessInputStream(file); 
     467      s.order(true); 
     468      readLookupTables(s); 
     469      s.close(); 
     470      if (lut == null) break; 
     471    } 
     472    core[0].indexed = lut != null; 
     473 
     474    MetadataTools.populatePixels(store, this); 
     475    MetadataTools.setDefaultCreationDate(store, id, 0); 
     476    store.setImageName(name, 0); 
     477 
     478    if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     479      // link Instrument and Image 
     480      String instrumentID = MetadataTools.createLSID("Instrument", 0); 
     481      store.setInstrumentID(instrumentID, 0); 
     482      store.setImageInstrumentRef(instrumentID, 0); 
     483 
     484      // link Objective to Image using ObjectiveSettings 
     485      String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
     486      store.setObjectiveID(objectiveID, 0, 0); 
     487      store.setObjectiveSettingsObjective(objectiveID, 0); 
     488 
     489      store.setObjectiveLensNA(new Double(lens), 0, 0); 
     490      store.setObjectiveNominalMagnification((int) magFactor, 0, 0); 
     491      store.setObjectiveCorrection("Unknown", 0, 0); 
     492      store.setObjectiveImmersion("Unknown", 0, 0); 
     493 
     494      // link Detector to Image 
     495      for (int i=0; i<getEffectiveSizeC(); i++) { 
     496        Double detectorOffset = i < offset.size() ? offset.get(i) : null; 
     497        Double detectorGain = i < gain.size() ? gain.get(i) : null; 
     498 
     499        if (detectorOffset != null || detectorGain != null) { 
     500          String detectorID = MetadataTools.createLSID("Detector", 0, i); 
     501          store.setDetectorSettingsDetector(detectorID, 0, i); 
     502          store.setDetectorID(detectorID, 0, i); 
     503          store.setDetectorType("Unknown", 0, i); 
     504        } 
     505        if (detectorOffset != null) { 
     506          store.setDetectorSettingsOffset(detectorOffset, 0, i); 
     507        } 
     508        if (detectorGain != null) { 
     509          store.setDetectorSettingsGain(detectorGain, 0, i); 
     510        } 
     511      } 
     512    } 
     513  } 
     514 
     515  // -- Helper methods -- 
     516 
     517  /** 
     518   * Read all of the note strings from the given file.  If the 'add' flag is 
     519   * set, the notes will be added to the 'noteStrings' list. 
     520   */ 
     521  private void readNotes(RandomAccessInputStream s, boolean add) 
     522    throws IOException 
     523  { 
     524    s.seek(70); 
     525    int imageLen = getSizeX() * getSizeY(); 
     526    if (picFiles == null) imageLen *= getImageCount(); 
     527    else { 
     528      imageLen *= (getImageCount() / picFiles.length); 
     529    } 
     530    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
     531    s.skipBytes(bpp * imageLen + 6); 
     532 
     533    boolean notes = true; 
     534    while (notes) { 
     535      // read in note 
     536 
     537      if (s.getFilePointer() >= s.length()) { 
     538        brokenNotes = true; 
     539        break; 
     540      } 
     541 
     542      Note n = new Note(); 
     543      n.level = s.readShort(); 
     544      notes = s.readInt() != 0; 
     545      n.num = s.readShort(); 
     546      n.status = s.readShort(); 
     547      n.type = s.readShort(); 
     548      n.x = s.readShort(); 
     549      n.y = s.readShort(); 
     550      n.p = s.readString(80); 
     551 
     552      if (n.type < 0 || n.type >= NOTE_NAMES.length) { 
     553        notes = false; 
     554        brokenNotes = true; 
     555        break; 
     556      } 
     557 
     558      if (!add) continue; 
     559 
     560      // be sure to remove binary data from the note text 
     561      int ndx = n.p.length(); 
     562      for (int i=0; i<n.p.length(); i++) { 
     563        if (n.p.charAt(i) == 0) { 
     564          ndx = i; 
     565          break; 
     566        } 
     567      } 
     568 
     569      n.p = n.p.substring(0, ndx).trim(); 
     570 
     571      String value = n.p.replaceAll("=", ""); 
     572      Vector<String> v = new Vector<String>(); 
     573      StringTokenizer t = new StringTokenizer(value, " "); 
     574      while (t.hasMoreTokens()) { 
     575        String token = t.nextToken().trim(); 
     576        if (token.length() > 0) v.add(token); 
     577      } 
     578      String[] tokens = v.toArray(new String[v.size()]); 
     579      try { 
     580        if (tokens.length > 1) { 
     581          int noteType = Integer.parseInt(tokens[1]); 
     582 
     583          if (noteType == 2 && value.indexOf("AXIS_4") != -1) { 
     584            core[0].sizeZ = 1; 
     585            core[0].sizeT = getImageCount(); 
     586            core[0].orderCertain = true; 
     587          } 
     588        } 
     589      } 
     590      catch (NumberFormatException e) { } 
     591 
     592      // add note to list 
     593      noteStrings.add(n); 
     594    } 
     595  } 
     596 
     597  private boolean parseNotes(MetadataStore store) { 
    385598    boolean multipleFiles = false; 
     599    int nextDetector = 0, nLasers = 0; 
    386600    for (int noteIndex=0; noteIndex<noteStrings.size(); noteIndex++) { 
    387601      Note n = noteStrings.get(noteIndex); 
    388       switch (n.type) { 
    389         case NOTE_TYPE_USER: 
    390           // TODO : this should be an overlay 
    391           addGlobalMeta("Note #" + noteIndex, n.toString()); 
    392           break; 
    393         case NOTE_TYPE_SCALEBAR: 
    394           // TODO : this should be an overlay 
    395           // the format of the text is: 
    396           // SCALEBAR = <length> <angle> 
    397           // where <length> is the length of the scalebar in microns, 
    398           // and <angle> is the angle in degrees 
    399           addGlobalMeta("Note #" + noteIndex, n.toString()); 
    400           break; 
    401         case NOTE_TYPE_ARROW: 
    402           // TODO : this should be an overlay 
    403           // the format of the text is: 
    404           // ARROW = <lx> <ly> <angle> <fill> 
    405           // where <lx> and <ly> define the arrow's bounding box, 
    406           // <angle> is the angle in degrees and <fill> is either "Fill" or 
    407           // "Outline" 
    408           addGlobalMeta("Note #" + noteIndex, n.toString()); 
    409           break; 
    410         case NOTE_TYPE_VARIABLE: 
    411           if (n.p.indexOf("=") >= 0) { 
    412             String key = n.p.substring(0, n.p.indexOf("=")).trim(); 
    413             String value = n.p.substring(n.p.indexOf("=") + 1).trim(); 
    414             addGlobalMeta(key, value); 
    415  
    416             if (key.equals("INFO_OBJECTIVE_NAME")) { 
    417               store.setObjectiveModel(value, 0, 0); 
    418             } 
    419             else if (key.equals("INFO_OBJECTIVE_MAGNIFICATION")) { 
    420               store.setObjectiveNominalMagnification( 
    421                 new Integer((int) Float.parseFloat(value)), 0, 0); 
    422             } 
    423             else if (key.equals("LENS_MAGNIFICATION")) { 
    424               store.setObjectiveNominalMagnification( 
    425                 new Integer((int) Float.parseFloat(value)), 0, 0); 
    426             } 
    427             else if (key.startsWith("SETTING")) { 
    428               if (key.indexOf("_DET_") != -1) { 
    429                 int index = key.indexOf("_DET_") + 5; 
    430                 if (key.lastIndexOf("_") > index) { 
    431                   String detectorID = 
    432                     MetadataTools.createLSID("Detector", 0, nextDetector); 
    433                   store.setDetectorID(detectorID, 0, nextDetector); 
    434                   store.setDetectorType("Unknown", 0, nextDetector); 
    435  
    436                   if (key.endsWith("OFFSET")) { 
    437                     if (nextDetector < offset.size()) { 
    438                       offset.setElementAt(new Double(value), nextDetector); 
     602      if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL) { 
     603        switch (n.type) { 
     604          case NOTE_TYPE_USER: 
     605            // TODO : this should be an overlay 
     606            addGlobalMeta("Note #" + noteIndex, n.toString()); 
     607            break; 
     608          case NOTE_TYPE_SCALEBAR: 
     609            // TODO : this should be an overlay 
     610            // the format of the text is: 
     611            // SCALEBAR = <length> <angle> 
     612            // where <length> is the length of the scalebar in microns, 
     613            // and <angle> is the angle in degrees 
     614            addGlobalMeta("Note #" + noteIndex, n.toString()); 
     615            break; 
     616          case NOTE_TYPE_ARROW: 
     617            // TODO : this should be an overlay 
     618            // the format of the text is: 
     619            // ARROW = <lx> <ly> <angle> <fill> 
     620            // where <lx> and <ly> define the arrow's bounding box, 
     621            // <angle> is the angle in degrees and <fill> is either "Fill" or 
     622            // "Outline" 
     623            addGlobalMeta("Note #" + noteIndex, n.toString()); 
     624            break; 
     625          case NOTE_TYPE_VARIABLE: 
     626            if (n.p.indexOf("=") >= 0) { 
     627              String key = n.p.substring(0, n.p.indexOf("=")).trim(); 
     628              String value = n.p.substring(n.p.indexOf("=") + 1).trim(); 
     629              addGlobalMeta(key, value); 
     630 
     631              if (key.equals("INFO_OBJECTIVE_NAME")) { 
     632                store.setObjectiveModel(value, 0, 0); 
     633              } 
     634              else if (key.equals("INFO_OBJECTIVE_MAGNIFICATION")) { 
     635                store.setObjectiveNominalMagnification( 
     636                  (int) Float.parseFloat(value), 0, 0); 
     637              } 
     638              else if (key.equals("LENS_MAGNIFICATION")) { 
     639                store.setObjectiveNominalMagnification( 
     640                  (int) Float.parseFloat(value), 0, 0); 
     641              } 
     642              else if (key.startsWith("SETTING")) { 
     643                if (key.indexOf("_DET_") != -1) { 
     644                  int index = key.indexOf("_DET_") + 5; 
     645                  if (key.lastIndexOf("_") > index) { 
     646                    String detectorID = 
     647                      MetadataTools.createLSID("Detector", 0, nextDetector); 
     648                    store.setDetectorID(detectorID, 0, nextDetector); 
     649                    store.setDetectorType("Unknown", 0, nextDetector); 
     650 
     651                    if (key.endsWith("OFFSET")) { 
     652                      if (nextDetector < offset.size()) { 
     653                        offset.setElementAt(new Double(value), nextDetector); 
     654                      } 
     655                      else { 
     656                        while (nextDetector > offset.size()) { 
     657                          offset.add(null); 
     658                        } 
     659                        offset.add(new Double(value)); 
     660                      } 
    439661                    } 
    440                     else { 
    441                       while (nextDetector > offset.size()) { 
    442                         offset.add(null); 
     662                    else if (key.endsWith("GAIN")) { 
     663                      if (nextDetector < gain.size()) { 
     664                        gain.setElementAt(new Double(value), nextDetector); 
    443665                      } 
    444                       offset.add(new Double(value)); 
     666                      else { 
     667                        while (nextDetector > gain.size()) { 
     668                          gain.add(null); 
     669                        } 
     670                        gain.add(new Double(value)); 
     671                      } 
    445672                    } 
    446                   } 
    447                   else if (key.endsWith("GAIN")) { 
    448                     if (nextDetector < gain.size()) { 
    449                       gain.setElementAt(new Double(value), nextDetector); 
     673                    nextDetector++; 
     674                  } 
     675                } 
     676              } 
     677              else { 
     678                String[] values = value.split(" "); 
     679                if (values.length > 1) { 
     680                  try { 
     681                    int type = Integer.parseInt(values[0]); 
     682                    if (type == 257 && values.length >= 3) { 
     683                      // found length of axis in um 
     684                      Double pixelSize = new Double(values[2]); 
     685                      if (key.equals("AXIS_2")) { 
     686                        store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
     687                      } 
     688                      else if (key.equals("AXIS_3")) { 
     689                        store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
     690                      } 
    450691                    } 
    451                     else { 
    452                       while (nextDetector > gain.size()) { 
    453                         gain.add(null); 
    454                       } 
    455                       gain.add(new Double(value)); 
    456                     } 
    457                   } 
    458                   nextDetector++; 
     692                  } 
     693                  catch (NumberFormatException e) { } 
    459694                } 
    460695              } 
    461696            } 
     697            else if (n.p.startsWith("AXIS_2")) { 
     698              String[] values = n.p.split(" "); 
     699              Double pixelSize = new Double(values[3]); 
     700              store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
     701            } 
     702            else if (n.p.startsWith("AXIS_3")) { 
     703              String[] values = n.p.split(" "); 
     704              Double pixelSize = new Double(values[3]); 
     705              store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
     706            } 
    462707            else { 
    463               String[] values = value.split(" "); 
    464               if (values.length > 1) { 
    465                 try { 
    466                   int type = Integer.parseInt(values[0]); 
    467                   if (type == 257 && values.length >= 3) { 
    468                     // found length of axis in um 
    469                     Double pixelSize = new Double(values[2]); 
    470                     if (key.equals("AXIS_2")) { 
    471                       store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
     708              addGlobalMeta("Note #" + noteIndex, n.toString()); 
     709            } 
     710            break; 
     711          case NOTE_TYPE_STRUCTURE: 
     712            int structureType = (n.x & 0xff00) >> 8; 
     713            int version = (n.x & 0xff); 
     714            String[] values = n.p.split(" "); 
     715            if (structureType == 1) { 
     716              switch (n.y) { 
     717                case 1: 
     718                  for (int i=0; i<STRUCTURE_LABELS_1.length; i++) { 
     719                    addGlobalMeta(STRUCTURE_LABELS_1[i], values[i]); 
     720                  } 
     721 
     722                  store.setObjectiveNominalMagnification( 
     723                    (int) Float.parseFloat(values[11]), 0, 0); 
     724                  store.setDimensionsPhysicalSizeZ( 
     725                    new Double(values[14]), 0, 0); 
     726                  break; 
     727                case 2: 
     728                  for (int i=0; i<STRUCTURE_LABELS_2.length; i++) { 
     729                    addGlobalMeta(STRUCTURE_LABELS_2[i], values[i]); 
     730                  } 
     731 
     732                  double x1 = Double.parseDouble(values[2]); 
     733                  double x2 = Double.parseDouble(values[4]); 
     734                  double width = x2 - x1; 
     735                  width /= getSizeX(); 
     736 
     737                  double y1 = Double.parseDouble(values[3]); 
     738                  double y2 = Double.parseDouble(values[5]); 
     739                  double height = y2 - y1; 
     740                  height /= getSizeY(); 
     741 
     742                  store.setDimensionsPhysicalSizeX(width, 0, 0); 
     743                  store.setDimensionsPhysicalSizeY(height, 0, 0); 
     744 
     745                  break; 
     746                case 3: 
     747                  for (int i=0; i<3; i++) { 
     748                    for (int j=0; j<STRUCTURE_LABELS_3.length; j++) { 
     749                      String v = j == STRUCTURE_LABELS_3.length - 1 ? 
     750                        values[12 + i] : values[i * 4 + j]; 
     751                      addGlobalMeta(STRUCTURE_LABELS_3[j] + " " + (i + 1), v); 
    472752                    } 
    473                     else if (key.equals("AXIS_3")) { 
    474                       store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
     753                  } 
     754                  break; 
     755                case 4: 
     756                  nLasers = Integer.parseInt(values[0]); 
     757                  addGlobalMeta("Number of lasers", values[0]); 
     758                  addGlobalMeta("Number of transmission detectors", values[1]); 
     759                  addGlobalMeta("Number of PMTs", values[2]); 
     760                  for (int i=1; i<=3; i++) { 
     761                    int idx = (i + 1) * 3; 
     762                    addGlobalMeta("Shutter present for laser " + i, 
     763                      values[i + 2]); 
     764                    addGlobalMeta("Neutral density filter for laser " + i, 
     765                      values[idx]); 
     766                    addGlobalMeta("Excitation filter for laser " + i, 
     767                      values[idx + 1]); 
     768                    addGlobalMeta("Use laser " + i, values[idx + 2]); 
     769                  } 
     770                  for (int i=0; i<nLasers; i++) { 
     771                    addGlobalMeta("Neutral density filter name - laser " + 
     772                      (i + 1), values[15 + i]); 
     773                  } 
     774                  break; 
     775                case 5: 
     776                  String prefix = "Excitation filter name - laser "; 
     777                  for (int i=0; i<nLasers; i++) { 
     778                    addGlobalMeta(prefix + (i + 1), values[i]); 
     779                  } 
     780                  break; 
     781                case 6: 
     782                  prefix = "Emission filter name - laser "; 
     783                  for (int i=0; i<nLasers; i++) { 
     784                    addGlobalMeta(prefix + (i + 1), values[i]); 
     785                  } 
     786                  break; 
     787                case 7: 
     788                  for (int i=0; i<2; i++) { 
     789                    prefix = "Mixer " + i + " - "; 
     790                    for (int j=0; j<STRUCTURE_LABELS_4.length; j++) { 
     791                      addGlobalMeta(prefix + STRUCTURE_LABELS_4[j], 
     792                        values[i * 7 + j]); 
    475793                    } 
    476794                  } 
    477                 } 
    478                 catch (NumberFormatException e) { } 
     795                  addGlobalMeta("Mixer 0 - low signal on", values[14]); 
     796                  addGlobalMeta("Mixer 1 - low signal on", values[15]); 
     797                  break; 
     798                case 8: 
     799                case 9: 
     800                case 10: 
     801                  addGlobalMeta("Laser name - laser " + (n.y - 7), values[0]); 
     802                  break; 
     803                case 11: 
     804                  for (int i=0; i<3; i++) { 
     805                    prefix = "Transmission detector " + (i + 1) + " - "; 
     806                    addGlobalMeta(prefix + "offset", values[i * 3]); 
     807                    addGlobalMeta(prefix + "gain", values[i * 3 + 1]); 
     808                    addGlobalMeta(prefix + "black level", values[i * 3 + 2]); 
     809 
     810                    String detectorID = 
     811                      MetadataTools.createLSID("Detector", 0, i); 
     812                    store.setDetectorID(detectorID, 0, i); 
     813                    store.setDetectorOffset(new Double(values[i * 3]), 0, i); 
     814                    store.setDetectorGain(new Double(values[i * 3 + 1]), 0, i); 
     815                    store.setDetectorType("Unknown", 0, i); 
     816                  } 
     817                  break; 
     818                case 12: 
     819                  for (int i=0; i<2; i++) { 
     820                    prefix = "Part number for "; 
     821                    for (int j=0; j<STRUCTURE_LABELS_5.length; j++) { 
     822                      addGlobalMeta(prefix + STRUCTURE_LABELS_5[j] + (i + 1), 
     823                        values[i * 4 + j]); 
     824                    } 
     825                  } 
     826                  break; 
     827                case 13: 
     828                  for (int i=0; i<STRUCTURE_LABELS_6.length; i++) { 
     829                    addGlobalMeta(STRUCTURE_LABELS_6[i], values[i]); 
     830                  } 
     831                  break; 
     832                case 14: 
     833                  prefix = "Filter Block Name - filter block "; 
     834                  addGlobalMeta(prefix + "1", values[0]); 
     835                  addGlobalMeta(prefix + "2", values[1]); 
     836                  break; 
     837                case 15: 
     838                  for (int i=0; i<5; i++) { 
     839                    addGlobalMeta("Image bands status - band " + (i + 1), 
     840                      values[i*3]); 
     841                    addGlobalMeta("Image bands min - band " + (i + 1), 
     842                      values[i*3 + 1]); 
     843                    addGlobalMeta("Image bands max - band " + (i + 1), 
     844                      values[i*3 + 2]); 
     845                    if (store instanceof IMinMaxStore) { 
     846                      ((IMinMaxStore) store).setChannelGlobalMinMax(i, 
     847                        Double.parseDouble(values[i*3 + 1]), 
     848                        Double.parseDouble(values[i*3 + 2]), 0); 
     849                    } 
     850                  } 
     851                  break; 
     852                case 17: 
     853                  int year = Integer.parseInt(values[5]) + 1900; 
     854                  for (int i=0; i<5; i++) { 
     855                    if (values[i].length() == 1) values[i] = "0" + values[i]; 
     856                  } 
     857 
     858                  // date is in yyyy-MM-dd'T'HH:mm:ss 
     859                  String date = year + "-" + values[4] + "-" + values[3] + "T" + 
     860                    values[2] + ":" + values[1] + ":" + values[0]; 
     861                  addGlobalMeta("Acquisition date", date); 
     862                  store.setImageCreationDate(date, 0); 
     863                  break; 
     864                case 18: 
     865                  addGlobalMeta("Mixer 3 - enhanced", values[0]); 
     866                  for (int i=1; i<=3; i++) { 
     867                    addGlobalMeta("Mixer 3 - PMT " + i + " percentage", 
     868                      values[i]); 
     869                    addGlobalMeta("Mixer 3 - Transmission " + i + " percentage", 
     870                      values[i + 3]); 
     871                    addGlobalMeta("Mixer 3 - photon counting " + i, 
     872                      values[i + 7]); 
     873                  } 
     874                  addGlobalMeta("Mixer 3 - low signal on", values[7]); 
     875                  addGlobalMeta("Mixer 3 - mode", values[11]); 
     876                  break; 
     877                case 19: 
     878                  for (int i=1; i<=2; i++) { 
     879                    prefix = "Mixer " + i + " - "; 
     880                    String photon = prefix + "photon counting "; 
     881                    addGlobalMeta(photon + "1", values[i * 4 - 4]); 
     882                    addGlobalMeta(photon + "2", values[i * 4 - 3]); 
     883                    addGlobalMeta(photon + "3", values[i * 4 - 2]); 
     884                    addGlobalMeta(prefix + "mode", values[i * 4 - 1]); 
     885                  } 
     886                  break; 
     887                case 20: 
     888                  addGlobalMeta("Display mode", values[0]); 
     889                  addGlobalMeta("Course", values[1]); 
     890                  addGlobalMeta("Time Course - experiment type", values[2]); 
     891                  addGlobalMeta("Time Course - kd factor", values[3]); 
     892                  store.setExperimentType(values[2], 0); 
     893                  break; 
     894                case 21: 
     895                  addGlobalMeta("Time Course - ion name", values[0]); 
     896                  break; 
     897                case 22: 
     898                  addGlobalMeta("PIC file generated on Isoscan (lite)", 
     899                    values[0]); 
     900                  for (int i=1; i<=3; i++) { 
     901                    addGlobalMeta("Photon counting used (PMT " + i + ")", 
     902                      values[i]); 
     903                    addGlobalMeta("Hot spot filter used (PMT " + i + ")", 
     904                      values[i + 3]); 
     905                    addGlobalMeta("Tx Selector used (TX " + i + ")", 
     906                      values[i + 6]); 
     907                  } 
     908                  break; 
    479909              } 
    480910            } 
    481           } 
    482           else if (n.p.startsWith("AXIS_2")) { 
    483             String[] values = n.p.split(" "); 
    484             Double pixelSize = new Double(values[3]); 
    485             store.setDimensionsPhysicalSizeX(pixelSize, 0, 0); 
    486           } 
    487           else if (n.p.startsWith("AXIS_3")) { 
    488             String[] values = n.p.split(" "); 
    489             Double pixelSize = new Double(values[3]); 
    490             store.setDimensionsPhysicalSizeY(pixelSize, 0, 0); 
    491           } 
    492           else { 
     911            break; 
     912          default: 
     913            // notes for display only 
    493914            addGlobalMeta("Note #" + noteIndex, n.toString()); 
    494           } 
    495           break; 
    496         case NOTE_TYPE_STRUCTURE: 
    497           int structureType = (n.x & 0xff00) >> 8; 
    498           int version = (n.x & 0xff); 
    499           String[] values = n.p.split(" "); 
    500           if (structureType == 1) { 
    501             switch (n.y) { 
    502               case 1: 
    503                 addGlobalMeta("Scan Channel", values[0]); 
    504                 addGlobalMeta("Both mode", values[1]); 
    505                 addGlobalMeta("Speed", values[2]); 
    506                 addGlobalMeta("Filter", values[3]); 
    507                 addGlobalMeta("Factor", values[4]); 
    508                 addGlobalMeta("Number of scans", values[5]); 
    509                 addGlobalMeta("Photon counting mode (channel 1)", values[6]); 
    510                 addGlobalMeta("Photon counting detector (channel 1)", 
    511                   values[7]); 
    512                 addGlobalMeta("Photon counting mode (channel 2)", values[8]); 
    513                 addGlobalMeta("Photon counting detector (channel 2)", 
    514                   values[9]); 
    515                 addGlobalMeta("Photon mode", values[10]); 
    516                 addGlobalMeta("Objective magnification", values[11]); 
    517                 addGlobalMeta("Zoom factor", values[12]); 
    518                 addGlobalMeta("Motor on", values[13]); 
    519                 addGlobalMeta("Z Step Size", values[14]); 
    520  
    521                 store.setObjectiveNominalMagnification( 
    522                   new Integer((int) Float.parseFloat(values[11])), 0, 0); 
    523                 store.setDimensionsPhysicalSizeZ(new Double(values[14]), 0, 0); 
    524                 break; 
    525               case 2: 
    526                 addGlobalMeta("Z Start", values[0]); 
    527                 addGlobalMeta("Z Stop", values[1]); 
    528                 addGlobalMeta("Scan area X coordinate", values[2]); 
    529                 addGlobalMeta("Scan area Y coordinate", values[3]); 
    530                 addGlobalMeta("Scan area width", values[4]); 
    531                 addGlobalMeta("Scan area height", values[5]); 
    532  
    533                 double width = 
    534                   Double.parseDouble(values[4]) - Double.parseDouble(values[2]); 
    535                 width /= getSizeX(); 
    536                 double height = 
    537                   Double.parseDouble(values[5]) - Double.parseDouble(values[3]); 
    538                 height /= getSizeY(); 
    539  
    540                 store.setDimensionsPhysicalSizeX(width, 0, 0); 
    541                 store.setDimensionsPhysicalSizeY(height, 0, 0); 
    542  
    543                 break; 
    544               case 3: 
    545                 for (int i=0; i<3; i++) { 
    546                   addGlobalMeta("Iris for PMT " + (i + 1), values[i * 4]); 
    547                   addGlobalMeta("Gain for PMT " + (i + 1), values[i * 4 + 1]); 
    548                   addGlobalMeta("Black level for PMT " + (i + 1), 
    549                     values[i * 4 + 2]); 
    550                   addGlobalMeta("Emission filter for PMT " + (i+1), 
    551                     values[i*4] + 3); 
    552                   addGlobalMeta("Multiplier for channel " + (i+1), 
    553                     values[12 + i]); 
    554                 } 
    555                 break; 
    556               case 4: 
    557                 nLasers = Integer.parseInt(values[0]); 
    558                 addGlobalMeta("Number of lasers", values[0]); 
    559                 addGlobalMeta("Number of transmission detectors", values[1]); 
    560                 addGlobalMeta("Number of PMTs", values[2]); 
    561                 for (int i=1; i<=3; i++) { 
    562                   int idx = (i + 1) * 3; 
    563                   addGlobalMeta("Shutter present for laser " + i, 
    564                     values[i + 2]); 
    565                   addGlobalMeta("Neutral density filter for laser " + i, 
    566                     values[idx]); 
    567                   addGlobalMeta("Excitation filter for laser " + i, 
    568                     values[idx + 1]); 
    569                   addGlobalMeta("Use laser " + i, values[idx + 2]); 
    570                 } 
    571                 for (int i=0; i<nLasers; i++) { 
    572                   addGlobalMeta("Neutral density filter name - laser " + 
    573                     (i + 1), values[15 + i]); 
    574                 } 
    575                 break; 
    576               case 5: 
    577                 for (int i=0; i<nLasers; i++) { 
    578                   addGlobalMeta("Excitation filter name - laser " + (i+1), 
    579                     values[i]); 
    580                 } 
    581                 break; 
    582               case 6: 
    583                 for (int i=0; i<nLasers; i++) { 
    584                   addGlobalMeta("Emission filter name - laser " + (i+1), 
    585                     values[i]); 
    586                 } 
    587                 break; 
    588               case 7: 
    589                 for (int i=0; i<2; i++) { 
    590                   String prefix = "Mixer " + i; 
    591                   addGlobalMeta(prefix + " - enhanced", values[i*7]); 
    592                   addGlobalMeta(prefix + " - PMT 1 percentage", 
    593                     values[i*7 + 1]); 
    594                   addGlobalMeta(prefix + " - PMT 2 percentage", 
    595                     values[i*7 + 2]); 
    596                   addGlobalMeta(prefix + " - PMT 3 percentage", 
    597                     values[i*7 + 3]); 
    598                   addGlobalMeta(prefix + " - Transmission 1 percentage", 
    599                     values[i * 7 + 4]); 
    600                   addGlobalMeta(prefix + " - Transmission 2 percentage", 
    601                     values[i * 7 + 5]); 
    602                   addGlobalMeta(prefix + " - Transmission 3 percentage", 
    603                     values[i * 7 + 6]); 
    604                 } 
    605                 addGlobalMeta("Mixer 0 - low signal on", values[14]); 
    606                 addGlobalMeta("Mixer 1 - low signal on", values[15]); 
    607                 break; 
    608               case 8: 
    609                 addGlobalMeta("Laser name - laser 1", values[0]); 
    610                 break; 
    611               case 9: 
    612                 addGlobalMeta("Laser name - laser 2", values[0]); 
    613                 break; 
    614               case 10: 
    615                 addGlobalMeta("Laser name - laser 3", values[0]); 
    616                 break; 
    617               case 11: 
    618                 for (int i=0; i<3; i++) { 
    619                   String prefix = "Transmission detector " + (i + 1) + " - "; 
    620                   addGlobalMeta(prefix + "offset", values[i * 3]); 
    621                   addGlobalMeta(prefix + "gain", values[i * 3 + 1]); 
    622                   addGlobalMeta(prefix + "black level", values[i * 3 + 2]); 
    623  
    624                   String detectorID = 
    625                     MetadataTools.createLSID("Detector", 0, i); 
    626                   store.setDetectorID(detectorID, 0, i); 
    627                   store.setDetectorOffset(new Double(values[i * 3]), 0, i); 
    628                   store.setDetectorGain(new Double(values[i * 3 + 1]), 0, i); 
    629                   store.setDetectorType("Unknown", 0, i); 
    630                 } 
    631                 break; 
    632               case 12: 
    633                 for (int i=0; i<2; i++) { 
    634                   String prefix = "Part number for "; 
    635                   addGlobalMeta(prefix + "laser " + (i + 1), values[i * 4]); 
    636                   addGlobalMeta(prefix + "excitation filter for laser " + 
    637                     (i + 1), values[i * 4 + 1]); 
    638                   addGlobalMeta(prefix + "ND filter for laser " + (i + 1), 
    639                     values[i * 4 + 2]); 
    640                   addGlobalMeta(prefix + "emission filter for laser " + (i + 1), 
    641                     values[i * 4 + 3]); 
    642                 } 
    643                 break; 
    644               case 13: 
    645                   addGlobalMeta("Part number for laser 3", values[0]); 
    646                   addGlobalMeta("Part number for excitation filter for laser 3", 
    647                     values[1]); 
    648                   addGlobalMeta("Part number for ND filter for laser 3", 
    649                     values[2]); 
    650                   addGlobalMeta("Part number for emission filter for laser 3", 
    651                     values[3]); 
    652                   addGlobalMeta("Part number for filter block 1", values[4]); 
    653                   addGlobalMeta("Part number for filter block 2", values[5]); 
    654                 break; 
    655               case 14: 
    656                 addGlobalMeta("Filter Block Name - filter block 1", values[0]); 
    657                 addGlobalMeta("Filter Block Name - filter block 2", values[1]); 
    658                 break; 
    659               case 15: 
    660                 for (int i=0; i<5; i++) { 
    661                   addGlobalMeta("Image bands status - band " + (i + 1), 
    662                     values[i*3]); 
    663                   addGlobalMeta("Image bands min - band " + (i + 1), 
    664                     values[i*3 + 1]); 
    665                   addGlobalMeta("Image bands max - band " + (i + 1), 
    666                     values[i*3 + 2]); 
    667                   if (store instanceof IMinMaxStore) { 
    668                     ((IMinMaxStore) store).setChannelGlobalMinMax(i, 
    669                       Double.parseDouble(values[i*3 + 1]), 
    670                       Double.parseDouble(values[i*3 + 2]), 0); 
    671                   } 
    672                 } 
    673                 break; 
    674               case 17: 
    675                 int year = Integer.parseInt(values[5]) + 1900; 
    676                 for (int i=0; i<5; i++) { 
    677                   if (values[i].length() == 1) values[i] = "0" + values[i]; 
    678                 } 
    679  
    680                 // date is in yyyy-MM-dd'T'HH:mm:ss 
    681                 String date = year + "-" + values[4] + "-" + values[3] + "T" + 
    682                   values[2] + ":" + values[1] + ":" + values[0]; 
    683                 addGlobalMeta("Acquisition date", date); 
    684                 store.setImageCreationDate(date, 0); 
    685                 break; 
    686               case 18: 
    687                 addGlobalMeta("Mixer 3 - enhanced", values[0]); 
    688                 for (int i=1; i<=3; i++) { 
    689                   addGlobalMeta("Mixer 3 - PMT " + i + " percentage", 
    690                     values[i]); 
    691                   addGlobalMeta("Mixer 3 - Transmission " + i + " percentage", 
    692                     values[i + 3]); 
    693                   addGlobalMeta("Mixer 3 - photon counting " + i, 
    694                     values[i + 7]); 
    695                 } 
    696                 addGlobalMeta("Mixer 3 - low signal on", values[7]); 
    697                 addGlobalMeta("Mixer 3 - mode", values[11]); 
    698                 break; 
    699               case 19: 
    700                 for (int i=1; i<=2; i++) { 
    701                   String prefix = "Mixer " + i; 
    702                   addGlobalMeta(prefix + " - photon counting 1", 
    703                     values[i * 4 - 4]); 
    704                   addGlobalMeta(prefix + " - photon counting 2", 
    705                     values[i * 4 - 3]); 
    706                   addGlobalMeta(prefix + " - photon counting 3", 
    707                     values[i * 4 - 2]); 
    708                   addGlobalMeta(prefix + " - mode", values[i * 4 - 1]); 
    709                 } 
    710                 break; 
    711               case 20: 
    712                 addGlobalMeta("Display mode", values[0]); 
    713                 addGlobalMeta("Course", values[1]); 
    714                 addGlobalMeta("Time Course - experiment type", values[2]); 
    715                 addGlobalMeta("Time Course - kd factor", values[3]); 
    716                 store.setExperimentType(values[2], 0); 
    717                 break; 
    718               case 21: 
    719                 addGlobalMeta("Time Course - ion name", values[0]); 
    720                 break; 
    721               case 22: 
    722                 addGlobalMeta("PIC file generated on Isoscan (lite)", 
    723                   values[0]); 
    724                 for (int i=1; i<=3; i++) { 
    725                   addGlobalMeta("Photon counting used (PMT " + i + ")", 
    726                     values[i]); 
    727                   addGlobalMeta("Hot spot filter used (PMT " + i + ")", 
    728                     values[i+3]); 
    729                   addGlobalMeta("Tx Selector used (TX " + i + ")", 
    730                     values[i + 6]); 
    731                 } 
    732                 break; 
    733             } 
    734           } 
    735           break; 
    736         default: 
    737           // notes for display only 
    738           addGlobalMeta("Note #" + noteIndex, n.toString()); 
     915        } 
    739916      } 
    740917 
     
    756933        int axisType = Integer.parseInt(noteType); 
    757934 
    758         if (values.length > 2) { 
     935        if (axisType == 11 && values.length > 2) { 
     936          addGlobalMeta(key + " RGB type (X)", values[2]); 
     937          addGlobalMeta(key + " RGB type (Y)", values[3]); 
     938 
     939          if (key.equals("AXIS_4")) { 
     940            // this is a single section multi-channel dataset 
     941            core[0].sizeC = getImageCount(); 
     942            core[0].sizeZ = 1; 
     943            core[0].sizeT = 1; 
     944          } 
     945          else if (key.equals("AXIS_9")) { 
     946            multipleFiles = true; 
     947            core[0].sizeC = (int) Double.parseDouble(values[3]); 
     948          } 
     949        } 
     950 
     951        if (getMetadataOptions().getMetadataLevel() == MetadataLevel.ALL && 
     952          values.length > 2) 
     953        { 
    759954          switch (axisType) { 
    760955            case 1: 
     
    784979              addGlobalMeta(key + " calibrated intensity max", values[5]); 
    785980              break; 
    786             case 11: 
    787               addGlobalMeta(key + " RGB type (X)", values[2]); 
    788               addGlobalMeta(key + " RGB type (Y)", values[3]); 
    789  
    790               if (key.equals("AXIS_4")) { 
    791                 // this is a single section multi-channel dataset 
    792                 core[0].sizeC = getImageCount(); 
    793                 core[0].sizeZ = 1; 
    794                 core[0].sizeT = 1; 
    795               } 
    796               else if (key.equals("AXIS_9")) { 
    797                 multipleFiles = true; 
    798                 core[0].sizeC = (int) Double.parseDouble(values[3]); 
    799               } 
    800               break; 
    801981            case 14: 
    802982              addGlobalMeta(key + " time course type (X)", values[2]); 
     
    8211001      } 
    8221002    } 
    823  
    824     if (multipleFiles && isGroupFiles() && pics.size() == 0) { 
    825       // do file grouping 
    826       used.remove(currentId); 
    827       long length = new Location(currentId).length(); 
    828       FilePattern pattern = new FilePattern(new Location(id).getAbsoluteFile()); 
    829       String[] patternFiles = pattern.getFiles(); 
    830       for (String file : patternFiles) { 
    831         Location f = new Location(file); 
    832         if (f.length() == length) { 
    833           pics.add(file); 
    834           used.add(file); 
    835         } 
    836       } 
    837       if (pics.size() == 1) core[0].sizeC = 1; 
    838     } 
    839  
    840     picFiles = pics.toArray(new String[pics.size()]); 
    841     Arrays.sort(picFiles); 
    842     if (picFiles.length > 0) { 
    843       if (getSizeC() == 0) core[0].sizeC = 1; 
    844       core[0].imageCount = npic * picFiles.length; 
    845       if (multipleFiles) { 
    846         core[0].sizeT = getImageCount() / (getSizeZ() * getSizeC()); 
    847       } 
    848       else core[0].sizeC = getImageCount() / (getSizeZ() * getSizeT()); 
    849     } 
    850     else picFiles = null; 
    851  
    852     if (getEffectiveSizeC() != getSizeC() && !isRGB()) { 
    853       core[0].sizeC = 1; 
    854     } 
    855  
    856     LOGGER.info("Reading lookup tables"); 
    857  
    858     lut = new byte[getEffectiveSizeC()][][]; 
    859     for (int channel=0; channel<lut.length; channel++) { 
    860       int plane = getIndex(0, channel, 0); 
    861       String file = 
    862         picFiles == null ? currentId : picFiles[plane % picFiles.length]; 
    863       LOGGER.trace("reading table for C = {} from {}", channel, file); 
    864       RandomAccessInputStream s = new RandomAccessInputStream(file); 
    865       s.order(true); 
    866       readLookupTables(s); 
    867       s.close(); 
    868       if (lut == null) break; 
    869     } 
    870     core[0].indexed = lut != null; 
    871  
    872     MetadataTools.populatePixels(store, this); 
    873     MetadataTools.setDefaultCreationDate(store, id, 0); 
    874     store.setImageName(name, 0); 
    875  
    876     // link Instrument and Image 
    877     String instrumentID = MetadataTools.createLSID("Instrument", 0); 
    878     store.setInstrumentID(instrumentID, 0); 
    879     store.setImageInstrumentRef(instrumentID, 0); 
    880  
    881     // link Objective to Image using ObjectiveSettings 
    882     String objectiveID = MetadataTools.createLSID("Objective", 0, 0); 
    883     store.setObjectiveID(objectiveID, 0, 0); 
    884     store.setObjectiveSettingsObjective(objectiveID, 0); 
    885  
    886     store.setObjectiveLensNA(new Double(lens), 0, 0); 
    887     store.setObjectiveNominalMagnification((int) magFactor, 0, 0); 
    888     store.setObjectiveCorrection("Unknown", 0, 0); 
    889     store.setObjectiveImmersion("Unknown", 0, 0); 
    890  
    891     // link Detector to Image 
    892     for (int i=0; i<getEffectiveSizeC(); i++) { 
    893       Double detectorOffset = i < offset.size() ? offset.get(i) : null; 
    894       Double detectorGain = i < gain.size() ? gain.get(i) : null; 
    895  
    896       if (detectorOffset != null || detectorGain != null) { 
    897         String detectorID = MetadataTools.createLSID("Detector", 0, i); 
    898         store.setDetectorSettingsDetector(detectorID, 0, i); 
    899         store.setDetectorID(detectorID, 0, i); 
    900         store.setDetectorType("Unknown", 0, i); 
    901       } 
    902       if (detectorOffset != null) { 
    903         store.setDetectorSettingsOffset(detectorOffset, 0, i); 
    904       } 
    905       if (detectorGain != null) { 
    906         store.setDetectorSettingsGain(detectorGain, 0, i); 
    907       } 
    908     } 
    909   } 
    910  
    911   // -- Helper methods -- 
    912  
    913   /** 
    914    * Read all of the note strings from the given file.  If the 'add' flag is 
    915    * set, the notes will be added to the 'noteStrings' list. 
    916    */ 
    917   private void readNotes(RandomAccessInputStream s, boolean add) 
    918     throws IOException 
    919   { 
    920     s.seek(70); 
    921     int imageLen = getSizeX() * getSizeY(); 
    922     if (picFiles == null) imageLen *= getImageCount(); 
    923     else { 
    924       imageLen *= (getImageCount() / picFiles.length); 
    925     } 
    926     int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
    927     s.skipBytes(bpp * imageLen + 6); 
    928  
    929     boolean notes = true; 
    930     while (notes) { 
    931       // read in note 
    932  
    933       if (s.getFilePointer() >= s.length()) { 
    934         brokenNotes = true; 
    935         break; 
    936       } 
    937  
    938       Note n = new Note(); 
    939       n.level = s.readShort(); 
    940       notes = s.readInt() != 0; 
    941       n.num = s.readShort(); 
    942       n.status = s.readShort(); 
    943       n.type = s.readShort(); 
    944       n.x = s.readShort(); 
    945       n.y = s.readShort(); 
    946       n.p = s.readString(80); 
    947  
    948       if (n.type < 0 || n.type >= NOTE_NAMES.length) { 
    949         notes = false; 
    950         brokenNotes = true; 
    951         break; 
    952       } 
    953  
    954       if (!add) continue; 
    955  
    956       // be sure to remove binary data from the note text 
    957       int ndx = n.p.length(); 
    958       for (int i=0; i<n.p.length(); i++) { 
    959         if (n.p.charAt(i) == 0) { 
    960           ndx = i; 
    961           break; 
    962         } 
    963       } 
    964  
    965       n.p = n.p.substring(0, ndx).trim(); 
    966  
    967       String value = n.p.replaceAll("=", ""); 
    968       Vector<String> v = new Vector<String>(); 
    969       StringTokenizer t = new StringTokenizer(value, " "); 
    970       while (t.hasMoreTokens()) { 
    971         String token = t.nextToken().trim(); 
    972         if (token.length() > 0) v.add(token); 
    973       } 
    974       String[] tokens = v.toArray(new String[v.size()]); 
    975       try { 
    976         if (tokens.length > 1) { 
    977           int noteType = Integer.parseInt(tokens[1]); 
    978  
    979           if (noteType == 2 && value.indexOf("AXIS_4") != -1) { 
    980             core[0].sizeZ = 1; 
    981             core[0].sizeT = getImageCount(); 
    982             core[0].orderCertain = true; 
    983           } 
    984         } 
    985       } 
    986       catch (NumberFormatException e) { } 
    987  
    988       // add note to list 
    989       noteStrings.add(n); 
    990     } 
     1003    return multipleFiles; 
    9911004  } 
    9921005 
  • trunk/components/bio-formats/src/loci/formats/tools/AmiraParameters.java

    r5605 r6113  
    3838 * AmiraParameters handles parsing and writing of AmiraMesh headers. 
    3939 * 
     40 * <dl><dt><b>Source code:</b></dt> 
     41 * <dd><a href="https://skyking.microscopy.wisc.edu/trac/java/browser/trunk/components/bio-formats/src/loci/formats/tools/AmiraParameters.java">Trac</a>, 
     42 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/bio-formats/src/loci/formats/tools/AmiraParameters.java">SVN</a></dd></dl> 
     43 * 
    4044 * @author Gregory Jefferis jefferis at gmail.com 
    4145 * @author Johannes Schindelin johannes.schindelin at gmx.de 
     
    8286      "(BINARY|ASCII)(-LITTLE-ENDIAN)*").matcher(firstLine); 
    8387    if (amiraMeshDef.find()) { 
    84       if (amiraMeshDef.group(1).equals("BINARY")) 
     88      if (amiraMeshDef.group(1).equals("BINARY")) { 
    8589        littleEndian = amiraMeshDef.group(2) != null; 
    86       else if(amiraMeshDef.group(1).equals("ASCII")) 
     90      } 
     91      else if (amiraMeshDef.group(1).equals("ASCII")) { 
    8792        ascii = true; 
    88       else 
     93      } 
     94      else { 
    8995        syntaxError("Can't recognise this Amira file type"); 
    90     } 
    91     else 
     96      } 
     97    } 
     98    else { 
    9299      syntaxError("Doesn't seem to be an Amira file"); 
     100    } 
    93101 
    94102    column = 0; 
     
    125133        Map streamMap = (Map) al.get(1); 
    126134        Iterator it = streamMap.keySet().iterator(); 
    127         if (it.hasNext()) 
     135        if (it.hasNext()) { 
    128136          streamTypes[i] = (String) it.next(); 
    129         else 
     137        } 
     138        else { 
    130139          syntaxError("Unable to identify data type"); 
     140        } 
    131141        i++; 
    132142      } 
     
    174184      } 
    175185      else if(key.equals("nNodes") || key.equals("nTriangles") || 
    176           key.equals("nTetrahedra") || key.equals("nEdges")) 
     186        key.equals("nTetrahedra") || key.equals("nEdges")) 
     187      { 
    177188        throw new FormatException("Don't know yet how to handle " + key); 
    178       else if (key.equals("Parameters")) 
     189      } 
     190      else if (key.equals("Parameters")) { 
    179191        value = readMap(); 
     192      } 
    180193      else if (key.equals("Lattice") || key.equals("Vertices") || 
    181           key.equals("Lines") || key.equals("Markers")) 
     194        key.equals("Lines") || key.equals("Markers")) 
    182195      { 
    183196        ArrayList list = new ArrayList(); 
     
    191204          skipWhiteSpace(); 
    192205        } 
    193         if (c != '@') 
    194           syntaxError("Missing @"); 
     206        if (c != '@') syntaxError("Missing @"); 
    195207 
    196208        // store information in an array 
     
    198210        int index = readNumber().intValue(); 
    199211 
    200         if (c == '(') 
    201           list.add(readQuotedString()); 
     212        if (c == '(') list.add(readQuotedString()); 
    202213        skipComment(); 
    203214 
     
    205216        continue; // no need to store this information 
    206217      } 
    207       else 
    208         skipComment(); 
     218      else skipComment(); 
    209219      map.put(key, value); 
    210220    } 
     
    217227      column = 1; 
    218228    } 
    219     else 
    220       column++; 
     229    else column++; 
    221230    return c; 
    222231  } 
    223232 
    224233  protected void skipComment() throws IOException { 
    225     while (c != '\n') 
    226       readByte(); 
     234    while (c != '\n') readByte(); 
    227235  } 
    228236 
    229237  protected void skipWhiteSpace() throws IOException { 
    230     while (c == ' ' || c == '\t' || c == '\n') 
    231       readByte(); 
     238    while (c == ' ' || c == '\t' || c == '\n') readByte(); 
    232239  } 
    233240 
     
    244251    String string = ""; 
    245252    while ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+' || 
    246         c == 'e') 
     253      c == 'e') 
    247254    { 
    248255      string += c; 
     
    250257    } 
    251258    try { 
    252       if (string.indexOf('.') < 0 && string.indexOf('e') < 0) 
     259      if (string.indexOf('.') < 0 && string.indexOf('e') < 0) { 
    253260        return Integer.valueOf(string); 
     261      } 
    254262      return Double.valueOf(string); 
    255263    } 
     
    265273    int currentRow = row; 
    266274    // Keep reading until we hit newline or a non-numeric 
    267     while (currentRow==row && 
     275    while (currentRow == row && 
    268276      ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+')) 
    269277    { 
     
    278286    // read integers until end of line 
    279287    ArrayList<Number> result = new ArrayList<Number>(); 
    280     boolean intsOnly=true; 
     288    boolean intsOnly = true; 
    281289    int currentRow = row; 
    282290    // Keep reading until we hit newline or a non-numeric 
    283     while (currentRow==row && 
    284         ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+')) 
     291    while (currentRow == row && 
     292      ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == '+')) 
    285293    { 
    286       Number n=readNumber(); 
    287       if(n instanceof Double) 
    288         intsOnly=false; 
     294      Number n = readNumber(); 
     295      if (n instanceof Double) { 
     296        intsOnly = false; 
     297      } 
    289298      result.add(n); 
    290299      skipWhiteSpace(); 
    291300    } 
    292     if(intsOnly) { 
     301    if (intsOnly) { 
    293302      Integer[] intResult = new Integer[result.size()]; 
    294303      return result.toArray(intResult); 
     
    298307      // of Integers and Doubles 
    299308      Double[] doubleResult = new Double[result.size()]; 
    300       for(int i = 0; i < doubleResult.length; i++) { 
     309      for (int i = 0; i < doubleResult.length; i++) { 
    301310        doubleResult[i] = new Double(result.get(i).doubleValue()); 
    302311      } 
     
    329338  protected String readQuotedString() throws FormatException, IOException { 
    330339    int quote = c; 
    331     if (quote == '(') 
     340    if (quote == '(') { 
    332341      quote = ')'; 
    333     else if (quote != '"' && quote != '\'') 
     342    } 
     343    else if (quote != '"' && quote != '\'') { 
    334344      syntaxError("Invalid quote: " + c); 
     345    } 
    335346    String result = ""; 
    336347    for (;;) { 
     
    340351        return result; 
    341352      } 
    342       if (quote == '"' && c == '\\') 
     353      if (quote == '"' && c == '\\') { 
    343354        readByte(); 
     355      } 
    344356      result += c; 
    345357    } 
     
    347359 
    348360  protected Map readMap() throws FormatException, IOException { 
    349     if (c != '{') 
     361    if (c != '{') { 
    350362      syntaxError("Illegal block: " + c); 
     363    } 
    351364    readByte(); 
    352365    Map subMap = new LinkedHashMap(); 
     
    363376 
    364377      String key = readKey(); 
    365       if (key.equals("")) 
    366         syntaxError("Invalid key"); 
     378      if (key.equals("")) syntaxError("Invalid key"); 
    367379 
    368380      skipWhiteSpace(); 
    369381      Object value; 
    370       if (c == '{') 
    371         value = readMap(); 
     382      if (c == '{') value = readMap(); 
    372383      else { 
    373         if (key.equals("BoundingBox")) 
     384        if (key.equals("BoundingBox")) { 
    374385          value = readDoubleArray(6); 
    375         else if (key.equals("MinMax")) 
     386        } 
     387        else if (key.equals("MinMax")) { 
    376388          value = readDoubleArray(2); 
     389        } 
    377390        else if (key.startsWith("byte") || key.startsWith("short") || 
    378             key.startsWith("ushort") || key.startsWith("float")) 
     391          key.startsWith("ushort") || key.startsWith("float")) 
     392        { 
    379393          value = readKey(); 
    380         else if (c == '"' || c == '\'') 
     394        } 
     395        else if (c == '"' || c == '\'') { 
    381396          value = readQuotedString(); 
     397        } 
    382398        else { 
    383399          Number[] na = readNumberArray(); 
    384           if(na.length==1) 
    385             value = na[0]; 
    386           else 
    387             value = na; 
    388         } 
    389  
    390         if (c == ',') 
    391           readByte(); 
     400          if (na.length == 1) value = na[0]; 
     401          else value = na; 
     402        } 
     403 
     404        if (c == ',') readByte(); 
    392405      } 
    393406      subMap.put(key, value); 
     
    419432      result += separator + entry.getKey() + " " + 
    420433        entryToString(entry.getValue(), indent); 
    421       if (result.endsWith("}")) 
     434      if (result.endsWith("}")) { 
    422435        separator = "\n" + indent; 
    423       else 
     436      } 
     437      else { 
    424438        separator = ",\n" + indent; 
     439      } 
    425440    } 
    426441    return result + "\n"; 
     
    430445    throws FormatException 
    431446  { 
    432     if (object instanceof Integer || object instanceof Double) 
     447    if (object instanceof Integer || object instanceof Double) { 
    433448      return object.toString(); 
     449    } 
    434450    if (object instanceof String) { 
    435451      String string = (String) object, result = "\""; 
     
    437453      for (;;) { 
    438454        int nextOffset = string.indexOf('"', offset + 1); 
    439         if (nextOffset < 0) 
     455        if (nextOffset < 0) { 
    440456          break; 
    441         if (nextOffset > offset + 1) 
    442           result += string.substring(offset, 
    443               nextOffset); 
     457        } 
     458        if (nextOffset > offset + 1) { 
     459          result += string.substring(offset, nextOffset); 
     460        } 
    444461        result += "\\"; 
    445462        offset = nextOffset; 
    446463      } 
    447       if (offset + 1 < string.length()) 
     464      if (offset + 1 < string.length()) { 
    448465        result += string.substring(offset); 
     466      } 
    449467      return result + "\""; 
    450468    } 
     
    452470      Integer[] array = (Integer[]) object; 
    453471      String result = null; 
    454       for (int i = 0; i < array.length; i++) 
     472      for (int i = 0; i < array.length; i++) { 
    455473        result = (i > 0 ? result + " " : "") + array[i]; 
     474      } 
    456475      return result; 
    457476    } 
     
    459478      Double[] array = (Double[]) object; 
    460479      String result = null; 
    461       for (int i = 0; i < array.length; i++) 
     480      for (int i = 0; i < array.length; i++) { 
    462481        result = (i > 0 ? result + " " : "") + array[i]; 
     482      } 
    463483      return result; 
    464484    } 
    465     if (object instanceof Map) 
     485    if (object instanceof Map) { 
    466486      return "{\n" + toString((Map) object, indent + "\t") + indent + "}"; 
     487    } 
    467488    if (object instanceof ArrayList) { 
    468489      String result = "{\n"; 
    469       for (Object item : (ArrayList) object) 
     490      for (Object item : (ArrayList) object) { 
    470491        result += entryToString(item, indent + "\t") + "\n"; 
     492      } 
    471493      return result + indent + "}"; 
    472494    } 
    473495    throw new FormatException("Illegal value type: " + 
    474         object.getClass().getName()); 
     496      object.getClass().getName()); 
    475497  } 
    476498 
Note: See TracChangeset for help on using the changeset viewer.