/*
* #%L
* BSD implementations of Bio-Formats readers and writers
* %%
* Copyright (C) 2005 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
* #L%
*/
package loci.formats;
import java.util.Hashtable;
/**
* Encompasses core metadata values.
*/
public class CoreMetadata implements Cloneable {
// -- Fields --
// TODO: We may want to consider refactoring the FormatReader getter
// methods that populate missing CoreMetadata fields on the fly
// (getThumbSizeX, getThumbSizeY) to avoid doing so -- one alternate
// approach would be to have this class use getter methods instead
// of public fields.
/** Width (in pixels) of images in this series. */
public int sizeX;
/** Height (in pixels) of images in this series. */
public int sizeY;
/** Number of Z sections. */
public int sizeZ;
/** Number of channels. */
public int sizeC;
/** Number of timepoints. */
public int sizeT;
/** Width (in pixels) of thumbnail images in this series. */
public int thumbSizeX;
/** Height (in pixels) of thumbnail images in this series. */
public int thumbSizeY;
/**
* Describes the number of bytes per pixel. Must be one of the <i>static</i>
* pixel types (e.g. <code>INT8</code>) in {@link loci.formats.FormatTools}.
*/
public int pixelType;
/** Number of valid bits per pixel. */
public int bitsPerPixel;
/** Total number of images. */
public int imageCount;
public Modulo moduloZ = new Modulo("Z");
public Modulo moduloC = new Modulo("C");
public Modulo moduloT = new Modulo("T");
/**
* Order in which dimensions are stored. Must be one of the following:<ul>
* <li>XYCZT</li>
* <li>XYCTZ</li>
* <li>XYZCT</li>
* <li>XYZTC</li>
* <li>XYTCZ</li>
* <li>XYTZC</li>
* </ul>
*/
public String dimensionOrder;
/**
* Indicates whether or not we are confident that the
* dimension order is correct.
*/
public boolean orderCertain;
/**
* Indicates whether or not the images are stored as RGB
* (multiple channels per plane).
*/
public boolean rgb;
/** Indicates whether or not each pixel's bytes are in little endian order. */
public boolean littleEndian;
/**
* True if channels are stored RGBRGBRGB...; false if channels are stored
* RRR...GGG...BBB...
*/
public boolean interleaved;
/** Indicates whether or not the images are stored as indexed color. */
public boolean indexed;
/** Indicates whether or not we can ignore the color map (if present). */
public boolean falseColor = true;
/**
* Indicates whether or not we are confident that all of the metadata stored
* within the file has been parsed.
*/
public boolean metadataComplete;
/** Non-core metadata associated with this series. */
public Hashtable<String, Object> seriesMetadata;
/**
* Indicates whether or not this series is a lower-resolution copy of
* another series.
*/
public boolean thumbnail;
public int resolutionCount = 1;
// -- Constructors --
public CoreMetadata() {
seriesMetadata = new Hashtable<String, Object>();
}
public CoreMetadata(IFormatReader r, int coreIndex) {
int currentIndex = r.getCoreIndex();
r.setCoreIndex(coreIndex);
sizeX = r.getSizeX();
sizeY = r.getSizeY();
sizeZ = r.getSizeZ();
sizeC = r.getSizeC();
sizeT = r.getSizeT();
thumbSizeX = r.getThumbSizeX();
thumbSizeY = r.getThumbSizeY();
pixelType = r.getPixelType();
bitsPerPixel = r.getBitsPerPixel();
imageCount = r.getImageCount();
dimensionOrder = r.getDimensionOrder();
orderCertain = r.isOrderCertain();
rgb = r.isRGB();
littleEndian = r.isLittleEndian();
interleaved = r.isInterleaved();
indexed = r.isIndexed();
falseColor = r.isFalseColor();
metadataComplete = r.isMetadataComplete();
seriesMetadata = r.getSeriesMetadata();
thumbnail = r.isThumbnailSeries();
resolutionCount = r.getResolutionCount();
moduloZ = r.getModuloZ();
moduloC = r.getModuloC();
moduloT = r.getModuloT();
r.setCoreIndex(currentIndex);
}
public CoreMetadata(CoreMetadata c) {
sizeX = c.sizeX;
sizeY = c.sizeY;
sizeZ = c.sizeZ;
sizeC = c.sizeC;
sizeT = c.sizeT;
thumbSizeX = c.thumbSizeX;
thumbSizeY = c.thumbSizeY;
pixelType = c.pixelType;
bitsPerPixel = c.bitsPerPixel;
imageCount = c.imageCount;
dimensionOrder = c.dimensionOrder;
orderCertain = c.orderCertain;
rgb = c.rgb;
littleEndian = c.littleEndian;
interleaved = c.interleaved;
indexed = c.indexed;
falseColor = c.falseColor;
metadataComplete = c.metadataComplete;
seriesMetadata = c.seriesMetadata;
thumbnail = c.thumbnail;
resolutionCount = c.resolutionCount;
moduloZ = new Modulo(c.moduloZ);
moduloC = new Modulo(c.moduloC);
moduloT = new Modulo(c.moduloT);
}
// -- Object methods --
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(super.toString() + ":");
sb.append("\n\tsizeX = " + sizeX);
sb.append("\n\tsizeY = " + sizeY);
sb.append("\n\tsizeZ = " + sizeZ);
sb.append("\n\tsizeC = " + sizeC);
sb.append("\n\tsizeT = " + sizeT);
sb.append("\n\tthumbSizeX = " + thumbSizeX);
sb.append("\n\tthumbSizeY = " + thumbSizeY);
sb.append("\n\tpixelType = " + FormatTools.getPixelTypeString(pixelType));
sb.append("\n\tbitsPerPixel = " + bitsPerPixel);
sb.append("\n\timageCount = " + imageCount);
sb.append("\n\tdimensionOrder = " + dimensionOrder);
sb.append("\n\torderCertain = " + orderCertain);
sb.append("\n\trgb = " + rgb);
sb.append("\n\tlittleEndian = " + littleEndian);
sb.append("\n\tinterleaved = " + interleaved);
sb.append("\n\tindexed = " + indexed);
sb.append("\n\tfalseColor = " + falseColor);
sb.append("\n\tmetadataComplete = " + metadataComplete);
sb.append("\n\tseriesMetadata = " + seriesMetadata.size() + " keys");
sb.append("\n\tthumbnail = " + thumbnail);
return sb.toString();
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public CoreMetadata clone(IFormatReader r, int coreIndex) {
return new CoreMetadata(r, coreIndex);
}
}