diff --git a/DESCRIPTION b/DESCRIPTION index 3d31200..6b8dc28 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -69,4 +69,4 @@ biocViews: CopyNumberVariation, Software, Sequencing, VariantAnnotation, VariantDetection, Coverage, ImmunoOncology NeedsCompilation: no ByteCompile: yes -RoxygenNote: 7.2.3.9000 +RoxygenNote: 7.3.1 diff --git a/NAMESPACE b/NAMESPACE index ca9ea46..cc7f1f3 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2: do not edit by hand +export(adjustLogRatio) export(annotateTargets) export(bootstrapResults) export(calculateBamCoverageByInterval) diff --git a/NEWS b/NEWS index 6ecd9d4..9405bd5 100755 --- a/NEWS +++ b/NEWS @@ -1,6 +1,12 @@ Changes in version 2.10.0 ------------------------- +NEW FEATURES + o adjustLogRatio function for adjusting a tumor vs normal coverage + ratio for purity and ploidy. Useful for downstream tools that + expect ratios instead of absolute copy numbers such as GISTIC. + Thanks @tedtoal (#40). + SIGNIFICANT USER-VISIBLE CHANGES o Provide interval-level likelihood scores in runAbsoluteCN return diff --git a/R/adjustLogRatio.R b/R/adjustLogRatio.R new file mode 100644 index 0000000..c07c038 --- /dev/null +++ b/R/adjustLogRatio.R @@ -0,0 +1,40 @@ +#' Adjust tumor vs. normal coverage log ratio for tumor purity and ploidy +#' +#' This function can be used to adjust the log ratio for tumor purity and +#' ploidy for downstream tools that expect a log2 ratio (for example GISTIC). +#' +#' +#' @param ratio Vector of log2 tumor vs normal coverage ratios. +#' @param purity Purity of sample. +#' @param ploidy Ploidy of sample. +#' @param is.log2 \code{log.ratio} is \code{log2} transformed. +#' @param min.ratio Minimum (non-log2-transformed) ratio. Set to approx -8 +#' \code{log2} adjusted. +#' @return \code{numeric(length(log.ratio))}, \code{log.ratio} adjusted +#' for \code{purity} and \code{ploidy} +#' @author Markus Riester +#' @references +# * Zack et al. (2012), Pan-cancer patterns of somatic copy number alteration +#' Nature Biotechnology. +#' * Toal (2018), https://github.com/lima1/PureCN/issues/40 +#' +#' @examples +#' +#' normal.coverage.file <- system.file("extdata", "example_normal.txt.gz", +#' package = "PureCN") +#' tumor.coverage.file <- system.file("extdata", "example_tumor.txt.gz", +#' package = "PureCN") +#' normal <- readCoverageFile(normal.coverage.file) +#' tumor <- readCoverageFile(tumor.coverage.file) +#' log.ratio <- calculateLogRatio(normal, tumor) +#' log.ratio.adjusted <- adjustLogRatio(log.ratio, 0.65, 1.73) +#' +#' @export adjustLogRatio +adjustLogRatio <- function(ratio, purity, ploidy, is.log2 = TRUE, min.ratio = 0.004) { + if (is.log2) ratio <- 2^ratio + adjusted <- (purity * ploidy * ratio + 2 * (1 - purity) * ratio - 2 * (1 - purity)) / (purity * ploidy) + adjusted <- pmax(min.ratio, adjusted) + if (is.log2) adjusted <- log2(adjusted) + return(adjusted) +} + diff --git a/man/adjustLogRatio.Rd b/man/adjustLogRatio.Rd new file mode 100644 index 0000000..0fb25ab --- /dev/null +++ b/man/adjustLogRatio.Rd @@ -0,0 +1,47 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/adjustLogRatio.R +\name{adjustLogRatio} +\alias{adjustLogRatio} +\title{Adjust tumor vs. normal coverage log ratio for tumor purity and ploidy} +\usage{ +adjustLogRatio(ratio, purity, ploidy, is.log2 = TRUE, min.ratio = 0.004) +} +\arguments{ +\item{ratio}{Vector of log2 tumor vs normal coverage ratios.} + +\item{purity}{Purity of sample.} + +\item{ploidy}{Ploidy of sample.} + +\item{is.log2}{\code{log.ratio} is \code{log2} transformed.} + +\item{min.ratio}{Minimum (non-log2-transformed) ratio. Set to approx -8 +\code{log2} adjusted.} +} +\value{ +\code{numeric(length(log.ratio))}, \code{log.ratio} adjusted +for \code{purity} and \code{ploidy} +} +\description{ +This function can be used to adjust the log ratio for tumor purity and +ploidy for downstream tools that expect a log2 ratio (for example GISTIC). +} +\examples{ + +normal.coverage.file <- system.file("extdata", "example_normal.txt.gz", + package = "PureCN") +tumor.coverage.file <- system.file("extdata", "example_tumor.txt.gz", + package = "PureCN") +normal <- readCoverageFile(normal.coverage.file) +tumor <- readCoverageFile(tumor.coverage.file) +log.ratio <- calculateLogRatio(normal, tumor) +log.ratio.adjusted <- adjustLogRatio(log.ratio, 0.65, 1.73) + +} +\references{ +Nature Biotechnology. + * Toal (2018), https://github.com/lima1/PureCN/issues/40 +} +\author{ +Markus Riester +} diff --git a/man/filterVcfMuTect2.Rd b/man/filterVcfMuTect2.Rd index ab88998..cdc54ea 100644 --- a/man/filterVcfMuTect2.Rd +++ b/man/filterVcfMuTect2.Rd @@ -7,9 +7,9 @@ filterVcfMuTect2( vcf, tumor.id.in.vcf = NULL, - ignore = c("clustered_events", "t_lod", "str_contraction", "read_position", - "position", "fragment_length", "multiallelic", "clipping", "strand_artifact", - "strand_bias", "slippage", "weak_evidence", "orientation", "haplotype"), + ignore = c("clustered_events", "t_lod", "str_contraction", "read_position", "position", + "fragment_length", "multiallelic", "clipping", "strand_artifact", "strand_bias", + "slippage", "weak_evidence", "orientation", "haplotype"), ... ) } diff --git a/tests/testthat/test_adjustLogRatio.R b/tests/testthat/test_adjustLogRatio.R new file mode 100644 index 0000000..c8e6062 --- /dev/null +++ b/tests/testthat/test_adjustLogRatio.R @@ -0,0 +1,15 @@ +context("adjustLogRatio") + +test_that("Function returns expected values for example coverage", { + data(purecn.example.output) + log.ratio <- purecn.example.output$results[[1]]$seg$seg.mean + purity <- purecn.example.output$results[[1]]$purity + ploidy <- purecn.example.output$results[[1]]$ploidy + log.ratio.adjusted <- adjustLogRatio(log.ratio, purity, ploidy) + total.ploidy <- 1.73 + p <- 1 + opt.C <- (2^(log.ratio.adjusted + log.ratio.offset) * total.ploidy)/p - ((2 * (1 - p))/p) + expect_lt(abs(min(log.ratio.adjusted, na.rm=TRUE) - log2(0.004)), 0.001) + expect_lt(median(abs(opt.C - purecn.example.output$results[[1]]$seg$C)), 0.1) +}) +