Changeset 3388


Ignore:
Timestamp:
11/19/07 13:07:51 (12 years ago)
Author:
melissa
Message:

Fixed axis size parsing logic.

File:
1 edited

Legend:

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

    r3322 r3388  
    263263  } 
    264264 
     265  // -- IFormatHandler API methods -- 
     266 
    265267  /* @see loci.formats.IFormatReader#close() */ 
    266268  public void close() throws IOException { 
     
    270272    zs.clear(); 
    271273    ts.clear(); 
    272     adjustImageCount = false; 
    273     isJPEG = false; 
    274     isLossless = false; 
     274    adjustImageCount = isJPEG = isLossless = false; 
     275    numSeries = 0; 
    275276  } 
    276277 
     
    293294 
    294295      byte[] b = new byte[1024 * 1024]; 
     296      int numValidPlanes = 0; 
    295297      while (in.getFilePointer() < in.length()) { 
    296298        if (in.read() == -38 && in.read() == -50 && in.read() == -66 && 
     
    311313              " at position " + in.getFilePointer()); 
    312314          } 
    313           in.readFully(b, 0, len); 
     315          //in.readFully(b, 0, len); 
     316          int n = in.read(b, 0, len); 
     317          if (n < len) break; 
    314318 
    315319          if (len >= 12 && b[0] == 'I' && b[1] == 'm' && b[2] == 'a' && 
     
    327331            } 
    328332            int ndx = Integer.parseInt(sb.toString()); 
    329  
    330             if (core.sizeC[0] == 0) { 
    331               core.sizeC[0] = len / (core.sizeX[0] * core.sizeY[0] * 
    332                 FormatTools.getBytesPerPixel(core.pixelType[0])); 
     333            if (core.sizeC[0] == 0 && core.sizeX[0] != 0 && core.sizeY[0] != 0) 
     334            { 
     335              Arrays.fill(core.sizeC, len / (core.sizeX[0] * core.sizeY[0] * 
     336                FormatTools.getBytesPerPixel(core.pixelType[0]))); 
    333337            } 
    334             offsets[0][ndx] = in.getFilePointer() - len + sb.length() + 21; 
    335             while (offsets[0][ndx] - in.getFilePointer() + 
    336               len - 14 - sb.length() < 8) 
     338            int seriesNdx = ndx / (core.sizeT[0] * core.sizeZ[0]); 
     339            int plane = ndx % (core.sizeT[0] * core.sizeZ[0]); 
     340            if (seriesNdx >= offsets.length) { 
     341              long[][] tmpOffsets = offsets; 
     342              offsets = new long[seriesNdx + 1][tmpOffsets[0].length]; 
     343              for (int i=0; i<tmpOffsets.length; i++) { 
     344                System.arraycopy(tmpOffsets[i], 0, offsets[i], 0, 
     345                  offsets[i].length); 
     346              } 
     347            } 
     348            offsets[seriesNdx][plane] = 
     349              in.getFilePointer() - len + sb.length() + 21; 
     350            while (offsets[seriesNdx][plane] - in.getFilePointer() + 
     351              len - sb.length() < 22) 
    337352            { 
    338               offsets[0][ndx]++; 
     353              offsets[seriesNdx][plane]++; 
    339354            } 
     355            numValidPlanes++; 
    340356          } 
    341357          else if (len >= 5 && b[0] == 'I' && b[1] == 'm' && b[2] == 'a' && 
     
    374390                throw new FormatException(exc); 
    375391              } 
     392 
     393              // adjust SizeT, if necessary 
     394              long planeSize = core.sizeX[0] * core.sizeY[0] * 
     395                FormatTools.getBytesPerPixel(core.pixelType[0]) * core.sizeC[0]; 
     396              if (planeSize*core.imageCount[0]*core.imageCount.length >= 
     397                in.length() && !isLossless) 
     398              { 
     399                int approxPlanes = (int) (in.length() / planeSize); 
     400                core.sizeT[0] = approxPlanes / core.imageCount.length; 
     401                if (core.sizeT[0] * core.imageCount.length < approxPlanes) { 
     402                  core.sizeT[0]++; 
     403                } 
     404                core.imageCount[0] = core.sizeT[0]; 
     405                core.sizeZ[0] = 1; 
     406              } 
    376407            } 
    377408          } 
    378409 
    379410          if (core.imageCount[0] > 0 && offsets == null) { 
    380             offsets = new long[1][core.imageCount[0]]; 
     411            if (numSeries == 0) numSeries = 1; 
     412            offsets = new long[numSeries][core.imageCount[0]]; 
     413            if (numSeries > 1) { 
     414              int x = core.sizeX[0]; 
     415              int y = core.sizeY[0]; 
     416              int z = core.sizeZ[0]; 
     417              int c = core.sizeC[0]; 
     418              int t = core.sizeT[0]; 
     419              int count = core.imageCount[0]; 
     420              int pixelType = core.pixelType[0]; 
     421              core = new CoreMetadata(numSeries); 
     422              Arrays.fill(core.sizeX, x); 
     423              Arrays.fill(core.sizeY, y); 
     424              Arrays.fill(core.sizeZ, z); 
     425              Arrays.fill(core.sizeC, c); 
     426              Arrays.fill(core.sizeT, t); 
     427              Arrays.fill(core.imageCount, count); 
     428              Arrays.fill(core.pixelType, pixelType); 
     429            } 
    381430          } 
    382431 
     
    388437      } 
    389438 
    390       if (core.sizeC[0] == 0) core.sizeC[0] = 1; 
    391       core.currentOrder[0] = "XYCZT"; 
    392       core.rgb[0] = core.sizeC[0] > 1; 
    393       if (core.sizeC[0] > 1 && adjustImageCount) { 
    394         core.imageCount[0] /= 3; 
    395         core.sizeT[0] /= 3; 
    396       } 
    397       core.littleEndian[0] = true; 
    398       core.interleaved[0] = true; 
    399       core.indexed[0] = false; 
    400       core.falseColor[0] = false; 
    401       core.metadataComplete[0] = true; 
     439      Arrays.fill(core.sizeX, core.sizeX[0]); 
     440      Arrays.fill(core.sizeY, core.sizeY[0]); 
     441      Arrays.fill(core.sizeC, core.sizeC[0]); 
     442      Arrays.fill(core.sizeZ, core.sizeZ[0]); 
     443      Arrays.fill(core.sizeT, core.sizeT[0]); 
     444      Arrays.fill(core.imageCount, core.imageCount[0]); 
     445      Arrays.fill(core.pixelType, core.pixelType[0]); 
     446 
     447      if (core.sizeC[0] == 0) Arrays.fill(core.sizeC, 1); 
     448      Arrays.fill(core.currentOrder, "XYCZT"); 
     449      Arrays.fill(core.rgb, core.sizeC[0] > 1); 
     450 
     451      adjustImageCount = false; 
     452      for (int i=0; i<offsets.length; i++) { 
     453        for (int j=1; j<core.imageCount[i]; j++) { 
     454          if (offsets[i][j] < offsets[i][j - 1]) { 
     455            adjustImageCount = true; 
     456            break; 
     457          } 
     458        } 
     459      } 
     460 
     461      if (core.sizeC[0] > 1 && 
     462        core.imageCount[0] > core.sizeT[0] * core.sizeZ[0]) 
     463      { 
     464        if (adjustImageCount) { 
     465          Arrays.fill(core.sizeT, numValidPlanes / core.sizeT.length); 
     466        } 
     467        Arrays.fill(core.imageCount, core.sizeT[0] * core.sizeZ[0]); 
     468      } 
     469      Arrays.fill(core.littleEndian, true); 
     470      Arrays.fill(core.interleaved, true); 
     471      Arrays.fill(core.indexed, false); 
     472      Arrays.fill(core.falseColor, false); 
     473      Arrays.fill(core.metadataComplete, true); 
     474 
     475      for (int i=0; i<offsets.length; i++) { 
     476        for (int j=0; j<offsets[i].length; j++) { 
     477          if (offsets[i][j] == 0 && core.sizeT[i] > j) { 
     478            core.sizeT[i] = j; 
     479            core.imageCount[i] = core.sizeZ[i] * core.sizeT[i]; 
     480            break; 
     481          } 
     482        } 
     483      } 
    402484 
    403485      MetadataStore store = getMetadataStore(); 
    404486      store.setImage(currentId, null, null, null); 
    405487      FormatTools.populatePixels(store, this); 
    406       for (int i=0; i<core.sizeC[0]; i++) { 
    407         store.setLogicalChannel(i, null, null, null, null, null, null, null, 
    408           null, null, null, null, null, null, null, null, null, null, null, 
    409           null, null, null, null, null, null); 
     488      for (int i=0; i<core.sizeC.length; i++) { 
     489        store.setImage(currentId, null, null, new Integer(i)); 
     490        for (int j=0; j<core.sizeC[i]; j++) { 
     491          store.setLogicalChannel(j, null, null, null, null, null, null, null, 
     492            null, null, null, null, null, null, null, null, null, null, null, 
     493            null, null, null, null, null, new Integer(i)); 
     494        } 
    410495      } 
    411496 
     
    592677                            core.sizeZ[0] * core.sizeC[0] * core.sizeT[0]; 
    593678                          Arrays.fill(core.imageCount, count); 
    594  
    595                           Arrays.fill(core.currentOrder, "XYCZT"); 
    596679                        } 
    597680                      } 
     
    647730    } 
    648731 
     732    Arrays.fill(core.sizeZ, core.sizeZ[0]); 
     733    Arrays.fill(core.sizeT, core.sizeT[0]); 
     734    Arrays.fill(core.imageCount, core.imageCount[0]); 
     735    Arrays.fill(core.currentOrder, "XYCZT"); 
     736 
    649737    core.pixelType[0] = FormatTools.UINT8; 
    650738    offsets = new long[1][2]; 
     
    667755    offsets = new long[numSeries][core.imageCount[0]]; 
    668756 
    669     for (int i=0; i<core.sizeZ[0]*core.sizeT[0]; i++) { 
     757    for (int i=0; i<core.sizeT[0]; i++) { 
    670758      for (int j=0; j<numSeries; j++) { 
    671         for (int k=0; k<core.sizeC[0]; k++) { 
    672           offsets[j][i*core.sizeC[0] + k] = ((Long) vs.remove(0)).longValue(); 
     759        for (int q=0; q<core.sizeZ[0]; q++) { 
     760          for (int k=0; k<getEffectiveSizeC(); k++) { 
     761            offsets[j][i*core.sizeZ[0]*getEffectiveSizeC() + 
     762              q*getEffectiveSizeC() + k] = ((Long) vs.remove(0)).longValue(); 
     763          } 
    673764        } 
    674765      } 
     
    747838        } 
    748839      } 
    749       else if (qName.equals("bValid")) { 
    750         adjustImageCount = attributes.getValue("value").equals("true"); 
     840      else if (qName.startsWith("item_")) { 
     841        int v = Integer.parseInt(qName.substring(qName.indexOf("_") + 1)); 
     842        if (v == numSeries) numSeries++; 
    751843      } 
    752844      else if (qName.equals("uiComp")) { 
     
    779871          core.imageCount[0] = n; 
    780872          core.sizeT[0] = n; 
    781         } 
    782         core.sizeZ[0] = 1; 
     873          core.sizeZ[0] = 1; 
     874        } 
     875      } 
     876      else if (qName.equals("uiSequenceCount")) { 
     877        int n = Integer.parseInt(attributes.getValue("value")); 
     878        if (n > 0 && (core.imageCount[0] == 0 || core.sizeT[0] == 0 || 
     879          n < core.imageCount[0])) 
     880        { 
     881          core.imageCount[0] = n; 
     882          core.sizeT[0] = n; 
     883          core.sizeZ[0] = 1; 
     884        } 
     885      } 
     886      else if (qName.startsWith("TextInfoItem")) { 
     887        String value = attributes.getValue("value"); 
     888        if (value.indexOf("Dimensions") != -1) { 
     889          int ndx = value.indexOf("Dimensions"); 
     890          value = value.substring(ndx + 11, value.indexOf("\n", ndx)).trim(); 
     891          StringTokenizer st = new StringTokenizer(value, " x "); 
     892          while (st.hasMoreTokens()) { 
     893            String token = st.nextToken().trim(); 
     894            ndx = token.indexOf("(") + 1; 
     895            if (ndx == 0) continue; 
     896            int v = Integer.parseInt(token.substring(ndx, token.indexOf(")"))); 
     897            if (token.startsWith("T")) { 
     898              core.sizeT[0] = v; 
     899            } 
     900            else if (token.startsWith("Z")) core.sizeZ[0] = v; 
     901            else if (!token.startsWith("XY")) core.sizeC[0] = v; 
     902          } 
     903          if (core.sizeZ[0] == 0) core.sizeZ[0] = 1; 
     904          if (core.sizeC[0] == 0) core.sizeC[0] = 1; 
     905          if (core.sizeT[0] == 0) { 
     906            core.sizeT[0] = 1; 
     907          } 
     908          core.imageCount[0] = core.sizeZ[0] * core.sizeC[0] * core.sizeT[0]; 
     909        } 
    783910      } 
    784911      else if (qName.equals("dCompressionParam")) { 
    785         isLossless = !attributes.getValue("value").equals("0"); 
     912        int v = Integer.parseInt(attributes.getValue("value")); 
     913        isLossless = v > 0; 
    786914        addMeta(qName, attributes.getValue("value")); 
    787915      } 
Note: See TracChangeset for help on using the changeset viewer.