Changeset 3232


Ignore:
Timestamp:
10/05/07 14:43:57 (12 years ago)
Author:
curtis
Message:

Fix multi-Image and multi-Pixels TiffData tags; first cut at IFD scrambling.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/utils/MakeTestOmeTiff.java

    r3231 r3232  
    77import java.awt.geom.Rectangle2D; 
    88import java.io.IOException; 
    9 import java.util.Hashtable; 
    10 import java.util.Vector; 
    11 import java.util.Calendar; 
     9import java.util.*; 
    1210import loci.formats.*; 
    1311import loci.formats.out.TiffWriter; 
     
    3129    if (reverse) v = max - v; 
    3230    return v; 
     31  } 
     32 
     33  /** Fisher-Yates shuffle, stolen from Wikipedia. */ 
     34  public static void shuffle(int[] array) { 
     35    Random r = new Random(); 
     36    int n = array.length; 
     37    while (--n > 0) { 
     38      int k = r.nextInt(n + 1);  // 0 <= k <= n (!) 
     39      int temp = array[n]; 
     40      array[n] = array[k]; 
     41      array[k] = temp; 
     42    } 
     43  } 
     44 
     45  /** 
     46   * Constructs a TiffData element matching the given parameters. 
     47   * @param ifd Value to use for IFD attribute, or -1 for none. 
     48   * @param num Value to use for NumPlanes attribute, or -1 for none. 
     49   * @param firstZ Value to use for FirstZ attribute, or null for none. 
     50   * @param firstC Value to use for FirstC attribute, or null for none. 
     51   * @param firstT Value to use for FirstT attribute, or null for none. 
     52   * @param order Dimension order; only used when scrambling. 
     53   * @param sizeZ Number of focal planes; only used when scrambling. 
     54   * @param sizeC Number of channels; only used when scrambling. 
     55   * @param sizeT Number of time points; only used when scrambling. 
     56   * @param total Total number of IFDs in the file; 
     57   *   if null, no scrambling will be performed. 
     58   */ 
     59  private static String tiffData(int ifd, int num, 
     60    int firstZ, int firstC, int firstT, 
     61    String order, int sizeZ, int sizeC, int sizeT, Integer total) 
     62  { 
     63    StringBuffer sb = new StringBuffer(); 
     64    if (total == null) { 
     65      sb.append("<TiffData"); 
     66      if (ifd > 0) sb.append(" IFD=\"" + ifd + "\""); 
     67      if (num >= 0) sb.append(" NumPlanes=\"" + num + "\""); 
     68      if (firstZ > 0) sb.append(" FirstZ=\"" + firstZ + "\""); 
     69      if (firstC > 0) sb.append(" FirstC=\"" + firstC + "\""); 
     70      if (firstT > 0) sb.append(" FirstT=\"" + firstT + "\""); 
     71      sb.append("/>"); 
     72    } 
     73    else { 
     74      // scramble planes 
     75      if (ifd < 0) ifd = 0; 
     76      if (num < 0) num = total.intValue(); 
     77      int len = sizeZ * sizeC * sizeT; 
     78      int index = FormatTools.getIndex(order, 
     79        sizeZ, sizeC, sizeT, len, firstZ, firstC, firstT); 
     80      int[] planes = new int[num]; 
     81      for (int i=0; i<num; i++) planes[i] = index + i; 
     82      shuffle(planes); 
     83      for (int i=0; i<num; i++) { 
     84        int[] zct = FormatTools.getZCTCoords(order, 
     85          sizeZ, sizeC, sizeT, len, planes[i]); 
     86        sb.append("<TiffData IFD=\"" + (i + ifd) + "\"" + 
     87          " NumPlanes=\"1\" FirstZ=\"" + zct[0] + "\"" + 
     88          " FirstC=\"" + zct[1] + "\" FirstT=\"" + zct[2] + "\"/>"); 
     89      } 
     90    } 
     91    return sb.toString(); 
    3392  } 
    3493 
     
    148207    } 
    149208 
     209    if (!dist.equals("ipzct") && !dist.equals("pzct") && !dist.equals("zct") && 
     210      !dist.equals("zc") && !dist.equals("zt") && !dist.equals("ct") && 
     211      !dist.equals("z") && !dist.equals("c") && !dist.equals("t") && 
     212      !dist.equals("x")) 
     213    { 
     214      System.out.println("Invalid dist value: " + dist); 
     215      System.exit(2); 
     216    } 
     217    boolean allI = dist.indexOf("i") >= 0; 
     218    boolean allP = dist.indexOf("p") >= 0; 
     219    boolean allZ = dist.indexOf("z") >= 0; 
     220    boolean allC = dist.indexOf("c") >= 0; 
     221    boolean allT = dist.indexOf("t") >= 0; 
     222 
    150223    BufferedImage[][][] images = new BufferedImage[numImages][][]; 
    151224    int[][] globalOffsets = new int[numImages][]; // IFD offsets across Images 
     
    256329 
    257330    System.out.println("Writing output files"); 
    258     boolean allI = dist.indexOf("i") >= 0; 
    259     boolean allP = dist.indexOf("p") >= 0; 
    260     boolean allZ = dist.indexOf("z") >= 0; 
    261     boolean allC = dist.indexOf("c") >= 0; 
    262     boolean allT = dist.indexOf("t") >= 0; 
    263331 
    264332    // determine filename for each image plane 
     
    266334    Hashtable lastHash = new Hashtable(); 
    267335    boolean[][][] last = new boolean[numImages][][]; 
     336    Hashtable ifdTotal = new Hashtable(); 
    268337    Hashtable firstZ = new Hashtable(); 
    269338    Hashtable firstC = new Hashtable(); 
     
    298367          } 
    299368          lastHash.put(key, new ImageIndex(i, p, j)); 
     369 
     370          // update IFD count for this filename 
     371          Integer total = (Integer) ifdTotal.get(key); 
     372          if (total == null) total = new Integer(1); 
     373          else total = new Integer(total.intValue() + 1); 
     374          ifdTotal.put(key, total); 
    300375 
    301376          // update FirstZ, FirstC and FirstT values for this filename 
     
    395470          out.setId(filenames[i][p][j]); 
    396471          // write comment stub, to be overwritten later 
    397           Hashtable ifd = new Hashtable(); 
    398           TiffTools.putIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION, ""); 
    399           out.saveImage(images[i][p][j], ifd, last[i][p][j]); 
     472          Hashtable ifdHash = new Hashtable(); 
     473          TiffTools.putIFDValue(ifdHash, TiffTools.IMAGE_DESCRIPTION, ""); 
     474          out.saveImage(images[i][p][j], ifdHash, last[i][p][j]); 
    400475          if (last[i][p][j]) { 
    401             // append OME-XML block 
     476            // inject OME-XML block 
    402477            String xml = xmlTemplate; 
     478            String key = filenames[i][p][j]; 
     479            Integer fzObj = (Integer) firstZ.get(key); 
     480            Integer fcObj = (Integer) firstC.get(key); 
     481            Integer ftObj = (Integer) firstT.get(key); 
     482            int fz = fzObj == null ? 0 : fzObj.intValue(); 
     483            int fc = fcObj == null ? 0 : fcObj.intValue(); 
     484            int ft = ftObj == null ? 0 : ftObj.intValue(); 
     485            Integer total = (Integer) ifdTotal.get(key); 
     486            if (!scramble) total = null; 
    403487            for (int ii=0; ii<numImages; ii++) { 
    404488              for (int pp=0; pp<numPixels[ii]; pp++) { 
    405489                String pattern = "TIFF_DATA_IMAGE_" + ii + "_PIXELS_" + pp; 
     490                if (!allI && ii != i || !allP && pp != p) { 
     491                  // current Pixels is not part of this file 
     492                  xml = xml.replaceFirst(pattern, 
     493                    tiffData(-1, 0, -1, -1, -1, dimOrder[ii][pp], 
     494                    sizeZ[ii][pp], sizeC[ii][pp], sizeT[ii][pp], total)); 
     495                  continue; 
     496                } 
    406497                if (allP) { 
     498                  int ifd; 
     499                  if (allI) { 
     500                    // all Images in one file; need to use global offset 
     501                    ifd = globalOffsets[ii][pp]; 
     502                  } 
     503                  else { // ii == i 
     504                    // one Image per file; use local offset 
     505                    ifd = localOffsets[ii][pp]; 
     506                  } 
     507                  int num = images[ii][pp].length; 
     508                  if ((!allI || numImages == 1) && numPixels[i] == 1) { 
     509                    // only one Pixels in this file; don't need IFD/NumPlanes 
     510                    ifd = num = -1; 
     511                  } 
    407512                  xml = xml.replaceFirst(pattern, 
    408                     "<TiffData IFD=\"" + globalOffsets[ii][pp] + "\" " + 
    409                     "NumPlanes=\"" + images[ii][pp].length + "\"/>"); 
     513                    tiffData(ifd, num, -1, -1, -1, dimOrder[ii][pp], 
     514                    sizeZ[ii][pp], sizeC[ii][pp], sizeT[ii][pp], total)); 
    410515                } 
    411                 else if (p == pp) { 
    412                   if (allI) { 
    413                     xml = xml.replaceFirst(pattern, 
    414                       "<TiffData IFD=\"" + localOffsets[ii][pp] + "\" " + 
    415                       "NumPlanes=\"" + images[ii][p].length + "\"/>"); 
    416                   } 
    417                   else { 
    418                     Integer fz = (Integer) firstZ.get(filenames[i][p][j]); 
    419                     Integer fc = (Integer) firstC.get(filenames[i][p][j]); 
    420                     Integer ft = (Integer) firstT.get(filenames[i][p][j]); 
    421                     sb.setLength(0); 
    422                     sb.append("<TiffData"); 
    423                     if (fz != null) sb.append(" FirstZ=\"" + fz + "\""); 
    424                     if (fc != null) sb.append(" FirstC=\"" + fc + "\""); 
    425                     if (ft != null) sb.append(" FirstT=\"" + ft + "\""); 
    426                     sb.append("/>"); 
    427                     xml = xml.replaceFirst(pattern, sb.toString()); 
    428                   } 
    429                 } 
    430                 else { 
     516                else { // pp == p 
    431517                  xml = xml.replaceFirst(pattern, 
    432                     "<TiffData NumPlanes=\"0\"/>"); 
     518                    tiffData(-1, -1, fz, fc, ft, dimOrder[ii][pp], 
     519                    sizeZ[ii][pp], sizeC[ii][pp], sizeT[ii][pp], total)); 
    433520                } 
    434521              } 
Note: See TracChangeset for help on using the changeset viewer.