/*
* #%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%
*/
import java.util.Arrays;
import loci.common.DateTools;
import loci.common.services.ServiceFactory;
import loci.formats.FormatReader;
import loci.formats.IFormatReader;
import loci.formats.ImageReader;
import loci.formats.meta.IMetadata;
import loci.formats.services.OMEXMLService;
import ome.xml.model.primitives.NonNegativeInteger;
import ome.units.quantity.Time;
import ome.units.UNITS;
/**
* Uses Bio-Formats to extract timestamp information
* in a format-independent manner from a dataset.
*/
public class PrintTimestamps {
/** Outputs dimensional information. */
public static void printDimensions(IFormatReader reader) {
// output dimensional information
int sizeX = reader.getSizeX();
int sizeY = reader.getSizeY();
int sizeZ = reader.getSizeZ();
int sizeC = reader.getSizeC();
int sizeT = reader.getSizeT();
int imageCount = reader.getImageCount();
System.out.println();
System.out.println("Image dimensions:");
System.out.println("\tWidth = " + sizeX);
System.out.println("\tHeight = " + sizeY);
System.out.println("\tFocal planes = " + sizeZ);
System.out.println("\tChannels = " + sizeC);
System.out.println("\tTimepoints = " + sizeT);
System.out.println("\tTotal planes = " + imageCount);
}
/** Outputs global timing details. */
public static void printGlobalTiming(IMetadata meta, int series) {
String imageName = meta.getImageName(series);
String creationDate = null;
if (meta.getImageAcquisitionDate(series) != null) {
creationDate = meta.getImageAcquisitionDate(series).getValue();
}
Time timeInc = meta.getPixelsTimeIncrement(series);
System.out.println();
System.out.println("Global timing information:");
System.out.println("\tImage name = " + imageName);
System.out.println("\tCreation date = " + creationDate);
if (creationDate != null) {
System.out.println("\tCreation time (in ms since epoch) = " +
DateTools.getTime(creationDate, DateTools.ISO8601_FORMAT));
}
System.out.println("\tTime increment (in seconds) = " + timeInc.value(UNITS.S).doubleValue());
}
/** Outputs timing details per timepoint. */
public static void printTimingPerTimepoint(IMetadata meta, int series) {
System.out.println();
System.out.println(
"Timing information per timepoint (from beginning of experiment):");
int planeCount = meta.getPlaneCount(series);
for (int i = 0; i < planeCount; i++) {
Time deltaT = meta.getPlaneDeltaT(series, i);
if (deltaT == null) continue;
// convert plane ZCT coordinates into image plane index
int z = meta.getPlaneTheZ(series, i).getValue().intValue();
int c = meta.getPlaneTheC(series, i).getValue().intValue();
int t = meta.getPlaneTheT(series, i).getValue().intValue();
if (z == 0 && c == 0) {
System.out.println("\tTimepoint #" + t + " = " + deltaT.value(UNITS.S).doubleValue() + " s");
}
}
}
/**
* Outputs timing details per plane.
*
* This information may seem redundant or unnecessary, but it is possible
* that two image planes recorded at the same timepoint actually have
* slightly different timestamps. Thus, OME allows for recording a separate
* timestamp for every individual image plane.
*/
public static void printTimingPerPlane(IMetadata meta, int series) {
System.out.println();
System.out.println(
"Timing information per plane (from beginning of experiment):");
int planeCount = meta.getPlaneCount(series);
for (int i = 0; i < planeCount; i++) {
Time deltaT = meta.getPlaneDeltaT(series, i);
if (deltaT == null) continue;
// convert plane ZCT coordinates into image plane index
int z = meta.getPlaneTheZ(series, i).getValue().intValue();
int c = meta.getPlaneTheC(series, i).getValue().intValue();
int t = meta.getPlaneTheT(series, i).getValue().intValue();
System.out.println("\tZ " + z + ", C " + c + ", T " + t + " = " +
deltaT.value(UNITS.S).doubleValue() + " s");
}
}
public static void main(String[] args) throws Exception {
// parse command line arguments
if (args.length < 1) {
System.err.println("Usage: java PrintTimestamps imageFile [seriesNo]");
System.exit(1);
}
String id = args[0];
int series = args.length > 1 ? Integer.parseInt(args[1]) : 0;
// enable debugging
//FormatReader.debug = true;
// create OME-XML metadata store of the latest schema version
ServiceFactory factory = new ServiceFactory();
OMEXMLService service = factory.getInstance(OMEXMLService.class);
IMetadata meta = service.createOMEXMLMetadata();
// or if you want a specific schema version, you can use:
//IMetadata meta = service.createOMEXMLMetadata(null, "2009-02");
//meta.createRoot();
// create format reader
IFormatReader reader = new ImageReader();
reader.setMetadataStore(meta);
// initialize file
System.out.println("Initializing " + id);
reader.setId(id);
int seriesCount = reader.getSeriesCount();
if (series < seriesCount) reader.setSeries(series);
series = reader.getSeries();
System.out.println("\tImage series = " + series + " of " + seriesCount);
printDimensions(reader);
printGlobalTiming(meta, series);
printTimingPerTimepoint(meta, series);
printTimingPerPlane(meta, series);
}
}