From 7013aae21ebbfc5f09740883e7b78f602716fcf0 Mon Sep 17 00:00:00 2001
From: Luke Zappia <lazappi@users.noreply.github.com>
Date: Tue, 17 Sep 2019 15:05:43 +1000
Subject: [PATCH] Adjust BASiCSSimulate to match devel BASiCS

---
 DESCRIPTION         |  6 +++---
 NEWS.md             |  4 ++++
 R/BASiCS-simulate.R | 48 ++++++++++++++++++++++++---------------------
 3 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/DESCRIPTION b/DESCRIPTION
index cfcf2ca..5a1c60c 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,8 +1,8 @@
 Package: splatter
 Type: Package
 Title: Simple Simulation of Single-cell RNA Sequencing Data
-Version: 1.9.5
-Date: 2019-09-09
+Version: 1.9.6
+Date: 2019-09-17
 Author: Luke Zappia
 Authors@R:
     c(person("Luke", "Zappia", role = c("aut", "cre"),
@@ -58,7 +58,7 @@ Suggests:
     scran,
     mfa,
     phenopath,
-    BASiCS,
+    BASiCS (>= 1.7.10),
     zinbwave,
     SparseDC,
     BiocManager,
diff --git a/NEWS.md b/NEWS.md
index 860cf3d..fba5bbb 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -1,3 +1,7 @@
+## Version 1.9.6 (2019-09-17)
+
+* Adjust BASiCSSimulate to match development version of BASiCS
+
 ## Version 1.9.5 (2019-09-09)
 
 * Fix bug in NAMESPACE
diff --git a/R/BASiCS-simulate.R b/R/BASiCS-simulate.R
index f2f40da..345ba5b 100644
--- a/R/BASiCS-simulate.R
+++ b/R/BASiCS-simulate.R
@@ -48,6 +48,10 @@ BASiCSSimulate <- function(params = newBASiCSParams(), verbose = TRUE, ...) {
     batch.cells <- getParam(params, "batchCells")
     gene.params <- getParam(params, "gene.params")
 
+    if (nSpikes == 0 && nBatches == 1) {
+        stop("If there are no spikes there must be multiple batches")
+    }
+
     # Sample gene.params if necessary
     if (nrow(gene.params) != nGenes) {
         warning("Number of gene.params not equal to nGenes, ",
@@ -59,7 +63,9 @@ BASiCSSimulate <- function(params = newBASiCSParams(), verbose = TRUE, ...) {
     mu <- gene.params$Mean
     delta <- gene.params$Delta
 
-    if (nSpikes > 0) {
+    has.spikes <- nSpikes > 0
+    spike.mu <- NULL
+    if (has.spikes) {
         spike.mu <- getParam(params, "spike.means")
         if (length(spike.mu) != nSpikes) {
             warning("Number of spike-in means not equal to nSpikes, ",
@@ -67,9 +73,6 @@ BASiCSSimulate <- function(params = newBASiCSParams(), verbose = TRUE, ...) {
             selected <- sample(length(spike.mu), nSpikes, replace = TRUE)
             spike.mu <- spike.mu[selected]
         }
-    } else {
-        # Create dummy spike-ins to get around BASiCS_Sim...
-        spike.mu <- c(10, 10)
     }
 
     cell.params <- getParam(params, "cell.params")
@@ -87,31 +90,32 @@ BASiCSSimulate <- function(params = newBASiCSParams(), verbose = TRUE, ...) {
     batches <- unlist(batches)
 
     if (verbose) {message("Simulating counts with BASiCS...")}
-    counts.list <- list()
-    for (batch in seq_len(nBatches)) {
-        batch.cells <- batches == batch
-        phi <- cell.params[batch.cells, "Phi"]
-        phi <- (phi / sum(phi)) * sum(batch.cells)
-        s <- cell.params[batch.cells, "S"]
-        theta <- thetas[batch]
+    if (has.spikes) {
         BASiCS.sim <- suppressMessages(
-                          BASiCS::BASiCS_Sim(mu, spike.mu, delta, phi, s, theta)
-                      )
-        batch.counts <- SummarizedExperiment::assay(BASiCS.sim)
-        counts.list[[batch]] <- batch.counts
+            BASiCS::BASiCS_Sim(Mu = mu, Mu_spikes = spike.mu, Delta = delta,
+                               Phi = cell.params$Phi, S = cell.params$S,
+                               Theta = thetas, BatchInfo = batches)
+        )
+        counts <- SingleCellExperiment::counts(BASiCS.sim)
+        spike.counts <- SummarizedExperiment::assay(
+            SingleCellExperiment::altExp(BASiCS.sim)
+        )
+        counts <- rbind(counts, spike.counts)
+    } else {
+        if (verbose) {message("Simulating without spikes")}
+        BASiCS.sim <- suppressMessages(
+            BASiCS::BASiCS_Sim(Mu = mu, Mu_spikes = NULL, Delta = delta,
+                               Phi = NULL, S = cell.params$S,
+                               Theta = thetas, BatchInfo = batches)
+        )
+        counts <- SingleCellExperiment::counts(BASiCS.sim)
     }
 
-    counts <- do.call(cbind, counts.list)
-
     if (verbose) {message("Creating final dataset...")}
     cell.names <- paste0("Cell", seq_len(nCells))
     gene.names <- paste0("Gene", seq_len(nGenes))
-    if (nSpikes > 0) {
+    if (has.spikes) {
         gene.names <- c(gene.names, paste0("Spike", seq_len(nSpikes)))
-    } else {
-        # Remove dummy spikes
-        counts <- counts[1:(nrow(counts) - 2), ]
-        spike.mu <- numeric()
     }
 
     rownames(counts) <- gene.names
-- 
GitLab