class ScenarioHazardCalculatorTestCase(unittest.TestCase): """ Tests for the Scenario Hazard engine. """ @classmethod def setUpClass(cls): cls.kvs_client = kvs.get_client() def setUp(self): kvs.get_client().flushall() base_path = helpers.testdata_path("scenario") self.job_profile, self.params, self.sections = ( engine.import_job_profile(SCENARIO_SMOKE_TEST)) calculation = OqCalculation(owner=self.job_profile.owner, oq_job_profile=self.job_profile) calculation.save() self.calc_proxy = CalculationProxy( self.params, calculation.id, sections=self.sections, base_path=base_path, oq_job_profile=self.job_profile, oq_calculation=calculation) self.calc_proxy.params[NUMBER_OF_CALC_KEY] = "1" self.calc_proxy.params['SERIALIZE_RESULTS_TO'] = 'xml' # saving the default java implementation self.default = ( scenario.ScenarioHazardCalculator.compute_ground_motion_field) self.grid = self.calc_proxy.region.grid self.calc_proxy.to_kvs() def tearDown(self): # restoring the default java implementation scenario.ScenarioHazardCalculator.compute_ground_motion_field = \ self.default def test_multiple_computations_are_triggered(self): """The hazard subsystem is able to trigger multiple computations. Depending on the value specified by the user in the NUMBER_OF_GROUND_MOTION_FIELDS_CALCULATIONS key, the system calls the computation of the values for the entire region multiple times. """ self.calc_proxy.params[NUMBER_OF_CALC_KEY] = "3" self.job_profile.gmf_calculation_number = 3 self.job_profile.save() calculator = scenario.ScenarioHazardCalculator(self.calc_proxy) with patch('openquake.calculators.hazard.scenario.core' '.ScenarioHazardCalculator' '.compute_ground_motion_field') as compute_gmf_mock: # the return value needs to be a Java HashMap compute_gmf_mock.return_value = java.jclass('HashMap')() calculator.execute() self.assertEquals(3, compute_gmf_mock.call_count) def test_transforms_a_java_gmf_to_dict(self): location1 = java.jclass("Location")(1.0, 2.0) location2 = java.jclass("Location")(1.1, 2.1) location3 = java.jclass("Location")(1.2, 2.2) site1 = java.jclass("Site")(location1) site2 = java.jclass("Site")(location2) site3 = java.jclass("Site")(location3) hashmap = java.jclass("HashMap")() hashmap.put(site1, 0.1) hashmap.put(site2, 0.2) hashmap.put(site3, 0.3) gmf_as_dict = scenario.gmf_to_dict(hashmap, "MMI") for gmv in gmf_as_dict: self.assertTrue(gmv["mag"] in (0.1, 0.2, 0.3)) self.assertTrue(gmv["site_lon"] in (2.0, 2.1, 2.2)) self.assertTrue(gmv["site_lat"] in (1.0, 1.1, 1.2)) def test_when_measure_type_is_not_mmi_exp_is_stored(self): location = java.jclass("Location")(1.0, 2.0) site = java.jclass("Site")(location) hashmap = java.jclass("HashMap")() hashmap.put(site, 0.1) for gmv in scenario.gmf_to_dict(hashmap, "PGA"): self.assertEqual(math.exp(0.1), gmv["mag"]) def test_when_measure_type_is_mmi_we_store_as_is(self): location = java.jclass("Location")(1.0, 2.0) site = java.jclass("Site")(location) hashmap = java.jclass("HashMap")() hashmap.put(site, 0.1) for gmv in scenario.gmf_to_dict(hashmap, "MMI"): self.assertEqual(0.1, gmv["mag"]) def test_loads_the_rupture_model(self): calculator = scenario.ScenarioHazardCalculator(self.calc_proxy) self.assertEqual("org.opensha.sha.earthquake.EqkRupture", calculator.rupture_model.__class__.__name__) def test_the_same_calculator_is_used_between_multiple_invocations(self): calculator = scenario.ScenarioHazardCalculator(self.calc_proxy) gmf_calculator1 = calculator.gmf_calculator([shapes.Site(1.0, 1.0)]) gmf_calculator2 = calculator.gmf_calculator([shapes.Site(1.0, 1.0)]) self.assertTrue(gmf_calculator1 == gmf_calculator2)
def test_generate_hazard_curves_using_classical_psha(self): def verify_realization_haz_curves_stored_to_kvs(the_job, keys): """ This just tests to make sure there something in the KVS for each key in given list of keys. This does NOT test the actual results. """ # TODO (LB): At some point we need to test the actual # results to verify they are correct realizations = int( the_job.params['NUMBER_OF_LOGIC_TREE_SAMPLES']) for realization in xrange(0, realizations): for site in the_job.sites_to_compute(): key = tokens.hazard_curve_poes_key( the_job.job_id, realization, site) self.assertTrue(key in keys, "Missing key %s" % key) def verify_mean_haz_curves_stored_to_kvs(the_job, keys): """ Make sure that the keys and non-empty values for mean hazard curves have been written to KVS.""" if the_job.params['COMPUTE_MEAN_HAZARD_CURVE'].lower() == 'true': LOG.debug("verifying KVS entries for mean hazard curves") for site in the_job.sites_to_compute(): key = tokens.mean_hazard_curve_key(the_job.job_id, site) self.assertTrue(key in keys, "Missing key %s" % key) def verify_mean_haz_maps_stored_to_kvs(the_job, calculator, keys): """ Make sure that the keys and non-empty values for mean hazard maps have been written to KVS.""" if (the_job.params[hazard_general.POES_PARAM_NAME] != '' and the_job.params['COMPUTE_MEAN_HAZARD_CURVE'].lower() == \ 'true'): LOG.debug("verifying KVS entries for mean hazard maps") for poe in calculator.poes_hazard_maps: for site in the_job.sites_to_compute(): key = tokens.mean_hazard_map_key( the_job.job_id, site, poe) self.assertTrue(key in keys, "Missing key %s" % key) def verify_quantile_haz_curves_stored_to_kvs(the_job, calculator, keys): """ Make sure that the keys and non-empty values for quantile hazard curves have been written to KVS.""" quantiles = calculator.quantile_levels LOG.debug("verifying KVS entries for quantile hazard curves, "\ "%s quantile values" % len(quantiles)) for quantile in quantiles: for site in the_job.sites_to_compute(): key = tokens.quantile_hazard_curve_key( the_job.job_id, site, quantile) self.assertTrue(key in keys, "Missing key %s" % key) def verify_quantile_haz_maps_stored_to_kvs(the_job, calculator, keys): """ Make sure that the keys and non-empty values for quantile hazard maps have been written to KVS.""" quantiles = calculator.quantile_levels if (the_job.params[hazard_general.POES_PARAM_NAME] != '' and len(quantiles) > 0): poes = calculator.poes_hazard_maps LOG.debug("verifying KVS entries for quantile hazard maps, "\ "%s quantile values, %s PoEs" % ( len(quantiles), len(poes))) for quantile in quantiles: for poe in poes: for site in the_job.sites_to_compute(): key = tokens.quantile_hazard_map_key( the_job.job_id, site, poe, quantile) self.assertTrue( key in keys, "Missing key %s" % key) def verify_realization_haz_curves_stored_to_nrml(the_job, calculator): """Tests that a NRML file has been written for each realization, and that this file validates against the NRML schema. Does NOT test if results in NRML file are correct. """ realizations = int( the_job.params['NUMBER_OF_LOGIC_TREE_SAMPLES']) for realization in xrange(0, realizations): nrml_path = os.path.join( "demos/classical_psha_simple/computed_output", calculator.hazard_curve_filename(realization)) LOG.debug("validating NRML file %s" % nrml_path) self.assertTrue(xml.validates_against_xml_schema( nrml_path, NRML_SCHEMA_PATH), "NRML instance file %s does not validate against schema" \ % nrml_path) def verify_mean_haz_curves_stored_to_nrml(the_job, calculator): """Tests that a mean hazard curve NRML file has been written, and that this file validates against the NRML schema. Does NOT test if results in NRML file are correct. """ if the_job.params['COMPUTE_MEAN_HAZARD_CURVE'].lower() == 'true': nrml_path = os.path.join( "demos/classical_psha_simple/computed_output", calculator.mean_hazard_curve_filename()) LOG.debug("validating NRML file %s" % nrml_path) self.assertTrue(xml.validates_against_xml_schema( nrml_path, NRML_SCHEMA_PATH), "NRML instance file %s does not validate against schema" \ % nrml_path) def verify_mean_haz_maps_stored_to_nrml(the_job): """Tests that a mean hazard map NRML file has been written, and that this file validates against the NRML schema. Does NOT test if results in NRML file are correct. """ if (the_job.params[hazard_general.POES_PARAM_NAME] != '' and the_job.params['COMPUTE_MEAN_HAZARD_CURVE'].lower() == \ 'true'): for poe in calculator.poes_hazard_maps: nrml_path = os.path.join( "demos/classical_psha_simple/computed_output", calculator.mean_hazard_map_filename(poe)) LOG.debug("validating NRML file for mean hazard map %s" \ % nrml_path) self.assertTrue(xml.validates_against_xml_schema( nrml_path, NRML_SCHEMA_PATH), "NRML instance file %s does not validate against "\ "schema" % nrml_path) def verify_quantile_haz_curves_stored_to_nrml(the_job, calculator): """Tests that quantile hazard curve NRML files have been written, and that these file validate against the NRML schema. Does NOT test if results in NRML files are correct. """ for quantile in calculator.quantile_levels: nrml_path = os.path.join( "demos/classical_psha_simple/computed_output", calculator.quantile_hazard_curve_filename(quantile)) LOG.debug("validating NRML file for quantile hazard curve: "\ "%s" % nrml_path) self.assertTrue(xml.validates_against_xml_schema( nrml_path, NRML_SCHEMA_PATH), "NRML instance file %s does not validate against schema" \ % nrml_path) def verify_quantile_haz_maps_stored_to_nrml(the_job, calculator): """Tests that quantile hazard map NRML files have been written, and that these file validate against the NRML schema. Does NOT test if results in NRML files are correct. """ quantiles = calculator.quantile_levels if (the_job.params[hazard_general.POES_PARAM_NAME] != '' and len(quantiles) > 0): for poe in calculator.poes_hazard_maps: for quantile in quantiles: nrml_path = os.path.join( "demos/classical_psha_simple/computed_output", calculator.quantile_hazard_map_filename(quantile, poe)) LOG.debug("validating NRML file for quantile hazard "\ "map: %s" % nrml_path) self.assertTrue(xml.validates_against_xml_schema( nrml_path, NRML_SCHEMA_PATH), "NRML instance file %s does not validate against "\ "schema" % nrml_path) base_path = helpers.testdata_path("classical_psha_simple") path = helpers.testdata_path("classical_psha_simple/config.gem") job_profile, params, sections = engine.import_job_profile(path) calculation = OqCalculation(owner=job_profile.owner) calculation.oq_job_profile = job_profile calculation.save() the_job = CalculationProxy( params, calculation.id, sections=sections, base_path=base_path, serialize_results_to=['db', 'xml'], oq_job_profile=job_profile, oq_calculation=calculation) the_job.to_kvs() calc_mode = job_profile.calc_mode calculator = CALCULATORS[calc_mode](the_job) used_keys = [] calculator.execute(used_keys) verify_realization_haz_curves_stored_to_kvs(the_job, used_keys) verify_realization_haz_curves_stored_to_nrml(the_job, calculator) # hazard curves: check results of mean and quantile computation verify_mean_haz_curves_stored_to_kvs(the_job, used_keys) verify_quantile_haz_curves_stored_to_kvs(the_job, calculator, used_keys) verify_mean_haz_curves_stored_to_nrml(the_job, calculator) verify_quantile_haz_curves_stored_to_nrml(the_job, calculator) # hazard maps: check results of mean and quantile computation verify_mean_haz_maps_stored_to_kvs(the_job, calculator, used_keys) verify_quantile_haz_maps_stored_to_kvs(the_job, calculator, used_keys) verify_mean_haz_maps_stored_to_nrml(the_job) verify_quantile_haz_maps_stored_to_nrml(the_job, calculator)