Changeset 6970 for branches/4.1


Ignore:
Timestamp:
09/21/10 17:37:47 (10 years ago)
Author:
melissa
Message:

Support for multi-file Improvision/Volocity TIFF datasets.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/4.1/components/bio-formats/src/loci/formats/in/ImprovisionTiffReader.java

    r5517 r6970  
    2525 
    2626import java.io.IOException; 
     27import java.util.ArrayList; 
     28import java.util.Arrays; 
    2729import java.util.StringTokenizer; 
    2830 
     31import loci.common.Location; 
    2932import loci.common.RandomAccessInputStream; 
    3033import loci.formats.FormatException; 
     
    5558  private float pixelSizeX, pixelSizeY, pixelSizeZ; 
    5659 
     60  private String[] files; 
     61  private MinimalTiffReader[] readers; 
     62 
    5763  // -- Constructor -- 
    5864 
     
    8086      pixelSizeT = 1; 
    8187      pixelSizeX = pixelSizeY = pixelSizeZ = 0; 
    82     } 
     88      if (readers != null) { 
     89        for (MinimalTiffReader reader : readers) { 
     90          if (reader != null) reader.close(); 
     91        } 
     92      } 
     93      readers = null; 
     94      files = null; 
     95    } 
     96  } 
     97 
     98  /* @see loci.formats.IFormatReader#getSeriesUsedFiles(boolean) */ 
     99  public String[] getSeriesUsedFiles(boolean noPixels) { 
     100    FormatTools.assertId(currentId, true, 1); 
     101    return noPixels ? null : files; 
     102  } 
     103 
     104  /* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) */ 
     105  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
     106    throws FormatException, IOException 
     107  { 
     108    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
     109 
     110    int file = no % files.length; 
     111    int plane = no / files.length; 
     112 
     113    return readers[file].openBytes(plane, buf, x, y, w, h); 
    83114  } 
    84115 
     
    134165      core[0].sizeC *= getImageCount(); 
    135166    } 
     167    else core[0].imageCount = getSizeZ() * getSizeT() * Integer.parseInt(tc); 
    136168 
    137169    // parse each of the comments to determine axis ordering 
     
    141173 
    142174    cNames = new String[getSizeC()]; 
     175 
     176    boolean multipleFiles = false; 
    143177 
    144178    for (int i=0; i<ifds.size(); i++) { 
     
    172206          if (cNames[ndx] == null) cNames[ndx] = channelName; 
    173207        } 
    174       } 
    175     } 
     208        else if (key.equals("MultiFileTIFF")) { 
     209          multipleFiles = value.equalsIgnoreCase("yes"); 
     210        } 
     211      } 
     212    } 
     213 
     214    if (multipleFiles) { 
     215      // look for other TIFF files that belong to this dataset 
     216 
     217      String currentUUID = getUUID(currentId); 
     218 
     219      Location parent = new Location(currentId).getAbsoluteFile().getParentFile(); 
     220      String[] list = parent.list(true); 
     221      Arrays.sort(list); 
     222      ArrayList<String> matchingFiles = new ArrayList<String>(); 
     223      for (String f : list) { 
     224        String path = new Location(parent, f).getAbsolutePath(); 
     225        if (isThisType(path) && getUUID(path).equals(currentUUID)) { 
     226          matchingFiles.add(path); 
     227        } 
     228      } 
     229 
     230      files = matchingFiles.toArray(new String[matchingFiles.size()]); 
     231    } 
     232    else { 
     233      files = new String[] {currentId}; 
     234    } 
     235    readers = new MinimalTiffReader[files.length]; 
     236    for (int i=0; i<readers.length; i++) { 
     237      readers[i] = new MinimalTiffReader(); 
     238      readers[i].setId(files[i]); 
     239    } 
     240 
    176241    // determine average time per plane 
    177242 
     
    221286  } 
    222287 
     288  // -- Helper methods -- 
     289 
     290  private String getUUID(String path) throws FormatException, IOException { 
     291    RandomAccessInputStream s = new RandomAccessInputStream(path); 
     292    TiffParser parser = new TiffParser(s); 
     293    String comment = parser.getComment(); 
     294 
     295    comment = comment.replaceAll("\r\n", "\n"); 
     296    comment = comment.replaceAll("\r", "\n"); 
     297    String[] lines = comment.split("\n"); 
     298    for (String line : lines) { 
     299      line = line.trim(); 
     300      if (line.startsWith("SampleUUID=")) { 
     301        return line.substring(line.indexOf("=") + 1).trim(); 
     302      } 
     303    } 
     304    return ""; 
     305  } 
     306 
    223307} 
Note: See TracChangeset for help on using the changeset viewer.