Changeset 1367


Ignore:
Timestamp:
08/28/06 11:05:40 (14 years ago)
Author:
melissa
Message:

tweaked Leica LIF dimension detection

File:
1 edited

Legend:

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

    r1334 r1367  
    7171  private int bpp; 
    7272 
     73  private int maxZ, maxT, maxEx; 
     74   
    7375 
    7476  // -- Constructor -- 
     
    131133  public int getSizeZ(String id) throws FormatException, IOException { 
    132134    if (!id.equals(currentId)) initFile(id); 
    133     int zSum = 0; 
    134     int tSum = 0; 
    135     for (int i=0; i<dims.length; i++) { 
    136       zSum += dims[i][2]; 
    137       tSum += dims[i][3]; 
    138     } 
    139  
    140     if (zSum > tSum) return getImageCount(id) / (separated ? getSizeC(id) : 1); 
    141     else return 1; 
     135    if (maxZ == dims.length) maxT *= maxEx; 
     136    else if (maxT == dims.length) maxZ *= maxEx; 
     137    else { 
     138      maxZ *= maxT; 
     139      maxT = dims.length; 
     140    } 
     141    return maxZ == 1 ? dims.length : maxZ; 
    142142  } 
    143143 
     
    151151  public int getSizeT(String id) throws FormatException, IOException { 
    152152    if (!id.equals(currentId)) initFile(id); 
    153     int z = getSizeZ(id); 
    154     if (z == 1) return getImageCount(id) / (separated ? getSizeC(id) : 1); 
    155     else return 1; 
     153    if (maxZ == dims.length) maxT *= maxEx; 
     154    else if (maxT == dims.length) maxZ *= maxEx; 
     155    else { 
     156      maxZ *= maxT; 
     157      maxT = dims.length; 
     158    } 
     159    return maxT == 1 ? dims.length : maxT; 
    156160  } 
    157161 
     
    185189    } 
    186190 
    187     int tempC = dims[0][4]; 
    188     if (!separated) tempC = 1; 
    189  
    190     int ndx = 0; 
    191     int sum = 0; 
    192     for (int i=0; i<dims.length; i++) { 
    193       sum += (dims[i][2] * dims[i][3] * dims[i][6]); 
    194       if ((no / tempC) < sum) { 
    195         ndx = i; 
    196         i = dims.length; 
    197       } 
    198     } 
    199  
    200     width = dims[ndx][0]; 
    201     height = dims[ndx][1]; 
    202     c = dims[ndx][4]; 
     191    // determine which dataset the plane is part of 
     192 
     193    int z = getSizeZ(id); 
     194    int t = getSizeT(id); 
     195 
     196    int dataset = ((t == dims.length) ? no / z : no / t); 
     197 
     198    width = dims[dataset][0]; 
     199    height = dims[dataset][1]; 
     200    c = dims[dataset][4]; 
    203201    if (c == 2) c--; 
    204     bpp = dims[ndx][5]; 
    205     while (bpp % 8 !=0) bpp++; 
     202    bpp = dims[dataset][5]; 
     203    while (bpp % 8 != 0) bpp++; 
    206204    int bytesPerPixel = bpp / 8; 
    207205 
    208     int offset = ((Long) offsets.get(ndx)).intValue(); 
     206    int offset = ((Long) offsets.get(dataset)).intValue(); 
    209207 
    210208    // get the image number within this dataset 
    211209 
    212     int imageNum = no; 
    213     for (int i=0; i<ndx; i++) { 
    214       imageNum -= (dims[i][2] * dims[i][3] * dims[i][6]); 
    215     } 
     210    int imageNum = ((t == dims.length) ? no % z : no % t); 
    216211 
    217212    in.seek(offset + width * height * bytesPerPixel * imageNum * c); 
    218213 
    219214    byte[] data = new byte[(int) (width * height * bytesPerPixel * c)]; 
    220     in.read(data); 
     215    if (imageNum < dims[dataset][2] * dims[dataset][3] * (separated ? c : 1)) { 
     216      in.read(data); 
     217    } 
    221218 
    222219    if (isRGB(id) && separated) { 
     
    444441    } 
    445442 
     443    for (int i=0; i<numDatasets; i++) { 
     444      if (dims[i][2] > maxZ) maxZ = dims[i][2]; 
     445      if (dims[i][3] > maxT) maxT = dims[i][3]; 
     446      if (dims[i][6] > maxEx) maxEx = dims[i][6]; 
     447    }       
     448     
     449    if (maxEx > 1) { 
     450      if (maxT == 1) maxT = maxEx; 
     451      else if (maxZ == 1) maxZ = maxEx; 
     452      maxEx = 1; 
     453    } 
     454 
     455    numImages = maxZ * maxT * numDatasets; 
     456 
    446457    // Populate metadata store 
    447458 
     
    450461      MetadataStore store = getMetadataStore(currentId); 
    451462 
    452       for (int i=0; i<dims.length; i++) { 
    453         String type = "int8"; 
    454         switch (dims[i][5]) { 
     463      String type = "int8"; 
     464      switch (dims[0][5]) { 
    455465        case 12: type = "int16"; break; 
    456466        case 16: type = "int16"; break; 
    457467        case 32: type = "float"; break; 
    458         } 
    459  
    460         store.setPixels( 
    461           new Integer(dims[i][0]), // SizeX 
    462           new Integer(dims[i][1]), // SizeY 
    463           new Integer(dims[i][2]), // SizeZ 
    464           new Integer(dims[i][4]), // SizeC 
    465           new Integer(dims[i][3]), // SizeT 
    466           type, // PixelType 
    467           new Boolean(!littleEndian), // BigEndian 
    468           "XYZTC", // DimensionOrder 
    469           new Integer(i)); // Index 
    470       } 
     468      } 
     469 
     470      store.setPixels( 
     471        new Integer(getSizeX(currentId)), // SizeX 
     472        new Integer(getSizeY(currentId)), // SizeY 
     473        new Integer(getSizeZ(currentId)), // SizeZ 
     474        new Integer(getSizeC(currentId)), // SizeC 
     475        new Integer(getSizeT(currentId)), // SizeT 
     476        type, // PixelType 
     477        new Boolean(!littleEndian), // BigEndian 
     478        getDimensionOrder(currentId), // DimensionOrder 
     479        null); // Index 
    471480    } 
    472481    catch (Exception e) { } 
Note: See TracChangeset for help on using the changeset viewer.