Changeset 7375


Ignore:
Timestamp:
12/09/10 13:15:35 (9 years ago)
Author:
melissa
Message:

Added more sophisticated image name parsing to OpenlabReader. Closes #615, closes #616.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/OpenlabReader.java

    r7055 r7375  
    108108 
    109109  private String gain, detectorOffset, xPos, yPos, zPos; 
     110  private boolean specialPlateNames = false; 
    110111 
    111112  // -- Constructor -- 
     
    142143    lastPlane = no; 
    143144 
    144     if (no >= planeOffsets[series].length) return buf; 
    145     int index = planeOffsets[series][no]; 
    146  
    147     long first = planes[index].planeOffset; 
    148     long last = no == planeOffsets[series].length - 1 || 
    149       planeOffsets[series][no + 1] >= planes.length ? in.length() : 
    150       planes[planeOffsets[series][no + 1]].planeOffset; 
     145    PlaneInfo planeInfo = null; 
     146    if (specialPlateNames) { 
     147      planeInfo = getPlane(getZCTCoords(no)); 
     148    } 
     149    else if (no < planeOffsets[series].length) { 
     150      int index = planeOffsets[series][no]; 
     151      planeInfo = planes[index]; 
     152    } 
     153    if (planeInfo == null) return buf; 
     154 
     155    long first = planeInfo.planeOffset; 
     156    long last = first + FormatTools.getPlaneSize(this) * 2; 
    151157    in.seek(first); 
    152158 
    153159    int bpp = FormatTools.getBytesPerPixel(getPixelType()); 
    154160 
    155     if (!planes[index].pict) { 
     161    if (!planeInfo.pict) { 
    156162      if (version == 2) { 
    157163        readPlane(in, x, y, w, h, buf); 
     
    188194        b = null; 
    189195      } 
    190       if (planes[index].volumeType == MAC_256_GREYS || 
    191         planes[index].volumeType == MAC_256_COLORS) 
     196      if (planeInfo.volumeType == MAC_256_GREYS || 
     197        planeInfo.volumeType == MAC_256_COLORS) 
    192198      { 
    193199        for (int i=0; i<buf.length; i++) { 
     
    229235        r.close(); 
    230236        LOGGER.debug("", exc); 
    231         in.seek(planes[index].planeOffset - 298); 
     237        in.seek(planeInfo.planeOffset - 298); 
    232238 
    233239        if (in.readByte() == 1) in.skipBytes(128); 
     
    298304      gain = detectorOffset = null; 
    299305      xPos = yPos = zPos = null; 
     306      specialPlateNames = false; 
    300307    } 
    301308  } 
     
    684691    core[s].dimensionOrder = "XY"; 
    685692    for (PlaneInfo plane : planes) { 
    686       if (plane == null) continue; 
    687       if (plane.series == s) { 
    688         String name = plane.planeName; 
     693      if (plane == null || plane.series != s) continue; 
     694 
     695      String name = plane.planeName; 
     696 
     697      // check for a specific name format: 
     698      // <channel name><optional timepoint>_<plate>_<well>_<Z section> 
     699 
     700      String[] tokens = name.split("_"); 
     701      if (tokens.length == 4) { 
     702        specialPlateNames = true; 
     703 
     704        if (!uniqueZ.contains(tokens[3])) { 
     705          uniqueZ.add(tokens[3]); 
     706        } 
     707        plane.channelName = tokens[0]; 
     708        int endIndex = 0; 
     709        while (endIndex < plane.channelName.length() && 
     710          !Character.isDigit(plane.channelName.charAt(endIndex))) 
     711        { 
     712          endIndex++; 
     713        } 
     714        String timepoint = plane.channelName.substring(endIndex); 
     715        if (timepoint.equals("")) timepoint = "1"; 
     716        plane.channelName = plane.channelName.substring(0, endIndex); 
     717 
     718        if (!uniqueC.contains(plane.channelName)) { 
     719          uniqueC.add(plane.channelName); 
     720        } 
     721        if (!uniqueT.contains(timepoint)) { 
     722          uniqueT.add(timepoint); 
     723        } 
     724 
     725        core[s].dimensionOrder = "XYCTZ"; 
     726        plane.wavelength = uniqueC.indexOf(plane.channelName); 
     727        plane.timepoint = uniqueT.indexOf(timepoint); 
     728        plane.zPosition = uniqueZ.indexOf(tokens[3]); 
     729      } 
     730      else { 
    689731        for (String axis : axes) { 
    690732          Vector<String> unique = null; 
     
    717759    } 
    718760 
     761    if (specialPlateNames) { 
     762      core[s].sizeC *= uniqueC.size(); 
     763      core[s].sizeT = uniqueT.size(); 
     764      core[s].sizeZ = uniqueZ.size(); 
     765      core[s].imageCount = core[s].sizeC * core[s].sizeZ * core[s].sizeT; 
     766      return; 
     767    } 
     768 
    719769    if (core[s].rgb && uniqueC.size() <= 1) { 
    720770      core[s].dimensionOrder = core[s].dimensionOrder.replaceAll("C", ""); 
     
    750800  } 
    751801 
     802  private PlaneInfo getPlane(int[] zct) { 
     803    for (PlaneInfo plane : planes) { 
     804      if (plane != null && plane.zPosition == zct[0] && 
     805        plane.wavelength == zct[1] && plane.timepoint == zct[2] && 
     806        plane.series == getSeries()) 
     807      { 
     808        return plane; 
     809      } 
     810    } 
     811    return null; 
     812  } 
     813 
    752814  // -- Helper classes -- 
    753815 
     
    757819    protected int zPosition; 
    758820    protected int wavelength; 
     821    protected int timepoint; 
    759822    protected String planeName; 
    760823    protected long timestamp; 
     
    765828    protected int height; 
    766829    protected int series = -1; 
     830    protected String channelName; 
    767831  } 
    768832 
Note: See TracChangeset for help on using the changeset viewer.