R: Find Profiles within a Tow-Yow CTD Record

ctdFindProfiles {oce} | R Documentation

## Find Profiles within a Tow-Yow CTD Record

### Description

Examine the pressure record looking for extended periods of either ascent or descent, and return either indices to these events or a vector of CTD records containing the events.

### Usage

    ctdFindProfiles(
      x,
      cutoff = 0.5,
      minLength = 10,
      minHeight = 0.1 * diff(range(x[["pressure"]])),
      smoother = smooth.spline,
      direction = c("descending", "ascending"),
      breaks,
      arr.ind = FALSE,
      distinct,
      debug = getOption("oceDebug"),
      ...
    )

### Arguments

`x` | a ctd object.
`cutoff` | criterion on pressure difference; see “Details”.
`minLength` | lower limit on number of points in candidate profiles.
`minHeight` | lower limit on height of candidate profiles.
`smoother` | The smoothing function to use for identifying down/up casts. The default is `smooth.spline`, which performs well for a small number of cycles; see “Examples” for a method that is better for a long tow-yo. The return value from `smoother` must be either a list containing an element named `y` or something that can be coerced to a vector with `as.vector()`. To turn smoothing off, so that cycles in pressure are determined by simple first difference, set `smoother` to `NULL`.
`direction` | String indicating the travel direction to be selected.
`breaks` | optional integer vector indicating the indices of last datum in each profile stored within `x`. Thus, the first profile in the return value will contain the `x` data from indices 1 to `breaks[1]`. If `breaks` is given, then all other arguments except `x` are ignored. Using `breaks` is handy in cases where other schemes fail, or when the author has independent knowledge of how the profiles are strung together in `x`; see example 3 for how `breaks` might be used for towyo data.
`arr.ind` | Logical indicating whether the array indices should be returned; the alternative is to return a vector of ctd objects.
`distinct` | An optional string indicating how to identify profiles by unique values. Use `"location"` to find profiles by a change in longitude and latitude, or use the name of any of item in the `data` slot in `x`. In these cases, all the other arguments except `x` are ignored. However, if `distinct` is not supplied, the other arguments are handled as described above.
`debug` | an integer specifying whether debugging information is to be printed during the processing. This is a general parameter that is used by many `oce` functions. Generally, setting `debug=0` turns off the printing, while higher values suggest that more information be printed. If one function calls another, it usually reduces the value of `debug` first, so that a user can often obtain deeper debugging by specifying higher `debug` values.
`...` | Optional extra arguments that are passed to the smoothing function, `smoother`.

### Details

The method works by examining the pressure record. First, this is smoothed using `smoother()` (see “Arguments”), and then the result is first-differenced using `diff()`. Median values of the positive and negative first-difference values are then multiplied by `cutoff`. This establishes criteria for any given point to be in an ascending profile, a descending profile, or a non-profile. Contiguous regions are then found, and those that have fewer than `minLength` points are discarded. Then, those that have pressure ranges less than `minHeight` are discarded.

Caution: this method is not well-suited to all datasets. For example, the default value of `smoother` is `smooth.spline()`, and this works well for just a few profiles, but poorly for a tow-yo with a long sequence of profiles; in the latter case, it can be preferable to use simpler smoothers (see “Examples”). Also, depending on the sampling protocol, it is often necessary to pass the resultant profiles through `ctdTrim()`, to remove artifacts such as an equilibration phase, etc. Generally, one is well-advised to use the present function for a quick look at the data, relying on e.g. `plotScan()` to identify profiles visually, for a final product.

### Value

If `arr.ind=TRUE`, a data frame with columns `start` and `end`, the indices of the downcasts. Otherwise, a vector of `ctd` objects. In this second case, the station names are set to a form like `"10/3"`, for the third profile within an original ctd object with station name `"10"`, or to `"3"`, if the original ctd object had no station name defined.

### Author(s)

Dan Kelley and Clark Richards

### See Also

The documentation for ctd explains the structure of CTD objects, and also outlines the other functions dealing with them.

Other things related to ctd data: `CTD_BCD2014666_008_1_DN.ODF.gz`, `[[,ctd-method`, `[[<-,ctd-method`, `as.ctd()`, `cnvName2oceName()`, `ctd-class`, `ctd.cnv`, `ctdDecimate()`, `ctdRaw`, `ctdTrim()`, `ctd`, `d200321-001.ctd`, `d201211_0011.cnv`, `handleFlags,ctd-method`, `initialize,ctd-method`, `initializeFlagScheme,ctd-method`, `oceNames2whpNames()`, `oceUnits2whpUnits()`, `plot,ctd-method`, `plotProfile()`, `plotScan()`, `plotTS()`, `read.ctd.itp()`, `read.ctd.odf()`, `read.ctd.sbe()`, `read.ctd.woce.other()`, `read.ctd.woce()`, `read.ctd()`, `setFlags,ctd-method`, `subset,ctd-method`, `summary,ctd-method`, `woceNames2oceNames()`, `woceUnit2oceUnit()`, `write.ctd()`

### Examples

    ## Not run:
    library(oce)
    ## Example 1.
    d <- read.csv("towyow.csv", header=TRUE)
    towyow <- as.ctd(d$salinity, d$temperature, d$pressure)

    casts <- ctdFindProfiles(towyow)
    par(mfrow=c(length(casts), 3))
    for (cast in casts) {
      plotProfile(cast, "salinity")
      plotProfile(cast, "temperature")
      plotTS(cast, type='o')
    }

    ## Example 2.
    ## Using a moving average to smooth pressure, instead of the default
    ## smooth.spline() method. This avoids a tendency of smooth.spline()
    ## to smooth out the profiles in a tow-yo with many (dozens or more) cycles.
    movingAverage <- function(x, n = 11, ...)
    {
       f <- rep(1/n, n)
       stats::filter(x, f, ...)
    }
    casts <- ctdFindProfiles(towyo, smoother=movingAverage)

    ## Example 3: glider data, with profiles separated by >10dbar jump.
    breaks <- which(diff(ctd[["pressure"]]) > 10))
    profiles <- ctdFindProfiles(ctd, breaks=breaks)

    ## End(Not run)

[Package oce version 1.2-0 Index]