Skip to content

Commit e7b9420

Browse files
committed
better metadata handling
1 parent 670b9bc commit e7b9420

File tree

15 files changed

+79
-30
lines changed

15 files changed

+79
-30
lines changed

src/anemoi/datasets/create/functions/sources/grib.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#
99

1010

11+
import glob
12+
1113
from climetlab import load_source
1214
from climetlab.utils.patterns import Pattern
1315

@@ -22,6 +24,12 @@ def check(ds, paths, **kwargs):
2224
raise ValueError(f"Expected {count} fields, got {len(ds)} (kwargs={kwargs}, paths={paths})")
2325

2426

27+
def _expand(paths):
28+
for path in paths:
29+
for p in glob.glob(path):
30+
yield p
31+
32+
2533
def execute(context, dates, path, *args, **kwargs):
2634
given_paths = path if isinstance(path, list) else [path]
2735

@@ -35,7 +43,7 @@ def execute(context, dates, path, *args, **kwargs):
3543
if name in kwargs:
3644
raise ValueError(f"MARS interpolation parameter '{name}' not supported")
3745

38-
for path in paths:
46+
for path in _expand(paths):
3947
context.trace("📁", "PATH", path)
4048
s = load_source("file", path)
4149
s = s.sel(valid_datetime=dates, **kwargs)

src/anemoi/datasets/create/functions/sources/netcdf.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,29 @@
77
# nor does it submit to any jurisdiction.
88
#
99

10+
import glob
11+
1012
from climetlab import load_source
1113
from climetlab.utils.patterns import Pattern
1214

1315

16+
def _expand(paths):
17+
for path in paths:
18+
if path.startswith("file://"):
19+
path = path[7:]
20+
21+
if path.startswith("http://"):
22+
yield path
23+
continue
24+
25+
if path.startswith("https://"):
26+
yield path
27+
continue
28+
29+
for p in glob.glob(path):
30+
yield p
31+
32+
1433
def check(what, ds, paths, **kwargs):
1534
count = 1
1635
for k, v in kwargs.items():
@@ -32,7 +51,7 @@ def load_netcdfs(emoji, what, context, dates, path, *args, **kwargs):
3251

3352
levels = kwargs.get("level", kwargs.get("levelist"))
3453

35-
for path in paths:
54+
for path in _expand(paths):
3655
context.trace(emoji, what.upper(), path)
3756
s = load_source("opendap", path)
3857
s = s.sel(

src/anemoi/datasets/data/concat.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
from .debug import Node
1414
from .debug import debug_indexing
15-
from .forewards import Combined
15+
from .forwards import Combined
1616
from .indexing import apply_index_to_slices_changes
1717
from .indexing import expand_list_indexing
1818
from .indexing import index_to_slices

src/anemoi/datasets/data/ensemble.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import logging
99

1010
from .debug import Node
11-
from .forewards import GivenAxis
11+
from .forwards import GivenAxis
1212
from .misc import _auto_adjust
1313
from .misc import _open
1414

src/anemoi/datasets/data/forewards.py renamed to src/anemoi/datasets/data/forwards.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,18 @@ def grids(self):
9191
def metadata_specific(self, **kwargs):
9292
return super().metadata_specific(
9393
forward=self.forward.metadata_specific(),
94+
**self.subclass_metadata_specific(),
9495
**kwargs,
9596
)
9697

9798
def source(self, index):
9899
return self.forward.source(index)
99100

101+
def subclass_metadata_specific(self):
102+
raise NotImplementedError(
103+
f"subclass_metadata_specific() must be implemented in derived class {self.__class__.__name__}"
104+
)
105+
100106

101107
class Combined(Forwards):
102108
def __init__(self, datasets):

src/anemoi/datasets/data/grids.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
from .debug import Node
1414
from .debug import debug_indexing
15-
from .forewards import Combined
16-
from .forewards import GivenAxis
15+
from .forwards import Combined
16+
from .forwards import GivenAxis
1717
from .indexing import apply_index_to_slices_changes
1818
from .indexing import expand_list_indexing
1919
from .indexing import index_to_slices
@@ -91,7 +91,7 @@ def tree(self):
9191
return Node(self, [d.tree() for d in self.datasets])
9292

9393

94-
class Grids(GivenAxis):
94+
class GridsBase(GivenAxis):
9595
def __init__(self, datasets, axis):
9696
super().__init__(datasets, axis)
9797
# Shape: (dates, variables, ensemble, 1d-values)
@@ -106,7 +106,7 @@ def check_same_resolution(self, d1, d2):
106106
pass
107107

108108

109-
class ConcatGrids(Grids):
109+
class Grids(GridsBase):
110110
# TODO: select the statistics of the most global grid?
111111
@property
112112
def latitudes(self):
@@ -127,7 +127,7 @@ def tree(self):
127127
return Node(self, [d.tree() for d in self.datasets], mode="concat")
128128

129129

130-
class Cutout(Grids):
130+
class Cutout(GridsBase):
131131
def __init__(self, datasets, axis):
132132
from anemoi.datasets.grids import cutout_mask
133133

@@ -220,7 +220,7 @@ def grids_factory(args, kwargs):
220220
datasets = [_open(e) for e in grids]
221221
datasets, kwargs = _auto_adjust(datasets, kwargs)
222222

223-
return ConcatGrids(datasets, axis=axis)._subset(**kwargs)
223+
return Grids(datasets, axis=axis)._subset(**kwargs)
224224

225225

226226
def cutout_factory(args, kwargs):

src/anemoi/datasets/data/join.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from .debug import Node
1414
from .debug import Source
1515
from .debug import debug_indexing
16-
from .forewards import Combined
16+
from .forwards import Combined
1717
from .indexing import apply_index_to_slices_changes
1818
from .indexing import expand_list_indexing
1919
from .indexing import index_to_slices

src/anemoi/datasets/data/masked.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from .dataset import Dataset
1515
from .debug import Node
1616
from .debug import debug_indexing
17-
from .forewards import Forwards
17+
from .forwards import Forwards
1818
from .indexing import apply_index_to_slices_changes
1919
from .indexing import expand_list_indexing
2020
from .indexing import index_to_slices
@@ -83,6 +83,9 @@ def __init__(self, forward, thinning, method):
8383
def tree(self):
8484
return Node(self, [self.forward.tree()], thinning=self.thinning, method=self.method)
8585

86+
def subclass_metadata_specific(self):
87+
return dict(thinning=self.thinning, method=self.method)
88+
8689

8790
class Cropping(Masked):
8891
def __init__(self, forward, area):
@@ -104,3 +107,6 @@ def __init__(self, forward, area):
104107

105108
def tree(self):
106109
return Node(self, [self.forward.tree()], area=self.area)
110+
111+
def metadata_specific(self, **kwargs):
112+
return super().metadata_specific(area=self.area, **kwargs)

src/anemoi/datasets/data/select.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from .debug import Node
1212
from .debug import Source
1313
from .debug import debug_indexing
14-
from .forewards import Forwards
14+
from .forwards import Forwards
1515
from .indexing import apply_index_to_slices_changes
1616
from .indexing import expand_list_indexing
1717
from .indexing import index_to_slices
@@ -88,6 +88,10 @@ def source(self, index):
8888
def tree(self):
8989
return Node(self, [self.dataset.tree()], **self.title)
9090

91+
def subclass_metadata_specific(self):
92+
# return dict(indices=self.indices)
93+
return {}
94+
9195

9296
class Rename(Forwards):
9397
def __init__(self, dataset, rename):
@@ -105,8 +109,8 @@ def variables(self):
105109
def name_to_index(self):
106110
return {k: i for i, k in enumerate(self.variables)}
107111

108-
def metadata_specific(self, **kwargs):
109-
return super().metadata_specific(rename=self.rename, **kwargs)
110-
111112
def tree(self):
112113
return Node(self, [self.forward.tree()], rename=self.rename)
114+
115+
def subclass_metadata_specific(self):
116+
return dict(rename=self.rename)

src/anemoi/datasets/data/statistics.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
from . import open_dataset
1212
from .debug import Node
13-
from .forewards import Forwards
13+
from .forwards import Forwards
1414

1515
LOG = logging.getLogger(__name__)
1616

@@ -34,11 +34,8 @@ def statistics_tendencies(self, delta=None):
3434
delta = self.frequency
3535
return self._statistic.statistics_tendencies(delta)
3636

37-
def metadata_specific(self, **kwargs):
38-
return super().metadata_specific(
39-
statistics=self._statistic.metadata_specific(),
40-
**kwargs,
41-
)
37+
def subclass_metadata_specific(self):
38+
return dict(statistics=self._statistic.metadata_specific())
4239

4340
def tree(self):
4441
return Node(self, [self.forward.tree()])

0 commit comments

Comments
 (0)