Dive 1 User Manual

10 August 2005
1. INTRODUCTION

This document describes the operation of a program (DIVE) for analysing
seal dive data. The program runs on IBM/PC computers under MS/DOS. It was
written by Stewart Greenhill in ANSI-C for Mark Hindell's seal data. It
generates statistics for individual dives and groups of dives. It also
allows interactive graphical display of dives and statistics. The graphical
part is written for Borland BGI, but the remainder of the program should be
portable to any system with a C compiler (eg. unix, macintosh, etc).

1.1 WHAT'S NEW ?

The current version is 2.2. Several changes have been incorporated since
the last version of this program.
Between 1.0 and 2.0:
(1)  A new algorithm for surface detection deals better with shifts in the
     sensors.
(2)  The system identifies flat-bottomed dives.
(3)  Two types of "spikes" are detected: "starts" and "stops". The system
     maintains separate statistics for each, and counts the number of stops
     following starts, etc.
(4)  Depth-only data can be handled. Without velocity information, spike
     detection and sleep-detection is omitted.
(5)  A histogram is calculated, showing the amount of time spent at
     different depths during the dive. The number of depth classes can be
     specified at the start. The depth histogram can optionally be output
     with .CSV data.
(6)  A new menu system allows the user to operate the program interactively
     using keyboard or mouse. The program settings can be easily adjusted
     and are automatically loaded and saved each time the program is run.
Between 2.0 and 2.1:
(1)  Dive type is now output to .CSV files.
Between 2.1 and 2.2:
(1)  Fixed a problem that caused large indexes (>64K) to be read
     incorrectly. 


2. MODEL OF DATA

Dive data consists of an ordered series of numbers separated by commas:
     day, hour, depth, speed
Where
  day     is the Julian day that the sample occurred
  hour    is the hour of the day (0..24)
  depth   is the depth in metres
  speed   is the velocity in m/s

The data is characterised by repeated dives of 20 to 30 minutes, separated
by periods of 2 to 3 minutes at the surface. However, most dives are not
uniform, consisting of several distinct phases. These are outlined below:

     descent   Depth increases rapidly. Speed is high.

     active    Depth remains more or less constant with periodic variations
               that are relatively small in amplitude. Speed is lower, but
               highly variable. Perhaps this indicates that the seal is
               foraging.

     ascent    Depth decreases rapidly. Speed is high.

Occasionally, a different dive profile is evident. During the descent, the
speed drops to zero for several minutes (usually between 5 and 10 minutes).
Perhaps the seal is sleeping or resting during this time. These dives
usually show no active phase, although some dives show active ascents.
Thus, we identify the additional phase:

     sleep     Depth increases slowly. Speed is zero.

The phases outlined above are statistically distinct. Computing a single
statistic for the entire dive would not give a realistic picture of what is
happening. The program attempts to divide the dive into phases and collects
separate statistics for each phase. These statistics are:

     vmean     The mean velocity (based on swimming speed).
     vsd       The standard deviation of the velocity.
     vmax      The maximum velocity.
     vmin      The minimum velocity.
     vvert     The mean vertical velocity. This is vdist (see below)
               divided by the total time.
     dmin      The minimum depth.
     dmax      The maximum depth.
     hdist     The horizontal distance travelled. This is an integration of
               the swimming velocity over time.
     vdist     The vertical distance travelled. This is an integration of
               depth changes over time.
     time      The time taken during the phase.

Further analysis is performed on the active phase of the dive:

(1)  Characterising "wiggles" in the depth profile.

(2)  Identifying "spikes". These are rapid changes in velocity, often (but
     not always) accompanied by changes in depth.

During the active phase, depth increases and decreases periodically. Each
cycle (between local maxima in depth) is termed a "wiggle". A wiggle
consists of two phases. The "upslope" (or ascending) phase is the time
between a local maximum and the next local minimum in depth. The
"downslope" (or descending) phase is the time between a local minimum and
the next local maximum in depth. Every wiggle has an "upslope" followed by
a "downslope" phase. The program counts the number of wiggles during the
active phase, and collects more detailed statistics showing the differences
between the upslope and downslope phases of the wiggles. The following
additional phases correspond to wiggles:

     upslope   A phase consisting of all ascending phases of wiggles in the
               active phase of the dive.

     downslope A phase consisting of all descending phases of wiggles in
               the active phase of the dive.

The same statistics outlined above are collected over the upslope and
downslope phases.

Sometimes velocity increases rapidly and remains high for a period of time;
these events are termed "starts". Sometimes velocity decreases rapidly and
remains low for a period of time; these events are termed "stops".
Collectively, "starts" and "stops" are termed "spikes". Every spike in the
active phase of the dive is analysed as a phase. The program counts the
number of spikes and maintains the following statistics for each dive:

allstarts, allstops
     Phases consisting of all starts/stops during the active phase of the
     dive.

bigstart, bigstop
     Phases consisting of the start/stop with the largest maximum velocity
     (vmax).

deepstart, deepstop
     Phases consisting of the start/stop with the largest vertical distance
     travelled (vdist).

longstart, longstop
     Phases consisting of the start/stop with the longest duration (time).

In addition to the above statistics, the program maintains the number of
times one type of spike follows another. It may be possible (for example)
that a start followed by a stop corresponds to the pursuit and capture of
prey.

Some data-sets consist only of depth measurements, with no velocity data.
Without velocity spike analysis cannot be performed, and sleep dives cannot
be detected. Other phases are still analysed (with no velocity statistics).


3. ANALYSIS

Dive analysis consists of several steps:

Step 1    Partitioning the data into distinct dives.
Step 2    Partitioning each dive into distinct phases.
Step 2a        Identifying flat-bottomed dives.
Step 3    Analysis of the active phase (if present)
Step 3a        Analysis of wiggles
Step 3b        Analysis of spikes
Step 4    Generation of dive histogram
Step 5    Reporting results

The following section outlines the procedures used in these steps. It also
identifies a number of important parameters that are used in the analysis.
These parameters can be modified by the user if necessary.

Step 1 involves breaking the dive into surface and sub-surface periods. The
parameter "mindive" is the depth below which a dive is said to begin.
Ideally, mindive=0 should be sufficient. However, it appears that there is
some hysteresis and random drift in the depth sensors. The program attempts
to maintain an idea of the depth reading that corresponds to the surface
(since this appears to change with time). The initial depth of the surface
is given by the parameter "initsurf". When the depth increases above
surface+mindive, and a local estimate of the slope of the profile depth(t)-
depth(t-2) is greater than "slopethresh", a dive is said to begin. The
slope criterion helps reduce the number of false starts due to noisy depth
measurements. When the depth decreases below surface+mindive, the dive is
said to end. In the period between the end of a dive and the start of the
next, the minimum depth is computed and used as the estimate of the surface
depth for the next dive. The surface depth is subtracted from all dive data
prior to processing. In this way, shifts in the zero readings are removed
from the data. Dive partitioning does not rely on velocity information, and
so will work identically with depth-only data.

Step 2 divides the dive into phases. This is done by looking at local
maxima and minima in the depth profile as outlined here. Starting from the
beginning of the dive, every local maximum in depth potentially identifies
the end of the descent phase. However, only sufficiently deep maxima are
accepted. This is controlled by a parameter "activeregion". The first depth
maximum such that activeregion*100 percent of the total time is spent at or
below that depth is taken as the end of the descent phase. This heuristic
seems to result in sensible partitions for activeregion=0.15. 

A similar procedure identifies the beginning of the ascent phase (working
backwards from the end of the dive). In some dives, the same local maximum
in depth corresponds to the end of the descent phase and the beginning of
the ascent phase. These dives have no active phase (usually there is a
sleep phase). Thus there are two possible phase patterns:

     descent, active, ascent
     descent, ascent

Sleep phases are identified by considering the length of time that the
swimming velocity is zero while depth is decreasing. If this is more than
sleepthreshold*100 percent of the total dive time, a sleep phase is
identified. The phase consists of the time between the first and last
points where the speed is zero. Usually this is during the descent phase.
Some data contains erroneous velocity information: velocity appears zero
for all (or most) of a dive. To avoid declaring a sleep dive on such dives,
an additional parameter is used. The length of time that the swimming
velocity is zero is calculated. If this is greater than
nosleepthreshold*100 percent of the total dive time, the sensor is assumed
to be faulty and no sleep phase is identified.

Step 2a looks for flat-bottomed dives. These are dives in which the depth
profile is flat at the maximum depth. Such profiles are produced by:
(1)  Depth readings being "clipped" by a limited sensor repsponse.
(2)  The seal foraging on the ocean floor.
The program identifies such dives as "flat" dives, and computes the amount
of time spent at the bottom of the profile. The program defines a "bottom
zone" just above the maximum dive depth. The width of this zone is
"flatdepthprop" times the maximum depth. Optionally, a limit value
"flatdepthabs" may be specified for the width of the "bottom zone". The
program computes the amount of time spent in the bottom zone. If this is
greater than "flattimeprop" times the dive length (or optionally, just
"flattimeabs" minutes) a "flat dive" is identified. The end of descent (and
start of ascent) phases are adjusted to the first (and last) times that the
depth is within the bottom zone. Note that this is the only situation where
the phase transitions can not correspond to local depth maximum.

Step 3a characterises wiggles in the active phase. In most dives, the
active phase begins and ends at a local maximum in depth. Thus the active
phase always contains a whole number of wiggles (maximum-minimum-maximum
cycles). Separate statistics are collected for upslopes (maximum-minimum)
and downslopes (minimum-maximum). The upslope and downslope phases cover
the whole of the active phase. For flat dives, wiggle statistics are
computed from their normal locations (ie. starting and ending at depth
maxima), despite the fact that the bounds of the active region may be
different.

Step 3b identifies spikes in velocity. This process is complicated by the
fact that the speed measurements are already highly variable. It is
controlled by two parameters, "spikeon" and "spikeoff". These define
thresholds above which a spike begins, and below which a spike ends. A
"start" is identified when the velocity during the active phase exceeds
vmean+vsd*spikeon. The spike covers the time between the next and previous
points where the velocity drops below vmean+vsd*spikeoff. Similaraly, a
"stop" is begins when the velocity drops below vmean-vsd*spikeon and ends
when it exceeds vmean-vsd*spikeoff. Each spike is analysed statistically as
a phase. The program keeps statistics on a range of possibly interesting
spikes, as outlined in section 2. The default values are spikeon=2.0 and
spikeoff=0.5.

Step 4 generates a histogram of the time spent at different depths. The
user may specify a number of bins "nbins". For each dive, the depth profile
is divided into "nbins" bins of equal depth. The time between any two
samples is divided amongst bins on the basis of the proportion of the total
depth range lying within each bin. The depth histogram for each dive may be
plotted on the screen (during browsing) or output to a file.

Step 5 reports the results of the analysis. In the case of a single dive,
this includes some general statistics as well as detailed statistics for
each phase identified (up to 15 phases may be present). The general
statistics are:
     dive      the number of the dive
     type      the type of dive: "normal", "flat" or "sleep"
     day       the hour that the dive started
     hour      the hour that the dive started
     duration  the duration of the dive
     presurf   the time at surface before the dive
     postsurf  the time at surface after the dive
     alseep    the length of the sleep phase (if present). 0 otherwise.
     bottom    the length of time spent at the bottom of a flat dive (if
               present). 0 otherwise.
     descent   the mean rate of descent. NOTE: this is not the same as
               vvert from the descent phase. Since vvert is based on total
               vertical distance travelled it includes both up and down
               motion.
     ascent    the mean rate of ascent
     wiggles   the number of wiggles during the active phase
     starts    the number of starts during the active phase
     stops     the number of stops during the active phase
     start-stop     the number of times a "stop" followed a "start".
                    Similarly for "stop-stop", "stop-start" and "start-
                    start".

Statistics on the following phases are always reported:
     total
     descent
     ascent

The following phases may be reported if present:
     active
     asleep
     upslope, downslope
     allstarts, bigstart, deepstart, longstart
     allstops, bigstop, deepstop, longstop

The dive statistics may be reported in two ways: tabular (for humans to
read) or as comma-separated-values (CSV) (for import into spreadsheets).
Output file names consist of the input name with a suffix appended. Tabular
output always goes into filenames suffixed with ".out". CSV output always
goes into filenames suffixed with ".csv". By convention, lengths are always
in m, velocities in m/s and time in minutes. Dives are numbered starting
from 0. So, for example, a dive log with 10 dives will have dive numbered
from 0 to 9. The order of the values for CSV output is precisely that
outlined above. Each phase consists of 10 statistics. Where a phase is
absent, there will be no values between the commas. Headings will be
present at the start of the CSV output. For depth-only data, spike
statistics will be omitted.

The system allows dives to be processed together in batches. Three
parameters control the generation of output files during batch processing.
When the "printout" parameter is true, a tabular output file (.out) is
generated. When the "printcsv" parameter is true, a comma-separated-value
file (.csv) is generated. When the "writebins" parameter is true, the depth
histogram is appended to each line of the .csv file for each dive. During
batch processing further statistics are maintained about the variation of
parameters between dives. This information is stored in a summary file,
suffixed with ".sum". The statistics for each parameter include:
     mean      the mean value of a parameter
     sd        the standard deviation of a parameter
     min,dive  the minimum value of a parameter and the dive during which
               it occurred
     max,dive  the maximum value of a parameter and the dive during which
               it occurred
     dives     the total number of dives considered for the parameter
               statistics

The parameters considered are:
     Total dive time     The total phase time statistic
     Surface time        The postsurf statistic
     Active time         The active phase time statistic, if present
     Ascent rate         The ascent statistic
     Descent rate        The descent statistic
     Vertical distance   The total phase vdist statistic
     Horizontal distance The total phase hdist statistic
     Vertical speed      The total phase mean vertical speed
     Horizontal speed    The total phase mean horizonal speed
     Wiggles             The number of wiggles during the active phase
     Maximum Speed       The total phase vmax
     Time Asleep         The time asleep, when present
     Maximum Depth       The total phase dmax
     Starts              The number of starts during the active phase
     Start max velocity  The bigstart phase vmax, when present
     Start max depth     The deepstart phase vvert, when present
     Stops               The number of stops during the active phase
     Stop-Starts         The number of times a start followed a stop
     Start-Stop          The number of times a stop followed a start
     Bottom time         The length of time in the bottom zone of a flat
dive


Here is a sample summary output. It shows, for example that the longest of
1658 dives was dive number 1232 (39  minutes) and the dive with the
shortest sleep time (where a sleep phase was evident) was dive number 58
(1.97 minutes).

Processed dives 0 to 1659
Statistic            Mean    SD      Min     Dive  Max     Dive  Dives
Total dive time      22.20   4.59    0.22    1183  38.83   1232  1660 
Surface time         2.41    2.35    0.16    187   75.83   391   1659 
Active time          14.81   4.14    0.13    1184  27.37   708   1588 
Ascent Rate          1.36    0.33    0.00    1183  2.12    556   1660 
Descent Rate         1.27    0.46    0.20    199   2.32    1490  1660 
Vertical Distance    982.14  378.83  15.00   1183  2409.00 1374  1660 
Horizontal Distance  2006.22 642.13  12.10   1183  3555.07 1379  1660 
Vertical Speed       0.73    0.22    0.23    201   1.57    1515  1660 
Horizontal Speed     1.49    0.38    0.34    67    2.18    1176  1660 
Wiggles              10.41   4.57    0.00    0     27.00   734   1660 
Maximum Speed        2.57    0.44    0.70    1183  4.10    817   1660 
Time Asleep          11.32   3.82    1.97    58    21.37   452   118  
Maximum Depth        327.26  175.61  12.00   1183  699.00  1439  1660 
Starts               1.44    1.25    0.00    0     9.00    1140  1660 
Start Max Speed      2.46    0.57    0.80    139   4.10    818   1245 
Start Max Vertdist   53.66   38.97   0.00    783   255.00  906   1245 
Stops                1.56    1.51    0.00    0     7.00    538   1660 
Stop-Starts          1.03    0.17    1.00    11    2.00    752   95   
Start-Stops          1.14    0.37    1.00    12    3.00    896   356  
Bottom Time          10.15   4.26    0.13    1184  18.38   940   46   


Here is a sample of the tabluar output:

Dive:      8 of 1659
Start:     Day 307, Hour 2.930600
Duration:  23.66 minutes
Surface:   Before dive 2.33 minutes,  After dive 2.50 minutes
Asleep:    0 minutes
Descent:   0.39 m/s
Ascent:    0.97 m/s
    Phase      Speed(m/s)                    Depth(m)    Distance(m) Time
               Mean  SD    Min   Max   Vert  Min   Max   Horiz Vert    
    descent    1.07  0.29  0.5   1.8   0.41  3     93    244   93    3.81 
    active     0.99  0.30  0.3   1.7   0.42  84    267   1093  459   18.37
    ascent     1.26  0.16  0.9   1.5   1.04  3     90    112   93    1.49 
    total      1.02  0.30  0.3   1.8   0.45  3     267   1450  645   23.66
Active phase
  9 wiggle(s)
    up slope   1.11  0.28  0.5   1.5   0.68  84    264   376   228   5.63 
    down slope 0.94  0.29  0.3   1.7   0.30  87    267   717   231   12.74
  3 spike(s)
    all spikes 1.29  0.26  0.0   1.7   0.52  0     267   217   87    2.81 
    big spike  1.26  0.30  0.9   1.7   0.54  141   162   63    27    0.83 
    deep spike 1.30  0.23  1.0   1.6   0.52  237   267   90    36    1.16 
    long spike 1.30  0.23  1.0   1.6   0.52  237   267   90    36    1.16 

4. USING THE PROGRAM

The DIVE program is written in ANSI-C, and has been compiled for MS/DOS
using Borland Turbo C (Version 1.0) compiler. It will run on any standard
IBM/PC with 512K RAM (less will probably work). It will run significantly
faster with a numeric co-processor. The graphical options require a VGA
screen, although normal batch operations will work on any display.

The input data is stored in ASCII form in a large file (perhaps 5-10
megabytes in size). This file may have an 8-letter name (MS/DOS
restrictions), but should not contain a '.' suffix. A preprocessing stage
generates an index file (.idx), which is used thereafter to locate a
particular dive when required. This preprocessing uses the "initsurf",
"mindive" and "slopethresh" parameters to separate the dives. Preprocessing
can be a lengthy process. Pressing the ESC key during indexing will
terminate the process (leaving a truncated index).

Six basic operations are available:

(1)  Browse through the data. A graphical display of each dive is presented
     on the screen, showing the dive profile and important statistics. The
     user may browse forward and backward through the file, or jump to a
     particular dive.

(2)  Process a range of dives, generating output statistics.

(3)  Extract raw data for a range of dives.

(4)  Show an overview of the data. Continuous strips of depth data are
     displayed, indicating the positions where dives begin and end. This is
     useful for checking that the dive-partitioning is working correctly.

(5)  Dump the contents of a dive index to a file. The dive index contains
     the parameters used to perform the dive-partitioning. For each dive it
     contains start- and end-positions in the original text file, the
     number of lines and surface depth. This data may be useful to show the
     trend in sensor offset over time.

(6)  Force the regeneration of a dive index. This may be used if values of
     "initsurf", "mindive" or "slopethresh" need to be adjusted for a
     particular data-set.


The program options can be controlled via the command line. The command
     DIVE
presents a menu on the screen, allowing the user to control the operation
of the program using the keyboard or mouse.

Otherwise, Commands are of the form:
     DIVE [@<settings>] <input> <command>
where
     an optional @<settings> specifies <settings> as the file containing
          the program settings. This is the file from which parameters are
          loaded (and saved when the program exits).
     input     is a file containing input data
     command   is one of the following
       browse                      to graphically browse through the data
       extract <range> <output>    to extract <range> of dives to <output>
       process <range>             to process <range> dives
       dump <output>               to dump index to file <output>
       index                       to regenerate the index
     range     is one of the following
       all                         to indicate all dives
       <lo>-<hi>                   to indicate a range of dives

Examples:
Suppose "veltdr1" is an input file.
To start interactively to use the menu system:
     dive
To display a help message for the command-line options:
     dive help
To browse through the file:
     dive veltdr1 browse
To process dives 0 to 9:
     dive veltdr1 process 0-9
To process all dives:
     dive veltdr1 process all
To extract raw data from dives 50 to 60 into file "test.dat"
     dive veltdr1 extract 50-60 test.dat
To process dives 40-90 using alternative settings in file "dive.set"
     dive @dive.set process 40-90

The browse command displays a dive profile on the screen. For example, to
browse through file "veltdr1" use the command:
     dive veltdr1 browse
or select Browse from the main menu.
The graphical display shows a number of traces. The upper box shows the
velocity profile (if velocity data is present). Labelled lines show the
division between phases of the dive. Dashed lines on the velocity profile
show the mean velocity (lower line) and one standard deviation above the
mean velocity (upper line). If starts are present, they will be highlighted
in green; stops will be highlighted in red. The lower box shows the depth
profile. Small circles on the depth profile indicate the location of local
maxima and minima in depth. To the right of the depth box is a histogram
showing the relative length of time spent at each depth. The following
commands are available:
     n         move to the next dive (also left mouse button)
     p         move to the previous dive
     g         go to a selected dive. The program will prompt for a dive
               number
     d         change display to alternative format. Two formats are
               available: graphical and tabular. This command swaps between
               the two.
     ESC       the escape key terminates the browse function (also right
               mouse button).

The overview command displays strips of depth data across the screen. Each
labelled green line indicates the start of a dive record. Each red line
indicates the end of a dive record. The following options are available:
     n         move to the next screen full of data (also left mouse
button)
     g         display data starting at the selected dive. The program will
               prompt for a dive number.
     ESC       the escape key terminates the overview function (also right
               mouse button).

The process command generates statistics for a range of dives. If "file" is
the input file, several output files are generated:
     file.idx       the index file (first run through file only)
     file.out       the tabular output file
     file.csv       the CSV output file
     file.sum       the summary output file

The tabular output files may be viewed using a text editor or word
processor, or using the DOS command
     MORE < file.out

The CSV output files may be imported into spreadsheets (such as MS EXCEL).
Most spreadsheet programs have a function allowing delimited text files to
be imported. Ensure that commas are used as the delimiter.  For example,
using Microsoft EXCEL 4.0 (Macintosh),
     Select Open from the File menu
     Click the Text button
     Select Comma as the column delimiter, and "DOS" as the file origin.
          Then Click OK
     Select file.csv using the file browser. Then click OK.

The extract command copies data verbatim from the input file to the
specified output file. 

The dump command extracts values from the dive index in .CSV form to the
specified output file.

The index command regenerates the dive index using the current values of
"initsurf", "mindive", and "slopethresh".

Negative values of spikeon and spikeoff specify an absolute velocity
(rather than relative to sd) above the mean for the spike thresholds.
Example: spikeon=-1 specifies 1 m/s above vmean. If the divethreshold
parameter is changed, the user should erase the old index file. This forces
the program to generate a new index file using the new threshold. If "file"
is the name of the data, the MS/DOS command
     del file.idx
will accomplish this.

5. THE MENU SYSTEM

Invoking the program with the command line
     DIVE
causes the program to use a menu-system to interact with the user. The
keyboard or mouse may be used to control the menus. Generally, pressing
return or the left mouse button selects the highlighted item; pressing ESC
or the right mouse button aborts, or cancels a selection.

This section outlines the functions available through the menus. Some menus
contain parameters that can be edited by the user. The left and right arrow
keys will generally enable the user to edit the text for the parameter, or
will step through a range of valid values. These parameters will be saved
to a settings file (dive.par by default) when the program exits, and will
be reloaded next time the program is run. The names in square brackets
indicates the name of the parameter appearing in the settings file.
However, the user is advised not to edit this file directly, but to use the
menus to adjust the settings.

5.1 Main Menu

Settings - Enters the Settings Menu, allowing the user to edit important
     program settings.

Input Name [InputName] - This is the name of the file containing dive data.
     The user may edit this field using the cursor keys.

Type of Input Data [filetype] - Indicates the format of the input data.
     velocity       Input data contains depth and velocity
     depth only     Input data contains only depth information
Note that this parameter is only important if the dive record is to be
indexed. The file type will be stored in the file index and subsequently
does not need to be specified.

Select File - This displays a requestor, allowing the user to select from a
     list of available files. Initially, only files without extensions in
     the current directory will be displayed. Using the arrow keys or
     mouse, the user may select a file. Pressing return (or the left mouse-
     button) selects the highlighted file. Selecting a directory changes
     the display to files in that directory. Pressing ESCAPE (or the right
     mouse button) cancels the operation, returning the original selection.
     Pressing TAB, allows the directory, file mask, or file table to be
     selected.

Browse - Browse data and statistics, one dive at a time.

Overview - Show depth data, indicating start and end of dives.

Process - Go to the Process Menu. This allows the user to select a range of
     dives to process, and to change the output options. To abort the
     operation, select "Cancel". Selecting "Range" processes only the dive
     between "Low" and "High". Selecting "All" processes all dives. The
     dive record will be indexed, if it has not previously been indexed.

Extract - Go to the Extract Menu. This allow the user to select a range of
     dives to extract, and to specify a file in which to store the
     extracted data. To abort the operation, select "Cancel".

Dump - Go to the Dump Menu. This allows the user to specify a file to which
     the dive index will be output.

Index - Go to the Index Menu. If the user elects to rebuild the index, the
     current values of "initsurf", "mindive" and "slopethresh" will be
     used.

5.2 Settings Menu

Surface Detection - Go to the Surface Detection Sub-menu (detailed in 5.2.1
     below).
Spike Detection - Go to the Spike Detection Sub-menu (detailed in 5.2.2
     below)
Flat-Bottom Dive Detection - Go to the Flat-Region Detection Sub-menu
     (detailed in 5.2.3 below)
Depth Bins [nbins] - Defines the number of depth classes to compute. Each
     depth bin is allocated a proportion of the total dive time. nbins
     should be between 10 and 100.
Active Region [activeregion] - Used for ascent/descent detection. See
     Section 3, step 2).
Sleep Threshold [sleepthreshold] - The system identifies a sleep dive when
     the time(descending with zero velocity)/time(total for dive) is
     greater than sleepthreshold.
Sleep Reject [nosleepthreshold] - The system rejects a sleep dive when the
     time(with zero velocity)/time(total for dive) is greater than
     nosleepthreshold.
Overview Depth [viewdepth] - This is the width of a data strip (in metres)
     during the overview display. Dive data is not clipped within a strip.
Output .CSV file [printcsv] - Generates .CSV output (for import into
     spreadsheets) during processing.
Output .OUT file [printout] - Generates .OUT output (for humans to read)
     during processing.
Output Bins [writeout] - Appends depth bin data to each line of .CSV
     output. Ouput data is the time (in minutes) spent within each depth
     class.

5.2.1 Surface Detection Sub-menu

Minimum Dive [mindive] - Specifies the minimum depth below the surface that
     is considered to start a dive
Dive Slope Threshold [slopethresh] - Specifies the minimum slope for a dive
     to start
Initial Surfacce [initsurf] - Specifies the initial depth of the surface
     (normally 0).

5.2.2 Spike Detection Sub-menu

Spike On [spikeon] - Specifies the velocity above (for starts) or below
     (for stops) the mean for a spike to begin. If spikeon is positive it
     indicates the number of SDs. If spikeoff is negative it indicates a
     magnitude in m/s.
Spike Off [spikeoff] - Specifies the velocity above/below the mean for a
     spike to end.
Follow Time [followtime] - Indicates the time (in seconds) between the end
     of  a spike and the start of the next for the second to be said to
     follow the first.

5.2.3 Flat Region Detection Sub-menu

Depth Prop [flatdepthprop] - Indicates the width of the "bottom zone" as a
     proportion of the maximum depth.
Depth Limit [flatdepthabs] - Indicates a maximum value (in metres) for the
     depth of the bottom zone.
Depth Criterion [flatdepthtype] - Indicates the criterion used to limit the
     width of the bottom zone:
          proportional   the width is proportional to the maximum depth
          limit          the proportional width is limited by flatdepthabs
Time Absolute [flattimeabs] - Indicates the length of time (in minutes)
     required in the bottom zone for a flat dive.
Time Prop [flattimeprop] - Indicates the length of time (as a proportion of
     the total dive time) required in the bottom zone for a flat dive.
Time Criterion [flattimetype] - Indicates the time criterion used to
     determine a flat dive:
          absolute       use flattimeabs as the threshold time
          proportional   use flattimeprop*total as the threshold time

6. KNOWN BUGS / LIMITATIONS

The program does not check the validity of the data. Simple tests may be
     useful in identifying bogus values (where the readings appear change
     faster than is physically possible) or missing data.

Dive partitioning is better, but still far from perfect. The overview
     option allows the user a quick check over whether it has worked
     properly. Very shallow dives (of the order mindive) are not handled
     well.

Identification of dive phases is naive, but generally effective. Better
     specifications may be possible.

Dives must be no longer than 400 samples. This is set during compilation,
     but may be changed. The indexing procedure reports if a dive is longer
     than the maximum allowable length. Ideally, storage should be
     allocated dynamically which would remove any restriction.

Output files are always generated with the same base name as the input
     data. It may be useful to have an option to output to a different
     name.

Surface periods are not reported prior to the first dive or after the last
     dive, even though this information is all in the file.

CSV output files contain very long lines. These may confuse some
     spreadsheets (eg. old versions of Lotus 1-2-3 limit lines to 240
     characters). Modern spreadsheets (such as Microsoft Excel) should have
     no problems. The user should be able to select which statistics are to
     be output. Presently ALL statistics are output. The "cut" utility on
     unix systems can be used to extract selected columns from the CSV
     file.

The analysis is a little slow, taking 2-3 seconds per dive on a 386SX-25.
     Some efficiency gains may be possible. However, it should run much
     faster on machines with numeric co-processors.

Stewart Greenhill  5 October 1995 (2.0)
27 May 1996 (2.1)