Changeset 3230


Ignore:
Timestamp:
10/05/07 13:05:41 (12 years ago)
Author:
melissa
Message:

Fixed width/height mismatch detection, TiffData scrambling in single-file datasets.

File:
1 edited

Legend:

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

    r3227 r3230  
    9595    FormatTools.checkBufferSize(this, buf.length); 
    9696 
    97     if (used.length == 1) { 
     97    if (used.length == 1 && series == 0) { 
    9898      TiffTools.getSamples(ifds[no], in, buf); 
    9999      return swapIfRequired(buf); 
     
    172172 
    173173    // only look for files in the same dataset if LSIDs are present 
    174     if (lsids) { 
    175       Vector files = new Vector(); 
    176       Location l = new Location(currentId); 
    177       l = l.getAbsoluteFile().getParentFile(); 
    178       String[] fileList = l.list(); 
    179       coordinateMap = new Hashtable[numSeries]; 
    180       for (int i=0; i<numSeries; i++) { 
    181         coordinateMap[i] = new Hashtable(); 
    182       } 
    183  
    184       for (int i=0; i<fileList.length; i++) { 
    185         check = fileList[i].toLowerCase(); 
    186         if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
    187           Hashtable ifd = TiffTools.getFirstIFD(new RandomAccessStream( 
    188             l.getAbsolutePath() + File.separator + fileList[i])); 
    189           if (ifd == null) continue; 
    190           comment = 
    191             (String) TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
    192           boolean addToList = true; 
    193           for (int s=0; s<imageIds.length; s++) { 
    194             if (comment.indexOf(imageIds[s]) == -1) { 
    195               addToList = false; 
    196               break; 
    197             } 
    198           } 
    199           if (addToList) { 
    200             for (int s=0; s<pixelsIds.length; s++) { 
    201               if (comment.indexOf(pixelsIds[s]) == -1) { 
    202                 addToList = false; 
    203               } 
    204             } 
    205           } 
    206  
    207           if (addToList) { 
    208             files.add(l.getAbsolutePath() + File.separator + fileList[i]); 
    209  
    210             ByteArrayInputStream is = 
    211               new ByteArrayInputStream(comment.getBytes()); 
    212             DocumentBuilderFactory factory = 
    213               DocumentBuilderFactory.newInstance(); 
    214             Document doc = null; 
    215             try { 
    216               DocumentBuilder builder = factory.newDocumentBuilder(); 
    217               doc = builder.parse(is); 
    218             } 
    219             catch (ParserConfigurationException exc) { } 
    220             catch (SAXException exc) { } 
    221             catch (IOException exc) { } 
    222  
    223             if (doc != null) { 
    224               NodeList pixelsList = doc.getElementsByTagName("Pixels"); 
    225               for (int j=0; j<numSeries; j++) { 
    226                 NodeList list = ((Element) pixelsList.item(j)).getChildNodes(); 
    227                 // if there are multiple TiffData elements, find the one with 
    228                 // the smallest ZCT coordinates 
    229  
    230                 v = new Vector(); 
    231                 for (int q=0; q<list.getLength(); q++) { 
    232                   if (((Node) list.item(q)).getNodeName().equals("TiffData")) { 
    233                     v.add(list.item(q)); 
    234                   } 
    235                 } 
    236                 Element[] tiffData = (Element[]) v.toArray(new Element[0]); 
    237                 int[] smallestCoords = new int[4]; 
    238                 Arrays.fill(smallestCoords, Integer.MAX_VALUE); 
    239                 for (int q=0; q<tiffData.length; q++) { 
    240                   String firstZ = tiffData[q].getAttribute("FirstZ"); 
    241                   String firstC = tiffData[q].getAttribute("FirstC"); 
    242                   String firstT = tiffData[q].getAttribute("FirstT"); 
    243                   String firstIFD = tiffData[q].getAttribute("IFD"); 
    244                   if (firstZ == null || firstZ.equals("")) firstZ = "0"; 
    245                   if (firstC == null || firstC.equals("")) firstC = "0"; 
    246                   if (firstT == null || firstT.equals("")) firstT = "0"; 
    247                   if (firstIFD == null || firstIFD.equals("")) firstIFD = "0"; 
    248                   int z = Integer.parseInt(firstZ); 
    249                   int c = Integer.parseInt(firstC); 
    250                   int t = Integer.parseInt(firstT); 
    251                   if (z <= smallestCoords[0] && c <= smallestCoords[1] && 
    252                     t <= smallestCoords[2]) 
    253                   { 
    254                     smallestCoords[0] = z; 
    255                     smallestCoords[1] = c; 
    256                     smallestCoords[2] = t; 
    257                     smallestCoords[3] = Integer.parseInt(firstIFD); 
    258                   } 
    259                 } 
    260                 coordinateMap[j].put(new Integer(files.size() - 1), 
    261                   smallestCoords); 
    262                 numIFDs[j] += TiffTools.getIFDs(new RandomAccessStream( 
    263                   (String) files.get(files.size() - 1))).length; 
    264               } 
    265             } 
    266           } 
    267         } 
    268       } 
    269  
    270       used = (String[]) files.toArray(new String[0]); 
    271     } 
    272     else { 
    273       used = new String[] {currentId}; 
     174    Vector files = new Vector(); 
     175    Location l = new Location(currentId); 
     176    l = l.getAbsoluteFile().getParentFile(); 
     177    String[] fileList = l.list(); 
     178    coordinateMap = new Hashtable[numSeries]; 
     179    for (int i=0; i<numSeries; i++) { 
     180      coordinateMap[i] = new Hashtable(); 
     181    } 
     182    if (!lsids) { 
     183      fileList = new String[] {currentId}; 
    274184      LogTools.println("Not searching for other files - " + 
    275185        "Image LSID not present."); 
    276       numIFDs[0] = ifds.length; 
    277     } 
    278  
    279     int oldX = core.sizeX[0]; 
    280     int oldY = core.sizeY[0]; 
     186    } 
     187 
     188    for (int i=0; i<fileList.length; i++) { 
     189      check = fileList[i].toLowerCase(); 
     190      if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
     191        Hashtable ifd = TiffTools.getFirstIFD(new RandomAccessStream( 
     192          l.getAbsolutePath() + File.separator + fileList[i])); 
     193        if (ifd == null) continue; 
     194        comment = 
     195          (String) TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
     196        boolean addToList = true; 
     197        for (int s=0; s<imageIds.length; s++) { 
     198          if (comment.indexOf(imageIds[s]) == -1) { 
     199            addToList = false; 
     200            break; 
     201          } 
     202        } 
     203        if (addToList) { 
     204          for (int s=0; s<pixelsIds.length; s++) { 
     205            if (comment.indexOf(pixelsIds[s]) == -1) { 
     206              addToList = false; 
     207            } 
     208          } 
     209        } 
     210 
     211        if (addToList) { 
     212          files.add(l.getAbsolutePath() + File.separator + fileList[i]); 
     213 
     214          ByteArrayInputStream is = 
     215            new ByteArrayInputStream(comment.getBytes()); 
     216          DocumentBuilderFactory factory = 
     217            DocumentBuilderFactory.newInstance(); 
     218          Document doc = null; 
     219          try { 
     220            DocumentBuilder builder = factory.newDocumentBuilder(); 
     221            doc = builder.parse(is); 
     222          } 
     223          catch (ParserConfigurationException exc) { } 
     224          catch (SAXException exc) { } 
     225          catch (IOException exc) { } 
     226 
     227          if (doc != null) { 
     228            NodeList pixelsList = doc.getElementsByTagName("Pixels"); 
     229            for (int j=0; j<numSeries; j++) { 
     230              NodeList list = ((Element) pixelsList.item(j)).getChildNodes(); 
     231              // if there are multiple TiffData elements, find the one with 
     232              // the smallest ZCT coordinates 
     233 
     234              v = new Vector(); 
     235              for (int q=0; q<list.getLength(); q++) { 
     236                if (((Node) list.item(q)).getNodeName().equals("TiffData")) { 
     237                  v.add(list.item(q)); 
     238                } 
     239              } 
     240              Element[] tiffData = (Element[]) v.toArray(new Element[0]); 
     241              int[] smallestCoords = new int[4]; 
     242              Arrays.fill(smallestCoords, Integer.MAX_VALUE); 
     243              for (int q=0; q<tiffData.length; q++) { 
     244                String firstZ = tiffData[q].getAttribute("FirstZ"); 
     245                String firstC = tiffData[q].getAttribute("FirstC"); 
     246                String firstT = tiffData[q].getAttribute("FirstT"); 
     247                String firstIFD = tiffData[q].getAttribute("IFD"); 
     248                if (firstZ == null || firstZ.equals("")) firstZ = "0"; 
     249                if (firstC == null || firstC.equals("")) firstC = "0"; 
     250                if (firstT == null || firstT.equals("")) firstT = "0"; 
     251                if (firstIFD == null || firstIFD.equals("")) firstIFD = "0"; 
     252                int z = Integer.parseInt(firstZ); 
     253                int c = Integer.parseInt(firstC); 
     254                int t = Integer.parseInt(firstT); 
     255                if (z <= smallestCoords[0] && c <= smallestCoords[1] && 
     256                  t <= smallestCoords[2]) 
     257                { 
     258                  smallestCoords[0] = z; 
     259                  smallestCoords[1] = c; 
     260                  smallestCoords[2] = t; 
     261                  smallestCoords[3] = Integer.parseInt(firstIFD); 
     262                } 
     263              } 
     264              coordinateMap[j].put(new Integer(files.size() - 1), 
     265                smallestCoords); 
     266              numIFDs[j] += TiffTools.getIFDs(new RandomAccessStream( 
     267                (String) files.get(files.size() - 1))).length; 
     268            } 
     269          } 
     270        } 
     271      } 
     272    } 
     273 
     274    used = (String[]) files.toArray(new String[0]); 
     275 
    281276    comment = (String) getMeta("Comment"); 
    282277 
     
    310305          Node node = list.item(j); 
    311306          if (!(node instanceof Element)) continue; 
    312           if ("TiffData".equals(node.getNodeName())) v.add(node); 
     307          if ("TiffData".equals(node.getNodeName())) { 
     308            v.add(node); 
     309          } 
    313310        } 
    314311        tiffData[i] = new Element[v.size()]; 
     
    338335 
    339336      for (int i=0; i<tiffData.length; i++) { 
     337        String ifdString = tiffData[i][0].getAttribute("IFD"); 
     338        int ifd = -1; 
     339        if (ifdString == null || ifdString.equals("")) ifd = 0; 
     340        else ifd = Integer.parseInt(ifdString); 
    340341        core.sizeX[i] = Integer.parseInt(pixels[i].getAttribute("SizeX")); 
    341         if (core.sizeX[i] != oldX) { 
     342        int expectedX = (int) TiffTools.getImageWidth(ifds[ifd]); 
     343        if (core.sizeX[i] != expectedX) { 
    342344          LogTools.println("Mismatched width: OME-XML reports SizeX=" + 
    343             core.sizeX[i] + "; expecting " + oldX); 
    344           core.sizeX[i] = oldX; 
     345            core.sizeX[i] + "; expecting " + expectedX); 
     346          core.sizeX[i] = expectedX; 
    345347        } 
    346348        core.sizeY[i] = Integer.parseInt(pixels[i].getAttribute("SizeY")); 
    347         if (core.sizeY[i] != oldY) { 
     349        int expectedY = (int) TiffTools.getImageLength(ifds[ifd]); 
     350        if (core.sizeY[i] != expectedY) { 
    348351          LogTools.println("Mismatched height: OME-XML reports SizeY=" + 
    349             core.sizeY[i] + "; expecting " + oldY); 
    350           core.sizeY[i] = oldY; 
     352            core.sizeY[i] + "; expecting " + expectedY); 
     353          core.sizeY[i] = expectedY; 
    351354        } 
    352355        core.sizeZ[i] = Integer.parseInt(pixels[i].getAttribute("SizeZ")); 
Note: See TracChangeset for help on using the changeset viewer.