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 (in this case 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 large ocean velocities all pointing off to one side of the ship when the ship is underway.

We use the orientation we think is correct (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 15 minutes, so it makes sense to wait until the 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 15 min 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 Python language,


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

The line of interest is the variable h_align.

# 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

On this ship, the intention was to have beam #3 pointing 45deg to starboard of forward. Instead, beam3 pointing nearly forward. Our processing started using 45deg, but bottom track calibration said we were off by about 45deg.

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

If the instrument is an Ocean Surveyor, another value (the EA command) 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 original 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