# http://pyrocko.org - GPLv3 # # The Pyrocko Developers, 21st Century # ---|P------/S----------~Lg----------
''' <html> <head> <style type="text/css"> body { margin-left:10px }; </style> </head> <body> <h1 align="center">Theoretical Phase Arrivals</h1> <p> This snuffling uses pyrocko's <a href="http://emolch.github.io/pyrocko/v0.3/cake_doc.html">Cake</a> module to calculate seismic rays for layered earth models. </p> <p> <b>Parameters:</b><br /> <b>· Global shift</b> - Add time onset to phases. <br /> <b>· Add Model</b> - Add a model to drop down menu. <br /> <b>· Add Phase</b> - Add a phase definition. (GUI reset required)<br /> </p> <p> Instructions and information on Cake's syntax of seismic rays can be found in the <a href="http://emolch.github.io/pyrocko/ v0.3/cake_doc.html#cmdoption-cake--phase">Cake documentation</a>. </p> </body> </html> '''
# self._phase_names = ('PmP ~S ~P ~P(moho)s ~P(sill-top)s' # ' ~P(sill-bottom)s Pdiff').split() ' SSP PPS SPP PSP SP PS ~PS ~SP Pn s S Sn PP PPP' ' ScS Sdiff SS SSS SKS SKIKS').split()
iphase == 0))
'Cake builtin: %s' % model_name for model_name in model_names]
model_names.append('GF Store: %s' % store_id)
'ak135-f-continental.m', self._models)
'use_station_depth', False))
pass
try: wanted = [] for iphase, name in enumerate(self._phase_names): if getattr(self, 'wantphase_%i' % iphase): if name in self._phases: phases = self._phases[name] else: if name.startswith('~'): phases = [cake.PhaseDef(name[1:])] else: phases = cake.PhaseDef.classic(name)
self._phases[name] = phases for pha in phases: pha.name = name
wanted.extend(phases) except (cake.UnknownClassicPhase, cake.PhaseDefParseError) as e: self.fail(str(e))
return wanted
self.cleanup() wanted = self.wanted_phases()
if not wanted: return
event, stations = self.get_active_event_and_stations()
if not stations: self.fail('No station information available.')
self.update_model() model = self._model[1]
depth = event.depth if depth is None: depth = 0.0
allrays = [] alldists = [] for station in stations: dist = event.distance_to(station) alldists.append(dist)
if self.use_station_depth: rdepth = station.depth else: rdepth = 0.0
multi_dists = [] nmax = 1 for i in range(0, nmax): multi_dists.append(dist*cake.m2d + 360.*i) multi_dists.append((i+1)*360. - dist*cake.m2d)
rays = model.arrivals( phases=wanted, distances=multi_dists, zstart=depth, zstop=rdepth)
for ray in rays: time = ray.t name = ray.given_phase().name incidence_angle = ray.incidence_angle() takeoff_angle = ray.takeoff_angle()
time += event.time + self.tshift m = PhaseMarker([(station.network, station.station, '*', '*')], time, time, 2, phasename=name, event=event, incidence_angle=incidence_angle, takeoff_angle=takeoff_angle) self.add_marker(m)
allrays.extend(rays)
if plot_rays: fig = self.figure(name='Ray Paths') from pyrocko import cake_plot cake_plot.my_rays_plot(model, None, allrays, depth, 0.0, num.array(alldists)*cake.m2d, axes=fig.gca())
fig.canvas.draw()
if not self._model or self._model[0] != self.chosen_model: if self.chosen_model.startswith('Cake builtin: '): load_model = cake.load_model( self.chosen_model.split(': ', 1)[1])
elif self.chosen_model.startswith('GF Store: '): store_id = self.chosen_model.split(': ', 1)[1]
load_model = self._engine.get_store(store_id)\ .config.earthmodel_1d else: load_model = cake.load_model(self.chosen_model)
self._model = (self.chosen_model, load_model)
self.set_parameter_choices('chosen_model', self._models)
''' Called from trigger 'Add Model'.
Adds another choice to the drop down 'Model' menu. '''
in_model = self.input_filename('Load Model') if in_model not in self._models: self._models.append(in_model) self.update_model_choices()
self.set_parameter('chosen_model', in_model) self.call()
''' Called from trigger 'Add Phase Definition'.
Adds another phase option. Requires a reset of the GUI. ''' phase_def = str(self.input_dialog('Add New Phase', 'Enter Phase Definition')) self._phase_names.append(phase_def)
self.add_parameter( Switch(phase_def, 'wantphase_%s' % str(len(self._phase_names)-1), True)) self.reset_gui(reloaded=True) self.call()
self.update_model()
from pyrocko import cake_plot
fig = self.figure(name='Model: %s' % self._model[0])
cake_plot.my_model_plot(self._model[1], axes=fig.gca())
fig.canvas.draw()
self.call(plot_rays=True)
''' Returns a list of snufflings to be exported by this module. '''
|