pycsamt.iot.edge_csem#

CSEM controlled-source electromagnetic edge quality control.

CSEM shares the controlled-source primitives in edge_csamt (skin-depth field zones, transmitter frequency comb, source stability), but its defining measurement is different: a dipole source is recorded by a receiver array and the signature data product is the response as a function of source-receiver offset at each frequency – magnitude-versus-offset (MVO) and phase-versus-offset (PVO).

This module provides the offset-domain QC that is specific to CSEM:

  • field_vs_offset() builds an MVO/PVO curve, flags where the signal drops below the noise floor (the detectability limit), and checks that the amplitude decays monotonically with offset – a bump usually means a bad receiver, a geometry error, or genuine 3-D structure worth a second look;

  • csem_edge_report() / csem_edge_table() collate one or more frequency responses.

Everything is numpy-only, consistent with the rest of the edge modules.

Functions

csem_edge_report(offsets_m, amplitudes, *[, ...])

Run the CSEM offset-domain diagnostics for one frequency.

csem_edge_table(reports, *[, api])

Flatten one or more csem_edge_report() results into a table.

field_vs_offset(offsets_m, amplitudes, *[, ...])

Build a magnitude/phase-versus-offset curve and QC it.

Classes

OffsetResponse(frequency_hz[, offsets_m, ...])

Result of field_vs_offset() -- one MVO/PVO curve.

class pycsamt.iot.edge_csem.OffsetResponse(frequency_hz, offsets_m=<factory>, amplitudes=<factory>, phases_deg=None, above_noise=<factory>, max_detectable_offset_m=None, monotonic_decay=False, dynamic_range_db=nan)[source]#

Bases: PyCSAMTObject

Result of field_vs_offset() – one MVO/PVO curve.

Parameters:
frequency_hz: float | None#
offsets_m: list[float]#
amplitudes: list[float]#
phases_deg: list[float] | None = None#
above_noise: list[bool]#
max_detectable_offset_m: float | None = None#
monotonic_decay: bool = False#
dynamic_range_db: float = nan#
property n_offsets: int[source]#
property n_detectable: int[source]#
as_dict()[source]#
Return type:

dict[str, Any]

pycsamt.iot.edge_csem.field_vs_offset(offsets_m, amplitudes, *, phases_deg=None, noise_floor=None, frequency_hz=None, monotonic_tol=0.05)[source]#

Build a magnitude/phase-versus-offset curve and QC it.

Parameters:
  • offsets_m (array-like of float) – Source-receiver offsets in metres (need not be sorted).

  • amplitudes (array-like of float) – Field amplitude at each offset (e.g. normalised E-field). Must be non-negative and the same length as offsets_m.

  • phases_deg (array-like of float, optional) – Phase at each offset in degrees, carried through for PVO.

  • noise_floor (float, optional) – Amplitude below which a reading is not detectable. When given, the largest offset above the floor is reported as the detectability limit and only detectable points drive the decay/dynamic-range QC.

  • frequency_hz (float, optional) – Frequency this curve was measured at, recorded for reference.

  • monotonic_tol (float) – Fractional tolerance when checking that amplitude never increases with offset (a[i+1] <= a[i] * (1 + tol)).

Return type:

OffsetResponse

pycsamt.iot.edge_csem.csem_edge_report(offsets_m, amplitudes, *, phases_deg=None, noise_floor=None, frequency_hz=None)[source]#

Run the CSEM offset-domain diagnostics for one frequency.

Parameters:
  • offsets_m (Any)

  • amplitudes (Any)

  • phases_deg (Any)

  • noise_floor (float | None)

  • frequency_hz (float | None)

Return type:

dict[str, Any]

pycsamt.iot.edge_csem.csem_edge_table(reports, *, api=None)[source]#

Flatten one or more csem_edge_report() results into a table.

Accepts a {label: report} mapping (or (label, report) pairs); the label is typically a frequency or receiver-line identifier.

Parameters:
Return type:

Any