示例#1
0
def readNDK(fileName='gcmt_1996_2018.ndk'):
	"""
	A simple function to read in a ndk file and pharse data into a dataframe
	For more detail see https://docs.obspy.org/master/_modules/obspy/io/ndk/core.html#_read_ndk
	"""
	ndkDf = pd.DataFrame()
	with open(fileName, "rt") as fp:
		data = fp.read()
	def lines_iter():
		prev_line = -1
		while True:
			next_line = data.find("\n", prev_line + 1)
			if next_line < 0:
				break
			yield data[prev_line+1 : next_line]
			prev_line = next_line
		if len(data) > prev_line + 1:
			yield data[prev_line+1 :]

	for _i, lines in enumerate(zip_longest(*[lines_iter()] * 5)):
		if None in lines:
			msg = "Skipped last %i lines. Not a multiple of 5 lines."%(lines.count(None))
			gpar.log(__name__, msg, level='warning', pri=True)
			continue
		try:
			record = _read_lines(*lines)
			ndkDf = ndkDf.append(record, ignore_index=True)
		except:
			msg = "Could not parse event %i. Will be skipped. Lines of the event:\n\t%s\n"%(_i+1, "\n\t".join(lines))
			gpar.log(__name__,msg,level='warning', pri=True)
	ndkDf = ndkDf.astype({"exp":int})

	return ndkDf
示例#2
0
def loadArray(fileName='ILAR.pkl'):
	"""
	Function to uses pandas.read_pickle to load a pickled array instance
	"""

	ar = pd.read_pickle(fileName)
	if not isinstance(ar, gpar.arrayProcess.Array):
		msg = ('%s is not a Array instance' % fileName)
		gpar.log(__name__,msg,level='error',e='ValueError',pri=True)
	return ar
示例#3
0
文件: getdata.py 项目: gnpang/gPar
def read(path):
	"""
	Function to read a file from a path. If IOError or TypeError simply try appending os.sep to start
	"""

	try:
		st = obspy.core.read(path)
	except (IOError, TypeError):
		try:
			st = obspy.core.read(os.path.join(os.path.sep,path))
		except(IOError, TypeError):
			msg = 'Cannot read %s, the file may be corrupt, skipping it'%(path)
			gpar.log(__name__,msg,level='warn',pri=True)
			return None
	return st
示例#4
0
文件: getdata.py 项目: gnpang/gPar
	def getStream(self, ar, df, stime, etime, net, staele, chan, verb, 
				loc='*', minlen=1500, mode='eq',channel='Z'):
		if not isinstance(chan, (list, tuple)):
			if not isinstance(chan, string_types):
				msg = 'chan must be a string or list of string'
				gpar.log(__name__, msg, level=error, pri=True)
			chan = [chan]
		if self.method == 'dir':
			df, stadf = self._getStream(ar.NAME, df, mode,minlen,verb,channel)
		else:
			stadf = pd.DataFrame(columns=['STA','LAT','LON'])
			client = self.client
			stream = [''] * len(df)
			for ind, row in df.iterrows():
				time = UTCDateTime(row.TIME)
				start = time - stime
				end = time + etime
				st = self._getStream(self, start, end, net, staele, chan, loc)
				st = _checkData(st,minlen)
				if st is None or len(st) < 1:
					stream[ind] = pd.NaT
				else:
					nst = obspy.Stream()
					for tr in st:
						sta = tr.stats.station
						station = client.get_stations(network=net, station=sta).networks[0].stations[0]
						latitude = station.latitude
						longitude = station.longitude
						sac = AttribDict({'b':-stime, 'e':etime, 'o':0,
										  'evla':row.LAT, 'evlo': row.LON,
										  'delta': tr.stats.delta, 'npts': tr.stats.npts,
										  'stla': latitude, 'stlo':longitude,
										  'iztype': 11, 'lcalda': True, 'knetwk': net,
										  'kcmpnm':tr.stats.channel,'kstnm':sta,
										  'nzyear':time.year, 'nzjday':time.julday,
										  'nzhour':time.hour, 'nzmin':time.minute,
										  'nzsec':time.second, 'nzmsec': time.microsecond/1000})
						tr.stats.sac = sac
						nst.append(tr)
						stadf = _checkSta(tr, stadf)
					stream[ind] = nst

			df['Stream'] = stream

		return df, stadf
示例#5
0
def readList(flist, list_type='array',sep='\s+'):
	"""
	Function to read a key files and performs checks for required columns parameters
	Parameters:
		flist: str or pandas dataframe
			A path to the key file or DataFrame itself
		list_type: str
			"array" for array list, "event" for earthquake list, "coda" for coda strip or 'twoline' for twoline strip
		sep: str
			seperate symbol for file reading
	"""

	read_array = set(['NAME','LAT','LON','CODE'])
	read_eq = set(['TIME','LAT','LON','DEP','Mw','DIS','Az','Baz','BB','Rayp','DIR'])
	read_db = set(['DoubleID', 'DIR1', 'TIME1', 'LAT1', 'LON1', 'DEP1', 'M1', 'DIR2', 'TIME2', 'LAT2', 'LON2', 'DEP2', 'M2'])
	read_coda = set(['TIME','LAT','LON','DEP','Mw','Del','Az','Baz','BB','Rayp','RES','lnA','B','C'])
	read_two = set(['TIME','LAT','LON','DEP','Mw','Del','Az','Baz','BB','Rayp','RES','m1','b1','m2','b2'])

	req_type = {'array':read_array,'event':read_eq,'coda':read_coda,'towline':read_two, 'doublet':read_db}

	list_types = req_type.keys()

	if list_type not in list_types:
		msg = ('Not valid list type, choose from %s' % list_types)
		gpar.log(__name__,msg,level='error',e='ValueError',pri=True)

	if isinstance(flist, str):
		if not os.path.exists(flist):
			msg = ('%s does not exists' % flist)
			gpar.log(__name__,msg,level='error',e=ValueError,pri=True)
		else:
			df = pd.read_csv(flist,sep=sep)
	elif isinstance(flist, pd.DataFrame):
		df = flist
	else:
		msg = ('Not supported data type for flist')
		gpar.log(__name__,msg,level='error',pri=True)

	if not req_type[list_type].issubset(df.columns):
		msg = ('Required columns not in %s, required columns for %s key are %s'
			   % (df.columns, list_type, req_type[list_type]))
		gpar.log(__name__,msg,level='error',e=ValueError,pri=True)

	tdf = df.loc[:, list(req_type[list_type])]

	condition = [all([x != '' for item, x in row.iteritems()])
				 for ind, row in tdf.iterrows()]
	df = df[condition]

	df.reset_index(drop=True, inplace=True)

	return df
示例#6
0
文件: getdata.py 项目: gnpang/gPar
def _checkData(st, minlen):

	if st is None or len(st)<1:
		return None

	sample_rates = []
	for tr in st:
		stats = tr.stats
		lasttime = stats.npts * stats.delta
		sample = stats.sampling_rate
		if sample not in sample_rates:
			sample_rates.append(sample)
		if lasttime < minlen:
			msg = ('Trace in station %s starting from %s is shrter than require, removing'%(stats.station, stats.starttime))
			gpar.log(__name__, msg, level='info')
			st.remove(tr)
		mdata = np.max(np.abs(tr.data))
		tmp_data = tr.data / mdata
		if np.std(tmp_data) < 0.000001:
			msg = ("Trace data for %s in station %s has std near 0, removing" % (stats.starttime, tr.stats.station))
			st.remove(tr)
			gpar.log(__name__,msg,level='warning',e=ValueError)
			continue
	if len(st) == 0:
		st = None
	if len(sample_rates) > 1 and st != None:
		resample = np.min(sample_rates)
		msg = ("Traces have different sampling rate %s\nnow resample them to the samllest sample %s"%(sample_rates, resample))
		gpar.log(__name__, msg, level='info')
		st.resample(resample)

	return st
示例#7
0
文件: getdata.py 项目: gnpang/gPar
	def getEqData(self, ar, timebefore=None, timeafter=None, phase=['PKiKP'], minlen=None, mode='eq',verb=False,**kwargs):
		if timebefore is None:
			timebefore = self.timeBeforeOrigin
		if timeafter is None:
			timeafter = self.timeAfterOrigin
		if minlen is None:
			minlen = self.minlen

		net = ar.NETWORK
		sta = ar.Station
		chan = ar.Channel.split('-')
		arDir = os.path.join(ar.NAME, 'Data')
		if 'eqfile' in kwargs.keys():
			eqlist = os.path.join(ar.NAME, kwargs['eqfile'])
		else:
			eqlist = os.path.join(ar.NAME, mode+'.'+ar.NAME+'.list')
		if not os.path.exists(eqlist):
			msg = ('Earthquake list for array %s is not exists, building from ndk file first' % ar.NAME)
			gpar.log(__name__,msg,level='warning',pri=True)
			if 'ndkfile' not in kwargs.keys():
				msg = ('input the ndkfile and related parameters (see getdata.makeEventList) for building earthquake list')
				gpar.log(__name__, msg, level='warning', pri=True)
				return None
			if not os.path.isfile(ndkfile):
				msg = ('ndk file does not exist')
				gpar.log(__name__,msg, level='warning', pri=True)
				return None
		if mode == 'eq':
			eqdf = util.readList(eqlist,list_type='event', sep='\s+')
		elif mode == 'db':
			eqdf = util.readList(eqlist,list_type='doublet', sep='\s+')
		ndf, stadf = self.getStream(ar, eqdf, timebefore, timeafter, net, sta, chan, verb=verb,
									loc='*', minlen=minlen, mode=mode,channel=kwargs['channel'])

		return ndf, stadf
示例#8
0
文件: getdata.py 项目: gnpang/gPar
def makeDataDirectory(arraylist='array.list', fetch='IRIS',
					  timeBeforeOrigin=0, timeAfterOrigin=3600,
					  buildArray=False, outsta=True, minlen=1500.0,
					  **kwargs):
	ardf = util.readList(arraylist, list_type='array', sep='\s+')

	if isinstance(fetch, gpar.getdata.DataFetcher):
		fetcher = fetch
	else:
		fetcher = gpar.getdata.DataFetcher(fetch, timeBeforeOrigin=timeBeforeOrigin, timeAfterOrigin=timeAfterOrigin, minlen=minlen)

	for ind, row in ardf.iterrows():
		edf, stadf = fetcher.getEqData(row,channel='*',**kwargs)
		edf.dropna(inplace=True)
		edf.reset_index(drop=True, inplace=True)
		arDir = os.path.join(row.NAME, 'Data')
		if not os.path.isdir(arDir):
			os.mkdir(arDir)
		for ind, eve in edf.iterrows():
			eDir = os.path.join(arDir, eve.DIR)
			if not os.path.isdir(eDir):
				os.mkdir(eDir)
			_id = eve.DIR[:-6] + '.' + row.NETWORK
			st = eve.Stream
			for tr in st:
				sacname = _id + '.' + tr.stats.station + '.' + tr.stats.channel + '.sac'
				sacname = os.path.join(eDir, sacname)
				tr.write(sacname, format='SAC')

		if buildArray :
			refpoint = [row.LAT, row.LON]
			array = gpar.arrayProcess.Array(row.NAME, refpoint, edf, coordsys=kwargs['coordsys'], phase=kwargs['phase'])
			msg = ('using default parameters sll_x=-15, sll_y=-15, sl_s=0.1,grdpts_x=301, grdpts_y=301, unit="deg" for time table')
			gpar.log(__name__,msg,level='info',pri=True)
			array.getTimeTable()
			array.write()
		if outsta:
			stafile = os.path.join(row.NAME, row.NAME+'.sta')
			stadf.to_csv(stafile, sep=str('\t'), index=False)
示例#9
0
文件: getdata.py 项目: gnpang/gPar
def _loadFromFDSN(fet, start, end, net, sta, chan, loc):

	client = fet.client

	if not isinstance(chan, string_types):
		chan = ','.join(chan)
	else:
		if '-' in chan:
			chan = ','.join(chan.split('-'))
	if '-' in sta:
		sta = ','.join(sta.split('-'))
	try:
		msg = ('downloaded data %s in channel %s from %s to %s loc %s' %
				(net+'.'+sta, chan, start, end, loc))
		gpar.log(__name__, msg, level='warning', pri=True)
		st = client.get_waveforms(net, sta, loc, chan, start, end)
	except:
		msg = ('Could not fetch data on %s in channel %s from %s to %s loc %s' %
				(net+'.'+sta, chan, start, end, loc))
		gpar.log(__name__, msg, level='warning', pri=True)
		st = None

	return st
示例#10
0
文件: build.py 项目: gnpang/gPar
def createEqList(arrayList='array.list',
                 ndkfile='gcmt_1996_2017.ndk',
                 formats='ndk',
                 mindis=50.0,
                 maxdis=75,
                 mag=None,
                 model='ak135',
                 beamphase=['PKiKP'],
                 savefile='array.list.e'):

    ardf = util.readList(arrayList, list_type='array', sep='\s+')
    msg = ('reading ndk file %s' % ndkfile)
    gpar.log(__name__, msg, level='info', pri=True)
    # ndk = obspy.read_events(ndkfile)
    if formats == 'ndk':
        ndk = util.readNDK(ndkfile)
    elif formats == 'csv':
        ndk = pd.read_csv(ndkfile, delimiter='\s+')
    else:
        msg = ('Not a right format for %s\nchoose from ndk or csv' % ndkfile)
        gpar.log(__name__, msg, level='error', pri=True)
    eqnum = [''] * len(ardf)
    for ind, row in ardf.iterrows():
        name = row.NAME
        if not os.path.isdir(name):
            os.mkdir(name)
        msg = ('Generating Eq list for array %s' % name)
        gpar.log(__name__, msg, level='info', pri=True)
        evedf = gpar.getdata.makeEventList(
            ndk=ndk,
            array=name,
            Olat=row.LAT,
            Olon=row.LON,
            mindis=mindis,
            maxdis=maxdis,
            minmag=mag,
            model=model,
            phase=beamphase,
        )
        # evedf = evedf[evedf.time>= UTCDateTime(starttime)]
        n = len(evedf)
        eqnum[ind] = n

    ardf['EQNUM'] = eqnum

    ardf.to_csv(savefile, sep=str('\t'), index=False)

    return ardf
示例#11
0
文件: getdata.py 项目: gnpang/gPar
	def _checkInputs(self):
		if self.arrayName is not None and isinstance(self.arrayName, string_types):
			self.arrayName = self.arrayName.upper()
		if not isinstance(self.method, string_types):
			msg = 'method must be a string. options:\n%s'%self.supMethods
			gpar.log(__name__,msg,level='error',e=ValueError)
		self.method = self.method.lower()
		if not self.method in DataFetcher.subMethods:
			msg = 'method %s not support. Options:\n%s'%(self.method,self.supMethods)
			gpar.log(__name__,msg,level='error',e=ValueError)
		if self.method == 'dir':

			dirPath = glob.glob(self.arrayName)
			if len(dirPath) <1:
				msg = ('directory %s not found make sure path is correct' % self.arrayName)
				gpar.log(__name__,msg,level='error',e=IOError)
			else:
				self.directory = dirPath[0]
				self._getStream = _loadDirectoryData
		elif self.method == 'iris':
			self.client = obspy.clients.fdsn.Client('IRIS')
			self._getStream = _loadFromFDSN
示例#12
0
文件: getdata.py 项目: gnpang/gPar
def quickFetch(fetch_arg,**kwargs):
	"""
	Instantiate a DataFetcher using as little information as possible

	"""

	if isinstance(fetch_arg, DataFetcher):
		dat_fet = fetch_arg
	elif isinstance(fetch_arg, string_types):
		if fetch_arg in DataFetcher.subMethods:
			if fetch_arg == 'dir':
				msg = 'If using method dir, please pass a path to directory'
				gpar.log(__name__, msg, level='error', pri=True)
			dat_fet = DataFetcher(fetch_arg, **kwargs)
		else:
			if not os.path.exists(fetch_arg):
				msg = 'Directory %s does not exist' % fetch_arg
				gpar.log(__name__, msg, level='error', pri=True)
			dat_fet = DataFetcher(method='dir', arrayName=fetch_arg, **kwargs)
	else:
		msg = 'Input not understand'
		gpar.log(__name__, msg, level='error', pri=True)
	return dat_fet
示例#13
0
文件: getdata.py 项目: gnpang/gPar
def makeEventList(ndk='gcmt_1976_2017.ndk',array='ILAR',
				Olat=64.7714,Olon=-146.8861,
				mindis=50, maxdis=75, minmag=None,
				model='ak135',phase=['PKiKP']):
	"""
	Function to generate a event list form gcmt.ndk

	Parameters
	-----------
	ndkfile: str
		The path or URL to the ndk file
	array: str
		The name for the array
	Olat: float
		Latitude for the reference point in the array processing
	Olon: float
		Longitude for the reference point in the array processing
	model: str
		model for calculate the ray parameter

	Return
	----------
	catdf: DataFrame
		Catalog informations
	"""
	pd.set_option('precision',3)
	model = TauPyModel(model)
	infocolumn = ['TIME','LAT','LON','DEP','Mw','mxx','mxy','mzx','myy','myz','mzz','DIR']
	if isinstance(ndk, str):
		evedf = util.readNDK(ndk)
	elif isinstance(ndk, obspy.core.event.Catalog):
		eves = ndk
		msg = 'Building dataframe for array %s'%(array)
		gpar.log(__name__, msg, level='info',pri=True)
		for eve in eves:
			origin = eve.origins[0]
			focal = eve.focal_mechanisms[0]
			tensor = focal.moment_tensor.tensor
			mag = eve.magnitudes[0]

			#event origin information
			time = origin.time
			lat = origin.latitude
			lon = origin.longitude
			dep = origin.depth/1000.0

			Mw = mag.mag

			# Event moment tensor
			# original in RPT coordinate, transform to XYZ coordinate
			mxx = tensor.m_tt
			myy = tensor.m_pp
			mxy = -tensor.m_tp
			myz = -tensor.m_rp
			mzx = tensor.m_rt
			mzz = tensor.m_rr

			newRow = {'TIME':time, 'LAT':lat,'LON':lon,'DEP':dep,
					  'Mw':Mw,'DIR':str(time),
					  'mxx':mxx,'mxy':mxy,'mzx':mzx,
					  'myy':myy,'myz':myz,'mzz':mzz}

			evedf = evedf.append(newRow, ignore_index=True)
	elif isinstance(ndk, pd.DataFrame):
		evedf = ndk.copy()
	else:
		msg = 'Not a valid type of ndk, must be a path to a ndk file or a obspy Catalog instance'%(ndk)
		gpar.log(__name__,msg,level='error',pri=True)

	# Great circle distance from events to array
	msg = 'Calculating distance for earthquakes to array %s'%(array)
	gpar.log(__name__, msg, level='info',pri=True)
	great_circle_distance_in_degree, azimuth, bakAzimuth = calc_Dist_Azi(evedf.LAT,evedf.LON,Olat,Olon)

	evedf['DIS'] = np.around(great_circle_distance_in_degree, decimals=2)
	evedf['Az'] = np.around(azimuth, decimals=2)
	evedf['Baz'] = np.around(bakAzimuth, decimals=2)
	msg = 'Selecting distance from %.2f to %.2f'%(mindis, maxdis)
	gpar.log(__name__, msg, level='info',pri=True)
	evedf = evedf[(evedf.DIS >= mindis) & (evedf.DIS <= maxdis)]

	if minmag is not None:
		msg = 'Selecting magnitude larger than %s'%(minmag)
		gpar.log(__name__, msg, level='info',pri=True)
		evedf = evedf[evedf.Mw > minmag]
	# calculate ray parameters using obspy.taup
	evedf.reset_index(drop=True, inplace=True)
	ray = [' ']*len(evedf)
	ray_radian = [' ']*len(evedf)
	takeoff_angle = [' ']*len(evedf)
	for ind, row in evedf.iterrows():
		# print('getting travel time for %dth event in array %s'%(ind, array))
		dep = row.DEP
		dis = row.DIS

		try:
			arr = model.get_travel_times(source_depth_in_km=dep,distance_in_degree=dis,phase_list=phase)[0]
			ray[ind] = float("{0:.3f}".format(arr.ray_param_sec_degree))
			ray_radian[ind] = float("{0:.3f}".format(arr.ray_param))
			takeoff_angle[ind] = float("{0:.3f}".format(arr.takeoff_angle))
		except:
			msg = ('Problem to calculate ray parameter for eve %s to array %s, set to -999'%(row.DIR, array))
			gpar.log(__name__, msg, level='warning',pri=True)
			ray[ind] = -999
			ray_radian[ind] = -999
			takeoff_angle[ind] = -999



	evedf['Rayp'] = ray
	evedf['Rayp_rad'] = ray_radian
	evedf['Angle'] = takeoff_angle

	# Calculater radiation pattern from moment tensor, ray parameter and takeoff angle
	radiation_pattern = _calRadiation(evedf.mxx,evedf.myy,evedf.mzz,
										evedf.mxy,evedf.myz,evedf.mzx,
										evedf.Angle,evedf.Az)

	evedf['BB'] = np.around(radiation_pattern, decimals=2)

	#df = evedf.copy()

	cols = ['TIME', 'LAT', 'LON', 'DEP', 'Mw', 'DIS', 'Az', 'Baz','Rayp', 'BB', 'Angle','DIR']
	evedf.drop(columns=['mxx','mxy','mzx','myy','myz','mzz','Rayp_rad','exp'], inplace=True)
	#df.reset_index(inplace=True)
	name = 'eq.'+array + '.list'
	name = os.path.join(array,name)
	evedf.to_csv(name, sep=str('\t'), index=False)

	return evedf
示例#14
0
文件: getdata.py 项目: gnpang/gPar
def _loadDirectoryData(arrayName, df, mode,minlen,verb,channel='Z'):

	staDf = pd.DataFrame(columns=['STA', 'LAT', 'LON'])
	if mode == 'eq':
		stream = [''] * len(df)
		numtr = [''] * len(df)
	elif mode == 'db':
		stream1 = [''] * len(df)
		stream2 = [''] * len(df)
	else:
		msg = ('Not a valid option for earthquake type, choose eq or db')
		gpar.log(__name__, msg, level='error', pri=True)
	for ind, eve in df.iterrows():
		if mode == 'eq':
			_id = eve.DIR[:-6]
			if verb:
				print('loading data %s:%s'%(arrayName, eve.DIR))
			sacfiles = os.path.join(arrayName, 'Data', eve.DIR, _id+'*'+channel+'.sac')
			try:
				st = read(sacfiles)
			except:
				msg = 'data from %s in array %s is not found, skipping' % (arrayName,eve.DIR)
				gpar.log(__name__,msg,level='warning',pri=True)
				stream[ind] = pd.NaT
				continue
			for tr in st:
				if not hasattr(tr.stats, 'sac'):
					msg = ("Trace for %s in station %s doesn's have SAC attributes, removing" % (eve, tr.stats.station))
					st.remove(tr)
					gpar.log(__name__,msg,level='warning',e=ValueError)
					continue
				if not hasattr(tr.stats.sac, 'stla') or not hasattr(tr.stats.sac, 'stlo'):
					msg = ("Trace for %s in station %s doesn's have station information, removing" % (eve.DIR, tr.stats.station))
					st.remove(tr)
					gpar.log(__name__,msg,level='warning',e=ValueError)
					continue
				data = tr.data
				if np.std(data) < 0.1:
					msg = ("Trace data for %s in station %s has std smaller than 0.1, removing" % (eve.DIR, tr.stats.station))
					st.remove(tr)
					gpar.log(__name__,msg,level='warning',e=ValueError)
					continue

				staDf = _checkSta(tr, staDf)

			if len(st) == 0:
				msg = ("Waveforms for event %s have problem" % eve.DIR)
				gpar.log(__name__,msg,level='warning')
				st = None
			st = _checkData(st,minlen)
			stream[ind] = st
			if st == None:
				numtr[ind] = 0
			else:
				numtr[ind] = len(st)
		elif mode == 'db':
			if verb:
				print('loading data %s: %s'%(arrayName, eve.DoubleID))
			_id1 = eve.DIR1[:-6]
			_id2 = eve.DIR2[:-6]
			sacfile1 = os.path.join(arrayName, 'Data', eve.DIR1, _id1+'*'+channel+'.sac')
			sacfile2 = os.path.join(arrayName, 'Data', eve.DIR2, _id2+'*'+channel+'.sac')
			try:
				st1 = read(sacfile1)
			except:
				msg = 'data from %s in array %s is not found, skipping' % (arrayName,eve.DIR1)
				gpar.log(__name__,msg,level='warning',pri=True)
				stream1[ind] = pd.NaT
				continue
			try:
				st2 = read(sacfile2)
			except:
				msg = 'data from %s in array %s is not found, skipping' % (arrayName,eve.DIR2)
				gpar.log(__name__,msg,level='warning',pri=True)
				stream2[ind] = pd.NaT
				continue
			st1 = _checkData(st1,minlen)
			st2 = _checkData(st2,minlen)
			if st1 != None:
				for tr in st1:
					staDf = _checkSta(tr,staDf)
			if st2 != None:
				for tr in st2:
					staDf = _checkSta(tr,staDf)
			stream1[ind] = st1
			stream2[ind] = st2
	if mode == 'eq':
		df['Stream'] = stream
		df['NTR'] = numtr
	elif mode == 'db':
		df['ST1'] = stream1
		df['ST2'] = stream2
	df.dropna(inplace=True)
	df.reset_index(drop=True, inplace=True)

	return df, staDf
示例#15
0
文件: build.py 项目: gnpang/gPar
def createArray(arrayList='array.list',
                savecarray=True,
                fileName='array.pkl',
                model='ak135',
                channel='Z',
                beamphase='PKiKP',
                coordsys='lonlat',
                calTime=False,
                save=True,
                saveName=False,
                mode='eq',
                minlen=1500,
                tshift=5,
                cut=5,
                phase_list=['P', 'PP', 'PcP', 'ScP', 'PKiKP', 'SP', 'ScS'],
                verb=False,
                **kwargs):
    """
	Function to create the Array instance
	"""

    arraydf = util.readList(arrayList, list_type='array', sep='\s+')

    arDF = pd.DataFrame(columns=['NAME', 'ARRAY'])
    for ind, row in arraydf.iterrows():
        # eqlist = os.path.join(row.NAME,'eq.'+row.NAME+'.list')
        # if not os.path.exists(eqlist):
        # 	msg = ('Earthquake list for array %s is not exists, building from ndk file' % row.NAME)
        # 	gpar.log(__name__,msg,level='warning',pri=True)
        # 	if 'ndkfile' not in kwargs.keys():
        # 		msg = ('input the ndkfile and related parameters (see getdata.makeEventList) for building earthquake list')
        # 		gpar.log(__name__, msg, level='error', pri=True)
        # 	if not os.path.isfile(ndkfile):
        # 		msg = ('ndk file does not exist')
        # 		gpar.log(__name__,msg, level='error', pri=True)

        # 	ndkfile = kwargs['ndkfile']
        # 	eqdf = gpar.getdata.makeEventList(ndkfile=ndkfile,array=row.NAME,Olat=row.LAT,Olon=row.LON,
        # 									  model=model,phase=phase)
        # else:
        # 	eqdf = util.readList(eqlist,list_type='event',sep='\s+')
        refpoint = [row.LAT, row.LON]
        fet = gpar.getdata.quickFetch(row.NAME)
        # streams = [''] * len(eqdf)
        # for num, eve in eqdf.iterrows():
        # 	st = fet.getStream(eve.DIR)
        # 	streams[num] = st
        # eqdf['Stream'] = streams
        eqdf, stadf = fet.getEqData(row,
                                    phase=beamphase,
                                    mode=mode,
                                    minlen=minlen,
                                    channel=channel,
                                    verb=verb,
                                    **kwargs)
        if eqdf is None:
            msg = 'Earthquake list for array %s is not existed, skipping' % (
                row.NAME)
            gpar.log(__name__, msg, level='warning', pri=True)
            continue
        if mode == 'eq':
            eqdf = eqdf[eqdf.NTR >= cut]
            eqdf.reset_index(drop=True, inplace=True)
            array = gpar.arrayProcess.Array(row.NAME,
                                            refpoint,
                                            eqdf,
                                            stadf,
                                            coordsys,
                                            beamphase,
                                            isDoublet=False,
                                            phase_list=phase_list)

            if calTime:
                msg = (
                    'Calculate time shift table for sliding window slowness beaforming for array %s'
                    % row.NAME)
                gpar.log(__name__, msg, level='info', pri=True)

                req_pa = set(
                    ['sll_x', 'sll_y', 'sl_s', 'grdpts_x', 'grdpts_y', 'unit'])

                if not req_pa.issubset(kwargs.keys()):
                    msg = (
                        'Required parameters %s for time shift table are missing\nusing default parameters sll_x=-15, sll_y=-15, sl_s=0.1,grdpts_x=301, grdpts_y=301, unit="deg"'
                        % req_pa)
                    gpar.log(__name__, msg, level='info', pri=True)
                    array.getTimeTable()
                else:
                    sll_x = kwargs['sll_x']
                    sll_y = kwargs['sll_y']
                    sl_s = kwargs['sl_s']
                    grdpts_x = kwargs['grdpts_x']
                    grdpts_y = kwargs['grdpts_y']
                    unit = kwargs['unit']

                    array.getTimeTable(sll_x=sll_x,
                                       sll_y=sll_y,
                                       sl_s=sl_s,
                                       grdpts_x=grdpts_x,
                                       grdpts_y=grdpts_y,
                                       unit=unit)
        elif mode == 'db':
            req_pa = set([
                'rstime', 'retime', 'cstime', 'cetime', 'filt', 'domain',
                'fittype', 'rphase'
            ])
            if not req_pa.issubset(kwargs.keys()):
                msg = ('Required parameters %s for doublets are missing' %
                       req_pa)
                gpar.log(__name__, msg, level='error', pri=True)
            array = gpar.arrayProcess.Array(row.NAME,
                                            refpoint,
                                            eqdf,
                                            stadf,
                                            coordsys,
                                            beamphase,
                                            phase_list=phase_list,
                                            isDoublet=True,
                                            rstime=kwargs['rstime'],
                                            retime=kwargs['retime'],
                                            cstime=kwargs['cstime'],
                                            cetime=kwargs['cetime'],
                                            rphase=kwargs['rphase'],
                                            filt=kwargs['filt'],
                                            domain=kwargs['domain'],
                                            fittype=kwargs['fittype'],
                                            threshold=kwargs['threshold'],
                                            cut=cut,
                                            tshift=tshift)
        if save:
            array.write()

        newRow = {'NAME': row.NAME, 'ARRAY': array}

        arDF = arDF.append(newRow, ignore_index=True)

    if saveName:
        arDF.to_pickle(saveName)

    return arDF
示例#16
0
文件: build.py 项目: gnpang/gPar
def upDateArray(
        array,
        beamtype='beam',
        filts={
            'filt_1': [1, 2, 4, True],
            'filt_2': [2, 4, 4, True],
            'filt_3': [1, 3, 4, True]
        },
        starttime=0,
        endtime=1800,
        unit='deg',
        stack='linear',
        save=True,
        write=True,
        **kwargs):
    """
	Function to undate array processing to the array instance
	array: str or instance of gpar.arrayProcess.Array or DataFrame.
		If it is DataFrame, array name is needed as input of arrayName
	beamtype: str. Array processing that need to be done, avaliable now:
		'beam': normal beamforming
		'slide': sliding window beamforming.
		'vespectrum': vespectrum for seleceted array. If choose, vary for slowness or back azimuth needs to be choose either. Default vary ="slowness"
	"""

    if isinstance(array, gpar.arrayProcess.Array):
        ar = array
    elif isinstance(array, str):
        ar = util.loadArray(array)
    elif isinstance(array, pd.DataFrame):
        tmp = array[array.NAME == kwargs['arrayName']].iloc[0]
        ar = tmp.ARRAY
    else:
        msg = (
            'Not a valid array type, must be a path, Array instance or a DataFrame that has Array instance\nif is DataFrame, arrayName is needed'
        )
        gpar.log(__name__, msg, level='error', pri=True)

    if beamtype == 'beam':
        winlen = endtime - starttime
        ar.beamforming(filts=filts,
                       starttime=starttime,
                       winlen=winlen,
                       stack=stack,
                       unit=unit,
                       write=write)
        if save:
            fileName = ar.name + '.beam.pkl'
            ar.write(fileName)
    elif beamtype == 'slide':
        req_pa = set([
            'sll_x', 'sll_y', 'sl_s', 'grdpts_x', 'grdpts_y', 'winlen',
            'overlap', 'sflag', 'refine'
        ])
        if not req_pa.issubset(kwargs.keys()):
            msg = (
                'Required parameters %s for sliding beamforming are missing' %
                req_pa)
            gpar.log(__name__, msg, level='error', pri=True)
        sll_x = kwargs['sll_x']
        sll_y = kwargs['sll_y']
        sl_s = kwargs['sl_s']
        grdpts_x = kwargs['grdpts_x']
        grdpts_y = kwargs['grdpts_y']
        ar.getTimeTable(sll_x=sll_x,
                        sll_y=sll_y,
                        sl_s=sl_s,
                        grdpts_x=grdpts_x,
                        grdpts_y=grdpts_y,
                        unit=unit)
        ar.slideBeam(filts=filts,
                     stack=stack,
                     starttime=starttime,
                     endtime=endtime,
                     write=write,
                     **kwargs)
        if save:
            fileName = ar.name + '.slide.pkl'
            ar.write(fileName)
    elif beamtype == 'vespectrum':

        req_pa = set(['sl_s', 'grdpts', 'vary', 'sll'])
        if not req_pa.issubset(kwargs.keys()):
            msg = ('Required parameters %s for vespectrum are missing' %
                   req_pa)
            gpar.log(__name__, msg, level='error', pri=True)
        ar.vespectrum(filts=filts,
                      stack=stack,
                      starttime=starttime,
                      endtime=endtime,
                      unit=unit,
                      **kwargs)
        if save:
            fileName = ar.name + '.veps.pkl'
            ar.write(fileName)
    elif beamtype == 'fk':
        req_pa = set([
            'sll_x', 'sll_y', 'sl_s', 'grdpts_x', 'grdpts_y', 'winlen',
            'overlap', 'freqmin', 'freqmax', 'prewhiten', 'method'
        ])
        if not req_pa.issubset(kwargs.keys()):
            msg = ('Required parameters %s for FK are missing' % req_pa)
            gpar.log(__name__, msg, level='error', pri=True)
        ar.getTimeTable(sll_x=sll_x,
                        sll_y=sll_y,
                        sl_s=sl_s,
                        grdpts_x=grdpts_x,
                        grdpts_y=grdpts_y,
                        unit=unit)
        ar.slideFK(starttime=starttime, endtime=endtime, write=write, **kwargs)
        if save:
            fileName = ar.name + 'fk.pkl'
            ar.write(fileName)
    else:
        msg = (
            'Not a valid array processing, choose from beam, slide or vespectrum'
        )
        gpar.log(__name__, msg, level='error', pri=True)

    return ar