@vitessce/config 3.6.3 → 3.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist-tsc/generate-config-anndata.d.ts +8 -0
  2. package/dist-tsc/generate-config-anndata.d.ts.map +1 -0
  3. package/dist-tsc/generate-config-anndata.js +66 -0
  4. package/dist-tsc/generate-config-helpers.d.ts +9 -0
  5. package/dist-tsc/generate-config-helpers.d.ts.map +1 -0
  6. package/dist-tsc/generate-config-helpers.js +17 -0
  7. package/dist-tsc/generate-config-ome.d.ts +4 -0
  8. package/dist-tsc/generate-config-ome.d.ts.map +1 -0
  9. package/dist-tsc/generate-config-ome.js +19 -0
  10. package/dist-tsc/generate-config-spatialdata.d.ts +5 -0
  11. package/dist-tsc/generate-config-spatialdata.d.ts.map +1 -0
  12. package/dist-tsc/generate-config-spatialdata.js +87 -0
  13. package/dist-tsc/generate-config.d.ts +41 -0
  14. package/dist-tsc/generate-config.d.ts.map +1 -0
  15. package/dist-tsc/generate-config.js +241 -0
  16. package/dist-tsc/generate-config.test.d.ts +2 -0
  17. package/dist-tsc/generate-config.test.d.ts.map +1 -0
  18. package/dist-tsc/generate-config.test.js +258 -0
  19. package/dist-tsc/json-fixtures/mouse_liver.anndata.json +274 -0
  20. package/dist-tsc/json-fixtures/mouse_liver.labels.ome.json +50 -0
  21. package/dist-tsc/json-fixtures/mouse_liver.ome.json +50 -0
  22. package/dist-tsc/json-fixtures/mouse_liver.spatialdata.json +374 -0
  23. package/package.json +6 -4
  24. package/src/generate-config-anndata.js +75 -0
  25. package/src/generate-config-helpers.js +19 -0
  26. package/src/generate-config-ome.js +21 -0
  27. package/src/generate-config-spatialdata.js +101 -0
  28. package/src/generate-config.js +265 -0
  29. package/src/generate-config.test.js +274 -0
  30. package/src/json-fixtures/mouse_liver.anndata.json +274 -0
  31. package/src/json-fixtures/mouse_liver.labels.ome.json +50 -0
  32. package/src/json-fixtures/mouse_liver.ome.json +50 -0
  33. package/src/json-fixtures/mouse_liver.spatialdata.json +374 -0
@@ -0,0 +1,274 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createStoreFromMapContents } from '@vitessce/zarr-utils';
3
+ import { withConsolidated } from 'zarrita';
4
+ import { parseUrls, parsedUrlToZmetadata, generateConfig } from './generate-config.js';
5
+ import spatialdataMouseLiverFixture from './json-fixtures/mouse_liver.spatialdata.json';
6
+ import anndataMouseLiverFixture from './json-fixtures/mouse_liver.anndata.json';
7
+ import imageOmeZarrMouseLiverFixture from './json-fixtures/mouse_liver.ome.json';
8
+ import obsSegmentationsOmeZarrMouseLiverFixture from './json-fixtures/mouse_liver.labels.ome.json';
9
+
10
+ describe('generateConfig', () => {
11
+ it('parses URLs', () => {
12
+ const s1 = 'https://example.com/my_image.ome.tif';
13
+ expect(parseUrls(s1)).toEqual([
14
+ {
15
+ url: 'https://example.com/my_image.ome.tif',
16
+ fileType: 'image.ome-tiff',
17
+ },
18
+ ]);
19
+
20
+ const s2 = 'https://example.com/my_image.ome.tif#obsSegmentations.ome-tiff';
21
+ expect(parseUrls(s2)).toEqual([
22
+ {
23
+ url: 'https://example.com/my_image.ome.tif',
24
+ fileType: 'obsSegmentations.ome-tiff',
25
+ },
26
+ ]);
27
+
28
+ const s3 = 'https://example.com/my_image.ome.tif#obsSegmentations.ome-tiff;http://another.com/obj.zarr#anndata.zarr';
29
+ expect(parseUrls(s3)).toEqual([
30
+ {
31
+ url: 'https://example.com/my_image.ome.tif',
32
+ fileType: 'obsSegmentations.ome-tiff',
33
+ },
34
+ {
35
+ url: 'http://another.com/obj.zarr',
36
+ fileType: 'anndata.zarr',
37
+ },
38
+ ]);
39
+ });
40
+
41
+ it('parsed url to zmetadata for an AnnData object', async () => {
42
+ const parsedUrl = {
43
+ url: './mouse_liver.anndata.json',
44
+ fileType: 'anndata.zarr',
45
+ store: createStoreFromMapContents(anndataMouseLiverFixture),
46
+ };
47
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
48
+
49
+ expect(zmetadata.length).toEqual(7);
50
+ expect(zmetadata.map(d => d.path)).toEqual(['/', '/X', '/layers', '/obs', '/var', '/obsm', '/obsm/spatial']);
51
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
52
+ });
53
+
54
+ it('store for SpatialData object supports withConsolidated', async () => {
55
+ const initialStore = createStoreFromMapContents(spatialdataMouseLiverFixture);
56
+ const store = await withConsolidated(initialStore, { metadataKey: 'zmetadata' });
57
+
58
+ expect(store.contents().length).toEqual(41);
59
+ });
60
+
61
+ it('parsed url to zmetadata for a SpatialData object', async () => {
62
+ const parsedUrl = {
63
+ url: './mouse_liver.spatialdata.json',
64
+ fileType: 'spatialdata.zarr',
65
+ store: createStoreFromMapContents(spatialdataMouseLiverFixture),
66
+ };
67
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
68
+
69
+ expect(zmetadata.length).toEqual(41);
70
+ expect(zmetadata.map(d => d.path)).toEqual([
71
+ '/',
72
+ '/images',
73
+ '/images/raw_image',
74
+ '/images/raw_image/0',
75
+ '/images/raw_image/1',
76
+ '/labels',
77
+ '/labels/segmentation_mask',
78
+ '/labels/segmentation_mask/0',
79
+ '/points',
80
+ '/points/transcripts',
81
+ '/shapes',
82
+ '/shapes/nucleus_boundaries',
83
+ '/tables',
84
+ '/tables/table',
85
+ '/tables/table/X',
86
+ '/tables/table/X/data',
87
+ '/tables/table/X/indices',
88
+ '/tables/table/X/indptr',
89
+ '/tables/table/layers',
90
+ '/tables/table/obs',
91
+ '/tables/table/obs/_index',
92
+ '/tables/table/obs/annotation',
93
+ '/tables/table/obs/annotation/categories',
94
+ '/tables/table/obs/annotation/codes',
95
+ '/tables/table/obs/cell_ID',
96
+ '/tables/table/obs/fov_labels',
97
+ '/tables/table/obs/fov_labels/categories',
98
+ '/tables/table/obs/fov_labels/codes',
99
+ '/tables/table/obsm',
100
+ '/tables/table/obsm/spatial',
101
+ '/tables/table/obsp',
102
+ '/tables/table/uns',
103
+ '/tables/table/uns/annotation_colors',
104
+ '/tables/table/uns/spatialdata_attrs',
105
+ '/tables/table/uns/spatialdata_attrs/instance_key',
106
+ '/tables/table/uns/spatialdata_attrs/region',
107
+ '/tables/table/uns/spatialdata_attrs/region_key',
108
+ '/tables/table/var',
109
+ '/tables/table/var/_index',
110
+ '/tables/table/varm',
111
+ '/tables/table/varp',
112
+ ]);
113
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
114
+ });
115
+
116
+ it('parsed url to zmetadata for an OME-NGFF image', async () => {
117
+ const parsedUrl = {
118
+ url: './mouse_liver.ome.json',
119
+ fileType: 'image.ome-zarr',
120
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
121
+ };
122
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
123
+
124
+ expect(zmetadata.length).toEqual(1);
125
+ expect(zmetadata.map(d => d.path)).toEqual(['/']);
126
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
127
+ });
128
+
129
+ it('generateConfig for AnnData object fills in datasets part of config', async () => {
130
+ const parsedUrls = [
131
+ {
132
+ url: './mouse_liver.anndata.json',
133
+ fileType: 'anndata.zarr',
134
+ store: createStoreFromMapContents(anndataMouseLiverFixture),
135
+ },
136
+ ];
137
+ const { config, stores } = await generateConfig(parsedUrls);
138
+ expect(config.toJSON().datasets[0].files).toEqual([
139
+ {
140
+ url: './mouse_liver.anndata.json',
141
+ fileType: 'anndata.zarr',
142
+ options: {
143
+ obsEmbedding: [],
144
+ obsSets: [],
145
+ obsFeatureMatrix: {
146
+ path: 'X',
147
+ },
148
+ obsLocations: {
149
+ path: 'obsm/spatial',
150
+ },
151
+ },
152
+ },
153
+ ]);
154
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.anndata.json']);
155
+ });
156
+
157
+ it('generateConfig for SpatialData object fills in datasets part of config', async () => {
158
+ const parsedUrls = [
159
+ {
160
+ url: './mouse_liver.spatialdata.json',
161
+ fileType: 'spatialdata.zarr',
162
+ store: createStoreFromMapContents(spatialdataMouseLiverFixture),
163
+ },
164
+ ];
165
+ const { config, stores } = await generateConfig(parsedUrls);
166
+ expect(config.toJSON().datasets[0].files).toEqual([
167
+ {
168
+ url: './mouse_liver.spatialdata.json',
169
+ fileType: 'spatialdata.zarr',
170
+ options: {
171
+ image: {
172
+ path: 'images/raw_image',
173
+ coordinateSystem: 'global',
174
+ },
175
+ labels: {
176
+ path: 'labels/segmentation_mask',
177
+ coordinateSystem: 'global',
178
+ },
179
+ obsSpots: {
180
+ // TODO: the test should be updated once fixed in the implementaiton,
181
+ // since these are not circle shapes.
182
+ path: 'shapes/nucleus_boundaries',
183
+ },
184
+ obsFeatureMatrix: {
185
+ path: 'tables/table/X',
186
+ },
187
+ obsSets: {
188
+ tablePath: 'tables/table',
189
+ obsSets: [
190
+ {
191
+ path: 'tables/table/obs/cell_ID',
192
+ name: 'cell_ID',
193
+ },
194
+ {
195
+ path: 'tables/table/obs/fov_labels',
196
+ name: 'fov_labels',
197
+ },
198
+ {
199
+ path: 'tables/table/obs/annotation',
200
+ name: 'annotation',
201
+ },
202
+ ],
203
+ },
204
+ },
205
+ },
206
+ ]);
207
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.spatialdata.json']);
208
+ });
209
+
210
+ it('generateConfig for OME-Zarr image fills in datasets part of config', async () => {
211
+ const parsedUrls = [
212
+ {
213
+ url: './mouse_liver.ome.json',
214
+ fileType: 'image.ome-zarr',
215
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
216
+ },
217
+ ];
218
+ const { config, stores } = await generateConfig(parsedUrls);
219
+ expect(config.toJSON().datasets[0].files).toEqual([
220
+ {
221
+ url: './mouse_liver.ome.json',
222
+ fileType: 'image.ome-zarr',
223
+ },
224
+ ]);
225
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.ome.json']);
226
+ });
227
+
228
+ it('generateConfig for OME-TIFF image fills in datasets part of config, without a store present', async () => {
229
+ const parsedUrls = [
230
+ {
231
+ url: 'https://example.com/mouse_liver.ome.tif',
232
+ fileType: 'image.ome-tiff',
233
+ },
234
+ ];
235
+ const { config, stores } = await generateConfig(parsedUrls);
236
+ expect(config.toJSON().datasets[0].files).toEqual([
237
+ {
238
+ url: 'https://example.com/mouse_liver.ome.tif',
239
+ fileType: 'image.ome-tiff',
240
+ },
241
+ ]);
242
+ expect(Object.keys(stores)).toEqual([]);
243
+ });
244
+
245
+ it('generateConfig for OME-Zarr two images fills in datasets part of config', async () => {
246
+ const parsedUrls = [
247
+ {
248
+ url: './mouse_liver.ome.json',
249
+ fileType: 'image.ome-zarr',
250
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
251
+ },
252
+ {
253
+ url: './mouse_liver.labels.ome.json',
254
+ fileType: 'obsSegmentations.ome-zarr',
255
+ store: createStoreFromMapContents(obsSegmentationsOmeZarrMouseLiverFixture),
256
+ },
257
+ ];
258
+ const { config, stores } = await generateConfig(parsedUrls);
259
+ expect(config.toJSON().datasets[0].files).toEqual([
260
+ {
261
+ url: './mouse_liver.ome.json',
262
+ fileType: 'image.ome-zarr',
263
+ },
264
+ {
265
+ url: './mouse_liver.labels.ome.json',
266
+ fileType: 'obsSegmentations.ome-zarr',
267
+ },
268
+ ]);
269
+ expect(Object.keys(stores)).toEqual([
270
+ './mouse_liver.ome.json',
271
+ './mouse_liver.labels.ome.json',
272
+ ]);
273
+ });
274
+ });
@@ -0,0 +1,274 @@
1
+ [
2
+ [
3
+ "/.zattrs",
4
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiYW5uZGF0YSIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
5
+ ],
6
+ [
7
+ "/.zgroup",
8
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
9
+ ],
10
+ [
11
+ "/X/.zattrs",
12
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiY3NyX21hdHJpeCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMTAsCiAgICAgICAgOTkKICAgIF0KfQ=="
13
+ ],
14
+ [
15
+ "/X/.zgroup",
16
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
17
+ ],
18
+ [
19
+ "/X/data/.zarray",
20
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMzIKICAgIF0sCiAgICAiY29tcHJlc3NvciI6IHsKICAgICAgICAiYmxvY2tzaXplIjogMCwKICAgICAgICAiY2xldmVsIjogNSwKICAgICAgICAiY25hbWUiOiAibHo0IiwKICAgICAgICAiaWQiOiAiYmxvc2MiLAogICAgICAgICJzaHVmZmxlIjogMQogICAgfSwKICAgICJkdHlwZSI6ICI8dTQiLAogICAgImZpbGxfdmFsdWUiOiAwLAogICAgImZpbHRlcnMiOiBudWxsLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEzMgogICAgXSwKICAgICJ6YXJyX2Zvcm1hdCI6IDIKfQ=="
21
+ ],
22
+ [
23
+ "/X/data/0",
24
+ "AgEhBBACAAAQAgAAyQAAABQAAACEAAAAQQgBCQdTCyQBAwECPgEFEgEJcwgEAgECAgENAQYFAQIBAQQjBgIBBAIDDgEiAgcBAQxzBQUCBgQEJxsBBg0GAwEJAQEFAgIcAQEHDgEOAQQCAQEBIwEFBAUBA0MBBQMBBAQBAhADBBQBBwQEAQdoBAQCAgECAQYBBgEDAggCCBcBAgEBCwAAAB8AAQBrUAAAAAAACwAAAB8AAQBrUAAAAAAACwAAAB8AAQBrUAAAAAAA"
25
+ ],
26
+ [
27
+ "/X/indices/.zarray",
28
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMzIKICAgIF0sCiAgICAiY29tcHJlc3NvciI6IHsKICAgICAgICAiYmxvY2tzaXplIjogMCwKICAgICAgICAiY2xldmVsIjogNSwKICAgICAgICAiY25hbWUiOiAibHo0IiwKICAgICAgICAiaWQiOiAiYmxvc2MiLAogICAgICAgICJzaHVmZmxlIjogMQogICAgfSwKICAgICJkdHlwZSI6ICI8aTQiLAogICAgImZpbGxfdmFsdWUiOiAwLAogICAgImZpbHRlcnMiOiBudWxsLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEzMgogICAgXSwKICAgICJ6YXJyX2Zvcm1hdCI6IDIKfQ=="
29
+ ],
30
+ [
31
+ "/X/indices/0",
32
+ "AgEhBBACAAAQAgAAyQAAABQAAACEAAAAJSgrLkNGS05PUhEbJScoLjpDRktOUlUNFR8lJygqKy4xOkNGSUpLTlFSVxslJygqKy5GS05SAgULDxQYHSUoKisuMDc4O0NGTE5RUlldDxRGTl0NJScoKi46Q0ZLTlMbJSgqLkZLTiUnKCouPkNGS05SUwUHDQ4kJScoLjM+Q0ZJTlNUCwAAAB8AAQBrUAAAAAAACwAAAB8AAQBrUAAAAAAACwAAAB8AAQBrUAAAAAAA"
33
+ ],
34
+ [
35
+ "/X/indptr/.zarray",
36
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMQogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogIjxpNCIsCiAgICAiZmlsbF92YWx1ZSI6IDAsCiAgICAiZmlsdGVycyI6IG51bGwsCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMTEKICAgIF0sCiAgICAiemFycl9mb3JtYXQiOiAyCn0="
37
+ ],
38
+ [
39
+ "/X/indptr/0",
40
+ "AgEzBCwAAAAsAAAAPAAAAAAAAAAKAAAAFwAAACsAAAA2AAAATgAAAFMAAABfAAAAZwAAAHMAAACEAAAA"
41
+ ],
42
+ [
43
+ "/layers/.zattrs",
44
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
45
+ ],
46
+ [
47
+ "/layers/.zgroup",
48
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
49
+ ],
50
+ [
51
+ "/obs/.zattrs",
52
+ "ewogICAgIl9pbmRleCI6ICJfaW5kZXgiLAogICAgImNvbHVtbi1vcmRlciI6IFsKICAgICAgICAiY2VsbF9JRCIsCiAgICAgICAgImZvdl9sYWJlbHMiLAogICAgICAgICJhbm5vdGF0aW9uIgogICAgXSwKICAgICJlbmNvZGluZy10eXBlIjogImRhdGFmcmFtZSIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjIuMCIKfQ=="
53
+ ],
54
+ [
55
+ "/obs/.zgroup",
56
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
57
+ ],
58
+ [
59
+ "/obs/_index/.zarray",
60
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMAogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxPIiwKICAgICJmaWxsX3ZhbHVlIjogMCwKICAgICJmaWx0ZXJzIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogInZsZW4tdXRmOCIKICAgICAgICB9CiAgICBdLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEwCiAgICBdLAogICAgInphcnJfZm9ybWF0IjogMgp9"
61
+ ],
62
+ [
63
+ "/obs/_index/.zattrs",
64
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
65
+ ],
66
+ [
67
+ "/obs/_index/0",
68
+ "AgEzAVQAAABUAAAAZAAAAAoAAAAEAAAAMjEyMwQAAAAyMTUyBAAAADIyMzcEAAAAMjI0NQQAAAAyMzU4BAAAADIzODUEAAAAMjQwNgQAAAAyNDUyBAAAADI0NTcEAAAAMjQ3OQ=="
69
+ ],
70
+ [
71
+ "/obs/annotation/.zattrs",
72
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiY2F0ZWdvcmljYWwiLAogICAgImVuY29kaW5nLXZlcnNpb24iOiAiMC4yLjAiLAogICAgIm9yZGVyZWQiOiBmYWxzZQp9"
73
+ ],
74
+ [
75
+ "/obs/annotation/.zgroup",
76
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
77
+ ],
78
+ [
79
+ "/obs/annotation/categories/.zarray",
80
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMAogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxPIiwKICAgICJmaWxsX3ZhbHVlIjogMCwKICAgICJmaWx0ZXJzIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogInZsZW4tdXRmOCIKICAgICAgICB9CiAgICBdLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEwCiAgICBdLAogICAgInphcnJfZm9ybWF0IjogMgp9"
81
+ ],
82
+ [
83
+ "/obs/annotation/categories/.zattrs",
84
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
85
+ ],
86
+ [
87
+ "/obs/annotation/categories/0",
88
+ "AgEjAaMAAACjAAAAswAAAAoAAAAHAAAAQiBjZWxscw4AAABDaG9sYW5naW9jeXRlcwoAAABGaWJyb2JsYXN0CwAAAEhlcGF0b2N5dGVzDQAAAEt1cGZmZXIgY2VsbHMMAAAATFNFQyBDZW50cmFsCwAAAExTRUMgUG9ydGFsEQAAAE90aGVyIGltbXVuZWNlbGxzCAAAAHN0ZWxsYXRlEAAAAHVua25vd25fY2VsbHR5cGU="
89
+ ],
90
+ [
91
+ "/obs/annotation/codes/.zarray",
92
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMAogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxpMSIsCiAgICAiZmlsbF92YWx1ZSI6IDAsCiAgICAiZmlsdGVycyI6IG51bGwsCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMTAKICAgIF0sCiAgICAiemFycl9mb3JtYXQiOiAyCn0="
93
+ ],
94
+ [
95
+ "/obs/annotation/codes/.zattrs",
96
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiYXJyYXkiLAogICAgImVuY29kaW5nLXZlcnNpb24iOiAiMC4yLjAiCn0="
97
+ ],
98
+ [
99
+ "/obs/annotation/codes/0",
100
+ "AgEzAQoAAAAKAAAAGgAAAAMDAwMECQMDAwA="
101
+ ],
102
+ [
103
+ "/obs/cell_ID/.zarray",
104
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMAogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxPIiwKICAgICJmaWxsX3ZhbHVlIjogMCwKICAgICJmaWx0ZXJzIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogInZsZW4tdXRmOCIKICAgICAgICB9CiAgICBdLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEwCiAgICBdLAogICAgInphcnJfZm9ybWF0IjogMgp9"
105
+ ],
106
+ [
107
+ "/obs/cell_ID/.zattrs",
108
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
109
+ ],
110
+ [
111
+ "/obs/cell_ID/0",
112
+ "AgEzAVQAAABUAAAAZAAAAAoAAAAEAAAAMzc2MAQAAAAzODIyBAAAADQwMTEEAAAANDAyNwQAAAA0MzAxBAAAADQzNzQEAAAANDQzNQQAAAA0NTc3BAAAADQ1OTMEAAAANDY1Ng=="
113
+ ],
114
+ [
115
+ "/obs/fov_labels/.zattrs",
116
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiY2F0ZWdvcmljYWwiLAogICAgImVuY29kaW5nLXZlcnNpb24iOiAiMC4yLjAiLAogICAgIm9yZGVyZWQiOiBmYWxzZQp9"
117
+ ],
118
+ [
119
+ "/obs/fov_labels/.zgroup",
120
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
121
+ ],
122
+ [
123
+ "/obs/fov_labels/categories/.zarray",
124
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxCiAgICBdLAogICAgImNvbXByZXNzb3IiOiB7CiAgICAgICAgImJsb2Nrc2l6ZSI6IDAsCiAgICAgICAgImNsZXZlbCI6IDUsCiAgICAgICAgImNuYW1lIjogImx6NCIsCiAgICAgICAgImlkIjogImJsb3NjIiwKICAgICAgICAic2h1ZmZsZSI6IDEKICAgIH0sCiAgICAiZHR5cGUiOiAifE8iLAogICAgImZpbGxfdmFsdWUiOiAwLAogICAgImZpbHRlcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAidmxlbi11dGY4IgogICAgICAgIH0KICAgIF0sCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMQogICAgXSwKICAgICJ6YXJyX2Zvcm1hdCI6IDIKfQ=="
125
+ ],
126
+ [
127
+ "/obs/fov_labels/categories/.zattrs",
128
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
129
+ ],
130
+ [
131
+ "/obs/fov_labels/categories/0",
132
+ "AgEzARoAAAAaAAAAKgAAAAEAAAASAAAAbnVjbGV1c19ib3VuZGFyaWVz"
133
+ ],
134
+ [
135
+ "/obs/fov_labels/codes/.zarray",
136
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMAogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxpMSIsCiAgICAiZmlsbF92YWx1ZSI6IDAsCiAgICAiZmlsdGVycyI6IG51bGwsCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMTAKICAgIF0sCiAgICAiemFycl9mb3JtYXQiOiAyCn0="
137
+ ],
138
+ [
139
+ "/obs/fov_labels/codes/.zattrs",
140
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiYXJyYXkiLAogICAgImVuY29kaW5nLXZlcnNpb24iOiAiMC4yLjAiCn0="
141
+ ],
142
+ [
143
+ "/obs/fov_labels/codes/0",
144
+ "AgEzAQoAAAAKAAAAGgAAAAAAAAAAAAAAAAA="
145
+ ],
146
+ [
147
+ "/obsm/.zattrs",
148
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
149
+ ],
150
+ [
151
+ "/obsm/.zgroup",
152
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
153
+ ],
154
+ [
155
+ "/obsm/spatial/.zarray",
156
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxMCwKICAgICAgICAyCiAgICBdLAogICAgImNvbXByZXNzb3IiOiB7CiAgICAgICAgImJsb2Nrc2l6ZSI6IDAsCiAgICAgICAgImNsZXZlbCI6IDUsCiAgICAgICAgImNuYW1lIjogImx6NCIsCiAgICAgICAgImlkIjogImJsb3NjIiwKICAgICAgICAic2h1ZmZsZSI6IDEKICAgIH0sCiAgICAiZHR5cGUiOiAiPGY4IiwKICAgICJmaWxsX3ZhbHVlIjogMC4wLAogICAgImZpbHRlcnMiOiBudWxsLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDEwLAogICAgICAgIDIKICAgIF0sCiAgICAiemFycl9mb3JtYXQiOiAyCn0="
157
+ ],
158
+ [
159
+ "/obsm/spatial/.zattrs",
160
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiYXJyYXkiLAogICAgImVuY29kaW5nLXZlcnNpb24iOiAiMC4yLjAiCn0="
161
+ ],
162
+ [
163
+ "/obsm/spatial/0.0",
164
+ "AgEzCKAAAACgAAAAsAAAAEmSJEkScI9Abtu2bcsqp0C1BnKSuR6TQCm/sc2oOadA7XNITTCCkED2OaQmGLqnQGjdYIp8ipFAinzWDabIp0Avp+DlFGaOQD801odGh6hAHMdxHMfFkUBVVVVVVXuoQHfBX8UJ1ZBAmOYu+KviqEC+4iu+4m+SQM3MzMzMJKlAzczMzEw6kUAAAAAAgDmpQNcOzLUD35NAwVw7MNd8qUA="
165
+ ],
166
+ [
167
+ "/obsp/.zattrs",
168
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
169
+ ],
170
+ [
171
+ "/obsp/.zgroup",
172
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
173
+ ],
174
+ [
175
+ "/uns/.zattrs",
176
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
177
+ ],
178
+ [
179
+ "/uns/.zgroup",
180
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
181
+ ],
182
+ [
183
+ "/uns/annotation_colors/.zarray",
184
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICA0CiAgICBdLAogICAgImNvbXByZXNzb3IiOiB7CiAgICAgICAgImJsb2Nrc2l6ZSI6IDAsCiAgICAgICAgImNsZXZlbCI6IDUsCiAgICAgICAgImNuYW1lIjogImx6NCIsCiAgICAgICAgImlkIjogImJsb3NjIiwKICAgICAgICAic2h1ZmZsZSI6IDEKICAgIH0sCiAgICAiZHR5cGUiOiAifE8iLAogICAgImZpbGxfdmFsdWUiOiAwLAogICAgImZpbHRlcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAidmxlbi11dGY4IgogICAgICAgIH0KICAgIF0sCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgNAogICAgXSwKICAgICJ6YXJyX2Zvcm1hdCI6IDIKfQ=="
185
+ ],
186
+ [
187
+ "/uns/annotation_colors/.zattrs",
188
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
189
+ ],
190
+ [
191
+ "/uns/annotation_colors/0",
192
+ "AgEzATAAAAAwAAAAQAAAAAQAAAAHAAAAIzgwODAwMAcAAAAjZmY4YzAwBwAAACNmZjAwMDAHAAAAIzY5Njk2OQ=="
193
+ ],
194
+ [
195
+ "/uns/spatialdata_attrs/.zattrs",
196
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
197
+ ],
198
+ [
199
+ "/uns/spatialdata_attrs/.zgroup",
200
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
201
+ ],
202
+ [
203
+ "/uns/spatialdata_attrs/instance_key/.zarray",
204
+ "ewogICAgImNodW5rcyI6IFtdLAogICAgImNvbXByZXNzb3IiOiBudWxsLAogICAgImR0eXBlIjogIjxVNyIsCiAgICAiZmlsbF92YWx1ZSI6ICIiLAogICAgImZpbHRlcnMiOiBudWxsLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogW10sCiAgICAiemFycl9mb3JtYXQiOiAyCn0="
205
+ ],
206
+ [
207
+ "/uns/spatialdata_attrs/instance_key/.zattrs",
208
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nIiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
209
+ ],
210
+ [
211
+ "/uns/spatialdata_attrs/instance_key/0",
212
+ "YwAAAGUAAABsAAAAbAAAAF8AAABJAAAARAAAAA=="
213
+ ],
214
+ [
215
+ "/uns/spatialdata_attrs/region/.zarray",
216
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICAxCiAgICBdLAogICAgImNvbXByZXNzb3IiOiB7CiAgICAgICAgImJsb2Nrc2l6ZSI6IDAsCiAgICAgICAgImNsZXZlbCI6IDUsCiAgICAgICAgImNuYW1lIjogImx6NCIsCiAgICAgICAgImlkIjogImJsb3NjIiwKICAgICAgICAic2h1ZmZsZSI6IDEKICAgIH0sCiAgICAiZHR5cGUiOiAifE8iLAogICAgImZpbGxfdmFsdWUiOiAwLAogICAgImZpbHRlcnMiOiBbCiAgICAgICAgewogICAgICAgICAgICAiaWQiOiAidmxlbi11dGY4IgogICAgICAgIH0KICAgIF0sCiAgICAib3JkZXIiOiAiQyIsCiAgICAic2hhcGUiOiBbCiAgICAgICAgMQogICAgXSwKICAgICJ6YXJyX2Zvcm1hdCI6IDIKfQ=="
217
+ ],
218
+ [
219
+ "/uns/spatialdata_attrs/region/.zattrs",
220
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
221
+ ],
222
+ [
223
+ "/uns/spatialdata_attrs/region/0",
224
+ "AgEzARoAAAAaAAAAKgAAAAEAAAASAAAAbnVjbGV1c19ib3VuZGFyaWVz"
225
+ ],
226
+ [
227
+ "/uns/spatialdata_attrs/region_key/.zarray",
228
+ "ewogICAgImNodW5rcyI6IFtdLAogICAgImNvbXByZXNzb3IiOiBudWxsLAogICAgImR0eXBlIjogIjxVMTAiLAogICAgImZpbGxfdmFsdWUiOiAiIiwKICAgICJmaWx0ZXJzIjogbnVsbCwKICAgICJvcmRlciI6ICJDIiwKICAgICJzaGFwZSI6IFtdLAogICAgInphcnJfZm9ybWF0IjogMgp9"
229
+ ],
230
+ [
231
+ "/uns/spatialdata_attrs/region_key/.zattrs",
232
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nIiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
233
+ ],
234
+ [
235
+ "/uns/spatialdata_attrs/region_key/0",
236
+ "ZgAAAG8AAAB2AAAAXwAAAGwAAABhAAAAYgAAAGUAAABsAAAAcwAAAA=="
237
+ ],
238
+ [
239
+ "/var/.zattrs",
240
+ "ewogICAgIl9pbmRleCI6ICJfaW5kZXgiLAogICAgImNvbHVtbi1vcmRlciI6IFtdLAogICAgImVuY29kaW5nLXR5cGUiOiAiZGF0YWZyYW1lIiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
241
+ ],
242
+ [
243
+ "/var/.zgroup",
244
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
245
+ ],
246
+ [
247
+ "/var/_index/.zarray",
248
+ "ewogICAgImNodW5rcyI6IFsKICAgICAgICA5OQogICAgXSwKICAgICJjb21wcmVzc29yIjogewogICAgICAgICJibG9ja3NpemUiOiAwLAogICAgICAgICJjbGV2ZWwiOiA1LAogICAgICAgICJjbmFtZSI6ICJsejQiLAogICAgICAgICJpZCI6ICJibG9zYyIsCiAgICAgICAgInNodWZmbGUiOiAxCiAgICB9LAogICAgImR0eXBlIjogInxPIiwKICAgICJmaWxsX3ZhbHVlIjogMCwKICAgICJmaWx0ZXJzIjogWwogICAgICAgIHsKICAgICAgICAgICAgImlkIjogInZsZW4tdXRmOCIKICAgICAgICB9CiAgICBdLAogICAgIm9yZGVyIjogIkMiLAogICAgInNoYXBlIjogWwogICAgICAgIDk5CiAgICBdLAogICAgInphcnJfZm9ybWF0IjogMgp9"
249
+ ],
250
+ [
251
+ "/var/_index/.zattrs",
252
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAic3RyaW5nLWFycmF5IiwKICAgICJlbmNvZGluZy12ZXJzaW9uIjogIjAuMi4wIgp9"
253
+ ],
254
+ [
255
+ "/var/_index/0",
256
+ "AgEhAWsDAABrAwAAWQMAABQAAABBAwAA9BRjAAAABQAAAEFjdGEyCAAAAEFkYW10c2wyBgAAAEFkZ3JlMQoA8CBnNggAAABBdHA2djBkMgMAAABBeGwFAAAAQzVhcjEEAAAAQ2NyMgQAAABDY3I3BBkAwWQxNAQAAABDZDE5BRAAQzIwNwYJAPILOWEEAAAAQ2QzNgQAAABDZDNlBAAAAENkNWwrAPQZNzlhAwAAAENkOQUAAABDaGlsMwcAAABDbGVjMTBhBgAAAENsZWM0ZgoAwDlhBQAAAENsaWM1BkEA8gFvbDFhMQcAAABDb2xlYzExFQDwQ3g2YTIGAAAAQ3gzY3IxBgAAAEN4Y2wxMgYAAABDeXAyZTEDAAAARGNuAwAAAERlcwMAAABEcHQFAAAARXBjYW0FAAAARjEzYTEFAAAARmNncjHGAPAWRmx0MwQAAABGbHQ0AwAAAEZuMQUAAABGb2xyMgUAAABHZGYxNRkA8AxHaHIEAAAAR2phNQQAAABHbHMyBAAAAEdsdWy+APAgR3BubWIFAAAAR3JpcDEDAAAASGFsAwAAAEhnZgYAAABJZ2ZicDMFAAAASXRnYWUzAAAJABN4CQAgYjcJAPARS3J0MTkEAAAATGdyNQQAAABMaHg2BgAAAExpbHJhNQMKACBwbCoA8AdMeXZlMQQAAABNYWZiBQAAAE1hcmNvGgDBTWZhcDQEAAAATWdswgBDTW1wMQkA8BZybjEEAAAATXNsbgUAAABNeWgxMQUAAABOY2FtMQQAAABOZ2ZyRQD1Ek5yeG4xBgAAAE9sZm1sMwQAAABQY2sxBgAAAFBkZ2ZyYQoAwGIGAAAAUGVjYW0xBQoAwWxwcDEFAAAAUHJveG0A8E1SZWxuBQAAAFJzcG8zAwAAAFNkcwUAAABTZXB0MwcAAABTaWdsZWNoBQAAAFNpcnBhBwAAAFNsYzQwYTEEAAAAU294OQMAAABTcG4FAAAAU3BvbjIEAAAAU3BwMasAwlN0YWIyBQAAAFN2ZXsA8SpUaW1kNAcAAABUbWVtMTE5BQAAAFRyZW0yBQAAAFVwazNiBQAAAFZzaWc0AwAAAFZ3ZgQAAABXbnQvAfAFV250OWIDAAAAV3QxBAAAAFhjcjE="
257
+ ],
258
+ [
259
+ "/varm/.zattrs",
260
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
261
+ ],
262
+ [
263
+ "/varm/.zgroup",
264
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
265
+ ],
266
+ [
267
+ "/varp/.zattrs",
268
+ "ewogICAgImVuY29kaW5nLXR5cGUiOiAiZGljdCIsCiAgICAiZW5jb2RpbmctdmVyc2lvbiI6ICIwLjEuMCIKfQ=="
269
+ ],
270
+ [
271
+ "/varp/.zgroup",
272
+ "ewogICAgInphcnJfZm9ybWF0IjogMgp9"
273
+ ]
274
+ ]