From e67e9d0564c4e09938700bc2c10f1f2a23e20684 Mon Sep 17 00:00:00 2001 From: hahmann Date: Tue, 10 Mar 2026 10:58:22 +0100 Subject: [PATCH] Use a copy of axes in reversed order in OME Zarr v0.5 MultiscalesAdapter * Add a new method reversedCopy() to MetadataUtils * Add corresponding unit test --- .../n5/universe/metadata/MetadataUtils.java | 15 +++++++++ .../ome/ngff/v05/MultiscalesAdapter.java | 6 ++-- .../universe/metadata/MetadataUtilsTest.java | 32 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/test/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtilsTest.java diff --git a/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtils.java b/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtils.java index ea335137..b0ced13c 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtils.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtils.java @@ -520,4 +520,19 @@ public static N5SingleScaleMetadata permuteN5vMetadata(final N5SingleScaleMetada } + /** + * Creates a new array containing all elements of the input array in reversed order. + * + * @param the type of elements in the array + * @param array the input array to be reversed + * @return a new array with elements in reversed order compared to the input array + */ + public static < T > T[] reversedCopy( T[] array ) + { + T[] result = array.clone(); + for ( int i = 0, j = array.length - 1; i < array.length; i++, j-- ) + result[ i ] = array[ j ]; + return result; + } + } diff --git a/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/ome/ngff/v05/MultiscalesAdapter.java b/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/ome/ngff/v05/MultiscalesAdapter.java index ae894620..3f7e5aaa 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/ome/ngff/v05/MultiscalesAdapter.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/universe/metadata/ome/ngff/v05/MultiscalesAdapter.java @@ -27,14 +27,15 @@ public OmeNgffMultiScaleMetadata deserialize( final JsonElement json, final Type final String type = MetadataUtils.getStringNullable(jobj.get("type")); final String version = "0.5"; - final Axis[] axes = context.deserialize(jobj.get("axes"), Axis[].class); + final Axis[] axes = context.deserialize( jobj.get( "axes" ), Axis[].class ); + final Axis[] axesInReverseOrder = MetadataUtils.reversedCopy( axes ); final OmeNgffDataset[] datasets = context.deserialize(jobj.get("datasets"), OmeNgffDataset[].class); final CoordinateTransformation[] coordinateTransformations = context .deserialize(jobj.get("coordinateTransformations"), CoordinateTransformation[].class); final OmeNgffDownsamplingMetadata metadata = context.deserialize(jobj.get("metadata"), OmeNgffDownsamplingMetadata.class); - return new OmeNgffMultiScaleMetadata(axes.length, "", name, type, version, axes, datasets, null, + return new OmeNgffMultiScaleMetadata( axesInReverseOrder.length, "", name, type, version, axesInReverseOrder, datasets, null, coordinateTransformations, metadata, false); } @@ -62,5 +63,4 @@ public JsonElement serialize( final OmeNgffMultiScaleMetadata src, final Type ty return obj; } - } diff --git a/src/test/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtilsTest.java b/src/test/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtilsTest.java new file mode 100644 index 00000000..b8a0903f --- /dev/null +++ b/src/test/java/org/janelia/saalfeldlab/n5/universe/metadata/MetadataUtilsTest.java @@ -0,0 +1,32 @@ +package org.janelia.saalfeldlab.n5.universe.metadata; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +public class MetadataUtilsTest +{ + @Test + public void testReversedCopyWithStrings() + { + String[] input = { "apple", "banana", "cherry" }; + String[] expected = { "cherry", "banana", "apple" }; + assertArrayEquals( expected, MetadataUtils.reversedCopy( input ) ); + } + + @Test + public void testReversedCopyWithIntegers() + { + Integer[] input = { 1, 2, 3, 4, 5 }; + Integer[] expected = { 5, 4, 3, 2, 1 }; + assertArrayEquals( expected, MetadataUtils.reversedCopy( input ) ); + } + + @Test + public void testReversedCopyWithEmptyArray() + { + String[] input = {}; + String[] expected = {}; + assertArrayEquals( expected, MetadataUtils.reversedCopy( input ) ); + } +}