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
)