## for a series of intervals that may overlap or contain each other,
## compute the minimum size of a cover.
## E.g. applications time intervals, physical bp intervals
#' @export
mincover <- function(x.begin, x.end, trunc.begin = NULL, trunc.end = NULL) {
stopifnot(length(x.begin) == length(x.end))
if (!is.null(trunc.begin)) stopifnot(length(trunc.begin) == 1)
if (!is.null(trunc.end)) stopifnot(length(trunc.end) == 1)
if (length(x.begin) == 0) return(0)
oo <- order(x.begin)
x.begin <- as.integer(x.begin[oo])
x.end <- as.integer(x.end[oo])
if (length(x.begin) > 1) {
x.begin[2:length(x.begin)] <- sapply(2:length(x.begin), function(ii) max(c(x.begin[ii], x.end[1:(ii-1)] + 1)))
## ii-th interval chopped to guarantee not to overlap intervals 1..(ii-1) => no overlap
## chopped parts guaranteed to be covered by other intervals => no loss of cover
## chopping may make some intervals have begin > end, excluded from sum by pmax below
}
if (!is.null(trunc.begin)) x.begin <- pmax(x.begin, as.integer(trunc.begin))
if (!is.null(trunc.end)) x.end <- pmin(x.end, as.integer(trunc.end))
return(sum(pmax(0, x.end - x.begin + 1)))
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.