Source code for shakemap.coremods.info

# stdlib imports
import os.path
import json

# third party imports
import numpy as np
from impactutils.io.smcontainers import ShakeMapOutputContainer

# local imports
from .base import CoreModule, Contents
from shakemap.utils.config import get_config_paths


[docs]class InfoModule(CoreModule): """ info -- Extract info.json from shake_result.hdf and write it as a file. """ command_name = "info" targets = [r"products/info\.json"] dependencies = [("products/shake_result.hdf", True)] def __init__(self, eventid): super(InfoModule, self).__init__(eventid) self.contents = Contents(None, None, eventid)
[docs] def execute(self): """ Write info.json metadata file. Raises: NotADirectoryError: When the event data directory does not exist. FileNotFoundError: When the the shake_result HDF file does not exist. """ install_path, data_path = get_config_paths() datadir = os.path.join(data_path, self._eventid, "current", "products") if not os.path.isdir(datadir): raise NotADirectoryError(f"{datadir} is not a valid directory.") datafile = os.path.join(datadir, "shake_result.hdf") if not os.path.isfile(datafile): raise FileNotFoundError(f"{datafile} does not exist.") # Open the ShakeMapOutputContainer and extract the data container = ShakeMapOutputContainer.load(datafile) # Create ShakeMap metadata file self.logger.debug("Writing info.json file...") info = container.getMetadata() # Clean up strec results to be valid json if "strec" in info: for k, v in info["strec"].items(): if isinstance(v, float): if not np.isfinite(v): info["strec"][k] = None infostring = json.dumps(info, allow_nan=False) info_file = os.path.join(datadir, "info.json") f = open(info_file, "wt") f.write(infostring) f.close() container.close() cap = "ShakeMap processing parameters and map summary information." self.contents.addFile( "supplementalInformation", "Supplemental Information", cap, "info.json", "application/json", )