Skip to content

Commit 7de8cc2

Browse files
flicj191rbeucher
andauthored
Update REF ENSO recipes for CMIP7 (#4470)
Co-authored-by: Romain Beucher <romain.beucher@anu.edu.au>
1 parent 324d4eb commit 7de8cc2

17 files changed

Lines changed: 607 additions & 238 deletions

esmvaltool/diag_scripts/enso_metrics/climatology_diagnostic1.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def plot_level1(input_data, cfg, provenance):
4747
cube,
4848
)
4949

50-
if dataset["project"] == "CMIP6":
50+
if dataset["project"].startswith("CMIP"):
5151
qplt.plot(cube, label=dataset["dataset"])
5252
model_data = cube.data
5353
else:
@@ -201,15 +201,16 @@ def main(cfg):
201201
)
202202
# for each select obs and iterate others, obs last
203203
for grp, var_attr in variable_groups.items():
204-
logger.info("%s : %d, %s", grp, len(var_attr), pformat(var_attr))
204+
datasets = [attr["dataset"] for attr in var_attr]
205+
logger.info("%s : %d, %s", grp, len(var_attr), datasets)
205206
pairs = [var_attr[-1]] # obs to list
206-
prov = provenance_record(grp, list(cfg["input_data"].keys()))
207+
prov = provenance_record(grp, [attr["filename"] for attr in var_attr])
207208
for metadata in var_attr:
208209
logger.info("iterate though datasets\n %s", pformat(metadata))
209-
if metadata["project"] == "CMIP6":
210+
if metadata["project"].startswith("CMIP"):
210211
pairs.append(metadata)
211212
fig, filename, rmse = plot_level1(pairs, cfg, prov)
212-
213+
logger.info("metric %s", rmse)
213214
save_figure(
214215
"_".join(filename),
215216
prov,

esmvaltool/diag_scripts/enso_metrics/climatology_diagnosticlevel2.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ def plotmaps_level2(input_data, grp):
2626
"""Create map plots for pair of input data."""
2727
fig = plt.figure(figsize=(18, 6))
2828
proj = ccrs.Orthographic(central_longitude=210.0)
29+
cubes = []
2930
for plt_pos, dataset in enumerate(input_data, start=121):
3031
logger.info(
3132
"dataset: %s - %s",
@@ -34,6 +35,9 @@ def plotmaps_level2(input_data, grp):
3435
)
3536
cube, cbar_label = load_seacycle_stdev(dataset)
3637

38+
# return cubes to save
39+
cubes.append(cube)
40+
3741
ax1 = plt.subplot(plt_pos, projection=proj)
3842
ax1.add_feature(cfeature.LAND, facecolor="gray")
3943
ax1.coastlines()
@@ -61,7 +65,7 @@ def plotmaps_level2(input_data, grp):
6165
cbar = fig.colorbar(cf1, cax=cax, orientation="horizontal", extend="both")
6266
cbar.set_label(cbar_label)
6367

64-
return fig
68+
return fig, cubes
6569

6670

6771
def load_seacycle_stdev(dataset):
@@ -123,16 +127,15 @@ def provenance_record(var_grp, ancestor_files):
123127
return record
124128

125129

126-
def save_plotdata(plotdata, group, pairs, cfg):
127-
"""Save both obs and model plotted data."""
128-
for i, cube in enumerate(plotdata):
129-
data_prov = provenance_record(group, [pairs[i]["filename"]])
130-
datafile = [
131-
pairs[i]["dataset"],
132-
pairs[i]["short_name"],
133-
pairs[i]["preprocessor"],
134-
]
135-
save_data("_".join(datafile), data_prov, cfg, cube)
130+
def save_plotdata(plotdata, group, pairs, cfg, i):
131+
"""Save both obs and model plotted data, i: pairs index."""
132+
data_prov = provenance_record(group, [pairs[i]["filename"]])
133+
datafile = [
134+
pairs[i]["dataset"],
135+
pairs[i]["short_name"],
136+
pairs[i]["preprocessor"],
137+
]
138+
save_data("_".join(datafile), data_prov, cfg, plotdata[i])
136139

137140

138141
def main(cfg):
@@ -153,9 +156,10 @@ def main(cfg):
153156
# create pairs, add obs first to list
154157
pairs = [var_attr[-1]]
155158
logger.info("iterate though datasets\n %s", pformat(metadata))
156-
if metadata["project"] == "CMIP6":
159+
if metadata["project"].startswith("CMIP"):
157160
pairs.append(metadata)
158-
fig = plotmaps_level2(pairs, grp)
161+
fig, data_cubes = plotmaps_level2(pairs, grp)
162+
save_plotdata(data_cubes, grp, pairs, cfg, 1)
159163
filename = "_".join(
160164
[
161165
metadata["dataset"],
@@ -170,6 +174,8 @@ def main(cfg):
170174
figure=fig,
171175
dpi=300,
172176
)
177+
# save obs data for each group at end so not repeated for each model
178+
save_plotdata(data_cubes, grp, pairs, cfg, 0)
173179

174180

175181
if __name__ == "__main__":

esmvaltool/diag_scripts/enso_metrics/climatology_diagnosticlevel3.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ def plotmaps_level3(input_data, itcz=False):
4848
"ts": np.arange(20, 31, 1),
4949
"tauu": np.arange(-80, 90, 10),
5050
}
51+
cubes = []
5152
for plt_pos, dataset in enumerate(input_data, start=121):
5253
logger.info(
5354
"dataset: %s - %s",
@@ -56,6 +57,8 @@ def plotmaps_level3(input_data, itcz=False):
5657
)
5758
cube, cbar_label, x_label = load_seacycle_stat(dataset, itcz)
5859

60+
# return cubes to save
61+
cubes.append(cube)
5962
ax1 = plt.subplot(plt_pos)
6063
cf1 = iplt.contourf(
6164
cube,
@@ -78,7 +81,7 @@ def plotmaps_level3(input_data, itcz=False):
7881
cbar = fig.colorbar(cf1, cax=cax, orientation="horizontal", extend="both")
7982
cbar.set_label(cbar_label)
8083

81-
return fig
84+
return fig, cubes
8285

8386

8487
def load_seacycle_stat(dataset, itcz=False):
@@ -169,16 +172,11 @@ def provenance_record(var_grp, ancestor_files):
169172
return record
170173

171174

172-
def save_plotdata(plotdata, group, pairs, cfg):
173-
"""Save both obs and model plotted data."""
174-
for i, cube in enumerate(plotdata):
175-
data_prov = provenance_record(group, [pairs[i]["filename"]])
176-
datafile = [
177-
pairs[i]["dataset"],
178-
pairs[i]["short_name"],
179-
pairs[i]["preprocessor"],
180-
]
181-
save_data("_".join(datafile), data_prov, cfg, cube)
175+
def save_plotdata(plotdata, group, pairs, cfg, i):
176+
"""Save both obs and model plotted data, i: pairs index."""
177+
data_prov = provenance_record(group, [pairs[i]["filename"]])
178+
datafile = [pairs[i]["dataset"], pairs[i]["short_name"], group, "level3"]
179+
save_data("_".join(datafile), data_prov, cfg, plotdata[i])
182180

183181

184182
def main(cfg):
@@ -193,16 +191,17 @@ def main(cfg):
193191
)
194192
# for each select obs and iterate others, obs last
195193
for grp, var_attr in variable_groups.items():
196-
logger.info("%s : %d, %s", grp, len(var_attr), pformat(var_attr))
194+
datasets = [attr["dataset"] for attr in var_attr]
195+
logger.info("%s : %d, %s", grp, len(var_attr), datasets)
197196
if grp in ["pr_seacycle", "sst_seacycle", "tauu_seacycle"]:
198197
for metadata in var_attr:
199198
# create pairs, add obs first to list
200199
pairs = [var_attr[-1]]
201200
logger.info("iterate though datasets\n %s", pformat(metadata))
202-
if metadata["project"] == "CMIP6":
201+
if metadata["project"].startswith("CMIP"):
203202
pairs.append(metadata)
204-
fig = plotmaps_level3(pairs, itcz=False)
205-
# save_plotdata(data_cubes, grp, pairs, cfg)
203+
fig, data_cubes = plotmaps_level3(pairs, itcz=False)
204+
save_plotdata(data_cubes, grp, pairs, cfg, 1)
206205
filename = "_".join(
207206
[
208207
metadata["dataset"],
@@ -224,7 +223,8 @@ def main(cfg):
224223
if grp == "pr_seacycle":
225224
# replace pr with doubleITCZ
226225
grp_itcz = "doubleITCZ_seacycle"
227-
fig = plotmaps_level3(pairs, itcz=True)
226+
fig, itcz_cubes = plotmaps_level3(pairs, itcz=True)
227+
save_plotdata(itcz_cubes, grp_itcz, pairs, cfg, 1)
228228
filename = "_".join(
229229
[
230230
metadata["dataset"],
@@ -243,6 +243,12 @@ def main(cfg):
243243
figure=fig,
244244
dpi=300,
245245
)
246+
obs_itcz = itcz_cubes[0]
247+
# save obs data for each group at end so not repeated for each model
248+
save_plotdata(data_cubes, grp, pairs, cfg, 0)
249+
if obs_itcz:
250+
save_plotdata(itcz_cubes, grp_itcz, pairs, cfg, 0)
251+
obs_itcz = None
246252

247253

248254
if __name__ == "__main__":

esmvaltool/diag_scripts/enso_metrics/enso_diag1metrics.py

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
get_diagnostic_filename,
2323
group_metadata,
2424
run_diagnostic,
25+
save_data,
2526
save_figure,
2627
select_metadata,
2728
)
@@ -135,8 +136,9 @@ def sst_regressed(n34_cube):
135136

136137
# Select the data for the current year and append it to n34_selected
137138
year_enso = iris.Constraint(
138-
time=lambda cell, enso_epoch=enso_epoch: cell.point.year
139-
in enso_epoch,
139+
time=lambda cell, enso_epoch=enso_epoch: (
140+
cell.point.year in enso_epoch
141+
),
140142
)
141143
cube_2 = n34_cube.extract(year_enso)
142144
n34_selected.append(cube_2.data.data)
@@ -234,7 +236,7 @@ def compute_enso_metrics(input_pair, dt_ls, var_group, metric):
234236
"ENSO lifecycle",
235237
dt_ls,
236238
)
237-
239+
# save - require months
238240
data_to_save.append(data_to_cube(obs, months, metric))
239241
data_to_save.append(data_to_cube(model, months, metric))
240242

@@ -275,8 +277,6 @@ def compute_enso_metrics(input_pair, dt_ls, var_group, metric):
275277
"ENSO seasonality",
276278
dt_ls,
277279
)
278-
data_to_save.append(data_to_cube(data_values[0], None, metric))
279-
data_to_save.append(data_to_cube(data_values[1], None, metric))
280280

281281
elif metric == "13asymmetry":
282282
model_skew = skew(input_pair[1][var_group[0]].data, axis=0)
@@ -291,8 +291,6 @@ def compute_enso_metrics(input_pair, dt_ls, var_group, metric):
291291
"ENSO skewness",
292292
dt_ls,
293293
)
294-
data_to_save.append(data_to_cube(obs_skew, None, metric))
295-
data_to_save.append(data_to_cube(model_skew, None, metric))
296294

297295
elif metric == "14duration":
298296
model = sst_regressed(input_pair[1][var_group[0]])
@@ -313,15 +311,14 @@ def compute_enso_metrics(input_pair, dt_ls, var_group, metric):
313311
"ENSO duration",
314312
dt_ls,
315313
)
316-
data_to_save.append(data_to_cube(data_values[0], None, metric))
317-
data_to_save.append(data_to_cube(data_values[1], None, metric))
314+
318315
elif metric == "15diversity":
319316
for datas in input_pair: # obs 0, mod 1
320317
events = enso_events(datas[var_group[0]])
321318
results_lon = diversity(datas[var_group[1]], events)
322319
results_lon["enso"] = results_lon["nino"] + results_lon["nina"]
323320
data_values.append(iqr(results_lon["enso"]))
324-
# compute(obs, mod)
321+
325322
val = compute(data_values[0], data_values[1])
326323
fig = plot_level1(
327324
data_values,
@@ -330,6 +327,8 @@ def compute_enso_metrics(input_pair, dt_ls, var_group, metric):
330327
"ENSO diversity",
331328
dt_ls,
332329
)
330+
331+
if metric not in ["09pattern", "10lifecycle"]:
333332
data_to_save.append(data_to_cube(data_values[0], None, metric))
334333
data_to_save.append(data_to_cube(data_values[1], None, metric))
335334

@@ -458,10 +457,27 @@ def group_obs_models(obs, models, metric, var_preproc, cfg):
458457
figure=output[1],
459458
dpi=300,
460459
)
460+
461+
# save data_cubes output[2]
462+
save_plotdata(output[2], metric, [obs, attributes], cfg)
463+
461464
# clear value,fig
462465
output = None
463466

464467

468+
def save_plotdata(plotdata, metric, pairs, cfg):
469+
"""Save both obs and model plotted data."""
470+
for i, cube in enumerate(plotdata):
471+
files = [attr["filename"] for attr in pairs[i]]
472+
data_prov = get_provenance_record(metric, files)
473+
datafile = [
474+
pairs[i][0]["dataset"],
475+
pairs[i][0]["short_name"],
476+
metric,
477+
]
478+
save_data("_".join(datafile), data_prov, cfg, cube)
479+
480+
465481
def get_provenance_record(metric, ancestor_files):
466482
"""Create a provenance record describing the diagnostic data and plot."""
467483
caption = {
@@ -549,11 +565,21 @@ def main(cfg):
549565
variable_group=var_prep,
550566
project="OBS6",
551567
)
568+
obs += select_metadata(
569+
input_data,
570+
variable_group=var_prep,
571+
project="obs4MIPs",
572+
)
552573
models += select_metadata(
553574
input_data,
554575
variable_group=var_prep,
555576
project="CMIP6",
556577
)
578+
models += select_metadata(
579+
input_data,
580+
variable_group=var_prep,
581+
project="CMIP7",
582+
)
557583

558584
group_obs_models(obs, models, metric, var_preproc, cfg)
559585

0 commit comments

Comments
 (0)