Skip to content

Commit cedeb9e

Browse files
committed
[WIP] Zarrr V3
1 parent 49b7ae8 commit cedeb9e

File tree

13 files changed

+214
-50
lines changed

13 files changed

+214
-50
lines changed

src/lib/data/ZarrDataManager.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ export class ZarrDataManager {
135135
return datasources.levels[0].datasources[varname];
136136
}
137137

138+
static async getDimensionNames(datasources: TSources, varname: string) {
139+
const source = this.getDatasetSource(datasources, varname) as TDataSource;
140+
if (source.attrs && source.attrs.dimensionNames) {
141+
return source.attrs.dimensionNames as string[];
142+
}
143+
144+
const datavar = await ZarrDataManager.getVariableInfo(
145+
ZarrDataManager.getDatasetSource(datasources, varname),
146+
varname
147+
);
148+
return datavar.attrs._ARRAY_DIMENSIONS as string[];
149+
}
150+
138151
static invalidateCache() {
139152
this.fetchStore = null;
140153
this.fetchStorePath = null;

src/lib/data/dimensionHandling.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,14 @@ function setDimensionMinMaxBounds(
8282
*/
8383
function createDimensionRanges(
8484
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
85+
dimensionNames: string[] | undefined,
8586
presetStarts: Record<string, string>,
8687
presetMinBounds: Record<string, string>,
8788
presetMaxBounds: Record<string, string>,
8889
indicesToIgnore: number[]
8990
) {
90-
const dimensions = datavar.attrs._ARRAY_DIMENSIONS as string[];
9191
const shape = datavar.shape;
92+
const dimensions = dimensionNames || [];
9293
const indices: TDimensionRange[] = shape.map((size, i) => {
9394
if (indicesToIgnore.includes(i)) {
9495
return null;
@@ -154,6 +155,7 @@ function calculateIndices(
154155

155156
export function buildDimensionRangesAndIndices(
156157
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
158+
dimensionNames: string[] | undefined,
157159
presetStarts: Record<string, string>,
158160
presetMinBounds: Record<string, string>,
159161
presetMaxBounds: Record<string, string>,
@@ -165,6 +167,7 @@ export function buildDimensionRangesAndIndices(
165167
let dimensionRanges: TDimensionRange[] = [];
166168
dimensionRanges = createDimensionRanges(
167169
datavar,
170+
dimensionNames,
168171
presetStarts,
169172
presetMinBounds,
170173
presetMaxBounds,

src/lib/data/gridTypeDetector.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,10 @@ export async function getGridType(
164164
return crsGridType;
165165
}
166166

167-
// Check if it's a regular grid based on dimensions
168-
const dimensions = datavar.attrs._ARRAY_DIMENSIONS as string[];
167+
const dimensions = await ZarrDataManager.getDimensionNames(
168+
datasources!,
169+
varnameSelector
170+
);
169171
if (checkRegularGridFromDimensions(dimensions)) {
170172
return GRID_TYPES.REGULAR;
171173
}

src/lib/types/GlobeTypes.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,12 @@ export type TSources = {
6969
datasources: Record<string, TDataSource>;
7070
}[];
7171
};
72+
73+
export type TZarrV3RootMetadata = {
74+
zarr_format: 3;
75+
node_type: "group";
76+
attributes?: Record<string, unknown>;
77+
consolidated_metadata: {
78+
metadata: Record<string, zarr.ArrayMetadata | zarr.GroupMetadata>;
79+
};
80+
};

src/ui/grids/Curvilinear.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,13 @@ async function fetchAndRenderData(
454454
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
455455
updateMode: TUpdateMode
456456
) {
457+
const dimensionNames = await ZarrDataManager.getDimensionNames(
458+
props.datasources!,
459+
varnameSelector.value
460+
);
457461
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
458462
datavar,
463+
dimensionNames,
459464
paramDimIndices.value,
460465
paramDimMinBounds.value,
461466
paramDimMaxBounds.value,

src/ui/grids/GaussianReduced.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,8 +376,13 @@ async function fetchAndRenderData(
376376
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
377377
updateMode: TUpdateMode
378378
) {
379+
const dimensionNames = await ZarrDataManager.getDimensionNames(
380+
props.datasources!,
381+
varnameSelector.value
382+
);
379383
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
380384
datavar,
385+
dimensionNames,
381386
paramDimIndices.value,
382387
paramDimMinBounds.value,
383388
paramDimMaxBounds.value,

src/ui/grids/Healpix.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,17 @@ async function getData(updateMode: TUpdateMode = UPDATE_MODE.INITIAL_LOAD) {
524524
}
525525
}
526526
527-
function prepareDimensionData(
527+
async function prepareDimensionData(
528528
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
529529
updateMode: TUpdateMode
530530
) {
531+
const dimensionNames = await ZarrDataManager.getDimensionNames(
532+
props.datasources!,
533+
varnameSelector.value
534+
);
531535
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
532536
datavar,
537+
dimensionNames,
533538
paramDimIndices.value,
534539
paramDimMinBounds.value,
535540
paramDimMaxBounds.value,

src/ui/grids/Irregular.vue

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -320,13 +320,37 @@ async function getDimensionValues(
320320
return dimValues;
321321
}
322322
323+
async function prepareDimensionData(
324+
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
325+
updateMode: TUpdateMode
326+
) {
327+
const dimensionNames = await ZarrDataManager.getDimensionNames(
328+
props.datasources!,
329+
varnameSelector.value
330+
);
331+
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
332+
datavar,
333+
dimensionNames,
334+
paramDimIndices.value,
335+
paramDimMinBounds.value,
336+
paramDimMaxBounds.value,
337+
dimSlidersValues.value.length > 0 ? dimSlidersValues.value : null,
338+
[datavar.shape.length - 1],
339+
varinfo.value?.dimRanges,
340+
updateMode === UPDATE_MODE.SLIDER_TOGGLE
341+
);
342+
343+
return { dimensionRanges, indices };
344+
}
345+
323346
async function fetchAndRenderData(
324347
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
325348
updateMode: TUpdateMode
326349
) {
327350
// Load latitudes and longitudes arrays (1D)
328351
const { latitudes, longitudes, latitudesAttrs, longitudesAttrs } =
329352
await getLatLonData(datavar, props.datasources);
353+
// FIXME: Needs to be changed for Zarr V3
330354
const dimensions = datavar.attrs._ARRAY_DIMENSIONS as string[];
331355
const geoDims: number[] = [];
332356
for (let i = 0; i < dimensions.length; i++) {
@@ -338,15 +362,10 @@ async function fetchAndRenderData(
338362
geoDims.push(i);
339363
}
340364
}
341-
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
365+
366+
const { dimensionRanges, indices } = await prepareDimensionData(
342367
datavar,
343-
paramDimIndices.value,
344-
paramDimMinBounds.value,
345-
paramDimMaxBounds.value,
346-
dimSlidersValues.value.length > 0 ? dimSlidersValues.value : null,
347-
geoDims,
348-
varinfo.value?.dimRanges,
349-
updateMode === UPDATE_MODE.SLIDER_TOGGLE
368+
updateMode
350369
);
351370
352371
let rawData = castDataVarToFloat32(

src/ui/grids/Regular.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,11 @@ async function getDims() {
155155
// On the other hand, I didn't find any case where latitudes and longitudes were not
156156
// the two last dimensions of the data variable.
157157
const grid = props.datasources!.levels[0].grid;
158-
const datavar = await ZarrDataManager.getVariableInfo(
159-
ZarrDataManager.getDatasetSource(props.datasources!, varnameSelector.value),
158+
const dimensions = await ZarrDataManager.getDimensionNames(
159+
props.datasources!,
160160
varnameSelector.value
161161
);
162162
163-
const dimensions = datavar.attrs._ARRAY_DIMENSIONS as string[];
164163
const latName = dimensions[dimensions.length - 2];
165164
const lonName = dimensions[dimensions.length - 1];
166165
const [latitudesData, longitudesData] = await Promise.all([
@@ -449,8 +448,13 @@ async function fetchAndRenderData(
449448
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
450449
updateMode: TUpdateMode
451450
) {
451+
const dimensionNames = await ZarrDataManager.getDimensionNames(
452+
props.datasources!,
453+
varnameSelector.value
454+
);
452455
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
453456
datavar,
457+
dimensionNames,
454458
paramDimIndices.value,
455459
paramDimMinBounds.value,
456460
paramDimMaxBounds.value,

src/ui/grids/Triangular.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,13 @@ async function fetchAndRenderData(
343343
datavar: zarr.Array<zarr.DataType, zarr.FetchStore>,
344344
updateMode: TUpdateMode
345345
) {
346+
const dimensionNames = await ZarrDataManager.getDimensionNames(
347+
props.datasources!,
348+
varnameSelector.value
349+
);
346350
const { dimensionRanges, indices } = buildDimensionRangesAndIndices(
347351
datavar,
352+
dimensionNames,
348353
paramDimIndices.value,
349354
paramDimMinBounds.value,
350355
paramDimMaxBounds.value,

0 commit comments

Comments
 (0)