About the calculation engine

The TPU Calculator is powered by APRIORIENGINE, a custom Python module that computes Total Horizontal Uncertainty (THU) and Total Vertical Uncertainty (TVU) for hydrographic surveys using the Law of Uncertainty Propagation.

What is TPU?

Total Propagated Uncertainty (TPU) of a sounding is a measure of the accuracy to be expected when all relevant error and uncertainty sources are taken into account. The term "error budget" is also used. TPU is the parent term for Total Horizontal Uncertainty (THU) and Total Vertical Uncertainty (TVU).

Uncertainty sources do not only come from the echo sounder — they come from all sensors, the vessel, and the environment, which together we call a Hydrographic Survey System:

Vessel & positioning

  • GPS position
  • Draft, squat & settlement
  • Vessel offsets & timing offsets
  • SOG (Speed Over Ground)
  • Gyro heading

Sensors & environment

  • Attitude (pitch, roll) & heave
  • Mounting offsets
  • Sounder depth, beam range, angle, width, steering
  • Sound velocity at transducer head & SVP
  • Tide (incl. spatial/temporal prediction)
  • Geoid model / tide zoning

For AUV, ROV or SROV operations, additional sources include USBL position, USBL update interval, vehicle depth sensor, and inertial sensor.

Almost every multibeam survey contains these errors to a varying degree — hence "Total". All measurements are considered uncorrelated random variables with normally distributed uncertainties, acting independently, so all covariance terms can be disregarded and the TPU is computed using the Law of Uncertainty Propagation — hence "Propagated". The result is the root mean square of all contributing uncertainties — hence "Uncertainty".

Who can use GGTPU

  • Clients wishing to undertake a multibeam survey who need quality-assured tools to evaluate tender responses
  • Clients wishing to create technically rigorous RFQ documentation
  • Commercial operators responding to an RFQ who are planning a survey
  • Academic organisations wishing to improve the rigour of their multibeam operations
  • Government & research organisations wanting to better understand survey data accuracy
As part of Reach Subsea's commitment to industry and quality, GGTPU is free for anyone to use. All we ask is that you acknowledge the use of these tools in your reports and publications.

This web app provides a resource on how we as an industry compute apriori estimations of THU, TVU, coverage rate, data density, required line spacing, and feature detection. We've seen a multitude of answers to these questions and wanted to create a canonical online resource. If it gains traction, we will open-source it — academics can tweak and validate, and hopefully we end up with a single trustworthy calculation.

How to use the TPU Calculator

  1. Select the standard required as a project deliverable. Computed TVU and THU are compared against it to indicate whether you meet specification.
  2. Select the sensors allocated to the project. The .ini files contain manufacturer specifications, making configuration straightforward.
  3. Define the sector angle you intend to operate with. This is both sides — 150° means 7.5 × water depth.
  4. Select the water depth range. Used by THU, TVU and density calculations.
  5. Set anticipated maximum weather conditions. Maximum attitude values feed both THU and TVU.
  6. Set approximate lever arm distances — antenna to IMU and IMU to MBES.
  7. Define draft, squat and settlement accuracy for TVU calculations.
  8. Define vessel speed for latency error and data density calculations.

Once configured, hit Compute. The engine processes your configuration and presents results as interactive Plotly graphs and tables. Use the browser's print-to-PDF or screenshot to capture output into your reports.

Engine architecture

Pipeline

The engine follows five stages: input ingestion from the Django form, configuration of all sensor and survey parameters, uncertainty computation via propagation models, output generation in tabular and Plotly visual form, and session-based export for reproducibility.

Initialisation

User inputs from the TPU form are POSTed and used to configure the engine — project metadata, sensor choices (MBES, position, attitude, tide), platform offsets (IMU, GNSS), and environmental variables (roll, pitch, heave, SVP):

# Initialise and configure from POST data engine = apriori.APRIORIENGINE() engine.positionsensorname = request.POST['PositionSensor'] engine.patchtestreliabilityPITCH = float(request.POST['patchtestreliabilityPITCH']) engine.sectorangle = int(request.POST['SectorAngle']) engine.configure()

Uncertainty computation

engine.thu() computes horizontal uncertainty from GNSS accuracy, sensor offsets, vessel motion, timing, and patch test quality. engine.tvu() computes vertical uncertainty from heave, pitch, GNSS height errors, tide model, and draft/squat. Both use Root-Sum-Square propagation:

total_error = √(error₁² + error₂² + ... + errorₙ²)

Specification compliance

thuacceptance = engine.testagainstspecification( engine.permittedhorizontalaccuracies, engine.thucombinedtotal) tvuacceptance = engine.testagainstspecification( engine.permittedverticalaccuracies, engine.tvucombinedtotal)

Angle-specific TVU sweep

for angle in range(-engine.sectorangle, engine.sectorangle): tvuangle.sectorangle = angle tvuangle.tvu() meanresults.append([angle, tvuangle.tvucombinedtotalsummary[1][2]])

Outputs

Tables

  • inputtable — original configuration
  • outputtable — calculated THU / TVU

Plots

  • thuplot / tvuplot — error visualisations
  • beamgeometryplot / swathplot — diagnostics

Export & session isolation

Results are saved per Django session key for multi-user concurrency. Exports include .ini config snapshots, .csv summaries, Plotly .html and .png plots, and a packaged ZIP download:

engine.saveconfiguration(request.session.session_key)

Why Python instead of Excel?

The traditional approach to apriori computation has been an Excel spreadsheet, often based on the TPU sheet from Hare et al. circa 1990. Excel blends data and graphics well, but complex cell formulas are extremely hard to debug and maintain.

Here is a real heading uncertainty formula from an Excel-based THU sheet:

=SQRT((((Input_Variables!D49*COS(RADIANS(Input_Variables!D39)))^2)+(((COS(RADIANS(Input_Variables!C39)))^2+((SIN(RADIANS(Input_Variables!C39)))*(SIN(RADIANS(Input_Variables!D39))))^2)*-Input_Variables!C49^2)+(((SIN(RADIANS(Input_Variables!C39)))^2+((COS(RADIANS(Input_Variables!C39)))*(SIN(RADIANS(Input_Variables!D39))))^2)*Input_Variables!E49^2)-(Input_Variables!D49*-Input_Variables!C49*(COS(RADIANS(Input_Variables!D39)))*(SIN(RADIANS(Input_Variables!D39)))*(SIN(RADIANS(Input_Variables!C39))))-(Input_Variables!D49*Input_Variables!E49*(COS(RADIANS(Input_Variables!D39)))*(SIN(RADIANS(Input_Variables!D39)))*(COS(RADIANS(Input_Variables!C39))))-(-Input_Variables!C49*Input_Variables!E49*((COS(RADIANS(Input_Variables!D39)))^2)*(SIN(RADIANS(Input_Variables!C39)))*(COS(RADIANS(Input_Variables!C39)))))*((RADIANS(THU!C16)^2)))

There are hundreds of such formulas in a single TPU sheet. GGTPU takes a different path — the entire calculation is coded in native Python, version-controlled on GitHub, unit-tested, and much easier to extend as new platforms (USBL, AUV, ROV, SROV) are added. The web interface hides the code from casual users to prevent errors being introduced.

Data inputs & .ini files

Standards

The calculated TPU is compared against the project specification to provide a rapid pass/fail indication. Standards are maintained in a simple .ini file:

[IHOExclusiveOrder] vstaticerror=0.15 vvariableerror=0.0075 vpercentwaterdepth=0.75 hsigma=2.45 vsigma=1.96 [IHOSpecialOrder] vstaticerror=0.25 vvariableerror=0.0075 vpercentwaterdepth=0.75 hsigma=2.45 vsigma=1.96 [IHOOrder1a] vstaticerror=0.5 vvariableerror=0.013 vpercentwaterdepth=1.3 hsigma=2.45 vsigma=1.96

Equipment specifications

Equipment is broken into categories, each with a manufacturer-validated .ini file:

mbessensors.ini positionsensors.ini attitudesensors.ini draftsensors.ini tidesensors.ini

Some sensors (e.g. ROVINS) appear in both attitudesensors.ini and positionsensors.ini. Example from attitudesensors.ini:

[PosMVWavemaster5] rollaccuracy=0.02 pitchaccuracy=0.02 heaveaccuracy=0.05 headingaccuracy=0.03 [Seapath320-5+] rollaccuracy=0.08 pitchaccuracy=0.08 heaveaccuracy=0.05 headingaccuracy=0.04 [PosMVWavemaster5EllipsoidalReduction] rollaccuracy=0.02 pitchaccuracy=0.02 heaveaccuracy=0 headingaccuracy=0.03

Adding new sensors or standards

All engine inputs are curated — sensors are validated against manufacturer specs before becoming supported, and environmental inputs are controlled to prevent typos. The backend uses unit tests and regression across all combinations.

Need a new sensor or configuration option?
Contact paul.kennedy@reachsubsea.com and we'll add it.