csemx example bundles

Synthetic, validating example bundles covering a compact set of representative controlled-source EM acquisition styles. Values are order-of-magnitude synthetic responses, not real survey data or benchmark forward responses. Validate the CSV-only examples with:

python3 tools/validate_csemx.py examples/<name>.csemx

The mixed Parquet example requires pyarrow in the Python environment running the validator.

The public example set is:

public bundle configuration exercises
example.csemx mixed land/borehole sampler (matches spec §13) every geometry flavor: wire/loop/point Tx, E-wire/B-point/B-loop Rx; UTC acquisition timestamps
example_mixed_parquet.csemx same geometry as example.csemx, with data.parquet mixed CSV/Parquet delivery; string-typed IDs in Parquet
land_dipole_dipole.csemx land CSEM, inline dipole–dipole grounded HED Tx + inline E-dipole Rx at increasing offset; tx_fundamental; use=0; NaN missing datum; ext_line_id extension
land_grid_lines.csemx land CSEM grid, two intersecting lines the optional groups.csv table (§10): a station on two crossing lines (many-to-many membership); sequence as ranks with gaps; a fixed wire Tx shooting an Rx line without being a member of it; one line with independent TX and RX sequences; component-level array membership
seafloor_vector.csemx seafloor node + deep-towed 300 m HED moving Tx; altitude.reference: seafloor; vertical Ez dipole; negative elev; use flag
airborne_hem.csemx airborne frequency-domain EM (HEM) moving point-dipole bird; coplanar vs coaxial via azimuth_deg/dip_deg; altitude.reference: ground; field.content: secondary (secondary T/A, primary from geometry; ppm is derived); nav_* attitude/uncertainty columns and sub-second time_utc (§3.13)

Each .csemx directory is an unpacked bundle (manifest.yaml + the five required tables, plus an optional notes.md and an optional groups.csv element-membership table, spec §10); example.csemx.zip is the archived form showing the preferred single-top-level-directory delivery shape.

Most example bundles are kept in CSV form for readability. The specification allows any required table to be delivered as Parquet (<table>.parquet) instead of CSV; example_mixed_parquet.csemx exercises that path by using data.parquet.

Fill-in template: template.csemx

template.csemx is not a worked example — it is an editable, non-normative starting point for producers assembling a bundle by hand (in a text editor or spreadsheet, no programming required). It contains pre-headed CSV tables with REPLACE-marked placeholder rows, a fully commented manifest.yaml, a notes.md skeleton, an optional groups.csv starter, and a README.md with step-by-step fill-in instructions.

Unlike the worked examples above, the template intentionally fails validation as shipped (placeholder coordinates and measurements are blank), so a half-filled copy cannot pass as a real delivery; it validates only once filled in. tools/check_examples.sh therefore skips it.