10.1 Magnitude sensitivity for homogeneous model: test case 10#

This is an example of computing magnitude sensitivity for a homogeneous model.

Test case 10:

  • Geometry: a single station above the DAS cable in a deep vertical borehole

  • Data: Noise level at the station: 5e-9 m/s, for DAS - noise level decreasing with depth (from 5e-7 to 8.87e-12)

  • Velocity model: homogeneous, Vp = 4300 m/s, Vp/Vs = 1.73, Qp = 100, Qs = 50, rho = 2300 kg/m^3

  • Processing: magnitude sensitivity computation for all stations (for grid slices only).

Load all necessary packages#

import pynetdesign.visualization as pndvis
import pynetdesign.modelling as pndmod
import numpy as np
from time import time

# sphinx_gallery_thumbnail_number = -2

Input#

Read geometry#

### Read geometry
station_geometry_file_path = '../data/homo/test_10/TMPL_net_geometry_Single.txt'
station_geometry_df = pndmod.io.read_geometry(station_geometry_file_path)
print(station_geometry_df)
print(station_geometry_df.attrs)

das_geometry_file_path = '../data/homo/test_10/TMPL_net_geometry_Noise_Decreasing.txt'
das_geometry_df = pndmod.io.read_geometry(das_geometry_file_path)
print(das_geometry_df)
print(das_geometry_df.attrs)

### Show
print("\nStation geometry:")
print(station_geometry_df.head())
print(station_geometry_df.attrs)
print("\nDAS geometry:")
print(das_geometry_df.head())
print(das_geometry_df.attrs)
  Name    Y    X    Z    NoiseLevel
0  ST1  0.0  0.0 -0.0  5.000000e-09
{'file_path': '../data/homo/test_10/TMPL_net_geometry_Single.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'velocity', 'noise_unit': 'm/s', '_is_combined': False}
      Y    X       Z    NoiseLevel
0   0.0  0.0    10.0  5.000000e-07
1   0.0  0.0    60.0  4.170000e-07
2   0.0  0.0   110.0  3.470000e-07
3   0.0  0.0   160.0  2.890000e-07
4   0.0  0.0   210.0  2.410000e-07
..  ...  ...     ...           ...
56  0.0  0.0  2810.0  1.840000e-11
57  0.0  0.0  2860.0  1.530000e-11
58  0.0  0.0  2910.0  1.280000e-11
59  0.0  0.0  2960.0  1.060000e-11
60  0.0  0.0  3010.0  8.870000e-12

[61 rows x 4 columns]
{'file_path': '../data/homo/test_10/TMPL_net_geometry_Noise_Decreasing.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'strain', 'noise_unit': 'ε', 'gauge_length': 10.0, '_is_combined': False}

Station geometry:
  Name    Y    X    Z    NoiseLevel
0  ST1  0.0  0.0 -0.0  5.000000e-09
{'file_path': '../data/homo/test_10/TMPL_net_geometry_Single.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'velocity', 'noise_unit': 'm/s', '_is_combined': False}

DAS geometry:
     Y    X      Z    NoiseLevel
0  0.0  0.0   10.0  5.000000e-07
1  0.0  0.0   60.0  4.170000e-07
2  0.0  0.0  110.0  3.470000e-07
3  0.0  0.0  160.0  2.890000e-07
4  0.0  0.0  210.0  2.410000e-07
{'file_path': '../data/homo/test_10/TMPL_net_geometry_Noise_Decreasing.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'strain', 'noise_unit': 'ε', 'gauge_length': 10.0, '_is_combined': False}

Combine geometry#

combined_geometry_df = pndmod.io.combine_geometry(station_geometry_df,
                                                  das_geometry_df,
                                                  names=['Stations',
                                                         'DAS'])

### Show combined
print("\nCombined geometry:")
print(combined_geometry_df)
print(combined_geometry_df.attrs)
print("\nGeometry names:")
print(combined_geometry_df.get_names())
print("\nCombined status:",
      pndmod.io.is_combined_geometry(combined_geometry_df))

### Show recovered
print("\nStation geometry (recovered):")
print(combined_geometry_df.recover('Stations').head())
print("\nCombined status:",
      pndmod.io.is_combined_geometry(combined_geometry_df.recover('Stations')))

print("\nDAS geometry (recovered):")
print(combined_geometry_df.recover('DAS').head())
print("\nCombined status:",
      pndmod.io.is_combined_geometry(combined_geometry_df.recover('DAS')))
print("\nAttributes of DAS (recovered):")
print(combined_geometry_df.recover('DAS').attrs)
Combined geometry:
            Name    Y    X       Z    NoiseLevel
source
Stations 0   ST1  0.0  0.0    -0.0  5.000000e-09
DAS      0   NaN  0.0  0.0    10.0  5.000000e-07
         1   NaN  0.0  0.0    60.0  4.170000e-07
         2   NaN  0.0  0.0   110.0  3.470000e-07
         3   NaN  0.0  0.0   160.0  2.890000e-07
...          ...  ...  ...     ...           ...
         56  NaN  0.0  0.0  2810.0  1.840000e-11
         57  NaN  0.0  0.0  2860.0  1.530000e-11
         58  NaN  0.0  0.0  2910.0  1.280000e-11
         59  NaN  0.0  0.0  2960.0  1.060000e-11
         60  NaN  0.0  0.0  3010.0  8.870000e-12

[62 rows x 5 columns]
{'original_attributes': {'Stations': {'file_path': '../data/homo/test_10/TMPL_net_geometry_Single.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'velocity', 'noise_unit': 'm/s', '_is_combined': False}, 'DAS': {'file_path': '../data/homo/test_10/TMPL_net_geometry_Noise_Decreasing.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'strain', 'noise_unit': 'ε', 'gauge_length': 10.0, '_is_combined': False}}, '_is_combined': True}

Geometry names:
['Stations', 'DAS']

Combined status: True

Station geometry (recovered):
  Name    Y    X    Z    NoiseLevel
0  ST1  0.0  0.0 -0.0  5.000000e-09

Combined status: False

DAS geometry (recovered):
     Y    X      Z    NoiseLevel
0  0.0  0.0   10.0  5.000000e-07
1  0.0  0.0   60.0  4.170000e-07
2  0.0  0.0  110.0  3.470000e-07
3  0.0  0.0  160.0  2.890000e-07
4  0.0  0.0  210.0  2.410000e-07

Combined status: False

Attributes of DAS (recovered):
{'file_path': '../data/homo/test_10/TMPL_net_geometry_Noise_Decreasing.txt', 'original_coord_units': 'm', 'coordinate_system': 'local', 'noise_type': 'strain', 'noise_unit': 'ε', 'gauge_length': 10.0, '_is_combined': False}

Read velocity model#

velocity_file_path = '../data/homo/test_10/TMPL_velocity_model.txt'
velocity_df = pndmod.io.read_velocity(velocity_file_path)

print(velocity_df)
print(velocity_df.attrs)
   Depth    Vp  VpVsRatio   Qp  Qs   Rho   Ep   Dt   Gm
0  40000  4300       1.73  100  50  2300  0.0  0.0  0.0
{'model_type': 'homo', 'model_anisotropy': 'isotropic', 'parameter_descriptions': {'Depth': 'Depth', 'Vp': 'P-wave velocity', 'Vs': 'S-wave velocity', 'VpVsRatio': 'Vp/Vs', 'Qp': 'P-wave quality factor', 'Qs': 'S-wave quality factor', 'Rho': 'density', 'Ep': 'Thomsen epsilon parameter', 'Dt': 'Thomsen delta parameter', 'Gm': 'Thomsen gamma parameter'}, 'parameter_units': {'Depth': 'm', 'Vp': 'm/s', 'Vs': 'm/s', 'VpVsRatio': '', 'Qp': '', 'Qs': '', 'Rho': 'kg/m^3', 'Ep': '', 'Dt': '', 'Gm': ''}}

Set imaging grid parameters#

# Imaging grid parameters
gx = np.arange(-7000, 7000 + 100, 100)
gy = np.arange(-7000, 7000 + 100, 100)
gz = np.arange(0, 10000 + 100, 100)

# Generate grid points
grid_points = pndmod.utils.generate_grid(x=gx,y=gy,z=gz)
print("Number of grid points:",grid_points.size)
print("Number of grid points in x:",gx.size)
print("Number of grid points in y:",gy.size)
print("Number of grid points in z:",gz.size)
print("grid_points.shape:",grid_points.shape)
Number of grid points: 6023943
Number of grid points in x: 141
Number of grid points in y: 141
Number of grid points in z: 101
grid_points.shape: (2007981, 3)

Plot geometry and imaging grid#

_ = pndvis.geometry.plot_stations_view(df=combined_geometry_df,
                                       grid_points=grid_points,
                                       plot_names=False,
                                       grid_marker_size = 1,
                                       station_marker_size=100)
_ = pndvis.geometry.plot_stations_view(df=combined_geometry_df,
                                       grid_points=grid_points,
                                       plot_names=False,
                                       grid_marker_size = 1,
                                       station_marker_size=1,
                                       view = 'xz')
_ = pndvis.geometry.plot_stations_view(df=combined_geometry_df,
                                       grid_points=grid_points,
                                       plot_names=False,
                                       grid_marker_size = 1,
                                       station_marker_size=1,
                                       view = 'yz')
  • Map View of Stations
  • Side View of Stations: X-Z
  • Side View of Stations: Y-Z

Prepare to compute magnitude sensitivity#

# Get medium parameters
density = velocity_df.at[0,'Rho']
v_p = velocity_df.at[0,'Vp']
Q_p = velocity_df.at[0,'Qp']
v_s = velocity_df.at[0,'Vp']/velocity_df.at[0,'VpVsRatio']
Q_s = velocity_df.at[0,'Qs']
print("density, v_p, Q_p, v_s, Q_s:",density,v_p,Q_p,v_s,Q_s)

# Specify source parameters
frequency = 10 # Hz

# Minimum S/N for detection on individual channel
min_SNR_p = 2
min_SNR_s = 2

# Minimum stations on which an event must be detected
min_stations_p = 3
min_stations_s = 3

# Save parameters
params = pndmod.classes.DetectionParameters(
    f_p=frequency,
    f_s=frequency,
    min_SNR_p=min_SNR_p,
    min_SNR_s=min_SNR_s,
    min_stations_p=min_stations_p,
    min_stations_s=min_stations_s,
)

# Define slices to use
slice_X = 0
slice_Y = 0
slice_Z = 2400

# Get slice planes
X_plane_points, X_plane_indices = pndmod.utils.get_slice_coordinates(grid_points=grid_points,slice_dimension=0,slice_coordinate=slice_X)
Y_plane_points, Y_plane_indices = pndmod.utils.get_slice_coordinates(grid_points=grid_points,slice_dimension=1,slice_coordinate=slice_Y)
Z_plane_points, Z_plane_indices = pndmod.utils.get_slice_coordinates(grid_points=grid_points,slice_dimension=2,slice_coordinate=slice_Z)
density, v_p, Q_p, v_s, Q_s: 2300 4300 100 2485.549132947977 50

Compute magnitude sensitivity#

print("Computing magnitude sensitivity...")


start_time = time()
X_slice_mag_sens_p = pndmod.core.get_mag_sensitivity(grid_coords=X_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='P')
X_slice_mag_sens_s = pndmod.core.get_mag_sensitivity(grid_coords=X_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='S')
X_slice_mag_sens_ps = pndmod.core.get_mag_sensitivity(grid_coords=X_plane_points,
                                                      geometry_df=combined_geometry_df,
                                                      velocity_df=velocity_df,
                                                      params=params,
                                                      wave_mode='PS')
Y_slice_mag_sens_p = pndmod.core.get_mag_sensitivity(grid_coords=Y_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='P')
Y_slice_mag_sens_s = pndmod.core.get_mag_sensitivity(grid_coords=Y_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='S')
Y_slice_mag_sens_ps = pndmod.core.get_mag_sensitivity(grid_coords=Y_plane_points,
                                                      geometry_df=combined_geometry_df,
                                                      velocity_df=velocity_df,
                                                      params=params,
                                                      wave_mode='PS')
Z_slice_mag_sens_p = pndmod.core.get_mag_sensitivity(grid_coords=Z_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='P')
Z_slice_mag_sens_s = pndmod.core.get_mag_sensitivity(grid_coords=Z_plane_points,
                                                     geometry_df=combined_geometry_df,
                                                     velocity_df=velocity_df,
                                                     params=params,
                                                     wave_mode='S')
Z_slice_mag_sens_ps = pndmod.core.get_mag_sensitivity(grid_coords=Z_plane_points,
                                                      geometry_df=combined_geometry_df,
                                                      velocity_df=velocity_df,
                                                      params=params,
                                                      wave_mode='PS')
end_time = time()
print(f"Computation time: {end_time - start_time} seconds")
Computing magnitude sensitivity...
Computation time: 3.068803310394287 seconds

Plot magnitude sensitivity#

Plot magnitude sensitivity for P wave#

station_marker_size = 25
clb_range = None
plt_levels = None

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= X_slice_mag_sens_p, yi=gy, zi=gz,
                                              plot_title=f"Magnitude sensitivity at X={slice_X} m: YZ view, P-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Y_slice_mag_sens_p, xi=gx, zi=gz,
                                              plot_title=f"Magnitude sensitivity at Y={slice_Y} m: XZ view, P-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Z_slice_mag_sens_p, xi=gx, yi=gy,
                                              plot_title=f"Magnitude sensitivity at Z={slice_Z} m: XY view, P-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)
  • Magnitude sensitivity at X=0 m: YZ view, P-waves
  • Magnitude sensitivity at Y=0 m: XZ view, P-waves
  • Magnitude sensitivity at Z=2400 m: XY view, P-waves

Plot magnitude sensitivity for S wave#

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= X_slice_mag_sens_s, yi=gy, zi=gz,
                                              plot_title=f"Magnitude sensitivity at X={slice_X} m: YZ view, S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Y_slice_mag_sens_s, xi=gx, zi=gz,
                                              plot_title=f"Magnitude sensitivity at Y={slice_Y} m: XZ view, S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Z_slice_mag_sens_s, xi=gx, yi=gy,
                                              plot_title=f"Magnitude sensitivity at Z={slice_Z} m: XY view, S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)
  • Magnitude sensitivity at X=0 m: YZ view, S-waves
  • Magnitude sensitivity at Y=0 m: XZ view, S-waves
  • Magnitude sensitivity at Z=2400 m: XY view, S-waves

Plot magnitude sensitivity for P and S waves#

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= X_slice_mag_sens_ps, yi=gy, zi=gz,
                                              plot_title=f"Magnitude sensitivity at X={slice_X} m: YZ view, P- and S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Y_slice_mag_sens_ps, xi=gx, zi=gz,
                                              plot_title=f"Magnitude sensitivity at Y={slice_Y} m: XZ view, P- and S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)

_ = pndvis.sensitivity.plot_sensitivity_slice(sens_data= Z_slice_mag_sens_ps, xi=gx, yi=gy,
                                              plot_title=f"Magnitude sensitivity at Z={slice_Z} m: XY view, P- and S-waves",
                                              clb_title="$M_w$",
                                              geometry_df=combined_geometry_df,
                                              plot_names = False,
                                              station_marker_size = station_marker_size,
                                              clb_range=clb_range,
                                              plt_levels=plt_levels)
  • Magnitude sensitivity at X=0 m: YZ view, P- and S-waves
  • Magnitude sensitivity at Y=0 m: XZ view, P- and S-waves
  • Magnitude sensitivity at Z=2400 m: XY view, P- and S-waves

Total running time of the script: (0 minutes 8.346 seconds)

Gallery generated by Sphinx-Gallery