SourceParametersEstimation/SpectralParameters.py

65 lines
2.5 KiB
Python
Raw Permalink Normal View History

2024-10-09 11:24:44 +02:00
from spectral_definitions import mm
class SpectralParams:
def __init__(self, mo, fo, q, stress_drop=0, source_size=0):
self.mo = mo
self.fo = fo
self.q = q
self.mw = mm(mo)
self.stress_drop = stress_drop
self.source_size = source_size
def __str__(self):
return (f"SpectralAnalysis parameters: M0={self.mo:.2e}, F0={self.fo:.2f}, "
f"Q={self.q:.2f}, Mw={self.mw:.2f}, "
f"stress drop = {self.stress_drop:.2e}, source size = {self.source_size:.0f}")
class EventSpectralParams(SpectralParams):
def __init__(self, mo, fo, q, stress_drop, source_size, mo_e, fo_e, q_e, source_size_e, stress_drop_e):
super().__init__(mo, fo, q, stress_drop, source_size)
self.mo_e = mo_e
self.fo_e = fo_e
self.q_e = q_e
self.mw = mm(mo)
self.source_size_e = source_size_e
self.stress_drop_e = stress_drop_e
self.mo_1, self.mo_2 = self.calculate_uncertainties(self.mo, self.mo_e)
self.fo_1, self.fo_2 = self.calculate_uncertainties(self.fo, self.fo_e)
self.q_1, self.q_2 = self.calculate_uncertainties(self.q, self.q_e)
self.mw_1, self.mw_2 = self.calculate_uncertainties_mw(self.mo, self.mo_e)
self.source_size_1, self.source_size_2 = self.calculate_uncertainties(self.source_size, self.source_size_e)
self.stress_drop_1, self.stress_drop_2 = self.calculate_uncertainties(self.stress_drop, self.stress_drop_e)
def __str__(self):
return f"SpectralAnalysis parameters: " \
f"Seismic moment: {self.mo:.2e} <{self.mo_1:.2e}, {self.mo_2:.2e}> " \
f"Corner frequency: {self.fo:.2f} <{self.fo_1:.2f}, {self.fo_2:.2f}> " \
f"Q factor: {self.q:.2f} <{self.q_1:.2f}, {self.q_2:.2f}> " \
f"Mw: {self.mw:.2f} <{self.mw_1:.2f}, {self.mw_2:.2f}> " \
f"Stress drop: {self.stress_drop:.0f} <{self.stress_drop_1:.0f}, {self.stress_drop_2:.0f}> " \
f"Source size: {self.source_size:.0f} <{self.source_size_1:.0f}, {self.source_size_2:.0f}> "
@staticmethod
def calculate_uncertainties(x, x_e):
if x_e == -999:
unc1 = 0
unc2 = 0
else:
unc1 = x / x_e
unc2 = x * x_e
return unc1, unc2
@staticmethod
def calculate_uncertainties_mw(mo, mo_e):
if mo_e == -999:
unc1 = 0
unc2 = 0
else:
unc1 = mm(mo / mo_e)
unc2 = mm(mo * mo_e)
return unc1, unc2