def __init__(self, claw, fmin=0.2, fmax=5., order=4.0, dt=1. / 12.): """ :param claw: Claw object, phase velocity dispersion laws :param fmin: lower frequency for butterworth or central freq for gaussian bandpass, (Hz) :param fmax: upper frequency for butterworth or central freq for gaussian bandpass, (Hz) :param order: filter order for butterworth or gaussian bandpass :param dt: sampling interval (s) """ self.c = claw # self.fmin = fmin # 0.2 self.fmax = fmax # 5. self.order = order # 4. self.dt = dt # 1. / 12. assert self.fmax <= 0.5 / self.dt # nyquist criterion if self.fmin < self.fmax: f = freqspace(self.fmin, self.fmax, 100, 'flog') c = self.c(f) self.cmin, self.cmax = np.min(c), np.max(c) else: self.cmin = self.cmax = self.c(self.fmin)
def __init__(self, claws, fmin=0.2, fmax=5., order=4.0, dt=1. / 12.): # , proj = mp): """ :param claws: list of Claw objects, phase velocity dispersion laws, first one must have interpolationmode = to 0 :param fmin: lower frequency for butterworth or central freq for gaussian bandpass, (Hz) :param fmax: upper frequency for butterworth or central freq for gaussian bandpass, (Hz) :param order: filter order for butterworth or gaussian bandpass :param dt: sampling interval (s) """ self.claws = claws # self.fmin = fmin # 0.2 self.fmax = fmax # 5. self.order = order # 4. self.dt = dt # 1. / 12. assert self.fmax <= 0.5 / self.dt # nyquist criterion assert 0. < self.fmin < self.fmax # find lowest group velocities self.umin, self.umax = np.inf, -np.inf for claw in self.claws: ftmp = freqspace(self.fmin, self.fmax, 100, 'flog') utmp = claw.to_ulaw()(ftmp) utmp = utmp[~np.isnan(utmp)] if len(utmp): self.umin = np.min([self.umin, utmp.min()]) self.umax = np.max([self.umax, utmp.max()]) assert isfloat(self.umin) assert isfloat(self.umax) assert 0. <= self.umin <= self.umax print "group velocity range : %f - %fkm/s" % (self.umin, self.umax)
def target(argv, verbose): for k in argv.keys(): if k in ['main', "_keyorder"]: continue # private keys if k not in authorized_keys: raise Exception('option %s is not recognized' % k) # determine root names from target filess rootnames = [] for s96 in argv['main']: rootname = "_HerrMet_" + s96.split('/')[-1].split('.s96')[0].split( '.surf96')[0] rootnames.append(rootname) assert len(np.unique(rootnames)) == len( rootnames) # make sure all rootnames are distinct # handle already existing files if "-ot" not in argv.keys(): for rootname in rootnames: if os.path.exists('%s/_HerrMet.target' % rootname): raise Exception( 'file %s/_HerrMet.target exists already, use -ot to overwrite' % rootname) # loop over targets for rootname, s96 in zip(rootnames, argv['main']): # create directory if not os.path.isdir(rootname): os.mkdir(rootname) os.system('cp %s %s/%s.copy' % (s96, rootname, s96.split('/')[-1])) s = surf96reader(s96) # ------------------- if "-resamp" in argv.keys(): news = s.copy() news.clear() # clear all entries newf = freqspace(freqmin=float(argv["-resamp"][0]), freqmax=float(argv["-resamp"][1]), nfreq=int(argv["-resamp"][2]), scale=argv["-resamp"][3]) for law in s.get_all(): law.set_extrapolationmode(1) stdlaw = Claw(freq=law.freq, value=law.dvalue, extrapolationmode=0) newvalues = law(newf) newdvalues = stdlaw(newf) I = ~np.isnan(newvalues) if I.any(): N = I.sum() news.data['WAVE'] = np.concatenate( (news.data['WAVE'], np.array([law.wave]).repeat(N))) news.data['TYPE'] = np.concatenate( (news.data['TYPE'], np.array([law.type]).repeat(N))) news.data['FLAG'] = np.concatenate( (news.data['FLAG'], np.array([law.flag]).repeat(N))) news.data['MODE'] = np.concatenate( (news.data['MODE'], np.array([law.mode]).repeat(N))) news.data['PERIOD'] = np.concatenate( (news.data['PERIOD'], 1. / newf[I])) news.data['VALUE'] = np.concatenate( (news.data['VALUE'], newvalues[I])) news.data['DVALUE'] = np.concatenate( (news.data['DVALUE'], newdvalues[I])) s = news # print news # ------------------- if "-lunc" in argv.keys(): # set uncertainties to constant in log domain lunc = float(argv["-lunc"][0]) s.data['DVALUE'] = s.data['VALUE'] * lunc elif "-unc" in argv.keys(): # set uncertainties to constant in lin domain unc = float(argv["-unc"][0]) s.data['DVALUE'] = np.ones(len(s.data['VALUE'])) * unc # ------------------- if verbose: print "writing %s/_HerrMet.target" % rootname s.write96('%s/_HerrMet.target' % rootname) # ------------------- print "please keep only datapoints to invert in */_HerrMet.target" print "use option --display to see the target data"
def _display_function(rootname, argv, verbose, mapkwargs): """private""" targetfile = "%s/_HerrMet.target" % rootname paramfile = "%s/_HerrMet.param" % rootname runfile = '%s/_HerrMet.run' % rootname pngfile = '%s/_HerrMet.png' % rootname #HerrLininitfile = '%s/_HerrLin.init' % rootname # ------ Initiate the displayer using the target data if exists if "-compact" in argv.keys(): # compact mode which_displayer = DepthDispDisplayCompact else: which_displayer = DepthDispDisplay if os.path.exists(targetfile): rd = which_displayer(targetfile=targetfile) d = makedatacoder( targetfile, which=Datacoder_log) # datacoder based on observations dobs, _ = d.target() else: print "no target file found in %s" % rootname rd = which_displayer() # ------ Display run results if exist if os.path.exists(runfile) and ("-plot" in argv.keys() or "-pdf" in argv.keys()): with RunFile(runfile, verbose=verbose) as rundb: s = rundb.select('select MODELID from MODELS limit 1') if s is not None: # --- display best models if "-plot" in argv.keys(): assert argv["-plot"] == [] or len( argv["-plot"]) == 4 # unexpected argument number if argv["-plot"] == []: plot_mode, plot_limit, plot_llkmin, plot_step = \ default_plot_mode, default_plot_limit, \ default_plot_llkmin, default_plot_step elif len(argv['-plot']) == 4: plot_mode, plot_limit, plot_llkmin, plot_step = argv[ '-plot'] else: raise Exception() print "plot : %s, limit %d, llkmin %f, step %d" % ( plot_mode, plot_limit, plot_llkmin, plot_step), if plot_mode == "best": chainids, weights, llks, ms, ds = \ rundb.getzip(limit=plot_limit, llkmin=plot_llkmin, step=plot_step, algo="METROPOLIS") elif plot_mode == "last": chainids, weights, llks, ms, ds = \ rundb.getlastszip(limit=plot_limit, llkmin=plot_llkmin, step=plot_step, algo="METROPOLIS") else: raise Exception('unexpected plot mode %s' % plot_mode) vmin, vmax = llks.min(), llks.max() # colors = values2colors(llks, vmin=vmin, vmax=vmax, cmap=argv['-cmap']) if "-overdisp" in argv.keys(): """note : recomputing dispersion with another frequency array might result in a completely different dispersion curve in case of root search failure """ waves, types, modes, freqs, _ = ds[0] overwaves, overtypes, overmodes, _, _ = zip(*list( groupbywtm(waves, types, modes, freqs, np.arange(len(freqs)), None, True))) overfreqs = [ freqspace(0.6 * min(freqs), 1.4 * max(freqs), 100, "plog") for _ in xrange(len(overwaves)) ] overwaves, overtypes, overmodes, overfreqs = \ igroupbywtm(overwaves, overtypes, overmodes, overfreqs) for llk, (mms, dds) in zip( llks[::-1], overdisp(ms[::-1], overwaves, overtypes, overmodes, overfreqs, verbose=verbose, **mapkwargs)): # rd.plotmodel(color=clr, alpha=1.0, linewidth=3, *mms) rd.addmodel(colorvalue=llk, *mms) try: # rd.plotdisp(color=clr, alpha=1.0, linewidth=3, *dds) rd.adddisp(colorvalue=llk, *dds) except KeyboardInterrupt: raise except Exception as e: print "Error : could not plot dispersion curve (%s)" % str( e) # cb = makecolorbar(vmin=vmin, vmax=vmax, cmap=argv['-cmap']) # pos = rd.axdisp[-1].get_position() # cax = rd.fig.add_axes((pos.x0, 0.12, pos.width, 0.01)) # rd.fig.colorbar(cb, cax=cax, label="log likelyhood", orientation="horizontal") else: "display the dispersion curves as stored in the database" for i in range(len(llks))[::-1]: # rd.plotmodel(color=colors[i], alpha=1.0, linewidth=3, *ms[i]) # rd.plotdisp(color=colors[i], alpha=1.0, linewidth=3, *ds[i]) rd.addmodel(colorvalue=llks[i], *ms[i]) rd.adddisp(colorvalue=llks[i], *ds[i]) # cb = makecolorbar(vmin=vmin, vmax=vmax, cmap=argv['-cmap']) # pos = rd.axdisp[-1].get_position() # cax = rd.fig.add_axes((pos.x0, 0.12, pos.width, 0.01)) # rd.fig.colorbar(cb, cax=cax, label="log likelyhood", orientation="horizontal") # cax.set_xticklabels(cax.get_xticklabels(), rotation=90., horizontalalignment="center") rd.showdispcoll(vmin=vmin, vmax=vmax, cmap=argv['-cmap'], alpha=1.0, linewidth=3) rd.showdepthcoll(vmin=vmin, vmax=vmax, cmap=argv['-cmap'], alpha=1.0, linewidth=3) rd.colorbar(vmin=vmin, vmax=vmax, cmap=argv['-cmap'], label="log likelyhood", orientation="horizontal") print rd.cax.get_position() rd.cax.set_xticklabels(rd.cax.get_xticklabels(), rotation=90., horizontalalignment="center") # ---- display posterior pdf if "-pdf" in argv.keys(): assert argv["-pdf"] == [] or len( argv["-pdf"]) == 4 # unexpected argument number if argv["-pdf"] == []: pdf_mode, pdf_limit, pdf_llkmin, pdf_step = \ default_pdf_mode, default_pdf_limit, default_pdf_llkmin, default_pdf_step elif len(argv['-pdf']) == 4: pdf_mode, pdf_limit, pdf_llkmin, pdf_step = argv[ '-pdf'] else: raise Exception() print "pdf : %s, limit %d, llkmin %f, step %d" % ( pdf_mode, pdf_limit, pdf_llkmin, pdf_step), if pdf_mode == "best": chainids, weights, llks, ms, ds = \ rundb.getzip(limit=pdf_limit, llkmin=pdf_llkmin, step=pdf_step, algo="METROPOLIS") elif pdf_mode == "last": chainids, weights, llks, ms, ds = \ rundb.getlastszip(limit=pdf_limit, llkmin=pdf_llkmin, step=pdf_step, algo="METROPOLIS") else: raise Exception('unexpected pdf mode %s' % pdf_mode) dms = [ depthmodel_from_arrays(ztop, vp, vs, rh) for ztop, vp, vs, rh in ms ] # display percentiles of model and data pdfs clr = "b" if "-plot" not in argv.keys() else "k" alp = 1.0 if "-plot" not in argv.keys() else 0.5 for p, (vppc, vspc, rhpc, prpc) in \ dmstats1(dms, percentiles=[0.01, 0.16, 0.5, 0.84, 0.99], Ndepth=100, Nvalue=100, weights=weights, **mapkwargs): try: l = 3 if p == 0.5 else 1 for what, where in zip([vppc, vspc, rhpc, prpc], [ rd.axdepth['VP'], rd.axdepth['VS'], rd.axdepth['RH'], rd.axdepth['PR'] ]): if where is not None: what.show(where, color=clr, linewidth=l, alpha=alp) except KeyboardInterrupt: raise except Exception as e: print "Error", str(e) # display the disp pdf for p, (wpc, tpc, mpc, fpc, vpc) in \ dispstats(ds, percentiles=[0.01, 0.16, 0.5, 0.84, 0.99], Ndisp=100, weights=weights, **mapkwargs): try: l = 3 if p == 0.5 else 1 rd.plotdisp(wpc, tpc, mpc, fpc, vpc, dvalues=None, color=clr, alpha=alp, linewidth=l) except KeyboardInterrupt: raise except Exception as e: print "Error", str(e) # ------ if os.path.exists(paramfile): p, _ = load_paramfile(paramfile) showvp, showvs, showrh, showpr = True, True, True, True if isinstance(p, Parameterizer_mZVSVPRH): showpr = False elif isinstance(p, Parameterizer_mZVSPRRH): showvp = False elif isinstance(p, Parameterizer_mZVSPRzRHvp): showvp = showpr = showrh = False elif isinstance(p, Parameterizer_mZVSPRzRHz): showvp = showpr = showrh = False else: raise Exception('') # vplow, vphgh, vslow, vshgh, rhlow, rhhgh, prlow, prhgh = p.boundaries() for what, where in zip(\ [vplow, vphgh, vslow, vshgh, rhlow, rhhgh, prlow, prhgh], [rd.axdepth['VP'], rd.axdepth['VP'], rd.axdepth['VS'], rd.axdepth['VS'], rd.axdepth['RH'], rd.axdepth['RH'], rd.axdepth['PR'], rd.axdepth['PR']]): if where is not None: what.show(where, alpha=1.0, color="k", marker="o--", linewidth=1, markersize=3) zmax = 1.1 * p.inv(p.MINF)[0][-1] if isinstance(p, Parameterizer_mZVSPRzRHvp): rd.axdepth['PR'].plot(p.PRz(np.linspace(0., zmax, 100)), np.linspace(0., zmax, 100), "r--", linewidth=3) legendtext(rd.axdepth['PR'], p.PRzName, loc=4) legendtext(rd.axdepth['RH'], p.RHvpName, loc=4) elif isinstance(p, Parameterizer_mZVSPRzRHz): rd.axdepth['PR'].plot(p.PRz(np.linspace(0., zmax, 100)), np.linspace(0., zmax, 100), "r--", linewidth=3) rd.axdepth['RH'].plot(p.RHz(np.linspace(0., zmax, 100)), np.linspace(0., zmax, 100), "r--", linewidth=3) legendtext(rd.axdepth['PR'], p.PRzName, loc=4) legendtext(rd.axdepth['RH'], p.RHzName, loc=4) rd.set_zlim(np.array([0, zmax])) else: print "call option --param to see prior depth boundaries" # -------------------- if "-m96" in argv.keys(): # plot user data on top for m96 in argv['-m96']: try: dm = depthmodel_from_mod96(m96) dm.vp.show(rd.axdepth['VP'], "m", linewidth=3, label=m96) dm.vs.show(rd.axdepth['VS'], "m", linewidth=3) dm.rh.show(rd.axdepth['RH'], "m", linewidth=3) dm.pr().show(rd.axdepth['PR'], "m", linewidth=3) except KeyboardInterrupt: raise except: #Exception as e: print 'could not read or display %s (reason : %s)' % (m96, str(e)) rd.axdepth['VP'].legend(loc=3) if "-ritt" in argv.keys(): a = AsciiFile('/mnt/labex2/home/max/data/boreholes/GRT1/GRT1.logsonic') for what, where in zip( [a.data['VS'], a.data['VP'], a.data['VP'] / a.data['VS']], [rd.axdepth['VS'], rd.axdepth['VP'], rd.axdepth['PR']]): if where is not None: where.plot(what, a.data['TVD'] / 1000., "m", alpha=0.5) # -------------------- if os.path.exists(targetfile): # plot data on top rd.plotdisp(d.waves, d.types, d.modes, d.freqs, d.inv(dobs), dvalues=d.dvalues, alpha=.5, color="r", linewidth=2) if "-overdisp" in argv.keys(): rd.set_vlim((0.5 * d.values.min(), 1.5 * d.values.max())) rd.set_plim((0.8 / overfreqs.max(), 1.2 / overfreqs.min())) else: rd.set_vlim((0.8 * d.values.min(), 1.2 * d.values.max())) rd.set_plim((0.8 / d.freqs.max(), 1.2 / d.freqs.min())) rd.tick() rd.grid() rd.fig.suptitle(rootname.split('_HerrMet_')[-1]) if "-ftsz" in argv.keys(): chftsz(rd.fig, argv["-ftsz"][0]) else: chftsz(rd.fig, default_fontsize) if "-png" in argv.keys(): dpi = argv['-png'][0] if len(argv['-png']) else default_dpi if verbose: print "writing %s" % pngfile rd.fig.savefig(pngfile, dpi=dpi) elif "-inline" in argv.keys(): plt.show() else: showme() plt.close(rd.fig)
if I.any(): s = "\n".join([fmt.format(\ wave = law.wave, type = law.type, flag = law.flag, mode = law.mode, period = 1./ff, value = vv, dvalue = ss) for ff, vv, ss in zip(newf[I], newv[I], news[I])]) return s return "" sfx = argv["sfx"][0] if "sfx" in argv.keys() else "resamp" print argv['fspace'] newf = freqspace( float(argv['fspace'][0]), float(argv['fspace'][1]), int(argv['fspace'][2]), argv['fspace'][3]) #np.sort(np.unique(np.abs(argv['newf']))) print newf for f in argv['resamp']: s = surf96reader(f) fout = ".".join( f.split('/')[-1].split('.')[:-1] + [sfx] + [f.split('/')[-1].split('.')[-1]]) print fout out = "" for law in s.get_all(): out += "\n" + tostr(law, newf) out = out.strip('\n').strip() with open(fout, 'w') as fid: fid.write(out)
from srfpython.Herrmann.Herrmann import HerrmannCaller, Curve for m in argv['disp']: dm = depthmodel_from_mod96(m) ztop = dm.vp.ztop() vp = dm.vp.values vs = dm.vs.values rh = dm.rh.values #Waves, Types, Modes, Freqs = [], [], [], [] curves = [] for k in argv.keys(): if k[0].upper() in "RL" and k[1].upper( ) in "UC" and k[2] in "0123456789": fstart, fend, nfreq, fspace = argv[k] freqs = freqspace(float(fstart), float(fend), int(nfreq), fspace) curve = Curve( wave=k[0], # Waves.append(k[0]) type=k[1], # Types.append(k[1]) mode=int(k[2:]), # Modes.append(int(k[2:])) freqs=freqs) # Freqs.append(freq) curves.append(curve) hc = HerrmannCaller(curves=curves) curves = hc(ztop, vp, vs, rh) if "save" in argv.keys(): sfx = "" s96out = ".".join( m.split('/')[-1].split('.')[:-1]) + sfx + ".surf96" while os.path.exists(s96out): s96out = s96out.split(sfx + '.surf96')[0]
def target(argv, verbose): if '-h' in argv.keys() or "-help" in argv.keys(): print(long_help) return for k in argv.keys(): if k in ['main', "_keyorder"]: continue # private keys if k not in authorized_keys: raise Exception('option %s is not recognized' % k) # determine root names from target filess rootnames = [] for s96 in argv['main']: rootname = ROOTNAME.format(node=surf96filename_to_nodename(s96)) rootnames.append(rootname) assert len(np.unique(rootnames)) == len( rootnames) # make sure all rootnames are distinct # handle already existing files if "-ot" not in argv.keys(): for rootname in rootnames: target_file = HERRMETTARGETFILE.format(rootname=rootname) if os.path.exists(target_file): raise Exception( 'file {} exists already, use -ot to overwrite' % target_file) # loop over targets for rootname, s96 in zip(rootnames, argv['main']): target_file = HERRMETTARGETFILE.format(rootname=rootname) target_dir = os.path.dirname(target_file) # create directory if not os.path.isdir(target_dir): if verbose: print("creating " + target_dir) os.makedirs(target_dir) s96copy = os.path.join(target_dir, os.path.basename(s96)) + ".copy" cpcmd = 'cp {} {}'.format(s96, s96copy) if verbose: print(cpcmd) os.system(cpcmd) s = surf96reader(s96) if "-resamp" in argv.keys(): news = s.copy() news.clear() # clear all entries newf = freqspace(freqmin=float(argv["-resamp"][0]), freqmax=float(argv["-resamp"][1]), nfreq=int(argv["-resamp"][2]), scale=argv["-resamp"][3]) for law in s.get_all(): law.set_extrapolationmode(1) stdlaw = Claw(freq=law.freq, value=law.dvalue, extrapolationmode=0) newvalues = law(newf) newdvalues = stdlaw(newf) I = ~np.isnan(newvalues) if I.any(): N = I.sum() news.data['WAVE'] = np.concatenate( (news.data['WAVE'], np.array([law.wave]).repeat(N))) news.data['TYPE'] = np.concatenate( (news.data['TYPE'], np.array([law.type]).repeat(N))) news.data['FLAG'] = np.concatenate( (news.data['FLAG'], np.array([law.flag]).repeat(N))) news.data['MODE'] = np.concatenate( (news.data['MODE'], np.array([law.mode]).repeat(N))) news.data['PERIOD'] = np.concatenate( (news.data['PERIOD'], 1. / newf[I])) news.data['VALUE'] = np.concatenate( (news.data['VALUE'], newvalues[I])) news.data['DVALUE'] = np.concatenate( (news.data['DVALUE'], newdvalues[I])) s = news # print news if "-lunc" in argv.keys(): # set uncertainties to constant in log domain lunc = float(argv["-lunc"][0]) s.data['DVALUE'] = s.data['VALUE'] * lunc elif "-unc" in argv.keys(): # set uncertainties to constant in lin domain unc = float(argv["-unc"][0]) s.data['DVALUE'] = np.ones(len(s.data['VALUE'])) * unc if verbose: print("writing " + target_file) s.write96(target_file) # ------------------- print("please keep only datapoints to invert in " + HERRMETTARGETFILE.format(rootname="*")) print("use option --display to see the target data")