Changeset 6826


Ignore:
Timestamp:
08/19/10 15:05:18 (9 years ago)
Author:
melissa
Message:

Backported dimension detection changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/4.1/components/bio-formats/src/loci/formats/in/OpenlabReader.java

    r5517 r6826  
    4949 * <a href="https://skyking.microscopy.wisc.edu/svn/java/trunk/components/bio-formats/src/loci/formats/in/OpenlabReader.java">SVN</a></dd></dl> 
    5050 * 
    51  * @author Melissa Linkert linkert at wisc.edu 
     51 * @author Melissa Linkert melissa at glencoesoftware.com 
    5252 * @author Eric Kjellman egkjellman at wisc.edu 
    5353 * @author Curtis Rueden ctrueden at wisc.edu 
     
    130130  /* @see loci.formats.IFormatReader#get8BitLookupTable() */ 
    131131  public byte[][] get8BitLookupTable() { 
    132     byte[][] lut = luts.get(planeOffsets[series][lastPlane]); 
    133     if (lut == null) return null; 
    134     return lut; 
     132    return luts.get(planeOffsets[series][lastPlane]); 
    135133  } 
    136134 
     
    145143    lastPlane = no; 
    146144 
     145    if (no >= planeOffsets[series].length) return buf; 
    147146    int index = planeOffsets[series][no]; 
    148147 
    149148    long first = planes[index].planeOffset; 
    150     long last = no == getImageCount() - 1 ? in.length() : 
     149    long last = no == planeOffsets[series].length - 1 || 
     150      planeOffsets[series][no + 1] >= planes.length ? in.length() : 
    151151      planes[planeOffsets[series][no + 1]].planeOffset; 
    152152    in.seek(first); 
     
    306306  /* @see loci.formats.FormatReader#initFile(String) */ 
    307307  protected void initFile(String id) throws FormatException, IOException { 
    308     debug("OpenlabReader.initFile(" + id + ")"); 
    309308    super.initFile(id); 
    310309    in = new RandomAccessInputStream(id); 
     
    426425        imagesFound++; 
    427426      } 
    428       else if (tag == CALIBRATION) { 
    429         in.skipBytes(4); 
    430         short units = in.readShort(); 
    431         in.skipBytes(12); 
    432  
    433         xcal = in.readFloat(); 
    434         ycal = in.readFloat(); 
    435  
    436         float scaling = units == 3 ? 0.001f : 1.0f; 
    437  
    438         xcal *= scaling; 
    439         ycal *= scaling; 
    440       } 
    441       else if (tag == USER) { 
    442         String className = in.readCString(); 
    443  
    444         if (className.equals("CVariableList")) { 
    445           char achar = in.readChar(); 
    446  
    447           if (achar == 1) { 
    448             int numVars = in.readShort(); 
    449             for (int i=0; i<numVars; i++) { 
    450               className = in.readCString(); 
    451  
    452               String name = "", value = ""; 
    453  
    454               int derivedClassVersion = in.read(); 
    455               if (derivedClassVersion != 1) { 
    456                 throw new FormatException("Invalid revision"); 
     427      else { 
     428        if (tag == CALIBRATION) { 
     429          in.skipBytes(4); 
     430          short units = in.readShort(); 
     431          float scaling = units == 3 ? 0.001f : 1.0f; 
     432          in.skipBytes(12); 
     433 
     434          xcal = in.readFloat() * scaling; 
     435          ycal = in.readFloat() * scaling; 
     436        } 
     437        else if (tag == USER) { 
     438          String className = in.readCString(); 
     439 
     440          if (className.equals("CVariableList")) { 
     441            char achar = in.readChar(); 
     442 
     443            if (achar == 1) { 
     444              int numVars = in.readShort(); 
     445              for (int i=0; i<numVars; i++) { 
     446                readVariable(); 
    457447              } 
    458  
    459               if (className.equals("CStringVariable")) { 
    460                 int strSize = in.readInt(); 
    461                 value = in.readString(strSize); 
    462                 in.skipBytes(1); 
    463               } 
    464               else if (className.equals("CFloatVariable")) { 
    465                 value = String.valueOf(in.readDouble()); 
    466               } 
    467  
    468               int baseClassVersion = in.read(); 
    469               if (baseClassVersion == 1 || baseClassVersion == 2) { 
    470                 int strSize = in.readInt(); 
    471                 name = in.readString(strSize); 
    472                 in.skipBytes(baseClassVersion * 2 + 1); 
    473               } 
    474               else { 
    475                 throw new FormatException("Invalid revision: " + 
    476                   baseClassVersion); 
    477               } 
    478  
    479               addGlobalMeta(name, value); 
    480  
    481               if (name.equals("Gain")) gain = value; 
    482               else if (name.equals("Offset")) detectorOffset = value; 
    483               else if (name.equals("X-Y Stage: X Position")) xPos = value; 
    484               else if (name.equals("X-Y Stage: Y Position")) yPos = value; 
    485               else if (name.equals("ZPosition")) zPos = value; 
    486448            } 
    487449          } 
     
    517479      names.clear(); 
    518480    } 
    519     setSeries(0); 
    520481 
    521482    // populate core metadata 
    522483 
    523484    for (int i=0; i<nSeries; i++) { 
     485      setSeries(i); 
    524486      core[i].indexed = false; 
    525487      core[i].sizeX = planes[planeOffsets[i][0]].width; 
    526488      core[i].sizeY = planes[planeOffsets[i][0]].height; 
    527489      core[i].imageCount = planeOffsets[i].length; 
     490      core[i].sizeC = 1; 
    528491 
    529492      switch (planes[planeOffsets[i][0]].volumeType) { 
     
    532495        case MAC_256_GREYS: 
    533496          core[i].pixelType = FormatTools.UINT8; 
    534           core[i].rgb = false; 
    535           core[i].sizeC = 1; 
    536           core[i].interleaved = false; 
    537497          core[i].indexed = planes[planeOffsets[i][0]].pict; 
    538498          break; 
    539499        case MAC_256_COLORS: 
    540500          core[i].pixelType = FormatTools.UINT8; 
    541           core[i].rgb = false; 
    542           core[i].sizeC = 1; 
    543           core[i].interleaved = false; 
    544501          core[i].indexed = true; 
    545502          break; 
     
    548505        case MAC_24_BIT_COLOR: 
    549506          core[i].pixelType = FormatTools.UINT8; 
    550           core[i].rgb = true; 
    551507          core[i].sizeC = 3; 
    552           core[i].interleaved = version == 5; 
    553508          break; 
    554         case MAC_16_GREYS: 
    555509        case DEEP_GREY_9: 
    556510        case DEEP_GREY_10: 
     
    560514        case DEEP_GREY_14: 
    561515        case DEEP_GREY_15: 
     516        case MAC_16_GREYS: 
    562517        case DEEP_GREY_16: 
    563518          core[i].pixelType = FormatTools.UINT16; 
    564           core[i].rgb = false; 
    565           core[i].sizeC = 1; 
    566           core[i].interleaved = false; 
    567519          break; 
    568520        default: 
     
    571523      } 
    572524 
     525      core[i].rgb = getSizeC() > 1; 
     526      core[i].interleaved = isRGB() && version == 5; 
    573527      core[i].sizeT = 1; 
    574       core[i].sizeZ = core[i].imageCount; 
     528      core[i].sizeZ = getImageCount(); 
    575529      core[i].dimensionOrder = "XYCZT"; 
    576530      core[i].littleEndian = false; 
    577531      core[i].falseColor = false; 
    578532      core[i].metadataComplete = true; 
    579       //core[i].seriesMetadata = getMetadata(); 
    580     } 
     533    } 
     534 
     535    for (int s=0; s<getSeriesCount(); s++) { 
     536      setSeries(s); 
     537      parseImageNames(s); 
     538    } 
     539    setSeries(0); 
    581540 
    582541    MetadataStore store = 
     
    599558 
    600559    try { 
    601       if (gain != null) store.setDetectorSettingsGain(new Float(gain), 0, 0); 
     560      if (gain != null) { 
     561        store.setDetectorSettingsGain(new Float(gain), 0, 0); 
     562      } 
    602563    } 
    603564    catch (NumberFormatException e) { } 
     
    614575    store.setDetectorSettingsDetector(detectorID, 0, 0); 
    615576 
    616     store.setDetectorType("Unknown", 0, 0); 
     577    store.setDetectorType("Other", 0, 0); 
    617578 
    618579    Float stageX = xPos == null ? null : new Float(xPos); 
     
    648609    fmt = in.readString(4); 
    649610    in.skipBytes(version == 2 ? 4 : 8); 
     611  } 
     612 
     613  private void readVariable() throws FormatException, IOException { 
     614    String className = in.readCString(); 
     615 
     616    String name = "", value = ""; 
     617 
     618    int derivedClassVersion = in.read(); 
     619    if (derivedClassVersion != 1) { 
     620      throw new FormatException("Invalid revision"); 
     621    } 
     622 
     623    if (className.equals("CStringVariable")) { 
     624      int strSize = in.readInt(); 
     625      value = in.readString(strSize); 
     626      in.skipBytes(1); 
     627    } 
     628    else if (className.equals("CFloatVariable")) { 
     629      value = String.valueOf(in.readDouble()); 
     630    } 
     631 
     632    int baseClassVersion = in.read(); 
     633    if (baseClassVersion == 1 || baseClassVersion == 2) { 
     634      int strSize = in.readInt(); 
     635      name = in.readString(strSize); 
     636      in.skipBytes(baseClassVersion * 2 + 1); 
     637    } 
     638    else { 
     639      throw new FormatException("Invalid revision: " + baseClassVersion); 
     640    } 
     641 
     642    addGlobalMeta(name, value); 
     643 
     644    if (name.equals("Gain")) gain = value; 
     645    else if (name.equals("Offset")) detectorOffset = value; 
     646    else if (name.equals("X-Y Stage: X Position")) xPos = value; 
     647    else if (name.equals("X-Y Stage: Y Position")) yPos = value; 
     648    else if (name.equals("ZPosition")) zPos = value; 
     649  } 
     650 
     651  private void parseImageNames(int s) { 
     652    Vector<String> uniqueT = new Vector<String>(); 
     653    Vector<String> uniqueC = new Vector<String>(); 
     654    Vector<String> uniqueZ = new Vector<String>(); 
     655    String[] axes = new String[] {"Z", "C", "T"}; 
     656 
     657    core[s].dimensionOrder = "XY"; 
     658    for (PlaneInfo plane : planes) { 
     659      if (plane == null) continue; 
     660      if (plane.series == s) { 
     661        String name = plane.planeName; 
     662        for (String axis : axes) { 
     663          Vector<String> unique = null; 
     664          if (axis.equals("Z")) unique = uniqueZ; 
     665          else if (axis.equals("C")) unique = uniqueC; 
     666          else if (axis.equals("T")) unique = uniqueT; 
     667 
     668          int index = name.indexOf(axis + "="); 
     669          if (index == -1) index = name.indexOf(axis + " ="); 
     670          if (index != -1) { 
     671            int nextEqual = name.indexOf("=", index + 3); 
     672            if (nextEqual < 0) { 
     673              nextEqual = (int) Math.min(index + 3, name.length()); 
     674            } 
     675            int end = name.lastIndexOf(" ", nextEqual); 
     676            if (end < index) end = name.length(); 
     677 
     678            String i = name.substring(name.indexOf("=", index), end); 
     679            if (!unique.contains(i)) { 
     680              unique.add(i); 
     681              if (unique.size() > 1 && 
     682                core[s].dimensionOrder.indexOf(axis) == -1) 
     683              { 
     684                core[s].dimensionOrder += axis; 
     685              } 
     686            } 
     687          } 
     688        } 
     689      } 
     690    } 
     691 
     692    if (core[s].rgb && uniqueC.size() <= 1) { 
     693      core[s].dimensionOrder = core[s].dimensionOrder.replaceAll("C", ""); 
     694      core[s].dimensionOrder = "XYC" + core[s].dimensionOrder.substring(2); 
     695    } 
     696 
     697    for (String axis : axes) { 
     698      if (core[s].dimensionOrder.indexOf(axis) == -1) { 
     699        core[s].dimensionOrder += axis; 
     700      } 
     701    } 
     702    if (uniqueC.size() > 1) { 
     703      core[s].sizeC *= uniqueC.size(); 
     704      core[s].sizeZ /= uniqueC.size(); 
     705    } 
     706    if (uniqueT.size() > 1) { 
     707      core[s].sizeT = uniqueT.size(); 
     708      core[s].sizeZ /= core[s].sizeT; 
     709    } 
     710 
     711    int newCount = getSizeZ() * getSizeT(); 
     712    if (!isRGB()) newCount *= getSizeC(); 
     713 
     714    if (newCount < getImageCount()) { 
     715      char firstAxis = getDimensionOrder().charAt(2); 
     716      if (firstAxis == 'Z') core[s].sizeZ++; 
     717      else if (firstAxis == 'C' && !isRGB()) core[s].sizeC++; 
     718      else core[s].sizeT++; 
     719      core[s].imageCount = getSizeZ() * getSizeT(); 
     720      if (!isRGB()) core[s].imageCount *= getSizeC(); 
     721    } 
     722    else if (newCount > getImageCount()) core[s].imageCount = newCount; 
    650723  } 
    651724 
Note: See TracChangeset for help on using the changeset viewer.