/*
* #%L
* OME Bio-Formats package for reading and converting biological file formats.
* %%
* Copyright (C) 2005 - 2015 Open Microscopy Environment:
* - Board of Regents of the University of Wisconsin-Madison
* - Glencoe Software, Inc.
* - University of Dundee
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
/*!
* \file WlzReader.java
* \author Bill Hill
* \date June 2013
* \version $Id$
* \par
* Address:
* MRC Human Genetics Unit,
* MRC Institute of Genetics and Molecular Medicine,
* University of Edinburgh,
* Western General Hospital,
* Edinburgh, EH4 2XU, UK.
* \par
* Copyright (C), [2013 - 2015],
* The University Court of the University of Edinburgh,
* Old College, Edinburgh, UK.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be
* useful but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
* \brief Woolz reader for bioformats.
*/
package loci.formats.in;
import java.io.IOException;
import loci.common.services.DependencyException;
import loci.common.services.ServiceFactory;
import loci.formats.CoreMetadata;
import loci.formats.FormatException;
import loci.formats.FormatReader;
import loci.formats.FormatTools;
import loci.formats.MetadataTools;
import loci.formats.MissingLibraryException;
import loci.formats.services.WlzService;
import loci.formats.meta.MetadataStore;
import ome.xml.model.primitives.PositiveFloat;
import ome.units.quantity.Length;
import ome.units.UNITS;
/**
* WlzReader is a file format reader for Woolz files.
* Woolz is available from: https://github.com/ma-tech/Woolz
*/
public class WlzReader extends FormatReader {
// -- Constants --
// -- Static initializers --
static {
}
// -- Fields --
private transient WlzService wlz = null;
public static final String NO_WLZ_MSG =
"\n" +
"Woolz is required to read and write Woolz objects.\n" +
"Please obtain the necessary JAR and native library files from:\n" +
"http://www.emouseatlas.org/emap/analysis_tools_resources/software/woolz.html.\n" +
"The source code for these is also available from:\n" +
"https://github.com/ma-tech/Woolz.";
// -- Constructor --
public WlzReader() {
super("Woolz", new String[] {"wlz"});
domains = new String[] {FormatTools.UNKNOWN_DOMAIN};
}
// -- IFormatReader API methods --
/* @see IFormatReader#isThisType(String, boolean) */
@Override
public boolean isThisType(String file, boolean open) {
return super.isThisType(file, open);
}
/**
* @see loci.formats.IFormatReader#openBytes(int, byte[], int, int, int, int)
*/
@Override
public byte[] openBytes(int no, byte[] buf, int x, int y, int w, int h)
throws FormatException, IOException
{
FormatTools.checkPlaneParameters(this, no, buf.length, x, y, w, h);
if (wlz != null) {
buf = wlz.readBytes(no, buf, x, y, w, h);
}
else {
try {
ServiceFactory factory = new ServiceFactory();
wlz = factory.getInstance(WlzService.class);
}
catch (DependencyException e) {
throw new FormatException(NO_WLZ_MSG, e);
}
if (wlz != null) {
wlz.open(currentId, "r");
buf = wlz.readBytes(no, buf, x, y, w, h);
}
}
return buf;
}
// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
super.initFile(id);
try {
ServiceFactory factory = new ServiceFactory();
wlz = factory.getInstance(WlzService.class);
}
catch (DependencyException e) {
throw new FormatException(NO_WLZ_MSG, e);
}
if (wlz != null) {
wlz.open(id, "r");
CoreMetadata md = core.get(0);
MetadataStore store = makeFilterMetadata();
md.rgb = wlz.isRGB();
md.interleaved = false;
md.indexed = false;
md.sizeX = wlz.getSizeX();
md.sizeY = wlz.getSizeY();
md.sizeZ = wlz.getSizeZ();
md.sizeC = wlz.getSizeC();
md.sizeT = wlz.getSizeT();
md.dimensionOrder = "XYZCT";
md.imageCount = wlz.getSizeZ();
md.pixelType = wlz.getPixelType();
PositiveFloat x = new PositiveFloat(Math.abs(wlz.getVoxSzX()));
PositiveFloat y = new PositiveFloat(Math.abs(wlz.getVoxSzY()));
PositiveFloat z = new PositiveFloat(Math.abs(wlz.getVoxSzZ()));
store.setPixelsPhysicalSizeX(FormatTools.createLength(x, UNITS.MICROM), 0);
store.setPixelsPhysicalSizeY(FormatTools.createLength(y, UNITS.MICROM), 0);
store.setPixelsPhysicalSizeZ(FormatTools.createLength(z, UNITS.MICROM), 0);
store.setStageLabelName(wlz.getWlzOrgLabelName(), 0);
store.setStageLabelX(new Length(wlz.getOrgX(), UNITS.REFERENCEFRAME), 0);
store.setStageLabelY(new Length(wlz.getOrgY(), UNITS.REFERENCEFRAME), 0);
store.setStageLabelZ(new Length(wlz.getOrgZ(), UNITS.REFERENCEFRAME), 0);
MetadataTools.populatePixels(store, this);
}
}
/* @see loci.formats.IFormatReader#close(boolean) */
@Override
public void close(boolean fileOnly) throws IOException {
super.close(fileOnly);
if (!fileOnly) {
if (wlz != null) {
wlz.close();
wlz = null;
}
}
}
// -- Helper methods --
}