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()
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)
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()
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
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
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
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
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