use of loci.formats.services.OMEXMLService in project bioformats by openmicroscopy.
the class Memoizer method setId.
// -- ReaderWrapper API methods --
@Override
public void setId(String id) throws FormatException, IOException {
StopWatch sw = stopWatch();
try {
realFile = new Location(id);
memoFile = getMemoFile(id);
if (memoFile == null) {
// Memoization disabled.
if (userMetadataStore != null) {
reader.setMetadataStore(userMetadataStore);
}
// EARLY EXIT
super.setId(id);
return;
}
// Should never throw kryo exceptions
IFormatReader memo = loadMemo();
loadedFromMemo = false;
savedToMemo = false;
if (memo != null) {
// loadMemo has already called handleMetadataStore with non-null
try {
loadedFromMemo = true;
reader = memo;
reader.reopenFile();
} catch (FileNotFoundException e) {
LOGGER.info("could not reopen file - deleting invalid memo file: {}", memoFile);
deleteQuietly(memoFile);
memo = null;
reader.close();
loadedFromMemo = false;
}
}
if (memo == null) {
OMEXMLService service = getService();
super.setMetadataStore(service.createOMEXMLMetadata());
long start = System.currentTimeMillis();
super.setId(id);
long elapsed = System.currentTimeMillis() - start;
// Between setId and saveMemo
handleMetadataStore(null);
if (elapsed < minimumElapsed) {
LOGGER.debug("skipping save memo. elapsed millis: {}", elapsed);
// EARLY EXIT!
return;
}
// Should never throw.
savedToMemo = saveMemo();
}
} catch (ServiceException e) {
LOGGER.error("Could not create OMEXMLMetadata", e);
} finally {
sw.stop("loci.formats.Memoizer.setId");
}
}
use of loci.formats.services.OMEXMLService in project bioformats by openmicroscopy.
the class CellVoyagerReader method readInfo.
private void readInfo(final Document msDocument, final Document omeDocument) throws FormatException {
/*
* Magnification.
*
* We need it early, because the file format reports only un-magnified
* sizes. So if we are to put proper metadata, we need to make the
* conversion to size measured at the sample level ourselves. I feel
* like this is fragile and most likely to change in a future version of
* the file format.
*/
final Element msRoot = msDocument.getDocumentElement();
final double objectiveMagnification = Double.parseDouble(getChildText(msRoot, new String[] { "ObjectiveLens", "Magnification" }));
// final double zoomLensMagnification = Double.parseDouble(
// getChildText( msRoot, new String[] { "ZoomLens", "Magnification",
// "Value" } ) );
// *
final double magnification = objectiveMagnification;
// zoomLensMagnification;
/*
* Read the ome.xml file. Since it is malformed, we need to parse all
* nodes, and add an "ID" attribute to those who do not have it.
*/
final NodeList nodeList = omeDocument.getElementsByTagName("*");
for (int i = 0; i < nodeList.getLength(); i++) {
final Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
final NamedNodeMap atts = node.getAttributes();
final Node namedItem = atts.getNamedItem("ID");
if (namedItem == null) {
final String name = node.getNodeName();
final String id = name + ":" + i;
if (!node.getParentNode().getNodeName().equals("LightSource")) {
((Element) node).setAttribute("ID", id);
}
}
}
}
/*
* For single-slice image, the PhysicalSizeZ can be 0, which will make
* the metadata read fail. Correct that.
*/
final Element pszEl = getChild(omeDocument.getDocumentElement(), new String[] { "Image", "Pixels" });
final double physicalSizeZ = Double.parseDouble(pszEl.getAttribute("PhysicalSizeZ"));
if (physicalSizeZ <= 0) {
// default to 1 whatever
pszEl.setAttribute("PhysicalSizeZ", "" + 1);
}
/*
* Now that the XML document is properly formed, we can build a metadata
* object from it.
*/
OMEXMLService service = null;
String xml = null;
try {
xml = XMLTools.getXML(omeDocument);
} catch (final TransformerConfigurationException e2) {
LOGGER.debug("", e2);
} catch (final TransformerException e2) {
LOGGER.debug("", e2);
}
try {
service = new ServiceFactory().getInstance(OMEXMLService.class);
} catch (final DependencyException e1) {
LOGGER.debug("", e1);
}
OMEXMLMetadata omeMD = null;
try {
omeMD = service.createOMEXMLMetadata(xml);
} catch (final ServiceException e) {
LOGGER.debug("", e);
} catch (final NullPointerException npe) {
LOGGER.debug("", npe);
throw npe;
}
// Correct pixel size for magnification
omeMD.setPixelsPhysicalSizeX(FormatTools.createLength(omeMD.getPixelsPhysicalSizeX(0).value().doubleValue() / magnification, omeMD.getPixelsPhysicalSizeX(0).unit()), 0);
omeMD.setPixelsPhysicalSizeY(FormatTools.createLength(omeMD.getPixelsPhysicalSizeY(0).value().doubleValue() / magnification, omeMD.getPixelsPhysicalSizeY(0).unit()), 0);
// Time interval
if (Double.valueOf(readFrameInterval(msDocument)) != null) {
omeMD.setPixelsTimeIncrement(new Time(Double.valueOf(readFrameInterval(msDocument)), UNITS.SECOND), 0);
}
/*
* Channels
*/
final Element channelsEl = getChild(msRoot, "Channels");
final List<Element> channelEls = getChildren(channelsEl, "Channel");
channelInfos = new ArrayList<ChannelInfo>();
for (final Element channelEl : channelEls) {
final boolean isEnabled = Boolean.parseBoolean(getChildText(channelEl, "IsEnabled"));
if (!isEnabled) {
continue;
}
final ChannelInfo ci = readChannel(channelEl);
channelInfos.add(ci);
}
/*
* Fix missing IDs.
*
* Some IDs are missing in the malformed OME.XML file. We must put them
* back manually. Some are fixed here
*/
omeMD.setProjectID(MetadataTools.createLSID("Project", 0), 0);
omeMD.setScreenID(MetadataTools.createLSID("Screen", 0), 0);
omeMD.setPlateID(MetadataTools.createLSID("Plate", 0), 0);
omeMD.setInstrumentID(MetadataTools.createLSID("Instrument", 0), 0);
// Read pixel sizes from OME metadata.
final double pixelWidth = omeMD.getPixelsPhysicalSizeX(0).value().doubleValue();
final double pixelHeight = omeMD.getPixelsPhysicalSizeY(0).value().doubleValue();
/*
* Read tile size from channel info. This is weird, but it's like that.
* Since we build a multi-C image, we have to assume that all channels
* have the same dimension, even if the file format allows for changing
* the size, binning, etc. from channel to channel. Failure to load
* datasets that have this exoticity is to be sought here.
*/
final int tileWidth = channelInfos.get(0).tileWidth;
final int tileHeight = channelInfos.get(0).tileHeight;
/*
* Handle multiple wells.
*
* The same kind of remark apply: We assume that a channel setting can
* be applied to ALL wells. So this file reader will fail for dataset
* that have one well that has a different dimension that of others.
*/
/*
* First remark: there can be two modes to store Areas in the xml file:
* Either we define different areas for each well, and in that case, the
* areas are found as a child element of the well element. Either the
* definition of areas is common to all wells, and in that case they
* area defined in a separate element.
*/
final boolean sameAreaPerWell = Boolean.parseBoolean(getChildText(msRoot, "UsesSameAreaParWell"));
List<AreaInfo> areas = null;
if (sameAreaPerWell) {
final Element areasEl = getChild(msRoot, new String[] { "SameAreaUsingWell", "Areas" });
final List<Element> areaEls = getChildren(areasEl, "Area");
int areaIndex = 0;
areas = new ArrayList<AreaInfo>(areaEls.size());
int fieldIndex = 1;
for (final Element areaEl : areaEls) {
final AreaInfo area = readArea(areaEl, fieldIndex, pixelWidth, pixelHeight, tileWidth, tileHeight);
area.index = areaIndex++;
areas.add(area);
// Continue incrementing field index across areas.
fieldIndex = area.fields.get(area.fields.size() - 1).index + 1;
}
}
final Element wellsEl = getChild(msRoot, "Wells");
final List<Element> wellEls = getChildren(wellsEl, "Well");
wells = new ArrayList<WellInfo>();
for (final Element wellEl : wellEls) {
final boolean isWellEnabled = Boolean.parseBoolean(getChild(wellEl, "IsEnabled").getTextContent());
if (isWellEnabled) {
final WellInfo wi = readWellInfo(wellEl, pixelWidth, pixelHeight, tileWidth, tileHeight);
if (sameAreaPerWell) {
wi.areas = areas;
}
wells.add(wi);
}
}
/*
* Z range.
*
* In this file format, the Z range appears to be general: it applies to
* all fields of all wells.
*/
final int nZSlices = Integer.parseInt(getChildText(msRoot, new String[] { "ZStackConditions", "NumberOfSlices" }));
/*
* Time points. They are general as well. Which just makes sense.
*/
timePoints = readTimePoints(msDocument);
/*
* Populate CORE metadata for each area.
*
* This reader takes to convention that state that 1 area = 1 series. So
* if you have 10 wells with 2 areas in each well, and each area is made
* of 20 fields, you will get 20 series, and each series will be
* stitched from 20 fields.
*/
OMEXMLMetadataRoot root = (OMEXMLMetadataRoot) omeMD.getRoot();
Image firstImage = root.getImage(0);
core.clear();
for (final WellInfo well : wells) {
for (final AreaInfo area : well.areas) {
final CoreMetadata ms = new CoreMetadata();
core.add(ms);
if (core.size() > 1) {
root.addImage(firstImage);
}
ms.sizeX = area.width;
ms.sizeY = area.height;
ms.sizeZ = nZSlices;
ms.sizeC = channelInfos.size();
ms.sizeT = timePoints.size();
ms.dimensionOrder = "XYCZT";
ms.rgb = false;
ms.imageCount = nZSlices * channelInfos.size() * timePoints.size();
// Bit depth.
switch(omeMD.getPixelsType(0)) {
case UINT8:
ms.pixelType = FormatTools.UINT8;
ms.bitsPerPixel = 8;
break;
case UINT16:
ms.pixelType = FormatTools.UINT16;
ms.bitsPerPixel = 16;
break;
case UINT32:
ms.pixelType = FormatTools.UINT32;
ms.bitsPerPixel = 32;
break;
default:
throw new FormatException("Cannot read image with pixel type = " + omeMD.getPixelsType(0));
}
// Determined manually on sample data. Check here is the image
// you get is weird.
ms.littleEndian = true;
}
}
omeMD.setRoot(root);
/*
* Populate the MetadataStore.
*/
final MetadataStore store = makeFilterMetadata();
MetadataConverter.convertMetadata(omeMD, store);
MetadataTools.populatePixels(store, this, true);
/*
* Pinhole disk
*/
final double pinholeSize = Double.parseDouble(getChildText(msRoot, new String[] { "PinholeDisk", "PinholeSize_um" }));
/*
* MicroPlate specific stuff
*/
final Element containerEl = getChild(msRoot, new String[] { "Attachment", "HolderInfoList", "HolderInfo", "MountedSampleContainer" });
final String type = containerEl.getAttribute("xsi:type");
boolean plateMetadata = false;
if (type.equals("WellPlate")) {
plateMetadata = true;
final int nrows = Integer.parseInt(getChildText(containerEl, "RowCount"));
final int ncols = Integer.parseInt(getChildText(containerEl, "ColumnCount"));
store.setPlateRows(new PositiveInteger(nrows), 0);
store.setPlateColumns(new PositiveInteger(ncols), 0);
final String plateAcqID = MetadataTools.createLSID("PlateAcquisition", 0, 0);
store.setPlateAcquisitionID(plateAcqID, 0, 0);
final Element dimInfoEl = getChild(msRoot, "DimensionsInfo");
final int maxNFields = Integer.parseInt(getChild(dimInfoEl, "F").getAttribute("Max"));
final PositiveInteger fieldCount = FormatTools.getMaxFieldCount(maxNFields);
if (fieldCount != null) {
store.setPlateAcquisitionMaximumFieldCount(fieldCount, 0, 0);
}
// Plate acquisition time
final String beginTime = getChildText(msRoot, "BeginTime");
final String endTime = getChildText(msRoot, "EndTime");
store.setPlateAcquisitionStartTime(new Timestamp(beginTime), 0, 0);
store.setPlateAcquisitionEndTime(new Timestamp(endTime), 0, 0);
store.setPlateName(beginTime, 0);
} else if (!type.equals("PreparedSlide")) {
LOGGER.warn("Unexpected acquisition type: {}", type);
}
// Wells position on the plate
int seriesIndex = -1;
int wellIndex = -1;
for (final WellInfo well : wells) {
wellIndex++;
final int wellNumber = well.number;
if (plateMetadata) {
store.setWellID(MetadataTools.createLSID("Well", 0, wellIndex), 0, wellIndex);
store.setWellRow(new NonNegativeInteger(well.row), 0, wellIndex);
store.setWellColumn(new NonNegativeInteger(well.col), 0, wellIndex);
}
int areaIndex = -1;
for (final AreaInfo area : well.areas) {
seriesIndex++;
areaIndex++;
String imageID = MetadataTools.createLSID("Image", seriesIndex);
store.setImageID(imageID, seriesIndex);
final String imageName = "Well " + wellNumber + " (UID=" + well.UID + ", r=" + well.row + ", c=" + well.col + ") - Area " + areaIndex;
store.setImageName(imageName, seriesIndex);
if (plateMetadata) {
Length posX = new Length(Double.valueOf(well.centerX), UNITS.REFERENCEFRAME);
Length posY = new Length(Double.valueOf(well.centerY), UNITS.REFERENCEFRAME);
String wellSample = MetadataTools.createLSID("WellSample", 0, wellIndex, areaIndex);
store.setWellSampleID(wellSample, 0, wellIndex, areaIndex);
store.setWellSampleImageRef(imageID, 0, wellIndex, areaIndex);
store.setWellSampleIndex(new NonNegativeInteger(area.index), 0, wellIndex, areaIndex);
store.setWellSamplePositionX(posX, 0, wellIndex, areaIndex);
store.setWellSamplePositionY(posY, 0, wellIndex, areaIndex);
store.setPlateAcquisitionWellSampleRef(wellSample, 0, 0, seriesIndex);
}
store.setImageInstrumentRef(MetadataTools.createLSID("Instrument", 0), seriesIndex);
for (int i = 0; i < channelInfos.size(); i++) {
store.setChannelPinholeSize(new Length(pinholeSize, UNITS.MICROMETER), seriesIndex, i);
store.setChannelName(channelInfos.get(i).name, seriesIndex, i);
store.setChannelColor(channelInfos.get(i).color, seriesIndex, i);
}
}
}
}
use of loci.formats.services.OMEXMLService in project bioformats by openmicroscopy.
the class Schema2011_06_TO_2012_06_Test method setUp.
@BeforeClass
public void setUp() throws Exception {
InputStream source = this.getClass().getResourceAsStream(RESOURCE);
ServiceFactory sf = new ServiceFactory();
OMEXMLService service = sf.getInstance(OMEXMLService.class);
String xml = XMLTools.transformXML(new StreamSource(source), UPDATE_201106);
ome = (OME) service.createOMEXMLRoot(xml);
}
use of loci.formats.services.OMEXMLService in project bioformats by openmicroscopy.
the class PlugInBioFormatsImporter method readImage.
public void readImage() {
final ViewUserInterface mipav = ViewUserInterface.getReference();
// prompt user to choose a file
if (chooser == null) {
chooser = GUITools.buildFileChooser(reader);
chooser.setCurrentDirectory(new File(Preferences.getImageDirectory()));
}
JFrame parent = mipav.getMainFrame();
int rval = chooser.showOpenDialog(parent);
// user canceled
if (rval != JFileChooser.APPROVE_OPTION)
return;
final File file = chooser.getSelectedFile();
// load the image in a separate thread
Thread importerThread = new Thread("BioFormats-Importer") {
public void run() {
String name = file.getName();
String dir = file.getParent();
// open file using Bio-Formats
setMessage(mipav, "Importing " + name + "...", true);
String id = file.getPath();
try {
long tic = System.currentTimeMillis();
IMetadata store;
try {
ServiceFactory factory = new ServiceFactory();
OMEXMLService service = factory.getInstance(OMEXMLService.class);
store = service.createOMEXMLMetadata();
} catch (DependencyException exc) {
throw new FormatException("Could not create OME-XML store.", exc);
} catch (ServiceException exc) {
throw new FormatException("Could not create OME-XML store.", exc);
}
reader.setMetadataStore(store);
reader.setId(id);
// MIPAV assumes 4-D data in XYZT order
reader.setOutputOrder("XYZTC");
// harvest some core metadata
int imageCount = reader.getImageCount();
boolean little = reader.isLittleEndian();
int pixelType = reader.getPixelType();
int bpp = FormatTools.getBytesPerPixel(pixelType);
boolean floating = FormatTools.isFloatingPoint(pixelType);
int sizeX = reader.getSizeX();
int sizeY = reader.getSizeY();
int sizeZ = reader.getSizeZ();
int sizeT = reader.getSizeT();
int sizeC = reader.getSizeC();
String imageName = store.getImageName(0);
if (sizeC > 1) {
throw new FormatException("Multichannel data is unsupported at the moment");
}
// compute MIPAV buffer type
int mipavType;
switch(pixelType) {
case FormatTools.INT8:
mipavType = ModelStorageBase.BYTE;
break;
case FormatTools.UINT8:
mipavType = ModelStorageBase.UBYTE;
break;
case FormatTools.INT16:
mipavType = ModelStorageBase.SHORT;
break;
case FormatTools.UINT16:
mipavType = ModelStorageBase.USHORT;
break;
case FormatTools.INT32:
mipavType = ModelStorageBase.INTEGER;
break;
case FormatTools.UINT32:
mipavType = ModelStorageBase.UINTEGER;
break;
case FormatTools.FLOAT:
mipavType = ModelStorageBase.FLOAT;
break;
case FormatTools.DOUBLE:
mipavType = ModelStorageBase.DOUBLE;
break;
default:
throw new FormatException("Unsupported pixel type: " + pixelType);
}
// harvest physical resolution
Length dimPhysSizeX = store.getPixelsPhysicalSizeX(0);
Length dimPhysSizeY = store.getPixelsPhysicalSizeY(0);
Length dimPhysSizeZ = store.getPixelsPhysicalSizeZ(0);
Time dimTimeInc = store.getPixelsTimeIncrement(0);
float physSizeX = dimPhysSizeX == null ? 1.0f : dimPhysSizeX.value(UNITS.MICROMETER).floatValue();
float physSizeY = dimPhysSizeY == null ? 1.0f : dimPhysSizeY.value(UNITS.MICROMETER).floatValue();
float physSizeZ = dimPhysSizeZ == null ? 1.0f : dimPhysSizeZ.value(UNITS.MICROMETER).floatValue();
float timeInc = dimTimeInc == null ? 1.0f : dimTimeInc.value(UNITS.SECOND).floatValue();
// compute dimensional extents
int[] dimExtents = { sizeX, sizeY, sizeZ, sizeT };
float[] res = { physSizeX, physSizeY, physSizeZ, timeInc };
int[] units = { FileInfoBase.MICROMETERS, FileInfoBase.MICROMETERS, FileInfoBase.MICROMETERS, FileInfoBase.SECONDS };
// create MIPAV image object
ModelImage modelImage = new ModelImage(mipavType, dimExtents, imageName);
// import planes into MIPAV image
byte[] buf = new byte[bpp * sizeX * sizeY];
for (int i = 0; i < imageCount; i++) {
setMessage(mipav, "Reading plane #" + (i + 1) + "/" + imageCount, false);
reader.openBytes(i, buf);
// convert byte array to appropriate primitive type
int offset = i * buf.length;
Object array = DataTools.makeDataArray(buf, bpp, floating, little);
// assign data to MIPAV image object
switch(mipavType) {
case ModelStorageBase.BYTE:
case ModelStorageBase.UBYTE:
modelImage.importData(offset, (byte[]) array, false);
break;
case ModelStorageBase.SHORT:
case ModelStorageBase.USHORT:
modelImage.importData(offset, (short[]) array, false);
break;
case ModelStorageBase.INTEGER:
case ModelStorageBase.UINTEGER:
modelImage.importData(offset, (int[]) array, false);
break;
case ModelStorageBase.FLOAT:
modelImage.importData(offset, (float[]) array, false);
break;
case ModelStorageBase.DOUBLE:
modelImage.importData(offset, (double[]) array, false);
break;
default:
throw new FormatException("Unknown buffer type: " + mipavType);
}
}
setMessage(mipav, "Finishing import...", true);
// create a FileInfo object for each image plane
FileInfoBase[] fileInfo = new FileInfoBase[imageCount];
for (int i = 0; i < imageCount; i++) {
// HACK: Use FileInfoImageXML since FileInfoBase is abstract.
fileInfo[i] = new FileInfoImageXML(name, dir, FileUtility.XML);
fileInfo[i].setExtents(dimExtents);
fileInfo[i].setResolutions(res);
fileInfo[i].setUnitsOfMeasure(units);
fileInfo[i].setDataType(mipavType);
}
modelImage.setFileInfo(fileInfo);
// scale color range and display MIPAV image
modelImage.calcMinMax();
new ViewJFrameImage(modelImage);
long toc = System.currentTimeMillis();
long time = toc - tic;
long avg = time / imageCount;
setMessage(mipav, name + ": Read " + imageCount + " planes in " + (time / 1000f) + " seconds (" + avg + " ms/plane)", true);
} catch (FormatException exc) {
exc.printStackTrace();
MipavUtil.displayError("An error occurred parsing the file: " + exc.getMessage());
} catch (IOException exc) {
exc.printStackTrace();
MipavUtil.displayError("An I/O error occurred reading the file: " + exc.getMessage());
}
}
};
importerThread.start();
}
use of loci.formats.services.OMEXMLService in project bioformats by openmicroscopy.
the class SixteenBitLosslessJPEG2000Test method testLosslessPixels.
@Test
public void testLosslessPixels() throws Exception {
int failureCount = 0;
for (int v = Short.MIN_VALUE; v < Short.MAX_VALUE; v += increment) {
int index = v + Short.MAX_VALUE + 1;
byte[] pixels = DataTools.shortToBytes((short) v, false);
String file = index + ".jp2";
ByteArrayHandle tmpFile = new ByteArrayHandle(1);
Location.mapFile(file, tmpFile);
IMetadata metadata16;
try {
ServiceFactory factory = new ServiceFactory();
OMEXMLService service = factory.getInstance(OMEXMLService.class);
metadata16 = service.createOMEXMLMetadata();
} catch (DependencyException exc) {
throw new FormatException("Could not create OME-XML store.", exc);
} catch (ServiceException exc) {
throw new FormatException("Could not create OME-XML store.", exc);
}
MetadataTools.populateMetadata(metadata16, 0, "foo", false, "XYCZT", "uint16", 1, 1, 1, 1, 1, 1);
IFormatWriter writer16 = new JPEG2000Writer();
writer16.setMetadataRetrieve(metadata16);
writer16.setId(file);
writer16.saveBytes(0, pixels);
writer16.close();
byte[] buf = tmpFile.getBytes();
byte[] realData = new byte[(int) tmpFile.length()];
System.arraycopy(buf, 0, realData, 0, realData.length);
tmpFile.close();
tmpFile = new ByteArrayHandle(realData);
Location.mapFile(file, tmpFile);
ImageReader reader = new ImageReader();
reader.setId(file);
byte[] plane = reader.openBytes(0);
for (int q = 0; q < plane.length; q++) {
if (plane[q] != pixels[q]) {
LOGGER.debug("FAILED on {}", DataTools.bytesToShort(pixels, false));
failureCount++;
break;
}
}
reader.close();
tmpFile.close();
Location.mapFile(file, null);
}
assertEquals(failureCount, 0);
}
Aggregations