Changeset 1233


Ignore:
Timestamp:
08/10/06 13:04:37 (14 years ago)
Author:
curtis
Message:

Add getIndex and getZCTCoords methods for converting between rasterized
image plane indices and ZCT coordinates. Add some code to testRead to
exercise these methods somewhat.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/FormatReader.java

    r1224 r1233  
    178178  /** Gets whether channels are being separated. */ 
    179179  public boolean isSeparated() { return separated; } 
     180 
     181  /** 
     182   * Gets the rasterized index corresponding 
     183   * to the given Z, C and T coordinates. 
     184   */ 
     185  public int getIndex(String id, int z, int c, int t) 
     186    throws FormatException, IOException 
     187  { 
     188    // get DimensionOrder 
     189    String order = getDimensionOrder(id); 
     190    if (order == null) throw new FormatException("Dimension order is null"); 
     191    if (!order.startsWith("XY")) { 
     192      throw new FormatException("Invalid dimension order: " + order); 
     193    } 
     194    int iz = order.indexOf("Z") - 2; 
     195    int ic = order.indexOf("C") - 2; 
     196    int it = order.indexOf("T") - 2; 
     197    if (iz < 0 || iz > 2 || ic < 0 || ic > 2 || it < 0 || it > 2) { 
     198      throw new FormatException("Invalid dimension order: " + order); 
     199    } 
     200 
     201    // get SizeZ 
     202    int sizeZ = getSizeZ(id); 
     203    if (sizeZ <= 0) throw new FormatException("Invalid Z size: " + sizeZ); 
     204    if (z < 0 || z >= sizeZ) { 
     205      throw new FormatException("Invalid Z index: " + z + "/" + sizeZ); 
     206    } 
     207 
     208    // get SizeC 
     209    int sizeC = getSizeC(id); 
     210    if (sizeC <= 0) throw new FormatException("Invalid C size: " + sizeC); 
     211    if (c < 0 || c >= sizeC) { 
     212      throw new FormatException("Invalid C index: " + c + "/" + sizeC); 
     213    } 
     214    int origSizeC = sizeC; 
     215    boolean rgb = isRGB(id); 
     216    if (rgb && !separated) { 
     217      // adjust for RGB merging 
     218      c /= 3; 
     219      sizeC /= 3; 
     220    } 
     221 
     222    // get SizeT 
     223    int sizeT = getSizeT(id); 
     224    if (sizeT <= 0) throw new FormatException("Invalid T size: " + sizeT); 
     225    if (t < 0 || t >= sizeT) { 
     226      throw new FormatException("Invalid T index: " + t + "/" + sizeT); 
     227    } 
     228 
     229    // get image count 
     230    int num = getImageCount(id); 
     231    if (num <= 0) throw new FormatException("Invalid image count: " + num); 
     232    if (num != sizeZ * sizeC * sizeT) { 
     233      // if this happens, there is probably a bug in metadata population -- 
     234      // either one of the ZCT sizes, or the total number of images -- 
     235      // or else the input file is invalid 
     236      throw new FormatException("ZCT size vs image count mismatch (rgb=" + 
     237        rgb + "; separated=" + separated + "; sizeZ=" + sizeZ + ", sizeC=" + 
     238        origSizeC + ", sizeT=" + sizeT + ", total=" + num); 
     239    } 
     240    /* 
     241    sizeZ = 5 
     242    sizeC = 6 
     243    sizeT = 7 
     244    z = 2 
     245    c = 1 
     246    t = 4 
     247    num = 210 
     248    */ 
     249 
     250    // assign rasterization order 
     251    int v0 = iz == 0 ? z : (ic == 0 ? c : t); 
     252    int v1 = iz == 1 ? z : (ic == 1 ? c : t); 
     253    int v2 = iz == 2 ? z : (ic == 2 ? c : t); 
     254    int len0 = iz == 0 ? sizeZ : (ic == 0 ? sizeC : sizeT); 
     255    int len1 = iz == 1 ? sizeZ : (ic == 1 ? sizeC : sizeT); 
     256    int len2 = iz == 2 ? sizeZ : (ic == 2 ? sizeC : sizeT); 
     257 
     258    return v0 + v1 * len0 + v2 * len0 * len1; 
     259  } 
     260 
     261  /** 
     262   * Gets the Z, C and T coordinates corresponding 
     263   * to the given rasterized index value. 
     264   */ 
     265  public int[] getZCTCoords(String id, int index) 
     266    throws FormatException, IOException 
     267  { 
     268    // get DimensionOrder 
     269    String order = getDimensionOrder(id); 
     270    if (order == null) throw new FormatException("Dimension order is null"); 
     271    if (!order.startsWith("XY")) { 
     272      throw new FormatException("Invalid dimension order: " + order); 
     273    } 
     274    int iz = order.indexOf("Z") - 2; 
     275    int ic = order.indexOf("C") - 2; 
     276    int it = order.indexOf("T") - 2; 
     277    if (iz < 0 || iz > 2 || ic < 0 || ic > 2 || it < 0 || it > 2) { 
     278      throw new FormatException("Invalid dimension order: " + order); 
     279    } 
     280 
     281    // get SizeZ 
     282    int sizeZ = getSizeZ(id); 
     283    if (sizeZ <= 0) throw new FormatException("Invalid Z size: " + sizeZ); 
     284 
     285    // get SizeC 
     286    int sizeC = getSizeC(id); 
     287    if (sizeC <= 0) throw new FormatException("Invalid C size: " + sizeC); 
     288    int origSizeC = sizeC; 
     289    boolean rgb = isRGB(id); 
     290    if (rgb && !separated) sizeC /= 3; // adjust for RGB merging 
     291 
     292    // get SizeT 
     293    int sizeT = getSizeT(id); 
     294    if (sizeT <= 0) throw new FormatException("Invalid T size: " + sizeT); 
     295 
     296    // get image count 
     297    int num = getImageCount(id); 
     298    if (num <= 0) throw new FormatException("Invalid image count: " + num); 
     299    if (num != sizeZ * sizeC * sizeT) { 
     300      // if this happens, there is probably a bug in metadata population -- 
     301      // either one of the ZCT sizes, or the total number of images -- 
     302      // or else the input file is invalid 
     303      throw new FormatException("ZCT size vs image count mismatch (rgb=" + 
     304        rgb + "; separated=" + separated + "; sizeZ=" + sizeZ + ", sizeC=" + 
     305        origSizeC + ", sizeT=" + sizeT + ", total=" + num); 
     306    } 
     307    if (index < 0 || index >= num) { 
     308      throw new FormatException("Invalid image index: " + index + "/" + num); 
     309    } 
     310 
     311    // assign rasterization order 
     312    int len0 = iz == 0 ? sizeZ : (ic == 0 ? sizeC : sizeT); 
     313    int len1 = iz == 1 ? sizeZ : (ic == 1 ? sizeC : sizeT); 
     314    //int len2 = iz == 2 ? sizeZ : (ic == 2 ? sizeC : sizeT); 
     315    int v0 = index % len0; 
     316    int v1 = index / len0 % len1; 
     317    int v2 = index / len0 / len1; 
     318    int z = iz == 0 ? v0 : (iz == 1 ? v1 : v2); 
     319    int c = ic == 0 ? v0 : (ic == 1 ? v1 : v2); 
     320    int t = it == 0 ? v0 : (it == 1 ? v1 : v2); 
     321 
     322    return new int[] {z, c, t}; 
     323  } 
    180324 
    181325  /** 
     
    361505    System.out.println("Dimension order = " + dimOrder); 
    362506    System.out.println("-----"); 
     507    int[] indices; 
     508    if (imageCount > 6) { 
     509      int q = imageCount / 2; 
     510      indices = new int[] {0, q - 2, q - 1, q, q + 1, q + 2, imageCount - 1}; 
     511    } 
     512    else if (imageCount > 2) { 
     513      indices = new int[] {0, imageCount / 2, imageCount - 1}; 
     514    } 
     515    else if (imageCount > 1) indices = new int[] {0, 1}; 
     516    else indices = new int[] {0}; 
     517    int[][] zct = new int[indices.length][]; 
     518    int[] indices2 = new int[indices.length]; 
     519    for (int i=0; i<indices.length; i++) { 
     520      zct[i] = getZCTCoords(id, indices[i]); 
     521      indices2[i] = getIndex(id, zct[i][0], zct[i][1], zct[i][2]); 
     522      System.out.print("Plane #" + indices[i] + " <=> Z " + zct[i][0] + 
     523        ", C " + zct[i][1] + ", T " + zct[i][2]); 
     524      if (indices[i] != indices2[i]) { 
     525        System.out.println(" [mismatch: " + indices2[i] + "]"); 
     526      } 
     527      else System.out.println(); 
     528    } 
     529    System.out.println("-----"); 
    363530 
    364531    // output metadata table 
Note: See TracChangeset for help on using the changeset viewer.