Chapter 8 About Grond
8.1 Project folder layout
Now that we have acquired all the necessary data for running moment tensor inversion, we need to include the files in the Grond project. It has a specific structure for storing the data, computation results, and reports.
Activate the environment using:
conda activate obsrocko
First, let us initiate an empty project to compute a probabilistic centroid moment tensor (CMT) solution from surface waves using the following command:
grond init example_regional_cmt my_first_mt_project
This creates the following folders and files:
my_first_mt_project # project folder
├── bin # directory with scripts
│ ├── download_gf_stores.sh # download pre-calculated Green's functions
│ ├── grondown # a simple event-based waveform downloader
│ └── grondown_regional.sh # downloader configured for this exercise
└── config # directory for configuration files
└── surface_cmt.gronf # Defaut Grond configuration file
8.2 Green’s functions store folder
Create a folder for Green’s Functions store:
mkdir gf_stores
Copy pre-computed Green’s functions store from Chapter 3 to the folder gf_stores:
scp -r /path_to_gf_store/ my_first_mt_project/gf_functions/
or
rsync /path_to_gf_store/ my_first_mt_project/gf_functions/
Alternatively, additional pre-calculated and published Green’s functions stores with global or regional coverage can be found online.
To download pre-computed GF use:
fomosto download kinherd <name_of_the_store>
8.3 Data folder
Inside the project’s folder make folder data:
mkdir data
Copy the waveforms archive created in Chapter 4
Copy event files into the corresponding event folder:
cp path_to_event_file/event_year_month_day_time.txt my_first_mt_project/data/event_year_month_day_time
Make the folder for the station files inside each event folder:
mkdir station_files my_first_mt_project/data/event_year_month_day_time/
Copy all xml files created in Chapter 4 to station_files folder:
cp stations.*.xml my_first_mt_project/data/event_year_month_day_time/station_files
The resulting project should look as follows:
my_first_mt_project
├── README.md
└── bin
└──config
└── my_moment_tensor_inversion_config.gronf
data
└── events
└── event_year_month_day
# catalogue information about the event
├── event.txt
└── waveforms
# raw Mini-SEED waveforms
├── network.station.location.component.year.julian_day
└──
# stations files containing station information and instrument response
├── stations.network.xml
└──gf_stores
└── my_greens_functions_store
└──reports
└── my_moment_inversion_report
└──runs
└── my_moment_inversion_run.grun
The folders run and report are generated after and during the optimisation process, respectively. The run folder contains .grun files, which later can be converted into a report. Online example reports can be found here.
8.4 Config file
- There are two ways to make a config file for Grond. The first option is to modify a config file inside config folder, which was created by default during the project initialisation. Below, you can find an example of the config file used for the computations of the focal mechanism of the 21 March 2022 5.1 Tampen Spur Earthquake, North Sea (see file config_ev_2022_03_21.gronf):
%YAML 1.1
# Example: Inversion of centroid moment tensor from regional waveform observations.
--- !grond.Config
# All file paths referenced below are treated relative to the location of this
# configuration file, here we may give a common prefix. E.g. setting it to '..'
# if the configuration file is in the sub-directory '${project_root}/config'
# allows us to give the paths below relative to '${project_root}'.
path_prefix: '..'
# Path, where to store output (run directories). The placeholder
# '${problem_name}' will be expanded to a name configured below in
# problem_config.name_template and will typically include a config identifier
# and the event name.
rundir_template: 'runs/<year_month_day>_<hour_min>_dev_r_l_tc_150x150km_${problem_name}.grun'
# If given, restrict to processing of listed events
event_names:
#- 'all'
- 'event_2022-03-21_05-32-55'
# -----------------------------------------------------------------------------
# Configuration section for dataset (input data)
#
# The placeholder '${event_name}' will be expanded to the current event. This
# enables us to use the same configuration for multiple events. The available
# events are detected by looking into possible expansions of
# dataset_config.events_path
# -----------------------------------------------------------------------------
dataset_config: !grond.DatasetConfig
# More information on the data configuration at
# https://pyrocko.org/grond/docs/current/config/dataset/index.html
# List of files with station coordinates.
stations_stationxml_paths:
- 'data/events/${event_name}/stations_files/stations.BE.xml'
- 'data/events/${event_name}/stations_files/stations.NL.xml'
- 'data/events/${event_name}/stations_files/stations.GR.xml'
- 'data/events/${event_name}/stations_files/stations.NS.xml'
- 'data/events/${event_name}/stations_files/stations.KQ.xml'
- 'data/events/${event_name}/stations_files/stations.GB.xml'
- 'data/events/${event_name}/stations_files/stations.GE.xml'
- 'data/events/${event_name}/stations_files/stations.NO.xml'
- 'data/events/${event_name}/stations_files/stations.DK.xml'
# File with hypocenter information and possibly reference solution
events_path: 'data/events/${event_name}/event.txt'
# List of directories with raw waveform data
#waveform_paths: ['data/events/${event_name}/waveforms/waveforms_1st_selection_try']
waveform_paths: ['data/events/${event_name}/waveforms']
# List of stations/components to be excluded according to their STA, NET.STA,
# NET.STA.LOC, or NET.STA.LOC.CHA codes
blacklist: ['NO.AKN','NO.NC405','BE.BEBN..HHE', 'BE.BEBN..HHN', 'BE.BEBN..HHZ', 'BE.BOST..HHE', 'BE.OPTB..HHE', 'BE.OPTB..HHN', 'BE.OPTB..HHZ', 'DK.ANGG..HHE', 'DK.DAG..BHE', 'DK.DAG..BHN', 'DK.DBG.00.BH1', 'DK.DBG.00.BHZ', 'DK.GDH.00.HHE', 'DK.GDH.00.HHN', 'DK.GOET..HHE', 'DK.GDH.00.HHZ', 'DK.GOET..HHN', 'DK.ISOG..HHE', 'DK.ISOG..HHN', 'DK.ISOG..HHZ', 'DK.LLD..HHE', 'DK.LLD..HHN', 'DK.LLD..HHZ', 'DK.MUD.00.HHN', 'DK.NEEM.00.LH1', 'DK.NIAQ.00.HHN', 'DK.NOR..BHE', 'DK.NOR..BHN', 'DK.NRS..HHE', 'DK.NRS..HHN', 'DK.NUUG.00.BH1', 'DK.NUUK.00.HH1', 'DK.NUUK.00.HH2', 'DK.OVD..HHE', 'DK.OVD..HHN', 'DK.SFJD.10.HH1', 'DK.SFJD.10.HH2', 'DK.SFJD.10.HHZ', 'DK.SUMG..BHE', 'DK.SUMG..BHZ', 'GB.EDI..HHN', 'GB.ELMS..HHE', 'GB.ELMS..HHN', 'GB.HMNX..HHE', 'GB.GEC7..HHE', 'GB.GEC7..HHN','GB.HMNX..HHN', 'GB,HPK..HHN', 'GB.INGV..HHN', 'GB.INGV..HHE', 'GB.IOMK..HHN', 'GB.KESW..HHN', 'GB.LINV..HHN', 'GB.LINV..HHZ', 'GB.NEWG..HHE', 'GB.NEWG..HHN', 'GB.STNC..HHE', 'GB.STNC..HHN', 'GB.SWN1..HHN', 'GE.FALKS..HHN', 'GE.HLG..HHN', 'GE.IBBN..HHN', 'GE.KBS.00.BHZ', 'GE.KBS.10.LH1', 'GE.KBS.10.LH2', 'GE.MARCO..HHN', 'GE.MATE..HHN', 'GE.PABE..HHE', 'GE.PABE..HHN', 'GE.PUL..BHE', 'GE.PUL..BHN', 'GE.PUL..BHZ', 'GE.STU..HHN', 'GE.TIRR..HHE', 'GE.TIRR..HHN', 'GE.VSU..HHE', 'GE.VSU..HHN', 'GR.A807..HHE', 'GR.A807..HHN', 'GR.A807..HHZ', 'GR.DEEL..EHE', 'GR.DEEL..EHN', 'GR.DEEL..EHZ', 'GR.FAHL..SHE', 'GR.FAHL..SHN', 'GR.FAHL..SHZ', 'GR.FBRG..BHE', 'GR.FBRG..BHN', 'GR.GEA0..SHZ', 'GR.GEA1..SHZ', 'GR.GEA2..SHE', 'GR.GEA2..SHN', 'GR.GEA2..SHZ', 'GR.GEA3..SHZ', 'GR.GEB1..SHZ', 'GR.GEB2..SHZ', 'GR.GEB3..SHZ', 'GR.GEB4..SHZ', 'GR.GEB4..SHZ', 'GR.GEB5..SHZ', 'GR.GEC1..SHZ', 'GR.GEC2..HHE', 'GR.GEC2..HHN', 'GR.GEC4..SHZ', 'GR.GEC5..SHZ', 'GR.GEC6..SHZ' , 'GR.GEC7..HHE', 'GR.GEC7..HHN', 'GR.GEC7.HHN', 'GR.GED1..SHE', 'GR.GED1..SHN', 'GR.GED1..SHZ', 'GR.GED2..SHZ', 'GR.GED3..SHZ', 'GR.GED3..SHE', 'GR.GED3..SHN','GR.GED4..SHE','GR.GED4..SHN','GR.GED4..SHZ', 'GR.GED5..SHZ', 'GR.GED6..SHZ', 'GR.GED7..SHE', 'GR.GED7..SHN', 'GR.GED7..SHZ', 'GR.GED8..SHZ', 'GR.GED9..SHZ', 'GR.GOR1..HH1', 'GR.GOR1..HH2', 'GR.GTTG..HHE', 'GR.GTTG..HHN', 'GR.HAM4..HHE', 'GR.HAM4..HHN', 'GR.HLGA1..HHN', 'GR.HLGA2..HHE', 'GR.HLGA2..HHN', 'GR.HLGA3..HHE', 'GR.HLGA3..HHN', 'GR.HLGB1..HHE', 'GR.HLGB1..HHN', 'GR.HLGB2..HHE', 'GR.HLGB2..HHN', 'GR.IGAD..HHE', 'GR.IGAD..HHN', 'GR.INS1..SHE', 'GR.INS1..SHN', 'GR.INS1..SHZ', 'GR.INS3..SHE', 'GR.INS3..SHN', 'GR.INS3..SHZ', 'GR.INS4B..SHE', 'GR.INS4B..SHN', 'GR.INS4B..SHZ', 'GR.INS5..SHE', 'GR.INS5..SHN', 'GR.INS5..SHZ', 'GR.INS5..SHE', 'GR.INS6B..SHN', 'GR.INS6B..SHE', 'GR.INS6B..SHZ', 'GR.INS7..SHE', 'GR.INS7..SHN', 'GR.INS7..SHZ', 'GR.INS7..SHE', 'GR.INS8..SHE', 'GR.INS8..SHN', 'GR.INS8..SHZ', 'GR.INSH..SHE', 'GR.INSH..SHN', 'GR.INSH..SHZ', 'GR.KHUS..HHE', 'GR.KHUS..HHN', 'GR.KUDEN..HH1', 'GR.KUDEN..HH2', 'GR.LNIZ..HHE', 'GR.LNIZ..HHN', 'GR.LOCC..BHE', 'GR.LOCC..BHN', 'GR.LUEB..HHN', 'GR.MILB..HHE', 'GR.MILB..HHN', 'GR.RAST..EHE', 'GR.RAST..EHN', 'GR.RAST..EHZ', 'GR.RETHO..HHE', 'GR.RETHO..HHN', 'GR.SKMB..HHN', 'GR.SYKE..SHE', 'GR.SYKE..SHN', 'GR.SYKE..SHZ', 'GR.TMO20..SHE', 'GR.TMO20..SHN', 'GR.TMO20..SHZ', 'GR.TMO22..SHE', 'GR.TMO22..SHN', 'GR.TMO22..SHZ', 'GR.TMO54..SHE', 'GR.TMO54..SHN', 'GR.TMO54..SHZ', 'GR.TMO55..SHE', 'GR.TMO55..SHN', 'GR.TMO55..SHZ', 'GR.TMO57..SHE', 'GR.TMO57..SHN', 'GR.TMO57..SHZ', 'GR.TMO66..SHE', 'GR.TMO66..SHN', 'GR.TMO66..SHZ', 'GR.UNDO..EHE', 'GR.UNDO..EHN', 'GR.UNDO..EHZ', 'GR.ZARR..HHE', 'GR.ZARR..HHN', 'GR.ZURM..EHE', 'GR.ZURM..EHN', 'GR.ZURM..EHZ', 'KQ.BIRK..HHN', 'KQ.BUESM..HHE', 'KQ.BUESM..HHN', 'KQ.BUESM..HHZ', 'KQ.NONN..HHE', 'KQ.NONN..HHN', 'KQ.PEEM..HHN', 'NL.DBN.01.HHE', 'NL.DBN.01.HHN', 'NL.FR044..HH1', 'NL.FR044..HH2', 'NL.FR044..HHZ', 'NL.FR054..HH1', 'NL.FR054..HH2', 'NL.FR054..HHZ', 'NL.G114..HH1', 'NL.G114..HH2', 'NL.G114..HHZ', 'NL.G124..HH1', 'NL.G124..HH2', 'NL.G124..HHZ', 'NL.G274..HH1', 'NL.G274..HH2', 'NL.G274..HHZ', 'NL.G604..HH1', 'NL.G604..HH2', 'NL.G604..HHZ', 'NL.GK014..HH1', 'NL.GK014..HH2', 'NL.GK014..HHZ', 'NL.N034..HH1', 'NL.N034..HH2', 'NL.N034..HHZ', 'NL.NH014..HH1', 'NL.NH014..HH2', 'NL.NH014..HHZ', 'NL.OPLO.01.BHN', 'NL.OTL4.01.HHE', 'NL.OTL4.01.HHN', 'NL.OTL4.01.HHZ', 'NL.PPB4.01.HHE', 'NL.PPB4.01.HHN', 'NL.PPB4.01.HHZ', 'NL.SL014..HH1', 'NL.SL014..HH2', 'NL.SL014..HHZ', 'NL.T064..HH1', 'NL.T064..HH2', 'NL.T064..HHZ', 'NL.T084..HH1', 'NL.T084..HH2', 'NL.T084..HHZ', 'NL.ZH024..HH1', 'NL.ZH024..HH2', 'NL.ZH024..HHZ', 'NL.ZH034..HH1', 'NL.ZH034..HH2', 'NL.ZH034..HHZ', 'NL.ZH044..HH1', 'NL.ZH044..HH2', 'NL.ZH044..HHZ', 'NO.ARC2.00.BHZ', 'NO.ARC3.00.BHZ', 'NO.ARD1.00.BHZ', 'NO.ARD8.00.BHE', 'NO.BRBA.00.HHE', 'NO.BRBA.00.HHN', 'NO.BRBB.00.HHE', 'NO.BRBB.00.HHN', 'NO.JETT.00.HHE', 'NO.JETT.00.HHN', 'NO.JETT.00.HHZ', 'NO.JMIC.00.HHE', 'NO.JMIC.00.HHN', 'NS.BJO1.00.HHE', 'NS.BJO1.00.HHN', 'NS.BLS5.00.HHE', 'NS.BLS5.00.HHN', 'NS.FAUS.00.HHE', 'NS.GILDE.00.HHE', 'NS.HAMF.00.HHN', 'NS.HOPEN.00.HHE', 'NS.HOPEN.00.HHN', 'NS.ISF.00.HHE', 'NS.ISF.00.HHN', 'NS.ISF.00.HHZ', 'NS.JMI.00.HHE', 'NS.JMI.00.HHN','NS.JMI.00.HHZ', 'NS.JNE.00.HHE', 'NS.JNE.00.HHN', 'NS.JNW.00.HHE', 'NS.JNW.00.HHN', 'NS.KONS.00.HHE', 'NS.KONS.00.HHN', 'NS.KTK1.00.HHE', 'NS.KTK1.00.HHN', 'NS.LOF.00.HHN', 'NS.MOL.00.HHE', 'NS.MOL.00.HHN', 'NS.MOR8.00.HHE', 'NS.NSS.00.HHE', 'NS.NSS.00.HHN', 'NS.OSL.00.HHZ', 'NS.OXFO.00.HHE', 'NS.OXFO.00.HHN', 'NS.ROEST.00.HHN', 'NS.STAV.00.HHE', 'NS.STAV.00.HHN', 'NS.STEI.00.HHE', 'NS.STEI.00.HHN', 'NS.VAGH.00.HHE','NS.VAGH.00.HHN', 'NS.VERL.00.HHN']
# List of files with additional exclusion lists (one entry per line, same
# format as above)
blacklist_paths:
- 'data/events/${event_name}/blacklist/blacklist.txt'
# List of files with instrument response information (can be the same as in
# stations_stationxml_paths above)
responses_stationxml_paths:
- 'data/events/${event_name}/stations_files/stations.BE.xml'
- 'data/events/${event_name}/stations_files/stations.NL.xml'
- 'data/events/${event_name}/stations_files/stations.GR.xml'
- 'data/events/${event_name}/stations_files/stations.NS.xml'
- 'data/events/${event_name}/stations_files/stations.KQ.xml'
- 'data/events/${event_name}/stations_files/stations.GB.xml'
- 'data/events/${event_name}/stations_files/stations.GE.xml'
- 'data/events/${event_name}/stations_files/stations.NO.xml'
- 'data/events/${event_name}/stations_files/stations.DK.xml'
# Apply correction factors from station corrections.
apply_correction_factors: true
# Extend incomplete seismic traces
extend_incomplete: false
# -----------------------------------------------------------------------------
# Configuration section for the observational data fitting
#
# This defines the objective function to be minimized in the optimisation. It
# can be composed of one or more contributions, each represented by a
# !grond.*TargetGroup section.
# -----------------------------------------------------------------------------
target_groups:
- !grond.WaveformTargetGroup
# Normalisation family (see the Grond documentation for how it works).
# Use distinct normalisation families when mixing misfit contributors with
# different magnitude scaling, like e.g. cross-correlation based misfit and
# time-domain Lx norm.
normalisation_family: 'td'
# Just a name used to identify targets from this group. Use dot-separated path
# notation to group related contributors
path: 'td.love'
# Epicentral distance range of stations to be considered in meter
distance_min: 1.0e3
distance_max: 1.5e6
# Names of components to be included. Available: N=north, E=east, Z=vertical
# (up), R=radial (away), T=transverse (right)
channels: ['T']
# How to weight contributions from this group in the global misfit
weight: 1.0
include: ['BE.MEM.*.T', 'DK.COP.*.T', 'GB.BIGH.*.T', 'GB.CWF.*.T', 'GB.HLM1.*.T', 'GB.LMK.*.T', 'GB.RSBS.*.T', 'GB.WACR.*.T', 'GE.FLT1.*.T', 'GE.ILTH.*.T', 'GE.PBUR.*.T', 'GR.AHRW.*.T', 'GR.ASSE.*.T', 'GR.BRG.*.T', 'GR.BSEG.*.T', 'GR.BUG.*.T', 'GR.CLL.*.T', 'GR.CLZ.*.T', 'GR.GRA2.*.T', 'GR.GRA3.*.T', 'GR.GRB1.*.T', 'GR.GRB2.*.T', 'GR.GRB3.*.T', 'GR.GRC4.*.T', 'GR.KAST.*.T', 'GR.MOX.*.T', 'GR.RETH.*.T', 'GR.TNS.*.T', 'KQ.MRLW.*.T', 'NL.HGN.*.T', 'NL.WTSB.*.T', 'NO.NAO01.*.T', 'NO.NB201.*.T', 'NO.NBO00.*.T', 'NO.NC204.*.T', 'NO.NC303.*.T', 'NO.NC602.*.T', 'NS.ASK.*.T', 'NS.BER.*.T', 'NS.FOO.*.T', 'NS.HOMB.*.T', 'NS.HYA.*.T', 'NS.KMY.*.T', 'NS.ODD1.*.T', 'NS.OSL.*.T', 'NS.SKAR.*.T', 'NS.SNART.*.T', 'NS.SUE.*.T']
# subsection on how to fit the traces
misfit_config: !grond.WaveformMisfitConfig
# Frequency band [Hz] of acausal filter (flat part of frequency taper)
fmin: 0.01
fmax: 0.05
# Factor defining fall-off of frequency taper (zero at fmin/ffactor and
# fmax*ffactor)
ffactor: 1.5
# Time window to include in the data fitting. Times can be defined offset
# to given phase arrivals. E.g. '{stored:P}-600' would mean 600 s
# before arrival of the phase named 'P'. The phase must be defined in the
# travel time tables in the GF store.
tmin: '{stored:anyP}'
tmax: '{vel_surface:2.5}'
# tfade: 120.0
# How to fit the data (available: 'time_domain', 'frequency_domain',
# 'log_frequency_domain', 'absolute', 'envelope', 'cc_max_norm')
domain: 'time_domain'
# If non-zero, allow synthetic and observed traces to be shifted
# against each other by up to +/- the given value [s].
tautoshift_max: 4.0
# If non-zero, a penalty misfit is added for non-zero shift values.
# The penalty value is computed as
# autoshift_penalty_max * normalization_factor * tautoshift**2 / tautoshift_max**2
autoshift_penalty_max: 0.05
# For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# How to interpolate the Green's functions (available choices:
# 'nearest_neighbor', 'multilinear'). Choices other than 'nearest_neighbor'
# may require dense GF stores to avoid aliasing artifacts in the forward
# modelling.
interpolation: 'nearest_neighbor'
# Name of the GF Store to use
store_id: 'northsea'
# Instead of defining a GF store, the Crust2StoreIDSelector can be used
# to automatically pick the CRUST 2.0 model based on the event location.
# store_id_selector: !grond.Crust2StoreIDSelector
# template: crust2_${id}
- !grond.WaveformTargetGroup
# Normalisation family (see the Grond documentation for how it works).
# Use distinct normalisation families when mixing misfit contributors with
# different magnitude scaling, like e.g. cross-correlation based misfit and
# time-domain Lx norm.
normalisation_family: 'td'
# Just a name used to identfy targets from this group. Use dot-separated path
# notation to group related contributors
path: 'td.rayleigh'
# Epicentral distance range of stations to be considered in meter
distance_min: 1.0e3
distance_max: 1.5e6
# Names of components to be included. Available: N=north, E=east, Z=vertical
# (up), R=radial (away), T=transverse (right)
channels: ['R', 'Z']
include: ['BE.MEM.*.R', 'BE.RCHB.*.R', 'GB.BIGH.*.R', 'GB.CWF.*.R', 'GB.HLM1.*.R', 'GB.KPL.*.R', 'GB.RSBS.*.R', 'GB.WACR.*.R', 'GE.FLT1.*.R', 'GE.ILTH.*.R', 'GE.VAL.*.R', 'GR.AHRW.*.R', 'GR.ASSE.*.R', 'GR.BRG.*.R', 'GR.BSEG.*.R', 'GR.BUG.*.R', 'GR.CLL.*.R', 'GR.CLZ.*.R', 'GR.GRA1.*.R', 'GR.GRA2.*.R', 'GR.GRA3.*.R', 'GR.GRB1.*.R', 'GR.GRB2.*.R', 'GR.GRB3.*.R', 'GR.GRC4.*.R', 'GR.KAST.*.R', 'GR.MOX.*.R', 'KQ.MRLW.*.R', 'NL.HGN.*.R', 'NL.WTSB.*.R', 'NO.NAO01.*.R', 'NO.NB201.*.R', 'NO.NBO00.*.R', 'NO.NB204.*.R', 'NO.NC303.*.R', 'NO.NC602.*.R', 'NO.ASK.*.R', 'NS.BER.*.R', 'NS.DOMB.*.R', 'NS.HOMB.*.R', 'NS.HYA.*.R', 'NS.KMY.*.R', 'NS.LADE.*.R', 'NS.LENS.*.R', 'NS.ODD1.*.R', 'NS.SKAR.*.R', 'NS.SNART.*.R', 'NS.SUE.*.R', 'DK.GOET.*.Z', 'DK.GOET.*.Z', 'DK.MUD.*.Z', 'DK.OVD.*.Z', 'GB.BIGH.*.Z', 'GB.HTL.*.Z', 'GB.INVG.*.Z', 'GB.KPL.*.Z', 'GE.FALKS.*.Z', 'GE.FLT1.*.Z', 'GE.ASSE.*.Z', 'GR.BRG.*.Z', 'GR.BSEG.*.Z', 'GR.BUG.*.Z', 'GR.CLL.*.Z', 'GR.CLZ.*.Z', 'GR.FBRG.*.Z', 'GR.GOR1.*.Z', 'GR.GRA1.*.Z', 'GR.GRA2.*.Z', 'GR.GRA3.*.Z', 'GR.GRA4.*.Z', 'GR.GRB1.*.Z', 'GR.GRB2.*.Z', 'GR.GRB3.*.Z', 'GR.GRB5.*.Z', 'GR.GRC4.*.Z', 'GR.GTTG.*.Z', 'GR.HAM4.*.Z', 'GR.HLGA1.*.Z', 'GR.HLGA2.*.Z', 'GR.HLGA3.*.Z', 'GR.IGAD.*.Z', 'GR.KAST.*.Z', 'GR.KHUS.*.Z', 'GR.KUDEN.*.Z', 'GR.LNIZ.*.Z', 'GR.LOCC.*.Z', 'GR.LUEB.*.Z', 'GR.MILB.*.Z', 'GR.MOX.*.Z', 'GR.RETH.*.Z', 'GR.RETHO.*.Z', 'GR.SKMB.*.Z', 'GR.TNS.*.Z', 'GR.ZARR.*.Z', 'NL.HGN.*.Z', 'NL.WTSB.*.Z', 'NO.NAO00.*.Z', 'NO.NAO01.*.Z', 'NO.NAO03.*.Z', 'NO.NAO04.*.Z', 'NO.NB200.*.Z', 'NO.NB201.*.Z', 'NO.NB202.*.Z', 'NO.NB204.*.Z', 'NO.NB205.*.Z', 'NO.NBO00.*.Z', 'NO.NBO02.*.Z', 'NO.NBO03.*.Z', 'NO.NBO04.*.Z', 'NO.NC200.*.Z', 'NO.NC201.*.Z', 'NO.NC202.*.Z', 'NO.NC203.*.Z', 'NO.NC204.*.Z', 'NO.NC300.*.Z', 'NO.NC301.*.Z', 'NO.NC302.*.Z', 'NO.NC303.*.Z', 'NO.NC304.*.Z', 'NO.NC305.*.Z', 'NO.NC400.*.Z', 'NO.NC401.*.Z', 'NO.NC402.*.Z', 'NO.NC403.*.Z', 'NO.NC404.*.Z', 'NO.NC600.*.Z', 'NO.NC601.*.Z', 'NO.NC602.*.Z', 'NO.NC603.*.Z', 'NO.NC604.*.Z', 'NO.NC605.*.Z', 'NO.ASK.*.Z', 'NS.BER.*.Z', 'NS.BLS5.*.Z', 'NS.DOMB.*.Z', 'NS.FAUS.*.Z', 'NS.FOO.*.Z', 'NS.GILDE.*.Z' ,'NS.HAMF.*.Z', 'NS.HOMB.*.Z', 'NS.HYA.*.Z', 'NS.KMY.*.Z', 'NS.KONS.*.Z', 'NS.KTK1.*.Z', 'NS.LADE.*.Z', 'NS.LEIR.*.Z', 'NE.LENS.*.Z', 'NS.LOSSI.*.Z', 'NS.MOL.*.Z', 'NS.MOR8.*.Z', 'NS.NSS.*.Z', 'NS.ODD1.*.Z', 'NS.SKAR.*.Z', 'NS.SNART.*.Z', 'NS.SUE.*.Z', 'NS.VAGH.*.Z']
# How to weight contributions from this group in the global misfit
weight: 1.0
# subsection on how to fit the traces
misfit_config: !grond.WaveformMisfitConfig
# Frequency band [Hz] of acausal filter (flat part of frequency taper)
fmin: 0.01
fmax: 0.05
# Factor defining fall-off of frequency taper (zero at fmin/ffactor and
# fmax*ffactor)
ffactor: 1.5
# Time window to include in the data fitting. Times can be defined offset
# to given phase arrivals. E.g. '{stored:P}-600' would mean 600 s
# before arrival of the phase named 'P'. The phase must be defined in the
# travel time tables in the GF store.
tmin: '{stored:anyP}'
tmax: '{vel_surface:2.5}'
# tfade: 120.0
# How to fit the data (available: 'time_domain', 'frequency_domain',
# 'log_frequency_domain', 'absolute', 'envelope', 'cc_max_norm')
domain: 'time_domain'
# If non-zero, allow synthetic and observed traces to be shifted
# against each other by up to +/- the given value [s].
tautoshift_max: 4.0
# If non-zero, a penalty misfit is added for non-zero shift values.
# The penalty value is computed as
# autoshift_penalty_max * normalization_factor * tautoshift**2 / tautoshift_max**2
autoshift_penalty_max: 0.05
# For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# How to interpolate the Green's functions (available choices:
# 'nearest_neighbor', 'multilinear'). Choices other than 'nearest_neighbor'
# may require dense GF stores to avoid aliasing artifacts in the forward
# modelling.
interpolation: 'nearest_neighbor'
# Name of the GF Store to use
store_id: 'northsea'
- !grond.WaveformTargetGroup
# Normalisation family (see the Grond documentation for how it works).
# Use distinct normalisation families when mixing misfit contributors with
# different magnitude scaling, like e.g. cross-correlation based misfit and
# time-domain Lx norm.
normalisation_family: 'cc'
# Just a name used to identify targets from this group. Use dot-separated path
# notation to group related contributors
path: 'cc.love'
# Epicentral distance range of stations to be considered in meter
distance_min: 1.0e3
distance_max: 1.5e6
# Names of components to be included. Available: N=north, E=east, Z=vertical
# (up), R=radial (away), T=transverse (right)
channels: ['T']
include: ['BE.MEM.*.T', 'BE.RCHB.*.T', 'BE.UCC.*.T', 'DK.COP.*.T', 'GB.BIGH.*.T', 'GB.CWF.*.T', 'GB.DRUM.*.T', 'GB.HLM1.*.T', 'GB.HTL.*.T', 'GB.KPL.*.T', 'GB.RSBS.*.T', 'GB.WACR.*.T', 'GB.WLF1.*.T', 'GE.ILTH.*.T', 'GE.PBUR.*.T', 'GE.SLIT.*.T', 'GR.AHRW.*.T', 'GR.BRG.*.T', 'GR.BSEG.*.T', 'GR.BUG.*.T', 'GR.CLL.*.T', 'GR.CLZ.*.T', 'GR.GRB1.*.T', 'GR.GRB2.*.T', 'GR.GRB3.*.T', 'GR.GRC4.*.T', 'GR.KAST.*.T', 'GR.MOX.*.T', 'GR.RETH.*.T', 'GR.TNS.*.T', 'KQ.MRLW.*.T', 'NL.G81B.*.T', 'NL.G82B.*.T', 'NL.G83B.*.T', 'NL.G84.*.T', 'NL.WTSB.*.T', 'NO.NAO01.*.T', 'NO.NB201.*.T', 'NO.NBO00.*.T', 'NO.NC204.*.T', 'NO.NC303.*.T', 'NO.NC602.*.T', 'NS.ASK.*.T', 'NS.BER.*.T', 'NS.FOO.*.T', 'NS.HOMB.*.T', 'NS.HYA.*.T', 'NS.KMY.*.T', 'NS.ODD1.*.T', 'NS.OSL.*.T', 'NS.SKAR.*.T', 'NS.SNART.*.T', 'NS.SUE.*.T']
# How to weight contributions from this group in the global misfit
weight: 1.0
# subsection on how to fit the traces
misfit_config: !grond.WaveformMisfitConfig
# Frequency band [Hz] of acausal filter (flat part of frequency taper)
fmin: 0.01
fmax: 0.05
# Factor defining fall-off of frequency taper (zero at fmin/ffactor and
# fmax*ffactor)
ffactor: 1.5
# Time window to include in the data fitting. Times can be defined offset
# to given phase arrivals. E.g. '{stored:P}-600' would mean 600 s
# before arrival of the phase named 'P'. The phase must be defined in the
# travel time tables in the GF store.
tmin: '{stored:anyP}'
tmax: '{vel_surface:2.5}'
# tfade: 120.0
# How to fit the data (available: 'time_domain', 'frequency_domain',
# 'log_frequency_domain', 'absolute', 'envelope', 'cc_max_norm')
domain: 'cc_max_norm'
# If non-zero, allow synthetic and observed traces to be shifted
# against each other by up to +/- the given value [s].
tautoshift_max: 4.0
# If non-zero, a penalty misfit is added for non-zero shift values.
# The penalty value is computed as
# autoshift_penalty_max * normalization_factor * tautoshift**2 / tautoshift_max**2
autoshift_penalty_max: 0.05
# For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# How to interpolate the Green's functions (available choices:
# 'nearest_neighbor', 'multilinear'). Choices other than 'nearest_neighbor'
# may require dense GF stores to avoid aliasing artifacts in the forward
# modelling.
interpolation: 'nearest_neighbor'
# Name of the GF Store to use
store_id: 'northsea'
# Instead of defining a GF store, the Crust2StoreIDSelector can be used
# to automatically pick the CRUST 2.0 model based on the event location.
# store_id_selector: !grond.Crust2StoreIDSelector
# template: crust2_${id}
- !grond.WaveformTargetGroup
# Normalisation family (see the Grond documentation for how it works).
# Use distinct normalisation families when mixing misfit contributors with
# different magnitude scaling, like e.g. cross-correlation based misfit and
# time-domain Lx norm.
normalisation_family: 'cc'
# Just a name used to identfy targets from this group. Use dot-separated path
# notation to group related contributors
path: 'cc.rayleigh'
# Epicentral distance range of stations to be considered in meter
distance_min: 1.0e3
distance_max: 1.5e6
# Names of components to be included. Available: N=north, E=east, Z=vertical
# (up), R=radial (away), T=transverse (right)
channels: ['R', 'Z']
include: ['BE.MEM.*.R', 'BE.RCHB.*.R', 'BE.UCC.*.R', 'GB.BIGH.*.R', 'GB.CWF.*.R', 'GB.DRUM.*.R', 'GB.HLM1.*.R', 'GB.HTL.*.R', 'GB.KPL.*.R', 'GB.LMK.*.R', 'GB.RSBS.*.R', 'GB.WACR.*.R', 'GB.WLF1.*.R', 'GE.ILTH.*.R', 'GE.PBUR.*.R', 'GE.SLIT.*.R', 'GE.VAL.*.R', 'GR.AHRW.*.R', 'GR.ASSE.*.R', 'GR.BRG.*.R', 'GR.BSEG.*.R', 'GR.BUG.*.R', 'GR.CLZ.*.R', 'GR.GRA1.*.R', 'GR.GRA2.*.R', 'GR.GRA3.*.R', 'GR.GRAB1.*.R', 'GR.GRAB2.*.R', 'GR.GRAB3.*.R', 'GR.GRC4.*.R', 'GR.KAST.*.R', 'GR.MOX.*.R', 'GR.RETH.*.R', 'GR.TNS.*.R', 'KQ.MRLW.*.R', 'NL.G81B.*.R', ‘NL.G82B’, 'NL.G83B.*.R', 'NL.G84B.*.R', 'NL.WTSB.*.R', ‘NO.NAO01’, 'NO.NB201.*.R', 'NO.NBO00.*.R', 'NO.NC204.*.R', ‘NO.NC303’, 'NO.NC602.*.R', 'NS.ASK.*.R', 'NS.BER.*.R', 'NS.HOMB.*.R', 'NS.HYA.*.R', 'NS.KMY.*.R', 'NS.LADE.*.R', 'NS.LENS.*.R', 'NS.ODD1.*.R', 'NS.SKAR.*.R', 'NS.SNART.*.R', 'BE.MEM.*.Z', 'BE.RCHB.*.Z', 'BE.UCC.*.Z', 'DK.COP.*.Z', 'DK.GOET.*.Z', 'DK.MUD.*.Z', 'DK.OVD.*.Z', 'GB.BIGH.*.Z', 'GB.CWF.*.Z', 'GB.DRUM.*.Z', 'GB.HLM1.*.Z', 'GB.HMNX.*.Z', 'GB.HPK.*.Z', 'GB.HTL.*.Z', 'GB.INVG.*.Z', 'GB.IOMK.*.Z', 'GB.KPL.*.Z', 'GB.LMK.*.Z', 'GB.NEWG.*.Z', 'GB.RSBS.*.Z', 'GB.STNC.*.Z', 'GB.SWN1.*.Z', 'GB.WACR.*.Z', 'GB.WLF1.*.Z', 'GE.FALKS.*.Z', 'GE.FLT1.*.Z', 'GE.HLG.*.Z', 'GE.IBBN.*.Z', 'GE.ILTH.*.Z', 'GE.PABE.*.Z', 'GE.PBUR.*.Z', 'GE.SLIT.*.Z', 'GE.VAL.*.Z', 'GE.VSU.*.Z', 'GR.AHRW.*.Z', 'GR.ASSE.*.Z', 'GR.BRG.*.Z', 'GR.BSEG.*.Z', 'GR.BUG.*.Z', 'GR.CLL.*.Z', 'GR.CLZ.*.Z', 'GR.FBRG.*.Z', 'GR.GOR1.*.Z', 'GR.GRA1.*.Z', 'GR.GRA2.*.Z', 'GR.GRA3.*.Z', 'GR.GRA4.*.Z', 'GR.GRB1.*.Z', 'GR.GRB2.*.Z', 'GR.GRB3.*.Z', 'GR.GRB5.*.Z', 'GR.GRC4.*.Z', 'GR.CTTG.*.Z', 'GR.HAM.*.Z', 'GR.HLGA1.*.Z', 'GR.HLGA2.*.Z', 'GR.HLGA3.*.Z', 'GR.HLGB1.*Z', 'GR.HLGB2.*.Z', 'GR.IGAD.*.Z', 'GR.KAST.*.Z', 'GR.KHUS.*.Z', 'GR.KUDEN.*.Z', 'GR.LNIZ.*.Z', 'GR.LUEB.*.Z', 'GR.MILB.*.Z', 'GR.MOX.*.Z', 'GR.RETH.*.Z', 'GR.RETHO.*.Z', 'GR.SKMB.*.Z', 'GR.TNS.*.Z', 'GR.ZARR.*.Z', 'KQ.NONN.*.Z', 'KQ.PEEM.*.Z', 'NL.G81B.*.Z', 'NL.G82B.*.Z', 'NL.G83B.*.Z', 'NL.G84B.*.Z', 'NL.HGN.*.Z', 'NL.WTSB.*.Z', 'NO.ARA0.*.Z', 'NO.ARA1.*.Z', 'NO.ARA2.*.Z', 'NO.ARA3.*.Z', 'NO.ARB1.*.Z', 'NO.ARB2.*.Z', 'NO.ARB3.*.Z', 'NO.ARB4.*.Z', 'NO.ARB5.*.Z', 'NO.ARC1.*.Z', 'NO.ARC4.*.Z', 'NO.ARC5.*.Z', 'NO.ARC6.*.Z', 'NO.ARC7.*.Z', 'NO.ARD2.*.Z', 'NO.ARD3.*.Z', 'NO.ARD4.*.Z', 'NO.ARD5.*.Z', 'NO.ARD6.*.Z', 'NO.ARD7.*.Z', 'NO.ARD8.*.Z', 'NO.ARD9.*.Z', 'NO.JMIC.*.Z', 'NO.NAO00.*.Z', 'NO.NAO01.*.Z', 'NO.NAO03.*.Z', 'NO.NAO04.*.Z', 'NO.NAO05.*.Z', 'NO.NB200.*.Z', 'NO.NB201.*.Z', 'NO.NB202.*.Z', 'NO.NB204.*.Z', 'NO.NB205.*.Z', 'NO.NBO00.*.Z', 'NO.NBO02.*.Z', 'NO.NBO03.*.Z', 'NO.NBO04.*.Z', 'NO.NC200.*.Z', 'NO.NC201.*.Z', 'NO.NC202.*.Z', 'NO.NC203.*.Z', 'NO.NC204.*.Z', 'NO.NC300.*.Z', 'NO.NC301.*.Z', 'NO.NC302.*.Z', 'NO.NC303.*.Z', 'NO.NC304.*.Z', 'NO.NC305.*.Z', 'NO.NC400.*.Z', 'NO.NC401.*.Z', 'NO.NC402.*.Z', 'NO.NC403.*.Z', 'NO.NC404.*.Z', 'NO.NC600.*.Z', 'NO.NC601.*.Z', 'NO.NC602.*.Z', 'NO.NC603.*.Z', 'NO.NC604.*.Z', 'NO.NC605.*.Z', 'NS.ASK.*.Z', 'NS.BER.*.Z', 'NS.BLS5.*.Z', 'NS.DOMB.*.Z', 'NS.FAUS.*.Z', 'NS.FOO.*.Z', 'NS.HAMF.*.Z', 'NS.HOMB.*.Z', 'NS.HYA.*.Z', 'NS.JNE.*.Z', 'NS.JNW.*.Z', 'NS.KNY.*.Z', 'NS.KTK1.*.Z', 'NS.LADE.*.Z', 'NS.LENS.*.Z', 'NS.LOF.*.Z', 'NS.LOSSI.*.Z', 'NS.MOL.*.Z', 'NS.NSS.*.Z', 'NS.ODD1.*.Z', 'NS.ROES.*.Z', 'NS.SKAR.*.Z', 'NS.SNART.*.Z', 'NS.STAV.*.Z', 'NS.STEI.*.Z', 'NS.SUE.*.Z', 'NS.TRO.*.Z', 'NS.VAGH.*.Z', 'NS.VBYGD.*.Z']
# How to weight contributions from this group in the global misfit
weight: 1.0
# subsection on how to fit the traces
misfit_config: !grond.WaveformMisfitConfig
# Frequency band [Hz] of acausal filter (flat part of frequency taper)
fmin: 0.01
fmax: 0.05
# Factor defining fall-off of frequency taper (zero at fmin/ffactor and
# fmax*ffactor)
ffactor: 1.5
# Time window to include in the data fitting. Times can be defined offset
# to given phase arrivals. E.g. '{stored:P}-600' would mean 600 s
# before arrival of the phase named 'P'. The phase must be defined in the
# travel time tables in the GF store.
tmin: '{stored:anyP}'
tmax: '{vel_surface:2.5}'
# tfade: 120.0
# How to fit the data (available: 'time_domain', 'frequency_domain',
# 'log_frequency_domain', 'absolute', 'envelope', 'cc_max_norm')
domain: 'cc_max_norm'
# If non-zero, allow synthetic and observed traces to be shifted
# against each other by up to +/- the given value [s].
tautoshift_max: 4.0
# If non-zero, a penalty misfit is added for non-zero shift values.
# The penalty value is computed as
# autoshift_penalty_max * normalization_factor * tautoshift**2 / tautoshift_max**2
autoshift_penalty_max: 0.05
# For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 2
# How to interpolate the Green's functions (available choices:
# 'nearest_neighbor', 'multilinear'). Choices other than 'nearest_neighbor'
# may require dense GF stores to avoid aliasing artifacts in the forward
# modelling.
interpolation: 'nearest_neighbor'
# Name of the GF Store to use
store_id: 'northsea'
# -----------------------------------------------------------------------------
# Definition of the problem to be solved
#
# In this section the source model to be fitted is chosen, the parameter space
# defined, and how to combine the misfit contributions defined in the
# target_groups section above.
#
# The marker !grond.CMTProblemConfig selects a centroid moment tensor source
# model.
# -----------------------------------------------------------------------------
problem_config: !grond.CMTProblemConfig
# Name used to identify the output
name_template: 'cmt_<year_month_day>_<hour_min>__1d_a_a_100k_150x150km_rec${event_name}'
# Definition of model parameter space to be searched in the optimisation
ranges:
# Time relative to hypocenter origin time [s]
time: '-10 .. 10 | add'
# Centroid location with respect to hypocenter origin [m]
north_shift: '-150e3 .. 150e3'
east_shift: '-150e3 .. 150e3'
depth: '5e3 .. 35e3'
# Range of magnitudes to allow
magnitude: '4.8 .. 6.2'
# Relative moment tensor component ranges (don't touch)
rmnn: '-1.41421 .. 1.41421'
rmee: '-1.41421 .. 1.41421'
rmdd: '-1.41421 .. 1.41421'
rmne: '-1 .. 1'
rmnd: '-1 .. 1'
rmed: '-1 .. 1'
# Source duration range [s]
duration: '1. .. 10.'
# Clearance distance around stations (no models with origin closer than this
# distance to any station are produced by the sampler)
distance_min: 100
# Type of moment tensor to restrict to (choices: 'full', 'deviatoric', 'dc')
mt_type: 'deviatoric'
# How to combine the target misfits. For L1 norm: 1, L2 norm: 2, etc.
norm_exponent: 1
# -----------------------------------------------------------------------------
# Configuration of pre-optimisation analysis phases.
# determined during this phase.
# -----------------------------------------------------------------------------
#
analyser_configs:
# Balancing weights are determined with this analyser
- !grond.TargetBalancingAnalyserConfig
# Number of models to forward model in the analysis, larger number -> better
# statistics)
niterations: 10000
# -----------------------------------------------------------------------------
# Configuration of the optimisation procedure
# -----------------------------------------------------------------------------
optimiser_config: !grond.HighScoreOptimiserConfig
# Number of bootstrap realisations to be tracked simultaneously in the
# optimisation
nbootstrap: 100
# stages of the sampler. Start with uniform sampling of the model space
# (!grond.UniformSamplerPhase), then narrow down to the interesting regions
# (!grond.DirectedSamplerPhase).
sampler_phases:
- !grond.UniformSamplerPhase
# Number of iterations
niterations: 2000
- !grond.DirectedSamplerPhase
# Number of iterations
niterations: 100000
# Multiplicator for width of sampler distribution at start of this phase
scatter_scale_begin: 2.0
# Multiplicator for width of sampler distribution at end of this phase
scatter_scale_end: 0.5
# -----------------------------------------------------------------------------
# Configuration section for synthetic seismogram engine
#
# Configures where to look for GF stores.
# -----------------------------------------------------------------------------
engine_config: !grond.EngineConfig
# Whether to use GF store directories listed in ~/.pyrocko/config.pf
gf_stores_from_pyrocko_config: false
# List of directories with GF stores
gf_store_superdirs: ['gf_stores']
Configured like this, Grond will try to fit Rayleigh waves in the frequency range 0.01 to 0.05 Hz on the vertical (Z) and radial (R) components as well as Love waves on the transverse (T) component of ground displacement in time (td) and cross-correlation (cc) domains. The mismatch between observation and modelling will be measured using an L1 norm.
8.5 Run moment tensor inversion
Once we prepared the project folder, the data and corresponding config file for the selected event we can proceed with the moment tensor computations. Before starting focal mechanisms optimisations, we need to preform the check of our project setup and files. For that we need to use the following command:
grond check config/my_config.gronf
in case of error messages, we can expand the output from Grond by using debug mode:
grond check --loglevel debug config/my_config.gronf
In case if we received a confirmation that the status of our selected stations / components is ok, then we can run the inversion:
grond go config/my_config.gronf
To split the computations between the specified number (N) of CPU’s use the following command:
grond go config/my_config.gronf --parallel=N
8.6 Grond report
Once the computation is finished the report can be generated using:
grond report -so runs/grun_name.grun
Make sure that a web browser is installed before running this command to be able to use HTML reports.
8.7 Report folder structure
After computations are finalised, Grond creates an HTML report for the earthquake source inversion results, which include the best and mean parameter results, waveform fit plots for the best model, histogram plots of the inverted parameters, the distribution of location estimates, a moment tensor decomposition, a Hudson plot and others. A complete report directory structure and a short description corresponding folders and files can be found below:
event # report folder
├── config.yaml # a config file, which was used for the computations
├── event.reference.yaml # reference solution used for the compuataion
├── event.solution.best.yaml #best solution for the moment tensor
├── event.solution.ensemble.yaml
├── event.solution.mean.yaml #
├── index.yaml
└── plots # directory with available plots for the current problem
│ └── acceptance # Model acceptance plots and accepted model popularities.
│ └── bootstrap # Evolution of the misfits for all bootstrap chains.
│ └── check_waveform # Plots for checking the waveforms fit with a number of synthetics.
│ └── contributions # Contributions of the targets towards the misfit.
│ └── fits_waveform # Best model's waveform fits.
│ └── fits_waveform_ensemble # Plots showing all waveform fits for the ensemble of solutions.
│ └── histogram # Distribution of the problem's parameters.
│ └── hudson # Hudson plot of the best fitting moment tensor.
│ └── jointpar # Source problem parameter's tradeoff plots.
│ └── location_mt # Location plots of the best ensemble of solutions.
│ └── mt_decomposition # Moment tensor decomposition of the best-fitting solution.
│ └── mt_fuzzy # Moment tensor fuzzy plot
│ ├── plot_collection.yaml
│ └── seismic_stations # Plot showing seismic station locations and attributes.
│ └── sequence # Sequence plots for all parameters of the optimisation.
├── problem.yaml
├── stats.yaml
Some examples of the online Grond reports can be found here.
8.8 Moment tensor solution file
The best-fitted solution of the moment tensor optimisation run is written after the computation into a yaml file of the following structure:
%YAML 1.1
--- !pf.Event
lat: 61.53
lon: 2.53
north_shift: 36579.64841197375
east_shift: -23958.473990570325
time: '2022-03-21 05:32:57.769624233'
depth: 15555.58204160823
name: 'event_2022-03-21_05-32-55'
magnitude: 5.148886738816296
moment_tensor: !pf.MomentTensor
mnn: 8408285834882960.0
mee: -6.06904536081925e+16
mdd: 5.2282167773309544e+16
mne: -2991996683795752.5
mnd: 1.4653628507052434e+16
med: -7317396151973470.0
strike1: 160.9997865390142
dip1: 44.13436676781377
rake1: 65.22500106621825
strike2: 13.743556595460444
dip2: 50.78351378363273
rake2: 112.12573145003941
moment: 5.933761797954425e+16
magnitude: 5.148886738816296
duration: 7.435342530370784
8.9 Examples of results plots from the optimisation performed with Grond
Grond provides versatile and numerous graphics generated in the report folder. In the following subsections, we will focus on the most valuable plots from our opinion and provide some examples.
8.9.1 Location plot
The location plot provides information on the ensemble of best solutions in three cross-sections. The coordinate space range is predefined by the search space provided in the config file. Symbols show the best double-couple mechanisms, and colours depict the misfit: red for low and blue for high misfits.
Figure 8.1: Location of the ensemble of 100 best solutions in three cross-sections for the earthquake of 21 March 2022.
8.9.2 Moment tensor solution plot
A moment tensor decomposition plot allows us to evaluate the isotropic, deviatoric, and best double couple components of the best-fitting solution for the moment tensor solution. The plot consists of the best ensemble mean and, if available, reference moment tensor solutions. If there is no reference solution available, the agreement between the best solution and the mean solution, with a combination of the well-confined event location (see Figure 8.1), can be used as an indication of the stability of the acquired result.
Figure 8.2: Moment tensor decomposition of the best-fitting solution into deviatoric and best double-couple components.
8.9.3 Histogram plots
The distribution of the problem’s parameters can be estimated using the histogram plots. Two figures below demonstrate the assessments for (a) magnitude, (b) depth [km], (c) duration [s], (d) origin time [s], (e) easting [km] and (f) northing [km] (Figure 8.3) and (a) strike 1 [◦], (b) strike 2 [◦], (c) dip 1 [◦], (d) dip 2 [◦], (e) rake 1 [◦] and (f) rake 2 [◦] (Figure 8.4).
Figure 8.3: Distribution of the inverted parameters: (a) magnitude, (b) depth [km], (c) duration [s], (d) origin time [s], (e) easting [km] and northing [km]. The overlapping red-shaded areas show the 68% confidence intervals (innermost area), the 90% confidence intervals (middle area) and the minimum and maximum values (widest area). The plot ranges are defined by the given parameter bounds and illustrate the model space.
Figure 8.4: Distribution of the inverted parameters: (a) strike 1 [◦], (b) strike 2 [◦], (c) dip 1 [◦], (d) dip 2 [◦], (e) rake 1 [◦] and rake 2 [◦]. The overlapping red-shaded areas show the 68% confidence intervals (innermost area), the 90% confidence intervals (middle area) and the minimum and maximum values (widest area). The plot ranges are defined by the given parameter bounds and illustrate the model space.
8.9.4 Hudson plot
Hudson’s source type plot with the ensemble of bootstrap solutions. The focal mechanism is depicted for about 10% of the solutions (randomly chosen), and others are represented as dots. The square marks the global best-fitting solution.
Figure 8.5: Hudson plot displaying the decomposition of moment tensor components into their isotropic (ISO), double-couple (DC), compensated linear vector dipole (CLVD) parts (see Hudson et al., 1989) with the ensemble of bootstrap solutions. The best solution is identified by a square, the mean by a large beachball. The deviatoric solution excludes the computation of isotropic components, and therefore, the estimated moment tensor solutions align on the CLVD axis.
8.9.5 Waveform misfits
This type of plot shows observed and synthetic waveforms (attributes) for the best-fitting model. Grond has the flexibility of using different types of targets: time domain, amplitude spectra, envelopes, and cross-correlation function. For our computations, we performed data fittings for the selection of time domain (TD) waveforms and cross-correlation (CC) functions. This combination provided the most stable moment tensor results. Previous publications (Cabieces et al. 2020; Kühn et al. 2020) indicate that, especially in the case of unreliable waveform information, cross-correlation functions can be used to improve depth and location estimates and employ phase information that otherwise would be lost. Figure 8.6 illustrates some of the waveform fits in waveform fits in the cross-correlation domain for the station BE.RCHB and in the time domain for the station GR.CLL. This type of figures in the Grond report allows for evaluation of the best-fitting model and, if needed, can be used as a quality control instrument to exclude the waveforms with insufficient fitting.
Figure 8.6: Examples of the best models waveform fits in the cross-correlation domain for the station BE.RCHB and in the time domain for the station GR.CLL.
On the left side we can find target information. From top to bottom it provides station name with component, distance to source, azimuth of station with respect to source, target weight, target misfit and starting time of the waveform relative to the origin time.
The gray background area displays the taper function that has been applied.
The graphs displayed include therestituted and filtered observed trace without tapering (light grey), the same trace after tapering and processing (dark grey), a synthetic trace (light red), and the shifted and processed synthetic target trace (red). The amplitude of each trace is adjusted based on its weight, and is normalized to the maximum amplitude of the targets in the same normalization group.
The lower panel displays sample-wise residuals for time domain comparisons (marked in red), amplitude spectra of observed and synthetic traces for amplitude spectrum comparisons, or cross correlation traces, depending on the type of comparison chosen.
The colored boxes in the upper right indicate the target’s weight compared to the entire dataset in the optimization process (orange box at the top) and its contribution to the overall misfit in the optimization (red box at the bottom).
8.9.6 Sequence plots
Below are included some examples of the sequence plots for the selected parameters of the optimisation: (a) magnitude, (b) depth [km], (c) duration [s], (d) origin time [s], (e) easting [km] and (f) northing [km] (Figure 8.7) and (a) strike 1 [◦], (b) strike 2 [◦], (c) dip 1 [◦], (d) dip 2 [◦], (e) rake 1 [◦] and (f) rake 2 [◦] (Figure 8.8).
Figure 8.7: Examples of the sequence plots for some of the parameters of the optimisation.: (a) magnitude, (b) depth [km], (c) duration [s], (d) origin time [s], (e) easting [km] and northing [km].
Figure 8.8: Examples of the sequence plots for some of the parameters of the optimisation.: (a) strike 1 [◦], (b) strike 2 [◦], (c) dip 1 [◦], (d) dip 2 [◦], (e) rake 1 [◦] and rake 2 [◦].
This plot type helps monitor convergence and check if model parameters exceed their bounds. Relatively high misfit values are shown in cold blue colours and low misfits in red.