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