Changeset 4103


Ignore:
Timestamp:
06/06/08 12:31:07 (12 years ago)
Author:
melissa
Message:

Fixed ZVI tag and timestamp parsing bugs.

Location:
trunk/loci/formats
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/DataTools.java

    r4048 r4103  
    4949  public static final int COBOL = 1;  // January 1, 1601 
    5050  public static final int MICROSOFT = 2; // December 30, 1899 
     51  public static final int ZVI = 3; 
    5152 
    5253  /** Milliseconds until UNIX epoch. */ 
     
    5455  public static final long COBOL_EPOCH = 11644444800000L; 
    5556  public static final long MICROSOFT_EPOCH = 2272060800000L; 
     57  public static final long ZVI_EPOCH = 2921084975759000L; 
    5658 
    5759  // -- Static fields -- 
     
    714716        ms -= MICROSOFT_EPOCH; 
    715717        break; 
     718      case ZVI: 
     719        ms -= ZVI_EPOCH; 
     720        break; 
    716721    } 
    717722 
  • trunk/loci/formats/in/ZeissZVIReader.java

    r4095 r4103  
    7575  private Vector whiteValue, blackValue, gammaValue, exposureTime, timestamps; 
    7676  private String userName, userCompany, mag, na; 
    77   private int nextImage = 0; 
    7877 
    7978  private int tileWidth, tileHeight; 
     
    283282      s.order(true); 
    284283 
    285       if (dirName.equals("Tags") && isContents) { 
    286         try { parseTags(s); } 
     284      if (name.indexOf("Scaling") == -1 && dirName.equals("Tags") && 
     285        isContents) 
     286      { 
     287        int imageNum = -1; 
     288        if (name.toUpperCase().indexOf("ITEM") != -1) { 
     289          String num = name.substring(name.indexOf("(") + 1); 
     290          num = num.substring(0, num.indexOf(")")); 
     291          imageNum = Integer.parseInt(num); 
     292        } 
     293        try { parseTags(imageNum, s); } 
    287294        catch (EOFException e) { } 
    288295      } 
     
    400407      } 
    401408      else { 
    402         try { parseTags(s); } 
     409        try { parseTags(-1, s); } 
    403410        catch (IOException e) { } 
    404411      } 
     
    612619    } 
    613620 
    614     String firstTimestamp = "0.0"; 
    615     long ms = 0; 
    616     if (timestamps.size() > 0) { 
    617       firstTimestamp = (String) timestamps.get(0); 
    618       firstTimestamp = firstTimestamp.trim(); 
    619       int offset = 0; 
    620       for (int i=0; i<firstTimestamp.length(); i++) { 
    621         if (!Character.isDigit(firstTimestamp.charAt(i))) { 
    622           offset = i; 
    623         } 
    624         else break; 
    625       } 
    626       firstTimestamp = firstTimestamp.substring(offset + 1); 
    627       if (!firstTimestamp.startsWith("1")) { 
    628         firstTimestamp = "0" + firstTimestamp; 
    629       } 
    630       SimpleDateFormat parse = new SimpleDateFormat("MM/dd/yyyy K:mm:ss a"); 
    631       Date d = parse.parse(firstTimestamp, new ParsePosition(0)); 
    632       SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
    633       if (d != null) { 
    634         store.setImageCreationDate(fmt.format(d), 0); 
    635         ms = d.getTime(); 
    636       } 
    637     } 
     621    long firstStamp = Long.parseLong((String) timestamps.get(0)); 
     622    store.setImageCreationDate(DataTools.convertDate((long) (firstStamp / 1600), 
     623      DataTools.ZVI), 0); 
    638624 
    639625    for (int plane=0; plane<core.imageCount[0]; plane++) { 
     
    650636      store.setPlaneTimingExposureTime(exp, 0, 0, plane); 
    651637 
    652       String timestamp = "0.0"; 
    653       if (zct[2] < timestamps.size() && zct[2] > 0.0) { 
    654         timestamp = (String) timestamps.get(zct[2]); 
    655         timestamp = timestamp.trim(); 
    656         int offset = 0; 
    657         for (int i=0; i<timestamp.length(); i++) { 
    658           if (!Character.isDigit(timestamp.charAt(i))) { 
    659             offset = i; 
    660           } 
    661           else break; 
    662         } 
    663         timestamp = timestamp.substring(offset + 1); 
    664         if (!timestamp.startsWith("1")) timestamp = "0" + timestamp; 
    665         SimpleDateFormat parse = new SimpleDateFormat("MM/dd/yyyy K:mm:ss a"); 
    666         Date d = parse.parse(timestamp, new ParsePosition(0)); 
    667         if (d != null) timestamp = String.valueOf(d.getTime() - ms); 
    668       } 
    669       try { 
    670         store.setPlaneTimingDeltaT(new Float(timestamp), 0, 0, plane); 
    671       } 
    672       catch (NumberFormatException e) { 
    673         if (debug) LogTools.trace(e); 
     638      if (plane < timestamps.size()) { 
     639        long stamp = Long.parseLong((String) timestamps.get(plane)); 
     640        stamp -= firstStamp; 
     641        store.setPlaneTimingDeltaT(new Float(stamp / 1600000), 0, 0, plane); 
    674642      } 
    675643    } 
     
    733701 
    734702  /** Parse all of the tags in a stream. */ 
    735   private void parseTags(RandomAccessStream s) throws IOException { 
    736     s.skipBytes(24); 
     703  private void parseTags(int image, RandomAccessStream s) throws IOException { 
     704    s.skipBytes(8); 
    737705 
    738706    int count = s.readInt(); 
    739707 
    740708    // limit count to 4096 
    741     if (count > 4096) count = 4096; 
    742709 
    743710    for (int i=0; i<count; i++) { 
     
    848815      else if (key.equals("ImageTile Index 1")) secondImageTile = value; 
    849816      else if (key.startsWith("Scale Factor for X")) { 
    850         pixelSizeX = Float.parseFloat(value); 
     817        try { 
     818          pixelSizeX = Float.parseFloat(value); 
     819        } 
     820        catch (NumberFormatException e) { } 
    851821      } 
    852822      else if (key.startsWith("Scale Factor for Y")) { 
    853         pixelSizeY = Float.parseFloat(value); 
     823        try { 
     824          pixelSizeY = Float.parseFloat(value); 
     825        } 
     826        catch (NumberFormatException e) { } 
    854827      } 
    855828      else if (key.startsWith("Scale Factor for Z")) { 
    856         pixelSizeZ = Float.parseFloat(value); 
     829        try { 
     830          pixelSizeZ = Float.parseFloat(value); 
     831        } 
     832        catch (NumberFormatException e) { } 
    857833      } 
    858834      else if (key.startsWith("Scale Unit for X")) { 
    859         int v = Integer.parseInt(value); 
     835        int v = 0; 
     836        try { 
     837          v = Integer.parseInt(value); 
     838        } 
     839        catch (NumberFormatException e) { } 
    860840        switch (v) { 
    861841          case 72: 
     
    874854      } 
    875855      else if (key.startsWith("Scale Unit for Y")) { 
    876         int v = Integer.parseInt(value); 
     856        int v = 0; 
     857        try { 
     858          v = Integer.parseInt(value); 
     859        } 
     860        catch (NumberFormatException e) { } 
    877861        switch (v) { 
    878862          case 72: 
     
    891875      } 
    892876      else if (key.startsWith("Scale Unit for Z")) { 
    893         int v = Integer.parseInt(value); 
     877        int v = 0; 
     878        try { 
     879          v = Integer.parseInt(value); 
     880        } 
     881        catch (NumberFormatException e) { } 
    894882        switch (v) { 
    895883          case 72: 
     
    958946      else if (key.startsWith("Objective Magnification")) mag = value; 
    959947      else if (key.startsWith("Objective N.A.")) na = value; 
    960       else if (key.equals("Acquisition Date")) { 
    961         timestamps.add(value); 
    962         addMeta("Timestamp " + nextImage, value); 
    963         nextImage++; 
     948      else if (key.startsWith("Acquisition Date")) { 
     949        if (image >= 0) { 
     950          if (image < timestamps.size()) timestamps.setElementAt(value, image); 
     951          else { 
     952            int diff = image - timestamps.size(); 
     953            for (int q=0; q<diff; q++) { 
     954              timestamps.add(""); 
     955            } 
     956            timestamps.add(value); 
     957          } 
     958          addMeta("Timestamp " + image, value); 
     959        } 
    964960      } 
    965961    } 
Note: See TracChangeset for help on using the changeset viewer.