fmi-faim / faim-ipa

A collection of Image Processing and Analysis (IPA) functions used at the Facility for Advanced Imaging and Microscopy (FAIM)
BSD 3-Clause "New" or "Revised" License
9 stars 6 forks source link

Migrate `write_zarr` to here. #98

Closed imagejan closed 3 weeks ago

imagejan commented 8 months ago

This code (from a currently private repository) would be useful to have in faim-hcs:

def write_zarr(client, zarr_path, stitched_da, worm_acquisition):
    """
    Write dask-array to ome-zarr multiscale.

    Parameters
    ----------
    client :
        Dask client used for the computation.
    zarr_path :
        Path to the output zarr file.
    stitched_da :
        Dask array containing the stitched data.
    worm_acquisition :
        Acquisition object.
    """
    store = parse_url(zarr_path, mode="w").store
    group = zarr.group(store)
    wait(
        client.persist(
            da.to_zarr(
                arr=stitched_da,
                url=group.store,
                compute=False,
                component=str(Path(group.path, "0")),
                storage_options=dict(
                    dimension_separator="/",
                    chunks=(
                        1,
                        1,
                    )
                    + stitched_da.shape[2:],
                    write_empty_chunks=False,
                ),
                compressor=Blosc(cname="zstd", clevel=3, shuffle=Blosc.SHUFFLE),
                dimension_separator=group._store._dimension_separator,
            )
        )
    )
    shapes = [stitched_da.shape]
    datasets = [{"path": "0"}]
    coordinate_transformations = get_coordinate_transformations(
        acquisition=worm_acquisition,
        max_layer=0,
        mip=stitched_da.ndim == 4,
    )
    fmt = CurrentFormat()
    dims = len(shapes[0])
    fmt.validate_coordinate_transformations(
        dims, len(datasets), coordinate_transformations
    )
    for dataset, transform in zip(datasets, coordinate_transformations):
        dataset["coordinateTransformations"] = transform

    if stitched_da.ndim == 4:
        axes = ["t", "c", "y", "x"]
    else:
        axes = ["t", "c", "z", "y", "x"]

    axes = _get_valid_axes(dims, axes, fmt)
    write_multiscales_metadata(
        group,
        datasets,
        fmt,
        axes,
    )

... with the necessary adaptations (e.g. WellAcquisition for worm_acquisition) and tests.

imagejan commented 3 weeks ago

Individual projects should ideally be able to directly use implementations of the ome-zarr-related libraries (e.g. ngio etc.).