def get_mag_from_obs(obs): """Convert a stream to magnetic coordinate system. Parameters ---------- obs : obspy.core.Stream stream containing observatory components H, D or E, Z, and F. Returns ------- obspy.core.Stream new stream object containing magnetic components H, D, Z, and F. """ h = obs.select(channel='H')[0] e = __get_obs_e_from_obs(obs) z = obs.select(channel='Z')[0] f = obs.select(channel='F')[0] obs_h = h.data obs_e = e.data d0 = ChannelConverter.get_radians_from_minutes( numpy.float64(e.stats.declination_base) / 10) (mag_h, mag_d) = ChannelConverter.get_mag_from_obs(obs_h, obs_e, d0) return obspy.core.Stream(( __get_trace('H', h.stats, mag_h), __get_trace('D', e.stats, mag_d), z, f))
def get_obs_from_mag(mag, include_d=False): """Convert a stream to magnetic observatory coordinate system. Parameters ---------- stream: obspy.core.Stream stream containing magnetic components H, D, Z, and F. include_d: boolean whether to also include the observatory D component Returns ------- obspy.core.Stream new stream object containing observatory components H, D, E, Z, and F """ h = mag.select(channel='H')[0] d = mag.select(channel='D')[0] z = mag.select(channel='Z')[0] f = mag.select(channel='F')[0] mag_h = h.data mag_d = d.data d0 = ChannelConverter.get_radians_from_minutes( numpy.float64(d.stats.declination_base) / 10) (obs_h, obs_e) = ChannelConverter.get_obs_from_mag(mag_h, mag_d, d0) traces = ( __get_trace('H', h.stats, obs_h), __get_trace('E', d.stats, obs_e), z, f) if include_d: obs_d = ChannelConverter.get_obs_d_from_obs(obs_h, obs_e) traces = traces + (__get_trace('D', d.stats, obs_d),) return obspy.core.Stream(traces)
def get_obs_from_mag(mag, include_d=False): """Convert a stream to magnetic observatory coordinate system. Parameters ---------- stream: obspy.core.Stream stream containing magnetic components H, D, Z, and F. include_d: boolean whether to also include the observatory D component Returns ------- obspy.core.Stream new stream object containing observatory components H, D, E, Z, and F """ h = mag.select(channel='H')[0] d = mag.select(channel='D')[0] z = mag.select(channel='Z')[0] f = mag.select(channel='F')[0] mag_h = h.data mag_d = d.data d0 = ChannelConverter.get_radians_from_minutes( numpy.float64(d.stats.declination_base) / 10) (obs_h, obs_e) = ChannelConverter.get_obs_from_mag(mag_h, mag_d, d0) traces = (__get_trace('H', h.stats, obs_h), __get_trace('E', d.stats, obs_e), z, f) if include_d: obs_d = ChannelConverter.get_obs_d_from_obs(obs_h, obs_e) traces = traces + (__get_trace('D', d.stats, obs_d), ) return obspy.core.Stream(traces)
def get_mag_from_obs(obs): """Convert a stream to magnetic coordinate system. Parameters ---------- obs : obspy.core.Stream stream containing observatory components H, D or E, Z, and F. Returns ------- obspy.core.Stream new stream object containing magnetic components H, D, Z, and F. """ h = obs.select(channel='H')[0] e = __get_obs_e_from_obs(obs) z = obs.select(channel='Z')[0] f = obs.select(channel='F')[0] obs_h = h.data obs_e = e.data d0 = ChannelConverter.get_radians_from_minutes( numpy.float64(e.stats.declination_base) / 10) (mag_h, mag_d) = ChannelConverter.get_mag_from_obs(obs_h, obs_e, d0) return obspy.core.Stream( (__get_trace('H', h.stats, mag_h), __get_trace('D', e.stats, mag_d), z, f))
def test_get_radians_from_minutes(self): """geomag.ChannelConverterTest.test_get_radian_from_decimal() Call get_radian_from_decimal using 45 degrees, expect r to be pi/4 """ minutes = 45 * 60 radians = channel.get_radians_from_minutes(minutes) assert_almost_equal(radians, math.pi / 4.0, 8, 'Expect radians to be pi/4', True)
def test_verification_data(): """ This is a verification test of data done with different converters, to see if the same result is returned. Since the small angle approximation was used in the other converters, AND round off was done differently, we can't get the exact results. Change the precision in assert_almost_equal to larger precision (ie 2 to 8) to see how off the data is. Most are well within expectations. """ DECBAS = 552.7 obs_v = obspy.core.Stream() obs_v += __create_trace( 'H', [20889.55, 20889.57, 20889.74, 20889.86, 20889.91, 20889.81], DECBAS) obs_v += __create_trace('E', [-21.10, -20.89, -20.72, -20.57, -20.39, -20.12], DECBAS) obs_v += __create_trace( 'Z', [47565.29, 47565.34, 47565.39, 47565.45, 47565.51, 47565.54], DECBAS) obs_v += __create_trace( 'F', [52485.77, 52485.84, 52485.94, 52486.06, 52486.11, 52486.10], DECBAS) obs_V = StreamConverter.get_obs_from_obs(obs_v, True, True) d = obs_V.select(channel='D')[0].data d = ChannelConverter.get_minutes_from_radians(d) # Using d values calculated using small angle approximation. assert_almost_equal( d, [-3.47, -3.43, -3.40, -3.38, -3.35, -3.31], 2, 'Expect d to equal [-3.47, -3.43, -3.40, -3.38, -3.35, -3.31]', True) mag = obspy.core.Stream() DECBAS = 552.7 mag += __create_trace( 'H', [20884.04, 20883.45, 20883.38, 20883.43, 20883.07, 20882.76], DECBAS) d = ChannelConverter.get_radians_from_minutes( [556.51, 556.52, 556.56, 556.61, 556.65, 556.64]) mag += __create_trace('D', d, DECBAS) mag += __create_trace( 'Z', [48546.90, 48546.80, 48546.80, 48546.70, 48546.80, 48546.90], DECBAS) mag += __create_trace('F', [0.10, 0.00, 0.10, 0.00, 0.00, 0.00, 0.00], DECBAS) geo = StreamConverter.get_geo_from_mag(mag) X = geo.select(channel='X')[0].data Y = geo.select(channel='Y')[0].data assert_almost_equal( X, [20611.00, 20610.40, 20610.30, 20610.30, 20609.90, 20609.60], 2) assert_almost_equal(Y, [3366.00, 3366.00, 3366.20, 3366.50, 3366.70, 3366.60], 1)
def test_verification_data(): """ This is a verification test of data done with different converters, to see if the same result is returned. Since the small angle approximation was used in the other converters, AND round off was done differently, we can't get the exact results. Change the precision in assert_almost_equal to larger precision (ie 2 to 8) to see how off the data is. Most are well within expectations. """ DECBAS = 552.7 obs_v = obspy.core.Stream() obs_v += __create_trace('H', [20889.55, 20889.57, 20889.74, 20889.86, 20889.91, 20889.81], DECBAS) obs_v += __create_trace('E', [-21.10, -20.89, -20.72, -20.57, -20.39, -20.12], DECBAS) obs_v += __create_trace('Z', [47565.29, 47565.34, 47565.39, 47565.45, 47565.51, 47565.54], DECBAS) obs_v += __create_trace('F', [52485.77, 52485.84, 52485.94, 52486.06, 52486.11, 52486.10], DECBAS) obs_V = StreamConverter.get_obs_from_obs(obs_v, True, True) d = obs_V.select(channel='D')[0].data d = ChannelConverter.get_minutes_from_radians(d) # Using d values calculated using small angle approximation. assert_almost_equal(d, [-3.47, -3.43, -3.40, -3.38, -3.35, -3.31], 2, 'Expect d to equal [-3.47, -3.43, -3.40, -3.38, -3.35, -3.31]', True) mag = obspy.core.Stream() DECBAS = 552.7 mag += __create_trace('H', [20884.04, 20883.45, 20883.38, 20883.43, 20883.07, 20882.76], DECBAS) d = ChannelConverter.get_radians_from_minutes( [556.51, 556.52, 556.56, 556.61, 556.65, 556.64]) mag += __create_trace('D', d, DECBAS) mag += __create_trace('Z', [48546.90, 48546.80, 48546.80, 48546.70, 48546.80, 48546.90], DECBAS) mag += __create_trace('F', [0.10, 0.00, 0.10, 0.00, 0.00, 0.00, 0.00], DECBAS) geo = StreamConverter.get_geo_from_mag(mag) X = geo.select(channel='X')[0].data Y = geo.select(channel='Y')[0].data assert_almost_equal(X, [20611.00, 20610.40, 20610.30, 20610.30, 20609.90, 20609.60], 2) assert_almost_equal(Y, [3366.00, 3366.00, 3366.20, 3366.50, 3366.70, 3366.60], 1)