Changeset 3861


Ignore:
Timestamp:
04/01/08 13:41:10 (12 years ago)
Author:
curtis
Message:
  • Add debug statements for Gatan DM3 tag parsing.
  • Fix bug with gatan/jayne/AM-2/MonGb2-S8.dm3.
File:
1 edited

Legend:

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

    r3854 r3861  
    153153 
    154154    in.skipBytes(2); 
    155     parseTags(in.readInt(), "initFile"); 
     155    int numTags = in.readInt(); 
     156    if (debug) debug("tags (" + numTags + ") {"); 
     157    parseTags(numTags, null, "  "); 
     158    if (debug) debug("}"); 
    156159 
    157160    status("Populating metadata"); 
     
    159162    core.littleEndian[0] = true; 
    160163 
     164    if (core.sizeX[0] == 0 || core.sizeY[0] == 0) { 
     165      throw new FormatException("Dimensions information not found"); 
     166    } 
    161167    int bytes = numPixelBytes / (core.sizeX[0] * core.sizeY[0]); 
    162168 
     
    257263   * a label, and a value. 
    258264   */ 
    259   private void parseTags(int numTags, String parent) throws IOException { 
     265  private void parseTags(int numTags, String parent, String indent) 
     266    throws FormatException, IOException 
     267  { 
    260268    for (int i=0; i<numTags; i++) { 
    261269      byte type = in.readByte();  // can be 21 (data) or 20 (tag group) 
    262270      int length = in.readShort(); 
    263       String labelString = in.readString(length); 
    264271 
    265272      // image data is in tag with type 21 and label 'Data' 
     
    267274      // bytes per pixel is in type 21 tag with label 'PixelDepth' 
    268275 
     276      String labelString = null; 
    269277      String value = null; 
    270278 
    271279      if (type == VALUE) { 
    272         in.skipBytes(4);  // equal to '%%%%' 
     280        labelString = in.readString(length); 
     281        int skip = in.readInt(); // equal to '%%%%' / 623191333 
    273282        int n = in.readInt(); 
    274283        int dataType = in.readInt(); 
     284        if (debug) { 
     285          String s = labelString; 
     286          if (s.length() > 32) { 
     287            s = s.substring(0, 20) + "... (" + s.length() + ")"; 
     288          } 
     289          debug(indent + i + ": n=" + n + 
     290            ", dataType=" + dataType + ", label=" + s); 
     291          if (skip != 623191333) debug("Warning: skip mismatch: " + skip); 
     292        } 
    275293        if (n == 1) { 
    276           if (parent.equals("Dimensions") && labelString.length() == 0) { 
     294          if ("Dimensions".equals(parent)&& labelString.length() == 0) { 
    277295            in.order(!in.isLittleEndian()); 
    278296            if (i == 0) core.sizeX[0] = in.readInt(); 
     
    286304            length = in.readInt(); 
    287305          } 
     306          else if (debug) debug("Warning: dataType mismatch: " + dataType); 
    288307          value = in.readString(length); 
    289308        } 
    290         else if (n == 3 && !labelString.equals("Data")) { 
    291           if (dataType == GROUP) { // this should always be true 
    292             dataType = in.readInt(); 
    293             length = in.readInt(); 
    294             if (dataType == 10) { 
    295               in.skipBytes(length); 
    296             } 
    297             else { 
    298               value = DataTools.stripString(in.readString(length * 2)); 
    299             } 
    300           } 
    301         } 
    302         else if (n == 3 && labelString.equals("Data")) { 
     309        else if (n == 3) { 
    303310          if (dataType == GROUP) {  // this should always be true 
    304311            dataType = in.readInt(); 
    305312            length = in.readInt(); 
    306             pixelOffset = in.getFilePointer(); 
    307             in.skipBytes(getNumBytes(dataType) * length); 
    308             numPixelBytes = (int) (in.getFilePointer() - pixelOffset); 
    309           } 
     313            if (labelString.equals("Data")) { 
     314              pixelOffset = in.getFilePointer(); 
     315              in.skipBytes(getNumBytes(dataType) * length); 
     316              numPixelBytes = (int) (in.getFilePointer() - pixelOffset); 
     317            } 
     318            else { 
     319              if (dataType == 10) in.skipBytes(length); 
     320              else value = DataTools.stripString(in.readString(length * 2)); 
     321            } 
     322          } 
     323          else if (debug) debug("Warning: dataType mismatch: " + dataType); 
    310324        } 
    311325        else { 
     
    322336            } 
    323337            value = s.toString(); 
    324             byte b = in.readByte(); 
    325             while (b != GROUP && b != VALUE && 
    326               in.getFilePointer() < in.length() - 1) 
    327             { 
    328               b = in.readByte(); 
     338            boolean lastTag = parent == null && i == numTags - 1; 
     339            if (!lastTag) { 
     340              // search for next tag 
     341              // empirically, we need to skip 4, 12, 18 or 28 total bytes 
     342              byte b = 0; 
     343              final int[] jumps = {4, 7, 5, 9}; 
     344              for (int j=0; j<jumps.length; j++) { 
     345                in.skipBytes(jumps[j]); 
     346                b = in.readByte(); 
     347                if (b == GROUP || b == VALUE) break; 
     348              } 
     349              if (b != GROUP && b != VALUE) { 
     350                throw new FormatException("Cannot find next tag (pos=" + 
     351                  in.getFilePointer() + ", label=" + labelString); 
     352              } 
     353              in.seek(in.getFilePointer() - 1); // reread tag type code 
    329354            } 
    330             in.seek(in.getFilePointer() - 1); 
    331355          } 
    332356          else if (dataType == GROUP) { 
     
    336360              in.skipBytes(4); 
    337361              int numFields = in.readInt(); 
    338               int[] datatypes = new int[numFields]; 
     362              int[] dataTypes = new int[numFields]; 
    339363              for (int j=0; j<numFields; j++) { 
    340364                in.skipBytes(4); 
    341                 datatypes[j] = in.readInt(); 
     365                dataTypes[j] = in.readInt(); 
    342366              } 
    343367              int len = in.readInt(); 
     
    347371              for (int k=0; k<len; k++) { 
    348372                for (int q=0; q<numFields; q++) { 
    349                   values[q][k] = readValue(datatypes[q]); 
     373                  values[q][k] = readValue(dataTypes[q]); 
    350374                } 
    351375              } 
    352376            } 
     377            else if (debug) debug("Warning: dataType mismatch: " + dataType); 
    353378          } 
    354379        } 
    355380      } 
    356381      else if (type == GROUP) { 
     382        labelString = in.readString(length); 
    357383        in.skipBytes(2); 
    358         parseTags(in.readInt(), labelString); 
     384        int num = in.readInt(); 
     385        if (debug) debug(indent + i + ": group (" + num + ") {"); 
     386        parseTags(num, labelString, indent + "  "); 
     387        if (debug) debug(indent + "}"); 
    359388      } 
     389      else if (debug) debug(indent + i + ": unknown type: " + type); 
    360390 
    361391      if (value != null) { 
Note: See TracChangeset for help on using the changeset viewer.