ADCP Data Quality: Calibration

The orientation of each transducer with respect to the bow must be determined for processing to proceed. This is done at the time of a UHDAS installation using either previous data or a bottom track calibration run if there is no earlier data from the instrument. A new instrument is calibrated using a period with bototm tracking turned on, or a reciprocal track.

In the determination of the transducer angle, we must use a heading device. By tyingmarrying the calibration to the accurate heading device, a subsequent change in calibration indicates a change in either the transducer angle or the accurate heading device.

Over time, watertrack and bottomtrack calibration estimates accumulate and we get a better idea of the transducer offset. If an accurate heading device exists and is working, it is not necessary to leave bottom tracking on, and in fact you lose statistical robustness (increase noise) in the ocean velocity data when bottom track is on, because every other ping is looking for the bottom.

A new calibration value will have to be determined if the accurate heading device is changed or if the transducer alignment is changed (eg. removed and reinstalled).

When to use Bottom track

  • if the bottom is in range, and flat, and if there is no

    accurate heading device available

  • if it is known that it won’t hurt other instruments

  • when leaving port and when returning to port

Limitations of bottom track

  • doesn’t work well on sloping bottom (works best on a shelf)

  • undermines its own water velocity data
    • every other ping looks for the bottom

    • if the bottom is out of range, it lengthens the ping cycle

      (looking for the bottom)

  • can destroy water ping data of other instruments (loud, long ping)

Guidelines for using Bottom Track with UHDAS

  • up to a day at the beginning and/or end of a cruise, if the bottom is in range
  • longer, if science asks for it (overriding UHDAS recommendations)

Monitoring calibrations with a UHDAS system

Every day an email is generated and sent to the ADCP operator at sea and intersted parties on land. That email includes information about the compter’s health, processing status, and a data snippet that is plotted. On land, the web site with this information is accessible here.

Watertrack and bottom track calibration values are included in the diagnostics. The hope is that values will be:

  • close to 1.0 for amplitude (within 1%)
  • close to 0.0 for phase (within 0.5deg)
Examples are annotated showing

Please note these caveats:

  • Some cruises have no bottom track data, some have no watertrack data, simply due to the cruise track.
  • Watertrack calibrations are by nature noisy and generally accumulate slowly.
  • These data are preliminary; there could be editing that has not yet been done that will clean up these values, for instance some data may not have been flagged as bad below the bottom, and if any underway bias exists (eg. from bubbles) it will hurt the amplitude calibration.
  • There could be gaps in the heading correction device that are throwing off the phase calculation

At Sea the most recent watertrack and bottom track calibration assessments are available on the UHDAS home page, as well as a statement about the angles that were determined when UHDAS was installed.

On land recent installations include “cals.txt” in the daily diagnostic files

Calibration Resources

ADCP calibration resources include detailed discussions of calibration in

Bottom Track Calibration of a new installation


A transducer is installed, and the ADCP “forward” beam (#3) is oriented at some unknown angle relative to the bow. There was a plan, and beam 3 was supposed to be pointing at a specific angle relative to the bow (say 45 deg starboard) but there is no telling if that is what happened.

UHDAS needs to know the angle of beam #3 relative to the bow or the ocean velocities will be wrong. An error of a few degrees will result in ocean velocities greater than the ship’s speed all pointing off to one side of the ship.

We use a nominal value (our best guess, 45 degrees in this case) and the the ADCP’s “bottom track” mode, to calculate the remaining angle between the transducer’s beam #3 and ship’s bow. That correction is then applied to the processing software, and (if appropriate) the acquisition software “EA” parameter is adjusted.


Always start a new cruise name if calibration values have changed

A little more discussion about the ADCP calculations follows this document.

The figure below shows the angle found by the bottom track calibration procedure

bottom track misalignment diagram



Only an official ADCP operator should modify anything on the ADCP UHDAS acquisition computer (currents).

  • be sure to turn off Bottom Track mode after the ship is back in deep water
  • always use a new cruise name if there is any change to the configuration

Bottom Track Calibration steps

(1) Calibration Cruise Track

A good bottom track calibration should include:

  • several hours of bottom track data (necessary to get good statistics)
  • fixed course over ground or (better yet) a reciprocal track with 3 hours going one direction and 3 hours repeating the track in the opposite direction (allows for additional calibration calculations)
  • the ground should be flat
  • the depth should be between 20% and 100% of the expected range for the instrument being calibrated
  • ship speed should normally be standard transit speed. If the sea state is high, it may be worth slowing down (to 6-8kts) to clean up the data quality.
  • it the instrument is an Ocean Surveyor (i.e. capable of pinging in either broadband or narrowband mode), it is best to choose only one mode to interleave with bottom track pings, so as to get good enough statistics in each ensemble.

Often there will be compromises in the cruise track because of other considerations. Do the best you can, but try to get 4-6 hours even if you have to reverse course several times. You will be able to tell from the amplitude bump in the 5-minute profile figure whether the bottom is in range, even if the velocities are off scale.

The UHDAS processing updates the calibration values every 60 minutes, so it makes sense to wait until the hourly plots (vector and contour plots) update before stopping the calibration run. THis maximizes the amount of collected data used in the calibration calculation. See below for more information about the files that contain the calibration values.

(2) Reading the Correction

UHDAS processing takes place in the /home/data/CRUISE/proc directory in directories that are named for the instrument frequency and ping type. “CRUISE” is the name give to that leg of data collection. For instance, if a new 150kHz Ocean Surveyor was installed on a ship and the first calibration run was called “btcal1”, the processing directory for broadband+bottomtrack pinging would be /home/data/btcal1/proc/os150bb.

The file with the bottom track calibration is


Every hour a new calibration calculation (for all the data collected in that cruise leg so far) will be appended to the bottom of the file.

An annotated version of the file is shown here:

 ADCP btcal1 step size 1                   # cruise name
   Time range 181.26 to 181.44             # decimal day range
   Calculation done at 2007- 7-11  10:54
    step: 1
    min_depth:  25   max_depth: 1500
    min_speed:  2.0 m/s   max_sig:  2.5 std devs
    max_gap:  0.10 minutes   tol_dt: 0.02 (fraction)
unedited: 130 points                             # number of BT points
edited:   117 points, 2.0 min speed, 2.5 max dev # number of good BT points
            median     mean      std
amplitude   1.0038   1.0037   0.0032             # scale factor = small
phase      45.3184  45.2997   0.2687  # <-----Bottom Track phase calibration

The file above is a good solid bottom track calibration. It was over 4 hours long in water ranging from 50-100m. The mean and median phase are very close (within 0.3deg is good) and the standard deviation is small (under 0.4 is good).

See this annotated example of a watertrack+bottomtrack calibration for a different cruise.

CONCLUSION: The Bottom track calibration correction is 45.3 degrees. Although the plan was to have beam #3 pointing at 45deg, it needs a 45.3 degree correction back to near zero – beam #3 is actually facing nearly forward. This does not necessarily reduce data quality. Under normal conditions, it would not be worth returning to port to get the transducer rotated by 45deg.

(3) Applying Correction: for Processing (“h_align”)

The following file contains the line specifying the angle of the transducer relative to the hull. This file is in the Matlab language, and is a template file (so we have the double-underscores at the end of the name).


There will be a little piece of code like this for each instrument.

The line of interest is the variable h_align.

These lines will say something like this (“%” are comments in matlab)

# heading alignment:  nominal - (cal/watertrack)
#                     nominal - (cal/botmtrk)
# h_align['os150']  = 45.0 - (x.xx)  ## do the calculation
h_align = {}             ## initialize dictionary
h_align['os150'] = 45.0  ## one floating point value here


This is python code. Indentation matters. Do not break lines. None of these lines should have spaces in front of them. Comments are “everything after the first ‘#’ sign”. DO go ahead and “do the math” (insert the answer for the angle).

After the calculation, we have:

# heading alignment:  nominal - (cal/watertrack)
#                     nominal - (cal/botmtrk)
# h_align['os150']  = 45.0 - (x.xx)  ## do the calculation

# before calibration:
# h_align['os150'] = 45.0  ## one floating point value here

# after calibration:  h_align['os150'] = 45.0 - (45.3)
h_align = {}             ## initialize dictionary
h_align['os150'] = -0.3  ## transducer angle, nominally forward

Here is another example for an instrument that is already calibrated:

# after calibration:
# h_align['os75'] = -42.0 - (0.6)  ( xx.x is from cal/watertrack)
h_align = {}             ## initialize dictionary
h_align['os75'] = -42.6  ## transducer angle, nominally 45 to ** port **

(4) Applying Correction: for Acquisition (“EA”)

If the instrument is a Workhorse, Broadband, or Ocean Surveyor, another value needs to be changed. This value is important, because if it is wrong, you can actually lose data. The file is tricky, because it is written in Python, which is very fussy about syntax. The file is:


This is actually a python program that defines data structures with information about the instruments, special commands, data baud rates, and all the serial port information for acquisition.


Save a copy before you edit this file. If, after editing, UHDAS fails to start, look in /home/adcp/flags for *.err files and try to figure out what you broke while editing the file.


Make sure no lines are broken when editing. Keep things on one line if they start that way

The layout of the file is

  1. ADCP information for

    ADCP 1 # <——- contains EA (for WH, BB and OS) ADCP 2 # <——- contains EA (for WH, BB and OS)

  2. serial communication information for

    ADCP 1 # must be first ADCP 2 # must be second gyro # no particular gps # order for these ashtech # (or posmv, seapath, etc)

You need to go to the first block and identify the instrument being calibrated and find the relevant chunk fo code. For example:

{ 'instrument'  :  'os150',
   'setup'       :  'rdi_setup',
   'terminal'    :  'oswh_term',
   'defaultcmd'  :  'os150_default.cmd',
   'commands'    :  ('EA+04500',),           ##<--- bt cal affects this
   'datatypes'   :  ('os150bb','os150nb'),
   'wakeup_baud' :  9600},

When UHDAS is started, it read this file. The “btcal1” test run used a value of 45 degrees (see above). We know this needs to be closer to zero. Change the ‘commands’ line to read:

'commands'    :  ('EA+00000',),    ##<--- bt cal affects this

THE EA command needs to be within a couple of degrees of the “correct” value, but it does not have to be perfect. To make it easier to remember and to read, you might consider “to the nearest degree” or “to the nearest 5 degree”.

Restarting Acqusiition

All the changes above can be made while logging is underway, because the configuration information has already been used and applied to the present cruise leg.

however to apply these changes to new data, you must

  • stop logging
  • end cruise
  • kill gui
  • start UHDAS gui (reads
  • start a new cruise (reads
  • start pinging

Whether you do more calibration runs is probably up to you.

NOTE: Always start a new cruise leg if you change any sensor inputs (eg. different GPS sensor) or calibration value

Checking your work

  • are figures updating? Are velocities in the 5-minute plot under 1m/s?
  • after an hour, are the vectors closer to zero? not all pointed off to one side?
  • after an hour, (if bottom track is ON) is the phase in the cal/botmtrk/btcaluv.out file under smaller than 1 degree? smaller than 0.5? (even better)

Appendix: Getting Earth coordinates from beam coordinates

In order to obtain ocean velocities from the ADCP, the processing code needs to perform the following steps:

  1. transform beam coordinates into horizontal+vertical
This transformation uses the fact that the instrument has 4 beams, which are pointing down, whether the faces are convex (eg. LADCP) or concave (eg. NB150), the beam angle with the vertical (eg. 30deg). This transformation results in a coordinate system with “forward” oriented along the RDI ADCP beam #3. These values are all accessible from within the instrument’s firmware or (in the case of an NB150) can be specified. This step has no calibration
  1. align instrument with ship hull (requires calibration)
Beam 3 is often oriented at 45deg relative to the ship. A recommended installation configuration has beam 3 pointing 45deg starboard of the bow (as shown here).
  1. align ship with geographic north
The final rotation step is to know the angle between the ship and geographic north. UHDAS uses the gyro as the primary heading device for this purpose, because gyros are a reliable source of reasonable heading. However, an error of 1degree for most ships underway, causes a cross-track error in the ocean velocity of about 10cm/s. Since this is a significant fraction of most open-ocean signals, it is important to correct the gyro headings to better values (eg. POSMV, Seapath, Ashtech).
  1. take out ship velocity

The ADCP measures velocities relative to the ship. Now that those velocities have been rotated into earth coordinates, the last step is to get the ocean velocities, not the measured velocities. This requires removing the velocity of the ship (the moving platform).

Step #2 above is the one we focus on when we talk about “bottom track calibration”. The ground isn’t moving so if we use “bottom track mode” to gather ADCP data, we can determine the angle in #2 directly.

This angle is used in the acquisition in two places

  • in the processing software (called “h_align”)
  • if OS or BB (not NB) this must also be specified in the comands sent to the instrument, or DATA LOSS may occur. This is the EA command.

Beam Orientation Diagram (Ocean Surveyor)

bottom track misalignment diagram