Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
128 changes: 128 additions & 0 deletions src/assets/catalogs/IcechunkCatalog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
export const ICECHUNK_CATALOG = [
{
key: 'chirps-daily',
label: 'CHIRPS Daily Precipitation',
subtitle: '',
store: 'https://data.source.coop/e4drr-project/observations/chirps_daily_icechunk',
},
{
key: 'earthmover-era5-surface',
label: 'Earthmover ERA5 Surface Reanalysis',
subtitle: 'Multi-Variable',
store: 'https://earthmover-icechunk-era5.s3.us-east-1.amazonaws.com/era5_surface_aws',
},
{
key: 'noaa-gfs-forecast',
label: 'NOAA GFS',
subtitle: 'Global Weather Forecast',
store: 'https://dynamical-noaa-gfs.s3.us-west-2.amazonaws.com/noaa-gfs-forecast/v0.2.7.icechunk/',
},
{
key: 'dwd-icon-eu-forecast',
label: 'DWD ICON-EU',
subtitle: 'Numerical Weather Forecast',
store: 'https://dynamical-dwd-icon-eu.s3.us-west-2.amazonaws.com/dwd-icon-eu-forecast-5-day/v0.2.0.icechunk/',
},
{
key: 'ecmwf-aifs-single-forecast',
label: 'ECMWF AIFS Single Forecast',
subtitle: 'Artificial Intelligence Forecasting System',
store: 'https://dynamical-ecmwf-aifs-single.s3.us-west-2.amazonaws.com/ecmwf-aifs-single-forecast/v0.1.0.icechunk/',
},
{
key: 'metoffice-global-wave',
label: 'UK Met Office Global Wave Forecast',
subtitle: '',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_wave.icechunk',
},
{
key: 'metoffice-global-deterministic-6h',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '6-hourly 24hr',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km_6hourly_24hr.icechunk',
},
{
key: 'nasa-geos-15min',
label: 'NASA GEOS Atmospheric Reanalysis',
subtitle: '15-minute',
store: 'https://data.source.coop/bkr/geos/geos_15min.icechunk',
},
{
key: 'metoffice-global-deterministic-11h',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '11-hour',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km_11hour.icechunk',
},
{
key: 'metoffice-global-deterministic',
label: 'UK Met Office Global Deterministic Atmosphere Forecast',
subtitle: '',
store: 'https://data.source.coop/bkr/metoffice/metoffice_global_deterministic_10km.icechunk',
},
{
key: 'noaa-hrrr-analysis',
label: 'NOAA HRRR',
subtitle: 'High-Resolution Rapid Refresh Analysis',
store: 'https://dynamical-noaa-hrrr.s3.us-west-2.amazonaws.com/noaa-hrrr-analysis/v0.2.0.icechunk/',
},
{
key: 'noaa-mrms-conus-hourly',
label: 'NOAA MRMS CONUS',
subtitle: 'Hourly Radar-Based Precipitation Analysis',
store: 'https://dynamical-noaa-mrms.s3.amazonaws.com/noaa-mrms-conus-analysis-hourly/v0.3.0.icechunk/',
},
{
key: 'ecmwf-aifs-ens-forecast',
label: 'ECMWF AIFS Ensemble Forecast',
subtitle: '',
store: 'https://dynamical-ecmwf-aifs-ens.s3.us-west-2.amazonaws.com/ecmwf-aifs-ens-forecast/v0.1.0.icechunk/',
},
{
key: 'ecmwf-ifs-ens-15day',
label: 'ECMWF IFS Ensemble 15-day Weather Forecast',
subtitle: '0.25°',
store: 'https://dynamical-ecmwf-ifs-ens.s3.us-west-2.amazonaws.com/ecmwf-ifs-ens-forecast-15-day-0-25-degree/v0.1.0.icechunk/',
},
{
key: 'noaa-gefs-35day-forecast',
label: 'NOAA GEFS 35-day Ensemble Forecast',
subtitle: '',
store: 'https://dynamical-noaa-gefs.s3.us-west-2.amazonaws.com/noaa-gefs-forecast-35-day/v0.2.0.icechunk/',
},
{
key: 'silam-aerosol',
label: 'SILAM Global Dust Model Forecasts',
subtitle: 'Aerosol',
store: 'https://data.source.coop/bkr/silam-dust/silam_aerosol.icechunk',
},
{
key: 'cams-aerosol-analysis',
label: 'CAMS Aerosol Analysis',
subtitle: 'Copernicus CAMS Operational Archive',
store: 'https://data.source.coop/bkr/cams/cams.icechunk',
},
{
key: 'cams-aerosol-forecast',
label: 'CAMS Aerosol Forecast',
subtitle: 'Copernicus CAMS Operational Archive',
store: 'https://data.source.coop/bkr/cams/cams_analysis_and_forecast.icechunk',
},
{
key: 'nasa-rasi',
label: 'NASA RASI',
subtitle: 'Risk Analysis and Solutions Innovators',
store: 'https://nasa-waterinsight.s3.us-west-2.amazonaws.com/virtual-zarr-store/icechunk/RASI/HISTORICAL/',
},
{
key: 'alaska-hrrr',
label: 'Alaska HRRR',
subtitle: '',
store: 'https://data.source.coop/bkr/dmi/alaska_hrrr.icechunk',
},
{
key: 'ndvi-test',
label: 'NDVI',
subtitle: 'Normalized Difference Vegetation Index',
store: 'https://data.source.coop/eeholmes/chlaz/icechunk',
},
];
92 changes: 92 additions & 0 deletions src/assets/catalogs/ZarrCatalog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export const ZARR_CATALOG = [
{
key: 'seasfire',
label: 'SeasFire Cube',
subtitle: 'A Global Dataset for Seasonal Fire Modeling in the Earth System',
store: 'https://s3.bgc-jena.mpg.de:9000/misc/seasfire_rechunked.zarr',
},
{
key: 'ESDC',
label: 'ESDC',
subtitle: 'Earth System Data Cube v3.0.2',
store: 'https://s3.bgc-jena.mpg.de:9000/esdl-esdc-v3.0.2/esdc-16d-2.5deg-46x72x1440-3.0.2.zarr',
},
{
key: 'precipitation',
label: 'Precipitation (EC-Earth3P-HR)',
subtitle: 'Precipitation data from EC-Earth3P-HR highresSST-present',
store: 'https://storage.googleapis.com/cmip6/CMIP6/HighResMIP/EC-Earth-Consortium/EC-Earth3P-HR/highresSST-present/r1i1p1f1/Amon/pr/gr/v20170811/',
},
{
key: 'arco-ocean',
label: 'ARCO-OCEAN',
subtitle: 'Global Ocean Reanalysis Daily',
store: 'https://ogs-arco-ocean.s3.eu-south-1.amazonaws.com/dataset/tres=1d/res=0p25/levels=10/',
},
{
key: 'cmip6-mpi-esm1-2-hr-tas',
label: 'CMIP6 MPI-ESM1-2-HR',
subtitle: 'Historical Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/CMIP/MPI-M/MPI-ESM1-2-HR/historical/r1i1p1f1/Amon/tas/gn/v20190710/',
},
{
key: 'cmip6-pmip-ipsl-cm6a-lr-tas',
label: 'CMIP6 PMIP IPSL-CM6A-LR',
subtitle: 'Mid-Holocene Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/PMIP/IPSL/IPSL-CM6A-LR/midHolocene/r1i1p1f3/Amon/tas/gr/v20180926/',
},
{
key: 'cmip6-hadgem3-gc31-hm-tas',
label: 'CMIP6 HighResMIP HadGEM3-GC31-HM',
subtitle: 'Near-Surface Air Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/HighResMIP/MOHC/HadGEM3-GC31-HM/highresSST-present/r1i1p1f1/Amon/tas/gn/v20170831/',
},
{
key: 'indian-ocean-chl',
label: 'Indian Ocean Physical and Biological Variables',
subtitle: '',
store: 'https://storage.googleapis.com/nmfs_odp_nwfsc/CB/mind_the_chl_gap/IO.zarr',
},
{
key: 'nasa-mur-sst',
label: 'NASA MUR Sea Surface Temperature',
subtitle: 'Multi-scale Ultra-high Resolution SST',
store: 'https://mur-sst.s3.us-west-2.amazonaws.com/zarr-v1/',
},
{
key: 'cmip6-gfdl-esm4-tos',
label: 'CMIP6 NOAA GFDL-ESM4',
subtitle: 'Historical Sea Surface Temperature',
store: 'https://storage.googleapis.com/cmip6/CMIP6/CMIP/NOAA-GFDL/GFDL-ESM4/historical/r2i1p1f1/Omon/tos/gn/v20180701/',
},
{
key: 'cmip6-awi-cm-1-1-mr-tos',
label: 'CMIP6 AWI-CM-1-1-MR',
subtitle: 'Historical Daily Sea Surface Temperature',
store: 'https://cmip6-pds.s3.amazonaws.com/CMIP6/CMIP/AWI/AWI-CM-1-1-MR/historical/r1i1p1f1/Oday/tos/gn/v20181218/',
},
{
key: 'carbonplan-antarctic-era5',
label: 'CarbonPlan Antarctic ERA5 Reanalysis',
subtitle: '',
store: 'https://carbonplan-share.s3.us-west-2.amazonaws.com/zarr-layer-examples/antarctic_era5.zarr',
},
{
key: 'silam-dust',
label: 'SILAM Global Dust Model Forecasts',
subtitle: 'Dust',
store: 'https://data.source.coop/bkr/silam-dust/silam_global_dust_v3.zarr',
},
{
key: 'silam-dust-v2',
label: 'SILAM Global Dust Model Forecasts (v2)',
subtitle: 'Dust',
store: 'https://data.source.coop/bkr/silam-dust/data.zarr',
},
{
key: 'gefs-35day-direct',
label: 'NOAA GEFS 35-day Ensemble Forecast',
subtitle: '',
store: 'https://data.dynamical.org/noaa/gefs/forecast-35-day/latest.zarr',
},
];
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
18 changes: 11 additions & 7 deletions src/assets/index.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
import logoSeasFire from "./logoS.png";
import logoSF from "./SeasFire-logo.png";
import logo from "./logo.png";
import logoBGC_MPI from "./logo_bgc_mpi.png"
import logoBGC from "./logo_bgc.png"
import logoMPI from "./logo_mpi.png"
import logoSeasFire from "./imgs/logoS.png";
import logoSF from "./imgs/SeasFire-logo.png";
import logo from "./imgs/logo.png";
import logoBGC_MPI from "./imgs/logo_bgc_mpi.png"
import logoBGC from "./imgs/logo_bgc.png"
import logoMPI from "./imgs/logo_mpi.png"
import { ZARR_CATALOG } from "./catalogs/ZarrCatalog"
import { ICECHUNK_CATALOG } from "./catalogs/IcechunkCatalog"

export {
logoSeasFire,
logo,
logoSF,
logoBGC_MPI,
logoBGC,
logoMPI
logoMPI,
ZARR_CATALOG,
ICECHUNK_CATALOG,
};
5 changes: 3 additions & 2 deletions src/components/ui/MainPanel/CuratedDatasets.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
"use client";

import React, { useState } from 'react';
import { DATASETS_COLLECTION } from './DatasetCollection';
import { ZARR_CATALOG } from "@/assets/index";

Comment on lines 1 to +5

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Import ICECHUNK_CATALOG and useZarrStore to support displaying and loading curated Icechunk datasets alongside Zarr datasets.

Suggested change
"use client";
import React, { useState } from 'react';
import { DATASETS_COLLECTION } from './DatasetCollection';
import { ZARR_CATALOG } from "@/assets/index";
"use client";
import React, { useState } from 'react';
import { ZARR_CATALOG, ICECHUNK_CATALOG } from "@/assets/index";
import { useZarrStore } from '@/GlobalStates/ZarrStore';

import {
Command,
CommandEmpty,
Expand Down Expand Up @@ -30,7 +31,7 @@ const CuratedDatasets = ({
const [search, setSearch] = useState('');
const [showAll, setShowAll] = useState(false);

const filtered = DATASETS_COLLECTION.filter(ds =>
const filtered = ZARR_CATALOG.filter(ds =>
ds.label.toLowerCase().includes(search.toLowerCase()) ||
ds.subtitle.toLowerCase().includes(search.toLowerCase())
);
Comment on lines +34 to 37

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

Currently, CuratedDatasets only filters and displays ZARR_CATALOG, meaning the newly added ICECHUNK_CATALOG is completely unused and curated Icechunk datasets are inaccessible in the UI.

To fix this, we can combine both catalogs so that users can browse and search all curated datasets in one place.

Note: You will also need to update the onSelect handler (around line 60, which is outside the current diff hunk) to set or clear the Icechunk options in useZarrStore depending on whether the selected dataset is an Icechunk store or a Zarr store. For example:

onSelect={() => {
  setActiveOption(ds.key);
  if (ds.isIcechunk) {
    useZarrStore.getState().setFetchOptions(null);
    useZarrStore.getState().setIcechunkOptions({ branch: 'main' });
  } else {
    useZarrStore.getState().setIcechunkOptions(null);
  }
  setInitStore(ds.store);
  onOpenDescription();
}}
  // Combine Zarr and Icechunk catalogs so both are searchable and browsable
  const combinedCatalog = [
    ...ZARR_CATALOG.map(ds => ({ ...ds, isIcechunk: false })),
    ...ICECHUNK_CATALOG.map(ds => ({ ...ds, isIcechunk: true })),
  ];

  const filtered = combinedCatalog.filter(ds =>
    ds.label.toLowerCase().includes(search.toLowerCase()) ||
    ds.subtitle?.toLowerCase().includes(search.toLowerCase())
  );

Expand Down
41 changes: 30 additions & 11 deletions src/components/ui/MainPanel/Dataset.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ import {
TooltipContent,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { Separator } from '@/components/ui/separator';
import { DatasetOption, DescriptionContent } from './DescriptionContent';
import RemoteZarr from './RemoteZarr';
import RemoteIcechunk from './RemoteIcechunk';
import LocalContent from './LocalContent';
import DatasetsModal from './DataSetsModal';
import { Switcher } from '../Widgets/Switcher';

const Dataset = () => {
const [showStoreInput, setShowStoreInput] = useState(false);
Expand All @@ -26,6 +29,7 @@ const Dataset = () => {
const [popoverOpen, setPopoverOpen] = useState<boolean>(false);
const [isSafari, setIsSafari] = useState<boolean>(false);
const [openDatasetsModal, setOpenDatasetsModal] = useState<boolean>(false);
const [useIcechunk, setUseIcechunk] = useState(false);

const { initStore, setInitStore, setOpenVariables } = useGlobalStore(
useShallow(state => ({
Expand Down Expand Up @@ -102,36 +106,51 @@ const Dataset = () => {
className="cursor-pointer w-full justify-between gap-2 mb-1"
onClick={() => setOpenDatasetsModal(true)}
>
{popoverSide !== 'top' && <BsBoxArrowLeft className="size-4" />}
{popoverSide !== 'top' && <BsBoxArrowLeft className="size-4" />}
Explore Datasets
{popoverSide === 'top' && <BsBoxArrowRight className="size-4" />}
{popoverSide === 'top' && <BsBoxArrowRight className="size-4" />}
</Button>

<div className="w-full h-px bg-border my-1" />

<div className="w-full">
<DatasetOption
active={activeOption === 'remote'}
onClick={() => {
setShowStoreInput(prev => !prev);
const opening = !showStoreInput || activeOption !== 'remote';
setShowStoreInput(opening);
setShowLocalInput(false);
setActiveOption('remote');
setShowDescription(false);
if (opening) setUseIcechunk(false);
}}
>
Remote Zarr
Remote
</DatasetOption>
{showStoreInput && (
<div className="mt-2">
<RemoteZarr
initStore={initStore}
setInitStore={setInitStore}
onOpenDescription={() => setShowDescription(true)}
<Switcher
leftText="Zarr"
rightText="Icechunk"
state={!useIcechunk}
onClick={() => setUseIcechunk(prev => !prev)}
/>
{useIcechunk ? (
<RemoteIcechunk
setInitStore={setInitStore}
onOpenDescription={() => setShowDescription(true)}
/>
) : (
<RemoteZarr
initStore={initStore}
setInitStore={setInitStore}
onOpenDescription={() => setShowDescription(true)}
/>
)}
</div>
)}
</div>

<Separator className='mt-2' />

<div className="w-full">
<DatasetOption
active={activeOption === 'local'}
Expand All @@ -140,6 +159,7 @@ const Dataset = () => {
setShowStoreInput(false);
setActiveOption('local');
setShowDescription(false);
setUseIcechunk(false);
}}
>
Local
Expand All @@ -166,7 +186,6 @@ const Dataset = () => {
/>
</div>
)}

</div>
</PopoverContent>
</Popover>
Expand Down
26 changes: 0 additions & 26 deletions src/components/ui/MainPanel/DatasetCollection.ts

This file was deleted.

Loading
Loading