Giter Club home page Giter Club logo

vizarr's Introduction

Vizarr

Binder launch ImJoy Open In Colab

Multiscale OME-Zarr in Jupyter Notebook with Vizarr

Vizarr is a minimal, purely client-side program for viewing Zarr-based images. It is built with Viv and exposes a Python API using the imjoy-rpc, allowing users to programatically view multiplex and multiscale images from within a Jupyter Notebook. The ImJoy plugin registers a codec for Python zarr.Array and zarr.Group objects, enabling Viv to securely request chunks lazily via Zarr.js. This means that other valid zarr-python stores can be viewed remotely with Viv, enabling flexible workflows when working with large datasets.

Remote image registration workflow

We created Vizarr to enhance interactive multimodal image alignment using the wsireg library. We describe a rapid workflow where comparison of registration methods as well as visual verification of alignnment can be assessed remotely, leveraging high-performance computational resources for rapid image processing and Viv for interactive web-based visualization in a laptop computer. The Jupyter Notebook containing the workflow described in the manuscript can be found in multimodal_registration_vizarr.ipynb. For more information, please read our preprint doi:10.31219/osf.io/wd2gu.

Note: The data required to run this notebook is too large to include in this repository and can be made avaiable upon request.

Data types

Vizarr supports viewing 2D slices of n-Dimensional Zarr arrays, allowing users to choose a single channel or blended composites of multiple channels during analysis. It has special support for the developing OME-Zarr format for multiscale and multimodal images. Currently Viv supports i1, i2, i4, u1, u2, u4, and f4 arrays, but contributions are welcome to support more np.dtypes!

Getting started

The easiest way to get started with vizarr is to clone this repository and open one of the example Jupyter Notebooks.

Limitations

vizarr was built to support the registration use case above where multiple, pyramidal OME-Zarr images are viewed within a Jupyter Notebook. Support for other Zarr arrays is supported but not as well tested. More information regarding the viewing of generic Zarr arrays can be found in the example notebooks.

Citation

If you are using Vizarr in your research, please cite our paper:

Trevor Manz, Ilan Gold, Nathan Heath Patterson, Chuck McCallum, Mark S Keller, Bruce W Herr II, Katy Börner, Jeffrey M Spraggins, Nils Gehlenborg, "Viv: multiscale visualization of high-resolution multiplexed bioimaging data on the web." Nature Methods (2022), doi:10.31219/10.1038/s41592-022-01482-7

vizarr's People

Contributors

dependabot[bot] avatar habi avatar manics avatar manzt avatar ngehlenborg avatar normanrz avatar oeway avatar will-moore avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vizarr's Issues

Loading issue for OME-NGFF 0.4 dataset with large number of channels

https://hms-dbmi.github.io/vizarr/?source=https://uk1s3.embassy.ebi.ac.uk/idr/zarr/v0.4/idr0054A/5025551.zarr (XYC with 27 channels) for instance fails to render.

The app has a built-in limitation in the number of supportedchannels

export const MAX_CHANNELS = 6;

For images with large number of channels like multiplexed images, is the error expected as per this limitation or should the app fall back to loading the first set of channels?

channel_axis is length undefined

Hi, we have some ImJoy plugins uses vizarr that are currently broken due to recent changes.

It complains:

Error: channel_axis is length undefined and provided channel_axis property channelProp is different size.

Here you can find the setting.

And with this link you can reproduce the issue:
https://imjoy.io/lite?plugin=https://github.com/muellerflorian/hani-ms2/blob/6fbd56d517a4279bf127122c5f78c68e5dc38757/imjoy-plugins/hani-ms2-sample-1.imjoy.html

Now my solution is to pin the vizarr version to 0.2.0: muellerflorian/hani-ms2#1

Also note that, the published version 0.2.1 on npm does not work with the unpkg link because there are files missing:
Screen Shot 2021-08-18 at 10 27 18 PM

Play with vizarr code

@manzt @joshmoore
How hard would it be for me to "play with the code"?
Ideal would be some development environment setup like IntelliJ for Java...
I'd really like to learn some Javascript and this project is super relevant for my work so it would be a great motivation to get my hands dirty... (not sure how much time I will find but the motivation is very large ;-)

How to load local zarr files through imjoy_plugin.py

I saw that Vizarr support the visualization of local zarr files through its imjoy_plugin. I want to visualize the following zarr file; however, I haven't had any luck with the plugin:

─pyramid.zarr
│   │   .zgroup
│   │   METADATA.ome.xml
│   │
│   └───data.zarr
│       │   .zgroup
│       │
│       └───0
│           │   .zattrs
│           │   .zgroup
│           │
│           ├───0
│           │       .zarray
│           │       0.0.0.0.0
│           │       0.0.0.0.1
│           │       0.0.0.1.0
│           │       0.0.0.1.1
│           │       0.0.0.2.0
│           │       0.0.0.2.1
│           │       0.1.0.0.0
│           │       0.1.0.0.1
│           │       0.1.0.1.0
│           │       0.1.0.1.1
│           │       0.1.0.2.0
│           │       0.1.0.2.1
│           │
│           ├───1
│           │       .zarray
│           │       0.0.0.0.0
│           │       0.0.0.1.0
│           │       0.1.0.0.0
│           │       0.1.0.1.0
│           │
│           ├───2
│           │       .zarray
│           │       0.0.0.0.0
│           │       0.1.0.0.0
│           │
│           └───3
│                   .zarray
│                   0.0.0.0.0
│                   0.1.0.0.0

How would I be able to load this zarr file through the plugin?

Run prettier on code base

#50 adds prettier, and once it is merged, we should format the codebase and add a GH action to check PRs for linting going forward.

View zarr loaded with napari_lazy_openslide

Hi I am trying to use vizarr with @manzt 's napari_lazy_openslide, but vizarr doesn't display it properly. In the browser console I see lots of error (TypeError: update of ImageLayer({id: 'Background-Image-MultiscaleImageLayer'}): Cannot read properties of undefined (reading 'photometricInterpretation'))

Here is the code:

import dask.array as da
import zarr

from napari_lazy_openslide import OpenSlideStore

store = OpenSlideStore('my-data.ndpi')
grp = zarr.open(store, mode="r")

# Create Zarr 
openslide_image = {
    "source": grp,
    "name": "astronaut",
    "channel_axis": 2,
    "axis_labels": ["w", "h", "channels"],
}

# Run vizarr
run_vizarr(openslide_image)

If I print the pyramid in the zarr group:
I get:

[<zarr.core.Array '/0' (91136, 98304, 4) uint8 read-only>,
 <zarr.core.Array '/1' (45568, 49152, 4) uint8 read-only>,
 <zarr.core.Array '/2' (22784, 24576, 4) uint8 read-only>,
 <zarr.core.Array '/3' (11392, 12288, 4) uint8 read-only>,
 <zarr.core.Array '/4' (5696, 6144, 4) uint8 read-only>,
 <zarr.core.Array '/5' (2848, 3072, 4) uint8 read-only>,
 <zarr.core.Array '/6' (1424, 1536, 4) uint8 read-only>,
 <zarr.core.Array '/7' (712, 768, 4) uint8 read-only>,
 <zarr.core.Array '/8' (356, 384, 4) uint8 read-only>,
 <zarr.core.Array '/9' (178, 192, 4) uint8 read-only>,
 <zarr.core.Array '/10' (89, 96, 4) uint8 read-only>]

The scaling factor is 2, so it should be fine. Is it related to the shape expected by vizarr? Is there a workround for making it work?

Support lookup table

Hi, do you support lookup table for images already? Otherwise it would be great to have that.

colab notebook not working with zarr

I tried the colab link and I got the zarr error shown in the first image below indicating that the code might work with an earlier version of zarr.

So I changed the first line to !pip install imjoy zarr==2.10 and was able to load zarr, but ended up with a blank screen as shown in the second image.

image

image

Support OME-zarr labels layers

It would be great to support ome-zarr labels data.
This is a zarr image where values of 0 are transparent (no label) and colour of each label may be specified by metadata:
https://github.com/ome/omero-ms-zarr/blob/master/spec.md#image-label-metadata

I can imagine that loading the zarr data into new layers won't need much new code (happy to have a stab at this), but I don't know how to render particular pixel values with pre-defined colours?
It's important that the labels layer is transparent so that the underlying image is visible, so I believe they would have to be part of the same Deck.gl layer?

See ome-zarr labels support in napari, added via ome-zarr-py plugin: ome/ome-zarr-py#30

These labels layers may be part of the same ome-zarr that contains image layers (see spec) but it's possible that you might load image layers from one source and labels from another.

Having just been reading #32, I can imagine that an API for showing/hiding or setting colors on masks would be very cool. Similar to what you're doing in vitessce http://vitessce.io/?dataset=linnarsson-2018

cc @joshmoore

Is it possible to use vizarr for visualizing high-resolution streaming images?

Hi,

first of all, thank you very much for making this amazing project open-source! ;). I just watched a video that explains vizarr (Lighting Talk - OME NGFF and Viv - Trevor Manz (HMS)), and I really liked it!, amazing project!. I am a Python user, with a very basic JavaScript level (beginner, but eager to learn more about JS and web technologies). In my use-case, I am interested in creating a web application that allows to visualize high-resolution streaming images acquired by an xray system (the server) while scanning objects on a moving conveyor belt. I would like to visualize the streaming raw images as the acquisition systems writes them to disk to check that the experiment is going well and the images are acquired as expected. Every "dt" milliseconds the acquisition systems acquires and writes to disk a new image (tiff format) of dimension 64 x 10240. The number of images acquired during an experiment is variable (it could be thousands, tens-of-thousands, or even millions, it depends on the duration of the experiment). Following the description available in the video mentioned above, I am planning extending the acquisition systems such that not only write the raw images to disk, but also generate the zarr tiles to be used by vizarr. At any given moment, the user can interact with the viewer (zoom-in/out, panning, etc), while the acquisition system continues streaming the new data. Do you guys think is it possible to use vizarr to accomplish such goal?

Thank you very much!

All the comments, suggestions and advices are truly welcome ;).

Counter-intuitive layer ordering

Hi, I just noticed that if we add two or more images to vizarr, the default ordering is a bit counter-intuitive. For most of the applications such as photoshop or napari, the images added later should show on the top of the list in the control UI. Should we change that?

Arbitrary plane slicing

In BigDataViewer one can interactively change the viewing plane to any plane, non-orthogonal to the voxel space of the image.

In the long run we (EMBL) would need such a functionality in the web as well.

I know the logic of the BigDataViewer implementation in case there is interest and resources to implement this in vizarr.

Rough sketch:

For each pixel_coordinates_2D on the screen of the browser:
       voxel_coordinates_3D = applyTransform( currentViewerTransform, pixel_coordinates_2D );
       voxelValue = fetchDataFromZXarr( voxel_coordinates_3D, channel, time );
       paint( voxelValue, pixel_coordinates_2D );

The currentViewerTransform is what you change if you change the viewing angle.

Let me know if that is within scope and of interest for you.

Enable text on HCSPlate

Follow up to #73. There is just a flag that needs to be enabled in gridLayer.ts, but I'm thinking that a UI element to toggle the text would be most desirable, so I left that off the previous PR.

image

Missing JS assets when running in notebook

Vizarr recently stopped running in notebooks for me. I ran into this today in an environment that worked before.

The problem appears to be due to the fact that the plugin now fails to load two JS assets (these are no longer available):

Both of these GET requests return 404 errors.

I have also confirmed this behaviour on the first Binder example (https://mybinder.org/v2/gh/hms-dbmi/vizarr/main?filepath=example%2Fgetting_started.ipynb).

These errors do not occur when running Vizarr standalone (i.e., https://hms-dbmi.github.io/vizarr/v0.2/?source=<foo>). I assume because it's packaged differently.

Use naming convention for event listener names

There is no standardization of emitted event names. I'd prefer an <action>:<emitted> convention. E.g.,

let el = document.querySelector('#root');
let viewer = vizarr.createViewer(el);

viewer.on(
--  "viewStateChange",
++  "change:viewState",
  () => {
  /* ... */
});

Need to have .zarr in path

Just starting to work with some zarr data that I have in a directory that doesn't have .zarr in the path and I find that this doesn't work due this in normalizeStore()

    const [root, path] = source.split('.zarr');
    return { store: new HTTPStore(root + '.zarr'), path };

Is there a need to enforce that .zarr exists in the path?

View OME-NGFF collection of Images

We are making progress with defining a specification for a collection of Images at ome/ngff#31
and with generating a collection of OME-NGFF Images (export from OMERO) at ome/omero-cli-zarr#83 so I'm starting to think how we could visualise/browse these.
Although there has been discussion of grouping subsets of a collection by various criteria, in the simplest case we'd just want to be able to see a thumbnail and or name for each image in the collection.

In some ways this is similar to the HCS view, but it is more complex because we have to handle the case where all the images have different number of channels, different pixel type and rendering settings.
There will be some image collections where you might want the HCS-type view, with the same adjustable rendering settings applied to all images. I don't know if we'd want to try and handle this use-case or just assume that all collections are un-related images.

I don't know if this should even be built-in to the existing vizarr viewer, or if this should be an entirely different app that could link to vizarr viewer when an image is clicked?

resolution levels not a factor of 2

When using OMERO to provide a OME-Zarr interface via https://github.com/will-moore/omero-web-zarr
the size of each pyramid resolution is determined by the pyramid in the original file.

For svs images, the resolution levels are often not a factor of 2. e.g. sample image
https://downloads.openmicroscopy.org/images/SVS/77917.svs

Sizes of resolutions (X, Y) are:

96999, 45667
24249, 11416
6062, 2854
3031, 1427
1024, 482

The OME-Zarr spec doesn't specify any down-sampling info, so this should be valid, and I believe this is handled correctly in napari, although there are other async issues and tiles being re-loaded on every zoom that prevent me from testing this properly.

It seems that vizarr assumes that each resolution is a factor of 2 smaller than the previous, so that in the image above, we get tiles incorrectly overlaid when moving from one resolution to the next:

Screenshot 2021-07-05 at 15 50 19

Initial view is very-much smaller than expected (appears in the top-left of the screen):
Screenshot 2021-07-05 at 15 48 20

I don't know if this can be handled in Vizarr, or if it needs to be handled at a lower level in deck.gl etc?

Display of HCS Plate not fully working

Hi,

I have two PerkinElmer high-content screening plates that I separately converted with bioformats2raw to the .zarr format. One of them I can display without any issues, the other one has a problem.

The problem with the second plate is the following: I can display the overview page and see all the wells next to each other, but when I click on one of the wells, the site is black and not even the sidebar on the left is loaded. That means, displaying all fields of a single well does not work. However, when I enter the url of a single field, display works again.

Both plates can be displayed in napari and both plates are compliant when I run them through the ome-ngff validator tool.

So I have a hunch why display might not work and maybe you can confirm: The plate that I can display properly, contains some wells, fields, three z-planes and two timepoints. The plate that I cannot display properly contains also some wells and fields but only a single z-plane and a single timepoint. Looking at the multiscales key in the .zattrs JSON of one of the fields, I see that there are five axes (time, channel, z, y, x) for the plate that I cannot display properly, even though time and z-plane are always one.

Could it be that vizarr expects there to be more than one timepoint (or more than one z-plane) when the timepoint (or z) axis is available in the .zattrs file?

Best, Flo

Document the ImJoy API

Would be nice if we document the imjoy api and provide simple examples, e.g. for set_viewer_state.

The recommended way to provide a separate markdown file in this repo and link it in the README. If we also set the url as docs key and pass it to the setupRPC function, the docs can be shown inside ImJoy via the docs menu.

Provide CDN standalone version

I would like to do some customization of the viewer for some ImJoy UI plugins, would be nice if you can provide a CDN version, which we can include a js file hosted (e.g. on https://unpkg.io/) via a script tag. This would enables easy customization, e.g. add a load from local file button etc.

Add loading animation

Depending on the internet speed, sometimes it can be slow to load the image. Would be nice to see a loading animation while waiting.

Allow setting z/t plane

I am building a image exploration tool with a search bar, when user submit some query, we would like to control vizarr to locate to a specific image plane via ImJoy. Can we have something like set_view_state but for setting the z/t plane?

Visualzation of ROIs embedded in ome.zarr?

Hello all,

Thanks for this amazing work! Having interactive image browing within a notebook is really something that helps a lot!
I am wondering whether you are planning on adding some other types of layers at all, such as shapes? I am aware that I can do that with Imjoy and vitessce. They are however much heavier that this amazing inline vizarr.
thanks for you helps in advance!

Best,
Tong

Extract OME-Zarr parsing into sharable JS module

From: vitessce/vitessce#816

The main tension that I see is that Vitessce/Vizarr/Avivator use a different stack of tools and represent state differently internally, making it hard to re-use components. With that said, the real "shared functionality desired is to derive an initial state from the OME-Zarr source. I see a common pattern of:

1.) Read OME-Zarr url
2.) Derive Zarr.js arrays + all known rendering metadata
3.) Translate 2.) into application-specific initial state (loaders + layerProps).

I think a shared JS library that does the two first steps would be a great benefit to our work and others. The trick is agreeing on what the library should return. (This is essentially the idea behind the plugin interface for napari).

Proposal

Extract https://github.com/hms-dbmi/vizarr/blob/master/src/ome.ts into a pure ESM module (with only zarr.js as a dependency). This module should take an OME-Zarr url and return an object containing the zarr arrays and all known metadata. I have been mirroring the initial SourceData for vizarr after napari's API for loading images (but this has gotten a bit bloated due to the new grid layer). I think it would be fruitful to continue in this vain. Vitessce and Vizarr should be able to derive all initial state from this source:

type LayerData = ZarrArray | ZarrArray[]; // array if pyramid, like in napari

interface LayerMeta {
  name: string;
  channel_axis: number | null;
  // if channel_axis is provided,
  // colors, names, contrast_limits, visibilities, selection must all be of length === data.shape[channel_axis]
  colors: string[]; 
  names: string[];
  contrast_limits: number[][];
  visibilities: boolean[];
  defaults: {
    selection: number[];
    colormap: string;
    opacity: number;
  };
  axis_labels: string[];
};

function loadOME(url: string) -> Promise<[LayerData, LayerMeta][]>;

In fact, Vizarr already does this in a sense

export function initLayerStateFromSource(sourceData: SourceData, layerId: string): LayerState {
.

@will-moore my idea is that this library would essentially mimic what is returned from the napari reader hook (data, layer-meta tuples). Then vizarr/vitessce could translate this to an initial state and special layers. Once it has stabilized, we could move this inside Viv, but perhaps outside of Viv would allow you and folks at OME to develop a lib that serves the same purpose as ome-zarr-py for a handful of tools on the web.

Wrong chunk loaded at low-resolutions

For http://hms-dbmi.github.io/vizarr?source=https://s3.embl.de/i2k-2020/em-raw.ome.zarr @tischi reported that the browser hangs at this stage:

Screen Shot 2020-12-03 at 10 05 01

@will-moore pointed out that "it seems even at very low resolution, (where you only have 1 tile) we are getting 404 https://s3.embl.de/i2k-2020/em-raw.ome.zarr/s6/0.0.1351.0.0"

even though:

(z) ~ $ome_zarr info https://s3.embl.de/i2k-2020/em-raw.ome.zarr/
https://s3.embl.de/i2k-2020/em-raw.ome.zarr/ [zgroup]
 - metadata
   - Multiscales
 - data
   - (1, 1, 2854, 3240, 3438)
   - (1, 1, 1427, 1620, 1719)
   - (1, 1, 714, 810, 860)
   - (1, 1, 357, 405, 430)
   - (1, 1, 179, 203, 215)
   - (1, 1, 90, 102, 108)
   - (1, 1, 45, 51, 54)
https://s3.embl.de/i2k-2020/em-raw.ome.zarr/labels/ [zgroup] (hidden)
 - metadata
   - Labels
 - data
https://s3.embl.de/i2k-2020/em-raw.ome.zarr/labels/cells/ [zgroup] (hidden)
 - metadata
   - Multiscales
 - data
   - (1, 1, 2854, 3240, 3438)
   - (1, 1, 1427, 1620, 1719)
   - (1, 1, 714, 810, 860)
   - (1, 1, 357, 405, 430)
   - (1, 1, 179, 203, 215)
   - (1, 1, 90, 102, 108)
   - (1, 1, 45, 51, 54)
   - (1, 1, 23, 26, 27)

Icon for vizarr

Hi, would be nice to provide an icon for vizarr, so the tool will be more recognisable in ImJoy. Do you have idea what to be used? We can also select an emoji: https://getemoji.com/ for now.

Change in CORS behavior

Hi all,

links that were previously working via hms-dbmi.github.io (6001240, 9822151) are now failing with:

Access to fetch at 'https://s3.embassy.ebi.ac.uk/idr/zarr/v0.1/9822151.zarr/3/.zgroup' from origin 'https://hms-dbmi.github.io' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

even though the same link on @will-moore's netlify account (9822151) is working.

Any ideas?
~Josh

Support bioformats2raw layout

Bioformats2raw exports a "Fileset" of 1 or more Images for some formats, as described at ome/ngff#112
with the paths to them as 0/, 1/, etc and names and other metadata in a top-level /OME/METADATRA.ome.xml.

Some sample data is available at https://minio-dev.openmicroscopy.org/idr/bf2raw/mdb/martin/sample_files.zarr (that dir contains a .zattrs with {"bioformats2raw.layout" : 3}) which is a set of 8 small images.

E.g. using that source and adding the following code snippet to io.ts, I was able to read the Image names...

code snippet
if ("bioformats2raw.layout" in attrs && attrs["bioformats2raw.layout"] == 3) {
    // const source_url = config.source;
    const source_url = `${ node.store.store.url }/${node.path}`;
    const xmlUrl = `${ source_url }/OME/METADATA.ome.xml`;
    fetch(xmlUrl)
    .then(response => response.text())
    .then(data => {
      const parser = new DOMParser();
      const doc = parser.parseFromString(data, "application/xml");
      const errorNode = doc.querySelector("parsererror");
      if (errorNode) {
        console.log("error while parsing");
      } else {
        console.log(doc.documentElement.nodeName);
        console.log(doc.querySelectorAll("Image").forEach(el => {
          console.log('image element', el, el.getAttribute("Name"));
        }));
      }
    })
    .catch(console.error);
  }

It would be nice to show the Thumbnails and Names (and other metadata?) for the images, and click them to open the Full Image in the viewer. I looked again at code I had for doing this with "Collections" at #125 but can't get the Thumbnails (or Typescript) working now.
Might need to try a different approach (and forget about the Thumbnails initially)...

cc @joshmoore @sbesson

[bug?] `loadWell` loads grid of images at highest resolution

This is something that slipped past me previously, but it seems that loadWell (previously loadOmeWell) loads a grid of images at the highest resolution. This design choice leads to a lot of data-transfer and slow loading times. Is this the desired behavior?

Ideally the grid could handle multiple multiscale images, but in the mean time should we have some heuristic for which level to choose?

cc: @will-moore

Image origin in Vizarr

Dear all,

Could you tell me please if image origin (X=0, Y=0) in Vizarr is located in the top left corner of the screen?

Thank you for any input,
Best regards,
Aliaksei

Vizarr demo for Jupyterlab and JupyterLite in the browser

I just made a JupyterLab extension for running ImJoy Plugins in side native JupyterLab and JupyterLite in the browser (with Pyodide). Would you be interested in adding some docs and demos for that?

I added a vizarr demo notebook here for JupyterLite: https://jupyter.imjoy.io/ , it's cool to see that the astronaut.zarr example works directly in the browser (since I compiled zarr and scikit-image for pyodide a while ago) and it can be used as an alternative to binder for demonstration.

Screen Shot 2021-11-28 at 10 00 11 PM

Add versioned endpoints to gh-pages for more stable URLs

Description

Right now, https://hms-dbmi.github.io/vizarr just tracks master. For the time being, we haven't noticed regressions (fortunately) on builds, but we should have a more stable way of sharing links in the future.

Proposal:

Add versioned builds to gh-pages so that we have stable links for sharing. For now, https://hms-dbmi.github.io/vizarr will continue to track master as a type of latest build of vizarr, but https://hms-dbmi.github.io/vizarr/v0.1 will follow semvar and provide a much more stable way of sharing links.

Unable to visualize a sample zarr with vizarr 0.1

I am a zarr newbee, and was made aware of vizarr on our DataLad chat: https://app.element.io/#/room/#datalad:matrix.org

Trying https://hms-dbmi.github.io/vizarr/v0.1?source=https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/ results in

following errors in the console
Error with Permissions-Policy header: Unrecognized feature: 'interest-cohort'.
favicon.ico:1 GET https://hms-dbmi.github.io/favicon.ico 404
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/0/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/1/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/2/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/6/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/5/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/3/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/4/.zgroup 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
containsItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
$ @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
mg @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
H @ 13.38517d85552c83eabbe6.js:1
V @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
q @ 13.38517d85552c83eabbe6.js:1
Y @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
h @ index-c95171bc998dd7e2e19f.js:1
s @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 Uncaught (in promise) RangeError: index out of bounds for dimension with length 32
    at p (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at u (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at new T (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.getBasicSelectionND (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.<anonymous> (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Generator.next (<anonymous>)
    at 26fc3ee3.336ffadf7b54e5692b11.js:1
    at new Promise (<anonymous>)
    at E (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.getBasicSelection (26fc3ee3.336ffadf7b54e5692b11.js:1)
L @ 26fc3ee3.336ffadf7b54e5692b11.js:1
p @ 26fc3ee3.336ffadf7b54e5692b11.js:1
u @ 26fc3ee3.336ffadf7b54e5692b11.js:1
T @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getBasicSelectionND @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getBasicSelection @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getRaw @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Promise.then (async)
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Show 28 more frames
26fc3ee3.336ffadf7b54e5692b11.js:1 Uncaught (in promise) RangeError: index out of bounds for dimension with length 32
    at p (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at u (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at new T (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.getBasicSelectionND (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.<anonymous> (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Generator.next (<anonymous>)
    at 26fc3ee3.336ffadf7b54e5692b11.js:1
    at new Promise (<anonymous>)
    at E (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Mg.getBasicSelection (26fc3ee3.336ffadf7b54e5692b11.js:1)
L @ 26fc3ee3.336ffadf7b54e5692b11.js:1
p @ 26fc3ee3.336ffadf7b54e5692b11.js:1
u @ 26fc3ee3.336ffadf7b54e5692b11.js:1
T @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getBasicSelectionND @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getBasicSelection @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getRaw @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Promise.then (async)
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Show 29 more frames
295314b86.8ecbf1ef594418e62509.js:1 Uncaught (in promise) TypeError: Cannot read property 'keyPrefix' of undefined
    at 95314b86.8ecbf1ef594418e62509.js:1
    at c (commons.db5017ce7df29f922cd9.js:1)
    at Generator._invoke (commons.db5017ce7df29f922cd9.js:1)
    at Generator.next (commons.db5017ce7df29f922cd9.js:1)
    at n (13.38517d85552c83eabbe6.js:1)
    at s (13.38517d85552c83eabbe6.js:1)
    at 13.38517d85552c83eabbe6.js:1
    at new Promise (<anonymous>)
    at 13.38517d85552c83eabbe6.js:1
    at 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
setTimeout (async)
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
pu @ framework.2a31d370fdd732e8118d.js:1
Pi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ci @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
ii @ framework.2a31d370fdd732e8118d.js:1
enqueueForceUpdate @ framework.2a31d370fdd732e8118d.js:1
v.forceUpdate @ framework.2a31d370fdd732e8118d.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
requestAnimationFrame (async)
value @ commons.db5017ce7df29f922cd9.js:1
e @ commons.db5017ce7df29f922cd9.js:1
Show 54 more frames
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/1/0.0.750.0.0 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Show 50 more frames
26fc3ee3.336ffadf7b54e5692b11.js:1 Uncaught (in promise) Error: key 1/0.0.750.0.0 not present
    at Hg.<anonymous> (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Generator.next (<anonymous>)
    at E (26fc3ee3.336ffadf7b54e5692b11.js:1)
U @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/1/0.0.750.0.1 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Show 50 more frames
26fc3ee3.336ffadf7b54e5692b11.js:1 GET https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/1/0.0.750.0.2 404 (Not Found)
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
getItem @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ 13.38517d85552c83eabbe6.js:1
s @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
c @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
(anonymous) @ commons.db5017ce7df29f922cd9.js:1
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
Promise.then (async)
n @ index-c95171bc998dd7e2e19f.js:1
i @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ index-c95171bc998dd7e2e19f.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
(anonymous) @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ 95314b86.8ecbf1ef594418e62509.js:1
value @ 13.38517d85552c83eabbe6.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
value @ commons.db5017ce7df29f922cd9.js:1
ha @ framework.2a31d370fdd732e8118d.js:1
Bo @ framework.2a31d370fdd732e8118d.js:1
ju @ framework.2a31d370fdd732e8118d.js:1
_i @ framework.2a31d370fdd732e8118d.js:1
Si @ framework.2a31d370fdd732e8118d.js:1
ki @ framework.2a31d370fdd732e8118d.js:1
pi @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ql @ framework.2a31d370fdd732e8118d.js:1
$l @ framework.2a31d370fdd732e8118d.js:1
Oi @ framework.2a31d370fdd732e8118d.js:1
t.unstable_runWithPriority @ framework.2a31d370fdd732e8118d.js:1
jl @ framework.2a31d370fdd732e8118d.js:1
Ti @ framework.2a31d370fdd732e8118d.js:1
(anonymous) @ framework.2a31d370fdd732e8118d.js:1
F @ framework.2a31d370fdd732e8118d.js:1
k.port1.onmessage @ framework.2a31d370fdd732e8118d.js:1
Show 50 more frames
26fc3ee3.336ffadf7b54e5692b11.js:1 Uncaught (in promise) Error: key 1/0.0.750.0.1 not present
    at Hg.<anonymous> (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Generator.next (<anonymous>)
    at E (26fc3ee3.336ffadf7b54e5692b11.js:1)
U @ 26fc3ee3.336ffadf7b54e5692b11.js:1
(anonymous) @ 26fc3ee3.336ffadf7b54e5692b11.js:1
E @ 26fc3ee3.336ffadf7b54e5692b11.js:1
26fc3ee3.336ffadf7b54e5692b11.js:1 Uncaught (in promise) Error: key 1/0.0.750.0.2 not present
    at Hg.<anonymous> (26fc3ee3.336ffadf7b54e5692b11.js:1)
    at Generator.next (<anonymous>)
    at E (26fc3ee3.336ffadf7b54e5692b11.js:1)
and it seems to be a legit ome-zarr:
(z) ~ $ ome_zarr info https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/
https://dandiarchive.s3.amazonaws.com/largeuploads/blobs/150slab.zarr/ [zgroup]
- metadata

  - Multiscales
  - OMERO
- data

  - (1, 1, 2048, 25939, 44141)
  - (1, 1, 1024, 12970, 22071)
  - (1, 1, 512, 6485, 11036)
  - (1, 1, 256, 3243, 5518)
  - (1, 1, 128, 1622, 2759)
  - (1, 1, 64, 811, 1380)
  - (1, 1, 32, 406, 690)

OME-HCS Compatibility with vizarr

Hello!

I feel as though I should properly introduce myself as I have been active recently on ImageSC regarding ome-zarr data format.
I am an RA at the Chan-Zuckerberg Biohub working on optimizing our computational pipelines and we are now migrating towards the OME-zarr format for all of our raw/processed data. I would like to help you all optimize these viewers (vizarr + ome-zarr-py) as our team starts to use them heavily, so I may start to post some issues here more frequently.

One Issue that I am coming across right away, and it's due to the lack of insight into how the ome-zarr HCS metadata is parsed, has to do with inflexible key structures. I'll outline below:

Consider the OME-Zarr Dataset tree below, with the level above Fake_Row being Plate.zarr

/
 └── Fake_Row
     ├── Fake_Col_0
     │   └── Pos_000
     │       └── array (1, 6, 24, 2048, 2048) uint16
     ├── Fake_Col_1
     │   └── Pos_001
     │       └── array (1, 6, 24, 2048, 2048) uint16
     ├── Fake_Col_2
     │   └── Pos_002
     │       └── array (1, 6, 24, 2048, 2048) uint16
     └── Fake_Col_3
         └── Pos_003
             └── array (1, 6, 24, 2048, 2048) uint16

The metadata at the associated levels is as such:

"Plate Metadata" at Plate.zarr.attrs

{'plate': {'acquisitions': [{'id': 1,
    'maximumfieldcount': 1,
    'name': 'Dataset',
    'starttime': 0}],
  'columns': [{'name': 'Fake_Col_0'},
   {'name': 'Fake_Col_1'},
   {'name': 'Fake_Col_2'},
   {'name': 'Fake_Col_3'}],
  'field_count': 1,
  'name': 'test',
  'rows': [{'name': 'Fake_Row'}],
  'version': '0.1',
  'wells': [{'path': 'Fake_Row/Fake_Col_0'},
   {'path': 'Fake_Row/Fake_Col_1'},
   {'path': 'Fake_Row/Fake_Col_2'},
   {'path': 'Fake_Row/Fake_Col_3'}]}}

"Well Metadata" at Plate.zarr['Fake_Row']['Fake_Col_{i}'].attrs

{'well': {'images': [{'path': 'Pos_000'}], 'version': '0.1'}} # Fake_Col_0
{'well': {'images': [{'path': 'Pos_001'}], 'version': '0.1'}} # Fake_Col_1
{'well': {'images': [{'path': 'Pos_002'}], 'version': '0.1'}} # Fake_Col_2
{'well': {'images': [{'path': 'Pos_003'}], 'version': '0.1'}} # Fake_Col_3

"omero / multi-scales" metadata at Plate.zarr['Fake_Row']['Fake_Col_0']['Pos_000'].attrs

{'multiscales': [{'datasets': [{'path': 'array'}], 'version': '0.1'}],
 'omero': {'channels': [{'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'State0',
    'window': {'end': 1279, 'max': 65535, 'min': 0, 'start': 663}},
   {'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'State1',
    'window': {'end': 3718, 'max': 65535, 'min': 0, 'start': 1804}},
   {'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'State2',
    'window': {'end': 5128, 'max': 65535, 'min': 0, 'start': 2101}},
   {'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'State3',
    'window': {'end': 2595, 'max': 65535, 'min': 0, 'start': 1117}},
   {'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'Cy5 - 635~730',
    'window': {'end': 594, 'max': 65535, 'min': 0, 'start': 122}},
   {'active': True,
    'coefficient': 1.0,
    'color': '808080',
    'family': 'linear',
    'inverted': False,
    'label': 'FITC - 474~515',
    'window': {'end': 761, 'max': 65535, 'min': 0, 'start': 141}}],
  'rdefs': {'defaultT': 0,
   'defaultZ': 0,
   'model': 'color',
   'projection': 'normal'},
  'version': 0.1}}

This structure makes the most sense for our data, as we like to keep track of the position index in Pos_000, etc as we move through rows and columns. However I am running into the issue while using vizarr such that if this indexing doesn't start back at 0 (Pos_000) beneath every "well" then the viewer raises this error:

Screen Shot 2021-09-09 at 12 56 36 PM

I am really not sure why it is searching for a path (Fake_Row/Fake_Col_1/Pos_000) that isn't referenced in the metadata (or maybe it is and I missed it?). However when I rename all of the "Pos_00{i}" to "Pos_000" and update the "well" metadata to these names then the viewer works accordingly. Can someone show me where this ome-metadata is being parsed or why this might be the case?

I am happy to help investigating / solving these issues if you are looking for development help. Same goes for ome-zarr-py + napari-ome-zarr (which seems a bit more buggy than vizarr) which would be our preferred viewer.

Thanks for your help here.

Best,
Cam

[feature] Reuse zarr metadata from one image for others in plate

Motivation:

Currently we initialize each ZarrArray in a plate layout independently. This means that we make row x col requests for .zarray metadata prior to fetching any unique pixel data. This can lead to a substantial overhead of just waiting for metadata to load for large plates; time that could be spent fetching the actual pixel data.

In addition, if we do end up supporting multiscale plates, we would need to make row x col x n_levels requests to initialize all arrays in the grid. For example, this plate from the OME-Blog: https://s3.embassy.ebi.ac.uk/idr/zarr/v0.1/plates/5966.zarr would require 394 * 5 = 1970 requests to initialize prior to fetching any data.

Proposal

Similar to reusing the omero metadata for the first image in the plate, we should be able to reuse the .zarray metadata for the first image in the plate to initialize all other ZarrArray objects at the same resolution. By taking this approach, we can initialize all the ZarrArray objects for a plate with the same number of requests regardless of plate size.

This approach assumes that the .zarray metadata is consistent for all arrays at the same resolution (shape, chunk, compressor, etc are all identical). Perhaps this is too strong of an assumption, and thoughts @joshmoore or @will-moore ?

Channel range widget input

Testing https://hms-dbmi.github.io/vizarr/?source=https://uk1s3.embassy.ebi.ac.uk/idr/zarr/v0.1/plates/422.zarr/F/1/0
when I click the up/down buttons for the contrast limits controls, nothing happens.
If I try to edit the text e.g. try to delete the last 0 from 2000 the slider itself updates to show 200 but the text input still says 2000.

Screenshot 2022-05-05 at 14 03 31

This is working OK for v0.1 e.g.
https://hms-dbmi.github.io/vizarr/v0.1?source=https://uk1s3.embassy.ebi.ac.uk/idr/zarr/v0.1/plates/422.zarr/F/1/0

URL source encoded

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.