#!/usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright (C) 2014-2025 GEM Foundation
#
# OpenQuake is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenQuake is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with OpenQuake. If not, see <http://www.gnu.org/licenses/>.
"""
Tests for execution and expected values from ModifiableGMPEs
specified in an SMT Comparison toml.
"""
import os
import pandas as pd
import shutil
import unittest
from openquake.smt.comparison import compare_gmpes as comp
from openquake.smt.comparison.utils_compare_gmpes import compute_matrix_gmpes
from openquake.smt.comparison.utils_gmpes import matrix_to_df
# Base path
BASE = os.path.join(os.path.dirname(__file__), "data")
[docs]
class ModifyGroundMotionsTestCase(unittest.TestCase):
"""
Test cases for use of ModifiableGMPEs in the SMT's
Comparison module.
"""
[docs]
@classmethod
def setUpClass(self):
self.input_file = os.path.join(BASE, "inputs", "mgmpe_test.toml")
self.output_directory = os.path.join(BASE, "expected", 'mgmpe_test')
self.exp_mgmpe = os.path.join(BASE, "expected", "exp_mgmpe.csv")
if not os.path.exists(self.output_directory):
os.makedirs(self.output_directory)
[docs]
def test_mgmpe_from_toml(self):
"""
Check ModifiableGMPEs specified within an SMT Comparison
toml are executed correctly and that the expected values
are returned.
"""
# Check each parameter matches target
config = comp.Configurations(self.input_file)
# Get matrices of predicted ground-motions per GMM
obs_matrix = compute_matrix_gmpes(config, mtxs_type='median')
del obs_matrix['gmpe_list']
# Load the matrices of expected ground-motions per GMM
if not os.path.exists(self.exp_mgmpe):
# Write if doesn't exist
df = matrix_to_df(obs_matrix, len(config.gmpes_list))
df.to_csv(self.exp_mgmpe)
exp_df = pd.read_csv(self.exp_mgmpe, index_col=0)
# Load obs into dataframe
obs_df = matrix_to_df(obs_matrix, len(config.gmpes_list))
# Now check matrix dfs
pd.testing.assert_frame_equal(obs_df, exp_df, atol=1e-06)
# Also, check the baseline ratio with mgmpe plotting works
comp.plot_ratios(self.input_file, self.output_directory)
[docs]
@classmethod
def tearDownClass(self):
"""
Remove the test outputs.
"""
shutil.rmtree(self.output_directory)