Changeset 4746


Ignore:
Timestamp:
01/15/09 17:43:41 (11 years ago)
Author:
melissa
Message:

Fixed dimension calculation bugs; closes #346.

File:
1 edited

Legend:

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

    r4681 r4746  
    310310      DataTools.parseXML(xmlString, handler); 
    311311 
    312       // adjust SizeT, if necessary 
    313       long planeSize = getSizeX() * getSizeY() * 
    314         FormatTools.getBytesPerPixel(getPixelType()) * getSizeC(); 
    315       if (planeSize * getImageCount() * getSeriesCount() >= 
    316         in.length() && !isLossless) 
    317       { 
    318         int approxPlanes = (int) (in.length() / planeSize); 
    319         core[0].sizeT = approxPlanes / getSeriesCount(); 
    320         if (getSizeT() * getSeriesCount() < approxPlanes) { 
    321           core[0].sizeT++; 
    322         } 
    323         core[0].imageCount = getSizeT(); 
    324         core[0].sizeZ = 1; 
    325       } 
    326  
    327312      // read first CustomData block 
    328313 
     
    352337      if (numSeries == 0) numSeries = 1; 
    353338 
    354       offsets = new long[numSeries][getImageCount()]; 
    355  
    356339      if (getSizeZ() == 0) { 
    357340        for (int i=0; i<getSeriesCount(); i++) { 
     
    364347        } 
    365348      } 
     349 
     350      // calculate the image count 
     351      for (int i=0; i<getSeriesCount(); i++) { 
     352        core[i].imageCount = getSizeZ() * getSizeT() * getSizeC(); 
     353        if (imageOffsets.size() < core[i].imageCount) { 
     354          core[i].imageCount /= getSizeC(); 
     355        } 
     356        if (core[i].imageCount > imageOffsets.size() / getSeriesCount()) { 
     357          if (core[i].imageCount == imageOffsets.size()) { 
     358            CoreMetadata originalCore = core[0]; 
     359            core = new CoreMetadata[] {originalCore}; 
     360            numSeries = 1; 
     361            break; 
     362          } 
     363          else { 
     364            core[i].imageCount = imageOffsets.size() / getSeriesCount(); 
     365            core[i].sizeZ = 1; 
     366            core[i].sizeT = core[i].imageCount; 
     367          } 
     368        } 
     369      } 
     370 
     371      offsets = new long[numSeries][getImageCount()]; 
    366372 
    367373      for (int i=0; i<imageOffsets.size(); i++) { 
     
    392398        int plane = ndx % (getSizeT() * getSizeZ()); 
    393399 
    394         offsets[seriesIndex][plane] = offset + p.x + 8; 
     400        if (seriesIndex < offsets.length && plane < offsets[seriesIndex].length) 
     401        { 
     402          offsets[seriesIndex][plane] = offset + p.x + 8; 
     403        } 
    395404        b = null; 
    396405      } 
     
    426435            if (offsets[i][q] == 0) invalid++; 
    427436          } 
    428           core[i].sizeT = (offsets[i].length - invalid) / core[i].sizeC; 
     437          core[i].imageCount = offsets[i].length - invalid; 
     438          core[i].sizeT = core[i].imageCount / (rgb ? 1 : core[i].sizeC); 
    429439          if (core[i].sizeT == 0) core[i].sizeT = 1; 
    430           core[i].imageCount = offsets[i].length - invalid; 
    431440        } 
    432441      } 
     
    465474 
    466475      if (getSizeC() > 1) { 
    467         if (adjustImageCount) { 
    468           int n = imageOffsets.size() / getSeriesCount(); 
    469           for (int i=0; i<getSeriesCount(); i++) { 
    470             core[i].sizeT = n == 0 ? 1 : n; 
    471           } 
    472         } 
    473476        for (int i=0; i<getSeriesCount(); i++) { 
    474477          core[i].imageCount = getSizeT() * getSizeZ(); 
     
    628631 
    629632    status("Populating metadata"); 
     633 
     634    core[0].pixelType = FormatTools.UINT8; 
     635    offsets = new long[1][2]; 
     636    offsets[0][0] = ((Long) vs.get(0)).longValue(); 
     637    if (offsets[0].length > 1 && vs.size() > 1) { 
     638      offsets[0][1] = ((Long) vs.get(1)).longValue(); 
     639    } 
     640 
     641    in.seek(offsets[0][0]); 
     642 
     643    if (getSizeC() == 0) core[0].sizeC = 1; 
     644    int numBands = c; 
     645    c = numBands > 1 ? numBands : getSizeC(); 
     646    if (numBands == 1 && getImageCount() == 1) c = 1; 
     647    for (int i=0; i<getSeriesCount(); i++) { 
     648      core[i].sizeC = c; 
     649      core[i].rgb = numBands > 1; 
     650      core[i].pixelType = type; 
     651    } 
     652 
    630653    if (getImageCount() == 0) { 
    631       core[0].sizeZ = zs.size() == 0 ? vs.size() : zs.size(); 
    632       core[0].sizeT = ts.size() == 0 ? 1 : ts.size(); 
    633       core[0].sizeC = (vs.size() + 1) / (getSizeT() * getSizeZ()); 
    634654      core[0].imageCount = vs.size(); 
    635       while (getImageCount() % getSizeC() != 0) core[0].imageCount--; 
    636       while (getSizeC() * getSizeZ() * getSizeT() > getImageCount()) { 
    637         if (getSizeZ() < getSizeT()) core[0].sizeT--; 
    638         else core[0].sizeZ--; 
    639       } 
    640     } 
    641  
    642     if (getSizeC() * getSizeZ() * getSizeT() != getImageCount()) { 
    643       core[0].sizeZ = zs.size(); 
    644       core[0].sizeT = ts.size(); 
    645       core[0].imageCount = getSizeC() * getSizeZ() * getSizeT(); 
    646       if (vs.size() > getImageCount()) { 
    647         core[0].sizeT = vs.size() / (isRGB() ? 1 : getSizeC()); 
    648         core[0].imageCount = getSizeZ() * getSizeT(); 
    649         if (!isRGB()) core[0].imageCount *= getSizeC(); 
    650       } 
    651     } 
    652  
    653     if (getImageCount() == 0) core[0].imageCount = 1; 
     655      core[0].sizeZ = (int) Math.max(zs.size(), 1); 
     656      core[0].sizeT = (int) Math.max(ts.size(), 1); 
     657      int channels = isRGB() ? 1 : getSizeC(); 
     658      if (channels * getSizeZ() * getSizeT() != getImageCount()) { 
     659        core[0].sizeZ = 1; 
     660        core[0].sizeT = getImageCount() / channels; 
     661        core[0].imageCount = getSizeZ() * getSizeT() * channels; 
     662      } 
     663    } 
     664 
    654665    if (getSizeZ() == 0) core[0].sizeZ = 1; 
    655     if (getSizeC() == 0) core[0].sizeC = 1; 
    656666    if (getSizeT() == 0) core[0].sizeT = 1; 
    657667 
     
    666676      core[i].littleEndian = false; 
    667677      core[i].metadataComplete = true; 
    668     } 
    669  
    670     core[0].pixelType = FormatTools.UINT8; 
    671     offsets = new long[1][2]; 
    672     offsets[0][0] = ((Long) vs.get(0)).longValue(); 
    673     if (offsets[0].length > 1 && vs.size() > 1) { 
    674       offsets[0][1] = ((Long) vs.get(1)).longValue(); 
    675     } 
    676  
    677     in.seek(offsets[0][0]); 
    678  
    679     if (getSizeC() == 0) core[0].sizeC = 1; 
    680     int numBands = c; 
    681     c = numBands > 1 ? numBands : getSizeC(); 
    682     if (numBands == 1 && getImageCount() == 1) c = 1; 
    683     for (int i=0; i<getSeriesCount(); i++) { 
    684       core[i].sizeC = c; 
    685       core[i].rgb = numBands > 1; 
    686       core[i].pixelType = type; 
    687     } 
    688  
    689     if (isRGB() && getImageCount() > getSizeZ() * getSizeT()) { 
    690       if (getSizeZ() > 1) core[0].sizeZ *= getSizeC(); 
    691       else core[0].sizeT *= getSizeC(); 
    692       for (int i=0; i<getSeriesCount(); i++) { 
    693         core[i].sizeT = getSizeT(); 
    694         core[i].sizeZ = getSizeZ(); 
    695       } 
    696     } 
    697  
    698     if (vs.size() < getImageCount()) { 
    699       for (int i=0; i<getSeriesCount(); i++) { 
    700         core[i].imageCount = vs.size(); 
    701       } 
    702678    } 
    703679 
     
    817793        core[0].sizeY = Integer.parseInt(attributes.getValue("value")); 
    818794      } 
    819       else if (qName.equals("uiCount")) { 
    820         int n = Integer.parseInt(attributes.getValue("value")); 
    821         if (getImageCount() == 0) { 
    822           core[0].imageCount = n; 
    823           core[0].sizeT = n; 
    824           core[0].sizeZ = 1; 
    825         } 
    826       } 
    827       else if (qName.equals("uiSequenceCount")) { 
    828         int n = Integer.parseInt(attributes.getValue("value")); 
    829         if (n > 0 && (getImageCount() == 0 || getSizeT() == 0 || 
    830           n < getImageCount())) 
    831         { 
    832           core[0].imageCount = n; 
    833           core[0].sizeT = n; 
    834           core[0].sizeZ = 1; 
    835         } 
    836       } 
    837795      else if (qName.startsWith("TextInfo")) { 
    838796        parseKeyAndValue(qName, attributes.getValue("Text")); 
     
    899857          t = t.substring(11); 
    900858          StringTokenizer dims = new StringTokenizer(t, " x "); 
     859 
     860          core[0].sizeZ = 1; 
     861          core[0].sizeT = 1; 
     862          core[0].sizeC = 1; 
     863 
    901864          while (dims.hasMoreTokens()) { 
    902865            String dim = dims.nextToken().trim(); 
    903             int idx = dim.indexOf("("); 
    904             int v = Integer.parseInt(dim.substring(idx + 1, 
    905               dim.indexOf(")", idx))); 
     866            int v = Integer.parseInt(dim.replaceAll("\\D", "")); 
     867            v = (int) Math.max(v, 1); 
    906868            if (dim.startsWith("XY")) { 
    907869              numSeries = v; 
     
    925887            else if (dim.startsWith("T")) { 
    926888              for (int i=0; i<getSeriesCount(); i++) { 
    927                 core[i].sizeT = v == 0 ? 1 : v; 
     889                core[i].sizeT = v; 
    928890              } 
    929891            } 
    930892            else if (dim.startsWith("Z")) { 
    931893              for (int i=0; i<getSeriesCount(); i++) { 
    932                 core[i].sizeZ = v == 0 ? 1 : v; 
     894                core[i].sizeZ = v; 
    933895              } 
    934896            } 
    935897            else { 
    936898              for (int i=0; i<getSeriesCount(); i++) { 
    937                 core[i].sizeC = v == 0 ? 1 : v; 
     899                core[i].sizeC = v; 
    938900              } 
    939901            } 
     
    945907          } 
    946908        } 
     909        else if (t.startsWith("Number of Picture Planes")) { 
     910          int v = Integer.parseInt(t.substring(t.indexOf(":") + 1).trim()); 
     911          for (int i=0; i<getSeriesCount(); i++) { 
     912            core[i].sizeC = v; 
     913          } 
     914        } 
    947915      } 
    948916    } 
Note: See TracChangeset for help on using the changeset viewer.