diff --git a/rtd_cina/source/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractor.java b/rtd_cina/source/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractor.java index d8a06376d7044a65b13ef50edb6677b56df12782..e9fa775a4aa17aa563d3488e8bc9ec27cf6c4320 100644 --- a/rtd_cina/source/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractor.java +++ b/rtd_cina/source/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractor.java @@ -18,13 +18,17 @@ package ch.systemsx.cisd.cina.shared.metadata; import java.io.File; import java.util.HashMap; -import java.util.List; import java.util.Map; import ch.systemsx.cisd.cina.shared.labview.Cluster; +import ch.systemsx.cisd.cina.shared.labview.DBL; +import ch.systemsx.cisd.cina.shared.labview.EW; import ch.systemsx.cisd.cina.shared.labview.LVData; +import ch.systemsx.cisd.cina.shared.labview.LVDataBoolean; import ch.systemsx.cisd.cina.shared.labview.LVDataParser; import ch.systemsx.cisd.cina.shared.labview.LVDataString; +import ch.systemsx.cisd.cina.shared.labview.U32; +import ch.systemsx.cisd.cina.shared.labview.U8; /** * Class for extracting the metadata from a folder containing an image + metadata. @@ -33,12 +37,22 @@ import ch.systemsx.cisd.cina.shared.labview.LVDataString; */ public class ImageMetadataExtractor { - private final Map<String, String> metadata; + private final Map<String, String> metadataMap; private final File folder; + private LVData lvdata; + private static final String METADATA_FILE_NAME = "metadata.xml"; + private static final HashMap<String, String> prefixMap; + static + { + prefixMap = new HashMap<String, String>(); + prefixMap.put("Pixelsize (nm)", "Size"); + prefixMap.put("Image dimension (px)", "Dimension"); + } + /** * Create an image metadata with a parent metadata. * @@ -47,19 +61,27 @@ public class ImageMetadataExtractor */ public ImageMetadataExtractor(Map<String, String> parentMetadata, File folder) { - this.metadata = new HashMap<String, String>(parentMetadata); + this.metadataMap = new HashMap<String, String>(parentMetadata); this.folder = folder; } - public Map<String, String> getMetadata() + /** + * Get the metadata extracted from the file in the form of a hash map. Parse must be called + * before getting the metadata. + */ + public Map<String, String> getMetadataMap() { - return metadata; + assert lvdata != null; + return metadataMap; } + /** + * Parse the metadata file. + */ public void parse() { File metadataFile = new File(folder, METADATA_FILE_NAME); - LVData lvdata = LVDataParser.parse(metadataFile); + lvdata = LVDataParser.parse(metadataFile); if (null == lvdata) { throw new IllegalArgumentException("Could not parse metadata in file " @@ -73,10 +95,49 @@ public class ImageMetadataExtractor } Cluster cluster = lvdata.getClusters().get(0); - List<LVDataString> lvdataStrings = cluster.getStrings(); - for (LVDataString lvdataString : lvdataStrings) + parseCluster(cluster, ""); + } + + private void parseCluster(Cluster cluster, String prefix) + { + for (LVDataString lvdataString : cluster.getStrings()) + { + metadataMap.put(prefix + lvdataString.getName(), lvdataString.getValue()); + } + + for (U8 u8 : cluster.getU8s()) + { + metadataMap.put(prefix + u8.getName(), u8.getValue().toString()); + } + + for (U32 u32 : cluster.getU32s()) + { + metadataMap.put(prefix + u32.getName(), u32.getValue().toString()); + } + + for (DBL dbl : cluster.getDbls()) + { + metadataMap.put(prefix + dbl.getName(), dbl.getValue().toString()); + } + + for (LVDataBoolean bool : cluster.getBooleans()) + { + metadataMap.put(prefix + bool.getName(), bool.getValue().toString()); + } + + for (EW ew : cluster.getEws()) + { + metadataMap.put(prefix + ew.getName(), ew.getChosenValue()); + } + + for (Cluster subcluster : cluster.getClusters()) { - metadata.put(lvdataString.getName(), lvdataString.getValue()); + String clusterPrefix = prefixMap.get(subcluster.getName()); + if (null == clusterPrefix) + { + clusterPrefix = ""; + } + parseCluster(subcluster, clusterPrefix); } } } diff --git a/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractorTest.java b/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractorTest.java index aa19c74d9075a37fcd82f02e8d10531f2cc591d8..9d3ea8c545c0cdcb63d98f69660cbea3e8a56368 100644 --- a/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractorTest.java +++ b/rtd_cina/sourceTest/java/ch/systemsx/cisd/cina/shared/metadata/ImageMetadataExtractorTest.java @@ -37,10 +37,28 @@ public class ImageMetadataExtractorTest extends AssertJUnit "sourceTest/java/ch/systemsx/cisd/cina/shared/metadata/Annotations/Replica for MRC files/MRC for Thomas/test20090422_BacklashRef.mrc"); ImageMetadataExtractor metadata = new ImageMetadataExtractor(parentMetadata, folder); metadata.parse(); - Map<String, String> metadataMap = metadata.getMetadata(); + Map<String, String> metadataMap = metadata.getMetadataMap(); + System.out.println(metadataMap); + assertEquals(16, metadataMap.size()); + assertEquals("", metadataMap.get("Annotation")); assertEquals("CM10", metadataMap.get("Microscope")); assertEquals("thomas.braun@unibas.ch", metadataMap.get("Operator")); assertEquals("test20090422_BacklashRef.mrc", metadataMap.get("Filename")); + + assertEquals("1.7691349E-5", metadataMap.get("SizeX")); + assertEquals("1.7691349E-5", metadataMap.get("SizeY")); + assertEquals("0.0", metadataMap.get("SizeZ")); + + assertEquals("2048", metadataMap.get("DimensionX")); + assertEquals("2048", metadataMap.get("DimensionY")); + assertEquals("1", metadataMap.get("DimensionZ")); + + assertEquals("false", metadataMap.get("StackFlag")); + assertEquals("false", metadataMap.get("ColorFlag")); + assertEquals("16 bit SI", metadataMap.get("Data-type")); + assertEquals("-32417.0", metadataMap.get("Min")); + assertEquals("-29705.0", metadataMap.get("Max")); + assertEquals("2", metadataMap.get("Rating")); } }