###########################################################################/**
# @RdocClass TotalCnBinnedCounting
#
# @title "The TotalCnBinnedCounting class"
#
# \description{
#  @classhierarchy
#
# }
#
# @synopsis
#
# \arguments{
#  \item{...}{Arguments passed to @see "aroma.cn::TotalCnSmoothing".}
#  \item{.reqSetClass}{(internal) ...}
# }
#
# \section{Fields and Methods}{
#  @allmethods "public"
# }
#
# @author "HB"
#*/###########################################################################
setConstructorS3("TotalCnBinnedCounting", function(..., .reqSetClass="BamDataSet") {
  use("aroma.cn")
  TotalCnSmoothing <- aroma.cn::TotalCnSmoothing
  extend(TotalCnSmoothing(..., .reqSetClass=.reqSetClass), "TotalCnBinnedCounting")
})
setMethodS3("getExpectedOutputFullnames", "TotalCnBinnedCounting", function(this, ...) {
  names <- NextMethod("getExpectedOutputFullnames")
  names <- paste(names, "counts", sep=",")
  names
}, protected=TRUE)
setMethodS3("getOutputFileSetClass", "TotalCnBinnedCounting", function(this, ...) {
  AromaUnitTotalCnBinarySet
}, protected=TRUE)
setMethodS3("getOutputFileExtension", "TotalCnBinnedCounting", function(this, ...) {
  ",counts.asb"
}, protected=TRUE)
setMethodS3("smoothRawCopyNumbers", "TotalCnBinnedCounting", function(this, rawCNs, target, ..., verbose=FALSE) {
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Validate arguments
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Argument 'verbose':
  verbose <- Arguments$getVerbose(verbose)
  if (verbose) {
    pushState(verbose)
    on.exit(popState(verbose))
  }
  verbose && enter(verbose, "Counting one set of copy numbers")
  verbose && print(verbose, rawCNs)
  x <- getPositions(rawCNs)
  verbose && cat(verbose, "Read positions to be binned:")
  verbose && str(verbose, x)
  verbose && cat(verbose, "Argument 'target':")
  verbose && str(verbose, target)
  # Setting up arguments
  params <- getParameters(this)
  targetUgp <- params$targetUgp
  params$targetUgp <- NULL
  xOut <- target$xOut
  verbose && cat(verbose, "Target loci: ", hpaste(xOut))
  by <- median(diff(sort(xOut)), na.rm=TRUE)
  verbose && cat(verbose, "Distance between target loci: ", by)
  bx <- c(xOut[1]-by/2, xOut+by/2)
  verbose && cat(verbose, "Bins:")
  verbose && str(verbose, bx)
  args <- c(list(), params, list(x=x, bx=bx), ...)
  # Keep only known arguments
  ns <- getNamespace("matrixStats")
  binCounts <- get("binCounts", envir=ns, mode="function")
  knownArguments <- names(formals(binCounts))
  rm(list="binCounts")
  keep <- is.element(names(args), knownArguments)
  args <- args[keep]
  verbose && cat(verbose, "Calling binCounts() with arguments:")
  verbose && str(verbose, args)
  args$verbose <- less(verbose, 20)
  yS <- do.call(binCounts, args=args)
  verbose && cat(verbose, "Bin counts:")
  verbose && str(verbose, yS)
  smoothCNs <- RawCopyNumbers(yS, x=xOut)
  verbose && exit(verbose)
  smoothCNs
}, protected=TRUE)
setMethodS3("process", "TotalCnBinnedCounting", function(this, ..., force=FALSE, verbose=FALSE) {
  use("aroma.cn")
  getTargetPositions <- aroma.cn::getTargetPositions
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Validate arguments
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Argument 'force':
  force <- Arguments$getLogical(force)
  # Argument 'verbose':
  verbose <- Arguments$getVerbose(verbose)
  if (verbose) {
    pushState(verbose)
    on.exit(popState(verbose))
  }
  verbose && enter(verbose, "Smoothing copy-number towards set of target loci")
  ds <- getInputDataSet(this)
  verbose && cat(verbose, "Input data set:")
  verbose && print(verbose, ds)
  if (force) {
    todo <- seq_along(ds)
  } else {
    todo <- findFilesTodo(this, verbose=less(verbose, 1))
    # Already done?
    if (length(todo) == 0L) {
      verbose && cat(verbose, "Already done. Skipping.")
      res <- getOutputDataSet(this, onMissing="error", verbose=less(verbose, 1))
      verbose && exit(verbose)
      return(invisible(res))
    }
  }
  params <- getParameters(this)
  verbose && cat(verbose, "Method parameters:")
  verbose && str(verbose, params)
  verbose && enter(verbose, "Identifying all target positions")
  targetList <- getTargetPositions(this, ...)
  nbrOfChromosomes <- length(targetList)
  verbose && str(verbose, targetList)
  targetUgp <- params$targetUgp
  platform <- getPlatform(targetUgp)
  chipType <- getChipType(targetUgp)
  nbrOfUnits <- nbrOfUnits(targetUgp)
  params$targetUgp <- NULL
  parameters <- list(
    targetUgp=list(
      fullname=getFullName(targetUgp),
      platform=getPlatform(targetUgp),
      chipType=getChipType(targetUgp),
      nbrOfUnits=nbrOfUnits(targetUgp),
      checksum=getChecksum(targetUgp)
    ),
    params=params
  )
  # Not needed anymore
  targetUgp <- params <- NULL
  verbose && cat(verbose, "Total number of target units: ", nbrOfUnits)
  verbose && exit(verbose)
  # Get Class object for the output files
  clazz <- getOutputFileClass(this)
  # Get the filename extension for output files
  ext <- getOutputFileExtension(this)
  # Output directory
  path <- getPath(this)
  verbose && cat(verbose, "Number of items to be processed: ", length(todo))
  ## Number of units
  nbrOfUnits <- parameters$targetUgp$nbrOfUnits
  ## FIXME: For some reason the below does not work with
  ##        parallel futures. /HB 2016-03-12
  oplan <- future::plan("eager")
  on.exit(future::plan(open), add=TRUE)
  res <- listenv()
  for (kk in seq_along(todo)) {
    ii <- todo[kk]
    df <- ds[[ii]]
    fullname <- getFullName(df)
    verbose && enter(verbose, sprintf("Item #%d ('%s') of %d", kk, fullname, length(todo)))
    filename <- sprintf("%s%s", fullname, ext)
    pathname <- Arguments$getReadablePathname(filename, path=path,
                                                         mustExist=FALSE)
    verbose && cat(verbose, "Output pathname: ", pathname)
    if (!force && isFile(pathname)) {
      dfOut <- newInstance(clazz, filename=pathname)
      if (nbrOfUnits != nbrOfUnits(dfOut)) {
        throw("The number of units in existing output file does not match the number of units in the output file: ", nbrOfUnits, " != ", nbrOfUnits(dfOut))
      }
      verbose && cat(verbose, "Skipping already existing output file.")
      res[[kk]] <- dfOut
      verbose && exit(verbose)
      next
    }
    res[[kk]] %<-% {
      verbose && print(verbose, df)
      # Preallocate vector
      M <- rep(NA_real_, times=nbrOfUnits)
      verbose && enter(verbose, "Reading and smoothing input data")
      for (cc in seq_along(targetList)) {
        target <- targetList[[cc]]
        chromosome <- target$chromosome
        chrTag <- sprintf("Chr%02d", chromosome)
        verbose && enter(verbose, sprintf("Chromosome %d ('%s') of %d",
                                                 cc, chrTag, length(targetList)))
        verbose && cat(verbose, "Extracting raw CNs:")
        rawCNs <- extractRawCopyNumbers(df, chromosome=chromosome,
                                                    verbose=less(verbose, 10))
        verbose && print(verbose, rawCNs)
        verbose && summary(verbose, rawCNs)
        verbose && cat(verbose, "Smoothing CNs:")
        verbose && cat(verbose, "Target positions:")
        verbose && str(verbose, target$xOut)
        smoothCNs <- smoothRawCopyNumbers(this, rawCNs=rawCNs,
                                          target=target, verbose=verbose)
        rawCNs <- NULL # Not needed anymore
        verbose && print(verbose, smoothCNs)
        verbose && summary(verbose, smoothCNs)
        M[target$units] <- getSignals(smoothCNs)
        target <- smoothCNs <- NULL # Not needed anymore
        verbose && exit(verbose)
      } # for (cc ...)
      verbose && exit(verbose)
      verbose && enter(verbose, "Smoothed CNs across all chromosomes:")
      verbose && str(verbose, M)
      verbose && summary(verbose, M)
      verbose && printf(verbose, "Missing values: %d (%.1f%%) out of %d\n",
                     sum(is.na(M)), 100*sum(is.na(M))/nbrOfUnits, nbrOfUnits)
      verbose && exit(verbose)
      verbose && enter(verbose, "Storing smoothed data")
      verbose && cat(verbose, "Pathname: ", pathname)
      footer <- list(
        sourceDataFile=list(
          fullname=getFullName(df),
          platform=getPlatform(df),
          chipType=getChipType(df),
          checksum=getChecksum(df)
        ),
        parameters=parameters
      )
      # Write to a temporary file
      pathnameT <- pushTemporaryFile(pathname, verbose=verbose)
      ## Alocate empty file
      dfOut <- clazz$allocate(filename=pathnameT, nbrOfRows=nbrOfUnits,
                              platform=parameters$targetUgp$platform,
                              chipType=parameters$targetUgp$chipType,
                              footer=footer, verbose=less(verbose, 50))
      ## Save signals
      dfOut[,1L] <- M
      # Not needed anymore
      M <- footer <- NULL
      # Renaming temporary file
      pathname <- popTemporaryFile(pathnameT, verbose=verbose)
      verbose && exit(verbose) # Storing
      # Sanity check
      dfOut <- newInstance(clazz, filename=pathname)
      if (nbrOfUnits != nbrOfUnits(dfOut)) {
        throw("The number of units in existing output file does not match the number of units in the output file: ", nbrOfUnits, " != ", nbrOfUnits(dfOut))
      }
      verbose && print(verbose, dfOut)
      dfOut
    } ## %<-%
    verbose && exit(verbose)
  } ## for (kk ...)
  ## Resolve futures
  res <- resolve(res)
  verbose && exit(verbose)
  dsOut <- getOutputDataSet(this, onMissing="error")
  invisible(dsOut)
}) # process()
setMethodS3("extractRawCopyNumbers", "BamDataFile", function(this, chromosome, ..., verbose=FALSE) {
  use("GenomicRanges")
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Validate arguments
  # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  # Argument 'chromosome':
  chromosome <- Arguments$getIndex(chromosome)
  # Argument 'verbose':
  verbose <- Arguments$getVerbose(verbose)
  if (verbose) {
    pushState(verbose)
    on.exit(popState(verbose))
  }
  verbose && enter(verbose, "Extracting raw \"copy numbers\"")
  verbose && cat(verbose, "Chromosome index: ", chromosome)
  targetLabels <- names(getTargets(this))
  chrLabel <- targetLabels[chromosome] # AD HOC. /HB 2012-10-11
  verbose && cat(verbose, "Chromosome label: ", chrLabel)
  # Read (start) positions on current chromosome
  gr <- GRanges(seqnames=Rle(chrLabel), ranges=IRanges(-500e6, +500e6))
  x <- readReadPositions(this, which=gr, verbose=less(verbose, 10))$pos
  verbose && cat(verbose, "Read positions:")
  verbose && str(verbose, x)
  y <- rep(1.0, times=length(x))
  cn <- RawCopyNumbers(y, x=x, chromosome=chromosome)
  verbose && cat(verbose, "Read data:")
  verbose && cat(verbose, cn)
  verbose && exit(verbose)
  cn
}, protected=TRUE) # extractRawCopyNumbers()
setMethodS3("getPlatform", "BamDataSet", function(this, ...) {
  getPlatform(getOneFile(this))
})
setMethodS3("getChipType", "BamDataSet", function(this, ...) {
  getChipType(getOneFile(this))
})
setMethodS3("getPlatform", "BamDataFile", function(this, ...) {
  "NGS"
})
setMethodS3("getChipType", "BamDataFile", function(this, ...) {
  basename(getPath(this))
})
setMethodS3("getFilenameExtension", "BamDataFile", function(this, ...) {
  "bam"
}, protected=TRUE)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.