Source code for tctrack.utils.metadata
"""Module providing utility functions for reading metadata from output files."""
import json
from netCDF4 import Dataset
from tctrack.core import TCTrackerParameters
from tctrack.tempest_extremes import TEDetectParameters, TEStitchParameters, TETracker
from tctrack.track import TRACKParameters, TRACKTracker
from tctrack.tstorms import (
TSTORMSBaseParameters,
TSTORMSDetectParameters,
TSTORMSStitchParameters,
TSTORMSTracker,
)
_TRACKER_CLASSES: dict[str, type] = {
"TETracker": TETracker,
"TRACKTracker": TRACKTracker,
"TSTORMSTracker": TSTORMSTracker,
}
_PARAMETER_CLASSES: dict[str, type] = {
"TEDetectParameters": TEDetectParameters,
"TEStitchParameters": TEStitchParameters,
"TRACKParameters": TRACKParameters,
"TSTORMSBaseParameters": TSTORMSBaseParameters,
"TSTORMSDetectParameters": TSTORMSDetectParameters,
"TSTORMSStitchParameters": TSTORMSStitchParameters,
}
def _read_metadata(filename: str) -> tuple[str, str, dict[str, dict]]:
"""Read the TCTrack metadata from the output file.
Returns the TCTrack version, the tracker used, and the parameters (as a dictionary
of parameter classes, each containing a dictionary of parameters).
"""
with Dataset(filename) as ds:
try:
version = ds.getncattr("tctrack_version")
tracker_name = ds.getncattr("tctrack_tracker")
parameter_dicts = json.loads(ds.getncattr("tctrack_parameters"))
except AttributeError as e:
msg = f"File {filename!r} is missing required TCTrack attributes."
raise ValueError(msg) from e
return version, tracker_name, parameter_dicts
[docs]
def read_tracker_metadata(filename: str) -> None:
"""Print the TCTrack metadata from an output file to stdout in a readable format.
Parameters
----------
filename : str
The filename of the output netcdf file containing TC tracks.
"""
version, tracker_name, parameter_dicts = _read_metadata(filename)
print(f"\nTCTrack version: {version}")
print(f"TCTrack tracker: {tracker_name}")
for parameter_class, parameters in parameter_dicts.items():
print(f"\n{parameter_class}:")
for name, parameter in parameters.items():
print(f"\t{name}: {parameter}")
[docs]
def load_tracker_metadata(filename: str) -> tuple[type, list[TCTrackerParameters]]:
"""Read the TCTrack metadata from an output file, returns the parameters.
Parameters
----------
filename : str
The filename of the output netcdf file containing TC tracks.
Returns
-------
tracker_cls : type
The relevant TCTracker type. This can be initialised by:
`tracker_cls(*parameters)`.
parameters : list[TCTrackerParameters]
A list of parameter objects that duplicate the information in the metadata.
Examples
--------
To read in the metadata from an output file, instantiate a tracker and reproduce the
results:
>>> tracker_cls, parameters = load_tracker_metadata("tracks.nc")
>>> tracker = tracker_cls(*parameters)
>>> tracker.run_tracker("tracks_new.nc")
"""
_, tracker_name, parameter_dicts = _read_metadata(filename)
# Instantiate parameter classes from each parameter dictionary
parameters = []
for name, parameter_dict in parameter_dicts.items():
parameter_cls = _PARAMETER_CLASSES[name]
parameters.append(parameter_cls(**parameter_dict))
tracker = _TRACKER_CLASSES[tracker_name]
return tracker, parameters