예제 #1
0
def get_sta_date(event_list):
    sta_date_dict = {}
    for i, [event_loc, pha_dict] in enumerate(event_list):
        if i % 1e3 == 0:
            print('%s/%s events done/total' % (i, len(event_list)))
        # 1. get event info
        ot, lat, lon = event_loc[0:3]
        event_name = dtime2str(ot)
        train_dir = os.path.join(train_root, 'positive', event_name)
        valid_dir = os.path.join(valid_root, 'positive', event_name)
        if not os.path.exists(train_dir): os.makedirs(train_dir)
        if not os.path.exists(valid_dir): os.makedirs(valid_dir)
        for net_sta, [tp, ts] in pha_dict.items():
            # 2. divide into train / valid
            rand = np.random.rand(1)[0]
            if rand < train_ratio: samp_class = 'train'
            elif rand < train_ratio + valid_ratio: samp_class = 'valid'
            else: continue
            date = str(tp.date)
            sta_date = '%s_%s' % (net_sta, date)  # for one day's stream data
            if sta_date not in sta_date_dict:
                sta_date_dict[sta_date] = [[samp_class, event_name, tp, ts]]
            else:
                sta_date_dict[sta_date].append(
                    [samp_class, event_name, tp, ts])
    return sta_date_dict
def cut_event(event_id):
    # get event info
    [event_loc, pick_dict] = pha_list[event_id]
    if len(event_loc)==5: 
        ot, lat, lon, dep, mag = event_loc
    if len(event_loc)==4: 
        ot, lat, lon, mag = event_loc
        dep = -1
    data_dict = get_data_dict(ot, data_dir)
    event_name = dtime2str(ot)
    event_dir = os.path.join(out_root, event_name)
    if not os.path.exists(event_dir): os.makedirs(event_dir)

    # cut event
    print('cutting {}'.format(event_name))
    for net_sta, [tp, ts] in pick_dict.items():
        time_range = [tp-event_win[0], tp+event_win[1]]
        t0 = event_win[0]
        t1 = ts - tp + event_win[0] if ts else None
        if net_sta not in data_dict: continue
        data_paths = data_dict[net_sta]
        chn_codes = [data_path.split('.')[3][0:3] for data_path in data_paths]
        out_paths = [os.path.join(event_dir,'%s.%s.sac'%(net_sta,chn)) for chn in chn_codes]
        # cut event
        for i in range(3):
            st = read(data_paths[i], starttime=time_range[0], endtime=time_range[1])
            st.write(out_paths[i])
            sac.ch_event(out_paths[i], lon, lat, dep, mag, [t0,t1])
예제 #3
0
def cut_event(event_id):
    # get event info
    [event_loc, pick_dict] = pha_list[event_id]
    ot, lat, lon, dep, mag = event_loc
    data_dict = get_data_dict(ot, data_dir)
    event_name = dtime2str(ot)
    event_dir = os.path.join(out_root, event_name)
    if not os.path.exists(event_dir): os.makedirs(event_dir)

    # cut event
    print('cutting {}'.format(event_name))
    for net_sta, [tp, ts] in pick_dict.items():
        b = tp - UTCDateTime(ot.date) - event_win[0]
        if net_sta not in data_dict: continue
        data_paths = data_dict[net_sta]
        chn_codes = [data_path.split('.')[-2] for data_path in data_paths]
        out_paths = [os.path.join(event_dir,'%s.%s'%(net_sta,chn)) for chn in chn_codes]
        # cut event
        sac.cut(data_paths[0], b, b+event_win[1], out_paths[0])
        sac.cut(data_paths[1], b, b+event_win[1], out_paths[1])
        sac.cut(data_paths[2], b, b+event_win[1], out_paths[2])
        # write header
        t0 = event_win[0]
        t1 = ts - tp + event_win[0] if ts else ts
        sac.ch_event(out_paths[0], lon, lat, dep, mag, [t0,t1])
        sac.ch_event(out_paths[1], lon, lat, dep, mag, [t0,t1])
        sac.ch_event(out_paths[2], lon, lat, dep, mag, [t0,t1])
예제 #4
0
def get_sta_date(event_list):
    sta_date_dict = {}
    for i, [event_loc, pick_dict] in enumerate(event_list):
        if i % 1e3 == 0:
            print('%s/%s events done/total' % (i, len(event_list)))
        # 1. get event info
        event_name = dtime2str(event_loc[0])
        event_dir = os.path.join(out_root, event_name)
        if not os.path.exists(event_dir): os.makedirs(event_dir)
        for net_sta, [tp, ts] in pick_dict.items():
            date = str(tp.date)
            sta_date = '%s_%s' % (net_sta, date)  # for one day's stream data
            if sta_date not in sta_date_dict:
                sta_date_dict[sta_date] = [[event_dir, tp, ts]]
            else:
                sta_date_dict[sta_date].append([event_dir, tp, ts])
    return sta_date_dict
예제 #5
0
def get_sta_date(event_list, sta_dict):
    sta_date_dict = {}
    sta_list = list(sta_dict.keys())
    for i, [event_loc, pha_dict] in enumerate(event_list):
        if i % 1e3 == 0:
            print('%s/%s events done/total' % (i, len(event_list)))
        # 1. get event info
        ot, lat, lon = event_loc[0:3]
        event_name = dtime2str(ot)
        train_dir = os.path.join(train_root, 'negative', event_name)
        valid_dir = os.path.join(valid_root, 'negative', event_name)
        if not os.path.exists(train_dir): os.makedirs(train_dir)
        if not os.path.exists(valid_dir): os.makedirs(valid_dir)
        for net_sta in sta_list:
            # if recorded in fpha
            if net_sta in pha_dict:
                tp, ts = pha_dict[net_sta]
                is_pick = True
            # if not detected (remote sta)
            else:
                sta_lat, sta_lon = sta_dict[net_sta][0:2]
                dist = calc_dist_km([lat, sta_lat], [lon, sta_lon])
                tp, ts = ot + dist / vp, ot + dist / vs
                if np.random.rand(1)[0] > remote_ratio: continue
                is_pick = False
            # 2. divide into train / valid
            rand = np.random.rand(1)[0]
            if rand < train_ratio: samp_class = 'train'
            elif rand < train_ratio + valid_ratio: samp_class = 'valid'
            else: continue
            date = str(tp.date)
            sta_date = '%s_%s' % (net_sta, date)  # for one day's stream data
            if sta_date not in sta_date_dict:
                sta_date_dict[sta_date] = [[
                    samp_class, event_name, tp, ts, is_pick
                ]]
            else:
                sta_date_dict[sta_date].append(
                    [samp_class, event_name, tp, ts, is_pick])
    return sta_date_dict
예제 #6
0
def cut_event(event_id):
    # get event info
    [event_loc, pick_dict] = pha_list[event_id]
    ot, lat, lon, dep, mag = event_loc
    data_dict = get_data_dict(ot, data_dir)
    event_name = dtime2str(ot)
    event_dir = os.path.join(out_root, event_name)
    if not os.path.exists(event_dir): os.makedirs(event_dir)
    # cut event
    print('cutting {}'.format(event_name))
    for net_sta, [tp, ts] in pick_dict.items():
      if net_sta not in data_dict: continue
      for data_path in data_dict[net_sta]:
        b = tp - read(data_path)[0].stats.starttime - event_win[0]
        chn_code = data_path.split('.')[-2]
        out_path = os.path.join(event_dir,'%s.%s'%(net_sta,chn_code))
        # cut event
        sac.cut(data_path, b, b+event_win[1], out_path)
        # write header
        tn = {}
        tn['t0'] = event_win[0]
        if ts: tn['t1'] = ts - tp + event_win[0]
        sac.ch_event(out_path, lat, lon, dep, mag, tn)
from signal_lib import preprocess, calc_dist_km
from reader import dtime2str
import warnings
warnings.filterwarnings("ignore")

# i/o paths
fsta = 'input/example.sta'
data_root = '/data2/Example_data'
get_data_dict = dp.get_data_dict
get_sta_dict = dp.get_sta_dict
sta_dict = get_sta_dict(fsta)
# get event info
event_line = '2019-07-07T08:08:48.100000Z,35.855,-117.6692,11.51,1.22'
codes = event_line.split(',')
ot = UTCDateTime(codes[0])
event_name = dtime2str(ot)
lat, lon, dep, mag = [float(code) for code in codes[1:5]]
fout = 'output/eg_waveform-dist-tt_%s-M%s.pdf' % (event_name, mag)
data_dict = get_data_dict(ot, data_root)
# data process
freq_band = [1, 40]
samp_rate = 100
win_len = 60
win_len_npts = int(win_len * samp_rate)
time = np.arange(win_len_npts) / samp_rate
max_dist = 200
dist_grid = [None, np.arange(0, max_dist + 0.1, 5)][0]  #TODO
chn_idx = 2
amp = 2
# fig config
fig_size = (12, 14)
예제 #8
0
xy_pad = cfg.xy_pad
lon_min -= xy_pad[0]
lon_max += xy_pad[0]
lat_min -= xy_pad[1]
lat_max += xy_pad[1]

# 1. get evid & event_name
event_dict = {}
f = open(fpha_name)
lines = f.readlines()
f.close()
evid = 0
for line in lines:
    codes = line.split(',')
    if len(codes[0]) < 10: continue
    event_name = dtime2str(UTCDateTime(codes[0]))
    event_dict[str(evid)] = event_name
    evid += 1

# 2. get loc
f = open(fpha_loc)
lines = f.readlines()
f.close()
for line in lines:
    codes = line.split(',')
    if len(codes[0]) >= 10:
        evid = codes[-1][:-1]
        event_name = event_dict[evid]
        id_name = '%s_%s' % (evid, event_name)
        ot = UTCDateTime(codes[0])
        lat, lon, dep, mag = [float(code) for code in codes[1:5]]
fbad = open('output/bad_cascadia_path.dat', 'w')
# down params
client = Client("IRIS")
time_range = '20180301-20180401'
start_date, end_date = [UTCDateTime(date) for date in time_range.split('-')]
num_days = int((end_date - start_date) / 86400) + 1
# read fsta
f = open(fsta)
lines = f.readlines()
f.close()
net_sta_list = [line.split(',')[0].split('.') for line in lines]

for day_i in range(num_days):
    for (net, sta) in net_sta_list:
        t0 = start_date + 86400 * day_i
        t1 = start_date + 86400 * (day_i + 1)
        print(net, sta, t0, t1)
        try:
            st = client.get_waveforms(net, sta, "*", "*", t0, t1)
            print(net, sta, st[0].stats["starttime"])
            dtime = dtime2str(t0)
            msd_name = '.'.join([net, sta, dtime, 'mseed'])
            msd_dir = os.path.join(data_root, net, sta)
            out_path = os.path.join(msd_dir, msd_name)
            if not os.path.exists(msd_dir): os.makedirs(msd_dir)
            st.write(out_path, format="MSEED")
        except:
            print('no data')
            fbad.write('{},{},{}\n'.format(net, sta, t0))
fbad.close()