Source code for shakelib.conversions.convert_imc

# Standard library imports
from abc import ABC, abstractmethod

from openquake.hazardlib.const import IMC


[docs]class ComponentConverter(ABC): """Base class for implementing conversions between components."""
[docs] def checkUnknown(self): """ Checks if imc_in or imc_out is an unknown type. If of an unknown type, it is automatically set to GEOMETRIC_MEAN. """ if self.imc_in not in self.conversion_graph: self.imc_in = IMC.GEOMETRIC_MEAN if self.imc_out not in self.conversion_graph: self.imc_out = IMC.GEOMETRIC_MEAN
[docs] def convertAmps(self, imt, amps, rrups=None, mag=None): """ Return an array of amps converted from one IMC to another. Note: This can be used to perform chained conversions. Args: imt (OpenQuake IMT): The intensity measure type of the input ground motions. Valid IMTs are PGA, PGV, and SA. amps (array): A numpy array of the (logged) ground motions to be converted. rrups (array): A numpy array of the same shape as amps, containing the rupture distances of the ground motions. Default is None. mag (float): The earthquake magnitude. Default is None. Returns: array: A numpy array of converted ground motions. """ for idx, path in enumerate(self.path): if idx != len(self.path) - 1: self.imc_in = path self.imc_out = self.path[idx + 1] amps = self.convertAmpsOnce(imt, amps, rrups, mag) return amps
[docs] @abstractmethod def convertAmpsOnce(self, imt, amps, rrups=None, mag=None): """ Return an array of amps converted from one IMC to another. Note: This does not implement chained conversions. Args: imt (OpenQuake IMT): The intensity measure type of the input ground motions. Valid IMTs are PGA, PGV, and SA. amps (array): A numpy array of the (logged) ground motions to be converted. rrups (array): A numpy array of the same shape as amps, containing the rupture distances of the ground motions. mag (float): The earthquake magnitude. Returns: array: A numpy array of converted ground motions. """ pass
[docs] def convertSigmas(self, imt, sigmas): """ Return an array of standard deviations converted from one IMC to another. Note: This can be used to perform chained conversions. Args: imt (OpenQuake IMT): The intensity measure type of the input ground motions. Valid IMTs are PGA, PGV, and SA. sigmas (array): A numpy array of the standard deviations of the logged ground motions. Returns: array: A numpy array of converted standard deviations. """ for idx, path in enumerate(self.path): if idx != len(self.path) - 1: self.imc_in = path self.imc_out = self.path[idx + 1] sigmas = self.convertSigmasOnce(imt, sigmas) return sigmas
[docs] @abstractmethod def convertSigmasOnce(self, imt, sigmas): """ Return an array of standard deviations converted from one IMC to another. Note: This does not implement chained conversions. Args: imt (OpenQuake IMT): The intensity measure type of the input ground motions. Valid IMTs are PGA, PGV, and SA. sigmas (array): A numpy array of the standard deviations of the logged ground motions. Returns: array: A numpy array of converted standard deviations. """ pass
[docs] @staticmethod def pathSearch(graph, imc_in, imc_out): """ Helper method to create a "path" to convert one IMC to another. This can be used for chain conversions Args: graph (Dictionary): Dictionary of sets describing possible conversions between IMCs. imc_in (IMC): OpenQuake IMC type of the input amp array. imc_out (IMC): Desired OpenQuake IMC type of the output amps. Returns: list: IMCs as a path for to convert one IMC to another. """ queue = [(imc_in, [imc_in])] while queue: (key, path) = queue.pop(0) for next_path in graph[key] - set(path): if next_path == imc_out: yield path + [next_path] else: queue.append((next_path, path + [next_path]))
[docs] def getShortestPath(self, graph, imc_in, imc_out): """ Create a "path" to convert one IMC to another. This can be used for chain conversions Args: graph (Dictionary): Dictionary of sets describing possible conversions between IMCs. imc_in (IMC): OpenQuake IMC type of the input amp array. imc_out (IMC): Desired OpenQuake IMC type of the output amps. Returns: list: IMCs as a path for to convert one IMC to another. Raises: ValueError if no path is found. """ try: return next(self.pathSearch(graph, imc_in, imc_out)) except StopIteration: if imc_in == imc_out: return [imc_in, imc_out] else: raise ValueError( f"No possible conversion between {imc_in!r} and {imc_out!r}." )
@abstractmethod def _verifyConversion(self, imc_in, imc_out=None): """ Helper method to ensure that the conversion is possible. Args: imc_in (IMC): OpenQuake IMC type of the input amp array. imc_out (IMC): Desired OpenQuake IMC type of the output amps. Default is None. Raises: ValueError if imc_in or imc_out are not valid.. """ pass
[docs] def imc_from_str(self, imcstring): """ Convert a string to one of the OQ IMC types. Return None if the string does not match any of the strings in the Enum. Args: imcstring (str): A string corresponding to one of the OQ IMC types. Returns: IMC: One of the OQ IMC types. Returns None if nothing matches. """ for imc in IMC: if imc.value == imcstring: return imc return None