Changeset 3150 for trunk


Ignore:
Timestamp:
09/10/07 09:45:02 (13 years ago)
Author:
melissa
Message:

Improved Metamorph ND support.

File:
1 edited

Legend:

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

    r3097 r3150  
    6767  private int mmPlanes; //number of metamorph planes 
    6868 
     69  private MetamorphReader r; 
     70 
    6971  /** List of STK files in the dataset. */ 
    70   private String[] stks; 
     72  private String[][] stks; 
    7173 
    7274  // -- Constructor -- 
     
    119121  } 
    120122 
     123  /* @see loci.formats.IFormatReader#close() */ 
     124  public void close() throws IOException { 
     125    super.close(); 
     126    if (r != null) r.close(); 
     127  } 
     128 
    121129  /* @see loci.formats.IFormatReader#fileGroupOption(String) */ 
    122130  public int fileGroupOption(String id) throws FormatException, IOException { 
     
    140148  /* @see loci.formats.IFormatReader#getUsedFiles() */ 
    141149  public String[] getUsedFiles() { 
    142     return stks == null ? super.getUsedFiles() : stks; 
     150    return stks == null ? super.getUsedFiles() : stks[series]; 
    143151  } 
    144152 
     
    148156  { 
    149157    FormatTools.assertId(currentId, true, 1); 
    150     if (stks == null || stks.length == 1) return super.openBytes(no, buf); 
    151  
    152     int[] coords = FormatTools.getZCTCoords(this, no); 
    153     int ndx = coords[1] * getEffectiveSizeC() + coords[2] * core.sizeT[0]; 
    154  
    155     RandomAccessStream tmp = new RandomAccessStream(stks[ndx]); 
    156     Hashtable[] fds = TiffTools.getIFDs(tmp); 
    157     TiffTools.getSamples(fds[coords[0]], tmp, buf); 
    158     tmp.close(); 
    159     return buf; 
     158    if (stks == null || stks[series].length == 1) { 
     159      return super.openBytes(no, buf); 
     160    } 
     161 
     162    int[] coords = FormatTools.getZCTCoords(this, no % core.sizeZ[series]); 
     163    int ndx = coords[1] * getEffectiveSizeC() + coords[2] * core.sizeT[series]; 
     164    String file = stks[series][ndx]; 
     165 
     166    if (r == null) r = new MetamorphReader(); 
     167    r.setId(file); 
     168    return r.openBytes(coords[0], buf); 
    160169  } 
    161170 
     
    163172  public BufferedImage openImage(int no) throws FormatException, IOException { 
    164173    FormatTools.assertId(currentId, true, 1); 
    165     if (stks == null || stks.length == 1) return super.openImage(no); 
    166  
    167     int[] coords = FormatTools.getZCTCoords(this, no); 
    168     int ndx = no / core.sizeZ[0]; 
    169  
    170     initFile(stks[ndx]); 
    171     return TiffTools.getImage(ifds[coords[0]], in); 
     174    if (stks == null || stks[series].length == 1) return super.openImage(no); 
     175 
     176    int[] coords = FormatTools.getZCTCoords(this, no % core.sizeZ[series]); 
     177    int ndx = no / core.sizeZ[series]; 
     178    String file = stks[series][ndx]; 
     179    
     180    if (r == null) r = new MetamorphReader(); 
     181    r.setId(file); 
     182    BufferedImage img = r.openImage(coords[0]); 
     183    return img; 
    172184  } 
    173185 
     
    213225    Location ndfile = null; 
    214226 
    215     if (!id.toLowerCase().endsWith(".nd")) { 
    216       Location abs = new Location(currentId).getAbsoluteFile(); 
    217  
    218       int idx = id.indexOf("_"); 
    219       if (idx == -1) idx = id.lastIndexOf("."); 
    220  
    221       ndfile = new Location(abs.getParent(), id.substring(0, idx) + ".nd"); 
    222       if (!ndfile.exists()) { 
    223         ndfile = 
    224           new Location(ndfile.getAbsolutePath().replaceAll(".nd", ".ND")); 
    225       } 
    226     } 
    227     else { 
    228       ndfile = new Location(id); 
    229     } 
    230  
    231     if (ndfile.exists() && (fileGroupOption(id) == FormatTools.MUST_GROUP || 
    232       isGroupFiles())) 
     227    if (id.toLowerCase().endsWith(".nd")) ndfile = new Location(id);  
     228 
     229    if (ndfile != null && ndfile.exists() &&  
     230      (fileGroupOption(id) == FormatTools.MUST_GROUP || isGroupFiles())) 
    233231    { 
    234232      RandomAccessStream ndStream = 
     
    258256      int numFiles = cc * tc; 
    259257 
    260       stks = new String[numFiles]; 
     258      // determine series count 
     259 
     260      boolean[] hasZ = new boolean[cc]; 
     261      int seriesCount = 1; 
     262      for (int i=0; i<cc; i++) { 
     263        hasZ[i] = ((String) getMeta("WaveDoZ" + (i + 1))).equals("TRUE"); 
     264        if (i > 0 && hasZ[i] != hasZ[i - 1]) seriesCount = 2; 
     265      }  
     266 
     267      int channelsInFirstSeries = cc; 
     268      if (seriesCount == 2) { 
     269        channelsInFirstSeries = 0; 
     270        for (int i=0; i<cc; i++) { 
     271          if (hasZ[i]) channelsInFirstSeries++; 
     272        } 
     273      } 
     274 
     275      stks = new String[seriesCount][]; 
     276      if (seriesCount == 1) stks[0] = new String[numFiles]; 
     277      else { 
     278        stks[0] = new String[channelsInFirstSeries * tc]; 
     279        stks[1] = new String[(cc - channelsInFirstSeries) * tc];  
     280      } 
    261281 
    262282      String prefix = ndfile.getPath(); 
     
    264284        prefix.lastIndexOf(".")); 
    265285 
    266       int pt = 0; 
     286      int[] pt = new int[seriesCount]; 
    267287      for (int i=0; i<tc; i++) { 
    268288        for (int j=0; j<cc; j++) { 
    269289          String chName = (String) getMeta("WaveName" + (j + 1)); 
    270290          chName = chName.substring(1, chName.length() - 1); 
    271           stks[pt] = prefix + "_w" + (j + 1) + chName + "_t" + 
    272             (i + 1) + ".STK"; 
    273           pt++; 
     291          int seriesNdx = seriesCount == 1 ? 0 : (hasZ[j] ? 0 : 1);  
     292          stks[seriesNdx][pt[seriesNdx]++] =  
     293            prefix + "_w" + (j + 1) + chName + "_t" + (i + 1) + ".STK"; 
    274294        } 
    275295      } 
     
    277297      ndfile = ndfile.getAbsoluteFile(); 
    278298 
    279       for (int i=0; i<numFiles; i++) { 
    280         Location l = new Location(ndfile.getParent(), stks[i]); 
    281         if (!l.exists()) { 
    282           stks = null; 
    283           return; 
     299      for (int s=0; s<stks.length; s++) { 
     300        for (int f=0; f<stks[s].length; f++) { 
     301          Location l = new Location(ndfile.getParent(), stks[s][f]); 
     302          if (!l.exists()) { 
     303            // '%' can be converted to '-' 
     304            if (stks[s][f].indexOf("%") != -1) { 
     305              stks[s][f] = stks[s][f].replaceAll("%", "-"); 
     306              l = new Location(ndfile.getParent(), stks[s][f]); 
     307              if (!l.exists()) { 
     308                // try replacing extension 
     309                stks[s][f] = stks[s][f].substring(0,  
     310                  stks[s][f].lastIndexOf(".")) + ".TIF";  
     311                l = new Location(ndfile.getParent(), stks[s][f]); 
     312                if (!l.exists()) { 
     313                  stks = null; 
     314                  return; 
     315                } 
     316              } 
     317            } 
     318             
     319            if (!l.exists()) { 
     320              // try replacing extension 
     321              stks[s][f] = stks[s][f].substring(0,  
     322                stks[s][f].lastIndexOf(".")) + ".TIF";  
     323              l = new Location(ndfile.getParent(), stks[s][f]); 
     324              if (!l.exists()) { 
     325                stks = null; 
     326                return; 
     327              } 
     328            } 
     329          } 
     330          stks[s][f] = l.getAbsolutePath();  
    284331        } 
    285         stks[i] = l.getAbsolutePath(); 
    286332      } 
    287333 
     
    291337      core.imageCount[0] = zc * tc * cc; 
    292338      core.currentOrder[0] = "XYZCT"; 
     339     
     340      if (stks.length > 1) { 
     341        CoreMetadata newCore = new CoreMetadata(stks.length); 
     342        for (int i=0; i<stks.length; i++) { 
     343          newCore.sizeX[i] = core.sizeX[0]; 
     344          newCore.sizeY[i] = core.sizeY[0]; 
     345          newCore.sizeZ[i] = core.sizeZ[0]; 
     346          newCore.sizeC[i] = core.sizeC[0]; 
     347          newCore.sizeT[i] = core.sizeT[0]; 
     348          newCore.pixelType[i] = core.pixelType[0]; 
     349          newCore.imageCount[i] = core.imageCount[0]; 
     350          newCore.currentOrder[i] = core.currentOrder[0]; 
     351          newCore.rgb[i] = core.rgb[0]; 
     352          newCore.littleEndian[i] = core.littleEndian[0]; 
     353          newCore.interleaved[i] = core.interleaved[0]; 
     354        } 
     355        newCore.sizeC[0] = stks[0].length / newCore.sizeT[0]; 
     356        newCore.sizeC[1] = stks[1].length / newCore.sizeT[1]; 
     357        newCore.sizeZ[1] = 1; 
     358        newCore.imageCount[0] =  
     359          newCore.sizeC[0] * newCore.sizeT[0] * newCore.sizeZ[0]; 
     360        newCore.imageCount[1] = newCore.sizeC[1] * newCore.sizeT[1]; 
     361        core = newCore;  
     362      } 
    293363    } 
    294364  } 
     
    303373      // Now that the base TIFF standard metadata has been parsed, we need to 
    304374      // parse out the STK metadata from the UIC4TAG. 
    305       TiffIFDEntry uic1tagEntry= TiffTools.getFirstIFDEntry(in, UIC1TAG); 
    306       TiffIFDEntry uic2tagEntry=TiffTools.getFirstIFDEntry(in, UIC2TAG); 
     375      TiffIFDEntry uic1tagEntry = TiffTools.getFirstIFDEntry(in, UIC1TAG); 
     376      TiffIFDEntry uic2tagEntry = TiffTools.getFirstIFDEntry(in, UIC2TAG); 
    307377      TiffIFDEntry uic4tagEntry = TiffTools.getFirstIFDEntry(in, UIC4TAG); 
    308378      int planes = uic4tagEntry.getValueCount(); 
     
    398468      ifds = tempIFDs; 
    399469    } 
     470    catch (UnknownTagException exc) { trace(exc); }  
    400471    catch (NullPointerException exc) { trace(exc); } 
    401472    catch (IOException exc) { trace(exc); } 
     
    460531    } 
    461532    try { 
    462       core.sizeZ[0] = TiffTools.getIFDLongArray(ifds[0], UIC2TAG, true).length; 
    463       core.sizeT[0] = getImageCount() / core.sizeZ[0]; 
     533      if (core.sizeZ[0] == 0) { 
     534        core.sizeZ[0] =  
     535          TiffTools.getIFDLongArray(ifds[0], UIC2TAG, true).length; 
     536      } 
     537      if (core.sizeT[0] == 0) core.sizeT[0] = getImageCount() / core.sizeZ[0]; 
    464538    } 
    465539    catch (FormatException exc) { 
Note: See TracChangeset for help on using the changeset viewer.