/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * 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 spim.fiji.datasetmanager; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Hashtable; import loci.formats.FormatTools; import loci.formats.IFormatReader; import loci.formats.meta.MetadataRetrieve; import mpicbg.spim.io.IOFunctions; import ome.units.quantity.Length; import spim.fiji.spimdata.imgloaders.LegacySlideBook6ImgLoader; public class SlideBook6MetaData { private SlideBook6Image[] captures; private int pixelType = -1; private int bytesPerPixel = -1; private String pixelTypeString = ""; private boolean isLittleEndian; private IFormatReader r = null; public int numCaptures() { return captures.length; } public String imageName(final int i) { return captures[i].name; } public int numChannels(final int i) { return captures[i].channels.length; } public int numAngles(final int i) { return captures[i].angles.length; } public int numTimepoints(final int i) { return captures[i].numT; } public String objective(final int i) { return captures[i].objective; } public double calX(final int i) { return captures[i].calX; } public double calY(final int i) { return captures[i].calY; } public double calZ(final int i) { return captures[i].calZ; } public String[] channels(final int i) { return captures[i].channels; } public String[] angles(final int i) { return captures[i].angles; } public int[] imageSize(final int i) { return captures[i].imageSize;} public int pixelType() { return pixelType; } public int bytesPerPixel() { return bytesPerPixel; } public String pixelTypeString() { return pixelTypeString; } public boolean isLittleEndian() { return isLittleEndian; } public IFormatReader getReader() { return r; } public boolean loadMetaData( final File sldFile ) { return loadMetaData( sldFile, false ); } public boolean loadMetaData(final File sldFile, final boolean keepFileOpen) { final IFormatReader r = LegacySlideBook6ImgLoader.instantiateImageReader(); if (!LegacySlideBook6ImgLoader.createOMEXMLMetadata(r)) { try { r.close(); } catch (IOException e) { e.printStackTrace(); } IOFunctions.println("Creating MetaDataStore failed. Stopping"); return false; } try { r.setId(sldFile.getAbsolutePath()); this.pixelType = r.getPixelType(); this.bytesPerPixel = FormatTools.getBytesPerPixel(pixelType); this.pixelTypeString = FormatTools.getPixelTypeString(pixelType); this.isLittleEndian = r.isLittleEndian(); if (!(pixelType == FormatTools.UINT16)) { IOFunctions.println( "SlideBook6MetaData.loadMetaData(): PixelType " + pixelTypeString + " not supported yet. Please send me an email about this: stephan.preibisch@gmx.de - stopping."); r.close(); return false; } //printMetaData( r ); } catch (Exception e) { IOFunctions.println("File '" + sldFile.getAbsolutePath() + "' could not be opened: " + e); IOFunctions.println("Stopping"); e.printStackTrace(); try { r.close(); } catch (IOException e1) { e1.printStackTrace(); } return false; } final Hashtable<String, Object> metaData = r.getGlobalMetadata(); final int numCaptures = r.getSeriesCount(); captures = new SlideBook6Image[numCaptures]; // only one debug ouput boolean printMetadata = false; Object tmp; try { for (int i = 0; i < captures.length; ++i) { r.setSeries(i); captures[i] = new SlideBook6Image(); final MetadataRetrieve retrieve = (MetadataRetrieve) r.getMetadataStore(); final int w = r.getSizeX(); final int h = r.getSizeY(); final int d = r.getSizeZ(); captures[i].imageSize = new int[]{w, h, d}; captures[i].numT = r.getSizeT(); captures[i].name = retrieve.getImageName(i); try { captures[i].objective = retrieve.getObjectiveSettingsID(i); } catch (Exception e) { IOFunctions.println("An error occured parsing the objective used: " + e + "\n. Proceeding."); captures[i].objective = "Unknown Objective"; printMetadata = true; } try { captures[i].channels = new String[r.getSizeC()]; for (int c = 0; c < r.getSizeC(); ++c) { captures[i].channels[c] = retrieve.getChannelName(i, c); } } catch (Exception e) { IOFunctions.println("An error occured parsing the channels: " + e + "\n. Proceeding."); for (int c = 0; c < r.getSizeC(); ++c) captures[i].channels[c] = String.valueOf(c); printMetadata = true; } try { String info = retrieve.getImageDescription(i); if (info.indexOf("stage") != -1) { captures[i].stageScan = true; } } catch (Exception e) { IOFunctions.println("An error occured parsing the info text for 'stage': " + e + "\n. Proceeding."); printMetadata = true; } try { float cal = 0; Length f = retrieve.getPixelsPhysicalSizeX(0); if (f != null) cal = f.value().floatValue(); if (cal == 0) { cal = 1; IOFunctions.println("SlideBook6: Warning, calibration for dimension X seems corrupted, setting to 1."); } captures[i].calX = cal; f = retrieve.getPixelsPhysicalSizeY(0); if (f != null) cal = f.value().floatValue(); if (cal == 0) { cal = 1; IOFunctions.println("SlideBook6: Warning, calibration for dimension Y seems corrupted, setting to 1."); } captures[i].calY = cal; f = retrieve.getPixelsPhysicalSizeZ(0); if (f != null) cal = f.value().floatValue(); if (cal == 0) { cal = 1; IOFunctions.println("SlideBook6: Warning, calibration for dimension Z seems corrupted, setting to 1."); } captures[i].calZ = cal; } catch (Exception e) { IOFunctions.println("An error occured parsing the calibration: " + e + "\n. Proceeding."); captures[i].calX = captures[i].calY = captures[i].calZ = 1; printMetadata = true; } } } catch (Exception e) { IOFunctions.println("An error occured parsing the main meta data: " + e + ". Stopping."); e.printStackTrace(); printMetaData(r); try { r.close(); } catch (IOException e1) { e1.printStackTrace(); } return false; } if (printMetadata) printMetaData(r); if (!keepFileOpen) try { r.close(); } catch (IOException e) { e.printStackTrace(); } else this.r = r; return true; } private static void printMetaData( final IFormatReader r ) { printMetaData( r.getGlobalMetadata() ); } private static void printMetaData( final Hashtable< String, Object > metaData ) { ArrayList< String > entries = new ArrayList<>(); for ( final String s : metaData.keySet() ) entries.add( "'" + s + "': " + metaData.get( s ) ); Collections.sort( entries ); for ( final String s : entries ) System.out.println( s ); } }