diff --git a/.github/workflows/build-main.yml b/.github/workflows/build-main.yml index e7488cd..c9e05b8 100644 --- a/.github/workflows/build-main.yml +++ b/.github/workflows/build-main.yml @@ -18,7 +18,7 @@ jobs: sudo apt-get update sudo apt-get install -y libblosc1 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '8' distribution: 'zulu' diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 0bcda3d..cff9ce9 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -16,7 +16,7 @@ jobs: sudo apt-get update sudo apt-get install -y libblosc1 - name: Set up Java - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '8' distribution: 'zulu' diff --git a/.github/workflows/platform-test.yml b/.github/workflows/platform-test.yml index 019f001..9cac328 100644 --- a/.github/workflows/platform-test.yml +++ b/.github/workflows/platform-test.yml @@ -35,7 +35,7 @@ jobs: pip install blosc --no-input --target src/test/resources mv src/test/resources/lib64/* src/test/resources - name: Set up Java - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: java-version: '8' distribution: 'zulu' diff --git a/pom.xml b/pom.xml index 76c80a8..c001cc3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,12 +5,12 @@ org.scijava pom-scijava - 38.0.1 + 43.0.0 org.janelia.saalfeldlab n5-viewer_fiji - 6.1.3-SNAPSHOT + 6.1.3-alpha-4-SNAPSHOT N5 Viewer for Fiji BigDataViewer-based visualization tool for N5 datasets @@ -134,13 +134,16 @@ 10.6.1 1.0.0-beta-36 - 7.1.1 - 3.3.0 - 4.2.1 - 4.1.1 - 4.2.5 - 7.0.2 - 1.6.0 + 4.0.0-alpha-10 + 4.4.0-alpha-7 + 2.0.0-alpha-4 + 5.2.0-alpha-6 + 2.3.0-alpha-6 + 4.5.0-alpha-6 + 7.1.0-alpha-7 + 2.4.0-alpha-7 + 2.0.0-alpha-7 + 2.0.0-alpha-4 diff --git a/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5Viewer.java b/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5Viewer.java index 55f8781..620751b 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5Viewer.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5Viewer.java @@ -80,6 +80,7 @@ import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v04.NgffSingleScaleAxesMetadata; import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v04.OmeNgffMetadata; import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v04.OmeNgffMultiScaleMetadata; +import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v05.OmeNgffV05Metadata; import org.scijava.ui.behaviour.io.InputTriggerConfig; import org.scijava.ui.behaviour.util.Actions; import org.scijava.ui.behaviour.util.InputActionBindings; @@ -543,6 +544,12 @@ public static & NativeType, V extends Volatile & .sort(multiScaleDataset.getPaths(), multiScaleDataset.spatialTransforms3d()); datasetsToOpen = msd.getPaths(); transforms = msd.getTransforms(); + } else if (metadata instanceof OmeNgffV05Metadata) { + final OmeNgffV05Metadata multiScaleDataset = (OmeNgffV05Metadata)metadata; + final MultiscaleDatasets msd = MultiscaleDatasets + .sort(multiScaleDataset.getPaths(), multiScaleDataset.spatialTransforms3d()); + datasetsToOpen = msd.getPaths(); + transforms = msd.getTransforms(); } else if (metadata instanceof N5CosemMultiScaleMetadata) { final N5CosemMultiScaleMetadata multiScaleDataset = (N5CosemMultiScaleMetadata)metadata; final MultiscaleDatasets msd = MultiscaleDatasets @@ -722,7 +729,7 @@ protected static & NativeType> RandomAccessibleInte final N5Reader n5, final String dataset) { final CachedCellImg img = N5Utils.openVolatile(n5, dataset); - final Object t = Util.getTypeFromInterval(img); + final Object t = img.getType(); if( t instanceof LabelMultisetType ) { final CachedCellImg lmsImg = (CachedCellImg)img; diff --git a/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5ViewerCreator.java b/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5ViewerCreator.java index fd59284..f9b169d 100644 --- a/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5ViewerCreator.java +++ b/src/main/java/org/janelia/saalfeldlab/n5/bdv/N5ViewerCreator.java @@ -1,15 +1,20 @@ package org.janelia.saalfeldlab.n5.bdv; import java.io.IOException; +import java.util.Collections; +import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.Consumer; +import javax.swing.JTree; + import org.janelia.saalfeldlab.n5.ij.N5Importer; import org.janelia.saalfeldlab.n5.metadata.N5ViewerMultichannelMetadata; import org.janelia.saalfeldlab.n5.metadata.imagej.ImagePlusLegacyMetadataParser; import org.janelia.saalfeldlab.n5.ui.DataSelection; import org.janelia.saalfeldlab.n5.ui.DatasetSelectorDialog; +import org.janelia.saalfeldlab.n5.ui.N5SwingTreeNode; import org.janelia.saalfeldlab.n5.universe.metadata.N5CosemMetadataParser; import org.janelia.saalfeldlab.n5.universe.metadata.N5CosemMultiScaleMetadata; import org.janelia.saalfeldlab.n5.universe.metadata.N5GenericSingleScaleMetadataParser; @@ -18,6 +23,7 @@ import org.janelia.saalfeldlab.n5.universe.metadata.N5ViewerMultiscaleMetadataParser; import org.janelia.saalfeldlab.n5.universe.metadata.canonical.CanonicalMetadataParser; import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v04.OmeNgffMetadataParser; +import org.janelia.saalfeldlab.n5.universe.metadata.ome.ngff.v05.OmeNgffV05MetadataParser; import ij.ImageJ; @@ -33,6 +39,7 @@ public class N5ViewerCreator { public static final N5MetadataParser[] n5vGroupParsers = new N5MetadataParser[]{ + new OmeNgffV05MetadataParser(), new OmeNgffMetadataParser(), new N5CosemMultiScaleMetadata.CosemMultiScaleParser(), new N5ViewerMultiscaleMetadataParser(), @@ -50,6 +57,8 @@ public class N5ViewerCreator { new N5GenericSingleScaleMetadataParser() }; + private DatasetSelectorDialog dialog; + private String lastOpenedContainer = ""; final public static void main(final String... args) { @@ -112,7 +121,7 @@ public void openViewer( final Consumer cancelConsumer) { final ExecutorService exec = Executors.newFixedThreadPool(ij.Prefs.getThreads()); - final DatasetSelectorDialog dialog = new DatasetSelectorDialog( + dialog = new DatasetSelectorDialog( new N5Importer.N5ViewerReaderFun(), new N5Importer.N5BasePathFun(), lastOpenedContainer, @@ -138,4 +147,52 @@ public void openViewer( } }); } + + public void runWithDialog(final String pathToContainer, final List selectThisSubPath) { + + lastOpenedContainer = pathToContainer; + dialog = null; + openViewer((e) -> e.printStackTrace()); + if (dialog == null) { + throw new RuntimeException("The \"Open N5\" didn't come up when it should."); + } else { + dialog.detectDatasets(); + if (selectThisSubPath != null) { + boolean isDiscoveryFinished = dialog.waitUntilDiscoveryIsFinished(60000); + if (isDiscoveryFinished) + selectTreeItem(selectThisSubPath); + } + } + } + + public void runWithDialog( final String pathToContainer ) + { + runWithDialog( pathToContainer, Throwable::printStackTrace ); + } + + public void runWithDialog( final String pathToContainer, final Consumer< Exception > exceptionHandler ) + { + lastOpenedContainer = pathToContainer; + dialog = null; + openViewer( exceptionHandler ); + dialog.openContainer( pathToContainer ); + } + + private void selectTreeItem(final List itemPath) { + + final JTree t = dialog.getJTree(); + int currRow = 0; + for (String subPath : itemPath) { + for (int r = currRow; r < t.getRowCount(); ++r, ++currRow) { + N5SwingTreeNode n = (N5SwingTreeNode)t.getPathForRow(r).getLastPathComponent(); + if (n.getNodeName().equals(subPath)) { + t.expandRow(r); + t.setSelectionRow(r); + ++currRow; + break; + } + } + } + } + } diff --git a/src/test/java/org/janelia/saalfeldlab/n5/bdv/N5vAxisPermutationTests.java b/src/test/java/org/janelia/saalfeldlab/n5/bdv/N5vAxisPermutationTests.java index 9122560..401d40c 100644 --- a/src/test/java/org/janelia/saalfeldlab/n5/bdv/N5vAxisPermutationTests.java +++ b/src/test/java/org/janelia/saalfeldlab/n5/bdv/N5vAxisPermutationTests.java @@ -22,6 +22,7 @@ import org.janelia.saalfeldlab.n5.universe.N5DatasetDiscoverer; import org.janelia.saalfeldlab.n5.universe.N5Factory; import org.janelia.saalfeldlab.n5.universe.N5TreeNode; +import org.janelia.saalfeldlab.n5.universe.StorageFormat; import org.janelia.saalfeldlab.n5.universe.metadata.N5Metadata; import org.janelia.saalfeldlab.n5.universe.metadata.NgffTests; import org.junit.After; @@ -83,11 +84,10 @@ protected String tempN5Location() throws URISyntaxException { @Test public void testPermutations() throws IOException { - final N5Writer zarr = new N5Factory().openWriter(containerUri.toString()); + final N5Writer zarr = new N5Factory().openWriter(StorageFormat.ZARR2, containerUri.toString()); // don't check every axis permutation, but some relevant ones, and some strange ones final String[] names = new String[]{ - // TODO five still don't work "xyz", "zyx", "yzx", "xyc", "xcy", "cyx", "xyt", "xty", "tyx", @@ -145,10 +145,6 @@ protected & NativeType> void writeAndTest(final N5W final AffineTransform3D tform = new AffineTransform3D(); src.getSourceTransform(0, 0, tform); - // System.out.println(""); - // System.out.println("" + sourcesAndConverters.size()); - // System.out.println(""); - // test assertEquals(dset + "size x", NgffTests.NX, dims[0]); assertEquals(dset + "size y", NgffTests.NY, dims[1]);