Source code for pycif.plugins.controlvects.standard.utils.build_lsm

import numpy as np
import datetime
import itertools

from .....utils.netcdf import readnc
from ....transforms.system.fromcontrol.utils.scalemaps import map2scale
from .....utils.path import init_dir
from .....utils.check.errclass import CifError, CifValueError


[docs] def build_lsm(corr, hresol, tracer): # First check proper definition of sigmas sigma_land = getattr(corr, "sigma_land", -1) sigma_sea = getattr(corr, "sigma_sea", -1) if sigma_land == sigma_sea == -1: raise CifError( "`sigma_land` and `sigma_sea` are both missing" "to compute horizontal correlations with a land-sea mask. \n" "One of the two can be missing if no correlations are to be accounted for " "in the corresponding land/sea area, but at least one must be specified" ) # Different treatment between regions and other resolutions if hresol == "regions": if getattr(tracer, 'regions_lsm', False): landseamask = tracer.regions_lsmask landseamask = map2scale( landseamask[np.newaxis, np.newaxis, :, :], tracer, tracer.domain, region_scale_area=False, region_max_val=True).flatten() return landseamask # Now exclude for non hpixel resolution if hresol != "hpixels": raise CifValueError("Can't manage land sea mask for non hpixel or region resolutions. " f"'{hresol}' was specified") # Carry on with processing pixel resolution if hasattr(corr, 'lsm_infos'): lsm_infos = corr.lsm_infos # Initialize target repository for linking target_dir = f"{tracer.workdir}/controlvect/landseamask/" init_dir(target_dir) list_files, list_dates = lsm_infos.fetch( lsm_infos.dir, lsm_infos.file, [datetime.datetime(1970, 1, 1), datetime.datetime(1970, 1, 1)], target_dir, tracer=lsm_infos, ) all_files = list(itertools.chain(*list_files.values())) all_dates = np.array(list(itertools.chain(*list_dates.values()))) # Cannot carry on if no files if all_files == []: raise CifValueError( 'Cannot read land sea mask as no file fits description' ) # Now read the variable landseamask = lsm_infos.read( 'lsm', lsm_infos.varname, [all_dates[0]], [all_files[0]], tracer=lsm_infos, ).values[0, 0] else: file_lsm = getattr(corr, "filelsm") landseamask = readnc(file_lsm, ["lsm"]).flatten().data return landseamask, sigma_land, sigma_sea