Skip to content

Commit

Permalink
Merge pull request #100 from dominikl/fix_issues
Browse files Browse the repository at this point in the history
Fix issues
  • Loading branch information
dominikl authored Jan 22, 2025
2 parents 671eabe + e65de6a commit 12edea2
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 21 deletions.
42 changes: 21 additions & 21 deletions src/loci/formats/in/ZarrReader.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

package loci.formats.in;

/*-
Expand Down Expand Up @@ -44,7 +43,6 @@
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;

import javax.xml.parsers.ParserConfigurationException;
Expand All @@ -68,17 +66,13 @@
import loci.formats.FormatReader;
import loci.formats.FormatTools;
import loci.formats.MetadataTools;
import loci.formats.in.DynamicMetadataOptions;
import loci.formats.in.MetadataOptions;
import loci.formats.meta.MetadataStore;
import loci.formats.ome.OMEXMLMetadata;
import loci.formats.services.JZarrServiceImpl;
import ome.xml.meta.MetadataConverter;
import ome.xml.meta.MetadataRoot;
import ome.xml.model.MapAnnotation;
import ome.xml.model.OME;
import ome.xml.model.Plate;
import ome.xml.model.Screen;
import ome.xml.model.StructuredAnnotations;
import ome.xml.model.primitives.NonNegativeInteger;
import ome.xml.model.primitives.PositiveInteger;
Expand Down Expand Up @@ -205,7 +199,7 @@ protected void initFile(String id) throws FormatException, IOException {
int attrIndex = 0;
if (attr != null && !attr.isEmpty()) {
parseResolutionCount(zarrRootPath, "", attr);
parseOmeroMetadata(zarrRootPath, attr);
parseOmeroMetadata(attr);
if (saveAnnotations()) {
String jsonAttr;
try {
Expand Down Expand Up @@ -903,7 +897,7 @@ private void parseImageLabels(String root, Map<String, Object> attr) throws IOEx
for (int p = 0; p < properties.size(); p++) {
Map<String, Object> prop = (Map<String, Object>) properties.get(p);
Integer labelValue = (Integer) prop.get("label-value");
Double area = (Double) prop.get("area (pixels)");
Number area = (Number) prop.get("area (pixels)");
String propClass = (String) prop.get("class");
}
}
Expand All @@ -920,7 +914,7 @@ private void parseImageLabels(String root, Map<String, Object> attr) throws IOEx
}
}

private void parseOmeroMetadata(String root, Map<String, Object> attr) throws IOException, FormatException {
public void parseOmeroMetadata(Map<String, Object> attr) throws IOException, FormatException {
Map<String, Object> omeroMetadata = (Map<String, Object>) attr.get("omero");
if (omeroMetadata != null) {
Integer id = (Integer) omeroMetadata.get("id");
Expand All @@ -930,17 +924,17 @@ private void parseOmeroMetadata(String root, Map<String, Object> attr) throws IO
for (int i = 0; i < channels.size(); i++) {
Map<String, Object> channel = (Map<String, Object>) channels.get(i);
Boolean channelActive = (Boolean) channel.get("active");
Double channelCoefficient = (Double) channel.get("coefficient");
Number channelCoefficient = (Number) channel.get("coefficient");
String channelColor = (String) channel.get("color");
String channelFamily = (String) channel.get("family");
Boolean channelInverted = (Boolean) channel.get("inverted");
String channelLabel = (String) channel.get("label");
Map<String, Object> window = (Map<String, Object>)channel.get("window");
if (window != null) {
Double windowStart = getDouble(window, "start");
Double windowEnd = getDouble(window, "end");
Double windowMin = getDouble(window, "min");
Double windowMax = getDouble(window, "max");
Number windowStart = getDouble(window, "start");
Number windowEnd = getDouble(window, "end");
Number windowMin = getDouble(window, "min");
Number windowMax = getDouble(window, "max");
}
}
Map<String, Object> rdefs = (Map<String, Object>)omeroMetadata.get("rdefs");
Expand Down Expand Up @@ -1112,7 +1106,7 @@ public static String getRowString(int rowIndex) {
return sb.reverse().toString();
}

private Double getDouble(Map<String, Object> src, String key) {
private Number getDouble(Map<String, Object> src, String key) {
Number val = (Number) src.get(key);
if (val == null) {
return null;
Expand All @@ -1125,19 +1119,25 @@ private Double getDouble(Map<String, Object> src, String key) {
public String[] getUsedFiles(boolean noPixels) {
FormatTools.assertId(currentId, true, 1);
String zarrRootPath = currentId.substring(0, currentId.indexOf(".zarr") + 5);
int rootPathLength = zarrRootPath.length();
ArrayList<String> usedFiles = new ArrayList<String>();
reloadOptionsFile(zarrRootPath);

boolean skipPixels = noPixels || !listPixels() || !systemEnvListPixels();
boolean includeLabels = includeLabels();
try (Stream<Path> paths = Files.walk(Paths.get(zarrRootPath), FileVisitOption.FOLLOW_LINKS)) {
paths.filter(Files::isRegularFile)
.forEach(path -> {if ((!skipPixels && includeLabels) ||
(!skipPixels && !includeLabels && !path.toString().toLowerCase().contains("labels")) ||
(skipPixels && includeLabels && (path.endsWith(".zgroup") || path.endsWith(".zattrs") || path.endsWith(".xml"))) ||
(skipPixels && !includeLabels && !path.toString().toLowerCase().contains("labels") &&(path.endsWith(".zgroup") || path.endsWith(".zattrs") || path.endsWith(".xml"))))
usedFiles.add(path.toFile().getAbsolutePath());
});
.forEach(path -> {
if (
(!skipPixels && includeLabels) ||
(!skipPixels && !includeLabels && (path.toString().toLowerCase().lastIndexOf("labels")<rootPathLength) ||
(skipPixels && includeLabels && (path.endsWith(".zgroup") || path.endsWith(".zattrs") || path.endsWith(".xml"))) ||
(skipPixels && !includeLabels && (path.toString().toLowerCase().lastIndexOf("labels")<rootPathLength) &&(path.endsWith(".zgroup") || path.endsWith(".zattrs") || path.endsWith(".xml")))))
{
usedFiles.add(path.toFile().getAbsolutePath());
}
}
);
} catch (IOException e) {
e.printStackTrace();
}
Expand Down
81 changes: 81 additions & 0 deletions test/loci/formats/utests/ZarrReaderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -205,4 +205,85 @@ public void testResolutionCount() {
assertEquals(3, reader.getSeriesCount());
}

@Test
public void testParseOmeroMetadataWithIntegerValues() {
Map<String, Object> omeroMetadata = new HashMap<>();
omeroMetadata.put("id", 1);
omeroMetadata.put("name", "Test Image");
omeroMetadata.put("version", "0.1");

ArrayList<Object> channels = new ArrayList<>();
Map<String, Object> channel = new HashMap<>();
channel.put("active", true);
channel.put("coefficient", 1);
channel.put("color", "FFFFFF");
channel.put("family", "linear");
channel.put("inverted", false);
channel.put("label", "Channel 1");

Map<String, Object> window = new HashMap<>();
window.put("start", 0);
window.put("end", 255);
window.put("min", 0);
window.put("max", 255);
channel.put("window", window);

channels.add(channel);
omeroMetadata.put("channels", channels);

Map<String, Object> rdefs = new HashMap<>();
rdefs.put("defaultT", 0);
rdefs.put("defaultZ", 0);
rdefs.put("model", "color");
omeroMetadata.put("rdefs", rdefs);

Map<String, Object> test = new HashMap<>();
test.put("omero", omeroMetadata);
try {
reader.parseOmeroMetadata(test);
} catch (IOException | FormatException e) {
fail("Unexpected exception while parsing Omero metadata with Integer values");
}
}

@Test
public void testParseOmeroMetadataWithDoubleValues() {
Map<String, Object> omeroMetadata = new HashMap<>();
omeroMetadata.put("id", 1);
omeroMetadata.put("name", "Test Image");
omeroMetadata.put("version", "0.1");

ArrayList<Object> channels = new ArrayList<>();
Map<String, Object> channel = new HashMap<>();
channel.put("active", true);
channel.put("coefficient", 1.0);
channel.put("color", "FFFFFF");
channel.put("family", "linear");
channel.put("inverted", false);
channel.put("label", "Channel 1");

Map<String, Object> window = new HashMap<>();
window.put("start", 0.0);
window.put("end", 255.0);
window.put("min", 0.0);
window.put("max", 255.0);
channel.put("window", window);

channels.add(channel);
omeroMetadata.put("channels", channels);

Map<String, Object> rdefs = new HashMap<>();
rdefs.put("defaultT", 0);
rdefs.put("defaultZ", 0);
rdefs.put("model", "color");
omeroMetadata.put("rdefs", rdefs);

Map<String, Object> test = new HashMap<>();
test.put("omero", omeroMetadata);
try {
reader.parseOmeroMetadata(test);
} catch (IOException | FormatException e) {
fail("Unexpected exception while parsing Omero metadata with Double values");
}
}
}

0 comments on commit 12edea2

Please sign in to comment.