Changeset 4765


Ignore:
Timestamp:
01/30/09 14:42:51 (11 years ago)
Author:
melissa
Message:

Lots of improvements to Metamorph metadata support (see #339).

Location:
trunk/components
Files:
3 edited

Legend:

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

    r4726 r4765  
    5353  private float pixelSizeX, pixelSizeY; 
    5454  private float temperature; 
     55  private String binning; 
     56  private float readOutRate, zoom; 
     57  private float positionX, positionY; 
     58  private float exposure; 
    5559 
    5660  // -- Constructor -- 
     
    8185 
    8286  public float getTemperature() { return temperature; } 
     87 
     88  public String getBinning() { return binning; } 
     89 
     90  public float getReadOutRate() { return readOutRate; } 
     91 
     92  public float getZoom() { return zoom; } 
     93 
     94  public float getStagePositionX() { return positionX; } 
     95 
     96  public float getStagePositionY() { return positionY; } 
     97 
     98  public float getExposure() { return exposure; } 
    8399 
    84100  // -- DefaultHandler API methods -- 
     
    116132              v = line.substring(colon + 1).trim(); 
    117133              metadata.put(k, v); 
    118               if (k.equals("Temperature")) { 
    119                 temperature = Float.parseFloat(v.trim()); 
    120               } 
     134              checkKey(k, v); 
    121135            } 
    122136          } 
     
    128142            int space = value.lastIndexOf(" ", value.indexOf(":", colon + 1)); 
    129143            if (space == -1) space = value.length(); 
    130             v = value.substring(colon + 1, space); 
     144            v = value.substring(colon + 1, space).trim(); 
    131145            metadata.put(k, v); 
    132146            value = value.substring(space).trim(); 
    133147            colon = value.indexOf(":"); 
    134  
    135             if (k.equals("Temperature")) { 
    136               temperature = Float.parseFloat(v.trim()); 
    137             } 
     148            checkKey(k, v); 
    138149          } 
    139150        } 
    140151      } 
    141       else metadata.put(id, value); 
    142  
    143       if (id.equals("spatial-calibration-x")) { 
    144         pixelSizeX = Float.parseFloat(value); 
     152      else { 
     153        metadata.put(id, value); 
     154        checkKey(id, value); 
    145155      } 
    146       else if (id.equals("spatial-calibration-y")) { 
    147         pixelSizeY = Float.parseFloat(value); 
     156    } 
     157  } 
     158 
     159  // -- Helper methods -- 
     160 
     161  /** Check if the value needs to be saved. */ 
     162  private void checkKey(String key, String value) { 
     163    if (key.equals("Temperature")) { 
     164      temperature = Float.parseFloat(value); 
     165    } 
     166    else if (key.equals("spatial-calibration-x")) { 
     167      pixelSizeX = Float.parseFloat(value); 
     168    } 
     169    else if (key.equals("spatial-calibration-y")) { 
     170      pixelSizeY = Float.parseFloat(value); 
     171    } 
     172    else if (key.equals("z-position")) { 
     173      zPositions.add(new Float(value)); 
     174    } 
     175    else if (key.equals("wavelength")) { 
     176      wavelengths.add(new Integer(value)); 
     177    } 
     178    else if (key.equals("acquisition-time-local")) { 
     179      date = value; 
     180      timestamps.add(date); 
     181    } 
     182    else if (key.equals("image-name")) imageName = value; 
     183    else if (key.equals("Binning")) { 
     184      binning = value; 
     185    } 
     186    else if (key.equals("Readout Frequency")) { 
     187      readOutRate = Float.parseFloat(value); 
     188    } 
     189    else if (key.equals("zoom-percent")) { 
     190      zoom = Float.parseFloat(value); 
     191    } 
     192    else if (key.equals("stage-position-x")) { 
     193      positionX = Float.parseFloat(value); 
     194    } 
     195    else if (key.equals("stage-position-y")) { 
     196      positionY = Float.parseFloat(value); 
     197    } 
     198    else if (key.equals("Speed")) { 
     199      readOutRate = Float.parseFloat(value); 
     200    } 
     201    else if (key.equals("Exposure")) { 
     202      if (value.indexOf(" ") != -1) { 
     203        value = value.substring(0, value.indexOf(" ")); 
    148204      } 
    149       else if (id.equals("z-position")) { 
    150         zPositions.add(new Float(value)); 
    151       } 
    152       else if (id.equals("wavelength")) { 
    153         wavelengths.add(new Integer(value)); 
    154       } 
    155       else if (id.equals("acquisition-time-local")) { 
    156         date = value; 
    157         timestamps.add(date); 
    158       } 
    159       else if (id.equals("image-name")) imageName = value; 
     205      exposure = Float.parseFloat(value); 
    160206    } 
    161207  } 
     208 
    162209} 
  • trunk/components/bio-formats/src/loci/formats/in/MetamorphReader.java

    r4726 r4765  
    5757  private static final int UIC4TAG = 33631; 
    5858 
     59  private static final String DATE_FORMAT = "yyyyMMdd HH:mm:ss.SSS"; 
     60 
    5961  // -- Fields -- 
    6062 
     
    6769  /** The TIFF's emWavelength */ 
    6870  private long[] emWavelength; 
     71 
     72  private double[] wave; 
     73 
     74  private String binning; 
     75  private float zoom, stepSize; 
     76  private Float exposureTime; 
     77  private Vector waveNames; 
     78  private long[] internalStamps; 
     79  private double[] zDistances, stageX, stageY; 
    6980 
    7081  private int mmPlanes; //number of metamorph planes 
     
    199210      String z = null, c = null, t = null; 
    200211      Vector hasZ = new Vector(); 
    201       Vector waveNames = new Vector(); 
     212      waveNames = new Vector(); 
    202213 
    203214      while (!line.equals("\"EndFile\"")) { 
     
    217228        else if (key.startsWith("StartTime")) { 
    218229          creationTime = value; 
     230        } 
     231        else if (key.equals("ZStepSize")) { 
     232          stepSize = Float.parseFloat(value); 
    219233        } 
    220234 
     
    343357          newCore[i].orderCertain = true; 
    344358        } 
    345         newCore[0].sizeC = stks[0].length / newCore[0].sizeT; 
     359        newCore[0].sizeC = stks[0].length / getSizeT(); 
    346360        newCore[1].sizeC = stks[1].length / newCore[1].sizeT; 
    347361        newCore[1].sizeZ = 1; 
     
    375389    } 
    376390 
    377     SimpleDateFormat parse = new SimpleDateFormat("yyyyMMdd HH:mm:ss.SSS"); 
    378     SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    379     SimpleDateFormat tsfmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
    380  
    381     Date td; 
    382391    for (int i=0; i<timestamps.size(); i++) { 
    383       td = parse.parse((String) timestamps.get(i), new ParsePosition(0)); 
    384       addMeta("timestamp " + i, tsfmt.format(td)); 
     392      addMeta("timestamp " + i, DataTools.formatDate( 
     393        (String) timestamps.get(i), DATE_FORMAT)); 
    385394    } 
    386395 
    387396    long startDate = 0; 
    388397    if (timestamps.size() > 0) { 
    389       startDate = 
    390         parse.parse((String) timestamps.get(0), new ParsePosition(0)).getTime(); 
    391     } 
     398      startDate = DataTools.getTime((String) timestamps.get(0), DATE_FORMAT); 
     399    } 
     400 
     401    Float positionX = new Float(handler.getStagePositionX()); 
     402    Float positionY = new Float(handler.getStagePositionY()); 
     403    if (exposureTime == null) exposureTime = new Float(handler.getExposure()); 
    392404 
    393405    for (int i=0; i<getImageCount(); i++) { 
     
    395407      if (coords[2] < timestamps.size()) { 
    396408        String stamp = (String) timestamps.get(coords[2]); 
    397         long ms = parse.parse(stamp, new ParsePosition(0)).getTime(); 
     409        long ms = DataTools.getTime(stamp, DATE_FORMAT); 
    398410        store.setPlaneTimingDeltaT(new Float(ms - startDate), 0, 0, i); 
    399         store.setPlaneTimingExposureTime(new Float(0), 0, 0, i); 
     411        store.setPlaneTimingExposureTime(exposureTime, 0, 0, i); 
     412      } 
     413      else if (internalStamps != null && i < internalStamps.length) { 
     414        long delta = internalStamps[i] - internalStamps[0]; 
     415        store.setPlaneTimingDeltaT(new Float(delta / 1000f), 0, 0, i); 
     416        store.setPlaneTimingExposureTime(exposureTime, 0, 0, i); 
     417      } 
     418      if (i < stageX.length) { 
     419        store.setStagePositionPositionX(new Float((float) stageX[i]), 0, 0, i); 
     420      } 
     421      if (i < stageY.length) { 
     422        store.setStagePositionPositionY(new Float((float) stageY[i]), 0, 0, i); 
    400423      } 
    401424    } 
     
    405428    store.setDimensionsPhysicalSizeX(new Float(handler.getPixelSizeX()), 0, 0); 
    406429    store.setDimensionsPhysicalSizeY(new Float(handler.getPixelSizeY()), 0, 0); 
     430    if (zDistances != null) { 
     431      stepSize = (float) zDistances[0]; 
     432    } 
     433    store.setDimensionsPhysicalSizeZ(new Float(stepSize), 0, 0); 
     434 
     435    for (int i=0; i<getSizeC(); i++) { 
     436      if (waveNames != null && i < waveNames.size()) { 
     437        store.setLogicalChannelName((String) waveNames.get(i), 0, i); 
     438      } 
     439      store.setDetectorSettingsBinning(binning, 0, i); 
     440      if (handler.getBinning() != null) { 
     441        store.setDetectorSettingsBinning(handler.getBinning(), 0, i); 
     442      } 
     443      if (handler.getReadOutRate() != 0) { 
     444        store.setDetectorSettingsReadOutRate( 
     445          new Float(handler.getReadOutRate()), 0, i); 
     446      } 
     447      store.setDetectorSettingsDetector("Detector:0", 0, i); 
     448 
     449 
     450      // link LightSource to Image 
     451      store.setLightSourceID("LightSource:" + i, 0, i); 
     452      store.setLightSourceSettingsLightSource("LightSource:" + i, 0, i); 
     453 
     454      int index = getIndex(0, i, 0); 
     455      store.setLightSourceSettingsWavelength( 
     456        new Integer((int) wave[index]), 0, i); 
     457    } 
     458    store.setDetectorID("Detector:0", 0, 0); 
     459    store.setDetectorZoom(new Float(zoom), 0, 0); 
     460    if (handler.getZoom() != 0f) { 
     461      store.setDetectorZoom(new Float(handler.getZoom()), 0, 0); 
     462    } 
     463    store.setDetectorType("Unknown", 0, 0); 
    407464  } 
    408465 
     
    419476      TiffIFDEntry uic2tagEntry = TiffTools.getFirstIFDEntry(in, UIC2TAG); 
    420477      TiffIFDEntry uic4tagEntry = TiffTools.getFirstIFDEntry(in, UIC4TAG); 
    421       int planes = uic4tagEntry.getValueCount(); 
    422       mmPlanes = planes; 
     478      mmPlanes = uic4tagEntry.getValueCount(); 
    423479      parseUIC2Tags(uic2tagEntry.getValueOffset()); 
    424480      parseUIC4Tags(uic4tagEntry.getValueOffset()); 
     
    432488      core[0].imageCount = uic2.length; 
    433489 
    434       long[] uic3 = TiffTools.getIFDLongArray(ifds[0], UIC3TAG, true); 
     490      TiffRational[] uic3 = 
     491        (TiffRational[]) TiffTools.getIFDValue(ifds[0], UIC3TAG); 
     492      wave = new double[uic3.length]; 
    435493      for (int i=0; i<uic3.length; i++) { 
    436         in.seek(uic3[i]); 
    437         put("Wavelength [" + intFormatMax(i, mmPlanes) + "]", 
    438           in.readLong() / in.readLong()); 
     494        wave[i] = uic3[i].doubleValue(); 
     495        addMeta("Wavelength [" + intFormatMax(i, mmPlanes) + "]", wave[i]); 
    439496      } 
    440497 
     
    513570    String descr = TiffTools.getComment(ifds[0]); 
    514571    if (descr != null) { 
    515       StringTokenizer st = new StringTokenizer(descr, "\n"); 
     572      String[] lines = descr.split("\n"); 
    516573      StringBuffer sb = new StringBuffer(); 
    517       boolean first = true; 
    518       while (st.hasMoreTokens()) { 
    519         String line = st.nextToken(); 
     574      for (int i=0; i<lines.length; i++) { 
     575        String line = lines[i].trim(); 
    520576        int colon = line.indexOf(": "); 
     577 
     578        String descrValue = null; 
    521579 
    522580        if (colon < 0) { 
    523581          // normal line (not a key/value pair) 
    524           if (line.trim().length() > 0) { 
     582          if (line.length() > 0) { 
    525583            // not a blank line 
    526             sb.append(line); 
    527             if (!line.endsWith(".")) sb.append("."); 
     584            descrValue = line; 
     585          } 
     586        } 
     587        else { 
     588          if (i == 0) { 
     589            // first line could be mangled; make a reasonable guess 
     590            int dot = line.lastIndexOf(".", colon); 
     591            if (dot >= 0) { 
     592              descrValue = line.substring(0, dot + 1); 
     593            } 
     594            line = line.substring(dot + 1); 
     595            colon -= dot + 1; 
     596          } 
     597 
     598          // append value to description 
     599          if (descrValue != null) { 
     600            sb.append(descrValue); 
     601            if (!descrValue.endsWith(".")) sb.append("."); 
    528602            sb.append("  "); 
    529603          } 
    530           first = false; 
    531           continue; 
    532         } 
    533  
    534         if (first) { 
    535           // first line could be mangled; make a reasonable guess 
    536           int dot = line.lastIndexOf(".", colon); 
    537           if (dot >= 0) { 
    538             String s = line.substring(0, dot + 1); 
    539             sb.append(s); 
    540             if (!s.endsWith(".")) sb.append("."); 
    541             sb.append("  "); 
     604 
     605          // add key/value pair embedded in comment as separate metadata 
     606          String key = line.substring(0, colon); 
     607          String value = line.substring(colon + 2); 
     608          addMeta(key, value); 
     609          if (key.equals("Exposure")) { 
     610            if (value.indexOf(" ") != -1) { 
     611              value = value.substring(0, value.indexOf(" ")); 
     612            } 
     613            float exposure = Float.parseFloat(value); 
     614            exposureTime = new Float(exposure / 1000); 
    542615          } 
    543           line = line.substring(dot + 1); 
    544           colon -= dot + 1; 
    545           first = false; 
    546         } 
    547  
    548         // add key/value pair embedded in comment as separate metadata 
    549         String key = line.substring(0, colon); 
    550         String value = line.substring(colon + 2); 
    551         put(key, value); 
     616        } 
    552617      } 
    553618 
     
    555620      descr = sb.toString().trim(); 
    556621      if (descr.equals("")) metadata.remove("Comment"); 
    557       else put("Comment", descr); 
     622      else addMeta("Comment", descr); 
    558623    } 
    559624    try { 
     
    586651 
    587652    /*number of days since the 1st of January 4713 B.C*/ 
    588     int cDate; 
     653    String cDate; 
    589654    /*milliseconds since 0:00*/ 
    590     int cTime; 
     655    String cTime; 
    591656 
    592657    /*z step, distance separating previous slice from  current one*/ 
    593     double zDistance; 
    594658    String iAsString; 
     659 
     660    zDistances = new double[mmPlanes]; 
     661    internalStamps = new long[mmPlanes]; 
    595662 
    596663    for (int i=0; i<mmPlanes; i++) { 
    597664      iAsString = intFormatMax(i, mmPlanes); 
    598       int num = in.readInt(); 
    599       int den = in.readInt(); 
    600       zDistance = (double) num / den; 
    601       put("zDistance[" + iAsString + "]", zDistance); 
    602       cDate = in.readInt(); 
    603       put("creationDate[" + iAsString + "]", decodeDate(cDate)); 
    604  
    605       cTime = in.readInt(); 
    606       put("creationTime[" + iAsString + "]", decodeTime(cTime)); 
     665      zDistances[i] = readRational(in).doubleValue(); 
     666      addMeta("zDistance[" + iAsString + "]", zDistances[i]); 
     667 
     668      cDate = decodeDate(in.readInt()); 
     669      cTime = decodeTime(in.readInt()); 
     670 
     671      internalStamps[i] = DataTools.getTime(cDate + " " + cTime, 
     672        "dd/MM/yyyy HH:mm:ss:SSS"); 
     673 
     674      addMeta("creationDate[" + iAsString + "]", cDate); 
     675      addMeta("creationTime[" + iAsString + "]", cTime); 
    607676      // modification date and time are skipped as they all seem equal to 0...? 
    608677      in.skip(8); 
     
    624693    long saveLoc = in.getFilePointer(); 
    625694    in.seek(uic4offset); 
    626     boolean end = false; 
    627     short id; 
    628     while (!end) { 
    629       id = in.readShort(); 
    630  
     695    short id = in.readShort(); 
     696    while (id != 0) { 
    631697      switch (id) { 
    632         case 0: 
    633           end = true; 
    634           break; 
    635698        case 28: 
    636699          readStagePositions(); 
    637700          break; 
    638701        case 29: 
    639           readCameraChipOffsets(); 
     702          readRationals( 
     703            new String[] {"cameraXChipOffset", "cameraYChipOffset"}); 
    640704          break; 
    641705        case 37: 
     
    643707          break; 
    644708        case 40: 
    645           readAbsoluteZ(); 
     709          readRationals(new String[] {"absoluteZ"}); 
    646710          break; 
    647711        case 41: 
    648712          readAbsoluteZValid(); 
    649713          break; 
    650         default: 
    651           //unknown tags: do nothing 
    652           break; 
    653       } 
     714      } 
     715      id = in.readShort(); 
    654716    } 
    655717    in.seek(saveLoc); 
    656718  } 
    657719 
    658   void readStagePositions() throws IOException { 
    659     int nx, dx, ny, dy; 
    660     // for each plane: 
    661     // 2 ints (rational:numerator,denominator) for stage X, 
    662     // 2 ints (idem) for stage Y position 
    663     double xPosition, yPosition; 
    664     String iAsString; 
    665     for(int i=0; i<mmPlanes; i++) { 
    666       nx = in.readInt(); 
    667       dx = in.readInt(); 
    668       ny = in.readInt(); 
    669       dy = in.readInt(); 
    670       xPosition = (dx == 0) ? Double.NaN : (double) nx / dx; 
    671       yPosition = (dy == 0) ? Double.NaN : (double) ny / dy; 
    672       iAsString = intFormatMax(i, mmPlanes); 
    673       put("stageX[" + iAsString + "]", xPosition); 
    674       put("stageY[" + iAsString + "]", yPosition); 
    675     } 
    676  
    677   } 
    678  
    679   void readCameraChipOffsets() throws IOException { 
    680     int nx, dx, ny, dy; 
    681     double cameraXChipOffset, cameraYChipOffset; 
    682     String iAsString; 
    683     for(int i=0; i<mmPlanes; i++) { 
    684       iAsString = intFormatMax(i, mmPlanes); 
    685       nx = in.readInt(); 
    686       dx = in.readInt(); 
    687       ny = in.readInt(); 
    688       dy = in.readInt(); 
    689       cameraXChipOffset = (dx == 0) ? Double.NaN: (double) nx / dx; 
    690       cameraYChipOffset = (dy == 0) ? Double.NaN: (double) ny/ dy; 
    691       put("cameraXChipOffset[" + iAsString + "]", cameraXChipOffset); 
    692       put("cameraYChipOffset[" + iAsString + "]", cameraYChipOffset); 
     720  private void readStagePositions() throws IOException { 
     721    stageX = new double[mmPlanes]; 
     722    stageY = new double[mmPlanes]; 
     723    String pos; 
     724    for (int i=0; i<mmPlanes; i++) { 
     725      pos = intFormatMax(i, mmPlanes); 
     726      stageX[i] = readRational(in).doubleValue(); 
     727      stageY[i] = readRational(in).doubleValue(); 
     728      addMeta("stageX[" + pos + "]", stageX[i]); 
     729      addMeta("stageY[" + pos + "]", stageY[i]); 
     730    } 
     731  } 
     732 
     733  private void readRationals(String[] labels) throws IOException { 
     734    String pos; 
     735    for (int i=0; i<mmPlanes; i++) { 
     736      pos = intFormatMax(i, mmPlanes); 
     737      for (int q=0; q<labels.length; q++) { 
     738        addMeta(labels[q] + "[" + pos + "]", readRational(in).doubleValue()); 
     739      } 
    693740    } 
    694741  } 
     
    696743  void readStageLabels() throws IOException { 
    697744    int strlen; 
    698     byte[] curlabel; 
    699745    String iAsString; 
    700746    for (int i=0; i<mmPlanes; i++) { 
    701747      iAsString = intFormatMax(i, mmPlanes); 
    702748      strlen = in.readInt(); 
    703       curlabel = new byte[strlen]; 
    704       in.read(curlabel); 
    705       put("stageLabel[" + iAsString + "]", new String(curlabel)); 
    706     } 
    707   } 
    708  
    709   void readAbsoluteZ() throws IOException { 
    710     int nz, dz; 
    711     double absoluteZ; 
    712     for(int i=0; i<mmPlanes; i++) { 
    713       nz = in.readInt(); 
    714       dz = in.readInt(); 
    715       absoluteZ = (dz == 0) ? Double.NaN : (double) nz / dz; 
    716       put("absoluteZ[" + intFormatMax(i, mmPlanes) + "]", absoluteZ); 
     749      addMeta("stageLabel[" + iAsString + "]", in.readString(strlen)); 
    717750    } 
    718751  } 
     
    720753  void readAbsoluteZValid() throws IOException { 
    721754    for (int i=0; i<mmPlanes; i++) { 
    722       put("absoluteZValid[" + intFormatMax(i, mmPlanes) + "]", in.readInt()); 
     755      addMeta("absoluteZValid[" + intFormatMax(i, mmPlanes) + "]", 
     756        in.readInt()); 
    723757    } 
    724758  } 
     
    747781      lastOffset = in.getFilePointer(); 
    748782 
     783      String key = getKey(currentID); 
     784      Object value = String.valueOf(valOrOffset); 
     785 
    749786      switch (currentID) { 
    750         case 1: 
    751           put("MinScale", valOrOffset); 
    752           break; 
    753         case 2: 
    754           put("MaxScale", valOrOffset); 
    755           break; 
    756787        case 3: 
    757           int calib = valOrOffset; 
    758           String calibration = calib != 0 ? "on" : "off"; 
    759           put("Spatial Calibration", calibration); 
     788          value = valOrOffset != 0 ? "on" : "off"; 
    760789          break; 
    761790        case 4: 
    762           put("XCalibration", readRational(in, valOrOffset)); 
    763           in.seek(lastOffset); 
    764           break; 
    765791        case 5: 
    766           put("YCalibration", readRational(in, valOrOffset)); 
    767           in.seek(lastOffset); 
     792        case 21: 
     793        case 22: 
     794        case 23: 
     795        case 24: 
     796        case 38: 
     797        case 39: 
     798          value = readRational(in, valOrOffset); 
    768799          break; 
    769800        case 6: 
     801        case 25: 
    770802          in.seek(valOrOffset); 
    771803          num = in.readInt(); 
    772           put("CalibrationUnits", in.readString(num)); 
    773           in.seek(lastOffset); 
     804          value = in.readString(num); 
    774805          break; 
    775806        case 7: 
     
    777808          num = in.readInt(); 
    778809          imageName = in.readString(num); 
    779           put("Name", imageName); 
    780           in.seek(lastOffset); 
    781           break; 
    782  
     810          value = imageName; 
     811          break; 
    783812        case 8: 
    784           int thresh = valOrOffset; 
    785           String threshState = "off"; 
    786           if (thresh == 1) threshState = "inside"; 
    787           else if (thresh == 2) threshState = "outside"; 
    788           put("ThreshState", threshState); 
    789           break; 
    790         case 9: 
    791           put("ThreshStateRed", valOrOffset); 
    792           break; 
    793           // there is no 10 
    794         case 11: 
    795           put("ThreshStateGreen", valOrOffset); 
    796           break; 
    797         case 12: 
    798           put("ThreshStateBlue", valOrOffset); 
    799           break; 
    800         case 13: 
    801           put("ThreshStateLo", valOrOffset); 
    802           break; 
    803         case 14: 
    804           put("ThreshStateHi", valOrOffset); 
    805           break; 
    806         case 15: 
    807           put("Zoom", valOrOffset); 
    808           break; 
    809         case 16: // oh how we hate you Julian format... 
     813          if (valOrOffset == 1) value = "inside"; 
     814          else if (valOrOffset == 2) value = "outside"; 
     815          else value = "off"; 
     816          break; 
     817        case 17: // oh how we hate you Julian format... 
    810818          in.seek(valOrOffset); 
    811819          thedate = decodeDate(in.readInt()); 
    812820          thetime = decodeTime(in.readInt()); 
    813821          imageCreationDate = thedate + " " + thetime; 
    814           put("DateTime", imageCreationDate); 
    815           in.seek(lastOffset); 
    816           break; 
    817         case 17: 
     822          value = imageCreationDate; 
     823          break; 
     824        case 16: 
    818825          in.seek(valOrOffset); 
    819826          thedate = decodeDate(in.readInt()); 
    820827          thetime = decodeTime(in.readInt()); 
    821           put("LastSavedTime", thedate + " " + thetime); 
    822           in.seek(lastOffset); 
    823           break; 
    824         case 18: 
    825           put("currentBuffer", valOrOffset); 
    826           break; 
    827         case 19: 
    828           put("grayFit", valOrOffset); 
    829           break; 
    830         case 20: 
    831           put("grayPointCount", valOrOffset); 
    832           break; 
    833         case 21: 
    834           put("grayX", readRational(in, valOrOffset)); 
    835           in.seek(lastOffset); 
    836           break; 
    837         case 22: 
    838           put("gray", readRational(in, valOrOffset)); 
    839           in.seek(lastOffset); 
    840           break; 
    841         case 23: 
    842           put("grayMin", readRational(in, valOrOffset)); 
    843           in.seek(lastOffset); 
    844           break; 
    845         case 24: 
    846           put("grayMax", readRational(in, valOrOffset)); 
    847           in.seek(lastOffset); 
    848           break; 
    849         case 25: 
    850           in.seek(valOrOffset); 
    851           num = in.readInt(); 
    852           put("grayUnitName", in.readString(num)); 
    853           in.seek(lastOffset); 
     828          value = thedate + " " + thetime; 
    854829          break; 
    855830        case 26: 
    856831          in.seek(valOrOffset); 
    857832          int standardLUT = in.readInt(); 
    858           in.seek(lastOffset); 
    859           String standLUT; 
    860833          switch (standardLUT) { 
    861834            case 0: 
    862               standLUT = "monochrome"; 
     835              value = "monochrome"; 
    863836              break; 
    864837            case 1: 
    865               standLUT = "pseudocolor"; 
     838              value = "pseudocolor"; 
    866839              break; 
    867840            case 2: 
    868               standLUT = "Red"; 
     841              value = "Red"; 
    869842              break; 
    870843            case 3: 
    871               standLUT = "Green"; 
     844              value = "Green"; 
    872845              break; 
    873846            case 4: 
    874               standLUT = "Blue"; 
     847              value = "Blue"; 
    875848              break; 
    876849            case 5: 
    877               standLUT = "user-defined"; 
     850              value = "user-defined"; 
    878851              break; 
    879852            default: 
    880               standLUT = "monochrome"; break; 
     853              value = "monochrome"; 
    881854          } 
    882           put("StandardLUT", standLUT); 
    883           break; 
    884         case 27: 
    885           put("Wavelength", valOrOffset); 
    886           break; 
    887         case 30: 
    888           put("OverlayMask", valOrOffset); 
    889           break; 
    890         case 31: 
    891           put("OverlayCompress", valOrOffset); 
    892           break; 
    893         case 32: 
    894           put("Overlay", valOrOffset); 
    895           break; 
    896         case 33: 
    897           put("SpecialOverlayMask", valOrOffset); 
    898855          break; 
    899856        case 34: 
    900           put("SpecialOverlayCompress", in.readInt()); 
    901           break; 
    902         case 35: 
    903           put("SpecialOverlay", valOrOffset); 
    904           break; 
    905         case 36: 
    906           put("ImageProperty", valOrOffset); 
    907           break; 
    908         case 38: 
    909           put("AutoScaleLoInfo", readRational(in, valOrOffset)); 
    910           in.seek(lastOffset); 
    911           break; 
    912         case 39: 
    913           put("AutoScaleHiInfo", readRational(in, valOrOffset)); 
    914           in.seek(lastOffset); 
    915           break; 
    916         case 42: 
    917           put("Gamma", valOrOffset); 
    918           break; 
    919         case 43: 
    920           put("GammaRed", valOrOffset); 
    921           break; 
    922         case 44: 
    923           put("GammaGreen", valOrOffset); 
    924           break; 
    925         case 45: 
    926           put("GammaBlue", valOrOffset); 
     857          value = String.valueOf(in.readInt()); 
    927858          break; 
    928859        case 46: 
     
    930861          int xBin = in.readInt(); 
    931862          int yBin = in.readInt(); 
    932           put("CameraBin", new String("(" + xBin + "," + yBin + ")")); 
    933           in.seek(lastOffset); 
    934           break; 
     863          binning = xBin + "x" + yBin; 
     864          value = binning; 
     865          break; 
     866      } 
     867      addMeta(key, value); 
     868      in.seek(lastOffset); 
     869 
     870      if ("Zoom".equals(key) && value != null) { 
     871        zoom = Float.parseFloat(value.toString()); 
    935872      } 
    936873    } 
     
    963900    year = (short) ((month > 2.5) ? (c - 4716) : c - 4715); 
    964901 
    965     return day + "/" + month + "/" + year; 
     902    return intFormat(day, 2) + "/" + intFormat(month, 2) + "/" + year; 
    966903  } 
    967904 
    968905  /** Converts a time value in milliseconds into a human-readable string. */ 
    969906  public static String decodeTime(int millis) { 
    970     int ms = millis % 1000; 
    971     millis -= ms; 
    972     millis /= 1000; 
    973     int seconds = millis % 60; 
    974     millis -= seconds; 
    975     millis /= 60; 
    976     int minutes = millis % 60; 
    977     millis -= minutes; 
    978     millis /= 60; 
    979     int hours = millis; 
    980     return intFormat(hours, 2) + ":" + intFormat(minutes, 2) + ":" + 
    981       intFormat(seconds, 2) + "." + intFormat(ms, 3); 
     907    Calendar time = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
     908    time.setTimeInMillis(millis); 
     909    String hours = intFormat(time.get(Calendar.HOUR_OF_DAY), 2); 
     910    String minutes = intFormat(time.get(Calendar.MINUTE), 2); 
     911    String seconds = intFormat(time.get(Calendar.SECOND), 2); 
     912    String ms = intFormat(time.get(Calendar.MILLISECOND), 3); 
     913    return hours + ":" + minutes + ":" + seconds + ":" + ms; 
    982914  } 
    983915 
    984916  /** Formats an integer value with leading 0s if needed. */ 
    985917  public static String intFormat(int myint, int digits) { 
    986     String formatstring = "0"; 
    987     while (formatstring.length() < digits) { 
    988       formatstring += "0"; 
    989     } 
    990     DecimalFormat df = new DecimalFormat(formatstring); 
     918    DecimalFormat df = new DecimalFormat(); 
     919    df.setMaximumIntegerDigits(digits); 
     920    df.setMinimumIntegerDigits(digits); 
    991921    return df.format(myint); 
    992922  } 
     
    1000930   */ 
    1001931  public static String intFormatMax(int myint, int maxint) { 
    1002     return intFormat(myint, new Integer(maxint).toString().length()); 
     932    return intFormat(myint, String.valueOf(maxint).length()); 
     933  } 
     934 
     935  private TiffRational readRational(RandomAccessStream s) throws IOException { 
     936    return readRational(s, s.getFilePointer()); 
    1003937  } 
    1004938 
     
    1012946  } 
    1013947 
     948  private String getKey(int id) { 
     949    switch (id) { 
     950      case 1: return "MinScale"; 
     951      case 2: return "MaxScale"; 
     952      case 3: return "Spatial Calibration"; 
     953      case 4: return "XCalibration"; 
     954      case 5: return "YCalibration"; 
     955      case 6: return "CalibrationUnits"; 
     956      case 7: return "Name"; 
     957      case 8: return "ThreshState"; 
     958      case 9: return "ThreshStateRed"; 
     959      // there is no 10 
     960      case 11: return "ThreshStateGreen"; 
     961      case 12: return "ThreshStateBlue"; 
     962      case 13: return "ThreshStateLo"; 
     963      case 14: return "ThreshStateHi"; 
     964      case 15: return "Zoom"; 
     965      case 16: return "DateTime"; 
     966      case 17: return "LastSavedTime"; 
     967      case 18: return "currentBuffer"; 
     968      case 19: return "grayFit"; 
     969      case 20: return "grayPointCount"; 
     970      case 21: return "grayX"; 
     971      case 22: return "gray"; 
     972      case 23: return "grayMin"; 
     973      case 24: return "grayMax"; 
     974      case 25: return "grayUnitName"; 
     975      case 26: return "StandardLUT"; 
     976      case 27: return "Wavelength"; 
     977      case 30: return "OverlayMask"; 
     978      case 31: return "OverlayCompress"; 
     979      case 32: return "Overlay"; 
     980      case 33: return "SpecialOverlayMask"; 
     981      case 34: return "SpecialOverlayCompress"; 
     982      case 35: return "SpecialOverlay"; 
     983      case 36: return "ImageProperty"; 
     984      case 38: return "AutoScaleLoInfo"; 
     985      case 39: return "AutoScaleHiInfo"; 
     986      case 42: return "Gamma"; 
     987      case 43: return "GammaRed"; 
     988      case 44: return "GammaGreen"; 
     989      case 45: return "GammaBlue"; 
     990      case 46: return "CameraBin"; 
     991    } 
     992    return null; 
     993  } 
     994 
    1014995} 
  • trunk/components/common/src/loci/common/DataTools.java

    r4759 r4765  
    821821  } 
    822822 
     823  public static long getTime(String date, String format) { 
     824    SimpleDateFormat f = new SimpleDateFormat(format); 
     825    Date d = f.parse(date, new ParsePosition(0)); 
     826    return d.getTime(); 
     827  } 
     828 
    823829  // -- Array handling -- 
    824830 
Note: See TracChangeset for help on using the changeset viewer.