#' @rdname GeneUpDownStream
#' @title Get Genes plus Up and Down Stream Regions
#' @description Given a genes region or genomic region (GR), this function
#' yields the GR plus the especified amount of DNA bases upstream and
#' downstream the GR.
#' @details Users can select whether to request only upstream, only downstream,
#' or both, upstream and downstream. Please notice that for a gene on the
#' negative strand, 'the start of the gene' corresponds to the 'end' of the
#' gene in the GRanges object and the 'end of the gene' correspond to the
#' 'start' of the gene in the GRanges object.
#' @param GR A \code{\link[GenomicRanges]{GRanges-class}} object containing the
#' ranges of the genes or genomic regions to be extended upstream/downstream
#' @param upstream Integer (Default: 0). The amount of DNA bases (bps) upstream
#' of the GR.
#' @param downstream Integer (Default: 0). The amount of DNA bases (bps)
#' downstream of the GR.
#' @param extend Integer (Default: NULL). If upstream == downstream, then
#' simply you may use extend.
#' @param fix A string with one of the three possible values: "start", "end" or
#' "center" to denoteg what to use as an anchor for each element in GR.
#' @param onlyUP Logic (Default: FALSE). If TRUE returns the region upstream the
#' GR.
#' @param onlyDown Logic (Default: FALSE). If TRUE returns the region downstream
#' the GR.
#' @examples
#' starts = c(65419, 450703, 923928, 944204)
#' ends = c(71585, 451697, 944581, 959309)
#' chrs = c(rep("chr1", 2), rep("chr2", 2))
#' gr = makeGRangesFromDataFrame(
#' data.frame(seqnames = chrs, start = starts, end = ends,
#' strand = c("+", "-", "+", "-"),
#' genes = c("A", "B", "C", "D")), keep.extra.columns = TRUE)
#'
#' gr1 = GeneUpDownStream(GR = gr, upstream = 2000, downstream = 1000)
#' @importFrom GenomeInfoDb seqnames
#' @importFrom BiocGenerics start end
#' @importFrom S4Vectors mcols
#' @export
GeneUpDownStream <- function(GR, upstream=0, downstream=0, extend = NULL,
fix = NULL, onlyUP=FALSE, onlyDown=FALSE) {
if (!is.null(extend)) {
if (is.numeric(extend)) extend <- as.integer(extend)
else
stop("*** 'extend' must be an integer or coercible to an integer")
upstream = extend
downstream = extend
}
strands <- as.character( strand( GR ) )
if (!is.null(fix)) {
if (fix == "start") {
starts <- start( GR )
ends <- starts
}
if (fix == "end") {
ends <- end( GR )
starts <- ends
}
if (fix == "center") {
starts <- start( GR )
ends <- end( GR )
starts <- round((ends - starts)/2)
ends <- starts
}
} else {
starts <- start( GR )
ends <- end( GR )
}
chrs <- as.character(seqnames( GR ))
if (upstream > 0 && !onlyUP && !onlyDown) {
ind <- which( strands == "+" )
starts[ ind ] <- starts[ ind ] - upstream
ind <- which( strands == "-" )
ends[ ind ] <- ends[ ind ] + upstream
GR.up <- GRanges( seqnames = chrs,
ranges = IRanges( start = starts, end = ends ),
strand = strands )
mcols(GR.up) <- mcols(GR)
GR <- GR.up; rm(GR.up); gc()
}
if (downstream > 0 && !onlyUP && !onlyDown) {
ind <- which( strands == "+" )
ends[ ind ] <- ends[ ind ] + downstream
ind <- which( strands == "-" )
starts[ ind ] <- starts[ ind ] - downstream
GR.down <- GRanges( seqnames = chrs,
ranges = IRanges( start = starts, end = ends ),
strand = strands )
mcols(GR.down) <- mcols(GR)
GR <- GR.down; rm(GR.down); gc()
}
if (onlyUP) {
if (onlyDown) stop("* If onlyUP is TRUE, then onlyDown must be FALSE")
ind <- which( strands == "+" )
ends[ ind ] <- starts[ ind ] - 1
starts[ ind ] <- starts[ ind ] - upstream
ind <- which( strands == "-" )
starts[ ind ] <- ends[ ind ] + 1
ends[ ind ] <- ends[ ind ] + upstream
GR.up <- GRanges( seqnames = chrs,
ranges = IRanges( start = starts, end = ends ),
strand = strands )
mcols(GR.up) <- mcols(GR)
GR <- GR.up; rm(GR.up); gc()
}
if (onlyDown) {
if (onlyUP) stop("* If onlyDown is TRUE, then onlyUP must be FALSE")
ind <- which( strands == "+" )
starts[ ind ] <- ends[ ind ] + 1
ends[ ind ] <- ends[ ind ] + downstream
ind <- which( strands == "-" )
ends[ ind ] <- starts[ ind ] - 1
starts[ ind ] <- starts[ ind ] - downstream
GR.down <- GRanges(seqnames = chrs,
ranges = IRanges( start = starts, end = ends ),
strand = strands )
mcols(GR.down) <- mcols(GR)
GR <- GR.down; rm(GR.down); gc()
}
return(GR)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.