Multi-dataset Survey

This example demonstrates the typical workflow for creating a GS file for an AEM survey in its entirety, i.e., the NetCDF file contains all related datasets together, e.g., raw data, processed data, inverted models, and derivative products. Specifically, this survey contains:

  1. Minimally processed (raw) AEM data and raw/processed magnetic data provided by SkyTEM

  2. Fully processed AEM data used as input to inversion

  3. Laterally constrained inverted resistivity models

  4. Point-data estimates of bedrock depth derived from the AEM models

  5. Interpolated magnetic and bedrock depth grids

Note: To make the size of this example more managable, some of the input datasets have been downsampled relative to the source files in the data release referenced below.

Dataset Reference: Minsley, B.J, Bloss, B.R., Hart, D.J., Fitzpatrick, W., Muldoon, M.A., Stewart, E.K., Hunt, R.J., James, S.R., Foks, N.L., and Komiskey, M.J., 2022, Airborne electromagnetic and magnetic survey data, northeast Wisconsin (ver. 1.1, June 2022): U.S. Geological Survey data release, https://doi.org/10.5066/P93SY9LI.

import matplotlib.pyplot as plt
from os.path import join
import numpy as np
import gspy

Convert the Skytem csv data to NetCDF

Initialize the Survey

# Path to example files
data_path = '..//..//..//..//example_material//example_3'

# Survey metadata file
metadata = join(data_path, "data//LoupeEM_survey_md.yml")

# Establish the Survey
survey = gspy.Survey.from_dict(metadata)

data_container = survey.gs.add_container('data')

data = join(data_path, 'data//Kankakee.dat')
metadata = join(data_path, 'data//Loupe_data_metadata.yml')
data_container.gs.add(key='raw_data', data_filename=data, metadata_file=metadata)
<xarray.DatasetView> Size: 11MB
Dimensions:       (index: 11633, gate_times: 23)
Coordinates:
    spatial_ref   float64 8B 0.0
  * index         (index) int32 47kB 0 1 2 3 4 ... 11628 11629 11630 11631 11632
    x             (index) float64 93kB 5.248e+05 5.248e+05 ... 5.248e+05
    y             (index) float64 93kB 4.583e+06 4.583e+06 ... 4.583e+06
    z             (index) float64 93kB 211.5 211.5 211.5 ... 204.4 204.4 204.4
  * gate_times    (gate_times) float64 184B 1.297e-05 1.495e-05 ... 0.002183
Data variables: (12/45)
    fid           (index) object 93kB '1' '2' '3' ... '12120' '12121' '12122'
    acq           (index) float64 93kB 1.0 1.0 1.0 1.0 ... 25.0 25.0 25.0 25.0
    acq_rdg       (index) float64 93kB 0.0 1.0 2.0 3.0 ... 364.0 365.0 366.0
    acq_time      (index) object 93kB '20230808T175252.504075397Z' ... '20230...
    time          (index) object 93kB '20230808T175253.000000000Z' ... '20230...
    ts            (index) float64 93kB 1.692e+09 1.692e+09 ... 1.692e+09
    ...            ...
    y_powerphase  (index) float64 93kB 1.006 1.07 1.008 ... -2.935 -2.884 -2.952
    z_powerphase  (index) float64 93kB 1.663 1.679 1.748 ... 0.9777 1.006 1.041
    X_CH          (index, gate_times) float64 2MB 491.5 357.4 ... 0.01459
    Y_CH          (index, gate_times) float64 2MB -6.219 6.26 ... -0.002063
    Z_CH          (index, gate_times) float64 2MB 499.8 434.7 ... 6.37e-05
    line          (index) int64 93kB 1 1 1 1 1 1 1 1 ... 25 25 25 25 25 25 25 25
Attributes:
    content:     raw data
    comment:     This dataset includes minimally processed (raw) AEM data
    type:        data
    method:      electromagnetic
    instrument:  loupe


Save to NetCDF file

d_out = join(data_path, 'data//Loupe.nc')
survey.gs.to_netcdf(d_out)

Reading back in

new_survey = gspy.open_datatree(d_out)['survey']

Plotting

plt.figure()
new_survey['data/raw_data']['height'].plot(label='height')
new_survey['data/raw_data']['tx_height'].plot(label='tx_height')
new_survey['data/raw_data']['rx_height'].plot(label='rx_height')
plt.tight_layout()
plt.legend()

plt.show()
spatial_ref = 0.0

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

Gallery generated by Sphinx-Gallery