Source code for pycif.plugins.datastreams.fluxes.chimere.fetch

import os
import datetime
import pandas as pd
import xarray as xr
import itertools
from .....utils import path
from .....utils.classes.setup import Setup


[docs] def fetch(ref_dir, ref_file, input_interval, target_dir, tracer=None, **kwargs): list_period_dates = \ pd.date_range(input_interval[0], input_interval[1], freq=tracer.file_freq) list_dates = {} list_files = {} for dd in list_period_dates: file = dd.strftime(f"{ref_dir}/{ref_file}") if os.path.isfile(file): file_hours = pd.date_range( dd, dd + pd.to_timedelta(tracer.file_freq), freq="1H") list_dates[dd] = [[hh, hh + datetime.timedelta(hours=1)] for hh in file_hours] list_files[dd] = (len(file_hours) * [file]) # Fetching target_file = f"{target_dir}/{os.path.basename(file)}" path.link(file, target_file) # Raise exception if no file was found if not list(itertools.chain(*list_files.values())): raise Exception( f"Could not find any file fitting the requested structure:\nPlease check your informations: \n - ref_dir: {ref_dir}\n - ref_file: {ref_file}\n - date_range: {input_interval}\n - file_freq: {tracer.file_freq}\nThis set-up leads to the following dates and files being looped on:\n" + "\n".join([dd.strftime(f" - {dd}: {ref_dir}/{ref_file}") for dd in list_period_dates]) ) # Alter vertical domain depending on input files # if bottom_top dimension is available file_ref = list(itertools.chain(*list_files.values()))[0] nlevemis = 0 try: nlevemis = xr.open_dataset(file_ref).dims["bottom_top"] except KeyError: pass if nlevemis > 0: domain_in = tracer.domain if domain_in.nlev != nlevemis: domain_out = Setup.load_registered( domain_in.plugin.name, domain_in.plugin.version, "domain", plg_orig=domain_in ) domain_out.nlon = domain_in.nlon domain_out.nlat = domain_in.nlat domain_out.zlon = domain_in.zlon domain_out.zlat = domain_in.zlat domain_out.zlonc = domain_in.zlonc domain_out.zlatc = domain_in.zlatc domain_out.nlon_side = domain_in.nlon_side domain_out.nlat_side = domain_in.nlat_side domain_out.zlonc_side = domain_in.zlonc_side domain_out.zlatc_side = domain_in.zlatc_side domain_out.zlon_side = domain_in.zlon_side domain_out.zlat_side = domain_in.zlat_side # Read nlevemis from one of the available files domain_out.pressure_unit = domain_in.pressure_unit domain_out.nlev = nlevemis domain_out.sigma_a = domain_in.sigma_a[:domain_out.nlev + 1] domain_out.sigma_b = domain_in.sigma_b[:domain_out.nlev + 1] domain_out.sigma_a_mid = domain_in.sigma_a_mid[:domain_out.nlev] domain_out.sigma_b_mid = domain_in.sigma_b_mid[:domain_out.nlev] tracer.domain = domain_out return list_files, list_dates