def cal_dist(row_evt,row_pair): evla,evlo = row_evt['lat'],row_evt['lon'] stla1,stlo1 = row_pair['lat1'],row_pair['lon1'] stla2,stlo2 = row_pair['lat2'],row_pair['lon2'] dist1 = distaz(stla1,stlo1,evla,evlo).degreesToKilometers() dist2 = distaz(stla2,stlo2,evla,evlo).degreesToKilometers() return dist1,dist2
def compute_ray_density(rays, rnodes, radius): """ compute ray density to determine H :param rays: location of station pairs :param rnodes: location of nodes :param radius: radius of node :return: rho and chi, ray density and azimuthal distribution """ rho = [0 for _ in range(len(rnodes))] azs = [[] for _ in range(len(rnodes))] for ray in rays: ray = [(ray[0], ray[1]), (ray[2], ray[3])] az = distaz(*ray[0], *ray[1]).getAz() if az >= 180: az -= 180 for i in range(len(rnodes)): inarc, dist = ray_dist_to_node(ray, rnodes[i]) if dist < radius: d1 = distaz(*rnodes[i], *ray[0]).getDelta() d2 = distaz(*rnodes[i], *ray[1]).getDelta() if inarc or (d1 < radius or d2 < radius): rho[i] += 1 azs[i].append(az) # TODO fix bug. azimuths is not constant on one ray chi = [0 for _ in range(len(rnodes))] for i in range(len(chi)): if len(azs[i]) == 0: chi[i] = 0 else: hist = [0 for _ in range(10)] for az in azs[i]: hist[int(az)//18] += 1 chi[i] = sum(hist) / (10 * max(hist)) return rho, chi
def __init__(self, sta1, lat1, lon1, sta2, lat2, lon2): self.sta1 = sta1 self.sta2 = sta2 self.latlon1 = (lat1, lon1) self.latlon2 = (lat2, lon2) self.staAz = distaz(*self.latlon2, *self.latlon1).getAz() self.staDist = distaz(*self.latlon2, *self.latlon1).degreesToKilometers() self.evts = [] self.dispfile = [] self.disp = [] self.PRANGE = (10, 80)
def read_dispersion(disp_dir, stationlst, index): """ read dispersion file, return start and end position of ray path, travel time and corresponding misfit :param disp_dir: directory of dispersion file :param stationlst: station info file :param index: correspond to certain peroid :return: (ray, time, mis) ray: lat1, lon1, lat2, lon2 time: travel time mis: misfit """ ray, time, mis = [], [], [] sta = {} with open(stationlst, 'r') as f: for line in f: l = line[:-1].split(' ') sta[l[0]] = (float(l[1]), float(l[2])) disp_files = os.listdir(disp_dir) for disp_file in disp_files: disp = np.loadtxt(disp_dir+disp_file) if sum(np.isnan(disp[:, index])) == 0: vel, mis_v = disp[0, index], disp[1, index] sta1, sta2 = disp_file.split('_') latlon1, latlon2 = sta[sta1], sta[sta2] distance = distaz(*latlon2, *latlon1).degreesToKilometers() time.append(vel*distance) mis.append(mis_v*distance) ray.append(latlon1+latlon2) return ray, time, mis
def do_check(row_pair,evt,dep_max,dist_min,dist_max,mag_min): start,end = row_pair['start'],row_pair['end'] mask0 = (evt['time'] > start) & (evt['time'] < end - 86400) evt1 = evt[mask0].copy() evt2 = evt1[evt1['dep'] <= dep_max].copy() evt2 = evt2[evt2['mw'] > mag_min] stla1,stlo1 = row_pair['lat1'],row_pair['lon1'] stla2,stlo2 = row_pair['lat2'],row_pair['lon2'] sta_az = distaz(stla2,stlo2,stla1,stlo1).getAz() mask1 = evt2.apply(check_az,axis='columns',args=(row_pair,sta_az)) evt2 = evt2[mask1] if(len(evt2) == 0): return 0 evt2.loc[:,'dist'] = evt2.apply(cal_dist,axis='columns',args=(row_pair,)) mean = lambda x: (x[0]+x[1])/2.0 evt2 = evt2[ (evt2['dist'].map(max) < dist_max) & (evt2['dist'].map(min) > dist_min)] mask2 = evt2.apply(check_multi,axis='columns',args=(row_pair,evt1)) evt2 = evt2[mask2] return len(evt2)
def check_az(row_evt,row_pair,sta_az): evla,evlo = row_evt['lat'],row_evt['lon'] stla1,stlo1 = row_pair['lat1'],row_pair['lon1'] evt_az = distaz(evla,evlo,stla1,stlo1).getAz() if(abs(sta_az-evt_az)<2.0 or abs(abs(sta_az-evt_az)-180)<2.0): return True else: return False
def test_ray_dist_to_node(): from random import random from distaz import distaz ray = [ ((random()-0.5)*180, (random()-0.5)*360), ((random()-0.5)*180, (random()-0.5)*360)] ax = plt.axes(projection=ccrs.Robinson()) ax.set_global() ax.coastlines() plt.plot([ray[0][1], ray[1][1]], [ray[0][0], ray[1][0]], color='red', transform=ccrs.Geodetic()) for lon in range(-180, 180, 10): for lat in range(-90, 90, 10): color = 'grey' inarc, dist = ray_dist_to_node(ray, (lat, lon)) if dist < 5 and inarc: color = 'red' elif dist < 5: d1 = distaz(lat, lon, *ray[1]).getDelta() d2 = distaz(lat, lon, *ray[0]).getDelta() if d1 < 5 or d2 < 5: color = 'red' plt.plot([lon], [lat], color=color, marker='.', transform=ccrs.Geodetic()) plt.show()
def setevents(self, events): for evt in events: diff = self.getdiffaz(evt) if evt.getdepth() > 50: continue if distaz(*evt.getlatlon(), 36, 105).getDelta() > 120: continue if not (diff < 2.0 or abs(diff - 180) < 2.0): continue if evt.getmag() <= 5.5: continue dist = min( distaz(*evt.getlatlon(), *self.latlon1).getDelta(), distaz(*evt.getlatlon(), *self.latlon2).getDelta()) if dist < 10: continue try: evt.getfile(self.sta1) evt.getfile(self.sta2) except KeyError: continue self.evts.append(evt) evt.add_pair(self.name, self.staDist) return
# Model information YAxisRange = RFdepth[0, 1]['Depthrange'][0] VelocityModel = np.loadtxt(Velmod) Depths = VelocityModel[:, 0] Vs = VelocityModel[:, 2] Vs = interpolate.interp1d(Depths, Vs, kind='linear')(YAxisRange) # Stacking Stack_data = np.zeros([center.shape[0],4], dtype=np.object) for i in range(center.shape[0]): print('Calculating %dth bin at %f/%f' % (i, center[i][0], center[i][1])) Stack_RF = np.zeros([Stack_range.shape[0], 1]) Event_count = np.zeros([Stack_range.shape[0], 1]) for j in range(Stack_range.shape[0]): bin_radius = np.sqrt(0.5*domperiod*Vs[2*Stack_range[j] + 1]*Stack_range[j]) for k in range(RFdepth.shape[1]): if distaz.distaz(center[i][0], center[i][1], RFdepth[0, k]['stalat'][0][0], RFdepth[0, k]['stalon'][0][0]).delta>=2: continue for l in range(RFdepth[0, k]['Piercelat'].shape[1]): if distaz.distaz(center[i][0], center[i][1], RFdepth[0, k]['Piercelat'][l, 0], RFdepth[0, k]['Piercelon'][l, 0]).degreesToKilometers()<bin_radius: Stack_RF[j][0] += RFdepth[0, k]['moveout_correct'][2*Stack_range[j] + 1, l] Event_count[j][0] += 1 if Event_count[j][0] > 0: Stack_RF[j][0] /= Event_count[j][0] Stack_data[i][0] = center[i][0] Stack_data[i][1] = center[i][1] Stack_data[i][2] = Stack_RF Stack_data[i][3] = Event_count sio.savemat(Out_path,{'Stack_data':Stack_data})
mon = int(evenum_split[1]) day = int(evenum_split[2]) jjj = int(evenum_split[3]) hour = int(evenum_split[4]) min = int(evenum_split[5]) sec = int(evenum_split[6]) lat = float(evenum_split[7]) lon = float(evenum_split[8]) dep = float(evenum_split[9]) mw = float(evenum_split[10]) if mw < magmin or mw > magmax: continue evt_time = datetime.datetime(year, mon, day, hour, min, sec) if datemin <= evt_time <= datemax: if isph == 1: dis = distaz.distaz(stla, stlo, lat, lon).delta arr = mod.get_travel_times(source_depth_in_km=dep, distance_in_degree=dis, phase_list=[phase]) if len(arr) != 0: arr_time = evt_time + datetime.timedelta( seconds=arr[0].time) date = arr_time - datetime.timedelta(seconds=btime) dateend = arr_time + datetime.timedelta(seconds=etime) else: date = evt_time + datetime.timedelta(seconds=btime) dateend = evt_time + datetime.timedelta(seconds=etime) event.append([ date.strftime('%Y %m %d %H %M %S'), dateend.strftime('%Y %m %d %H %M %S') ])
def getdiffaz(self, event): return abs(self.staAz - distaz(*event.getlatlon(), *self.latlon1).getAz())
find_re = re.compile(r'<station\s.+?"\s/>', re.DOTALL) for info in find_re.findall(html): sta_info = re.split('\w+="|"\s+?\w+="|"\s/>', info) if sta_info == []: continue network = sta_info[1] staname = sta_info[2] stlat = sta_info[4] stlon = sta_info[5] if sta_info[-2] == 'No archive data': continue yrange1 = sta_info[-5] yrange2 = sta_info[-4] if not islalo: delta = distaz.distaz(float(lat), float(lon), float(stlat), float(stlon)) if dis1 < delta.delta < dis2: print(network + ' ' + staname + ' ' + stlat + ' ' + stlon + ' ' + yrange1 + ' ' + yrange2) else: print(network + ' ' + staname + ' ' + stlat + ' ' + stlon + ' ' + yrange1 + ' ' + yrange2) if iskml: google = open('Station_' + lalo + '.kml', 'w+') google.write( '<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.google.com/earth/kml/2.0"><NetworkLink><name>Selected stations</name><description>Station List</description><Link><href>http://www.iris.edu/cgi-bin/kmlstationinfo?minlat=' + lat1 + '&maxlat=' + lat2 + '&minlon=' + lon1 + '&maxlon=' + lon2 + '&kmz=1</href><refreshMode>onInterval</refreshMode><refreshInterval>86400</refreshInterval></Link></NetworkLink></kml>' )
html = str(response.read()) find_re = re.compile(r'<station\s.+?"/>',re.DOTALL) for info in find_re.findall(html): sta_info = re.split('\w+="|"\s+?\w+="|"\s/>',info) if sta_info == []: continue netname = sta_info[1] staname = sta_info[2] stlat = sta_info[4] stlon = sta_info[5] if sta_info[-2] == 'No archive data': continue yrange1 = sta_info[-5] yrange2 = sta_info[-4] if not islalo and lat_lon != '': delta = distaz.distaz(float(lat),float(lon),float(stlat),float(stlon)) if dis1 < delta.delta < dis2: print(netname+' '+staname+' '+stlat+' '+stlon+' '+yrange1+' '+yrange2) else: print(netname+' '+staname+' '+stlat+' '+stlon+' '+yrange1+' '+yrange2) if iskml: if islalo: if network != '': Knetwork = network+'amp;' else: Knetwork = network if station != '': Kstation = network+'amp;' else: Kstation = station
config.read(head) break lat1 = float(line.split('/')[0]) lon1 = float(line.split('/')[1]) lat2 = float(line.split('/')[2]) lon2 = float(line.split('/')[3]) depthdat = config.get('FileIO', 'depthdat') stackfile = config.get('FileIO', 'stackfile') Velmod = config.get('FileIO', 'Velmod') stalist = config.get('FileIO', 'stalist') domperiod = float(config.get('para', 'domperiod')) Profile_width = float(config.get('para', 'Profile_width')) bin_radius = float(config.get('para', 'bin_radius')) Stack_range = np.arange(350, 751) azi = distaz.distaz(lat1, lon1, lat2, lon2).baz dis = distaz.distaz(lat1, lon1, lat2, lon2).delta Profile_range = np.arange(0, distaz.deg2km(dis), Profile_width) Profile_lat = [] Profile_lon = [] for Profile_loca in Profile_range: (lat_loca, lon_loca) = distaz.latlon_from(lat1, lon1, azi, distaz.km2deg(Profile_loca)) Profile_lat = np.append(Profile_lat, [lat_loca], axis=1) Profile_lon = np.append(Profile_lon, [lon_loca], axis=1) # ----- Read depth .mat file -----# depthmat = sio.loadmat(depthdat) RFdepth = depthmat['YN_RFdepth'] # find stations beside the profile
def cal_dist(row): d = distaz.distaz(row['lat1'], row['lon1'], row['lat2'], row['lon2']).getDelta() return d
config.read(head) break lat1 = float(line.split('/')[0]) lon1 = float(line.split('/')[1]) lat2 = float(line.split('/')[2]) lon2 = float(line.split('/')[3]) depthdat = config.get('FileIO', 'depthdat') stackfile = config.get('FileIO', 'stackfile') Velmod = config.get('FileIO', 'Velmod') stalist = config.get('FileIO', 'stalist') domperiod = float(config.get('para', 'domperiod')) Profile_width = float(config.get('para', 'Profile_width')) bin_radius = float(config.get('para', 'bin_radius')) Stack_range = np.arange(350, 751) azi = distaz.distaz(lat1, lon1, lat2, lon2).baz dis = distaz.distaz(lat1, lon1, lat2, lon2).delta Profile_range = np.arange(0, distaz.deg2km(dis), Profile_width) Profile_lat = [] Profile_lon = [] for Profile_loca in Profile_range: (lat_loca, lon_loca) = distaz.latlon_from(lat1, lon1, azi, distaz.km2deg(Profile_loca)) Profile_lat = np.append(Profile_lat, [lat_loca], axis=1) Profile_lon = np.append(Profile_lon, [lon_loca], axis=1) # ----- Read depth .mat file -----# depthmat = sio.loadmat(depthdat) RFdepth = depthmat['YN_RFdepth'] # find stations beside the profile stalat_all = RFdepth[0, 0::]['stalat']
config.read(head) break # read parameters lat1 = float(line.split('/')[0]) lon1 = float(line.split('/')[1]) lat2 = float(line.split('/')[2]) lon2 = float(line.split('/')[3]) depthdat = config.get('FileIO', 'depthdat') stackfile = config.get('FileIO', 'stackfile') Velmod = config.get('FileIO', 'Velmod') stalist = config.get('FileIO', 'stalist') domperiod = float(config.get('para', 'domperiod')) Profile_width = float(config.get('para', 'Profile_width')) Stack_range = np.arange(1, 101) azi = distaz.distaz(lat1, lon1, lat2, lon2).baz dis = distaz.distaz(lat1, lon1, lat2, lon2).delta Profile_range = np.arange(0, distaz.deg2km(dis), Profile_width) Profile_lat = [] Profile_lon = [] for Profile_loca in Profile_range: (lat_loca, lon_loca) = distaz.latlon_from(lat1, lon1, azi, distaz.km2deg(Profile_loca)) Profile_lat = np.append(Profile_lat, [lat_loca], axis=1) Profile_lon = np.append(Profile_lon, [lon_loca], axis=1) # read depth data depthmat = sio.loadmat(depthdat) RFdepth = depthmat['YN_RFdepth'] # find stations beside the profile stalat_all = RFdepth[0, 0::]['stalat']
def cal_window(stla, stlo, evla, evlo, evtime, vmin, vmax): dist = distaz(stla, stlo, evla, evlo).degreesToKilometers() start = evtime + dist / vmax end = evtime + dist / vmin return (start, end)
config.read(head) break # read parameters lat1 = float(line.split('/')[0]) lon1 = float(line.split('/')[1]) lat2 = float(line.split('/')[2]) lon2 = float(line.split('/')[3]) depthdat = config.get('FileIO', 'depthdat') stackfile = config.get('FileIO', 'stackfile') Velmod = config.get('FileIO', 'Velmod') stalist = config.get('FileIO', 'stalist') domperiod = float(config.get('para', 'domperiod')) Profile_width = float(config.get('para', 'Profile_width')) Stack_range = np.arange(1, 101) azi = distaz.distaz(lat1, lon1, lat2, lon2).baz dis = distaz.distaz(lat1, lon1, lat2, lon2).delta Profile_range = np.arange(0, distaz.deg2km(dis), Profile_width) Profile_lat = [] Profile_lon = [] for Profile_loca in Profile_range: (lat_loca, lon_loca) = distaz.latlon_from(lat1, lon1, azi, distaz.km2deg(Profile_loca)) Profile_lat = np.append(Profile_lat, [lat_loca], axis=1) Profile_lon = np.append(Profile_lon, [lon_loca], axis=1) # read depth data depthmat = sio.loadmat(depthdat) RFdepth = depthmat['YN_RFdepth'] # find stations beside the profile
def check_epdist(evla, evlo, stla, stlo): dist = distaz(stla, stlo, evla, evlo).degreesToKilometers() if (dist > 30000): return True else: return False
import distaz filename_sta = 'pair_temp' filename_evt = 'event' out_prefix = "temp/" sta = pandas.read_table(filename_sta, sep='\s+') evt = pandas.read_table(filename_evt, sep='\s+') out_header = [ 'year', 'month', 'day', 'jday', 'hour', 'min', 'sec', 'lat', 'lon', 'dep', 'mw' ] for npair in range(len(sta)): row_list = [] stla1, stlo1 = sta['lat1'][npair], sta['lon1'][npair] stla2, stlo2 = sta['lat2'][npair], sta['lon2'][npair] sta_az = distaz.distaz(stla2, stlo2, stla1, stlo1).getAz() name_pairs = out_prefix + sta['sta1'][npair] + '_' + sta['sta2'][ npair] + '.lst' for nevt in range(len(evt)): evla = evt['lat'][nevt] evlo = evt['lon'][nevt] evt_az = distaz.distaz(evla, evlo, stla1, stlo1).getAz() if (abs(sta_az - evt_az) < 2.0 or abs(abs(sta_az - evt_az) - 180) < 2.0): row_list.append(nevt) evt.ix[row_list].to_csv(name_pairs, sep=' ', header=out_header, index=False)
mon = int(mon) day = int(day) jjj = int(jjj) hour = int(hour) min = int(min) sec = int(sec) lat = float(lat) lon = float(lon) dep = float(dep) mw = float(mw) if mw < magmin or mw > magmax: continue evt_time = datetime.datetime(year,mon,day,hour,min,sec) if datemin <= evt_time <= datemax: if isph == 1: dis = distaz.distaz(stla, stlo, lat, lon).delta arr = mod.get_travel_times(source_depth_in_km=dep, distance_in_degree=dis, phase_list=[phase]) if len(arr) != 0: arr_time = evt_time + datetime.timedelta(seconds=arr[0].time) date = arr_time + datetime.timedelta(seconds=btime) dateend = arr_time + datetime.timedelta(seconds=etime) else: date = evt_time + datetime.timedelta(seconds=btime) dateend = evt_time + datetime.timedelta(seconds=etime) event.append([date.strftime('%Y %m %d %H %M %S'), dateend.strftime('%Y %m %d %H %M %S')]) if event == []: print('No events found in the range') msg = generatemsg(NAME, INST, EMAIL, MEDIA, ALTERNATEMEDIA, LABEL) for row in event: msg += station+' '+network+' '+row[0]+' '+row[1]+' 1 '+chan+' '+loca+'\n'