def test_station_magnitude_contribution(self): """ Tests the station magnitude contribution object. """ filename = os.path.join( self.path, 'quakeml_1.2_stationmagnitudecontributions.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].magnitudes), 1) self.assertEqual( len(catalog[0].magnitudes[0].station_magnitude_contributions), 2) # Check the first stationMagnitudeContribution object. stat_contrib = \ catalog[0].magnitudes[0].station_magnitude_contributions[0] self.assertEqual( stat_contrib.station_magnitude_id.id, "smi:ch.ethz.sed/magnitude/station/881342") self.assertEqual(stat_contrib.weight, 0.77) self.assertEqual(stat_contrib.residual, 0.02) # Check the second stationMagnitudeContribution object. stat_contrib = \ catalog[0].magnitudes[0].station_magnitude_contributions[1] self.assertEqual( stat_contrib.station_magnitude_id.id, "smi:ch.ethz.sed/magnitude/station/881334") self.assertEqual(stat_contrib.weight, 0.) self.assertEqual(stat_contrib.residual, 0.) # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_arrival(self): """ Tests Arrival object. """ filename = os.path.join(self.path, 'quakeml_1.2_arrival.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].origins[0].arrivals), 2) ar = catalog[0].origins[0].arrivals[0] # Test the actual Arrival object. Everything not set in the QuakeML # file should be None. self.assertEqual( ar.pick_id, ResourceIdentifier('smi:ch.ethz.sed/pick/117634')) self.assertEqual(ar.phase, 'Pn') self.assertEqual(ar.azimuth, 12.0) self.assertEqual(ar.distance, 0.5) self.assertEqual(ar.takeoff_angle, 11.0) self.assertEqual(ar.takeoff_angle_errors.uncertainty, 0.2) self.assertEqual(ar.time_residual, 1.6) self.assertEqual(ar.horizontal_slowness_residual, 1.7) self.assertEqual(ar.backazimuth_residual, 1.8) self.assertEqual(ar.time_weight, 0.48) self.assertEqual(ar.horizontal_slowness_weight, 0.49) self.assertEqual(ar.backazimuth_weight, 0.5) self.assertEqual( ar.earth_model_id, ResourceIdentifier('smi:ch.ethz.sed/earthmodel/U21')) self.assertEqual(len(ar.comments), 1) self.assertEqual(ar.creation_info.author, "Erika Mustermann") # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def _write_sc3ml(catalog, filename, validate=False, verbose=False, event_removal=False, **kwargs): # @UnusedVariable """ Write a SC3ML file. Since a XSLT file is used to write the SC3ML file from a QuakeML file, the catalog is first converted in QuakeML. .. warning:: This function should NOT be called directly, it registers via the the :meth:`~obspy.core.event.catalog.Catalog.write` method of an ObsPy :class:`~obspy.core.event.catalog.Catalog` object, call this instead. :type catalog: :class:`~obspy.core.event.catalog.Catalog` :param catalog: The ObsPy Catalog object to write. :type filename: str or file :param filename: Filename to write or open file-like object. :type validate: bool :param validate: If True, the final SC3ML file will be validated against the SC3ML schema file. Raises an AssertionError if the validation fails. :type verbose: bool :param verbose: Print validation error log if True. :type event_deletion: bool :param event_removal: If True, the event elements will be removed. This can be useful to associate origins with scevent when injecting SC3ML file into seiscomp. """ nsmap_ = getattr(catalog, "nsmap", {}) quakeml_doc = Pickler(nsmap=nsmap_).dumps(catalog) xslt_filename = os.path.join(os.path.dirname(__file__), 'data', 'quakeml_1.2__sc3ml_0.8.xsl') transform = etree.XSLT(etree.parse(xslt_filename)) sc3ml_doc = transform(etree.parse(io.BytesIO(quakeml_doc))) # Remove events if event_removal: for event in sc3ml_doc.xpath("//*[local-name()='event']"): event.getparent().remove(event) if validate and not _validate_sc3ml(io.BytesIO(sc3ml_doc), verbose): raise AssertionError("The final SC3ML file did not pass validation.") # Open filehandler or use an existing file like object. if not hasattr(filename, "write"): file_opened = True fh = open(filename, "wb") else: file_opened = False fh = filename try: fh.write(sc3ml_doc) finally: # Close if a file has been opened by this function. if file_opened is True: fh.close()
def test_event(self): """ Tests Event object. """ filename = os.path.join(self.path, 'quakeml_1.2_event.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) event = catalog[0] self.assertEqual( event.resource_id, ResourceIdentifier('smi:ch.ethz.sed/event/historical/1165')) # enums self.assertEqual(event.event_type, 'earthquake') self.assertEqual(event.event_type_certainty, 'suspected') # comments self.assertEqual(len(event.comments), 2) c = event.comments self.assertEqual(c[0].text, 'Relocated after re-evaluation') self.assertEqual(c[0].resource_id, None) self.assertEqual(c[0].creation_info.agency_id, 'EMSC') self.assertEqual(c[1].text, 'Another comment') self.assertEqual( c[1].resource_id, ResourceIdentifier(id="smi:some/comment/id/number_3")) self.assertEqual(c[1].creation_info, None) # event descriptions self.assertEqual(len(event.event_descriptions), 3) d = event.event_descriptions self.assertEqual(d[0].text, '1906 San Francisco Earthquake') self.assertEqual(d[0].type, 'earthquake name') self.assertEqual(d[1].text, 'NEAR EAST COAST OF HONSHU, JAPAN') self.assertEqual(d[1].type, 'Flinn-Engdahl region') self.assertEqual(d[2].text, 'free-form string') self.assertEqual(d[2].type, None) # creation info self.assertEqual(event.creation_info.author, "Erika Mustermann") self.assertEqual(event.creation_info.agency_id, "EMSC") self.assertEqual( event.creation_info.author_uri, ResourceIdentifier("smi:smi-registry/organization/EMSC")) self.assertEqual( event.creation_info.agency_uri, ResourceIdentifier("smi:smi-registry/organization/EMSC")) self.assertEqual( event.creation_info.creation_time, UTCDateTime("2012-04-04T16:40:50+00:00")) self.assertEqual(event.creation_info.version, "1.0.1") # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_magnitude(self): """ Tests Magnitude object. """ filename = os.path.join(self.path, 'quakeml_1.2_magnitude.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].magnitudes), 1) mag = catalog[0].magnitudes[0] self.assertEqual( mag.resource_id, ResourceIdentifier('smi:ch.ethz.sed/magnitude/37465')) self.assertEqual(mag.mag, 5.5) self.assertEqual(mag.mag_errors.uncertainty, 0.1) self.assertEqual(mag.magnitude_type, 'MS') self.assertEqual( mag.method_id, ResourceIdentifier( 'smi:ch.ethz.sed/magnitude/generic/surface_wave_magnitude')) self.assertEqual(mag.station_count, 8) self.assertEqual(mag.evaluation_status, 'preliminary') # comments self.assertEqual(len(mag.comments), 2) c = mag.comments self.assertEqual(c[0].text, 'Some comment') self.assertEqual( c[0].resource_id, ResourceIdentifier(id="smi:some/comment/id/muh")) self.assertEqual(c[0].creation_info.author, 'EMSC') self.assertEqual(c[1].creation_info, None) self.assertEqual(c[1].text, 'Another comment') self.assertEqual(c[1].resource_id, None) # creation info self.assertEqual(mag.creation_info.author, "NEIC") self.assertEqual(mag.creation_info.agency_id, None) self.assertEqual(mag.creation_info.author_uri, None) self.assertEqual(mag.creation_info.agency_uri, None) self.assertEqual(mag.creation_info.creation_time, None) self.assertEqual(mag.creation_info.version, None) # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_data_used_in_moment_tensor(self): """ Tests the data used objects in moment tensors. """ filename = os.path.join(self.path, 'quakeml_1.2_data_used.xml') # Test reading first. catalog = _read_quakeml(filename) event = catalog[0] self.assertTrue(len(event.focal_mechanisms), 2) # First focmec contains only one data used element. self.assertEqual( len(event.focal_mechanisms[0].moment_tensor.data_used), 1) du = event.focal_mechanisms[0].moment_tensor.data_used[0] self.assertEqual(du.wave_type, "body waves") self.assertEqual(du.station_count, 88) self.assertEqual(du.component_count, 166) self.assertEqual(du.shortest_period, 40.0) # Second contains three. focmec contains only one data used element. self.assertEqual( len(event.focal_mechanisms[1].moment_tensor.data_used), 3) du = event.focal_mechanisms[1].moment_tensor.data_used self.assertEqual(du[0].wave_type, "body waves") self.assertEqual(du[0].station_count, 88) self.assertEqual(du[0].component_count, 166) self.assertEqual(du[0].shortest_period, 40.0) self.assertEqual(du[1].wave_type, "surface waves") self.assertEqual(du[1].station_count, 96) self.assertEqual(du[1].component_count, 189) self.assertEqual(du[1].shortest_period, 50.0) self.assertEqual(du[2].wave_type, "mantle waves") self.assertEqual(du[2].station_count, 41) self.assertEqual(du[2].component_count, 52) self.assertEqual(du[2].shortest_period, 125.0) # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_pick(self): """ Tests Pick object. """ filename = os.path.join(self.path, 'quakeml_1.2_pick.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].picks), 2) pick = catalog[0].picks[0] self.assertEqual( pick.resource_id, ResourceIdentifier('smi:ch.ethz.sed/pick/117634')) self.assertEqual(pick.time, UTCDateTime('2005-09-18T22:04:35Z')) self.assertEqual(pick.time_errors.uncertainty, 0.012) self.assertEqual( pick.waveform_id, WaveformStreamID(network_code='BW', station_code='FUR', resource_uri='smi:ch.ethz.sed/waveform/201754')) self.assertEqual( pick.filter_id, ResourceIdentifier('smi:ch.ethz.sed/filter/lowpass/standard')) self.assertEqual( pick.method_id, ResourceIdentifier('smi:ch.ethz.sed/picker/autopicker/6.0.2')) self.assertEqual(pick.backazimuth, 44.0) self.assertEqual(pick.onset, 'impulsive') self.assertEqual(pick.phase_hint, 'Pn') self.assertEqual(pick.polarity, 'positive') self.assertEqual(pick.evaluation_mode, "manual") self.assertEqual(pick.evaluation_status, "confirmed") self.assertEqual(len(pick.comments), 2) self.assertEqual(pick.creation_info.author, "Erika Mustermann") # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_station_magnitude(self): """ Tests StationMagnitude object. """ filename = os.path.join(self.path, 'quakeml_1.2_stationmagnitude.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].station_magnitudes), 1) mag = catalog[0].station_magnitudes[0] # Assert the actual StationMagnitude object. Everything that is not set # in the QuakeML file should be set to None. self.assertEqual( mag.resource_id, ResourceIdentifier("smi:ch.ethz.sed/magnitude/station/881342")) self.assertEqual( mag.origin_id, ResourceIdentifier('smi:some/example/id')) self.assertEqual(mag.mag, 6.5) self.assertEqual(mag.mag_errors.uncertainty, 0.2) self.assertEqual(mag.station_magnitude_type, 'MS') self.assertEqual( mag.amplitude_id, ResourceIdentifier("smi:ch.ethz.sed/amplitude/824315")) self.assertEqual( mag.method_id, ResourceIdentifier( "smi:ch.ethz.sed/magnitude/generic/surface_wave_magnitude")) self.assertEqual( mag.waveform_id, WaveformStreamID(network_code='BW', station_code='FUR', resource_uri="smi:ch.ethz.sed/waveform/201754")) self.assertEqual(mag.creation_info, None) # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_focalmechanism(self): """ Tests FocalMechanism object. """ filename = os.path.join(self.path, 'quakeml_1.2_focalmechanism.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].focal_mechanisms), 2) fm = catalog[0].focal_mechanisms[0] # general self.assertEqual( fm.resource_id, ResourceIdentifier('smi:ISC/fmid=292309')) self.assertEqual(len(fm.waveform_id), 2) self.assertEqual(fm.waveform_id[0].network_code, 'BW') self.assertEqual(fm.waveform_id[0].station_code, 'FUR') self.assertEqual( fm.waveform_id[0].resource_uri, ResourceIdentifier(id="smi:ch.ethz.sed/waveform/201754")) self.assertTrue(isinstance(fm.waveform_id[0], WaveformStreamID)) self.assertEqual( fm.triggering_origin_id, ResourceIdentifier('smi:local/originId=7680412')) self.assertAlmostEqual(fm.azimuthal_gap, 0.123) self.assertEqual(fm.station_polarity_count, 987) self.assertAlmostEqual(fm.misfit, 1.234) self.assertAlmostEqual(fm.station_distribution_ratio, 2.345) self.assertEqual( fm.method_id, ResourceIdentifier('smi:ISC/methodID=Best_double_couple')) # comments self.assertEqual(len(fm.comments), 2) c = fm.comments self.assertEqual(c[0].text, 'Relocated after re-evaluation') self.assertEqual(c[0].resource_id, None) self.assertEqual(c[0].creation_info.agency_id, 'MUH') self.assertEqual(c[1].text, 'Another MUH') self.assertEqual( c[1].resource_id, ResourceIdentifier(id="smi:some/comment/id/number_3")) self.assertEqual(c[1].creation_info, None) # creation info self.assertEqual(fm.creation_info.author, "Erika Mustermann") self.assertEqual(fm.creation_info.agency_id, "MUH") self.assertEqual( fm.creation_info.author_uri, ResourceIdentifier("smi:smi-registry/organization/MUH")) self.assertEqual( fm.creation_info.agency_uri, ResourceIdentifier("smi:smi-registry/organization/MUH")) self.assertEqual( fm.creation_info.creation_time, UTCDateTime("2012-04-04T16:40:50+00:00")) self.assertEqual(fm.creation_info.version, "1.0.1") # nodalPlanes self.assertAlmostEqual(fm.nodal_planes.nodal_plane_1.strike, 346.0) self.assertAlmostEqual(fm.nodal_planes.nodal_plane_1.dip, 57.0) self.assertAlmostEqual(fm.nodal_planes.nodal_plane_1.rake, 75.0) self.assertAlmostEqual(fm.nodal_planes.nodal_plane_2.strike, 193.0) self.assertAlmostEqual(fm.nodal_planes.nodal_plane_2.dip, 36.0) self.assertAlmostEqual(fm.nodal_planes.nodal_plane_2.rake, 112.0) self.assertEqual(fm.nodal_planes.preferred_plane, 2) # principalAxes self.assertAlmostEqual(fm.principal_axes.t_axis.azimuth, 216.0) self.assertAlmostEqual(fm.principal_axes.t_axis.plunge, 73.0) self.assertAlmostEqual(fm.principal_axes.t_axis.length, 1.050e+18) self.assertAlmostEqual(fm.principal_axes.p_axis.azimuth, 86.0) self.assertAlmostEqual(fm.principal_axes.p_axis.plunge, 10.0) self.assertAlmostEqual(fm.principal_axes.p_axis.length, -1.180e+18) self.assertEqual(fm.principal_axes.n_axis.azimuth, None) self.assertEqual(fm.principal_axes.n_axis.plunge, None) self.assertEqual(fm.principal_axes.n_axis.length, None) # momentTensor mt = fm.moment_tensor self.assertEqual( mt.resource_id, ResourceIdentifier('smi:ISC/mtid=123321')) self.assertEqual( mt.derived_origin_id, ResourceIdentifier('smi:ISC/origid=13145006')) self.assertAlmostEqual(mt.scalar_moment, 1.100e+18) self.assertAlmostEqual(mt.tensor.m_rr, 9.300e+17) self.assertAlmostEqual(mt.tensor.m_tt, 1.700e+17) self.assertAlmostEqual(mt.tensor.m_pp, -1.100e+18) self.assertAlmostEqual(mt.tensor.m_rt, -2.200e+17) self.assertAlmostEqual(mt.tensor.m_rp, 4.000e+17) self.assertAlmostEqual(mt.tensor.m_tp, 3.000e+16) self.assertAlmostEqual(mt.clvd, 0.22) # exporting back to XML should result in the same document with open(filename, "rb") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)
def test_origin(self): """ Tests Origin object. """ filename = os.path.join(self.path, 'quakeml_1.2_origin.xml') catalog = _read_quakeml(filename) self.assertEqual(len(catalog), 1) self.assertEqual(len(catalog[0].origins), 1) origin = catalog[0].origins[0] self.assertEqual( origin.resource_id, ResourceIdentifier( 'smi:www.iris.edu/ws/event/query?originId=7680412')) self.assertEqual(origin.time, UTCDateTime("2011-03-11T05:46:24.1200")) self.assertEqual(origin.latitude, 38.297) self.assertEqual(origin.latitude_errors.lower_uncertainty, None) self.assertEqual(origin.longitude, 142.373) self.assertEqual(origin.longitude_errors.uncertainty, None) self.assertEqual(origin.depth, 29.0) self.assertEqual(origin.depth_errors.confidence_level, 50.0) self.assertEqual(origin.depth_type, "from location") self.assertEqual( origin.method_id, ResourceIdentifier(id="smi:some/method/NA")) self.assertEqual(origin.time_fixed, None) self.assertEqual(origin.epicenter_fixed, False) self.assertEqual( origin.reference_system_id, ResourceIdentifier(id="smi:some/reference/muh")) self.assertEqual( origin.earth_model_id, ResourceIdentifier(id="smi:same/model/maeh")) self.assertEqual(origin.region, 'Kalamazoo') self.assertEqual(origin.evaluation_mode, "manual") self.assertEqual(origin.evaluation_status, "preliminary") self.assertEqual(origin.origin_type, "hypocenter") # composite times self.assertEqual(len(origin.composite_times), 2) c = origin.composite_times self.assertEqual(c[0].year, 2029) self.assertEqual(c[0].month, None) self.assertEqual(c[0].day, None) self.assertEqual(c[0].hour, 12) self.assertEqual(c[0].minute, None) self.assertEqual(c[0].second, None) self.assertEqual(c[1].year, None) self.assertEqual(c[1].month, None) self.assertEqual(c[1].day, None) self.assertEqual(c[1].hour, 1) self.assertEqual(c[1].minute, None) self.assertEqual(c[1].second, 29.124234) # quality self.assertEqual(origin.quality.used_station_count, 16) self.assertEqual(origin.quality.standard_error, 0) self.assertEqual(origin.quality.azimuthal_gap, 231) self.assertEqual(origin.quality.maximum_distance, 53.03) self.assertEqual(origin.quality.minimum_distance, 2.45) self.assertEqual(origin.quality.associated_phase_count, None) self.assertEqual(origin.quality.associated_station_count, None) self.assertEqual(origin.quality.depth_phase_count, None) self.assertEqual(origin.quality.secondary_azimuthal_gap, None) self.assertEqual(origin.quality.ground_truth_level, None) self.assertEqual(origin.quality.median_distance, None) # comments self.assertEqual(len(origin.comments), 2) c = origin.comments self.assertEqual(c[0].text, 'Some comment') self.assertEqual( c[0].resource_id, ResourceIdentifier(id="smi:some/comment/reference")) self.assertEqual(c[0].creation_info.author, 'EMSC') self.assertEqual(c[1].resource_id, None) self.assertEqual(c[1].creation_info, None) self.assertEqual(c[1].text, 'Another comment') # creation info self.assertEqual(origin.creation_info.author, "NEIC") self.assertEqual(origin.creation_info.agency_id, None) self.assertEqual(origin.creation_info.author_uri, None) self.assertEqual(origin.creation_info.agency_uri, None) self.assertEqual(origin.creation_info.creation_time, None) self.assertEqual(origin.creation_info.version, None) # origin uncertainty u = origin.origin_uncertainty self.assertEqual(u.preferred_description, "uncertainty ellipse") self.assertEqual(u.horizontal_uncertainty, 9000) self.assertEqual(u.min_horizontal_uncertainty, 6000) self.assertEqual(u.max_horizontal_uncertainty, 10000) self.assertEqual(u.azimuth_max_horizontal_uncertainty, 80.0) # confidence ellipsoid c = u.confidence_ellipsoid self.assertEqual(c.semi_intermediate_axis_length, 2.123) self.assertEqual(c.major_axis_rotation, 5.123) self.assertEqual(c.major_axis_plunge, 3.123) self.assertEqual(c.semi_minor_axis_length, 1.123) self.assertEqual(c.semi_major_axis_length, 0.123) self.assertEqual(c.major_axis_azimuth, 4.123) # exporting back to XML should result in the same document with open(filename, "rt") as fp: original = fp.read() processed = Pickler().dumps(catalog) compare_xml_strings(original, processed)