Changeset 3259


Ignore:
Timestamp:
10/11/07 09:17:01 (12 years ago)
Author:
curtis
Message:
  • Add TiffTools.getComment convenience method.
  • Some efficiency improvements to OMETiffReader.
  • Reorganize some code.
Location:
trunk/loci/formats
Files:
3 edited

Legend:

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

    r3253 r3259  
    792792  } 
    793793 
     794  /** Convenience method for obtaining a file's first ImageDescription. */ 
     795  public static String getComment(String id) 
     796    throws FormatException, IOException 
     797  { 
     798    // read first IFD 
     799    RandomAccessStream in = new RandomAccessStream(id); 
     800    Hashtable ifd = TiffTools.getFirstIFD(in); 
     801    in.close(); 
     802 
     803    // extract comment 
     804    Object o = TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
     805    String comment = null; 
     806    if (o instanceof String) comment = (String) o; 
     807    else if (o instanceof String[]) { 
     808      String[] s = (String[]) o; 
     809      if (s.length > 0) comment = s[0]; 
     810    } 
     811    else if (o != null) comment = o.toString(); 
     812 
     813    if (comment != null) { 
     814      // sanitize line feeds 
     815      comment = comment.replaceAll("\r\n", "\n"); 
     816      comment = comment.replaceAll("\r", "\n"); 
     817    } 
     818    return comment; 
     819  } 
     820 
    794821  // -- Image reading methods -- 
    795822 
     
    19721999  } 
    19732000 
    1974   /** Convenience method for overwriting a file's first ImageDescription. */ 
    1975   public static void overwriteComment(String id, Object value) 
    1976     throws FormatException, IOException 
    1977   { 
    1978     RandomAccessFile raf = new RandomAccessFile(id, "rw"); 
    1979     overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, value); 
    1980     raf.close(); 
    1981   } 
    1982  
    19832001  /** 
    19842002   * Surgically overwrites an existing IFD value with the given one. This 
     
    20872105 
    20882106    throw new FormatException("Tag not found (" + getIFDTagName(tag) + ")"); 
     2107  } 
     2108 
     2109  /** Convenience method for overwriting a file's first ImageDescription. */ 
     2110  public static void overwriteComment(String id, Object value) 
     2111    throws FormatException, IOException 
     2112  { 
     2113    RandomAccessFile raf = new RandomAccessFile(id, "rw"); 
     2114    overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, value); 
     2115    raf.close(); 
    20892116  } 
    20902117 
  • trunk/loci/formats/in/BaseTiffReader.java

    r3237 r3259  
    761761  } 
    762762 
     763  // -- Internal FormatReader API methods - metadata convenience -- 
     764 
     765  protected void put(String key, Object value) { 
     766    if (value == null) return; 
     767    if (value instanceof String) value = ((String) value).trim(); 
     768    addMeta(key, value); 
     769  } 
     770 
     771  protected void put(String key, int value) { 
     772    if (value == -1) return; // indicates missing value 
     773    addMeta(key, new Integer(value)); 
     774  } 
     775 
     776  protected void put(String key, boolean value) { 
     777    put(key, new Boolean(value)); 
     778  } 
     779  protected void put(String key, byte value) { put(key, new Byte(value)); } 
     780  protected void put(String key, char value) { put(key, new Character(value)); } 
     781  protected void put(String key, double value) { put(key, new Double(value)); } 
     782  protected void put(String key, float value) { put(key, new Float(value)); } 
     783  protected void put(String key, long value) { put(key, new Long(value)); } 
     784  protected void put(String key, short value) { put(key, new Short(value)); } 
     785 
     786  protected void put(String key, Hashtable ifd, int tag) { 
     787    put(key, TiffTools.getIFDValue(ifd, tag)); 
     788  } 
     789 
     790  protected void putInt(String key, Hashtable ifd, int tag) { 
     791    put(key, TiffTools.getIFDIntValue(ifd, tag)); 
     792  } 
     793 
    763794  // -- Internal FormatReader API methods -- 
    764795 
     
    800831  private Float getNdFilter(int i) { return null; } 
    801832 
    802   Integer getEmWave(int i) { return null; } 
     833  private Integer getEmWave(int i) { return null; } 
    803834 
    804835  private Integer getExWave(int i) { return null; } 
     
    812843  private String getMode(int i) { return null; } 
    813844 
    814   protected void put(String key, Object value) { 
    815     if (value == null) return; 
    816     if (value instanceof String) value = ((String) value).trim(); 
    817     addMeta(key, value); 
    818   } 
    819  
    820   protected void put(String key, int value) { 
    821     if (value == -1) return; // indicates missing value 
    822     addMeta(key, new Integer(value)); 
    823   } 
    824  
    825   protected void put(String key, boolean value) { 
    826     put(key, new Boolean(value)); 
    827   } 
    828   protected void put(String key, byte value) { put(key, new Byte(value)); } 
    829   protected void put(String key, char value) { 
    830     put(key, new Character(value)); 
    831   } 
    832   protected void put(String key, double value) { put(key, new Double(value)); } 
    833   protected void put(String key, float value) { put(key, new Float(value)); } 
    834   protected void put(String key, long value) { put(key, new Long(value)); } 
    835   protected void put(String key, short value) { put(key, new Short(value)); } 
    836  
    837   protected void put(String key, Hashtable ifd, int tag) { 
    838     put(key, TiffTools.getIFDValue(ifd, tag)); 
    839   } 
    840  
    841   protected void putInt(String key, Hashtable ifd, int tag) { 
    842     put(key, TiffTools.getIFDIntValue(ifd, tag)); 
    843   } 
    844845} 
  • trunk/loci/formats/in/OMETiffReader.java

    r3248 r3259  
    6565  private int[][] ifdMap, fileMap; 
    6666  private boolean lsids, isWiscScan; 
    67   private Hashtable[][] fds; 
     67  private Hashtable[][] ifdsUsed; 
    6868 
    6969  // -- Constructor -- 
     
    7171  public OMETiffReader() { 
    7272    super("OME-TIFF", new String[] {"tif", "tiff"}); 
     73  } 
     74 
     75  // -- Internal BaseTiffReader API methods -- 
     76 
     77  /* @see BaseTiffReader#initStandardMetadata() */ 
     78  protected void initStandardMetadata() throws FormatException, IOException { 
     79    super.initStandardMetadata(); 
     80 
     81    OMETiffHandler handler = new OMETiffHandler(); 
     82    String comment = (String) getMeta("Comment"); 
     83 
     84    currentSeries = -1; 
     85    seriesCount = 0; 
     86    imageIDs = null; 
     87    pixelsIDs = null; 
     88    lsids = true; 
     89 
     90    tempIfdMap = new Vector(); 
     91    tempFileMap = new Vector(); 
     92    tempIfdCount = new Vector(); 
     93 
     94    try { 
     95      SAXParser parser = SAX_FACTORY.newSAXParser(); 
     96      parser.parse(new ByteArrayInputStream(comment.getBytes()), handler); 
     97    } 
     98    catch (ParserConfigurationException exc) { 
     99      throw new FormatException(exc); 
     100    } 
     101    catch (SAXException exc) { 
     102      throw new FormatException(exc); 
     103    } 
     104 
     105    // MAJOR HACK : check for OME-XML in the comment of the second IFD 
     106    // There is a version of WiscScan which writes OME-XML to every IFD, 
     107    // but with SizeZ and SizeT equal to 1. 
     108 
     109    String s = null; 
     110    if (ifds.length > 1) { 
     111      s = (String) TiffTools.getIFDValue(ifds[1], TiffTools.IMAGE_DESCRIPTION); 
     112    } 
     113    isWiscScan = s != null && s.indexOf("ome.xsd") != -1; 
     114 
     115    // look for additional files in the dataset 
     116    Vector files = new Vector(); 
     117    Location l = new Location(currentId); 
     118    l = l.getAbsoluteFile().getParentFile(); 
     119    String[] fileList = l.list(); 
     120 
     121    if (!lsids) { 
     122      fileList = new String[] {currentId}; 
     123      LogTools.println("Not searching for other files - " + 
     124        "Image LSID not present"); 
     125    } 
     126 
     127    for (int i=0; i<fileList.length; i++) { 
     128      String check = fileList[i].toLowerCase(); 
     129      if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
     130        status("Checking " + fileList[i]); 
     131        String iid = l.getAbsolutePath() + File.separator + fileList[i]; 
     132        String icomment = TiffTools.getComment(iid); 
     133        boolean addToList = true; 
     134        if (imageIDs != null) { 
     135          for (int k=0; k<imageIDs.size(); k++) { 
     136            if (icomment.indexOf((String) imageIDs.get(k)) == -1) { 
     137              addToList = false; 
     138              break; 
     139            } 
     140          } 
     141          if (addToList) { 
     142            for (int k=0; k<pixelsIDs.size(); k++) { 
     143              if (icomment.indexOf((String) pixelsIDs.get(k)) == -1) { 
     144                addToList = false; 
     145                break; 
     146              } 
     147            } 
     148          } 
     149        } 
     150        if (addToList) files.add(iid); 
     151      } 
     152    } 
     153 
     154    // parse grouped files 
     155 
     156    core = new CoreMetadata(seriesCount); 
     157    ifdMap = new int[seriesCount][]; 
     158    fileMap = new int[seriesCount][]; 
     159    numIFDs = new int[seriesCount]; 
     160 
     161    for (int i=0; i<seriesCount; i++) { 
     162      int ii = ((Integer) tempIfdCount.get(i)).intValue(); 
     163      ifdMap[i] = new int[ii]; 
     164      fileMap[i] = new int[ii]; 
     165    } 
     166 
     167    used = (String[]) files.toArray(new String[0]); 
     168    ifdsUsed = new Hashtable[used.length][]; 
     169 
     170    for (int i=0; i<used.length; i++) { 
     171      status("Parsing " + used[i]); 
     172      currentSeries = -1; 
     173      tempIfdMap = null; 
     174      tempFileMap = null; 
     175      tempIfdCount = null; 
     176      currentFile = i; 
     177 
     178      ifdsUsed[i] = TiffTools.getIFDs(new RandomAccessStream(used[i])); 
     179      String c = (String) 
     180        TiffTools.getIFDValue(ifdsUsed[i][0], TiffTools.IMAGE_DESCRIPTION); 
     181      try { 
     182        SAXParser parser = SAX_FACTORY.newSAXParser(); 
     183        parser.parse(new ByteArrayInputStream(c.getBytes()), handler); 
     184      } 
     185      catch (ParserConfigurationException exc) { 
     186        throw new FormatException(exc); 
     187      } 
     188      catch (SAXException exc) { 
     189        throw new FormatException(exc); 
     190      } 
     191    } 
     192 
     193    for (int i=0; i<getSeriesCount(); i++) { 
     194      if (numIFDs != null && lsids) { 
     195        if (numIFDs[i] < core.imageCount[i]) { 
     196          LogTools.println("Too few IFDs; got " + numIFDs[i] + 
     197            ", expected " + core.imageCount[i]); 
     198        } 
     199        else if (numIFDs[i] > core.imageCount[i]) { 
     200          LogTools.println("Too many IFDs; got " + numIFDs[i] + 
     201            ", expected " + core.imageCount[i]); 
     202        } 
     203      } 
     204      else if (core.imageCount[i] > ifds.length) { 
     205        core.imageCount[i] = ifds.length; 
     206        if (core.sizeZ[i] > ifds.length) { 
     207          core.sizeZ[i] = ifds.length / (core.rgb[i] ? core.sizeC[i] : 1); 
     208          core.sizeT[i] = 1; 
     209          if (!core.rgb[i]) core.sizeC[i] = 1; 
     210        } 
     211        else if (core.sizeT[i] > ifds.length) { 
     212          core.sizeT[i] = ifds.length / (core.rgb[i] ? core.sizeC[i] : 1); 
     213          core.sizeZ[i] = 1; 
     214          if (!core.rgb[i]) core.sizeC[i] = 1; 
     215        } 
     216      } 
     217    } 
     218  } 
     219 
     220  /* @see BaseTiffReader#initMetadataStore() */ 
     221  protected void initMetadataStore() { 
     222    String comment = (String) getMeta("Comment"); 
     223    metadata.remove("Comment"); 
     224    MetadataStore store = getMetadataStore(); 
     225    MetadataTools.convertMetadata(comment, store); 
     226  } 
     227 
     228  // -- IFormatReader API methods -- 
     229 
     230  /* @see loci.formats.IFormatReader#getUsedFiles() */ 
     231  public String[] getUsedFiles() { 
     232    FormatTools.assertId(currentId, true, 1); 
     233    return used; 
     234  } 
     235 
     236  /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
     237  public byte[] openBytes(int no, byte[] buf) 
     238    throws FormatException, IOException 
     239  { 
     240    FormatTools.assertId(currentId, true, 1); 
     241    FormatTools.checkPlaneNumber(this, no); 
     242    FormatTools.checkBufferSize(this, buf.length); 
     243 
     244    int ifd = ifdMap[series][no]; 
     245    int fileIndex = fileMap[series][no]; 
     246 
     247    in = new RandomAccessStream(used[fileIndex]); 
     248    TiffTools.getSamples(ifdsUsed[fileIndex][ifd], in, buf); 
     249    in.close(); 
     250    return swapIfRequired(buf); 
    73251  } 
    74252 
     
    96274  } 
    97275 
    98   // -- IFormatReader API methods -- 
    99  
    100   /* @see loci.formats.IFormatReader#getUsedFiles() */ 
    101   public String[] getUsedFiles() { 
    102     FormatTools.assertId(currentId, true, 1); 
    103     return used; 
    104   } 
    105  
    106   /* @see loci.formats.IFormatReader#openBytes(int, byte[]) */ 
    107   public byte[] openBytes(int no, byte[] buf) 
    108     throws FormatException, IOException 
    109   { 
    110     FormatTools.assertId(currentId, true, 1); 
    111     FormatTools.checkPlaneNumber(this, no); 
    112     FormatTools.checkBufferSize(this, buf.length); 
    113  
    114     int ifd = ifdMap[series][no]; 
    115     int fileIndex = fileMap[series][no]; 
    116  
    117     in = new RandomAccessStream(used[fileIndex]); 
    118     TiffTools.getSamples(fds[fileIndex][ifd], in, buf); 
    119     in.close(); 
    120     return swapIfRequired(buf); 
    121   } 
    122  
    123   // -- Internal BaseTiffReader API methods -- 
    124  
    125   /* @see BaseTiffReader#initStandardMetadata() */ 
    126   protected void initStandardMetadata() throws FormatException, IOException { 
    127     super.initStandardMetadata(); 
    128  
    129     OMETiffHandler handler = new OMETiffHandler(); 
    130     String comment = (String) getMeta("Comment"); 
    131  
    132     currentSeries = -1; 
    133     seriesCount = 0; 
    134     imageIDs = null; 
    135     pixelsIDs = null; 
    136     lsids = true; 
    137  
    138     tempIfdMap = new Vector(); 
    139     tempFileMap = new Vector(); 
    140     tempIfdCount = new Vector(); 
    141  
    142     try { 
    143       SAXParser parser = SAX_FACTORY.newSAXParser(); 
    144       parser.parse(new ByteArrayInputStream(comment.getBytes()), handler); 
    145     } 
    146     catch (ParserConfigurationException exc) { 
    147       throw new FormatException(exc); 
    148     } 
    149     catch (SAXException exc) { 
    150       throw new FormatException(exc); 
    151     } 
    152  
    153     // MAJOR HACK : check for OME-XML in the comment of the second IFD 
    154     // There is a version of WiscScan which writes OME-XML to every IFD, 
    155     // but with SizeZ and SizeT equal to 1. 
    156  
    157     String s = null; 
    158     if (ifds.length > 1) { 
    159       s = (String) TiffTools.getIFDValue(ifds[1], TiffTools.IMAGE_DESCRIPTION); 
    160     } 
    161     isWiscScan = s != null && s.indexOf("ome.xsd") != -1; 
    162  
    163     // look for additional files in the dataset 
    164     Vector files = new Vector(); 
    165     Location l = new Location(currentId); 
    166     l = l.getAbsoluteFile().getParentFile(); 
    167     String[] fileList = l.list(); 
    168  
    169     if (!lsids) { 
    170       fileList = new String[] {currentId}; 
    171       LogTools.println("Not searching for other files - " + 
    172         "Image LSID not present"); 
    173     } 
    174  
    175     for (int i=0; i<fileList.length; i++) { 
    176       String check = fileList[i].toLowerCase(); 
    177       if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
    178         status("Checking " + fileList[i]); 
    179         ifds = TiffTools.getIFDs(new RandomAccessStream(l.getAbsolutePath() + 
    180           File.separator + fileList[i])); 
    181         if (ifds[0] == null) continue; 
    182         comment = 
    183           (String) TiffTools.getIFDValue(ifds[0], TiffTools.IMAGE_DESCRIPTION); 
    184         boolean addToList = true; 
    185         if (imageIDs != null) { 
    186           for (int k=0; k<imageIDs.size(); k++) { 
    187             if (comment.indexOf((String) imageIDs.get(k)) == -1) { 
    188               addToList = false; 
    189               break; 
    190             } 
    191           } 
    192           if (addToList) { 
    193             for (int k=0; k<pixelsIDs.size(); k++) { 
    194               if (comment.indexOf((String) pixelsIDs.get(k)) == -1) { 
    195                 addToList = false; 
    196                 break; 
    197               } 
    198             } 
    199           } 
    200         } 
    201  
    202         if (addToList) { 
    203           files.add(l.getAbsolutePath() + File.separator + fileList[i]); 
    204         } 
    205       } 
    206     } 
    207  
    208     // parse grouped files 
    209  
    210     core = new CoreMetadata(seriesCount); 
    211     ifdMap = new int[seriesCount][]; 
    212     fileMap = new int[seriesCount][]; 
    213     numIFDs = new int[seriesCount]; 
    214  
    215     for (int i=0; i<seriesCount; i++) { 
    216       int ii = ((Integer) tempIfdCount.get(i)).intValue(); 
    217       ifdMap[i] = new int[ii]; 
    218       fileMap[i] = new int[ii]; 
    219     } 
    220  
    221     used = (String[]) files.toArray(new String[0]); 
    222     fds = new Hashtable[used.length][]; 
    223  
    224     for (int i=0; i<used.length; i++) { 
    225       status("Parsing " + used[i]); 
    226       currentSeries = -1; 
    227       tempIfdMap = null; 
    228       tempFileMap = null; 
    229       tempIfdCount = null; 
    230       currentFile = i; 
    231  
    232       fds[i] = TiffTools.getIFDs(new RandomAccessStream(used[i])); 
    233       String c = 
    234         (String) TiffTools.getIFDValue(fds[i][0], TiffTools.IMAGE_DESCRIPTION); 
    235       try { 
    236         SAXParser parser = SAX_FACTORY.newSAXParser(); 
    237         parser.parse(new ByteArrayInputStream(c.getBytes()), handler); 
    238       } 
    239       catch (ParserConfigurationException exc) { 
    240         throw new FormatException(exc); 
    241       } 
    242       catch (SAXException exc) { 
    243         throw new FormatException(exc); 
    244       } 
    245     } 
    246  
    247     for (int i=0; i<getSeriesCount(); i++) { 
    248       if (numIFDs != null && lsids) { 
    249         if (numIFDs[i] < core.imageCount[i]) { 
    250           LogTools.println("Too few IFDs; got " + numIFDs[i] + 
    251             ", expected " + core.imageCount[i]); 
    252         } 
    253         else if (numIFDs[i] > core.imageCount[i]) { 
    254           LogTools.println("Too many IFDs; got " + numIFDs[i] + 
    255             ", expected " + core.imageCount[i]); 
    256         } 
    257       } 
    258       else if (core.imageCount[i] > ifds.length) { 
    259         core.imageCount[i] = ifds.length; 
    260         if (core.sizeZ[i] > ifds.length) { 
    261           core.sizeZ[i] = ifds.length / (core.rgb[i] ? core.sizeC[i] : 1); 
    262           core.sizeT[i] = 1; 
    263           if (!core.rgb[i]) core.sizeC[i] = 1; 
    264         } 
    265         else if (core.sizeT[i] > ifds.length) { 
    266           core.sizeT[i] = ifds.length / (core.rgb[i] ? core.sizeC[i] : 1); 
    267           core.sizeZ[i] = 1; 
    268           if (!core.rgb[i]) core.sizeC[i] = 1; 
    269         } 
    270       } 
    271     } 
    272   } 
    273  
    274   /* @see BaseTiffReader#initMetadataStore() */ 
    275   protected void initMetadataStore() { 
    276     String comment = (String) getMeta("Comment"); 
    277     metadata.remove("Comment"); 
    278     MetadataStore store = getMetadataStore(); 
    279     MetadataTools.convertMetadata(comment, store); 
    280   } 
    281  
    282276  // -- Helper class -- 
    283277 
    284278  /** SAX handler for parsing XML. */ 
    285   class OMETiffHandler extends DefaultHandler { 
     279  private class OMETiffHandler extends DefaultHandler { 
    286280    private String order; 
    287281    private int sizeZ, sizeC, sizeT; 
     
    358352        } 
    359353        if (numIFDs != null) { 
    360           numIFDs[currentSeries] += fds[currentFile].length; 
     354          numIFDs[currentSeries] += ifdsUsed[currentFile].length; 
    361355        } 
    362356 
     
    371365        if (ifd == null || ifd.equals("")) ifd = "0"; 
    372366        if (numPlanes == null || numPlanes.equals("")) { 
    373           if (fds != null) numPlanes = "" + fds[currentSeries].length; 
     367          if (ifdsUsed != null) numPlanes = "" + ifdsUsed[currentSeries].length; 
    374368          else numPlanes = "" + ifds.length; 
    375369        } 
     
    379373 
    380374        try { 
    381           if (fds != null && fds[currentFile] != null) { 
     375          if (ifdsUsed != null && ifdsUsed[currentFile] != null) { 
    382376            int f = Integer.parseInt(ifd); 
    383             int x = (int) TiffTools.getImageWidth(fds[currentFile][f]); 
    384             int y = (int) TiffTools.getImageLength(fds[currentFile][f]); 
     377            int x = (int) TiffTools.getImageWidth(ifdsUsed[currentFile][f]); 
     378            int y = (int) TiffTools.getImageLength(ifdsUsed[currentFile][f]); 
    385379            if (x != core.sizeX[currentSeries]) { 
    386380              LogTools.println("Mismatched width: got " + 
     
    443437    } 
    444438  } 
     439 
    445440} 
Note: See TracChangeset for help on using the changeset viewer.