def make_shakemap_slice(home, project_name, run_name, time_epi, GF_list, dt, tmax): ''' Make xyz files with current ground velocity ''' from numpy import genfromtxt, arange, sqrt, zeros, where, c_, savetxt from string import rjust from obspy import read from mudpy.forward import lowpass t = arange(0, tmax, dt) fcorner = 0.5 sta = genfromtxt(home + project_name + '/data/station_info/' + GF_list, usecols=0, dtype='S') lonlat = genfromtxt(home + project_name + '/data/station_info/' + GF_list, usecols=[1, 2]) for ksta in range(len(sta)): n = read(home + project_name + '/output/forward_models/' + run_name + '.' + sta[ksta] + '.vel.n') e = read(home + project_name + '/output/forward_models/' + run_name + '.' + sta[ksta] + '.vel.n') n[0].data = lowpass(n[0].data, fcorner, 1. / n[0].stats.delta, 2) e[0].data = lowpass(n[0].data, fcorner, 1. / e[0].stats.delta, 2) if ksta == 0: h = n.copy() else: h += n[0].copy() h[ksta].data = sqrt(n[0].data**2 + e[0].data**2) h[ksta].trim(starttime=time_epi) print h[ksta].stats.starttime vout = zeros(len(lonlat)) maxv = 0 for kt in range(len(t)): for ksta in range(len(sta)): i = where(h[ksta].times() == t[kt])[0] vout[ksta] = h[ksta].data[i] if vout.max() > maxv: maxv = vout.max() out = c_[lonlat, vout] num = rjust(str(kt), 4, '0') print num savetxt(home + project_name + '/analysis/shake/' + num + '.shake', out, fmt='%10.6f\t%10.6f\t%10.4f') print 'Max velocity was ' + str(maxv) + 'm/s'
def make_shakemap_slice(home,project_name,run_name,time_epi,GF_list,dt,tmax): ''' Make xyz files with current ground velocity ''' from numpy import genfromtxt,arange,sqrt,zeros,where,c_,savetxt from string import rjust from obspy import read from mudpy.forward import lowpass t=arange(0,tmax,dt) fcorner=0.5 sta=genfromtxt(home+project_name+'/data/station_info/'+GF_list,usecols=0,dtype='S') lonlat=genfromtxt(home+project_name+'/data/station_info/'+GF_list,usecols=[1,2]) for ksta in range(len(sta)): n=read(home+project_name+'/output/forward_models/'+run_name+'.'+sta[ksta]+'.vel.n') e=read(home+project_name+'/output/forward_models/'+run_name+'.'+sta[ksta]+'.vel.n') n[0].data=lowpass(n[0].data,fcorner,1./n[0].stats.delta,2) e[0].data=lowpass(n[0].data,fcorner,1./e[0].stats.delta,2) if ksta==0: h=n.copy() else: h+=n[0].copy() h[ksta].data=sqrt(n[0].data**2+e[0].data**2) h[ksta].trim(starttime=time_epi) print h[ksta].stats.starttime vout=zeros(len(lonlat)) maxv=0 for kt in range(len(t)): for ksta in range(len(sta)): i=where(h[ksta].times()==t[kt])[0] vout[ksta]=h[ksta].data[i] if vout.max()>maxv: maxv=vout.max() out=c_[lonlat,vout] num=rjust(str(kt),4,'0') print num savetxt(home+project_name+'/analysis/shake/'+num+'.shake',out,fmt='%10.6f\t%10.6f\t%10.4f') print 'Max velocity was '+str(maxv)+'m/s'
def envelope(n, e, z, fcorner=None, Ncomponents=3): ''' Build the envelope of a 3- or 2-component accelerogram using the Hilbert transform as implemented in obspy.signal.filter ''' from obspy.signal.filter import envelope from mudpy.forward import lowpass #remove pre-event baseline n[0].data -= n[0].data[0] e[0].data -= e[0].data[0] z[0].data -= z[0].data[0] #Initalize per-component envelopes nenv = n.copy() eenv = e.copy() zenv = z.copy() #make envelopes nenv[0].data = envelope(n[0].data) eenv[0].data = envelope(e[0].data) zenv[0].data = envelope(z[0].data) #combine envelopes into one aenv = n.copy() aenvf = n.copy() #How many components if Ncomponents == 3: aenv[0].data = (nenv[0].data**2 + eenv[0].data**2 + zenv[0].data**2)**0.5 else: aenv[0].data = (nenv[0].data**2 + eenv[0].data**2)**0.5 #Low pass filter envelope if fcorner == None: aenvf = aenv.copy() else: aenvf[0].data = lowpass(aenv[0].data, fcorner, 1. / aenv[0].stats.delta, 2) return aenvf
def envelope(n,e,z,fcorner=None,Ncomponents=3): ''' Build the envelope of a 3- or 2-component accelerogram using the Hilbert transform as implemented in obspy.signal.filter ''' from obspy.signal.filter import envelope from mudpy.forward import lowpass #remove pre-event baseline n[0].data-=n[0].data[0] e[0].data-=e[0].data[0] z[0].data-=z[0].data[0] #Initalize per-component envelopes nenv=n.copy() eenv=e.copy() zenv=z.copy() #make envelopes nenv[0].data=envelope(n[0].data) eenv[0].data=envelope(e[0].data) zenv[0].data=envelope(z[0].data) #combine envelopes into one aenv=n.copy() aenvf=n.copy() #How many components if Ncomponents==3: aenv[0].data=(nenv[0].data**2+eenv[0].data**2+zenv[0].data**2)**0.5 else: aenv[0].data=(nenv[0].data**2+eenv[0].data**2)**0.5 #Low pass filter envelope if fcorner==None: aenvf=aenv.copy() else: aenvf[0].data=lowpass(aenv[0].data,fcorner,1./aenv[0].stats.delta,2) return aenvf
#Final write n.write(path+'proc/'+sta+'.LXN.sac',format='SAC') e.write(path+'proc/'+sta+'.LXE.sac',format='SAC') u.write(path+'proc/'+sta+'.LXZ.sac',format='SAC') if cut_filter: stanames=genfromtxt('/Users/dmelgar/Slip_inv/iquique_sm/data/station_info/gps.gflist',usecols=0,dtype='S') coords=genfromtxt('/Users/dmelgar/Slip_inv/iquique_sm/data/station_info/gps.gflist',usecols=[1,2]) for k in range(len(stanames)): sta=stanames[k] print sta n=read(path+'proc/'+sta+'.LXN.sac') e=read(path+'proc/'+sta+'.LXE.sac') u=read(path+'proc/'+sta+'.LXZ.sac') #Low pass filter n[0].data=lowpass(n[0].data,fcorner,1./n[0].stats.delta,10) e[0].data=lowpass(e[0].data,fcorner,1./e[0].stats.delta,10) u[0].data=lowpass(u[0].data,fcorner,1./u[0].stats.delta,10) #Get station to hypocenter delta distance delta=locations2degrees(coords[k,1],coords[k,0],epicenter[1],epicenter[0]) #Get p-time to site tt=getTravelTimes(delta,epicenter[2]) tp=timedelta(seconds=float64(tt[0]['time'])) #Trim n[0].trim(starttime=time_epi+tp-tmin,endtime=time_epi+tp+tmax) e[0].trim(starttime=time_epi+tp-tmin,endtime=time_epi+tp+tmax) u[0].trim(starttime=time_epi+tp-tmin,endtime=time_epi+tp+tmax) #Remove first epoch n[0].data=n[0].data-n[0].data[0] e[0].data=e[0].data-e[0].data[0] u[0].data=u[0].data-u[0].data[0]
dtype='S') for k in range(len(stations)): print stations[k] n = read(path + 'trim/' + stations[k] + '.HNN.sac') e = read(path + 'trim/' + stations[k] + '.HNE.sac') z = read(path + 'trim/' + stations[k] + '.HNZ.sac') #Remove zero baseline n[0].data = n[0].data - mean(n[0].data[0:500]) e[0].data = e[0].data - mean(e[0].data[0:500]) z[0].data = z[0].data - mean(z[0].data[0:500]) #Integrate n[0].data = cumtrapz(n[0].data, n[0].times(), initial=0) e[0].data = cumtrapz(e[0].data, e[0].times(), initial=0) z[0].data = cumtrapz(z[0].data, z[0].times(), initial=0) #Lowpass or Bandpass n[0].data = lowpass(n[0].data, fcorner, 1. / n[0].stats.delta, 2) e[0].data = lowpass(e[0].data, fcorner, 1. / e[0].stats.delta, 2) z[0].data = lowpass(z[0].data, fcorner, 1. / z[0].stats.delta, 2) #Decimate to 4 Hz if n[0].stats.delta == 0.005: n = stdecimate(n, 5, 10) n = stdecimate(n, 5, 10) n = stdecimate(n, 2, 10) e = stdecimate(e, 5, 10) e = stdecimate(e, 5, 10) e = stdecimate(e, 2, 10) z = stdecimate(z, 5, 10) z = stdecimate(z, 5, 10) z = stdecimate(z, 2, 10) if n[0].stats.delta == 0.01: n = stdecimate(n, 5, 10)
dtype='S') station_coords = genfromtxt(path + 'station_info/michoacan_after.sta', usecols=[1, 2]) #Now loop over station data at each epoch for ksta in range(len(stanames)): print '... fetching PGD for ' + stanames[ksta] try: n = read(data_path + '/' + stanames[ksta] + '.LYN.sac') e = read(data_path + '/' + stanames[ksta] + '.LYE.sac') u = read(data_path + '/' + stanames[ksta] + '.LYZ.sac') if n[0].stats.npts > 0: #Trim to times of interest n.trim(starttime=hypo_time, endtime=hypo_time + tmax, pad=True) e.trim(starttime=hypo_time, endtime=hypo_time + tmax, pad=True) u.trim(starttime=hypo_time, endtime=hypo_time + tmax, pad=True) n[0].data = lowpass(n[0].data, 0.6, 5.0, 2) e[0].data = lowpass(n[0].data, 0.6, 5.0, 2) u[0].data = lowpass(n[0].data, 0.6, 5.0, 2) n[0].decimate(factor=5, no_filter=True) e[0].decimate(factor=5, no_filter=True) u[0].decimate(factor=5, no_filter=True) #Remove mean of first ten seconds #Get station-event distance d, az, baz = gps2DistAzimuth(station_coords[ksta, 1], station_coords[ksta, 0], hypo[1], hypo[0]) hypo_dist = ((d / 1000)**2 + hypo[2]**2)**0.5 #Now get PGD at that site pgd_all_out = 0 pgd_nov_out = 0 time_to_all = 0
files = glob( '/Users/dmelgar/Slip_inv/Chiapas_hernandez/data/waveforms/*.disp*') dt = 0.25 fcorner = 0.49 for k in range(len(files)): print files[k] st = read(files[k]) dt_data = st[0].stats.delta tmax = dt_data * st[0].stats.npts - dt_data t = arange(0, tmax, dt) #filter d = lowpass(st[0].data, fcorner, 1. / dt_data, 2, zerophase=True) #Interpolate f = interp1d(st[0].times(), d) dinterp = f(t) #filter again to be safe about upsampled data dout = lowpass(dinterp, fcorner, 1. / dt, 2, zerophase=True) #metadata st[0].stats.delta = dt #output st[0].data = dout st.write(files[k], format='SAC')
nbb = read(path + sta + '.bb.HNN.sac') ebb = read(path + sta + '.bb.HNE.sac') zbb = read(path + sta + '.bb.HNZ.sac') nhf = read(path + sta + '.HNN.sac') ehf = read(path + sta + '.HNE.sac') zhf = read(path + sta + '.HNZ.sac') #Diff LF to accel dt = nlf[0].stats.delta nlf[0].data = r_[0, diff(r_[0, diff(nlf[0].data) / dt]) / dt] elf[0].data = r_[0, diff(r_[0, diff(elf[0].data) / dt]) / dt] zlf[0].data = r_[0, diff(r_[0, diff(zlf[0].data) / dt]) / dt] #low pass filter nlf[0].data = lowpass(nlf[0].data, 1.0, 1. / dt, 4, zerophase=True) elf[0].data = lowpass(elf[0].data, 1.0, 1. / dt, 4, zerophase=True) zlf[0].data = lowpass(zlf[0].data, 1.0, 1. / dt, 4, zerophase=True) #hig pass filter dt = nhf[0].stats.delta nhf[0].data = highpass(nhf[0].data, 1.0, 1. / dt, 4, zerophase=True) ehf[0].data = highpass(ehf[0].data, 1.0, 1. / dt, 4, zerophase=True) zhf[0].data = highpass(zhf[0].data, 1.0, 1. / dt, 4, zerophase=True) #Plot limits elims = [-max(abs(ebb[0].data)), max(abs(ebb[0].data))] nlims = [-max(abs(nbb[0].data)), max(abs(nbb[0].data))] zlims = [-max(abs(zbb[0].data)), max(abs(zbb[0].data))] xlims = [0, 60]
xl=[0,20] run='7546538' M='M5' lag=0.5 #read in BBP waveforms tlf,lfe=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-lf.acc.090') thf,hfe=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-hf.acc.090') tlf,lfn=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-lf.acc.000') thf,hfn=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-hf.acc.000') tlf,lfz=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-lf.acc.ver') thf,hfz=bbptools.read_bbp_seismogram(u'/Users/dmelgar/FakeQuakes/M6_BB/plots/'+M+'/'+run+'.'+sta+'-hf.acc.ver') #filter fsample=1/(tlf[1]-tlf[0]) lfe=lowpass(lfe,1.0,fsample,4,zerophase=True) lfn=lowpass(lfn,1.0,fsample,4,zerophase=True) lfz=lowpass(lfz,1.0,fsample,4,zerophase=True) fsample=1/(thf[1]-thf[0]) hfe=highpass(hfe,1.0,fsample,4,zerophase=True) hfn=highpass(hfn,1.0,fsample,4,zerophase=True) hfz=highpass(hfz,1.0,fsample,4,zerophase=True) #rescale lfe=lfe/100 lfn=lfn/100 lfz=lfz/100 hfe=hfe/100 hfn=hfn/100 hfz=hfz/100
time_bandwidth=4, number_of_tapers=5, nfft=syn_wf[0].stats.npts, quadratic=True) syn_amp = np.sqrt(syn_amp_squared) ############## Low frequency spectra ############## # Double differentiate disp waveform to get it acc lf_vel_data = r_[0, diff(lf_wf[0].data) / lf_wf[0].stats.delta] lf_acc_data = r_[0, diff(lf_vel_data) / lf_wf[0].stats.delta] # Low pass filter low frequency data lf_acc_data = forward.lowpass(lf_acc_data, 0.998, lf_wf[0].stats.sampling_rate, 4, zerophase=True) # Calculate spectra lf_amp_squared, lf_freq = mtspec(lf_acc_data, delta=lf_wf[0].stats.delta, time_bandwidth=4, number_of_tapers=5, nfft=lf_wf[0].stats.npts, quadratic=True) lf_amp = np.sqrt(lf_amp_squared) ############## High frequency spectra ############## # High pass filter high frequency data
from scipy.signal import ellip, filtfilt from numpy import size, array fnyquist = fsample / 2 b, a = ellip(order, rp, rs, array(fcorner) / (fnyquist), btype='low') data_filt = filtfilt(b, a, data) return data_filt tlf_raw, lf_raw = bbptools.read_bbp_seismogram( '/Users/dmelgar/code/BBP/bbp/bbp_data/finished/rawdata/fake_nocal/111.' + sta + '-lf.acc.000.prefilter') tlf_bbp_proc, lf_bbp_proc = bbptools.read_bbp_seismogram( '/Users/dmelgar/code/BBP/bbp/bbp_data/finished/rawdata/fake_nocal/111.' + sta + '-lf-resamp.000') lf_filt2 = lowpass(lf_raw, 1.2, 10, 2) lf_filt4 = lowpass(lf_raw, 1.2, 10, 4) lf_filt8 = lowpass(lf_raw, 1.2, 10, 8) #lf_filt2=ellip_lowpass(lf_raw,1.2,10,2,rs=0.1) #lf_filt4=ellip_lowpass(lf_raw,1.2,10,4,rs=0.1) #lf_filt8=ellip_lowpass(lf_raw,1.2,10,8,rs=0.1) xyz, slip, tinit, stf_all, rise_time, hypocenter = bbptools.read_srf( u'/Users/dmelgar/code/BBP/bbp/bbp_data/finished/fake_nocal/large_eew_m5.0_frac0.5.srf' ) ptime, stime = bbptools.arrivals(hypocenter, lonlat[i, 0], lonlat[i, 1]) #plt.figure() #plt.plot(tlf_raw,lf_raw,'k') #plt.plot(tlf_raw,lf_filt,'r',lw=2) #plt.legend(['unfilt','filt'])
u5 = read(u'/Users/dmelgar/Slip_inv/Nepal_ttests_' + str(tr) + '/output/forward_models/' + str(tr) + 's_vr3.6.KKN4.vel.u') u = read(u'/Users/dmelgar/Nepal2015/GPS/PPP/KKN4.LXZ.sac') #trim delay = 15 t1 = time_epi + timedelta(seconds=delay) t2 = t1 + timedelta(seconds=70) u1[0].trim(starttime=t1, endtime=t2) u2[0].trim(starttime=t1, endtime=t2) u3[0].trim(starttime=t1, endtime=t2) u4[0].trim(starttime=t1, endtime=t2) u5[0].trim(starttime=t1, endtime=t2) u[0].trim(starttime=t1 + timedelta(seconds=1), endtime=t2) u[0].data = u[0].data - u[0].data[0] u[0].data = lowpass(u[0].data, 1.0, 5.0, 2) u[0].data = diff(u[0].data / 0.2) plt.figure(figsize=(6, 5)) plt.plot(u1[0].times() + delay, u1[0].data + dvert) plt.plot(u2[0].times() + delay, u2[0].data + 2 * dvert) plt.plot(u3[0].times() + delay, u3[0].data + 3 * dvert) plt.plot(u4[0].times() + delay, u4[0].data + 4 * dvert) plt.plot(u5[0].times() + delay, u5[0].data + 5 * dvert) plt.plot(u[0].times() + delay, u[0].data, 'k', lw=1.5) plt.xlim([15, 80]) plt.ylim([-0.2, 3.5]) plt.grid() plt.xlabel('Seconds after OT') plt.ylabel('Vertical velocity (m/s)') plt.title(str(tr) + 's rise time')