Changeset 4736


Ignore:
Timestamp:
01/07/09 14:18:25 (11 years ago)
Author:
melissa
Message:

FluoviewReader now expresses multifield data as multiple series; see #332.

File:
1 edited

Legend:

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

    r4675 r4736  
    6363  private BufferedImage zeroImage = null; 
    6464 
     65  private String dimensionOrder; 
     66 
    6567  // hardware settings 
    6668  private String[] gains, voltages, offsets, channelNames, lensNA; 
     
    111113    throws FormatException, IOException 
    112114  { 
     115    // the 'series' axis can be in any position relative to Z, C and T 
     116    // we need to convert the plane number within the series into an IFD number 
     117    int[] lengths = new int[4]; 
     118    int[] pos = getZCTCoords(no); 
     119    int[] realPos = new int[4]; 
     120    for (int i=2; i<dimensionOrder.length(); i++) { 
     121      char axis = dimensionOrder.charAt(i); 
     122      if (axis == 'Z') { 
     123        lengths[i - 2] = getSizeZ(); 
     124        realPos[i - 2] = pos[0]; 
     125      } 
     126      else if (axis == 'C') { 
     127        lengths[i - 2] = getEffectiveSizeC(); 
     128        realPos[i - 2] = pos[1]; 
     129      } 
     130      else if (axis == 'T') { 
     131        lengths[i - 2] = getSizeT(); 
     132        realPos[i - 2] = pos[2]; 
     133      } 
     134      else if (axis == 'S') { 
     135        lengths[i - 2] = getSeriesCount(); 
     136        realPos[i - 2] = getSeries(); 
     137      } 
     138    } 
     139 
     140    int image = FormatTools.positionToRaster(lengths, realPos); 
     141 
    113142    if (getSizeY() == TiffTools.getImageLength(ifds[0])) { 
    114       return super.openBytes(no, buf, x, y, w, h); 
    115     } 
    116     FormatTools.assertId(currentId, true, 1); 
    117     FormatTools.checkPlaneNumber(this, no); 
    118     FormatTools.checkBufferSize(this, buf.length, w, h); 
    119  
    120     super.openBytes(0, buf, x, no, w, h); 
     143      TiffTools.getSamples(ifds[image], in, buf, x, y, w, h); 
     144    } 
     145    else { 
     146      FormatTools.assertId(currentId, true, 1); 
     147      FormatTools.checkPlaneNumber(this, no); 
     148      FormatTools.checkBufferSize(this, buf.length, w, h); 
     149 
     150      TiffTools.getSamples(ifds[0], in, buf, x, image, w, 1); 
     151    } 
     152 
    121153    return buf; 
    122154  } 
     
    129161    voxelX = voxelY = voxelZ = voxelC = voxelT = 1f; 
    130162    zeroImage = null; 
     163    dimensionOrder = null; 
    131164  } 
    132165 
     
    228261    // calculate the dimension order and axis sizes 
    229262 
     263    dimensionOrder = "XY"; 
     264    int seriesCount = 1; 
    230265    core[0].sizeZ = core[0].sizeC = core[0].sizeT = 1; 
    231     core[0].dimensionOrder = "XY"; 
    232     core[0].metadataComplete = true; 
    233266 
    234267    for (int i=0; i<10; i++) { 
     
    241274 
    242275      if (name.equals("x")) { 
    243         if (getSizeX() == 0) core[0].sizeX = size; 
    244276        voxelX = voxel; 
    245277      } 
    246278      else if (name.equals("y")) { 
    247         if (getSizeY() == 0) core[0].sizeY = size; 
    248279        voxelY = voxel; 
    249280      } 
    250281      else if (name.equals("z") || name.equals("event")) { 
    251282        core[0].sizeZ *= size; 
    252         if (getDimensionOrder().indexOf("Z") == -1) { 
    253           core[0].dimensionOrder += "Z"; 
     283        if (dimensionOrder.indexOf("Z") == -1) { 
     284          dimensionOrder += "Z"; 
    254285        } 
    255286        voxelZ = voxel; 
     
    257288      else if (name.equals("ch") || name.equals("wavelength")) { 
    258289        core[0].sizeC *= size; 
    259         if (getDimensionOrder().indexOf("C") == -1) { 
    260           core[0].dimensionOrder += "C"; 
     290        if (dimensionOrder.indexOf("C") == -1) { 
     291          dimensionOrder += "C"; 
    261292        } 
    262293        voxelC = voxel; 
    263294      } 
    264       else { 
     295      else if (name.equals("time") || name.equals("t") || name.equals("animation")) { 
    265296        core[0].sizeT *= size; 
    266         if (getDimensionOrder().indexOf("T") == -1) { 
    267           core[0].dimensionOrder += "T"; 
     297        if (dimensionOrder.indexOf("T") == -1) { 
     298          dimensionOrder += "T"; 
    268299        } 
    269300        voxelT = voxel; 
    270301      } 
    271     } 
    272  
    273     if (getDimensionOrder().indexOf("Z") == -1) core[0].dimensionOrder += "Z"; 
    274     if (getDimensionOrder().indexOf("T") == -1) core[0].dimensionOrder += "T"; 
    275     if (getDimensionOrder().indexOf("C") == -1) core[0].dimensionOrder += "C"; 
    276  
    277     core[0].imageCount = ifds.length; 
    278     if (getSizeZ() > ifds.length) core[0].sizeZ = ifds.length; 
    279     if (getSizeT() > ifds.length) core[0].sizeT = ifds.length; 
     302      else { 
     303        if (dimensionOrder.indexOf("S") == -1) dimensionOrder += "S"; 
     304        seriesCount *= size; 
     305      } 
     306    } 
     307 
     308    if (dimensionOrder.indexOf("Z") == -1) dimensionOrder += "Z"; 
     309    if (dimensionOrder.indexOf("T") == -1) dimensionOrder += "T"; 
     310    if (dimensionOrder.indexOf("C") == -1) dimensionOrder += "C"; 
     311    if (dimensionOrder.indexOf("S") == -1) dimensionOrder += "S"; 
     312 
     313    core[0].imageCount = ifds.length / seriesCount; 
     314    if (getSizeZ() > getImageCount()) core[0].sizeZ = getImageCount(); 
     315    if (getSizeT() > getImageCount()) core[0].sizeT = getImageCount(); 
    280316 
    281317    if (getImageCount() == 1 && (getSizeT() == getSizeY() || 
     
    285321      core[0].sizeY = 1; 
    286322      core[0].imageCount = getSizeZ() * getSizeC() * getSizeT(); 
     323    } 
     324    core[0].dimensionOrder = dimensionOrder.replaceAll("S", ""); 
     325 
     326    if (seriesCount > 1) { 
     327      CoreMetadata oldCore = core[0]; 
     328      core = new CoreMetadata[seriesCount]; 
     329      for (int i=0; i<seriesCount; i++) { 
     330        core[i] = oldCore; 
     331      } 
    287332    } 
    288333 
Note: See TracChangeset for help on using the changeset viewer.