def test_geometry_inputs(self): # Tests the geometry definition simple_polygon = polygon.Polygon([point.Point(2.0, 3.0), point.Point(3.0, 3.0), point.Point(3.0, 2.0), point.Point(2.0, 2.0)]) simple_polygon_array = np.array([[2.0, 3.0], [3.0, 3.0], [3.0, 2.0], [2.0, 2.0]]) # Using nhlib.geo.polygon.Polygon class as input self.area_source.create_geometry(simple_polygon, 0.0, 30.0) # Check that geometry is an instance of nhlib.geo.polygon.Polygon self.assertTrue(isinstance(self.area_source.geometry, polygon.Polygon)) np.testing.assert_array_almost_equal(self.area_source.geometry.lons, np.array([2., 3., 3., 2.])) np.testing.assert_array_almost_equal(self.area_source.geometry.lats, np.array([3., 3., 2., 2.])) self.assertAlmostEqual(0.0, self.area_source.upper_depth) self.assertAlmostEqual(30.0, self.area_source.lower_depth) self.area_source = mtkAreaSource('101', 'A Source') # Using numpy array as input self.area_source.create_geometry(simple_polygon_array, 0.0, 30.0) self.assertTrue(isinstance(self.area_source.geometry, polygon.Polygon)) # Check that geometry is an instance of nhlib.geo.polygon.Polygon np.testing.assert_array_almost_equal(self.area_source.geometry.lons, np.array([2., 3., 3., 2.])) np.testing.assert_array_almost_equal(self.area_source.geometry.lats, np.array([3., 3., 2., 2.])) self.assertAlmostEqual(0.0, self.area_source.upper_depth) self.assertAlmostEqual(30.0, self.area_source.lower_depth) # For any other input type - check ValueError is raised self.area_source = mtkAreaSource('101', 'A Source') with self.assertRaises(ValueError) as ver: self.area_source.create_geometry('a bad input', 0.0, 30.0) self.assertEqual(str(ver.exception), 'Unrecognised or unsupported geometry definition') # For numpy array with only two rows self.area_source = mtkAreaSource('101', 'A Source') simple_polygon_array = np.array([[2.0, 3.0], [3.0, 3.0]]) with self.assertRaises(ValueError) as ver: self.area_source.create_geometry(simple_polygon_array, 0.0, 30.0) self.assertEqual(str(ver.exception), 'Incorrectly formatted polygon geometry - ' 'needs three or more vertices')
def test_create_oqhazardlib_source(self): # Define a complete source area_geom = polygon.Polygon([ point.Point(10., 10.), point.Point(12., 10.), point.Point(12., 8.), point.Point(10., 8.) ]) mfd1 = TruncatedGRMFD(5.0, 8.0, 0.1, 3.0, 1.0) self.area_source = mtkAreaSource('001', 'A Point Source', trt='Active Shallow Crust', geometry=area_geom, upper_depth=0., lower_depth=20., mag_scale_rel=None, rupt_aspect_ratio=1.0, mfd=mfd1, nodal_plane_dist=None, hypo_depth_dist=None) test_source = self.area_source.create_oqhazardlib_source( TOM, 1.0, 10.0, True) self.assertIsInstance(test_source, AreaSource) self.assertIsInstance(test_source.mfd, TruncatedGRMFD) self.assertAlmostEqual(test_source.mfd.b_val, 1.0) self.assertIsInstance(test_source.nodal_plane_distribution, PMF) self.assertIsInstance(test_source.hypocenter_distribution, PMF) self.assertIsInstance(test_source.magnitude_scaling_relationship, WC1994)
def test_create_oqhazardlib_source(self): # Define a complete source area_geom = polygon.Polygon([point.Point(10., 10.), point.Point(12., 10.), point.Point(12., 8.), point.Point(10., 8.)]) mfd1 = TruncatedGRMFD(5.0, 8.0, 0.1, 3.0, 1.0) self.area_source = mtkAreaSource( '001', 'A Point Source', trt='Active Shallow Crust', geometry=area_geom, upper_depth=0., lower_depth=20., mag_scale_rel=None, rupt_aspect_ratio=1.0, mfd=mfd1, nodal_plane_dist=None, hypo_depth_dist=None) test_source = self.area_source.create_oqhazardlib_source(TOM, 1.0, 10.0, True) self.assertIsInstance(test_source, AreaSource) self.assertIsInstance(test_source.mfd, TruncatedGRMFD) self.assertAlmostEqual(test_source.mfd.b_val, 1.0) self.assertIsInstance(test_source.nodal_plane_distribution, PMF) self.assertIsInstance(test_source.hypocenter_distribution, PMF) self.assertIsInstance(test_source.magnitude_scaling_relationship, WC1994)
def parse_area_source_node(node, mfd_spacing=0.1): """ Returns an "areaSource" node into an instance of the :class: openquake.hmtk.sources.area.mtkAreaSource """ assert "areaSource" in node.tag area_taglist = get_taglist(node) # Get metadata area_id, name, trt = (node.attrib["id"], node.attrib["name"], node.attrib["tectonicRegion"]) assert area_id # Defensive validation! # Process geometry polygon, upper_depth, lower_depth = node_to_area_geometry( node.nodes[area_taglist.index("areaGeometry")]) # Process scaling relation msr = node_to_scalerel(node.nodes[area_taglist.index("magScaleRel")]) # Process aspect ratio aspect = float_(node.nodes[area_taglist.index("ruptAspectRatio")].text) # Process MFD mfd = node_to_mfd(node, area_taglist) # Process nodal planes npds = node_to_nodal_planes( node.nodes[area_taglist.index("nodalPlaneDist")]) # Process hypocentral depths hdds = node_to_hdd(node.nodes[area_taglist.index("hypoDepthDist")]) return mtkAreaSource(area_id, name, trt, geometry=polygon, upper_depth=upper_depth, lower_depth=lower_depth, mag_scale_rel=msr, rupt_aspect_ratio=aspect, mfd=mfd, nodal_plane_dist=npds, hypo_depth_dist=hdds)
def test_select_events_in_source(self): # Basic test of method to select events from catalogue in polygon self.area_source = mtkAreaSource('101', 'A Source') simple_polygon = polygon.Polygon([ point.Point(2.0, 3.0), point.Point(3.0, 3.0), point.Point(3.0, 2.0), point.Point(2.0, 2.0) ]) self.catalogue.data['eventID'] = np.arange(0, 7, 1) self.catalogue.data['longitude'] = np.arange(1.0, 4.5, 0.5) self.catalogue.data['latitude'] = np.arange(1.0, 4.5, 0.5) self.catalogue.data['depth'] = np.ones(7, dtype=float) # Simple Case - No buffer selector0 = CatalogueSelector(self.catalogue) self.area_source.create_geometry(simple_polygon, 0., 30.) self.area_source.select_catalogue(selector0, 0.) np.testing.assert_array_almost_equal( np.array([2., 2.5, 3.]), self.area_source.catalogue.data['longitude']) np.testing.assert_array_almost_equal( np.array([2., 2.5, 3.]), self.area_source.catalogue.data['latitude']) np.testing.assert_array_almost_equal( np.array([1., 1., 1.]), self.area_source.catalogue.data['depth']) # Simple case - dilated by 200 km (selects all) self.area_source.select_catalogue(selector0, 200.) np.testing.assert_array_almost_equal( np.array([1., 1.5, 2., 2.5, 3., 3.5, 4.0]), self.area_source.catalogue.data['longitude']) np.testing.assert_array_almost_equal( np.array([1., 1.5, 2., 2.5, 3., 3.5, 4.0]), self.area_source.catalogue.data['latitude']) np.testing.assert_array_almost_equal( np.ones(7, dtype=float), self.area_source.catalogue.data['depth']) # Bad case - no events in catalogue self.catalogue = Catalogue() selector0 = CatalogueSelector(self.catalogue) with self.assertRaises(ValueError) as ver: self.area_source.select_catalogue(selector0, 0.0) self.assertEqual(str(ver.exception), 'No events found in catalogue!')
def test_select_events_in_source(self): # Basic test of method to select events from catalogue in polygon self.area_source = mtkAreaSource('101', 'A Source') simple_polygon = polygon.Polygon([point.Point(2.0, 3.0), point.Point(3.0, 3.0), point.Point(3.0, 2.0), point.Point(2.0, 2.0)]) self.catalogue.data['eventID'] = np.arange(0, 7, 1) self.catalogue.data['longitude'] = np.arange(1.0, 4.5, 0.5) self.catalogue.data['latitude'] = np.arange(1.0, 4.5, 0.5) self.catalogue.data['depth'] = np.ones(7, dtype=float) # Simple Case - No buffer selector0 = CatalogueSelector(self.catalogue) self.area_source.create_geometry(simple_polygon, 0., 30.) self.area_source.select_catalogue(selector0, 0.) np.testing.assert_array_almost_equal( np.array([2., 2.5, 3.]), self.area_source.catalogue.data['longitude']) np.testing.assert_array_almost_equal( np.array([2., 2.5, 3.]), self.area_source.catalogue.data['latitude']) np.testing.assert_array_almost_equal( np.array([1., 1., 1.]), self.area_source.catalogue.data['depth']) # Simple case - dilated by 200 km (selects all) self.area_source.select_catalogue(selector0, 200.) np.testing.assert_array_almost_equal( np.array([1., 1.5, 2., 2.5, 3., 3.5, 4.0]), self.area_source.catalogue.data['longitude']) np.testing.assert_array_almost_equal( np.array([1., 1.5, 2., 2.5, 3., 3.5, 4.0]), self.area_source.catalogue.data['latitude']) np.testing.assert_array_almost_equal( np.ones(7, dtype=float), self.area_source.catalogue.data['depth']) # Bad case - no events in catalogue self.catalogue = Catalogue() selector0 = CatalogueSelector(self.catalogue) with self.assertRaises(ValueError) as ver: self.area_source.select_catalogue(selector0, 0.0) self.assertEqual(str(ver.exception), 'No events found in catalogue!')
def src_oqt_to_hmtk(src): return mtkAreaSource(identifier=src.source_id, name=src.name, geometry=src.polygon)
def setUp(self): warnings.simplefilter("ignore") self.catalogue = Catalogue() self.area_source = mtkAreaSource('101', 'A Source')