Esempio n. 1
0
	def mccc(self, event):
		""" Run mccc.py  """
		gsac = self.gsac
		mcpara = self.opts.mcpara
		rcfile = mcpara.rcfile
		ipick = mcpara.ipick
		wpick = mcpara.wpick
		self.getWindow(ipick)
		timewindow = self.twcorr
		tw = timewindow[1]-timewindow[0]
		taperwindow = taperWindow(timewindow, mcpara.taperwidth)
		mcpara.timewindow = timewindow
		mcpara.taperwindow = taperwindow
		evline, mcname = eventListName(gsac.event, mcpara.phase)
		mcpara.evline = evline
		mcpara.mcname = mcname
		mcpara.kevnm = gsac.kevnm
		solution, solist_LonLat, delay_times = mccc(gsac, mcpara)
		self.gsac.solist_LonLat = solist_LonLat
		self.gsac.delay_times = delay_times

		wpk = int(wpick[1])
		if self.opts.reltime != wpk:
			out = '\n--> change opts.reltime from %i to %i'
			print out % (self.opts.reltime, wpk)
		self.opts.reltime = wpk
		self.replot()
Esempio n. 2
0
	def finalizeButtonClicked(self):
		self.getWindow(self.opts.mcpara.ipick)
		tw = self.opts.ccpara.twcorr[1] - self.opts.ccpara.twcorr[0]
		taperwindow = taperWindow(self.opts.ccpara.twcorr, self.opts.mcpara.taperwidth)
		self.opts.mcpara.timewindow = self.opts.ccpara.twcorr
		self.opts.mcpara.taperwindow = taperwindow
		evline, mcname = eventListName(self.sacgroup.event, self.opts.mcpara.phase)
		self.opts.mcpara.evline = evline
		self.opts.mcpara.mcname = mcname
		self.opts.mcpara.kevnm = self.sacgroup.kevnm

		# move stkdh into sacgroup
		self.sacgroup.stkdh = self.stkdh

		solution, solist_LonLat, delay_times = mccc(self.sacgroup, self.opts.mcpara)
		self.sacgroup.solist_LonLat = solist_LonLat
		self.sacgroup.delay_times = delay_times

		self.addTimePick(self.stackedPlot, self.stkdh.gethdr(self.opts.mcpara.wpick), self.opts.mcpara.wpick)
		for plt in self.plotList:
			self.addTimePick(plt, plt.sacdh.gethdr(self.opts.mcpara.wpick), self.opts.mcpara.wpick)

		wpk = int(self.opts.mcpara.wpick[1])
		if self.opts.reltime != wpk:
			out = '\n--> change opts.reltime from %i to %i'
			print out % (self.opts.reltime, wpk)
		self.opts.reltime = wpk

		self.stackedPlot.sacdh = self.stkdh
		self.redrawTimePicks(self.stackedPlot)
		self.scalePlotXRange(self.stackedPlot)
		for plt in self.plotList:
			self.redrawTimePicks(plt)
			self.scalePlotXRange(plt)
Esempio n. 3
0
 def mccc(self, event):
     """ Run mccc.py  """
     gsac = self.gsac
     mcpara = self.opts.mcpara
     rcfile = mcpara.rcfile
     ipick = mcpara.ipick
     wpick = mcpara.wpick
     self.getWindow(ipick)
     timewindow = self.twcorr
     tw = timewindow[1] - timewindow[0]
     taperwindow = taperWindow(timewindow, mcpara.taperwidth)
     mcpara.timewindow = timewindow
     mcpara.taperwindow = taperwindow
     evline, mcname = eventListName(gsac.event, mcpara.phase)
     mcpara.evline = evline
     mcpara.mcname = mcname
     mcpara.kevnm = gsac.kevnm
     # rcwrite(ipick, timewindow, taperwindow, rcfile)
     solution = mccc(gsac, mcpara)
     wpk = int(wpick[1])
     if self.opts.reltime != wpk:
         out = "\n--> change opts.reltime from %i to %i"
         print out % (self.opts.reltime, wpk)
     self.opts.reltime = wpk
     self.replot()
Esempio n. 4
0
def getWindow(stkdh, ipick, twhdrs, taperwidth=0.1):
    """ Get timewindow and taperwindow from gsac.stkdh """
    tw0, tw1 = twhdrs
    t0 = stkdh.gethdr(ipick)
    th0 = stkdh.gethdr(tw0) - t0
    th1 = stkdh.gethdr(tw1) - t0
    timewindow = [th0, th1]
    taperwindow = taperWindow(timewindow, taperwidth)
    return timewindow, taperwindow
Esempio n. 5
0
def getWindow(stkdh, ipick, twhdrs, taperwidth=0.1):
	""" Get timewindow and taperwindow from gsac.stkdh """	
	tw0, tw1 = twhdrs
	t0 = stkdh.gethdr(ipick)
	th0 = stkdh.gethdr(tw0) - t0
	th1 = stkdh.gethdr(tw1) - t0
	timewindow = [th0, th1]
	taperwindow = taperWindow(timewindow, taperwidth)
	return timewindow, taperwindow
Esempio n. 6
0
    def finalizeButtonClicked(self):
        self.getWindow(self.opts.mcpara.ipick)
        tw = self.opts.ccpara.twcorr[1] - self.opts.ccpara.twcorr[0]
        taperwindow = taperWindow(self.opts.ccpara.twcorr,
                                  self.opts.mcpara.taperwidth)
        self.opts.mcpara.timewindow = self.opts.ccpara.twcorr
        self.opts.mcpara.taperwindow = taperwindow
        evline, mcname = eventListName(self.sacgroup.event,
                                       self.opts.mcpara.phase)
        self.opts.mcpara.evline = evline
        self.opts.mcpara.mcname = mcname
        self.opts.mcpara.kevnm = self.sacgroup.kevnm

        # move stkdh into sacgroup
        self.sacgroup.stkdh = self.stkdh

        solution, solist_LonLat, delay_times = mccc(self.sacgroup,
                                                    self.opts.mcpara)
        self.sacgroup.solist_LonLat = solist_LonLat
        self.sacgroup.delay_times = delay_times

        self.addTimePick(self.stackedPlot,
                         self.stkdh.gethdr(self.opts.mcpara.wpick),
                         self.opts.mcpara.wpick)
        for plt in self.plotList:
            self.addTimePick(plt, plt.sacdh.gethdr(self.opts.mcpara.wpick),
                             self.opts.mcpara.wpick)

        wpk = int(self.opts.mcpara.wpick[1])
        if self.opts.reltime != wpk:
            out = '\n--> change opts.reltime from %i to %i'
            print out % (self.opts.reltime, wpk)
        self.opts.reltime = wpk

        self.stackedPlot.sacdh = self.stkdh
        self.redrawTimePicks(self.stackedPlot)
        self.scalePlotXRange(self.stackedPlot)
        for plt in self.plotList:
            self.redrawTimePicks(plt)
            self.scalePlotXRange(plt)
Esempio n. 7
0
def ccWeightStack(saclist, opts):
    """ 
	Align seismograms by the iterative cross-correlation and stack algorithm.

	Parameters
	----------
	opts.delta : sample time interval
	opts.ccpara : a class instance for ICCS parameters 
		* qqhdrs : SAC headers to save quality factors: ccc, snr, coh
		* maxiter :	maximum number of iteration
		* converg :	convergence critrion
		* cchdrs : inputand output picks of cross-correlation
		* twcorr : time window for cross-correlation
	"""
    ccpara = opts.ccpara
    delta = opts.delta
    maxiter = ccpara.maxiter
    convtype = ccpara.convtype
    convepsi = ccpara.convepsi
    taperwidth = ccpara.taperwidth
    tapertype = ccpara.tapertype
    xcorr = ccpara.xcorr
    shift = ccpara.shift
    twhdrs = ccpara.twhdrs
    qqhdrs = ccpara.qheaders
    cchdrs = ccpara.cchdrs
    twcorr = ccpara.twcorr
    hdrccc, hdrsnr, hdrcoh, = qqhdrs[:3]
    cchdr0, cchdr1 = cchdrs
    if convtype == 'coef':
        convergence = coConverg
    elif convtype == 'resi':
        convergence = reConverg
    else:
        print('Unknown convergence criterion: {:s}. Exit.'.format(convtype))
        sys.exit()

    out = '\n--> Run ICCS at window [{0:5.1f}, {1:5.1f}] wrt {2:s}. Write to header: {3:s}'
    print(out.format(twcorr[0], twcorr[1], cchdr0, cchdr1))
    print('    Convergence criterion: {:s}'.format(convtype))
    if ccpara.stackwgt == 'coef':
        wgtcoef = True
    else:
        wgtcoef = False
    taperwindow = taperWindow(twcorr, taperwidth)
    # get initial time picks
    tinis = array([sacdh.gethdr(cchdr0) for sacdh in saclist])
    tfins = tinis.copy()
    nseis = len(saclist)
    ccc = zeros(nseis)
    snr = zeros(nseis)
    coh = zeros(nseis)
    wgts = ones(nseis)
    stkdata = []
    for it in list(range(maxiter)):
        # recut data and update array stack
        nstart, ntotal = windowIndex(saclist, tfins, twcorr, taperwindow)
        windata = windowData(saclist, nstart, ntotal, taperwidth, tapertype)
        sdata = normWeightStack(windata, wgts, taperwidth, tapertype)
        stkdata.append(sdata)
        if it == 0:
            print('=== Iteration {0:d} : epsilon'.format(it))
        else:
            conv = convergence(stkdata[it], stkdata[it - 1])
            print('=== Iteration {0:d} : {1:8.6f}'.format(it, conv))
            if conv <= convepsi:
                print('Array stack converged... Done. Mean corrcoef={0:.3f}'.
                      format(mean(ccc)))
                break
        # Find time lag at peak correlation between each trace and the array stack.
        # Calculate cross correlation coefficient, signal/noise ratio and temporal coherence
        sdatanorm = sdata / LA.norm(sdata)
        for i in list(range(nseis)):
            datai = windata[i]
            delay, ccmax, ccpol = corrmax(sdata, datai, delta, xcorr, shift)
            tfins[i] += delay
            sacdh = saclist[i]
            sacdh.sethdr(cchdr1, tfins[i])
            if wgtcoef:  # update weight only when stackwgt == coef
                wgts[i] = ccpol * ccmax
            ccc[i] = ccmax
            sacdh.sethdr(hdrccc, ccc[i])
            snr[i] = snratio(datai, delta, twcorr)
            sacdh.sethdr(hdrsnr, snr[i])
            coh[i] = coherence(datai * ccpol, sdatanorm)
            sacdh.sethdr(hdrcoh, coh[i])
    # get maximum time window for plot (excluding taperwindow)
    bb, ee = [], []
    for i in list(range(nseis)):
        sacdh = saclist[i]
        b = sacdh.b - tfins[i]
        e = b + (sacdh.npts - 1) * delta
        bb.append(b + delta)
        ee.append(e - delta)
    b = max(bb)
    e = min(ee)
    d = (e - b) * taperwidth / 2
    twplot = [b + d, e - d]
    # calculate final stack at twplot, save to a sacdh object: stkdh
    # set time picks of stkdh as mean of tinis and tfins
    taperwindow = taperWindow(twplot, taperwidth)
    nstart, ntotal = windowIndex(saclist, tfins, twplot, taperwindow)
    windata = windowData(saclist, nstart, ntotal, taperwidth, tapertype)
    sdata = normWeightStack(windata, wgts, taperwidth, tapertype)
    tinimean = mean(tinis)
    tfinmean = mean(tfins)
    stkdh = copy.copy(saclist[0])
    stkdh.thdrs = [
        -12345.,
    ] * 10
    stkdh.users = [
        -12345.,
    ] * 10
    stkdh.kusers = [
        '-12345  ',
    ] * 3
    stkdh.b = twplot[0] - taperwindow * 0.5 + tfinmean
    stkdh.npts = len(sdata)
    stkdh.data = sdata
    stkdh.sethdr(cchdr0, tinimean)
    stkdh.sethdr(cchdr1, tfinmean)
    stkdh.knetwk = 'Array   '
    stkdh.kstnm = 'Stack   '
    stkdh.netsta = 'Array.Stack'
    stkdh.gcarc = -1
    stkdh.dist = -1
    stkdh.baz = -1
    stkdh.az = -1
    # set time window
    stkdh.sethdr(twhdrs[0], twcorr[0] + tfinmean)
    stkdh.sethdr(twhdrs[1], twcorr[1] + tfinmean)
    if opts.fstack is None:
        stkdh.filename = ccpara.fstack
    else:
        stkdh.filename = opts.fstack
    for sacdh, tfin in zip(saclist, tfins):
        sacdh.sethdr(twhdrs[0], tfin + twcorr[0])
        sacdh.sethdr(twhdrs[1], tfin + twcorr[1])
    quas = array([ccc, snr, coh])
    return stkdh, stkdata, quas
Esempio n. 8
0
def getParams(gsac, mcpara, opts=None):
    """ Get parameters for running MCCC.
		Hierarchy: default config < gsac < .mcccrc < command line options
	"""
    nsta = len(gsac.saclist)
    if nsta < 5:
        print('\n Less than five stations - stop')
        sys.exit()
    # get window from gsac.stkdh
    if 'stkdh' in gsac.__dict__:
        timewindow, taperwindow = getWindow(gsac.stkdh, mcpara.ipick,
                                            mcpara.twhdrs, mcpara.taperwidth)
        mcpara.timewindow = timewindow
        mcpara.taperwindow = taperwindow

    # use options saved in gsac
    gdict = gsac.__dict__
    odict = opts.__dict__
    mdict = mcpara.__dict__
    for key in [
            'phase', 'ipick', 'wpick', 'timewindow', 'taperwindow',
            'taperwidth'
    ]:
        if key in gdict:
            mdict[key] = gdict[key]
    # read rcfile (.mcccrc) if there is any
    rcfile = mcpara.rcfile
    if os.path.isfile(rcfile):
        ipick, timewindow, taperwindow = rcread(rcfile)
        wpick = ipick[0] + str(int(ipick[1]) + 1)
        mcpara.ipick = ipick
        mcpara.wpick = wpick
        mcpara.timewindow = timewindow
        mcpara.taperwindow = taperwindow
        tw = timewindow[1] - timewindow[0]
        mcpara.taperwidth = taperwindow / (tw + taperwindow)
    # command line options override config and rc file
    if opts is not None:
        for key in odict.keys():
            if odict[key] is not None:
                mdict[key] = odict[key]
    # check if params are complete
    if 'phase' not in mdict:
        print('\n No phase name given - stop')
        sys.exit()
    if 'timewindow' not in mdict:
        if 'window' in mdict and 'inset' in mdict:
            win, ins = mdict['window'], mdict['inset']
            mcpara.timewindow = [-ins, win - ins]
            if 'taper' in mdict:
                mcpara.taperwindow = mdict['taper']
            else:
                mcpara.taperwindow = taperWindow(mcpara.timewindow,
                                                 mcpara.taperwidth)
        else:
            print('No window and inset length give - stop')
            sys.exit()
    # get event info from either event.list or gsac
    if not os.path.isfile(mcpara.evlist):
        mcpara.evlist = gsac.event
    evline, mcname = eventListName(mcpara.evlist, mcpara.phase)
    mcpara.evline = evline
    mcpara.mcname = mcname
    mcpara.kevnm = gsac.kevnm
    if mcpara.ofilename != 'mc':
        mcpara.mcname = mcpara.ofilename
    gsac.mcname = mcpara.mcname
Esempio n. 9
0
def getParams(gsac, mcpara, opts=None):
	""" Get parameters for running MCCC.
		Hierarchy: default config < gsac < .mcccrc < command line options
	"""
	nsta = len(gsac.saclist)
	if nsta < 5:
		print ('\n Less than five stations - stop')
		sys.exit()	
	# get window from gsac.stkdh
	if 'stkdh' in gsac.__dict__:
		timewindow, taperwindow = getWindow(gsac.stkdh, mcpara.ipick, mcpara.twhdrs, mcpara.taperwidth)
		mcpara.timewindow = timewindow
		mcpara.taperwindow = taperwindow

	# use options saved in gsac
	gdict = gsac.__dict__
	odict = opts.__dict__
	mdict = mcpara.__dict__
	for key in ['phase', 'ipick', 'wpick', 'timewindow', 'taperwindow', 'taperwidth']:
		if key in gdict:
			mdict[key] = gdict[key]
	# read rcfile (.mcccrc) if there is any
	rcfile = mcpara.rcfile
	if os.path.isfile(rcfile):
		ipick, timewindow, taperwindow = rcread(rcfile)
		wpick = ipick[0] + str(int(ipick[1])+1)
		mcpara.ipick = ipick
		mcpara.wpick = wpick
		mcpara.timewindow = timewindow
		mcpara.taperwindow = taperwindow
		tw = timewindow[1] - timewindow[0]
		mcpara.taperwidth = taperwindow/(tw+taperwindow)
	# command line options override config and rc file
	if opts is not None:
		for key in list(odict.keys()):
			if odict[key] is not None:
				mdict[key] = odict[key]
	# check if params are complete
	if 'phase' not in mdict:
		print ('\n No phase name given - stop')
		sys.exit()
	if 'timewindow' not in mdict:
		if 'window' in mdict and 'inset' in mdict:
			win, ins = mdict['window'], mdict['inset']
			mcpara.timewindow = [-ins, win-ins]
			if 'taper' in mdict:
				mcpara.taperwindow = mdict['taper']
			else:
				mcpara.taperwindow = taperWindow(mcpara.timewindow, mcpara.taperwidth)
		else:
			print ('No window and inset length give - stop')
			sys.exit()
	# get event info from either event.list or gsac
	if not os.path.isfile(mcpara.evlist):
		mcpara.evlist = gsac.event
	evline, mcname = eventListName(mcpara.evlist, mcpara.phase)
	mcpara.evline = evline
	mcpara.mcname = mcname
	mcpara.kevnm = gsac.kevnm
	if mcpara.ofilename != 'mc':
		mcpara.mcname = mcpara.ofilename
	gsac.mcname = mcpara.mcname
Esempio n. 10
0
def ccWeightStack(saclist, opts):
	""" 
	Align seismograms by the iterative cross-correlation and stack algorithm.

	Parameters
	----------
	opts.delta : sample time interval
	opts.ccpara : a class instance for ICCS parameters 
		* qqhdrs : SAC headers to save quality factors: ccc, snr, coh
		* maxiter :	maximum number of iteration
		* converg :	convergence critrion
		* cchdrs : inputand output picks of cross-correlation
		* twcorr : time window for cross-correlation
	"""
	ccpara = opts.ccpara
	delta = opts.delta
	maxiter = ccpara.maxiter
	convtype = ccpara.convtype
	convepsi = ccpara.convepsi
	taperwidth = ccpara.taperwidth
	tapertype = ccpara.tapertype
	xcorr = ccpara.xcorr
	shift = ccpara.shift
	twhdrs = ccpara.twhdrs
	qqhdrs = ccpara.qheaders
	cchdrs = ccpara.cchdrs
	twcorr = ccpara.twcorr
	hdrccc, hdrsnr, hdrcoh, = qqhdrs[:3]
	cchdr0, cchdr1 = cchdrs
	if convtype == 'coef':
		convergence = coConverg
	elif convtype == 'resi':
		convergence = reConverg
	else:
		print('Unknown convergence criterion: {:s}. Exit.'.format(convtype))
		sys.exit()
	
	out = '\n--> Run ICCS at window [{0:5.1f}, {1:5.1f}] wrt {2:s}. Write to header: {3:s}'
	print(out.format(twcorr[0], twcorr[1], cchdr0, cchdr1))
	print('    Convergence criterion: {:s}'.format(convtype))
	if ccpara.stackwgt == 'coef':
		wgtcoef = True
	else:
		wgtcoef = False
	taperwindow = taperWindow(twcorr, taperwidth)
	# get initial time picks
	tinis = array([ sacdh.gethdr(cchdr0) for sacdh in saclist])
	tfins = tinis.copy()
	nseis = len(saclist)
	ccc = zeros(nseis)
	snr = zeros(nseis)
	coh = zeros(nseis)
	wgts = ones(nseis)
	stkdata = []
	for it in range(maxiter):
		# recut data and update array stack
		nstart, ntotal = windowIndex(saclist, tfins, twcorr, taperwindow)
		windata = windowData(saclist, nstart, ntotal, taperwidth, tapertype)
		sdata = normWeightStack(windata, wgts, taperwidth, tapertype)
		stkdata.append(sdata)
		if it == 0:
			print ('=== Iteration {0:d} : epsilon'.format(it))
		else:
			conv = convergence(stkdata[it], stkdata[it-1])
			print ('=== Iteration {0:d} : {1:8.6f}'.format(it, conv))
			if conv <= convepsi:
				print ('Array stack converged... Done. Mean corrcoef={0:.3f}'.format(mean(ccc)))
				break
		# Find time lag at peak correlation between each trace and the array stack.
		# Calculate cross correlation coefficient, signal/noise ratio and temporal coherence
		sdatanorm = sdata/l2norm(sdata)
		for i in range(nseis):
			datai = windata[i]
			delay, ccmax, ccpol = corrmax(sdata, datai, delta, xcorr, shift)
			tfins[i] += delay
			sacdh = saclist[i]
			sacdh.sethdr(cchdr1, tfins[i])
			if wgtcoef:	# update weight only when stackwgt == coef
				wgts[i] = ccpol * ccmax
			ccc[i] = ccmax
			sacdh.sethdr(hdrccc, ccc[i])
			snr[i] = snratio(datai, delta, twcorr)
			sacdh.sethdr(hdrsnr, snr[i])
			coh[i] = coherence(datai*ccpol, sdatanorm)
			sacdh.sethdr(hdrcoh, coh[i])
	# get maximum time window for plot (excluding taperwindow)
	bb, ee = [], []
	for i in range(nseis):
		sacdh = saclist[i]
		b = sacdh.b - tfins[i]
		e = b + (sacdh.npts-1)* delta
		bb.append(b+delta)
		ee.append(e-delta)
	b = max(bb)
	e = min(ee)
	d = (e-b)*taperwidth/2
	twplot = [b+d, e-d]
	# calculate final stack at twplot, save to a sacdh object: stkdh
	# set time picks of stkdh as mean of tinis and tfins
	taperwindow = taperWindow(twplot, taperwidth)
	nstart, ntotal = windowIndex(saclist, tfins, twplot, taperwindow)
	windata = windowData(saclist, nstart, ntotal, taperwidth, tapertype)
	sdata = normWeightStack(windata, wgts, taperwidth, tapertype)
	tinimean = mean(tinis)
	tfinmean = mean(tfins)
	stkdh = copy.copy(saclist[0])
	stkdh.thdrs = [-12345.,] * 10
	stkdh.users = [-12345.,] * 10
	stkdh.kusers = ['-12345  ',] * 3
	stkdh.b = twplot[0] - taperwindow*0.5 + tfinmean
	stkdh.npts = len(sdata)
	stkdh.data = sdata
	stkdh.sethdr(cchdr0, tinimean)
	stkdh.sethdr(cchdr1, tfinmean)
	stkdh.knetwk = 'Array   '
	stkdh.kstnm = 'Stack   '
	stkdh.netsta = 'Array.Stack'
	stkdh.gcarc = -1
	stkdh.dist = -1
	stkdh.baz = -1
	stkdh.az = -1
	# set time window
	stkdh.sethdr(twhdrs[0], twcorr[0]+tfinmean)
	stkdh.sethdr(twhdrs[1], twcorr[1]+tfinmean)
	if opts.fstack is None:
		stkdh.filename = ccpara.fstack
	else:
		stkdh.filename = opts.fstack
	for sacdh, tfin in zip(saclist, tfins):
		sacdh.sethdr(twhdrs[0], tfin+twcorr[0])
		sacdh.sethdr(twhdrs[1], tfin+twcorr[1])
	quas = array([ ccc, snr, coh ])
	return stkdh, stkdata, quas