-
Notifications
You must be signed in to change notification settings - Fork 10
MagNIMBUS Gradiometer Distance Depth Weight Estimation Script
This document describes a method for estimating the distance, depth, and approximate weight of magnetic targets using a MagNIMBUS two-sensor vertical gradiometer system.
The approach is based on the physical assumption that a magnetic source behaves like a point dipole, where the magnetic field strength decreases with distance according to an inverse-cube law. By comparing measurements from a lower and upper sensor, the method derives the relative distance to the source without requiring prior knowledge of its exact properties.
- Distance to target from the lower sensor
- Estimated depth below ground surface
- Approximate target weight, based on empirical models
This method is particularly useful in applications such as:
- Detection of buried metallic objects, for example, UXO's (unexploded ordnance)
- Environmental and geophysical investigations
- Rapid field estimation where full inversion modelling is not practical
It enables fast, automated interpretation of magnetic anomalies directly from survey data, making it well-suited for pipeline processing (e.g. MagNIMBUS workflows). The following sections describe the input requirements, physical model, algorithm, and output structure in detail.
- Anomalies must be marked in the data file before running this script (
Mark = 1). More information about setting marks can be found here and here. - The script exits with a message if no marked rows are found.
Standard MagNIMBUS CSV file with the following required columns:
| Column | Default name | Description |
|---|---|---|
| Lower sensor field | TMI_LPF |
Total magnetic intensity at the lower (closer-to-ground) sensor (nT) |
| Upper sensor field | TMI_S_LPF |
Total magnetic intensity at the upper sensor (nT) |
| Altitude AGL | Altitude AGL |
Height of the altimeter above ground level (metres) |
| Mark | Mark |
Anomaly mark (1 = marked row) |
All column names are configurable via command-line arguments (see Section 6).
No per-flight-line spatial filtering is applied. Instead, the background field is estimated globally as the median of the upper-sensor column (TMI_S_LPF) across the entire file. The upper sensor is used because its greater height above ground makes it less sensitive to near-surface magnetic anomalies, yielding a more representative ambient field value.
No pre-processing of the background field is required before running this script. If a pre-filtered column (e.g.
TMI_LPF) is supplied as the lower-sensor column, the anomaly computed in Step 2 will reflect the residual after that external filter — this is the intended workflow in the MagNIMBUS pipeline.
The magnetic source is modelled as a point magnetic dipole (compact object, dimensions much smaller than depth). Under this model, the total field anomaly at distance
When the two sensors are positioned vertically with a known separation
Since
Taking the cube root of both sides and solving for
This gives the sensor-to-source distance measured from the lower sensor.
The background is subtracted from each sensor reading independently using the global median of the upper sensor as a proxy for the ambient field:
If
where:
-
$h_{\mathrm{AGL}}$ is the altitude AGL at the marked row, -
$\delta_{\mathrm{offset}}$ (altimeter-lower-offset) is the vertical distance between the altimeter and the lower sensor (metres; default 0.5 m), correcting for the fact that the altimeter and sensor are not co-located.
If
If altitude AGL data is not present in the file, depth is not computed and Estimated_Depth is left empty. The script prints an informational message in this case.
Weight is estimated from two independent empirical models; the more conservative (smaller) result is reported.
All distances are converted to feet for the weight formulae, consistent with the original empirical calibration:
This is analogous to the dipole-moment inversion
This model decays more slowly with distance and dominates (produces a smaller estimate) for shallow, high-field anomalies where the dipole model can overestimate.
The minimum is taken as a conservative estimate; using the smaller of the two models reduces the risk of overestimating the weight of a shallow strong target.
- Read input CSV.
- Verify that the lower-sensor column and upper-sensor column exist and are numeric.
- Verify that the
Markcolumn exists. - Print an informational message if the altitude AGL column is absent (depth will not be computed).
- Exit cleanly if no marked rows (
Mark = 1) are found.
The upper-sensor column is used in its entirety (all rows, not just unmarked rows).
Convert the Mark column to numeric (coercing non-numeric values to 0). Collect the integer row indices where Mark = 1.
For each marked index
-
Read sensor values:
$B_{\mathrm{lower},i}$ and$B_{\mathrm{upper},i}$ . If either is NaN, skip with a warning. -
Compute anomalies:
$\Delta B_{\mathrm{lower}} = B_{\mathrm{lower},i} - B_{\mathrm{background}}, \quad \Delta B_{\mathrm{upper}} = B_{\mathrm{upper},i} - B_{\mathrm{background}}$ -
Guard — zero upper anomaly: if
$\Delta B_{\mathrm{upper}} = 0$ , skip with a warning. -
Compute anomaly ratio:
$r = \Delta B_{\mathrm{lower}} / \Delta B_{\mathrm{upper}}$ . -
Guard — negative ratio: if
$r < 0$ (opposite-sign anomalies, indicating the sensors are on opposite sides of a dipole lobe), skip with a warning. -
Cube root:
$r^{1/3} = r^{0.333\ldots}$ -
Guard — unit denominator: if
$r^{1/3} = 1$ (ratio equals 1, denominator is zero, distance is undefined), skip with a warning. -
Distance:
$D_{\mathrm{lower}} = s / (r^{1/3} - 1)$ If negative, take the absolute value. Round to 4 decimal places. -
Guard — zero distance: if
$D_{\mathrm{lower}} = 0$ after rounding, skip with a warning. -
Depth (if altitude AGL is available):
$d_{\mathrm{ground}} = D_{\mathrm{lower}} - h_{\mathrm{AGL},i} + \delta_{\mathrm{offset}}$ Clip to 0 if negative. Round to 4 decimal places. -
Weight:
$D_{\mathrm{ft}} = D_{\mathrm{lower}} / 0.3048$ $W = \min!\left(\frac{|\Delta B_{\mathrm{lower}}| \cdot D_{\mathrm{ft}}^3}{1000} \times 0.453592,\ \frac{|\Delta B_{\mathrm{lower}}|}{D_{\mathrm{ft}}^{1.5}}\right)$ Round to 6 decimal places.
- Add three new columns to the original data:
Estimated_Distance,Estimated_Depth,Estimated_Weight. All rows are initialised to empty string"". - For each successfully processed marked row, write the computed values. Rows that were skipped retain
"". - Overwrite the input CSV with the updated data.
- Write a targets CSV containing only the marked rows (see Section 4.2).
| Column | Description | Unit |
|---|---|---|
Estimated_Distance |
Sensor-to-source distance from the lower sensor ( |
m |
Estimated_Depth |
Estimated depth below ground surface ( |
m |
Estimated_Weight |
Conservative weight estimate:$\min(W_{\mathrm{dipole}},\ W_{\mathrm{inv}})$ | kg |
All three columns are empty ("") for rows where Mark ≠ 1 or where processing was skipped due to a guard condition.
One row per marked row. Contains all original source CSV columns plus the three output columns listed in Section 4.1. Written to output-dir if specified, otherwise to the same directory as the input file.
Not exposed as CLI arguments; edit the script to change them.
| Constant | Value | Description |
|---|---|---|
LBS_TO_KG |
0.453592 |
Conversion factor applied in the dipole weight model |
All other tunable quantities (sensor separation, altimeter offset, column names) are exposed as command-line parameters.
| Argument | Default | Description |
|---|---|---|
file_path |
(required) | Input CSV file path |
--lower-sensor-column |
TMI_LPF |
Column name for the lower (closer-to-ground) sensor |
--upper-sensor-column |
TMI_S_LPF |
Column name for the upper sensor |
--altitude-column |
Altitude AGL |
Column name for altitude AGL; if absent from file, depth is not computed |
--sensor-separation |
1.5 |
Vertical distance between the two sensors (metres) |
--altimeter-lower-offset |
0.5 |
Vertical distance between the altimeter and the lower sensor (metres) |
--output-dir |
(same as input) | Directory for the targets CSV |
- MagNIMBUS magnetometer data processing
- SENSYS MagDrone R1 magnetometer data processing
- SENSYS MagDrone R3 and R4 magnetometer data processing