Пример #1
0
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'
Пример #2
0
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'
Пример #3
0
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
Пример #4
0
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
Пример #5
0
        #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]
Пример #6
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)
Пример #7
0
                       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
Пример #8
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')
Пример #9
0
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]
Пример #10
0
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
Пример #11
0
                                   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
Пример #12
0
    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'])
Пример #13
0
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')