Source code for pycif.plugins.obsvects.standard.utils.dump

import copy
import os

import numpy as np

from .....utils.datastores.dump import dump_datastore
from .....utils.iterators import iter_tracers


[docs] def dump(obsvect, dir_dump): """Write the populated observation vector to ``monitor.nc`` files. For each observation tracer, creates a copy of its datastore, fills the ``maindata`` columns (``obs``, ``obserror``, ``sim``, ``sim_tl``) from the flat obsvect arrays, optionally adds an ``orig_index`` column, and serialises the result to: .. code-block:: text <dir_dump>/<component>/<tracer>/monitor.nc The file format is controlled by ``obsvect.dump_type`` (``'nc'`` or ``'csv'``). Global NetCDF attributes recording the run dates and model configuration are written as ``nc_attributes``. Args: obsvect (Plugin): obsvect plugin instance. Must have been initialised (``yobs``, ``ysim``, ``dy``, ``yobs_err`` filled). dir_dump (str): root directory under which the per-tracer sub- directories are created. """ datavect = obsvect.datavect # If no definition is specified for the control vector in the Yaml, # return empty control vector if not hasattr(datavect, "components"): return obsvect # Else, carry on initializing for (component_name, tracer_name), tracer in iter_tracers(datavect): # Skip tracers that are not control variables if not tracer.isobs: continue ds = copy.deepcopy(tracer.datastore) ds[("maindata", "obs")] = obsvect.yobs[tracer.ypointer: tracer.ypointer + tracer.dim] ds[("maindata", "obserror")] = obsvect.yobs_err[tracer.ypointer: tracer.ypointer + tracer.dim] ds[("maindata", "sim")] = obsvect.ysim[tracer.ypointer: tracer.ypointer + tracer.dim] ds[("maindata", "sim_tl")] = obsvect.dy[tracer.ypointer: tracer.ypointer + tracer.dim] if obsvect.dump_index: ds[("metadata", "orig_index")] = np.arange(tracer.ypointer, tracer.ypointer + tracer.dim) # Attributes to keep in the monitor if NetCDF format (recommanded!) model_name = "" model_version = "" model_nlon = "" model_nlat = "" if hasattr(obsvect.model, "plugin"): model_name = obsvect.model.plugin.name model_version = obsvect.model.plugin.version model_nlon = str(obsvect.model.domain.nlon) model_nlat = str(obsvect.model.domain.nlat) nc_attributes = { "datei": tracer.datei.strftime("%d-%m-%Y %H:%M:%S"), "datef": tracer.datef.strftime("%d-%m-%Y %H:%M:%S"), "model name": model_name, "model version": model_version, "domain nlon": model_nlon, "domain nlat": model_nlat } file_monitor = os.path.join( dir_dump, component_name, tracer_name, "monitor.nc") dump_datastore( ds, file_monitor, mode="w", dump_type=obsvect.dump_type, nc_attributes=nc_attributes, col2dump=ds.columns, dump_default=False )