diff --git a/src/main/java/jp/riken/neurodata/tools/BioFormatsImageInfo.java b/src/main/java/jp/riken/neurodata/tools/BioFormatsImageInfo.java index c37421f..632262b 100644 --- a/src/main/java/jp/riken/neurodata/tools/BioFormatsImageInfo.java +++ b/src/main/java/jp/riken/neurodata/tools/BioFormatsImageInfo.java @@ -24,257 +24,259 @@ import loci.formats.tools.ImageInfo; public class BioFormatsImageInfo { - protected static Map readImages(final IFormatReader reader) throws FormatException, IOException { - final Map metadata = new LinkedHashMap(); + protected static Map readImages(final IFormatReader reader) throws FormatException, IOException { + final Map metadata = new LinkedHashMap(); - // read basic metadata - final int seriesCount = reader.getSeriesCount(); - final MetadataStore ms = reader.getMetadataStore(); - final MetadataRetrieve mr = ms instanceof MetadataRetrieve ? (MetadataRetrieve) ms : null; - for (int j = 0; j < seriesCount; j++) { + // read basic metadata + final int seriesCount = reader.getSeriesCount(); + final MetadataStore ms = reader.getMetadataStore(); + final MetadataRetrieve mr = ms instanceof MetadataRetrieve ? (MetadataRetrieve) ms : null; + for (int j = 0; j < seriesCount; j++) { - // read basic metadata for series #j - reader.setSeries(j); - final Map seriesMetadata = new LinkedHashMap(); + // read basic metadata for series #j + reader.setSeries(j); + final Map seriesMetadata = new LinkedHashMap(); - final int imageCount = reader.getImageCount(); - final int resolutionCount = reader.getResolutionCount(); - final String seriesName = mr == null ? null : mr.getImageName(j); - if (seriesName != null) { - seriesMetadata.put("name", seriesName); - } + final int imageCount = reader.getImageCount(); + final int resolutionCount = reader.getResolutionCount(); + final String seriesName = mr == null ? null : mr.getImageName(j); + if (seriesName != null) { + seriesMetadata.put("name", seriesName); + } - // resolutions - if (resolutionCount > 1) { - final Map resolutionsMetadata = new LinkedHashMap(); - for (int i = 0; i < resolutionCount; i++) { - reader.setResolution(i); - resolutionsMetadata.put(String.format("resolution[%d]", i), - makeRectangle(reader.getSizeX(), reader.getSizeY())); + // resolutions + if (resolutionCount > 1) { + final Map resolutionsMetadata = new LinkedHashMap(); + for (int i = 0; i < resolutionCount; i++) { + reader.setResolution(i); + resolutionsMetadata.put(String.format("resolution[%d]", i), + makeRectangle(reader.getSizeX(), reader.getSizeY())); + } + seriesMetadata.put("resolutions", resolutionsMetadata); + reader.setResolution(0); + } + + seriesMetadata.put("imageCount", imageCount); + seriesMetadata.put("RGB", new Object[] { reader.isRGB(), reader.getRGBChannelCount() }); + seriesMetadata.put("interleaved", reader.isInterleaved()); + + // indexed + { + final List indexed = new ArrayList(); + indexed.add(reader.isIndexed()); + indexed.add(String.format("%b color", !reader.isFalseColor())); + final byte[][] table8 = reader.get8BitLookupTable(); + if (table8 != null) { + indexed.add( + String.format("8-bit LUT: %d x %s", table8.length, + table8[0] == null ? "null" : "" + table8[0].length)); + } + final short[][] table16 = reader.get16BitLookupTable(); + if (table16 != null) { + indexed.add(String.format("16-bit LUT: %d x %s", table16.length, + table16[0] == null ? "null" : "" + table16[0].length)); + } + seriesMetadata.put("indexed", indexed); + } + + seriesMetadata.put("sizeX", reader.getSizeX()); + seriesMetadata.put("sizeY", reader.getSizeY()); + final int sizeZ = reader.getSizeZ(); + seriesMetadata.put("sizeZ", makeDimension(sizeZ, sizeZ, reader.getModuloZ())); + seriesMetadata.put("sizeC", + makeDimension(reader.getSizeC(), reader.getEffectiveSizeC(), reader.getModuloC())); + final int sizeT = reader.getSizeT(); + seriesMetadata.put("sizeT", makeDimension(sizeT, sizeT, reader.getModuloT())); + seriesMetadata.put("tileSize", makeRectangle(reader.getOptimalTileWidth(), reader.getOptimalTileHeight())); + seriesMetadata.put("thumbnailSize", makeRectangle(reader.getThumbSizeX(), reader.getThumbSizeY())); + seriesMetadata.put("endianness", reader.isLittleEndian() ? "little" : "big"); + seriesMetadata.put("dimensionOrder", + new String[] { reader.getDimensionOrder(), reader.isOrderCertain() ? "certain" : "uncertain" }); + seriesMetadata.put("pixelType", FormatTools.getPixelTypeString(reader.getPixelType())); + seriesMetadata.put("validBitsPerPixel", reader.getBitsPerPixel()); + seriesMetadata.put("metadataComplete", reader.isMetadataComplete()); + seriesMetadata.put("thumbnailSeries", reader.isThumbnailSeries()); + + // plane + { + final int[] indices; + if (imageCount > 6) { + int q = imageCount / 2; + indices = new int[] { 0, q - 2, q - 1, q, q + 1, q + 2, imageCount - 1 }; + } else if (imageCount > 2) { + indices = new int[] { 0, imageCount / 2, imageCount - 1 }; + } else if (imageCount > 1) { + indices = new int[] { 0, 1 }; + } else { + indices = new int[] { 0 }; + } + final int[][] zct = new int[indices.length][]; + final int[] indices2 = new int[indices.length]; + for (int i = 0; i < indices.length; i++) { + zct[i] = reader.getZCTCoords(indices[i]); + indices2[i] = reader.getIndex(zct[i][0], zct[i][1], zct[i][2]); + final Map planeMetadata = new LinkedHashMap(); + planeMetadata.put("Z", zct[i][0]); + planeMetadata.put("C", zct[i][1]); + planeMetadata.put("T", zct[i][2]); + if (indices[i] != indices2[i]) { + planeMetadata.put("[mismatch]", indices2[i]); + } + seriesMetadata.put(String.format("plane[%d]", indices[i]), planeMetadata); + } + } + metadata.put(String.format("series[%d]", j), seriesMetadata); } - seriesMetadata.put("resolutions", resolutionsMetadata); - reader.setResolution(0); - } - seriesMetadata.put("imageCount", imageCount); - seriesMetadata.put("RGB", new Object[] { reader.isRGB(), reader.getRGBChannelCount() }); - seriesMetadata.put("interleaved", reader.isInterleaved()); + return metadata; + } - // indexed - { - final List indexed = new ArrayList(); - indexed.add(reader.isIndexed()); - indexed.add(String.format("%b color", !reader.isFalseColor())); - final byte[][] table8 = reader.get8BitLookupTable(); - if (table8 != null) { - indexed.add( - String.format("8-bit LUT: %d x %s", table8.length, table8[0] == null ? "null" : "" + table8[0].length)); + protected static Map readAnnotations(final IFormatReader reader) { + final Map metadata = new LinkedHashMap(); + // global metadata + final Hashtable globalMetadata = reader.getGlobalMetadata(); + for (String key : MetadataTools.keys(globalMetadata)) { + metadata.put(key, globalMetadata.get(key)); } - final short[][] table16 = reader.get16BitLookupTable(); - if (table16 != null) { - indexed.add(String.format("16-bit LUT: %d x %s", table16.length, - table16[0] == null ? "null" : "" + table16[0].length)); + // original metadata + final int seriesCount = reader.getSeriesCount(); + for (int j = 0; j < seriesCount; j++) { + reader.setSeries(j); + final Hashtable seriesMagedata = reader.getSeriesMetadata(); + if (!seriesMagedata.isEmpty()) { + final Map seriesMetadata = new LinkedHashMap(); + final String[] keys = MetadataTools.keys(seriesMagedata); + for (int i = 0; i < keys.length; i++) { + seriesMetadata.put(keys[i], seriesMagedata.get(keys[i])); + } + metadata.put(String.format("series[%d]", j), seriesMetadata); + } } - seriesMetadata.put("indexed", indexed); - } - seriesMetadata.put("sizeX", reader.getSizeX()); - seriesMetadata.put("sizeY", reader.getSizeY()); - final int sizeZ = reader.getSizeZ(); - seriesMetadata.put("sizeZ", makeDimension(sizeZ, sizeZ, reader.getModuloZ())); - seriesMetadata.put("sizeC", makeDimension(reader.getSizeC(), reader.getEffectiveSizeC(), reader.getModuloC())); - final int sizeT = reader.getSizeT(); - seriesMetadata.put("sizeT", makeDimension(sizeT, sizeT, reader.getModuloT())); - seriesMetadata.put("tileSize", makeRectangle(reader.getOptimalTileWidth(), reader.getOptimalTileHeight())); - seriesMetadata.put("thumbnailSize", makeRectangle(reader.getThumbSizeX(), reader.getThumbSizeY())); - seriesMetadata.put("endianness", reader.isLittleEndian() ? "little" : "big"); - seriesMetadata.put("dimensionOrder", - new String[] { reader.getDimensionOrder(), reader.isOrderCertain() ? "certain" : "uncertain" }); - seriesMetadata.put("pixelType", FormatTools.getPixelTypeString(reader.getPixelType())); - seriesMetadata.put("validBitsPerPixel", reader.getBitsPerPixel()); - seriesMetadata.put("metadataComplete", reader.isMetadataComplete()); - seriesMetadata.put("thumbnailSeries", reader.isThumbnailSeries()); + return metadata; + } - // plane - { - final int[] indices; - if (imageCount > 6) { - int q = imageCount / 2; - indices = new int[] { 0, q - 2, q - 1, q, q + 1, q + 2, imageCount - 1 }; - } else if (imageCount > 2) { - indices = new int[] { 0, imageCount / 2, imageCount - 1 }; - } else if (imageCount > 1) { - indices = new int[] { 0, 1 }; - } else { - indices = new int[] { 0 }; + protected static Object makeDimension(final int size, final int effSize, final Modulo modulo) { + final int mLength = modulo.length(); + if (size == effSize && mLength == 1) { + return size; } - final int[][] zct = new int[indices.length][]; - final int[] indices2 = new int[indices.length]; - for (int i = 0; i < indices.length; i++) { - zct[i] = reader.getZCTCoords(indices[i]); - indices2[i] = reader.getIndex(zct[i][0], zct[i][1], zct[i][2]); - final Map planeMetadata = new LinkedHashMap(); - planeMetadata.put("Z", zct[i][0]); - planeMetadata.put("C", zct[i][1]); - planeMetadata.put("T", zct[i][2]); - if (indices[i] != indices2[i]) { - planeMetadata.put("[mismatch]", indices2[i]); - } - seriesMetadata.put(String.format("plane[%d]", indices[i]), planeMetadata); + final List ret = new ArrayList(); + ret.add(size); + if (size != effSize) { + ret.add(String.format("(effectively %d)", effSize)); } - } - metadata.put(String.format("series[%d]", j), seriesMetadata); - } - - return metadata; - } - - protected static Map readAnnotations(final IFormatReader reader) { - final Map metadata = new LinkedHashMap(); - // global metadata - final Hashtable globalMetadata = reader.getGlobalMetadata(); - for (String key : MetadataTools.keys(globalMetadata)) { - metadata.put(key, globalMetadata.get(key)); - } - // original metadata - final int seriesCount = reader.getSeriesCount(); - for (int j = 0; j < seriesCount; j++) { - reader.setSeries(j); - final Hashtable seriesMagedata = reader.getSeriesMetadata(); - if (!seriesMagedata.isEmpty()) { - final Map seriesMetadata = new LinkedHashMap(); - final String[] keys = MetadataTools.keys(seriesMagedata); - for (int i = 0; i < keys.length; i++) { - seriesMetadata.put(keys[i], seriesMagedata.get(keys[i])); + if (mLength != 1) { + ret.add(String.format("(%d %s x %d %s)", size / mLength, modulo.parentType, mLength, modulo.type)); } - metadata.put(String.format("series[%d]", j), seriesMetadata); - } + + return ret; } - return metadata; - } + protected static Map makeRectangle(final int width, final int height) { + final Map ret = new LinkedHashMap(); + ret.put("width", width); + ret.put("height", height); - protected static Object makeDimension(final int size, final int effSize, final Modulo modulo) { - final int mLength = modulo.length(); - if (size == effSize && mLength == 1) { - return size; - } - final List ret = new ArrayList(); - ret.add(size); - if (size != effSize) { - ret.add(String.format("(effectively %d)", effSize)); - } - if (mLength != 1) { - ret.add(String.format("(%d %s x %d %s)", size / mLength, modulo.parentType, mLength, modulo.type)); + return ret; } - return ret; - } - - protected static Map makeRectangle(final int width, final int height) { - final Map ret = new LinkedHashMap(); - ret.put("width", width); - ret.put("height", height); - - return ret; - } - - protected static String getJsonString(final Map map) { - final ObjectMapper mapper = new ObjectMapper(); - String json = null; - try { - // json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map); - json = mapper.writeValueAsString(map); - } catch (final Throwable e) { - // return "null" if conversion error occured - json = "null"; - } - - return json; - } - - public static String readMetadata(final String path, final Map metadata) - throws BioFormatsImageException { - if (FilenameUtils.getExtension(path).toLowerCase().equals("zip")) { - // ignore if file is zip archive - throw new BioFormatsImageException("Zip is not supported"); - } - String format = ""; - final ImageInfo info = new ImageInfo(); - final IFormatReader reader = new ImageReader(); - try { - // info.parseArgs(new String[] { path, "-nopix", "-noflat", "-omexml" }); - info.parseArgs(new String[] { path, "-nopix", "-noflat" }); - info.setReader(reader); - info.mapLocation(); - info.configureReaderPreInit(); - - // initialize reader - reader.setId(path); - format = reader.getFormat(); - info.configureReaderPostInit(); - info.checkWarnings(); - // info.printOMEXML(); - // info.readCoreMetadata(); - metadata.put("images", readImages(reader)); - info.initPreMinMaxValues(); - reader.setSeries(0); - reader.setResolution(0); - // info.printGlobalMetadata(); - // info.printOriginalMetadata(); - final Map annotations = readAnnotations(reader); - if (!annotations.isEmpty()) { - metadata.put("annotations", annotations); - } - } catch (final Throwable e) { - throw new BioFormatsImageException(e); - } finally { - if (reader != null) { + protected static String getJsonString(final Map map) { + final ObjectMapper mapper = new ObjectMapper(); + String json = null; try { - reader.close(); - } catch (final IOException e) { - throw new BioFormatsImageException(e); + // json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(map); + json = mapper.writeValueAsString(map); + } catch (final Throwable e) { + // return "null" if conversion error occured + json = "null"; } - } + + return json; } - return format; - } + public static String readMetadata(final String path, final Map metadata) + throws BioFormatsImageException { + if (FilenameUtils.getExtension(path).toLowerCase().equals("zip")) { + // ignore if file is zip archive + throw new BioFormatsImageException("Zip is not supported"); + } + String format = ""; + final ImageInfo info = new ImageInfo(); + final IFormatReader reader = new ImageReader(); + try { + // info.parseArgs(new String[] { path, "-nopix", "-noflat", "-omexml" }); + info.parseArgs(new String[] { path, "-nopix", "-noflat" }); + info.setReader(reader); + info.mapLocation(); + info.configureReaderPreInit(); - // -- Main method -- - public static void main(final String[] args) { - boolean status = true; - String message = ""; - String format = ""; - final Map metadata = new LinkedHashMap(); - final Map thumbnail = new LinkedHashMap(); - if (args.length != 1) { - status = false; - message = "filename argument required"; - } else { - final String path = args[0]; - try { - DebugTools.enableLogging("ERROR"); - format = readMetadata(path, metadata); - BioFormatsImageThumbnail.readThumbnail(path, thumbnail); - } catch (BioFormatsImageException e) { - status = false; - message = e.getMessage(); - metadata.clear(); - thumbnail.clear(); - } + // initialize reader + reader.setId(path); + format = reader.getFormat(); + info.configureReaderPostInit(); + info.checkWarnings(); + // info.printOMEXML(); + // info.readCoreMetadata(); + metadata.put("images", readImages(reader)); + info.initPreMinMaxValues(); + reader.setSeries(0); + reader.setResolution(0); + // info.printGlobalMetadata(); + // info.printOriginalMetadata(); + final Map annotations = readAnnotations(reader); + if (!annotations.isEmpty()) { + metadata.put("annotations", annotations); + } + } catch (final Throwable e) { + throw new BioFormatsImageException(e); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (final IOException e) { + throw new BioFormatsImageException(e); + } + } + } + + return format; } - final Map results = new LinkedHashMap(); - results.put("status", status); - results.put("message", message); - results.put("format", format); - results.put("thumbnail", thumbnail.isEmpty() ? null : thumbnail); - results.put("metadata", metadata.isEmpty() ? null : metadata); - System.out.println(getJsonString(results)); + // -- Main method -- + public static void main(final String[] args) { + boolean status = true; + String message = ""; + String format = ""; + final Map metadata = new LinkedHashMap(); + final Map thumbnail = new LinkedHashMap(); + if (args.length != 1) { + status = false; + message = "filename argument required"; + } else { + final String path = args[0]; + try { + DebugTools.enableLogging("ERROR"); + format = readMetadata(path, metadata); + BioFormatsImageThumbnail.readThumbnail(path, thumbnail); + } catch (BioFormatsImageException e) { + status = false; + message = e.getMessage(); + metadata.clear(); + thumbnail.clear(); + } + } - if (!status) { - System.exit(1); + final Map results = new LinkedHashMap(); + results.put("status", status); + results.put("message", message); + results.put("format", format); + results.put("thumbnail", thumbnail.isEmpty() ? null : thumbnail); + results.put("metadata", metadata.isEmpty() ? null : metadata); + System.out.println(getJsonString(results)); + + if (!status) { + System.exit(1); + } } - } }