/* * #%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% */ package loci.formats.in; import java.io.IOException; import loci.common.DateTools; import loci.common.RandomAccessInputStream; import loci.formats.FormatException; import loci.formats.FormatTools; import loci.formats.MetadataTools; import loci.formats.meta.MetadataStore; import loci.formats.tiff.IFD; import loci.formats.tiff.TiffParser; import ome.units.quantity.Length; import ome.units.UNITS; import ome.xml.model.primitives.PositiveFloat; import ome.xml.model.primitives.Timestamp; import ome.units.quantity.Length; /** * LEOReader is the file format reader for LEO EM files. * * @author Melissa Linkert melissa at glencoesoftware.com */ public class LEOReader extends BaseTiffReader { // -- Constants -- public static final int LEO_TAG = 34118; // -- Fields -- private double xSize; private String date; private double workingDistance; // -- Constructor -- /** Constructs a new LEO reader. */ public LEOReader() { super("LEO", new String[] {"sxm", "tif", "tiff"}); domains = new String[] {FormatTools.EM_DOMAIN}; suffixSufficient = false; } // -- IFormatReader API methods -- /* @see loci.formats.IFormatReader#isThisType(RandomAccessInputStream) */ @Override public boolean isThisType(RandomAccessInputStream stream) throws IOException { TiffParser parser = new TiffParser(stream); parser.setDoCaching(false); IFD ifd = parser.getFirstIFD(); if (ifd == null) return false; return ifd.containsKey(LEO_TAG); } // -- Internal BaseTiffReader API methods -- /* @see BaseTiffReader#initStandardMetadata() */ @Override protected void initStandardMetadata() throws FormatException, IOException { super.initStandardMetadata(); String tag = ifds.get(0).getIFDTextValue(LEO_TAG); String[] lines = tag.split("\n"); date = ""; for (int line=10; line<lines.length; line++) { if (lines[line].equals("clock")) { date += lines[++line]; } else if (lines[line].equals("date")) { date += " " + lines[++line]; } } if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) { // physical sizes stored in meters xSize = Double.parseDouble(lines[3]) * 1000000; double eht = Double.parseDouble(lines[6]); double filament = Double.parseDouble(lines[7]); workingDistance = Double.parseDouble(lines[9]); addGlobalMeta("EHT", eht); addGlobalMeta("Filament", filament); addGlobalMeta("Working Distance", workingDistance); addGlobalMeta("Physical pixel size", xSize + " um"); addGlobalMeta("Acquisition date", date); } } /* @see BaseTiffReader#initMetadataStore() */ @Override protected void initMetadataStore() throws FormatException { super.initMetadataStore(); MetadataStore store = makeFilterMetadata(); date = DateTools.formatDate(date, "HH:mm dd-MMM-yyyy"); if (date != null) { store.setImageAcquisitionDate(new Timestamp(date), 0); } if (getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) { Length sizeX = FormatTools.getPhysicalSizeX(xSize); Length sizeY = FormatTools.getPhysicalSizeY(xSize); if (sizeX != null) { store.setPixelsPhysicalSizeX(sizeX, 0); } if (sizeY != null) { store.setPixelsPhysicalSizeY(sizeY, 0); } String instrument = MetadataTools.createLSID("Instrument", 0); store.setInstrumentID(instrument, 0); store.setImageInstrumentRef(instrument, 0); store.setObjectiveID(MetadataTools.createLSID("Objective", 0, 0), 0, 0); store.setObjectiveWorkingDistance(new Length(workingDistance, UNITS.MICROM), 0, 0); store.setObjectiveImmersion(getImmersion("Other"), 0, 0); store.setObjectiveCorrection(getCorrection("Other"), 0, 0); } } }