Changeset 4158


Ignore:
Timestamp:
07/02/08 09:34:18 (12 years ago)
Author:
melissa
Message:

Handle case where we have more data files than the number of images.

File:
1 edited

Legend:

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

    r4132 r4158  
    344344        if (extSet.size() == 0) extSet.add(tempFiles[i + j]); 
    345345        else { 
     346          if (tempFiles[i + j] == null) continue; 
    346347          String ext = 
    347348            tempFiles[i+j].substring(tempFiles[i+j].lastIndexOf(".") + 1); 
     
    363364      } 
    364365 
    365       for (int j=0; j<extCount; j++) { 
     366      int length = (int) Math.min(extCount, extSet.size()); 
     367      for (int j=0; j<length; j++) { 
    366368        files[i+j] = (String) extSet.get(j); 
    367369      } 
     
    713715    // parse details to get number of wavelengths and timepoints 
    714716 
    715     String wavelengths = "1"; 
     717    core.sizeC[0] = 1; 
     718    core.sizeT[0] = 1; 
     719    core.sizeZ[0] = 1; 
     720 
    716721    if (details != null) { 
    717722      t = new StringTokenizer(details); 
    718723      int tokenNum = 0; 
    719       boolean foundId = false; 
    720724      String prevToken = ""; 
    721725      while (t.hasMoreTokens()) { 
    722726        String token = t.nextToken(); 
    723         foundId = token.equals("Wavelengths"); 
    724         if (foundId) { 
    725           wavelengths = prevToken; 
     727        if (token.equals("Wavelengths")) { 
     728          core.sizeC[0] = Integer.parseInt(prevToken); 
     729        } 
     730        else if (token.equals("Frames")) { 
     731          core.sizeT[0] = Integer.parseInt(prevToken); 
     732        } 
     733        else if (token.equals("Slices")) { 
     734          core.sizeZ[0] = Integer.parseInt(prevToken); 
    726735        } 
    727736        tokenNum++; 
     
    732741    status("Populating metadata"); 
    733742 
    734     if (core.sizeZ[0] <= 0) core.sizeZ[0] = 1; 
    735  
    736     core.sizeC[0] = Integer.parseInt(wavelengths); 
    737  
    738     core.sizeT[0] = getImageCount() / (core.sizeZ[0] * core.sizeC[0]); 
    739743    if (isTiff) { 
    740744      tiff[0].setId(files[0]); 
     
    757761          break; 
    758762      } 
     763    } 
     764 
     765    if (core.sizeT[0] <= 0) { 
     766      core.sizeT[0] = core.imageCount[0] / (core.sizeZ[0] * core.sizeC[0]); 
     767    } 
     768    else { 
     769      core.imageCount[0] = (isTiff ? tiff[0].getEffectiveSizeC() : 
     770        core.sizeC[0]) * core.sizeZ[0] * core.sizeT[0]; 
     771    } 
     772 
     773    // throw away files, if necessary 
     774 
     775    if (files.length > core.imageCount[0]) { 
     776      String[] tmpFiles = files; 
     777      files = new String[core.imageCount[0]]; 
     778 
     779      Hashtable zSections = new Hashtable(); 
     780      for (int i=0; i<tmpFiles.length; i++) { 
     781        int underscore = tmpFiles[i].lastIndexOf("_"); 
     782        int dotIndex = tmpFiles[i].lastIndexOf("."); 
     783        String z = tmpFiles[i].substring(underscore + 1, dotIndex); 
     784        if (zSections.get(z) == null) zSections.put(z, new Integer(1)); 
     785        else { 
     786          int count = ((Integer) zSections.get(z)).intValue() + 1; 
     787          zSections.put(z, new Integer(count)); 
     788        } 
     789      } 
     790 
     791      int nextFile = 0; 
     792      int oldFile = 0; 
     793      Arrays.sort(tmpFiles, new PEComparator()); 
     794      String[] keys = (String[]) zSections.keySet().toArray(new String[0]); 
     795      Arrays.sort(keys); 
     796      for (int i=0; i<keys.length; i++) { 
     797        int oldCount = ((Integer) zSections.get(keys[i])).intValue(); 
     798        int nPlanes = (isTiff ? tiff[0].getEffectiveSizeC() : core.sizeC[0]) * 
     799          core.sizeT[0]; 
     800        int count = (int) Math.min(oldCount, nPlanes); 
     801        for (int j=0; j<count; j++) { 
     802          files[nextFile++] = tmpFiles[oldFile++]; 
     803        } 
     804        if (count < oldCount) oldFile += (oldCount - count); 
     805      } 
     806 
    759807    } 
    760808 
     
    849897  } 
    850898 
     899  // -- Helper class -- 
     900 
     901  class PEComparator implements Comparator { 
     902    public int compare(Object o1, Object o2) { 
     903      String s1 = o1.toString(); 
     904      String s2 = o2.toString(); 
     905 
     906      if (s1.equals(s2)) return 0; 
     907 
     908      int underscore1 = s1.lastIndexOf("_"); 
     909      int underscore2 = s2.lastIndexOf("_"); 
     910      int dot1 = s1.lastIndexOf("."); 
     911      int dot2 = s2.lastIndexOf("."); 
     912 
     913      String prefix1 = s1.substring(0, underscore1); 
     914      String prefix2 = s2.substring(0, underscore2); 
     915 
     916      if (!prefix1.equals(prefix2)) return prefix1.compareTo(prefix2); 
     917 
     918      int z1 = Integer.parseInt(s1.substring(underscore1 + 1, dot1)); 
     919      int z2 = Integer.parseInt(s2.substring(underscore2 + 1, dot2)); 
     920 
     921      if (z1 < z2) return -1; 
     922      if (z2 < z1) return 1; 
     923 
     924      try { 
     925        int ext1 = Integer.parseInt(s1.substring(dot1 + 1), 16); 
     926        int ext2 = Integer.parseInt(s2.substring(dot2 + 1), 16); 
     927 
     928        if (ext1 < ext2) return -1; 
     929        return 1; 
     930      } 
     931      catch (NumberFormatException e) { } 
     932      return 0; 
     933    } 
     934 
     935    public boolean equals(Object o) { 
     936      return compare(this, o) == 0; 
     937    } 
     938  } 
     939 
    851940} 
Note: See TracChangeset for help on using the changeset viewer.