Example #1
0
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
Example #2
0
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
Example #3
0
 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)
Example #4
0
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
Example #5
0
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)
Example #6
0
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
Example #7
0
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()
Example #8
0
 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
Example #9
0
# 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})

Example #10
0
 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')
     ])
Example #11
0
 def getdiffaz(self, event):
     return abs(self.staAz -
                distaz(*event.getlatlon(), *self.latlon1).getAz())
Example #12
0
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 + '&amp;maxlat=' + lat2 + '&amp;minlon=' + lon1 +
        '&amp;maxlon=' + lon2 +
        '&amp;kmz=1</href><refreshMode>onInterval</refreshMode><refreshInterval>86400</refreshInterval></Link></NetworkLink></kml>'
    )
Example #13
0
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
Example #14
0
        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
Example #15
0
def cal_dist(row):
    d = distaz.distaz(row['lat1'], row['lon1'], row['lat2'],
                      row['lon2']).getDelta()
    return d
Example #16
0
        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']
Example #17
0
        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']
Example #18
0
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)
Example #19
0
        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
Example #20
0
def check_epdist(evla, evlo, stla, stlo):
    dist = distaz(stla, stlo, evla, evlo).degreesToKilometers()
    if (dist > 30000):
        return True
    else:
        return False
Example #21
0
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)
Example #22
0
        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'