This function finds the valleys around peaks.
Value
A matrix
with three columns representing the index of the left
valley, the peak centroid, and the right valley.
Note
The detection of the valleys is based on localMaxima
. It returns the
first occurence of a local maximum (in this specific case the minimum).
For plateaus, e.g. c(0, 0, 0, 1:3, 2:1, 0)
this results in a wrongly
reported left valley index of 1
(instead of 3
, see the example section as
well). In real data this should not be a real problem.
x[x == min(x)] <- Inf
could be used before running valleys
to circumvent
this specific problem but it is not really tested and could cause different
problems.
See also
Other extreme value functions:
.peakRegionMask()
,
localMaxima()
,
refineCentroids()
Examples
ints <- c(5, 8, 12, 7, 4, 9, 15, 16, 11, 8, 3, 2, 3, 2, 9, 12, 14, 13, 8, 3)
mzs <- seq_along(ints)
peaks <- which(localMaxima(ints, hws = 3))
cols <- seq_along(peaks) + 1
plot(mzs, ints, type = "h", ylim = c(0, 16))
points(mzs[peaks], ints[peaks], col = cols, pch = 20)
v <- valleys(ints, peaks)
segments(mzs[v[, "left"]], 0, mzs[v[, "right"]], col = cols, lwd = 2)
## Known limitations for plateaus
y <- c(0, 0, 0, 0, 0, 1:5, 4:1, 0)
valleys(y, 10L) # left should be 5 here but is 1
#> left centroid right
#> [1,] 1 10 15
## a possible workaround that may cause other problems
y[min(y) == y] <- Inf
valleys(y, 10L)
#> left centroid right
#> [1,] 6 10 14