Source code for pycif.plugins.obsvects.standard.utils.read
import copy
import os
from .....utils.datastores.dump import read_datastore
[docs]
def read(obsvect, dir_dump):
"""Reload simulation results from previously dumped ``monitor.nc`` files.
Reads the ``sim``, ``sim_tl``, ``obs``, and ``obserror`` columns from
the per-tracer ``monitor.nc`` files written by :func:`~.dump.dump` and
copies them back into the flat obsvect arrays (``ysim``, ``dy``,
``yobs``, ``yobs_err``). Also restores ``tracer.datastore`` for each
tracer.
This is used to reload forward-run results without re-running the
observation operator (e.g. for adjoint restarts or post-processing).
Args:
obsvect (Plugin): obsvect plugin instance with ``dim``, ``yobs``,
``ysim``, ``dy``, ``yobs_err`` already allocated (typically after
:func:`~.init_y0.init_y0`).
dir_dump (str): root directory from which per-tracer monitor files
are read (``<dir_dump>/<component>/<tracer>/monitor.nc``).
Returns:
bool: ``True`` if no observation tracers were found (nothing to read);
``False`` if at least one tracer was successfully reloaded.
"""
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
nothing_to_read = True
components = datavect.components
for comp in components.attributes:
component = getattr(components, comp)
# Skip if component does not have parameters
if not hasattr(component, "parameters"):
continue
for trcr in component.parameters.attributes:
tracer = getattr(component.parameters, trcr)
# Skip tracers that are not control variables
if not tracer.isobs:
continue
nothing_to_read = False
file_monitor = f"{dir_dump}/{comp}/{trcr}/monitor.nc"
ds = read_datastore(file_monitor)
tracer.datastore = ds
obsvect.ysim[tracer.ypointer: tracer.ypointer + tracer.dim] = \
ds["maindata"]["sim"]
obsvect.dy[tracer.ypointer: tracer.ypointer + tracer.dim] = \
ds["maindata"]["sim_tl"]
obsvect.yobs[tracer.ypointer: tracer.ypointer + tracer.dim] = \
ds["maindata"]["obs"]
obsvect.yobs_err[tracer.ypointer: tracer.ypointer + tracer.dim] = \
ds["maindata"]["obserror"]
return nothing_to_read