def get_GSWP3_data(met_vars, year):

    file_tpl = "{d}/gridded/GSWP3/{v}/GSWP3.BC.{v}.3hrMap.{y}.nc"

    data = {}
    for v in met_vars:
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v=v, y=year)) as ds:
            data[v] = ds[v].copy()
    data = xr.Dataset(data)

    return data
def get_GLEAM3a_data(met_vars, year):
    assert met_vars == ['Qle'], 'GLEAM loading is incomplete'

    file_tpl = '{d}/gridded/GLEAM_v3a_BETA/{v}_{y}_GLEAM_v3a_BETA.nc'

    data = {}
    for v in met_vars:
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v='Et', y=year), decode_times=False) as ds:
            data['Qle'] = ds['Et'].copy()
    data = xr.Dataset(data)

    return data
def get_MPI_data(met_vars, year):
    assert met_vars == ['Qle'], 'MPI loading is incomplete'

    file_tpl = '{d}/gridded/MPI/Ensemble{v}cor_May12.{y}.nc'

    data = {}
    for v in met_vars:
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v='LE', y=year), decode_times=False) as ds:
            data['Qle'] = ds['EnsembleLEcor_May12'].copy()
    data = xr.Dataset(data)

    return data
def get_MODIS_data(met_vars, year):
    assert met_vars == ['Qle'], 'MODIS loading is incomplete'

    file_tpl = '{d}/gridded/MODIS/MOD16_{v}_GSWP3_{y}.nc'

    data = {}
    for v in met_vars:
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v='ET', y=year)) as ds:
            data['Qle'] = ds['et'].copy()
    data = xr.Dataset(data)

    return data
def get_PRINCETON_data(met_vars, year):

    file_tpl = "{d}/gridded/PRINCETON/0_5_3hourly/{v}_3hourly_{y}-{y}.nc"

    dataset_vars = get_dataset_vars('PRINCETON', met_vars)

    data = {}
    for v, fv in dataset_vars.items():
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v=fv, y=year)) as ds:
            data[v] = ds[fv].copy()
    data = xr.Dataset(data)

    return data
def get_WATCH_WFDEI_data(met_vars, year):

    file_tpl = "{d}/gridded/WATCH_WFDEI/{v}_WFDEI/{v}_WFDEI_{y}*.nc"

    data = {}
    for v in met_vars:
        files = sorted(glob.glob(file_tpl.format(d=pud.get_data_dir(), v=v, y=year)))
        datasets = [xr.open_dataset(f, decode_times=False) for f in files]
        # TODO: WATCH_FDEI uses a fill-value mask, so replace with NANs?
        data[v] = xr.concat(
            [correct_WATCH_WFDEI_coords(ds, v, year) for ds in datasets],
            dim='time')
        [ds.close() for ds in datasets]
    data = xr.Dataset(data)

    return data
def get_CRUNCEP_data(met_vars, year):

    file_tpl = "{d}/gridded/CRUNCEP/cruncep2015_1_{v}_{y}.nc"

    dataset_vars = get_dataset_vars('CRUNCEP', met_vars)
    infile_vars = get_dataset_vars('CRUNCEP', met_vars, in_file=True)

    data = {}
    for v, fv in dataset_vars.items():
        # TODO: CRUNCEP uses a mask variable, so replace with NANs?
        with xr.open_dataset(file_tpl.format(d=pud.get_data_dir(), v=fv, y=year)) as ds:
            data[v] = correct_CRUNCEP_coords(ds, infile_vars[v], year)
    data = xr.Dataset(data)

    # CRUNCEP uses stupid units: ftp://nacp.ornl.gov/synthesis/2009/frescati/model_driver/cru_ncep/analysis/readme.htm
    data['SWdown'] = data.SWdown / 21600

    return data