From 757ba39de4fb05e415a37ba09ba1e4eb1cf6af15 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Fri, 27 Mar 2020 17:52:12 +0100 Subject: [PATCH 01/13] Load coordinates with generic_level_name --- esmvalcore/cmor/table.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/esmvalcore/cmor/table.py b/esmvalcore/cmor/table.py index 2cedc13a3e..d51973b468 100644 --- a/esmvalcore/cmor/table.py +++ b/esmvalcore/cmor/table.py @@ -172,7 +172,12 @@ def _assign_dimensions(self, var, generic_levels): if dimension in generic_levels: coord = CoordinateInfo(dimension) coord.generic_level = True - coord.axis = 'Z' + for coord_name in self.coords: + generic_level_name = self.coords[coord_name].generic_level_name + if dimension in [generic_level_name ]: + coord.generic_level_coords[coord_name] = self.coords[coord_name] + + #var.coordinates[dimension][coord_name].generic_level = True else: try: coord = self.coords[dimension] @@ -468,6 +473,7 @@ def __init__(self, name): super(CoordinateInfo, self).__init__() self.name = name self.generic_level = False + self.generic_level_coords = {} self.axis = "" """Axis""" @@ -497,6 +503,8 @@ def __init__(self, name): """Maximum allowed value""" self.must_have_bounds = "" """Whether bounds are required on this dimension""" + self.generic_level_name = "" + """Generic level name""" def read_json(self, json_data): """ Read coordinate information from json. @@ -524,6 +532,7 @@ def read_json(self, json_data): self.valid_max = self._read_json_variable('valid_max') self.requested = self._read_json_list_variable('requested') self.must_have_bounds = self._read_json_variable('must_have_bounds') + self.generic_level_name = self._read_json_variable('generic_level_name') class CMIP5Info(object): From d3d89346e7c0f7079596bec6b55f9c9801e13046 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Mon, 30 Mar 2020 16:41:31 +0200 Subject: [PATCH 02/13] Check generic level dim name --- esmvalcore/cmor/check.py | 34 +++++++++++++++++++++++++++--- tests/unit/cmor/test_cmor_check.py | 1 + 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 61c4f6f6fd..1d9dcb62f9 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -316,9 +316,37 @@ def _check_rank(self): def _check_dim_names(self): """Check dimension names.""" - for (_, coordinate) in self._cmor_var.coordinates.items(): + for (key, coordinate) in self._cmor_var.coordinates.items(): if coordinate.generic_level: - continue + if coordinate.generic_level_coords: + for (_, coord) in coordinate.generic_level_coords.items(): + try: + cube_coord = self._cube.coord(var_name=coord.out_name) + coordinate.out_name = coord.out_name + if cube_coord.standard_name == coord.standard_name: + coordinate.standard_name = coord.standard_name + coordinate.name = coord.name + except iris.exceptions.CoordinateNotFoundError: + try: + cube_coord = self._cube.coord(var_name=coord.standard_name) + coordinate.standard_name = coord.standard_name + coordinate.name = coord.name + except iris.exceptions.CoordinateNotFoundError: + pass + if coordinate.standard_name: + if not coordinate.out_name: + self.report_error(f'Coordinate {coordinate.name} has wrong var_name.',) + level_coord = coordinate.generic_level_coords[coordinate.name] + level_coord.generic_level = True + self._cmor_var.coordinates[coordinate.name] = level_coord + self._cmor_var.coordinates.pop(key) + else: + if coordinate.out_name: + self.report_critical(f'Coordinate {coordinate.name} has wrong standard_name',) + else: + self.report_critical(self._does_msg, coordinate.name, 'exist') + else: + continue else: try: cube_coord = self._cube.coord(var_name=coordinate.out_name) @@ -368,7 +396,7 @@ def _check_coords(self): """Check coordinates.""" for coordinate in self._cmor_var.coordinates.values(): # Cannot check generic_level coords as no CMOR information - if coordinate.generic_level: + if coordinate.generic_level and not coordinate.out_name: continue var_name = coordinate.out_name diff --git a/tests/unit/cmor/test_cmor_check.py b/tests/unit/cmor/test_cmor_check.py index 3732c36ce5..b22dd6f271 100644 --- a/tests/unit/cmor/test_cmor_check.py +++ b/tests/unit/cmor/test_cmor_check.py @@ -73,6 +73,7 @@ def __init__(self, name): self.stored_direction = "increasing" self.must_have_bounds = "yes" self.requested = [] + self.generic_level_coords = {} valid_limits = {'lat': ('-90', '90'), 'lon': ('0', '360')} if name in valid_limits: From 761bcc418fe50fb7b7f6ef91e13f93c6c2265ab8 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Tue, 31 Mar 2020 11:34:42 +0200 Subject: [PATCH 03/13] Fix flake issues --- esmvalcore/cmor/check.py | 32 ++++++++++++++++++++---------- esmvalcore/cmor/table.py | 16 +++++++-------- tests/unit/cmor/test_cmor_check.py | 2 +- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 1d9dcb62f9..92bdcb1875 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -318,33 +318,45 @@ def _check_dim_names(self): """Check dimension names.""" for (key, coordinate) in self._cmor_var.coordinates.items(): if coordinate.generic_level: - if coordinate.generic_level_coords: - for (_, coord) in coordinate.generic_level_coords.items(): + if coordinate.generic_lev_coords: + for (_, coord) in coordinate.generic_lev_coords.items(): try: - cube_coord = self._cube.coord(var_name=coord.out_name) + cube_coord = self._cube.coord( + var_name=coord.out_name + ) coordinate.out_name = coord.out_name if cube_coord.standard_name == coord.standard_name: coordinate.standard_name = coord.standard_name coordinate.name = coord.name except iris.exceptions.CoordinateNotFoundError: try: - cube_coord = self._cube.coord(var_name=coord.standard_name) + cube_coord = self._cube.coord( + var_name=coord.standard_name + ) coordinate.standard_name = coord.standard_name coordinate.name = coord.name except iris.exceptions.CoordinateNotFoundError: pass if coordinate.standard_name: if not coordinate.out_name: - self.report_error(f'Coordinate {coordinate.name} has wrong var_name.',) - level_coord = coordinate.generic_level_coords[coordinate.name] - level_coord.generic_level = True - self._cmor_var.coordinates[coordinate.name] = level_coord + self.report_error( + f'Coordinate {coordinate.name} ' + 'has wrong var_name.,' + ) + level = coordinate.generic_lev_coords[coordinate.name] + level.generic_level = True + self._cmor_var.coordinates[coordinate.name] = level self._cmor_var.coordinates.pop(key) else: if coordinate.out_name: - self.report_critical(f'Coordinate {coordinate.name} has wrong standard_name',) + self.report_critical( + f'Coordinate {coordinate.name} ' + 'has wrong standard_name', + ) else: - self.report_critical(self._does_msg, coordinate.name, 'exist') + self.report_critical( + self._does_msg, coordinate.name, 'exist' + ) else: continue else: diff --git a/esmvalcore/cmor/table.py b/esmvalcore/cmor/table.py index d51973b468..295b704944 100644 --- a/esmvalcore/cmor/table.py +++ b/esmvalcore/cmor/table.py @@ -172,12 +172,10 @@ def _assign_dimensions(self, var, generic_levels): if dimension in generic_levels: coord = CoordinateInfo(dimension) coord.generic_level = True - for coord_name in self.coords: - generic_level_name = self.coords[coord_name].generic_level_name - if dimension in [generic_level_name ]: - coord.generic_level_coords[coord_name] = self.coords[coord_name] - - #var.coordinates[dimension][coord_name].generic_level = True + for name in self.coords: + generic_level = self.coords[name].generic_lev_name + if dimension in [generic_level]: + coord.generic_lev_coords[name] = self.coords[name] else: try: coord = self.coords[dimension] @@ -473,7 +471,7 @@ def __init__(self, name): super(CoordinateInfo, self).__init__() self.name = name self.generic_level = False - self.generic_level_coords = {} + self.generic_lev_coords = {} self.axis = "" """Axis""" @@ -503,7 +501,7 @@ def __init__(self, name): """Maximum allowed value""" self.must_have_bounds = "" """Whether bounds are required on this dimension""" - self.generic_level_name = "" + self.generic_lev_name = "" """Generic level name""" def read_json(self, json_data): """ @@ -532,7 +530,7 @@ def read_json(self, json_data): self.valid_max = self._read_json_variable('valid_max') self.requested = self._read_json_list_variable('requested') self.must_have_bounds = self._read_json_variable('must_have_bounds') - self.generic_level_name = self._read_json_variable('generic_level_name') + self.generic_lev_name = self._read_json_variable('generic_level_name') class CMIP5Info(object): diff --git a/tests/unit/cmor/test_cmor_check.py b/tests/unit/cmor/test_cmor_check.py index b22dd6f271..ea432e6051 100644 --- a/tests/unit/cmor/test_cmor_check.py +++ b/tests/unit/cmor/test_cmor_check.py @@ -73,7 +73,7 @@ def __init__(self, name): self.stored_direction = "increasing" self.must_have_bounds = "yes" self.requested = [] - self.generic_level_coords = {} + self.generic_lev_coords = {} valid_limits = {'lat': ('-90', '90'), 'lon': ('0', '360')} if name in valid_limits: From 15d8016c951e97f3b65e3e63482fd6d9dba1f6f0 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Tue, 19 May 2020 09:04:18 +0200 Subject: [PATCH 04/13] Move to separate function --- esmvalcore/cmor/check.py | 85 ++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 6a3007e7b1..cf49c90476 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -334,47 +334,7 @@ def _check_dim_names(self): """Check dimension names.""" for (key, coordinate) in self._cmor_var.coordinates.items(): if coordinate.generic_level: - if coordinate.generic_lev_coords: - for (_, coord) in coordinate.generic_lev_coords.items(): - try: - cube_coord = self._cube.coord( - var_name=coord.out_name - ) - coordinate.out_name = coord.out_name - if cube_coord.standard_name == coord.standard_name: - coordinate.standard_name = coord.standard_name - coordinate.name = coord.name - except iris.exceptions.CoordinateNotFoundError: - try: - cube_coord = self._cube.coord( - var_name=coord.standard_name - ) - coordinate.standard_name = coord.standard_name - coordinate.name = coord.name - except iris.exceptions.CoordinateNotFoundError: - pass - if coordinate.standard_name: - if not coordinate.out_name: - self.report_error( - f'Coordinate {coordinate.name} ' - 'has wrong var_name.,' - ) - level = coordinate.generic_lev_coords[coordinate.name] - level.generic_level = True - self._cmor_var.coordinates[coordinate.name] = level - self._cmor_var.coordinates.pop(key) - else: - if coordinate.out_name: - self.report_critical( - f'Coordinate {coordinate.name} ' - 'has wrong standard_name', - ) - else: - self.report_critical( - self._does_msg, coordinate.name, 'exist' - ) - else: - continue + self._check_generic_level_dim_names(key, coordinate) else: try: cube_coord = self._cube.coord(var_name=coordinate.out_name) @@ -418,7 +378,48 @@ def _check_dim_names(self): self._does_msg, coordinate.name, 'exist') else: self.report_error( - self._does_msg, coordinate.name, 'exist') + self._does_msg, coordinate.name, 'exist') + + def _check_generic_level_dim_names(self, key, coordinate): + if coordinate.generic_lev_coords: + for (_, coord) in coordinate.generic_lev_coords.items(): + try: + cube_coord = self._cube.coord( + var_name=coord.out_name + ) + coordinate.out_name = coord.out_name + if cube_coord.standard_name == coord.standard_name: + coordinate.standard_name = coord.standard_name + coordinate.name = coord.name + except iris.exceptions.CoordinateNotFoundError: + try: + cube_coord = self._cube.coord( + var_name=coord.standard_name + ) + coordinate.standard_name = coord.standard_name + coordinate.name = coord.name + except iris.exceptions.CoordinateNotFoundError: + pass + if coordinate.standard_name: + if not coordinate.out_name: + self.report_error( + f'Coordinate {coordinate.name} ' + 'has wrong var_name.', + ) + level = coordinate.generic_lev_coords[coordinate.name] + level.generic_level = True + self._cmor_var.coordinates[coordinate.name] = level + self._cmor_var.coordinates.pop(key) + else: + if coordinate.out_name: + self.report_critical( + f'Coordinate {coordinate.name} ' + 'has wrong standard_name.', + ) + else: + self.report_critical( + self._does_msg, coordinate.name, 'exist' + ) def _check_coords(self): """Check coordinates.""" From dd5765cf5fa822365591051e444effd68aeb4fd9 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Tue, 19 May 2020 11:08:19 +0200 Subject: [PATCH 05/13] Add test --- esmvalcore/cmor/check.py | 2 +- tests/unit/cmor/test_cmor_check.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index cf49c90476..079043a081 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -378,7 +378,7 @@ def _check_dim_names(self): self._does_msg, coordinate.name, 'exist') else: self.report_error( - self._does_msg, coordinate.name, 'exist') + self._does_msg, coordinate.name, 'exist') def _check_generic_level_dim_names(self, key, coordinate): if coordinate.generic_lev_coords: diff --git a/tests/unit/cmor/test_cmor_check.py b/tests/unit/cmor/test_cmor_check.py index 23de12d693..f344c3b6ff 100644 --- a/tests/unit/cmor/test_cmor_check.py +++ b/tests/unit/cmor/test_cmor_check.py @@ -74,6 +74,7 @@ def __init__(self, name): self.must_have_bounds = "yes" self.requested = [] self.generic_lev_coords = {} + self.generic_lev_name = "" valid_limits = {'lat': ('-90', '90'), 'lon': ('0', '360')} if name in valid_limits: @@ -299,6 +300,20 @@ def test_rank_unstructured_grid(self): self.cube.add_aux_coord(new_lat, 1) self._check_cube() + def test_bad_generic_level(self): + """Test check fails in metadata if generic level coord + has wrong var_name.""" + depth_coord = CoordinateInfoMock('depth') + depth_coord.axis = 'Z' + depth_coord.generic_lev_name = 'olevel' + depth_coord.out_name = 'lev' + depth_coord.name = 'depth_coord' + depth_coord.long_name = 'ocean depth coordinate' + self.var_info.coordinates['depth'].generic_lev_coords = { + 'depth_coord': depth_coord} + self.var_info.coordinates['depth'].out_name = "" + self._check_fails_in_metadata() + def test_check_bad_var_standard_name_strict_flag(self): """Test check fails for a bad variable standard_name with --cmor-check strict.""" From a83eaa7bfdea2c407634d983c33645abb936cc1d Mon Sep 17 00:00:00 2001 From: sloosvel Date: Tue, 19 May 2020 11:21:57 +0200 Subject: [PATCH 06/13] Try to fix test --- esmvalcore/cmor/check.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 079043a081..131baae894 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -332,7 +332,8 @@ def _check_multiple_coords_same_stdname(self): def _check_dim_names(self): """Check dimension names.""" - for (key, coordinate) in self._cmor_var.coordinates.items(): + cmor_var_coordinates = self._cmor_var.coordinates.copy() + for (key, coordinate) in cmor_var_coordinates.items(): if coordinate.generic_level: self._check_generic_level_dim_names(key, coordinate) else: From 336be965ffae2ad588ab3d646042d734af3b8a63 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Wed, 10 Jun 2020 10:18:48 +0200 Subject: [PATCH 07/13] Fix identations --- esmvalcore/cmor/check.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 131baae894..0df459a616 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -407,20 +407,20 @@ def _check_generic_level_dim_names(self, key, coordinate): f'Coordinate {coordinate.name} ' 'has wrong var_name.', ) - level = coordinate.generic_lev_coords[coordinate.name] - level.generic_level = True - self._cmor_var.coordinates[coordinate.name] = level - self._cmor_var.coordinates.pop(key) + level = coordinate.generic_lev_coords[coordinate.name] + level.generic_level = True + self._cmor_var.coordinates[coordinate.name] = level + self._cmor_var.coordinates.pop(key) + else: + if coordinate.out_name: + self.report_critical( + f'Coordinate {coordinate.name} ' + 'has wrong standard_name.', + ) else: - if coordinate.out_name: - self.report_critical( - f'Coordinate {coordinate.name} ' - 'has wrong standard_name.', - ) - else: - self.report_critical( - self._does_msg, coordinate.name, 'exist' - ) + self.report_critical( + self._does_msg, coordinate.name, 'exist' + ) def _check_coords(self): """Check coordinates.""" From e151417fb03c497a360dc47f6d38a268f9eb9c8a Mon Sep 17 00:00:00 2001 From: sloosvel <45196700+sloosvel@users.noreply.github.com> Date: Mon, 15 Jun 2020 16:45:14 +0200 Subject: [PATCH 08/13] Update esmvalcore/cmor/check.py Co-authored-by: Bouwe Andela --- esmvalcore/cmor/check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 0df459a616..62c3ea5185 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -383,7 +383,7 @@ def _check_dim_names(self): def _check_generic_level_dim_names(self, key, coordinate): if coordinate.generic_lev_coords: - for (_, coord) in coordinate.generic_lev_coords.items(): + for coord in coordinate.generic_lev_coords.values(): try: cube_coord = self._cube.coord( var_name=coord.out_name From 94568f89e80aa0da995265dc9518f4206b38ad10 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Wed, 1 Jul 2020 16:29:25 +0200 Subject: [PATCH 09/13] Change for --- esmvalcore/cmor/table.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esmvalcore/cmor/table.py b/esmvalcore/cmor/table.py index 2eca7cb834..845d2397e3 100644 --- a/esmvalcore/cmor/table.py +++ b/esmvalcore/cmor/table.py @@ -188,10 +188,9 @@ def _assign_dimensions(self, var, generic_levels): if dimension in generic_levels: coord = CoordinateInfo(dimension) coord.generic_level = True - for name in self.coords: - generic_level = self.coords[name].generic_lev_name - if dimension in [generic_level]: - coord.generic_lev_coords[name] = self.coords[name] + for name, coord in self.coords.items(): + if dimension == coord.generic_lev_name: + coord.generic_lev_coords[name] = coord else: try: coord = self.coords[dimension] @@ -519,6 +518,7 @@ def __init__(self, name): """Whether bounds are required on this dimension""" self.generic_lev_name = "" """Generic level name""" + def read_json(self, json_data): """ Read coordinate information from json. From acec19cc4b350eb9b543aa86c4ee2b966091b60b Mon Sep 17 00:00:00 2001 From: sloosvel Date: Thu, 2 Jul 2020 16:08:52 +0200 Subject: [PATCH 10/13] Revert "Change for" This reverts commit 94568f89e80aa0da995265dc9518f4206b38ad10. --- esmvalcore/cmor/table.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esmvalcore/cmor/table.py b/esmvalcore/cmor/table.py index 845d2397e3..2eca7cb834 100644 --- a/esmvalcore/cmor/table.py +++ b/esmvalcore/cmor/table.py @@ -188,9 +188,10 @@ def _assign_dimensions(self, var, generic_levels): if dimension in generic_levels: coord = CoordinateInfo(dimension) coord.generic_level = True - for name, coord in self.coords.items(): - if dimension == coord.generic_lev_name: - coord.generic_lev_coords[name] = coord + for name in self.coords: + generic_level = self.coords[name].generic_lev_name + if dimension in [generic_level]: + coord.generic_lev_coords[name] = self.coords[name] else: try: coord = self.coords[dimension] @@ -518,7 +519,6 @@ def __init__(self, name): """Whether bounds are required on this dimension""" self.generic_lev_name = "" """Generic level name""" - def read_json(self, json_data): """ Read coordinate information from json. From fbbd414a718d44571e6d275e63197189b42bf4a0 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Thu, 2 Jul 2020 16:13:47 +0200 Subject: [PATCH 11/13] Improve error message --- esmvalcore/cmor/check.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 4938906b4a..118b5a44f8 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -415,7 +415,8 @@ def _check_generic_level_dim_names(self, key, coordinate): if coordinate.out_name: self.report_critical( f'Coordinate {coordinate.name} ' - 'has wrong standard_name.', + 'has wrong standard_name ' + 'or is not set.', ) else: self.report_critical( From d9e2351b3c01eb023f7d047ad54a2dd1cee9d71e Mon Sep 17 00:00:00 2001 From: sloosvel Date: Mon, 5 Oct 2020 09:16:31 +0200 Subject: [PATCH 12/13] Add debug message --- esmvalcore/cmor/check.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 118b5a44f8..04ee717cd9 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -411,6 +411,11 @@ def _check_generic_level_dim_names(self, key, coordinate): level.generic_level = True self._cmor_var.coordinates[coordinate.name] = level self._cmor_var.coordinates.pop(key) + self.report_debug_message( + f'Generic level coordinate {key} ' + 'will be checked against ' + f'{coordinate.name} coordinate information' + ) else: if coordinate.out_name: self.report_critical( From 543947ad725c023bd439601fb66990ba75c508c7 Mon Sep 17 00:00:00 2001 From: sloosvel Date: Mon, 5 Oct 2020 18:39:02 +0200 Subject: [PATCH 13/13] Update cmor coord info depending on dataset --- esmvalcore/cmor/check.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esmvalcore/cmor/check.py b/esmvalcore/cmor/check.py index 04ee717cd9..c007ed9d06 100644 --- a/esmvalcore/cmor/check.py +++ b/esmvalcore/cmor/check.py @@ -409,8 +409,9 @@ def _check_generic_level_dim_names(self, key, coordinate): ) level = coordinate.generic_lev_coords[coordinate.name] level.generic_level = True - self._cmor_var.coordinates[coordinate.name] = level - self._cmor_var.coordinates.pop(key) + level.generic_lev_coords = self._cmor_var.coordinates[ + key].generic_lev_coords + self._cmor_var.coordinates[key] = level self.report_debug_message( f'Generic level coordinate {key} ' 'will be checked against '