/* * #%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 WlzWriter.java * \author Bill Hill * \date July 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], * 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 writer for bioformats. */ package loci.formats.out; import java.io.ByteArrayOutputStream; import java.io.IOException; import ome.units.UNITS; import ome.units.quantity.Length; import loci.common.services.DependencyException; import loci.common.services.ServiceFactory; import loci.common.RandomAccessInputStream; import loci.common.RandomAccessOutputStream; import loci.formats.FormatException; import loci.formats.FormatTools; import loci.formats.FormatWriter; import loci.formats.MetadataTools; import loci.formats.meta.MetadataRetrieve; import loci.formats.MissingLibraryException; import loci.formats.services.WlzService; import ome.units.quantity.Length; import ome.units.UNITS; /** * WlzWriter is the file format writer for Woolz files. */ public class WlzWriter extends FormatWriter { // -- Fields -- private 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."; private String outputOrder = "XYZCT"; // -- Constructor -- public WlzWriter() { super("Woolz", new String[] {"wlz"}); } // -- ICSWriter API methods -- /** * Set the order in which dimensions should be written to the file. * Valid values are specified in the documentation for * {@link loci.formats.IFormatReader#getDimensionOrder()} */ public void setOutputOrder(String outputOrder) { this.outputOrder = outputOrder; } // -- IFormatWriter API methods -- /** * @see loci.formats.IFormatWriter#saveBytes(int, byte[], int, int, int, int) */ @Override public void saveBytes(int no, byte[] buf, int x, int y, int w, int h) throws FormatException, IOException { if(wlz != null) { checkParams(no, buf, x, y, w, h); wlz.saveBytes(no, buf, x, y, w, h); } } /* @see loci.formats.IFormatWriter#canDoStacks() */ @Override public boolean canDoStacks() { return true; } /* @see loci.formats.IFormatWriter#getPixelTypes(String) */ @Override public int[] getPixelTypes(String codec) { int[] spt; if(wlz != null) { spt = wlz.getSupPixelTypes(); } else { spt = new int[] {}; } return(spt); } // -- FormatWriter API methods -- /* @see loci.formats.FormatWriter#setId(String) */ @Override public void setId(String id) throws FormatException, IOException { super.setId(id); try { ServiceFactory factory = new ServiceFactory(); wlz = factory.getInstance(WlzService.class); } catch (DependencyException e) { throw new FormatException(NO_WLZ_MSG, e); } if(wlz != null) { MetadataRetrieve meta = getMetadataRetrieve(); MetadataTools.verifyMinimumPopulated(meta, series); wlz.open(id, "w"); String stageLabelName = null; try { stageLabelName = meta.getStageLabelName(0); } catch (NullPointerException e) { } int oX = 0; int oY = 0; int oZ = 0; if((stageLabelName != null) && stageLabelName.equals(wlz.getWlzOrgLabelName())) { final Length stageX = meta.getStageLabelX(0); final Length stageY = meta.getStageLabelY(0); final Length stageZ = meta.getStageLabelZ(0); oX = (int) Math.rint(stageX.value(UNITS.REFERENCEFRAME).doubleValue()); oY = (int) Math.rint(stageY.value(UNITS.REFERENCEFRAME).doubleValue()); oZ = (int) Math.rint(stageZ.value(UNITS.REFERENCEFRAME).doubleValue()); } int nX = meta.getPixelsSizeX(series).getValue().intValue(); int nY = meta.getPixelsSizeY(series).getValue().intValue(); int nZ = meta.getPixelsSizeZ(series).getValue().intValue(); int nC = meta.getPixelsSizeC(series).getValue().intValue(); int nT = meta.getPixelsSizeT(series).getValue().intValue(); double vX = 1.0; double vY = 1.0; double vZ = 1.0; if(meta.getPixelsPhysicalSizeX(0) != null) { vX = meta.getPixelsPhysicalSizeX(0).value(UNITS.MICROM).doubleValue(); } if(meta.getPixelsPhysicalSizeY(0) != null) { vY = meta.getPixelsPhysicalSizeY(0).value(UNITS.MICROM).doubleValue(); } if(meta.getPixelsPhysicalSizeZ(0) != null) { vZ = meta.getPixelsPhysicalSizeZ(0).value(UNITS.MICROM).doubleValue(); } int gType = FormatTools.pixelTypeFromString( meta.getPixelsType(series).toString()); wlz.setupWrite(oX, oY, oZ, nX, nY, nZ, nC, nT, vX, vY, vZ, gType); } } /* @see loci.formats.FormatWriter#close() */ @Override public void close() throws IOException { super.close(); if(wlz != null) { wlz.close(); } } // -- Helper methods -- }