@vitessce/config 3.6.3 → 3.6.4

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,258 @@
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
+ describe('generateConfig', () => {
10
+ it('parses URLs', () => {
11
+ const s1 = 'https://example.com/my_image.ome.tif';
12
+ expect(parseUrls(s1)).toEqual([
13
+ {
14
+ url: 'https://example.com/my_image.ome.tif',
15
+ fileType: 'image.ome-tiff',
16
+ },
17
+ ]);
18
+ const s2 = 'https://example.com/my_image.ome.tif#obsSegmentations.ome-tiff';
19
+ expect(parseUrls(s2)).toEqual([
20
+ {
21
+ url: 'https://example.com/my_image.ome.tif',
22
+ fileType: 'obsSegmentations.ome-tiff',
23
+ },
24
+ ]);
25
+ const s3 = 'https://example.com/my_image.ome.tif#obsSegmentations.ome-tiff;http://another.com/obj.zarr#anndata.zarr';
26
+ expect(parseUrls(s3)).toEqual([
27
+ {
28
+ url: 'https://example.com/my_image.ome.tif',
29
+ fileType: 'obsSegmentations.ome-tiff',
30
+ },
31
+ {
32
+ url: 'http://another.com/obj.zarr',
33
+ fileType: 'anndata.zarr',
34
+ },
35
+ ]);
36
+ });
37
+ it('parsed url to zmetadata for an AnnData object', async () => {
38
+ const parsedUrl = {
39
+ url: './mouse_liver.anndata.json',
40
+ fileType: 'anndata.zarr',
41
+ store: createStoreFromMapContents(anndataMouseLiverFixture),
42
+ };
43
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
44
+ expect(zmetadata.length).toEqual(7);
45
+ expect(zmetadata.map(d => d.path)).toEqual(['/', '/X', '/layers', '/obs', '/var', '/obsm', '/obsm/spatial']);
46
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
47
+ });
48
+ it('store for SpatialData object supports withConsolidated', async () => {
49
+ const initialStore = createStoreFromMapContents(spatialdataMouseLiverFixture);
50
+ const store = await withConsolidated(initialStore, { metadataKey: 'zmetadata' });
51
+ expect(store.contents().length).toEqual(41);
52
+ });
53
+ it('parsed url to zmetadata for a SpatialData object', async () => {
54
+ const parsedUrl = {
55
+ url: './mouse_liver.spatialdata.json',
56
+ fileType: 'spatialdata.zarr',
57
+ store: createStoreFromMapContents(spatialdataMouseLiverFixture),
58
+ };
59
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
60
+ expect(zmetadata.length).toEqual(41);
61
+ expect(zmetadata.map(d => d.path)).toEqual([
62
+ '/',
63
+ '/images',
64
+ '/images/raw_image',
65
+ '/images/raw_image/0',
66
+ '/images/raw_image/1',
67
+ '/labels',
68
+ '/labels/segmentation_mask',
69
+ '/labels/segmentation_mask/0',
70
+ '/points',
71
+ '/points/transcripts',
72
+ '/shapes',
73
+ '/shapes/nucleus_boundaries',
74
+ '/tables',
75
+ '/tables/table',
76
+ '/tables/table/X',
77
+ '/tables/table/X/data',
78
+ '/tables/table/X/indices',
79
+ '/tables/table/X/indptr',
80
+ '/tables/table/layers',
81
+ '/tables/table/obs',
82
+ '/tables/table/obs/_index',
83
+ '/tables/table/obs/annotation',
84
+ '/tables/table/obs/annotation/categories',
85
+ '/tables/table/obs/annotation/codes',
86
+ '/tables/table/obs/cell_ID',
87
+ '/tables/table/obs/fov_labels',
88
+ '/tables/table/obs/fov_labels/categories',
89
+ '/tables/table/obs/fov_labels/codes',
90
+ '/tables/table/obsm',
91
+ '/tables/table/obsm/spatial',
92
+ '/tables/table/obsp',
93
+ '/tables/table/uns',
94
+ '/tables/table/uns/annotation_colors',
95
+ '/tables/table/uns/spatialdata_attrs',
96
+ '/tables/table/uns/spatialdata_attrs/instance_key',
97
+ '/tables/table/uns/spatialdata_attrs/region',
98
+ '/tables/table/uns/spatialdata_attrs/region_key',
99
+ '/tables/table/var',
100
+ '/tables/table/var/_index',
101
+ '/tables/table/varm',
102
+ '/tables/table/varp',
103
+ ]);
104
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
105
+ });
106
+ it('parsed url to zmetadata for an OME-NGFF image', async () => {
107
+ const parsedUrl = {
108
+ url: './mouse_liver.ome.json',
109
+ fileType: 'image.ome-zarr',
110
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
111
+ };
112
+ const zmetadata = await parsedUrlToZmetadata(parsedUrl);
113
+ expect(zmetadata.length).toEqual(1);
114
+ expect(zmetadata.map(d => d.path)).toEqual(['/']);
115
+ expect(zmetadata.every(d => Boolean(d.attrs))).toBeTruthy();
116
+ });
117
+ it('generateConfig for AnnData object fills in datasets part of config', async () => {
118
+ const parsedUrls = [
119
+ {
120
+ url: './mouse_liver.anndata.json',
121
+ fileType: 'anndata.zarr',
122
+ store: createStoreFromMapContents(anndataMouseLiverFixture),
123
+ },
124
+ ];
125
+ const { config, stores } = await generateConfig(parsedUrls);
126
+ expect(config.toJSON().datasets[0].files).toEqual([
127
+ {
128
+ url: './mouse_liver.anndata.json',
129
+ fileType: 'anndata.zarr',
130
+ options: {
131
+ obsEmbedding: [],
132
+ obsSets: [],
133
+ obsFeatureMatrix: {
134
+ path: 'X',
135
+ },
136
+ obsLocations: {
137
+ path: 'obsm/spatial',
138
+ },
139
+ },
140
+ },
141
+ ]);
142
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.anndata.json']);
143
+ });
144
+ it('generateConfig for SpatialData object fills in datasets part of config', async () => {
145
+ const parsedUrls = [
146
+ {
147
+ url: './mouse_liver.spatialdata.json',
148
+ fileType: 'spatialdata.zarr',
149
+ store: createStoreFromMapContents(spatialdataMouseLiverFixture),
150
+ },
151
+ ];
152
+ const { config, stores } = await generateConfig(parsedUrls);
153
+ expect(config.toJSON().datasets[0].files).toEqual([
154
+ {
155
+ url: './mouse_liver.spatialdata.json',
156
+ fileType: 'spatialdata.zarr',
157
+ options: {
158
+ image: {
159
+ path: 'images/raw_image',
160
+ coordinateSystem: 'global',
161
+ },
162
+ labels: {
163
+ path: 'labels/segmentation_mask',
164
+ coordinateSystem: 'global',
165
+ },
166
+ obsSpots: {
167
+ // TODO: the test should be updated once fixed in the implementaiton,
168
+ // since these are not circle shapes.
169
+ path: 'shapes/nucleus_boundaries',
170
+ },
171
+ obsFeatureMatrix: {
172
+ path: 'tables/table/X',
173
+ },
174
+ obsSets: {
175
+ tablePath: 'tables/table',
176
+ obsSets: [
177
+ {
178
+ path: 'tables/table/obs/cell_ID',
179
+ name: 'cell_ID',
180
+ },
181
+ {
182
+ path: 'tables/table/obs/fov_labels',
183
+ name: 'fov_labels',
184
+ },
185
+ {
186
+ path: 'tables/table/obs/annotation',
187
+ name: 'annotation',
188
+ },
189
+ ],
190
+ },
191
+ },
192
+ },
193
+ ]);
194
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.spatialdata.json']);
195
+ });
196
+ it('generateConfig for OME-Zarr image fills in datasets part of config', async () => {
197
+ const parsedUrls = [
198
+ {
199
+ url: './mouse_liver.ome.json',
200
+ fileType: 'image.ome-zarr',
201
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
202
+ },
203
+ ];
204
+ const { config, stores } = await generateConfig(parsedUrls);
205
+ expect(config.toJSON().datasets[0].files).toEqual([
206
+ {
207
+ url: './mouse_liver.ome.json',
208
+ fileType: 'image.ome-zarr',
209
+ },
210
+ ]);
211
+ expect(Object.keys(stores)).toEqual(['./mouse_liver.ome.json']);
212
+ });
213
+ it('generateConfig for OME-TIFF image fills in datasets part of config, without a store present', async () => {
214
+ const parsedUrls = [
215
+ {
216
+ url: 'https://example.com/mouse_liver.ome.tif',
217
+ fileType: 'image.ome-tiff',
218
+ },
219
+ ];
220
+ const { config, stores } = await generateConfig(parsedUrls);
221
+ expect(config.toJSON().datasets[0].files).toEqual([
222
+ {
223
+ url: 'https://example.com/mouse_liver.ome.tif',
224
+ fileType: 'image.ome-tiff',
225
+ },
226
+ ]);
227
+ expect(Object.keys(stores)).toEqual([]);
228
+ });
229
+ it('generateConfig for OME-Zarr two images fills in datasets part of config', async () => {
230
+ const parsedUrls = [
231
+ {
232
+ url: './mouse_liver.ome.json',
233
+ fileType: 'image.ome-zarr',
234
+ store: createStoreFromMapContents(imageOmeZarrMouseLiverFixture),
235
+ },
236
+ {
237
+ url: './mouse_liver.labels.ome.json',
238
+ fileType: 'obsSegmentations.ome-zarr',
239
+ store: createStoreFromMapContents(obsSegmentationsOmeZarrMouseLiverFixture),
240
+ },
241
+ ];
242
+ const { config, stores } = await generateConfig(parsedUrls);
243
+ expect(config.toJSON().datasets[0].files).toEqual([
244
+ {
245
+ url: './mouse_liver.ome.json',
246
+ fileType: 'image.ome-zarr',
247
+ },
248
+ {
249
+ url: './mouse_liver.labels.ome.json',
250
+ fileType: 'obsSegmentations.ome-zarr',
251
+ },
252
+ ]);
253
+ expect(Object.keys(stores)).toEqual([
254
+ './mouse_liver.ome.json',
255
+ './mouse_liver.labels.ome.json',
256
+ ]);
257
+ });
258
+ });
@@ -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
+ ]