Method-Aware QC#
An EMMethod names the survey method, but on
its own it changes no threshold. The pycsamt.iot.methods module
carries the canonical, per-method knowledge that turns a method name into
concrete QC defaults, so the same monitor behaves correctly for AMT, MT,
CSAMT, CSEM, and TDEM/TEM without hand-tuning.
Method profiles#
A MethodProfile records the typical acquisition band,
the channels a valid record must carry, a nominal sample rate, and whether
the method uses a controlled source or is sensitive to powerline noise:
from pycsamt.iot import method_profile
p = method_profile("csamt")
p.frequency_band_hz # (0.125, 8192.0)
p.required_channels # ('ex', 'ey', 'hx', 'hy')
p.controlled_source # True
p.powerline_sensitive # True
Method |
Band (Hz) |
Required channels |
Source |
Powerline |
|---|---|---|---|---|
AMT |
1 – 10 000 |
ex, ey, hx, hy |
natural |
sensitive |
MT |
1e-4 – 1000 |
ex, ey, hx, hy, hz |
natural |
sensitive |
CSAMT |
0.125 – 8192 |
ex, ey, hx, hy |
controlled |
sensitive |
CSEM |
0.01 – 100 |
ex, ey, hx, hy |
controlled |
sensitive |
TDEM / TEM |
(time-domain) |
hz |
controlled |
not sensitive |
The band edges are representative defaults, not hard standards; override them per survey when acquisition parameters differ.
Seeding a monitor#
for_method() seeds the expected band
and required channels from a profile, so the method-mismatch,
missing-channel, and out-of-band checks in
TelemetryMonitor become method-aware with no manual
tuning. Keyword overrides win over the profile defaults:
from pycsamt.iot import MonitoringConfig, assess_telemetry
cfg = MonitoringConfig.for_method("csamt", min_battery_v=11.5)
status = assess_telemetry(packets, config=cfg)
# an MT packet, or one missing hx/hy, now raises method_mismatch /
# required_channels_missing against the CSAMT expectations.
Method-aware edge QC#
Passing method to amt_edge_report() gates the
diagnostics by method. Powerline-harmonic detection runs only for
powerline-sensitive methods – it is skipped for TDEM/TEM, where the report
carries powerline_applicable=False instead of a misleading “clean”
verdict – and frequency coverage is scored against the method’s target
bands:
from pycsamt.iot import amt_edge_report, target_bands_for_method
report = amt_edge_report(window, sample_rate, method="amt")
report["powerline_applicable"] # True for AMT
report["frequency_coverage"]["coverage_fraction"] # scored vs AMT bands
target_bands_for_method("csamt")
# [(0.125, 1.0), (1.0, 10.0), (10.0, 100.0), (100.0, 1000.0), (1000.0, 8192.0)]
Passing no method preserves the original, method-agnostic behaviour.