diff --git a/pipeline-runner/R/gem2s-5-create_seurat.R b/pipeline-runner/R/gem2s-5-create_seurat.R index 70556349..1e20436f 100644 --- a/pipeline-runner/R/gem2s-5-create_seurat.R +++ b/pipeline-runner/R/gem2s-5-create_seurat.R @@ -38,6 +38,7 @@ create_seurat <- function(input, pipeline_config, prev_out) { prev_out$scdata_list <- scdata_list + prev_out$disable_qc_filters <- FALSE res <- list( data = list(), output = prev_out diff --git a/pipeline-runner/R/gem2s-6-construct_qc_config.R b/pipeline-runner/R/gem2s-6-construct_qc_config.R index f16a7a39..8236696c 100644 --- a/pipeline-runner/R/gem2s-6-construct_qc_config.R +++ b/pipeline-runner/R/gem2s-6-construct_qc_config.R @@ -6,15 +6,17 @@ #' #' @param scdata_list list of seurat objects #' @param any_filtered bool indicating if barcodes were filtered by emptyDrops +#' @param disable_qc_filters bool indicating if the data derives from the +#' subsetting of another experiment #' #' @return list of QC configuration parameters #' -construct_qc_config <- function(scdata_list, any_filtered) { +construct_qc_config <- function(scdata_list, any_filtered, disable_qc_filters) { samples <- names(scdata_list) # classifier classifier_config_to_duplicate <- list( - enabled = !any_filtered, + enabled = !any_filtered && !disable_qc_filters, prefiltered = any_filtered, auto = TRUE, filterSettings = list(FDR = 0.01) @@ -34,7 +36,7 @@ construct_qc_config <- function(scdata_list, any_filtered) { # mito default_mitochondrialContent_config <- list( - enabled = TRUE, + enabled = !disable_qc_filters, auto = TRUE, filterSettings = list( method = "absoluteThreshold", @@ -51,7 +53,7 @@ construct_qc_config <- function(scdata_list, any_filtered) { # ngenes vs umis default_numGenesVsNumUmis_config <- list( - enabled = TRUE, + enabled = !disable_qc_filters, auto = TRUE, filterSettings = list( regressionType = "linear", @@ -67,7 +69,7 @@ construct_qc_config <- function(scdata_list, any_filtered) { # doublet scores default_doubletScores_config <- list( - enabled = TRUE, + enabled = !disable_qc_filters, auto = TRUE, filterSettings = list( probabilityThreshold = 0.5, @@ -140,7 +142,7 @@ get_cellsize_config <- function(scdata_list, config) { get_sample_mitochondrial_config <- function(scdata_list.sample, config) { config.sample <- list( - enabled = TRUE, + enabled = config$enabled, auto = TRUE, filterSettings = list( method = "absoluteThreshold", diff --git a/pipeline-runner/R/gem2s-6-prepare_experiment.R b/pipeline-runner/R/gem2s-6-prepare_experiment.R index 5688a94d..788ce76c 100644 --- a/pipeline-runner/R/gem2s-6-prepare_experiment.R +++ b/pipeline-runner/R/gem2s-6-prepare_experiment.R @@ -15,10 +15,11 @@ prepare_experiment <- function(input, pipeline_config, prev_out) { message("Preparing experiment ...") - check_names <- c("config", "counts_list", "annot", "doublet_scores", "scdata_list") + check_names <- c("config", "counts_list", "annot", "doublet_scores", "scdata_list", "disable_qc_filters") check_prev_out(prev_out, check_names) scdata_list <- prev_out$scdata_list + disable_qc_filters <- prev_out$disable_qc_filters samples <- names(scdata_list) message("Total cells:", sum(sapply(scdata_list, ncol))) @@ -29,7 +30,7 @@ prepare_experiment <- function(input, pipeline_config, prev_out) { # construct default QC config and update prev out message("Constructing default QC configuration...") any_filtered <- !(length(prev_out$edrops) == length(samples)) - prev_out$qc_config <- construct_qc_config(scdata_list, any_filtered) + prev_out$qc_config <- construct_qc_config(scdata_list, any_filtered, disable_qc_filters) res <- list( data = list(), diff --git a/pipeline-runner/R/gem2s-7-upload_to_aws.R b/pipeline-runner/R/gem2s-7-upload_to_aws.R index d519d771..913fcc86 100644 --- a/pipeline-runner/R/gem2s-7-upload_to_aws.R +++ b/pipeline-runner/R/gem2s-7-upload_to_aws.R @@ -10,7 +10,7 @@ #' upload_to_aws <- function(input, pipeline_config, prev_out) { message("Uploading to AWS ...") - check_names <- c("config", "counts_list", "annot", "doublet_scores", "scdata_list", "qc_config") + check_names <- c("config", "counts_list", "annot", "doublet_scores", "scdata_list", "qc_config", "disable_qc_filters") check_prev_out(prev_out, check_names) experiment_id <- input$experimentId @@ -20,6 +20,7 @@ upload_to_aws <- function(input, pipeline_config, prev_out) { scdata_list <- prev_out$scdata_list config <- prev_out$config qc_config <- prev_out$qc_config + disable_qc_filters <- prev_out$disable_qc_filters message("Constructing cell sets ...") cell_sets <- get_cell_sets(scdata_list, input) diff --git a/pipeline-runner/tests/testthat/test-gem2s-6-construct_qc_config.R b/pipeline-runner/tests/testthat/test-gem2s-6-construct_qc_config.R index 4cf042b6..fa12126c 100644 --- a/pipeline-runner/tests/testthat/test-gem2s-6-construct_qc_config.R +++ b/pipeline-runner/tests/testthat/test-gem2s-6-construct_qc_config.R @@ -26,7 +26,7 @@ mock_scdata_list <- function() { test_that("cellsize filter is disabled by default and classifier is pre-filtered", { scdata_list <- mock_scdata_list() - qc_config <- construct_qc_config(scdata_list, any_filtered = TRUE) + qc_config <- construct_qc_config(scdata_list, any_filtered = TRUE, disable_qc_filters = FALSE) for (sample in names(scdata_list)) { expect_false(qc_config$classifier[[sample]]$enabled) @@ -38,7 +38,7 @@ test_that("cellsize filter is disabled by default and classifier is pre-filtered test_that("cellsize filter is disabled by default and classifier is not pre-filtered", { scdata_list <- mock_scdata_list() - qc_config <- construct_qc_config(scdata_list, any_filtered = FALSE) + qc_config <- construct_qc_config(scdata_list, any_filtered = FALSE, disable_qc_filters = FALSE) for (sample in names(scdata_list)) { expect_false(qc_config$cellSizeDistribution[[sample]]$enabled) @@ -47,3 +47,30 @@ test_that("cellsize filter is disabled by default and classifier is not pre-filt } }) + +test_that("all filters are disabled when disable_qc_filters = TRUE and classifier is pre-filtered", { + scdata_list <- mock_scdata_list() + qc_config <- construct_qc_config(scdata_list, any_filtered = TRUE, disable_qc_filters = TRUE) + + for (sample in names(scdata_list)) { + expect_false(qc_config$cellSizeDistribution[[sample]]$enabled) + expect_false(qc_config$mitochondrialContent[[sample]]$enabled) + expect_false(qc_config$classifier[[sample]]$enabled) + expect_false(qc_config$numGenesVsNumUmis[[sample]]$enabled) + expect_false(qc_config$doubletScores[[sample]]$enabled) + } +}) + + +test_that("all filters are disabled when disable_qc_filters = TRUE and classifier is not pre-filtered", { + scdata_list <- mock_scdata_list() + qc_config <- construct_qc_config(scdata_list, any_filtered = FALSE, disable_qc_filters = TRUE) + + for (sample in names(scdata_list)) { + expect_false(qc_config$cellSizeDistribution[[sample]]$enabled) + expect_false(qc_config$mitochondrialContent[[sample]]$enabled) + expect_false(qc_config$classifier[[sample]]$enabled) + expect_false(qc_config$numGenesVsNumUmis[[sample]]$enabled) + expect_false(qc_config$doubletScores[[sample]]$enabled) + } +}) diff --git a/pipeline-runner/tests/testthat/test-gem2s-7-upload_to_aws.R b/pipeline-runner/tests/testthat/test-gem2s-7-upload_to_aws.R index 6f4d905f..edc05d15 100644 --- a/pipeline-runner/tests/testthat/test-gem2s-7-upload_to_aws.R +++ b/pipeline-runner/tests/testthat/test-gem2s-7-upload_to_aws.R @@ -231,7 +231,8 @@ test_that("upload_to_aws tries to upload the correct files to aws", { annot = list(), doublet_scores = list(), scdata_list = scdata_list, - qc_config = list("mock_qc_config")) + qc_config = list("mock_qc_config"), + disable_qc_filters = FALSE) res <- stubbed_upload_to_aws(input, pipeline_config, prev_out)