def get_peak_spectrals(data, samp_rate,periods): """Calculate peak pseudo-spectral parameters. Compute 5% damped PSA at input periods seconds. Data must be an acceleration Trace. :param data: Obspy Trace object, containing acceleration data to convolve with pendulum at freq. :param delta: sample rate (samples per sec). :returns: Dictionary containing keys of input periods, and values of corresponding spectral accelerations. """ D = 0.05 # 5% damping psadict = {} for T in periods: freq = 1.0 / T omega = (2 * 3.14159 * freq) ** 2 paz_sa = corn_freq_2_paz(freq, damp=D) paz_sa['sensitivity'] = omega paz_sa['zeros'] = [] dd = simulate_seismometer(data.data, samp_rate, paz_remove=None, paz_simulate=paz_sa, taper=True, simulate_sensitivity=True, taper_fraction=0.05) if abs(max(dd)) >= abs(min(dd)): psa = abs(max(dd)) else: psa = abs(min(dd)) psadict[T] = psa return psadict
def calculate_damped_spectral_acc(data, delta, freq, damp, ty): samp_rate = 1.0 / delta t = freq * 1.0 d = damp omega = (2 * math.pi * t)**2 paz_sa = corn_freq_2_paz(t, damp=d) paz_sa['sensitivity'] = omega paz_sa['zeros'] = [] if ty == 'displacement': data = np.gradient(data, delta) data = np.gradient(data, delta) elif ty == 'velocity': data = np.gradient(data, delta) data = simulate_seismometer(data, samp_rate, paz_remove=None, paz_simulate=paz_sa, taper=True, simulate_sensitivity=True, taper_fraction=0.05) return data
def geophone_response(resonance_frequency, gain, damping=0.707, output_resistance=np.inf, cable_length=np.inf, cable_capacitance=np.inf, sensitivity=1, stage_sequence_number=1): paz = corn_freq_2_paz(resonance_frequency, damp=damping) l = cable_length R = output_resistance C = cable_capacitance if ((R * l * C) != np.inf) and ((R * l * C) != 0): pole_cable = -1 / (R * l * C) paz['poles'].append(pole_cable) i_s = InstrumentSensitivity(sensitivity, resonance_frequency, input_units='M/S', output_units='M/S', input_units_description='velocity', output_units_description='velocity') pzr = PolesZerosResponseStage(stage_sequence_number, gain, resonance_frequency, 'M/S', 'M/S', 'LAPLACE (RADIANT/SECOND)', resonance_frequency, paz['zeros'], paz['poles']) return Response(instrument_sensitivity=i_s, response_stages=[pzr])
def _remove_node_response(st) -> obspy.Stream: """using the fairfield files, remove the response through deconvolution""" stt = st.copy() paz_5hz = corn_freq_2_paz(5.0, damp=0.707) paz_5hz["sensitivity"] = 76700 pre_filt = (0.25, 0.5, 180.0, 200.0) stt.simulate(paz_remove=paz_5hz, pre_filt=pre_filt) return stt
def _get_beamforming_example_stream(): # Load data from obspy import read from obspy.core.util import AttribDict from obspy.signal.invsim import corn_freq_2_paz st = read("https://examples.obspy.org/agfa.mseed") # Set PAZ and coordinates for all 5 channels st[0].stats.paz = AttribDict({ 'poles': [(-0.03736 - 0.03617j), (-0.03736 + 0.03617j)], 'zeros': [0j, 0j], 'sensitivity': 205479446.68601453, 'gain': 1.0}) st[0].stats.coordinates = AttribDict({ 'latitude': 48.108589, 'elevation': 0.450000, 'longitude': 11.582967}) st[1].stats.paz = AttribDict({ 'poles': [(-0.03736 - 0.03617j), (-0.03736 + 0.03617j)], 'zeros': [0j, 0j], 'sensitivity': 205479446.68601453, 'gain': 1.0}) st[1].stats.coordinates = AttribDict({ 'latitude': 48.108192, 'elevation': 0.450000, 'longitude': 11.583120}) st[2].stats.paz = AttribDict({ 'poles': [(-0.03736 - 0.03617j), (-0.03736 + 0.03617j)], 'zeros': [0j, 0j], 'sensitivity': 250000000.0, 'gain': 1.0}) st[2].stats.coordinates = AttribDict({ 'latitude': 48.108692, 'elevation': 0.450000, 'longitude': 11.583414}) st[3].stats.paz = AttribDict({ 'poles': [(-4.39823 + 4.48709j), (-4.39823 - 4.48709j)], 'zeros': [0j, 0j], 'sensitivity': 222222228.10910088, 'gain': 1.0}) st[3].stats.coordinates = AttribDict({ 'latitude': 48.108456, 'elevation': 0.450000, 'longitude': 11.583049}) st[4].stats.paz = AttribDict({ 'poles': [(-4.39823 + 4.48709j), (-4.39823 - 4.48709j), (-2.105 + 0j)], 'zeros': [0j, 0j, 0j], 'sensitivity': 222222228.10910088, 'gain': 1.0}) st[4].stats.coordinates = AttribDict({ 'latitude': 48.108730, 'elevation': 0.450000, 'longitude': 11.583157}) # Instrument correction to 1Hz corner frequency paz1hz = corn_freq_2_paz(1.0, damp=0.707) st.simulate(paz_remove='self', paz_simulate=paz1hz) return st
def resi(x, debug = True): h=x[1] if debug: print('Here is h: ' + str(h)) f=x[0] if debug: print('Here is f: ' + str(f)) pazTEMP = corn_freq_2_paz(f,h) stTemp = st.copy() pazTEMP['sensitivity'] = x[2] stTemp[0].simulate(paz_remove=pazTEMP) stTemp[1].simulate(paz_remove=paz) stTemp.filter('highpass',freq=1./30.) comp = sum(np.abs(stTemp[0].data - stTemp[1].data)**2) if debug: print('Here is the residual: ' + str(comp)) return comp
def get_params(): # Get Configuration params = {} ###################### # params for BINFILE # ###################### params['stations'] = model.load_stations('stationsBO.txt') # params['receivers'] = model.load_stations('receivers.txt') params['WORKDIR'] = os.getcwd() params['downsampling'] = False#True params['df'] = 20. params['dt'] = 1./params['df'] params['bin_duration'] = (3600.*24)#/4 params['percentfill'] = 10 params['freqmax'] = 9.8 params['freqmin'] = 0.01 params['stop'] = 0 # important param but default = 0 params['sizeout'] = 415 #size of the output matrix (sizein - stop) ################### # params for CORR # ################### params['rotation'] = False params['corrType'] = 'crosscoherence' params['analysis_duration'] = (3600.*24)#/24 # how much time to process as bunch. must stay like that not implemented to change now params['temp_norm'] = 0 # 0: removing eq with param 'clipping'; -1: 1-bit normalization; 1: Windsorinzing with param 'clipping' params['clipping'] = 3. # clipping eq or windsorizing at 3 * std(trace) params['overlap'] = 0.4 params['corr_duration'] = 250. # slicing the 86400 in small windows params['npts'] = params['corr_duration'] * params['df'] params['nthreads'] = 12 params['outname'] = 'BO.BO' #net1.net2 ################## # params for PAZ # ################## #"""/!\ hard coded in CorrelBinSingle.py. Sta a or sta b""" paz =corn_freq_2_paz(15.0, damp=0.57) #paz['sensitivity']=(76*16/16)/5.9605e-7 params['paz'] = paz params['pre_filt'] = (0.05, 0.055, 9.0, 9.5) return params
def accelerometer_response(resonance_frequency, gain, sensitivity=1, stage_sequence_number=1, damping=0.707): i_s = InstrumentSensitivity(sensitivity, resonance_frequency, input_units='M/S/S', output_units='M/S/S', input_units_description='acceleration', output_units_description='acceleration') paz = corn_freq_2_paz(resonance_frequency, damp=damping) paz['zeros'] = [] pzr = PolesZerosResponseStage(1, 1, 14, 'M/S/S', 'M/S', 'LAPLACE (RADIANT/SECOND)', 1, [], paz['poles']) return Response(instrument_sensitivity=i_s, response_stages=[pzr])
def get_peak_spectrals(data, samp_rate, periods): """Calculate peak pseudo-spectral parameters. Compute 5% damped PSA at input periods seconds. Data must be an acceleration Trace. :param data: Obspy Trace object, containing acceleration data to convolve with pendulum at freq. :param delta: sample rate (samples per sec). :returns: Dictionary containing keys of input periods, and values of corresponding spectral accelerations. """ D = 0.05 # 5% damping psadict = {} for T in periods: freq = 1.0 / T omega = (2 * 3.14159 * freq)**2 paz_sa = corn_freq_2_paz(freq, damp=D) paz_sa['sensitivity'] = omega paz_sa['zeros'] = [] dd = simulate_seismometer(data.data, samp_rate, paz_remove=None, paz_simulate=paz_sa, taper=True, simulate_sensitivity=True, taper_fraction=0.05) if abs(max(dd)) >= abs(min(dd)): psa = abs(max(dd)) else: psa = abs(min(dd)) psadict[T] = psa return psadict
import sys, glob import numpy as np from obspy import Trace, read, read_inventory # from pylab import * #import matplotlib.pyplot as plt import math, os import nnobspy from pyrocko import model from obspy.signal.invsim import corn_freq_2_paz oridir = '/data/beroza/liuxin/NLphase2/' bindir = 'bins/full/' f_prefilt=(0.02, 0.025, 9.5, 10.0) resamp=20 nt = int(86400*resamp) paz = corn_freq_2_paz(5.0, damp=0.67) paz['sensitivity'] = 89.4 #respdir = '../responses' #inv = read_inventory('inv.xml') #kjd # ------------------------------------------------------------------------------ # Main def Process(arg_list): # ------------------------------------------------------------ # parameters stations = model.load_stations('stationsBO.txt') sday = int(arg_list[0]) eday = int(arg_list[1]) comp = arg_list[2] iyear = int(arg_list[3])
import matplotlib.pyplot as plt import obspy from obspy.clients.arclink import Client from obspy.signal.invsim import corn_freq_2_paz, simulate_seismometer # Retrieve data via ArcLink # please provide a valid email address for the keyword user client = Client(user="******") t = obspy.UTCDateTime("2009-08-24 00:20:03") st = client.get_waveforms('BW', 'RJOB', '', 'EHZ', t, t + 30) paz = client.get_paz('BW', 'RJOB', '', 'EHZ', t) # 1Hz instrument one_hertz = corn_freq_2_paz(1.0) # Correct for frequency response of the instrument res = simulate_seismometer(st[0].data.astype('float32'), st[0].stats.sampling_rate, paz, inst_sim=one_hertz) # Correct for overall sensitivity res = res / paz['sensitivity'] # Plot the seismograms sec = np.arange(len(res)) / st[0].stats.sampling_rate plt.subplot(211) plt.plot(sec, st[0].data, 'k') plt.title("%s %s" % (st[0].stats.station, t)) plt.ylabel('STS-2') plt.subplot(212) plt.plot(sec, res, 'k') plt.xlabel('Time [s]')
import obspy from obspy.signal.invsim import corn_freq_2_paz paz_sts2 = { 'poles': [-0.037004 + 0.037016j, -0.037004 - 0.037016j, -251.33 + 0j, - 131.04 - 467.29j, -131.04 + 467.29j], 'zeros': [0j, 0j], 'gain': 60077000.0, 'sensitivity': 2516778400.0} paz_1hz = corn_freq_2_paz(1.0, damp=0.707) # 1Hz instrument paz_1hz['sensitivity'] = 1.0 st = obspy.read() # make a copy to keep our original data st_orig = st.copy() # Simulate instrument given poles, zeros and gain of # the original and desired instrument st.simulate(paz_remove=paz_sts2, paz_simulate=paz_1hz) # plot original and simulated data st_orig.plot() st.plot()
hs = [] sens = [] for sta in stas: f = open('Results_Swept_Sine' + sta, 'r') for line in f: line = line.split(',') fs.append(float(line[4])) hs.append(float(line[5])) sens.append(float(line[6])) chans.append(line[0]) f.close() #####################################################Make mean for triple in zip(fs, hs, sens): paz = corn_freq_2_paz(triple[0], triple[1]) h, f = paz_to_freq_resp(paz['poles'], paz['zeros'], 1., 1. / 1000., 2**14, True) h *= triple[2] if 'hmean' not in vars(): hmean = h else: hmean += h hmean *= 1. / 9. fig = plt.figure(1, figsize=(12, 12)) ax = fig.add_subplot(111) plt.subplots_adjust(hspace=0.001) for idx, quad in enumerate(zip(chans, fs, hs, sens)): if quad[0] == 'HHZ':
return comp f = 1. /(2.*np.pi / abs(pazTest['poles'][0])) h = abs(pazTest['poles'][0].real)/abs(pazTest['poles'][0]) sen = 75900. pazTest['sensitivity'] = sen x = np.array([f, h, sen]) bf = fmin_bfgs(resi,x) #else: #bf= x pazNEW = corn_freq_2_paz(bf[0],bf[1]) pazNEW['sensitivity'] = bf[2] stTemp = st.copy() st[0].simulate(paz_remove=pazNEW) st[1].simulate(paz_remove=paz) stTemp[0].simulate(paz_remove=pazTest) st.filter('highpass',freq=1./30.) stTemp.filter('highpass',freq=1./30.) rat = st[0].std()/st[1].std() print('Here is the ratio of ' + sta + ' ' + chan + ' : ' + str(rat)) ffile.write(chan + ', ' + str(f) + ', ' + str(h) + ', ' + str(sen) + ', ' + str(bf[0]) + ', ' + str(bf[1]) + ', ' + str(bf[2]) + ', ' + str(rat) + ', ' + str(resi(x)) +', ' + str(resi(bf)) + '\n') index, value = xcorr(st[0],st[1], 300)
def peak_ground_motion(data, delta, freq, damp=0.1): """ Peak ground motion parameters Compute the maximal displacement, velocity, acceleration and the peak ground acceleration at a certain frequency (standard frequencies for ShakeMaps are 0.3/1.0/3.0 Hz). Data must be displacement :type data: :class:`~numpy.ndarray` :param data: Data in displacement to convolve with pendulum at freq. :type delta: float :param delta: Sampling interval :type freq: float :param freq: Frequency in Hz. :type damp: float :param damp: damping factor. Default is set to 0.1 :rtype: (float, float, float, float) :return: Peak Ground Acceleration, maximal displacement, velocity, acceleration """ data = data.copy() # Displacement if abs(max(data)) >= abs(min(data)): m_dis = abs(max(data)) else: m_dis = abs(min(data)) # Velocity data = np.gradient(data, delta) if abs(max(data)) >= abs(min(data)): m_vel = abs(max(data)) else: m_vel = abs(min(data)) # Acceleration data = np.gradient(data, delta) if abs(max(data)) >= abs(min(data)): m_acc = abs(max(data)) else: m_acc = abs(min(data)) samp_rate = 1.0 / delta t = freq * 1.0 d = damp omega = (2 * 3.14159 * t)**2 paz_sa = corn_freq_2_paz(t, damp=d) paz_sa['sensitivity'] = omega paz_sa['zeros'] = [] data = simulate_seismometer(data, samp_rate, paz_remove=None, paz_simulate=paz_sa, taper=True, simulate_sensitivity=True, taper_fraction=0.05) if abs(max(data)) >= abs(min(data)): pga = abs(max(data)) else: pga = abs(min(data)) return (pga, m_dis, m_vel, m_acc)
sens.append(float(line[6])) chans.append(line[0]) f.close() fig = plt.figure(1, figsize=(12, 12)) plt.subplots_adjust(hspace=0.001) for idx, quad in enumerate(zip(chans, fs, hs, sens)): if quad[0] == 'HHZ': color = 'C0' elif quad[0] == 'HHN': color = 'C1' else: color = 'C2' print(quad[1]) print(quad[2]) paz = corn_freq_2_paz(quad[1], quad[2]) h, f = paz_to_freq_resp(paz['poles'], paz['zeros'], 1., 1. / 1000., 2**14, True) h *= quad[3] plt.subplot(2, 1, 1) if idx < 3: plt.loglog(f, np.abs(h), c=color, label=quad[0]) else: plt.loglog(f, np.abs(h), c=color) plt.text(.11, .5 * 10**5, 'A)', fontsize=24) plt.xlim((.1, 100.)) plt.xticks([]) plt.legend(loc=4) plt.ylabel('Amplitude (Counts/m/s)') plt.subplot(2, 1, 2)
from obspy.signal.cross_correlation import templates_max_similarity from pprint import pprint import matplotlib.pyplot as plt from obspy.signal.invsim import corn_freq_2_paz from eqcorrscan.core.template_gen import multi_template_gen from obspy.core.event import read_events from eqcorrscan.utils import pre_processing from obspy.signal.invsim import corn_freq_2_paz paz = { 'sensitivity': 1258650000.0, 'poles': [-0.074 + 0.074j, -0.074 - 0.074j, -222 + 222j, -222 - 222j], 'gain': 98570.0, 'zeros': [0j, 0j] } paz_1hz = corn_freq_2_paz(1.0, damp=0.707) # 1Hz instrument paz_1hz['sensitivity'] = 1.0 catalog = read_events('ludian.xml') for e in catalog: picks = e.picks for p in picks: print(p) ynst = read("2014080316.YN.mseed").sort(['starttime']).trim() st = ynst.select(station='ZAT') # st += ynst.select(station='QIJ') # st += ynst.select(station='PGE') # st += ynst.select(station='DOC') # st += ynst.select(station='XUW')
def peak_ground_motion(data, delta, freq, damp=0.1): """ Peak ground motion parameters Compute the maximal displacement, velocity, acceleration and the peak ground acceleration at a certain frequency (standard frequencies for ShakeMaps are 0.3/1.0/3.0 Hz). Data must be displacement :type data: :class:`~numpy.ndarray` :param data: Data in displacement to convolve with pendulum at freq. :type delta: float :param delta: Sampling interval :type freq: float :param freq: Frequency in Hz. :type damp: float :param damp: damping factor. Default is set to 0.1 :rtype: (float, float, float, float) :return: Peak Ground Acceleration, maximal displacement, velocity, acceleration """ data = data.copy() # Displacement if abs(max(data)) >= abs(min(data)): m_dis = abs(max(data)) else: m_dis = abs(min(data)) # Velocity data = np.gradient(data, delta) if abs(max(data)) >= abs(min(data)): m_vel = abs(max(data)) else: m_vel = abs(min(data)) # Acceleration data = np.gradient(data, delta) if abs(max(data)) >= abs(min(data)): m_acc = abs(max(data)) else: m_acc = abs(min(data)) samp_rate = 1.0 / delta T = freq * 1.0 D = damp omega = (2 * 3.14159 * T) ** 2 paz_sa = corn_freq_2_paz(T, damp=D) paz_sa['sensitivity'] = omega paz_sa['zeros'] = [] data = simulate_seismometer(data, samp_rate, paz_remove=None, paz_simulate=paz_sa, taper=True, simulate_sensitivity=True, taper_fraction=0.05) if abs(max(data)) >= abs(min(data)): pga = abs(max(data)) else: pga = abs(min(data)) return (pga, m_dis, m_vel, m_acc)
st[4].stats.paz = AttribDict({ 'poles': [(-4.39823 + 4.48709j), (-4.39823 - 4.48709j), (-2.105 + 0j)], 'zeros': [0j, 0j, 0j], 'sensitivity': 222222228.10910088, 'gain': 1.0 }) st[4].stats.coordinates = AttribDict({ 'latitude': 48.108730, 'elevation': 0.450000, 'longitude': 11.583157 }) # Instrument correction to 1Hz corner frequency paz1hz = corn_freq_2_paz(1.0, damp=0.707) st.simulate(paz_remove='self', paz_simulate=paz1hz) # Execute array_processing kwargs = dict( # slowness grid: X min, X max, Y min, Y max, Slow Step sll_x=-3.0, slm_x=3.0, sll_y=-3.0, slm_y=3.0, sl_s=0.03, # sliding window properties win_len=1.0, win_frac=0.05, # frequency properties frqlow=1.0,
#files = glob.glob('okdata/' + sta +'/*/*/*' + chan + '*.seed') #st= Stream() #for idx, curfile in enumerate(files): #print('On ' + str(idx+1) + ' of ' + str(len(files))) #st= read(curfile) #if idx == 0: #ppsd = PPSD(st[0].stats, paz) #ppsd.add(st) #ppsd.save_npz(st[0].id + 'PDF.npz') debug = True string = 'newdata/output_raw/2017/XX/FF' pazNEW = corn_freq_2_paz(4.9, .96) pazNEW['sensitivity'] = 75900. chans = ['HHZ', 'HHE', 'HHN'] for idx, chan in enumerate(chans): st = Stream() for s in range(1, 9): if debug: print('On ' + str(s) + ' ' + chan) st += read(string + str(s) + '/' + chan + '.D/XX*') stime = UTCDateTime('2017-05-03T01:10:00.0') etime = UTCDateTime('2017-05-04T01:10:00.0') st.trim(starttime=stime, endtime=etime) st.decimate(4)
'elevation': 0.450000, 'longitude': 11.583049}) st[4].stats.paz = AttribDict({ 'poles': [(-4.39823 + 4.48709j), (-4.39823 - 4.48709j), (-2.105 + 0j)], 'zeros': [0j, 0j, 0j], 'sensitivity': 222222228.10910088, 'gain': 1.0}) st[4].stats.coordinates = AttribDict({ 'latitude': 48.108730, 'elevation': 0.450000, 'longitude': 11.583157}) # Instrument correction to 1Hz corner frequency paz1hz = corn_freq_2_paz(1.0, damp=0.707) st.simulate(paz_remove='self', paz_simulate=paz1hz) # Execute array_processing stime = obspy.UTCDateTime("20080217110515") etime = obspy.UTCDateTime("20080217110545") kwargs = dict( # slowness grid: X min, X max, Y min, Y max, Slow Step sll_x=-3.0, slm_x=3.0, sll_y=-3.0, slm_y=3.0, sl_s=0.03, # sliding window properties win_len=1.0, win_frac=0.05, # frequency properties frqlow=1.0, frqhigh=8.0, prewhiten=0, # restrict output semb_thres=-1e9, vel_thres=-1e9, timestamp='mlabday', stime=stime, etime=etime
import numpy as np import matplotlib.pyplot as plt import obspy from obspy.clients.arclink import Client from obspy.signal.invsim import corn_freq_2_paz, simulate_seismometer # Retrieve data via ArcLink # please provide a valid email address for the keyword user client = Client(user="******") t = obspy.UTCDateTime("2009-08-24 00:20:03") st = client.get_waveforms('BW', 'RJOB', '', 'EHZ', t, t + 30) paz = client.get_paz('BW', 'RJOB', '', 'EHZ', t) # 1Hz instrument one_hertz = corn_freq_2_paz(1.0) # Correct for frequency response of the instrument res = simulate_seismometer(st[0].data.astype('float32'), st[0].stats.sampling_rate, paz, inst_sim=one_hertz) # Correct for overall sensitivity res = res / paz['sensitivity'] # Plot the seismograms sec = np.arange(len(res)) / st[0].stats.sampling_rate plt.subplot(211) plt.plot(sec, st[0].data, 'k') plt.title("%s %s" % (st[0].stats.station, t)) plt.ylabel('STS-2') plt.subplot(212)