csemx Quickstart

A plain-language guide to assembling your first csemx bundle.

This guide is non-normative: it explains, but it does not rule. The full rules live in the specification. If anything here seems to disagree with the specification, the specification wins.

Who this is for

You are a contractor or data provider who has been asked to deliver frequency-domain CSEM data as a csemx bundle. You do not need to be a programmer, and you do not need to install anything to follow this guide. By the end you should know what goes in each file and be able to start filling them in with your own survey.

What a bundle is

A csemx bundle is a single file named like mysurvey.csemx.zip. It is an ordinary ZIP archive — the same kind of ZIP file every operating system can open. Inside the ZIP is one folder (its name is your choice, using only letters, digits, _, ., and -), and inside that folder sit six core files:

A bundle may additionally contain:

Laid out as a file tree:

mysurvey/
├── manifest.yaml
├── tx.csv
├── tx_vertices.csv
├── rx.csv
├── rx_vertices.csv
├── data.csv
├── groups.csv        (optional)
└── notes.md          (optional)

That is the whole format. The rest of this guide walks through a small example of every file.

Before you start: a warning about spreadsheets

Before entering data in Excel or similar software, format all station-ID and component-ID columns as text. Otherwise values such as 001 may be changed to 1, and long identifiers may be reformatted or converted to scientific notation. Export tables as UTF-8 comma-delimited CSV files.

After exporting, reopen the exported CSV file in a plain-text editor (Notepad, TextEdit in plain-text mode, or similar) — not in the spreadsheet program — and check:

Spreadsheets are a fine way to assemble the tables if you follow these steps. A plain-text editor avoids the problem entirely.

A small example survey

The rest of this guide uses one tiny synthetic survey:

All values are synthetic. Every excerpt below is complete and consistent: you can trace any station or component ID from one table to the next.

manifest.yaml

format:
  name: csemx
  version: "0.2"

domain: frequency

survey:
  name: "Quickstart Example"
  revision: 1
  acquired_start: "2026-06-10"
  acquired_end: "2026-06-12"
  contractor: "Example Geophysics Ltd"
  contractor_reference: "EG-2026-042"

coordinate_system:
  epsg_horizontal: 32612

elevation:
  epsg_vertical: 4979

sign:
  time_dependence: "exp(+iwt)"

In plain terms:

The full rules for the manifest are in specification §4.

tx.csv

One row per transmitter element:

tx_station_id,tx_component_id,geometry_type
TX01,E1,wire

A wire’s position and direction come entirely from its vertices (next file), so no other columns are needed here. A point transmitter would additionally need azimuth_deg, dip_deg, and point_moment_area_m2 columns for its coil axis and area — see specification §5.

tx_vertices.csv

The surveyed points that trace each transmitter:

tx_station_id,tx_component_id,vertex_index,easting,northing,elev
TX01,E1,0,551000.00,3625000.00,1478.00
TX01,E1,1,551400.00,3625000.00,1481.00

rx.csv

One row per receiver element:

rx_station_id,rx_component_id,geometry_type,azimuth_deg,dip_deg
001,Ex,wire,,
001,Bz,point,0,90
002,Ex,wire,,

rx_vertices.csv

rx_station_id,rx_component_id,vertex_index,easting,northing,elev
001,Ex,0,552000.00,3625000.00,1466.00
001,Ex,1,552100.00,3625000.00,1465.00
001,Bz,0,552050.00,3625000.00,1465.50
002,Ex,0,552400.00,3625000.00,1459.00
002,Ex,1,552500.00,3625000.00,1458.00

data.csv

One row per measured value:

tx_station_id,tx_component_id,rx_station_id,rx_component_id,frequency,real,imag,err_real,err_imag
TX01,E1,001,Ex,0.5,4.6e-7,-6.2e-8,1.1e-8,1.0e-8
TX01,E1,001,Ex,2,3.1e-7,-1.4e-7,1.3e-8,1.2e-8
TX01,E1,001,Bz,0.5,8.2e-12,-1.5e-12,3.0e-13,2.8e-13
TX01,E1,002,Ex,0.5,9.4e-8,-1.8e-8,4.0e-9,3.8e-9
TX01,E1,002,Ex,2,NaN,NaN,NaN,NaN

How the tables connect

Every table is linked by the same simple idea: matching ID columns.

Take the transmitter. The row TX01,E1,wire in tx.csv declares that the element exists. The two rows in tx_vertices.csv that also say TX01,E1 place it on the ground. And every row of data.csv that says TX01,E1 records a measurement made with it. The same pattern connects rx.csv, rx_vertices.csv, and data.csv through the receiver IDs — trace 001 and Ex through the excerpts above and you will cross three files.

For this to work, IDs must match exactly, character for character. TX01 and tx01 are different. 001 and 1 are different — which is why the spreadsheet warning above matters so much. IDs use only letters, digits, _, and -, and they are text, not numbers.

In database language, a column whose values must match another table is called a foreign key (see the glossary). You do not need the term to build a bundle — you only need the IDs to line up.

Optional: groups.csv

If your stations are organized into survey lines, arrays, or other named collections, you can record that in groups.csv. Using the same stations as above, one survey line containing the transmitter and both receivers:

group_kind,group_id,element_kind,station_id,component_id,sequence
line,L100,tx,TX01,,0
line,L100,rx,001,,0
line,L100,rx,002,,1

Grouping is purely descriptive — it never changes what a measurement means (specification §10). If you have no useful groupings, omit the file.

Packing the ZIP

Put every file in one folder (for example mysurvey/), then compress that folder into a ZIP archive using your operating system’s built-in “compress” feature, and name the result mysurvey.csemx.zip. The ZIP must contain the folder itself at the top level — not the loose files.

Checking your work

You do not need validation software to inspect or begin creating a csemx bundle. The files are ordinary YAML, CSV, Markdown, or Parquet files. Producers should validate completed bundles before delivery.

There are three levels of support:

1. Manual inspection. Open the files in a plain-text editor and check them yourself. The most valuable checks:

2. First-bundle assistance. If you are preparing your first csemx delivery, you can send a draft bundle to the project feedback address, csemx@deepbluegeophysics.com, and ask for it to be checked. The Feedback section of the repository README lists the other feedback channels and how comments are handled.

3. Standalone validator (planned). After v1.0, the project plans a standalone validator: a single downloadable program for Windows, macOS, and Linux that checks a bundle and lists any problems, with nothing else to install. Until then, the repository also ships a Python-based validator for those who use Python (see the README), but it is not required to produce a correct bundle.

Glossary

Where to go next