Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix issues #100

Merged
merged 4 commits into from
Jan 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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");
}
}
}
Loading