Source code for netcdf_scm.misc_readers

"""Miscellaneous readers for files which can't otherwise be read"""
from scmdata import ScmRun

from .iris_cube_wrappers import ScmCube
from .utils import _check_cube_and_adjust_if_needed

try:
    import iris

except ModuleNotFoundError:  # pragma: no cover # emergency valve
    from .errors import raise_no_iris_warning

    raise_no_iris_warning()


[docs]def read_cmip6_concs_gmnhsh( # pylint:disable=too-many-locals filepath, region_coord_name="sector" ): """ Read CMIP6 concentrations global and hemispheric mean data Parameters ---------- filepath : str Filepath from which to read the data region_coord_name : str The name of the co-ordinate which represents the region in the datafile. Returns ------- :obj:`scmdata.ScmRun` :obj:`scmdata.ScmRun` containing the global and hemispheric mean data Raises ------ AssertionError Defensive assertion: the code is being used in an unexpected way """ loaded_cube = iris.load_cube(filepath) checked_cube = _check_cube_and_adjust_if_needed(loaded_cube) region_map = { "GM": "World", "NH": "World|Northern Hemisphere", "SH": "World|Southern Hemisphere", } unit_map = {"1.e^-6": "ppm", "1.e^-9": "ppb", "1.e^-12": "ppt"} timeseries_cubes = {} for region_coord in checked_cube.coord(region_coord_name): if len(list(region_coord.cells())) != 1: # pragma: no cover raise AssertionError("Should only have one point now") original_names = { int(v.split(":")[0].strip()): v.split(":")[1].strip() for v in region_coord.attributes["original_names"].split(";") } original_regions = {k: v.split("_")[-1] for k, v in original_names.items()} region_coord_point = region_coord.cell(0).point region = region_map[original_regions[region_coord_point]] if checked_cube.shape[1] != 3 or checked_cube.shape[0] == 3: raise AssertionError("cube data shape isn't as expected") checked_cube.attributes["variable"] = checked_cube.var_name checked_cube.attributes["variable_standard_name"] = checked_cube.standard_name checked_cube.attributes["region"] = region if checked_cube.attributes["source_id"].startswith("UoM-CMIP"): scenario = "historical" model = "unspecified" else: scenario = "-".join( "ssp{}".format( checked_cube.attributes["source_id"].split("ssp")[1] ).split("-")[:-3] ) model = ( checked_cube.attributes["source_id"] .split("-ssp")[0] .replace("UoM-", "") ) checked_cube.attributes["scenario"] = scenario checked_cube.attributes["model"] = model checked_cube.attributes["climate_model"] = "MAGICC7" checked_cube.attributes["member_id"] = "unspecified" helper_region = ScmCube() helper_region.cube = checked_cube[:, region_coord_point] helper_region.cube.remove_coord(region_coord_name) timeseries_cubes[region] = helper_region output = ( helper_region.convert_scm_timeseries_cubes_to_openscmdata(timeseries_cubes) .timeseries() .reset_index() ) output["unit"] = output["unit"].map(unit_map) output["model"] = model output = ScmRun(output) return output