Skip to content
Open
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
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
target/
!.mvn/wrapper/maven-wrapper.jar

### Notebooks ###
notebooks/*_executed.ipynb
**/.ipynb_checkpoints/
!**/src/main/**/target/
!**/src/test/**/target/

Expand Down Expand Up @@ -40,10 +44,16 @@ build/
### Custom ###
/testdata/l4_sample
/testdata/l4_sample.zip
zarr-java-core/testdata/l4_sample
zarr-java-core/testdata/l4_sample.zip
/testoutput
zarr-java-core/testoutput
zarr-java-ome/testoutput
/.python-version
/main.py
/pyproject.toml
/uv.lock
**/__pycache__
/dependency-reduced-pom.xml
zarr-java-core/dependency-reduced-pom.xml
zarr-java-ome/dependency-reduced-pom.xml
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[submodule "testdata/ome/v0.6/examples"]
path = testdata/ome/v0.6/examples
[submodule "zarr-java-ome/testdata/ome/v0.6/examples"]
path = zarr-java-ome/testdata/ome/v0.6/examples
url = https://github.com/jo-mueller/ngff-rfc5-coordinate-transformation-examples
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,31 @@ data
);
```

## Interactive Notebooks

The `notebooks/` directory contains IJava (Java kernel for Jupyter) notebooks that let you explore and verify the library interactively without publishing it.

**Prerequisites:** Java 17+, Maven 3.6+, Python 3, `curl`, `unzip`

```bash
./notebooks/start.sh
```

This single command:
1. Builds the project and installs JARs to your local Maven cache (`~/.m2`)
2. Wires up the classpath so the notebooks can import the library directly — no internet access needed for the library itself
3. Installs Jupyter and the IJava kernel into `~/.jupyter-venv` on first run (one-time, ~1 min)
4. Opens JupyterLab in your browser

Available notebooks (in `notebooks/notebooks/`):

| Notebook | Covers |
|---|---|
| `zarr_core.ipynb` | v2/v3 arrays, stores, codecs, sharding, groups, attributes, ZIP |
| `ome_zarr_integration.ipynb` | OME-Zarr v0.4/v0.5, multiscale images, HCS plates and wells |

---

## Development Start-Guide

### Run Tests Locally
Expand Down
59 changes: 44 additions & 15 deletions USERGUIDE-OME-ZARR.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,35 @@
# OME-Zarr Guide for zarr-java

## Separate module

OME-Zarr support lives in a dedicated module: **`zarr-java-ome`**.
Add it alongside the core library:

### Maven
```xml
<dependency>
<groupId>dev.zarr</groupId>
<artifactId>zarr-java-core</artifactId>
<version>0.1.3</version>
</dependency>
<dependency>
<groupId>dev.zarr</groupId>
<artifactId>zarr-java-ome</artifactId>
<version>0.1.3</version>
</dependency>
```

### Gradle
```gradle
dependencies {
implementation 'dev.zarr:zarr-java-core:0.1.3'
implementation 'dev.zarr:zarr-java-ome:0.1.3'
}
```

## Scope and supported versions

`dev.zarr.zarrjava.experimental.ome` supports:
`dev.zarr.omezarr` supports:

- v0.4 (Zarr v2 layout)
- v0.5 (Zarr v3 layout)
Expand Down Expand Up @@ -32,7 +59,7 @@ MultiscaleImage image = MultiscaleImage.open(s3);

Metadata:

- `getMultiscaleNode(int i)` → normalized `ome.metadata.MultiscalesEntry`
- `getMultiscaleNode(int i)` → normalized `omezarr.metadata.MultiscalesEntry`
- `getAxisNames()` → axis names from multiscale `0`
- `getScaleLevelCount()` → number of datasets/levels in multiscale `0`
- `getLabels()` / `openLabel(String)` → labels subgroup helpers
Expand Down Expand Up @@ -64,7 +91,7 @@ If you need the raw version-specific metadata model instead of normalized `Multi

## v0.6 Scene metadata

Scene roots (groups with `ome.scene`) are supported via `dev.zarr.zarrjava.experimental.ome.v0_6.Scene`:
Scene roots (groups with `ome.scene`) are supported via `dev.zarr.omezarr.v0_6.Scene`:

- `Scene.openScene(StoreHandle)` / `Scene.open(StoreHandle)`
- `Scene.createScene(StoreHandle, SceneMetadata)` / `Scene.create(...)`
Expand All @@ -79,9 +106,10 @@ Notes:
## Read example

```java
import dev.zarr.zarrjava.experimental.ome.MultiscaleImage;
import dev.zarr.zarrjava.experimental.ome.Plate;
import dev.zarr.zarrjava.experimental.ome.Well;
import dev.zarr.omezarr.MultiscaleImage;
import dev.zarr.omezarr.Plate;
import dev.zarr.omezarr.Well;
import dev.zarr.omezarr.metadata.MultiscalesEntry;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;

Expand All @@ -90,7 +118,7 @@ MultiscaleImage image = MultiscaleImage.open(imageHandle);

int scaleCount = image.getScaleLevelCount();
java.util.List<String> axisNames = image.getAxisNames();
dev.zarr.zarrjava.experimental.ome.metadata.MultiscalesEntry entry0 = image.getMultiscaleNode(0);
MultiscalesEntry entry0 = image.getMultiscaleNode(0);

dev.zarr.zarrjava.core.Array s0 = image.openScaleLevel(0);
ucar.ma2.Array full = s0.read();
Expand All @@ -112,9 +140,10 @@ MultiscaleImage wellImage = well.openImage("0");
Creation is version-specific, but the pattern is the same: create node with version metadata, then append levels/datasets with scale transforms. For example, for v0.5:

```java
import dev.zarr.zarrjava.experimental.ome.metadata.Axis;
import dev.zarr.zarrjava.experimental.ome.metadata.CoordinateTransformation;
import dev.zarr.zarrjava.experimental.ome.metadata.MultiscalesEntry;
import dev.zarr.omezarr.metadata.Axis;
import dev.zarr.omezarr.metadata.Dataset;
import dev.zarr.omezarr.metadata.MultiscalesEntry;
import dev.zarr.omezarr.metadata.transform.CoordinateTransformation;
import dev.zarr.zarrjava.store.FilesystemStore;
import dev.zarr.zarrjava.store.StoreHandle;
import dev.zarr.zarrjava.v3.Array;
Expand All @@ -126,9 +155,9 @@ import java.util.Collections;
StoreHandle out = new FilesystemStore("/tmp/ome_v05.zarr").resolve();
MultiscalesEntry ms = new MultiscalesEntry(
Arrays.asList(new Axis("y", "space", "micrometer"), new Axis("x", "space", "micrometer")),
Collections.<Dataset>emptyList());
Collections.<Dataset>emptyList()
);
dev.zarr.zarrjava.experimental.ome.v0_5.MultiscaleImage written = dev.zarr.zarrjava.experimental.ome.v0_5.MultiscaleImage.create(out, ms);
dev.zarr.omezarr.v0_5.MultiscaleImage written = dev.zarr.omezarr.v0_5.MultiscaleImage.create(out, ms);

written.createScaleLevel(
"s0",
Expand All @@ -144,8 +173,8 @@ written.createScaleLevel(

## Write entry points by version

- `ome.v0_4.MultiscaleImage.create(...)`
- `ome.v0_5.MultiscaleImage.create(...)`
- `ome.v0_6.MultiscaleImage.create(...)`
- `dev.zarr.omezarr.v0_4.MultiscaleImage.create(...)`
- `dev.zarr.omezarr.v0_5.MultiscaleImage.create(...)`
- `dev.zarr.omezarr.v0_6.MultiscaleImage.create(...)`

Use the corresponding metadata classes for each version package.
20 changes: 16 additions & 4 deletions USERGUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,25 @@ Add the following dependency to your `pom.xml`:
```xml
<dependency>
<groupId>dev.zarr</groupId>
<artifactId>zarr-java</artifactId>
<version>0.0.10</version>
<artifactId>zarr-java-core</artifactId>
<version>0.1.3</version>
</dependency>
```
For OME-Zarr support, also add:
```xml
<dependency>
<groupId>dev.zarr</groupId>
<artifactId>zarr-java-ome</artifactId>
<version>0.1.3</version>
</dependency>
```
### Gradle
Add the following to your `build.gradle`:
```gradle
dependencies {
implementation 'dev.zarr:zarr-java:0.0.10'
implementation 'dev.zarr:zarr-java-core:0.1.3'
// Optional: OME-Zarr support
implementation 'dev.zarr:zarr-java-ome:0.1.3'
}
```
### Requirements
Expand Down Expand Up @@ -680,7 +690,9 @@ try {

## OME-Zarr (v0.4, v0.5, v0.6)

For a focused OME-Zarr API guide (metadata access, array access, version behavior, and concise examples),
OME-Zarr support is provided by the separate `zarr-java-ome` module (package `dev.zarr.omezarr`).

For the full OME-Zarr API guide (installation, metadata access, array access, version behavior, and concise examples),
see:

- [`USERGUIDE-OME-ZARR.md`](USERGUIDE-OME-ZARR.md)
Expand Down
Loading