Changeset 6970


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

Support for multi-file Improvision/Volocity TIFF datasets.

Files:
3 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} 
  • branches/4.2/components/bio-formats/src/loci/formats/in/ImprovisionTiffReader.java

    r6663 r6970  
    2525 
    2626import java.io.IOException; 
     27import java.util.ArrayList; 
    2728import java.util.Arrays; 
    2829 
     30import loci.common.Location; 
    2931import loci.common.RandomAccessInputStream; 
    3032import loci.formats.FormatException; 
     
    5456  private double pixelSizeX, pixelSizeY, pixelSizeZ; 
    5557 
     58  private String[] files; 
     59  private MinimalTiffReader[] readers; 
     60 
    5661  // -- Constructor -- 
    5762 
     
    7984      pixelSizeT = 1; 
    8085      pixelSizeX = pixelSizeY = pixelSizeZ = 0; 
    81     } 
     86      if (readers != null) { 
     87        for (MinimalTiffReader reader : readers) { 
     88          if (reader != null) reader.close(); 
     89        } 
     90      } 
     91      readers = null; 
     92      files = null; 
     93    } 
     94  } 
     95 
     96  /* @see loci.formats.IFormatReader#getSeriesUsedFiles(boolean) */ 
     97  public String[] getSeriesUsedFiles(boolean noPixels) { 
     98    FormatTools.assertId(currentId, true, 1); 
     99    return noPixels ? null : files; 
     100  } 
     101 
     102  /* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) */ 
     103  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
     104    throws FormatException, IOException 
     105  { 
     106    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
     107 
     108    int file = no % files.length; 
     109    int plane = no / files.length; 
     110 
     111    return readers[file].openBytes(plane, buf, x, y, w, h); 
    82112  } 
    83113 
     
    128158      core[0].sizeC *= getImageCount(); 
    129159    } 
     160    else core[0].imageCount = getSizeZ() * getSizeT() * Integer.parseInt(tc); 
    130161 
    131162    // parse each of the comments to determine axis ordering 
     
    135166 
    136167    cNames = new String[getSizeC()]; 
     168 
     169    boolean multipleFiles = false; 
    137170 
    138171    for (int i=0; i<ifds.size(); i++) { 
     
    166199          if (cNames[ndx] == null) cNames[ndx] = channelName; 
    167200        } 
     201        else if (key.equals("MultiFileTIFF")) { 
     202          multipleFiles = value.equalsIgnoreCase("yes"); 
     203        } 
    168204 
    169205        if (getMetadataOptions().getMetadataLevel() == MetadataLevel.MINIMUM && 
     
    173209        } 
    174210      } 
     211    } 
     212 
     213    if (multipleFiles) { 
     214      // look for other TIFF files that belong to this dataset 
     215 
     216      String currentUUID = getUUID(currentId); 
     217 
     218      Location parent = new Location(currentId).getAbsoluteFile().getParentFile(); 
     219      String[] list = parent.list(true); 
     220      Arrays.sort(list); 
     221      ArrayList<String> matchingFiles = new ArrayList<String>(); 
     222      for (String f : list) { 
     223        String path = new Location(parent, f).getAbsolutePath(); 
     224        if (isThisType(path) && getUUID(path).equals(currentUUID)) { 
     225          matchingFiles.add(path); 
     226        } 
     227      } 
     228 
     229      files = matchingFiles.toArray(new String[matchingFiles.size()]); 
     230    } 
     231    else { 
     232      files = new String[] {currentId}; 
     233    } 
     234    readers = new MinimalTiffReader[files.length]; 
     235    for (int i=0; i<readers.length; i++) { 
     236      readers[i] = new MinimalTiffReader(); 
     237      readers[i].setId(files[i]); 
    175238    } 
    176239 
     
    231294  } 
    232295 
     296  // -- Helper methods -- 
     297 
     298  private String getUUID(String path) throws FormatException, IOException { 
     299    RandomAccessInputStream s = new RandomAccessInputStream(path); 
     300    TiffParser parser = new TiffParser(s); 
     301    String comment = parser.getComment(); 
     302 
     303    comment = comment.replaceAll("\r\n", "\n"); 
     304    comment = comment.replaceAll("\r", "\n"); 
     305    String[] lines = comment.split("\n"); 
     306    for (String line : lines) { 
     307      line = line.trim(); 
     308      if (line.startsWith("SampleUUID=")) { 
     309        return line.substring(line.indexOf("=") + 1).trim(); 
     310      } 
     311    } 
     312    return ""; 
     313  } 
     314 
    233315} 
  • trunk/components/bio-formats/src/loci/formats/in/ImprovisionTiffReader.java

    r6881 r6970  
    2525 
    2626import java.io.IOException; 
     27import java.util.ArrayList; 
    2728import java.util.Arrays; 
    2829 
     30import loci.common.Location; 
    2931import loci.common.RandomAccessInputStream; 
    3032import loci.formats.FormatException; 
     
    5456  private double pixelSizeX, pixelSizeY, pixelSizeZ; 
    5557 
     58  private String[] files; 
     59  private MinimalTiffReader[] readers; 
     60 
    5661  // -- Constructor -- 
    5762 
     
    7984      pixelSizeT = 1; 
    8085      pixelSizeX = pixelSizeY = pixelSizeZ = 0; 
    81     } 
     86      if (readers != null) { 
     87        for (MinimalTiffReader reader : readers) { 
     88          if (reader != null) reader.close(); 
     89        } 
     90      } 
     91      readers = null; 
     92      files = null; 
     93    } 
     94  } 
     95 
     96  /* @see loci.formats.IFormatReader#getSeriesUsedFiles(boolean) */ 
     97  public String[] getSeriesUsedFiles(boolean noPixels) { 
     98    FormatTools.assertId(currentId, true, 1); 
     99    return noPixels ? null : files; 
     100  } 
     101 
     102  /* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int) */ 
     103  public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h) 
     104    throws FormatException, IOException 
     105  { 
     106    FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h); 
     107 
     108    int file = no % files.length; 
     109    int plane = no / files.length; 
     110 
     111    return readers[file].openBytes(plane, buf, x, y, w, h); 
    82112  } 
    83113 
     
    128158      core[0].sizeC *= getImageCount(); 
    129159    } 
     160    else core[0].imageCount = getSizeZ() * getSizeT() * Integer.parseInt(tc); 
    130161 
    131162    // parse each of the comments to determine axis ordering 
     
    135166 
    136167    cNames = new String[getSizeC()]; 
     168 
     169    boolean multipleFiles = false; 
    137170 
    138171    for (int i=0; i<ifds.size(); i++) { 
     
    166199          if (cNames[ndx] == null) cNames[ndx] = channelName; 
    167200        } 
     201        else if (key.equals("MultiFileTIFF")) { 
     202          multipleFiles = value.equalsIgnoreCase("yes"); 
     203        } 
    168204 
    169205        if (getMetadataOptions().getMetadataLevel() == MetadataLevel.MINIMUM && 
     
    173209        } 
    174210      } 
     211    } 
     212 
     213    if (multipleFiles) { 
     214      // look for other TIFF files that belong to this dataset 
     215 
     216      String currentUUID = getUUID(currentId); 
     217 
     218      Location parent = new Location(currentId).getAbsoluteFile().getParentFile(); 
     219      String[] list = parent.list(true); 
     220      Arrays.sort(list); 
     221      ArrayList<String> matchingFiles = new ArrayList<String>(); 
     222      for (String f : list) { 
     223        String path = new Location(parent, f).getAbsolutePath(); 
     224        if (isThisType(path) && getUUID(path).equals(currentUUID)) { 
     225          matchingFiles.add(path); 
     226        } 
     227      } 
     228 
     229      files = matchingFiles.toArray(new String[matchingFiles.size()]); 
     230    } 
     231    else { 
     232      files = new String[] {currentId}; 
     233    } 
     234    readers = new MinimalTiffReader[files.length]; 
     235    for (int i=0; i<readers.length; i++) { 
     236      readers[i] = new MinimalTiffReader(); 
     237      readers[i].setId(files[i]); 
    175238    } 
    176239 
     
    231294  } 
    232295 
     296  // -- Helper methods -- 
     297 
     298  private String getUUID(String path) throws FormatException, IOException { 
     299    RandomAccessInputStream s = new RandomAccessInputStream(path); 
     300    TiffParser parser = new TiffParser(s); 
     301    String comment = parser.getComment(); 
     302 
     303    comment = comment.replaceAll("\r\n", "\n"); 
     304    comment = comment.replaceAll("\r", "\n"); 
     305    String[] lines = comment.split("\n"); 
     306    for (String line : lines) { 
     307      line = line.trim(); 
     308      if (line.startsWith("SampleUUID=")) { 
     309        return line.substring(line.indexOf("=") + 1).trim(); 
     310      } 
     311    } 
     312    return ""; 
     313  } 
     314 
    233315} 
Note: See TracChangeset for help on using the changeset viewer.