Changeset 3221


Ignore:
Timestamp:
10/03/07 11:47:53 (12 years ago)
Author:
melissa
Message:

Only group files if the Image LSID is present, and print warnings if the IFD count and image count are not equal. This works fine for single-series datasets, but some work still needs to be done to ensure that multi-series datasets are properly handled.

File:
1 edited

Legend:

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

    r3219 r3221  
    4848  private String[] used; 
    4949 
    50   private Hashtable coordinateMap; 
     50  private Hashtable[] coordinateMap; 
    5151 
    5252  // -- Constructor -- 
     
    103103    int fileIndex = -1; 
    104104    int[] savedCoords = new int[] {-1, -1, -1}; 
    105     for (int i=0; i<coordinateMap.size(); i++) { 
    106       int[] firstZCT = (int[]) coordinateMap.get(new Integer(i)); 
     105    for (int i=0; i<coordinateMap[series].size(); i++) { 
     106      int[] firstZCT = (int[]) coordinateMap[series].get(new Integer(i)); 
    107107      if (firstZCT[0] <= zct[0] && firstZCT[1] <= zct[1] && 
    108108        firstZCT[2] <= zct[2] && firstZCT[0] >= savedCoords[0] && 
     
    131131    imageId = imageId.substring(ndx + 4, imageId.indexOf("\"", ndx + 5)); 
    132132 
    133     Vector files = new Vector(); 
    134     Location l = new Location(currentId); 
    135     l = l.getAbsoluteFile().getParentFile(); 
    136     String[] fileList = l.list(); 
    137     Vector tempComments = new Vector(); 
    138  
    139     for (int i=0; i<fileList.length; i++) { 
    140       String check = fileList[i].toLowerCase(); 
    141       if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
    142         Hashtable ifd = TiffTools.getFirstIFD(new RandomAccessStream( 
    143           l.getAbsolutePath() + File.separator + fileList[i])); 
    144         if (ifd == null) continue; 
    145         String comment = 
    146           (String) TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
    147         tempComments.add(comment); 
    148         ndx = comment.indexOf("<Image"); 
    149         ndx = comment.indexOf("ID=\"", ndx); 
    150         if (ndx > -1) { 
    151           comment = comment.substring(ndx + 4, comment.indexOf("\"", ndx + 5)); 
    152           if (comment.equals(imageId)) { 
    153             files.add(l.getAbsolutePath() + File.separator + fileList[i]); 
     133    int[] numIFDs = null; 
     134 
     135    // only look for files in the same dataset if LSIDs are present 
     136    if (imageId.indexOf("urn:lsid") != -1) { 
     137      Vector files = new Vector(); 
     138      Location l = new Location(currentId); 
     139      l = l.getAbsoluteFile().getParentFile(); 
     140      String[] fileList = l.list(); 
     141      Vector tempComments = new Vector(); 
     142 
     143      for (int i=0; i<fileList.length; i++) { 
     144        String check = fileList[i].toLowerCase(); 
     145        if (check.endsWith(".tif") || check.endsWith(".tiff")) { 
     146          Hashtable ifd = TiffTools.getFirstIFD(new RandomAccessStream( 
     147            l.getAbsolutePath() + File.separator + fileList[i])); 
     148          if (ifd == null) continue; 
     149          String comment = 
     150            (String) TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION); 
     151          tempComments.add(comment); 
     152          ndx = comment.indexOf("<Image"); 
     153          ndx = comment.indexOf("ID=\"", ndx); 
     154          if (ndx > -1) { 
     155            comment = 
     156              comment.substring(ndx + 4, comment.indexOf("\"", ndx + 5)); 
     157            if (comment.equals(imageId)) { 
     158              files.add(l.getAbsolutePath() + File.separator + fileList[i]); 
     159            } 
    154160          } 
    155161        } 
    156162      } 
    157     } 
    158  
    159     used = (String[]) files.toArray(new String[0]); 
    160  
    161     // reorder TIFF files 
    162     coordinateMap = new Hashtable(); 
    163     for (int i=0; i<files.size(); i++) { 
    164       String comment = (String) tempComments.get(i); 
    165       ByteArrayInputStream is = new ByteArrayInputStream(comment.getBytes()); 
    166       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    167       Document doc = null; 
    168       try { 
    169         DocumentBuilder builder = factory.newDocumentBuilder(); 
    170         doc = builder.parse(is); 
     163 
     164      used = (String[]) files.toArray(new String[0]); 
     165 
     166      // reorder TIFF files 
     167      for (int i=0; i<files.size(); i++) { 
     168        String comment = (String) tempComments.get(i); 
     169        ByteArrayInputStream is = new ByteArrayInputStream(comment.getBytes()); 
     170        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     171        Document doc = null; 
     172        try { 
     173          DocumentBuilder builder = factory.newDocumentBuilder(); 
     174          doc = builder.parse(is); 
     175        } 
     176        catch (ParserConfigurationException exc) { } 
     177        catch (SAXException exc) { } 
     178        catch (IOException exc) { } 
     179 
     180        if (doc != null) { 
     181          int numSeries = doc.getElementsByTagName("Pixels").getLength(); 
     182          if (coordinateMap == null) coordinateMap = new Hashtable[numSeries]; 
     183          if (numIFDs == null) numIFDs = new int[numSeries]; 
     184          Vector v = new Vector(); 
     185          NodeList pixelsList = doc.getElementsByTagName("Pixels"); 
     186          Element[] tiffData = null; 
     187          for (int j=0; j<numSeries; j++) { 
     188            if (coordinateMap[j] == null) coordinateMap[j] = new Hashtable(); 
     189            NodeList list = ((Element) pixelsList.item(j)).getChildNodes(); 
     190            int size = list.getLength(); 
     191            v.clear(); 
     192            for (int k=0; k<size; k++) { 
     193              Node node = list.item(k); 
     194              if ("TiffData".equals(node.getNodeName())) v.add(node); 
     195            } 
     196            tiffData = new Element[v.size()]; 
     197            v.copyInto(tiffData); 
     198 
     199            String firstZ = tiffData[0].getAttribute("FirstZ"); 
     200            String firstC = tiffData[0].getAttribute("FirstC"); 
     201            String firstT = tiffData[0].getAttribute("FirstT"); 
     202            if (firstZ == null || firstZ.equals("")) firstZ = "0"; 
     203            if (firstC == null || firstC.equals("")) firstC = "0"; 
     204            if (firstT == null || firstT.equals("")) firstT = "0"; 
     205            coordinateMap[j].put(new Integer(i), 
     206              new int[] {Integer.parseInt(firstZ), 
     207              Integer.parseInt(firstC), Integer.parseInt(firstT)}); 
     208            numIFDs[j] += TiffTools.getIFDs( 
     209              new RandomAccessStream((String) files.get(i))).length; 
     210          } 
     211        } 
    171212      } 
    172       catch (ParserConfigurationException exc) { } 
    173       catch (SAXException exc) { } 
    174       catch (IOException exc) { } 
    175  
    176       Element[][] tiffData = null; 
    177       if (doc != null) { 
    178         int numSeries = doc.getElementsByTagName("Pixels").getLength(); 
    179         tiffData = new Element[numSeries][]; 
    180         Vector v = new Vector(); 
    181         NodeList pixelsList = doc.getElementsByTagName("Pixels"); 
    182         for (int j=0; j<numSeries; j++) { 
    183           NodeList list = ((Element) pixelsList.item(j)).getChildNodes(); 
    184           int size = list.getLength(); 
    185           v.clear(); 
    186           for (int k=0; k<size; k++) { 
    187             Node node = list.item(k); 
    188             if ("TiffData".equals(node.getNodeName())) v.add(node); 
    189           } 
    190           tiffData[j] = new Element[v.size()]; 
    191           v.copyInto(tiffData[j]); 
    192         } 
    193  
    194         String firstZ = tiffData[0][0].getAttribute("FirstZ"); 
    195         String firstC = tiffData[0][0].getAttribute("FirstC"); 
    196         String firstT = tiffData[0][0].getAttribute("FirstT"); 
    197         if (firstZ == null || firstZ.equals("")) firstZ = "0"; 
    198         if (firstC == null || firstC.equals("")) firstC = "0"; 
    199         if (firstT == null || firstT.equals("")) firstT = "0"; 
    200         coordinateMap.put(new Integer(i), new int[] {Integer.parseInt(firstZ), 
    201           Integer.parseInt(firstC), Integer.parseInt(firstT)}); 
    202       } 
     213    } 
     214    else { 
     215      used = new String[] {currentId}; 
     216      LogTools.println("Not searching for other files - " + 
     217        "Image LSID not present."); 
    203218    } 
    204219 
     
    281296        if (core.sizeT[i] < 1) core.sizeT[i] = 1; 
    282297 
    283         core.imageCount[i] = core.sizeZ[i] * core.sizeC[i] * core.sizeT[i]; 
    284298        int sc = core.sizeC[i]; 
    285299        if (rgb) sc /= 3; 
     300        core.imageCount[i] = core.sizeZ[i] * sc * core.sizeT[i]; 
    286301        core.rgb[i] = rgb; 
    287302        core.pixelType[i] = FormatTools.pixelTypeFromString( 
     
    301316        core.orderCertain[i] = true; 
    302317 
    303         if ((core.rgb[i] && (core.sizeZ[i] * core.sizeT[i] == ifds.length)) || 
    304           (core.sizeC[i] * core.sizeZ[i] * core.sizeT[i] == ifds.length)) 
    305         { 
    306           used = new String[] {currentId}; 
     318        if (numIFDs != null) { 
     319          if (numIFDs[i] < core.imageCount[i]) { 
     320            LogTools.println("Too few IFDs; got " + numIFDs[i] + ", expected " + 
     321              core.imageCount[i]); 
     322          } 
     323          else if (numIFDs[i] > core.imageCount[i]) { 
     324            LogTools.println("Too many IFDs; got " + numIFDs[i] + 
     325              ", expected " + core.imageCount[i]); 
     326          } 
     327        } 
     328        else if (core.imageCount[i] > ifds.length) { 
     329          core.imageCount[i] = ifds.length; 
     330          if (core.sizeZ[i] > ifds.length) { 
     331            core.sizeZ[i] = ifds.length / (rgb ? core.sizeC[i] : 1); 
     332            core.sizeT[i] = 1; 
     333            if (!rgb) core.sizeC[i] = 1; 
     334          } 
     335          else if (core.sizeT[i] > ifds.length) { 
     336            core.sizeT[i] = ifds.length / (rgb ? core.sizeC[i] : 1); 
     337            core.sizeZ[i] = 1; 
     338            if (!rgb) core.sizeC[i] = 1; 
     339          } 
    307340        } 
    308341 
     
    410443          } 
    411444        } 
    412  
    413         // analyze ZCT matrix to determine best SizeZ, SizeC, and SizeT 
    414         // for now, we only handle certain special cases: 
    415         boolean success = false; 
    416         int theZ, theT, theC; 
    417  
    418         // 1) all Z, all T, all C 
    419         success = true; 
    420         for (int z=0; z<core.sizeZ[i] && success; z++) { 
    421           for (int t=0; t<core.sizeT[i] && success; t++) { 
    422             for (int c=0; c<sc && success; c++) { 
    423               if (!zct[z][c][t]) success = false; 
    424             } 
    425           } 
    426         } 
    427         if (success) { 
    428           // NB: sizes are already correct; no corrections necessary 
    429           continue; 
    430         } 
    431  
    432         // 2) single Z, all T, all C 
    433         success = true; 
    434         theZ = -1; 
    435         for (int z=0; z<core.sizeT[i] && success; z++) { 
    436           if (zct[z][0][0]) { 
    437             if (theZ < 0) theZ = z; 
    438             else success = false; 
    439           } 
    440           boolean state = theZ == z; 
    441           for (int t=0; t<core.sizeT[i] && success; t++) { 
    442             for (int c=0; c<sc && success; c++) { 
    443               if (zct[z][c][t] != state) success = false; 
    444             } 
    445           } 
    446         } 
    447         if (success) { 
    448           core.sizeZ[i] = 1; 
    449           continue; 
    450         } 
    451  
    452         // 3) all Z, single T, all C 
    453         success = true; 
    454         theT = -1; 
    455         for (int t=0; t<core.sizeT[i] && success; t++) { 
    456           if (zct[0][0][t]) { 
    457             if (theT < 0) theT = t; 
    458             else success = false; 
    459           } 
    460           boolean state = theT == t; 
    461           for (int z=0; z<core.sizeZ[i] && success; z++) { 
    462             for (int c=0; c<sc && success; c++) { 
    463               if (zct[z][c][t] != state) success = false; 
    464             } 
    465           } 
    466         } 
    467         if (success) { 
    468           core.sizeT[i] = 1; 
    469           continue; 
    470         } 
    471  
    472         // 4) all Z, all T, single C 
    473         success = true; 
    474         theC = -1; 
    475         for (int c=0; c<sc && success; c++) { 
    476           if (zct[0][c][0]) { 
    477             if (theC < 0) theC = c; 
    478             else success = false; 
    479           } 
    480           boolean state = theC == c; 
    481           for (int z=0; z<core.sizeZ[i] && success; z++) { 
    482             for (int t=0; t<core.sizeT[i] && success; t++) { 
    483               if (zct[z][c][t] != state) success = false; 
    484             } 
    485           } 
    486         } 
    487         if (success) { 
    488           core.sizeC[i] = 1; 
    489           continue; 
    490         } 
    491  
    492         // 5) single Z, single T, all C 
    493         success = true; 
    494         theZ = -1; 
    495         theT = -1; 
    496         for (int z=0; z<core.sizeZ[i] && success; z++) { 
    497           for (int t=0; t<core.sizeT[i] && success; t++) { 
    498             if (zct[z][0][t]) { 
    499               if (theZ < 0 && theT < 0) { 
    500                 theZ = z; 
    501                 theT = t; 
    502               } 
    503               else success = false; 
    504             } 
    505             boolean state = theZ == z && theT == t; 
    506             for (int c=0; c<sc && success; c++) { 
    507               if (zct[z][c][t] != state) success = false; 
    508             } 
    509           } 
    510         } 
    511  
    512         if (success) { 
    513           core.sizeZ[i] = core.sizeT[i] = 1; 
    514           continue; 
    515         } 
    516  
    517         // 6) single Z, all T, single C 
    518         success = true; 
    519         theZ = -1; 
    520         theC = -1; 
    521         for (int z=0; z<core.sizeZ[i] && success; z++) { 
    522           for (int c=0; c<sc && success; c++) { 
    523             if (zct[z][c][0]) { 
    524               if (theZ < 0 && theC < 0) { 
    525                 theZ = z; 
    526                 theC = c; 
    527               } 
    528               else success = false; 
    529             } 
    530             boolean state = theZ == z && theC == c; 
    531             for (int t=0; t<core.sizeT[i] && success; t++) { 
    532               if (zct[z][c][t] != state) success = false; 
    533             } 
    534           } 
    535         } 
    536         if (success) { 
    537           core.sizeZ[i] = core.sizeC[i] = 1; 
    538           continue; 
    539         } 
    540  
    541         // 7) all Z, single T, single C 
    542         success = true; 
    543         theT = -1; 
    544         theC = -1; 
    545         for (int t=0; t<core.sizeT[i] && success; t++) { 
    546           for (int c=0; c<sc && success; c++) { 
    547             if (zct[0][c][t]) { 
    548               if (theC < 0 && theT < 0) { 
    549                 theC = c; 
    550                 theT = t; 
    551               } 
    552               else success = false; 
    553             } 
    554             boolean state = theC == c && theT == t; 
    555             for (int z=0; z<core.sizeZ[i] && success; z++) { 
    556               if (zct[z][c][t] != state) success = false; 
    557             } 
    558           } 
    559         } 
    560         if (success) { 
    561           core.sizeT[i] = core.sizeC[i] = 1; 
    562           continue; 
    563         } 
    564  
    565         // 8) single Z, single T, single C 
    566         success = true; 
    567         theZ = -1; 
    568         theT = -1; 
    569         theC = -1; 
    570         int count = 0; 
    571         for (int z=0; z<core.sizeZ[i] && success; z++) { 
    572           for (int t=0; t<core.sizeT[i] && success; t++) { 
    573             for (int c=0; c<sc && success; c++) { 
    574               if (zct[z][c][t]) { 
    575                 count++; 
    576                 if (count > 1) success = false; 
    577               } 
    578             } 
    579           } 
    580         } 
    581         if (success) { 
    582           core.sizeZ[i] = core.sizeT[i] = core.sizeC[i] = 1; 
    583           continue; 
    584         } 
    585  
    586         // no easy way to chop up TiffData mappings into regular ZCT dims 
    587         throw new FormatException("Unsupported ZCT index mapping"); 
    588445      } 
    589446    } 
Note: See TracChangeset for help on using the changeset viewer.