From e467c09165f1182972f259cb9cb8959b65be58f6 Mon Sep 17 00:00:00 2001 From: Suzanne Jin Date: Tue, 13 Feb 2024 11:58:42 +0100 Subject: [PATCH] Propr propr (#4817) * modified affy/justrma to allow the user get the unlog data when --keep.log2 FALSE * after prettier * trailing whitespace * added final newline * fix issue * updated snapshot * corrected md5sum issues with inconsistent decimals * corrected round matrix method * . * copied pytest_modules.yml * . * updated container version and added reproducible test for fdr --- modules/nf-core/propr/propr/environment.yml | 7 + modules/nf-core/propr/propr/main.nf | 25 ++ modules/nf-core/propr/propr/meta.yml | 72 ++++ modules/nf-core/propr/propr/templates/propr.R | 308 ++++++++++++++++++ .../propr/propr/tests/alr_pcorbshrink.config | 3 + .../nf-core/propr/propr/tests/clr_pcor.config | 3 + .../propr/propr/tests/clr_pcorbshrink.config | 3 + .../nf-core/propr/propr/tests/clr_rho.config | 3 + .../propr/propr/tests/clr_rho_alpha.config | 3 + .../nf-core/propr/propr/tests/main.nf.test | 163 +++++++++ .../propr/propr/tests/main.nf.test.snap | 153 +++++++++ modules/nf-core/propr/propr/tests/tags.yml | 2 + 12 files changed, 745 insertions(+) create mode 100644 modules/nf-core/propr/propr/environment.yml create mode 100644 modules/nf-core/propr/propr/main.nf create mode 100644 modules/nf-core/propr/propr/meta.yml create mode 100644 modules/nf-core/propr/propr/templates/propr.R create mode 100644 modules/nf-core/propr/propr/tests/alr_pcorbshrink.config create mode 100644 modules/nf-core/propr/propr/tests/clr_pcor.config create mode 100644 modules/nf-core/propr/propr/tests/clr_pcorbshrink.config create mode 100644 modules/nf-core/propr/propr/tests/clr_rho.config create mode 100644 modules/nf-core/propr/propr/tests/clr_rho_alpha.config create mode 100644 modules/nf-core/propr/propr/tests/main.nf.test create mode 100644 modules/nf-core/propr/propr/tests/main.nf.test.snap create mode 100644 modules/nf-core/propr/propr/tests/tags.yml diff --git a/modules/nf-core/propr/propr/environment.yml b/modules/nf-core/propr/propr/environment.yml new file mode 100644 index 00000000000..cb163068ff1 --- /dev/null +++ b/modules/nf-core/propr/propr/environment.yml @@ -0,0 +1,7 @@ +name: propr_propr +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - conda-forge::r-propr=5.0.3 diff --git a/modules/nf-core/propr/propr/main.nf b/modules/nf-core/propr/propr/main.nf new file mode 100644 index 00000000000..2cce2af64d3 --- /dev/null +++ b/modules/nf-core/propr/propr/main.nf @@ -0,0 +1,25 @@ +process PROPR_PROPR { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/r-propr:5.0.3': + 'biocontainers/r-propr:5.0.3' }" + + input: + tuple val(meta), path(count) + + output: + tuple val(meta), path("*.propr.rds"), emit: propr + tuple val(meta), path("*.propr.tsv"), emit: matrix + tuple val(meta), path("*.fdr.tsv"), emit: fdr , optional:true + path "*.R_sessionInfo.log", emit: session_info + path "versions.yml", emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + template 'propr.R' +} diff --git a/modules/nf-core/propr/propr/meta.yml b/modules/nf-core/propr/propr/meta.yml new file mode 100644 index 00000000000..0f22fa3d2b7 --- /dev/null +++ b/modules/nf-core/propr/propr/meta.yml @@ -0,0 +1,72 @@ +name: "propr_propr" +description: | + Perform logratio-based correlation analysis -> get proportionality & basis shrinkage partial correlation coefficients. + One can also compute standard correlation coefficients, if required. +keywords: + - coexpression + - correlation + - proportionality + - logratio + - propr + - corpcor + +tools: + - "propr": + description: "Logratio methods for omics data" + homepage: "https://github.com/tpq/propr" + documentation: "https://rdrr.io/cran/propr/man/propr.html" + tool_dev_url: "https://github.com/tpq/propr" + doi: "10.1038/s41598-017-16520-0" + licence: ["GPL-2"] + - "corpcor": + description: "Efficient Estimation of Covariance and (Partial) Correlation" + homepage: "https://cran.r-project.org/web/packages/corpcor/index.html" + documentation: "https://cran.r-project.org/web/packages/corpcor/corpcor.pdf" + doi: "10.2202/1544-6115.1175" + licence: ["GPL >=3"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - count: + type: file + description: | + Count matrix, where rows = variables or genes, columns = samples or cells. + This matrix should not contain zeros. Otherwise, they will be replaced by the minimun number. + It is recommended to handle the zeros beforehand with the method of preference. + pattern: "*.{csv,tsv}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - propr: + type: file + description: R propr object + pattern: "*.propr.rds" + - matrix: + type: file + description: Coefficient matrix + pattern: "*.propr.tsv" + - fdr: + type: file + description: (optional) propr fdr table + pattern: "*.fdr.tsv" + - session_info: + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@suzannejin" diff --git a/modules/nf-core/propr/propr/templates/propr.R b/modules/nf-core/propr/propr/templates/propr.R new file mode 100644 index 00000000000..a4afaea0ff9 --- /dev/null +++ b/modules/nf-core/propr/propr/templates/propr.R @@ -0,0 +1,308 @@ +#!/usr/bin/env Rscript + + +################################################ +################################################ +## Functions ## +################################################ +################################################ + +#' Parse out options from a string without recourse to optparse +#' +#' @param x Long-form argument list like --opt1 val1 --opt2 val2 +#' +#' @return named list of options and values similar to optparse + +parse_args <- function(x){ + args_list <- unlist(strsplit(x, ' ?--')[[1]])[-1] + args_vals <- lapply(args_list, function(x) scan(text=x, what='character', quiet = TRUE)) + + # Ensure the option vectors are length 2 (key/ value) to catch empty ones + args_vals <- lapply(args_vals, function(z){ length(z) <- 2; z}) + + parsed_args <- structure(lapply(args_vals, function(x) x[2]), names = lapply(args_vals, function(x) x[1])) + parsed_args[! is.na(parsed_args)] +} + +#' Flexibly read CSV or TSV files +#' +#' @param file Input file +#' @param header Boolean. TRUE if first row is header. False without header. +#' @param row.names The first column is used as row names by default. +#' Otherwise, give another number. Or use NULL when no row.names are present. +#' +#' @return output Data frame +read_delim_flexible <- function(file, header = TRUE, row.names = 1, check.names = TRUE){ + + ext <- tolower(tail(strsplit(basename(file), split = "\\\\.")[[1]], 1)) + + if (ext == "tsv" || ext == "txt") { + separator <- "\\t" + } else if (ext == "csv") { + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( + file, + sep = separator, + header = header, + row.names = row.names, + check.names = check.names + ) + + if ( (row.names == 'gene_id') & ('gene_name' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_name')] + } else if ( (row.names == 'gene_name') & ('gene_id' %in% colnames(mat)) ){ + mat <- mat[, -which(colnames(mat) == 'gene_id')] + } + + return(mat) +} + +#' Check if a variable can be numeric or not +#' +#' @param x Input variable +#' @return True if it can be numeric, False otherwise +can_be_numeric <- function(x) { + stopifnot(is.atomic(x) || is.list(x)) # check if x is a vector + numNAs <- sum(is.na(x)) + numNAs_new <- suppressWarnings(sum(is.na(as.numeric(x)))) + return(numNAs_new == numNAs) +} + +#' Set the proper reference gene index. +#' This should be used for alr transformation only. +#' +#' @param ivar Reference variable given by user. +#' If it is 'null', then set the last column as reference (default). +#' Otherwise, it should refer to either gene name or gene index. +#' If the gene name is given, find its index. +#' @param mat Data matrix, with genes as columns +#' +#' @return The reference gene index +set_reference <- function(ivar, mat){ + if (is.na(ivar)){ + ivar <- ncol(mat) + } else { + isnumeric <- can_be_numeric(ivar) + if (!isnumeric){ + genes <- colnames(mat) + ivar <- which(genes == ivar) + } + ivar <- as.integer(ivar) + } + return(ivar) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +opt <- list( + count = '$count', + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + transformation = 'clr', + reference = NA, + alpha = NA, + metric = 'pcor.bshrink', + permutation = 0, + cutoff_min = NA, + cutoff_max = NA, + cutoff_interval = NA, + ncores = as.integer('$task.cpus'), + features_id_col = 'gene_id', + fixseed = FALSE +) +opt_types <- list( + count = 'character', + prefix = 'character', + transformation = 'character', + reference = 'character', + alpha = 'numeric', + metric = 'character', + permutation = 'numeric', + cutoff_min = 'numeric', + cutoff_max = 'numeric', + cutoff_interval = 'numeric', + ncores = 'numeric', + features_id_col = 'character', + fixseed = 'logical' +) + +# Apply parameter overrides +args_opt <- parse_args('$task.ext.args') +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + if (! is.null(opt[[ao]])){ + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + } + # set NA + if (args_opt[[ao]] %in% c('NA', NA, 'null')){ + args_opt[[ao]] <- NA + } + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided +required_opts <- c('count') +missing <- required_opts[unlist(lapply(opt[required_opts], is.null)) | ! required_opts %in% names(opt)] +if (length(missing) > 0){ + stop(paste("Missing required options:", paste(missing, collapse=', '))) +} + +# Check file inputs are valid +for (file_input in c('count')){ + if (is.null(opt[[file_input]])) { + stop(paste("Please provide", file_input), call. = FALSE) + } + if (! file.exists(opt[[file_input]])){ + stop(paste0('Value of ', file_input, ': ', opt[[file_input]], ' is not a valid file')) + } +} + +# check parameters +if (!opt\$metric %in% c('rho', 'phi', 'phs', 'cor', 'vlr', 'pcor', 'pcor.shrink', 'pcor.bshrink')) { + stop('Please make sure you provided the correct metric') +} +if (opt\$metric == 'pcor.bshrink'){ + if (!is.na(opt\$alpha)) stop('Box-cox transformation is not implemented for pcor.bshrink yet.') + if (!opt\$transformation %in% c('clr', 'alr')) stop('Please make sure you provided the correct transformation: clr or alr') +} else { + if (!opt\$transformation %in% c('clr', 'alr', NA)) stop('Please make sure you provided the correct transformation: clr or alr. Or set NA if you dont want to transform the data.') + if (is.na(opt\$transformation)) print('Warning: No transformation is required by user. We assume the input count data was already properly transformed.') +} + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(corpcor) +library(propr) + +################################################ +################################################ +## Perform correlation analysis ## +################################################ +################################################ + +# read matrix +mat <- read_delim_flexible( + opt\$count, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +mat <- t(mat) + +# check zeros +# log transformation should be applied on non-zero data +# otherwise Inf values are generated +if (any(mat == 0)) print("Warning: Zeros will be replaced by minimun value before logratio analysis") + +# set logratio transformation parameter -> ivar +# if alr, set the index of the reference gene as ivar +# if clr or NA, set same ivar +if (opt\$metric == 'pcor.bshrink'){ + opt\$ivar <- opt\$transformation +}else{ + if (opt\$transformation == 'alr'){ + opt\$ivar <- set_reference(opt\$reference, mat) + gene_name <- colnames(mat)[opt\$ivar] + } else { + opt\$ivar <- opt\$transformation + } +} + +# Compute correlation coefficients +pro <- propr( + mat, + metric = opt\$metric, + ivar = opt\$ivar, + alpha = opt\$alpha, + p = opt\$permutation, + fixseed = opt\$fixseed +) + +# update FDR by permutation, if required +if (opt\$permutation > 0) { + cutoff <- seq( + opt\$cutoff_min, + opt\$cutoff_max, + opt\$cutoff_interval + ) + pro <- updateCutoffs(pro, cutoff=cutoff, ncores=opt\$ncores) +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +saveRDS( + pro, + file = paste0(opt\$prefix, '.propr.rds') +) + +write.table( + round(pro@matrix, 8), # round matrix decimals to avoid floating point inconsistencies + file = paste0(opt\$prefix, '.propr.tsv'), + col.names = TRUE, + row.names = TRUE, + sep = '\t', + quote = FALSE +) + +if (opt\$permutation > 0) { + write.table( + pro@fdr, + file = paste0(opt\$prefix, '.fdr.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\t', + quote = FALSE + ) +} + +################################################ +################################################ +## R SESSION INFO ## +################################################ +################################################ + +sink(paste0(opt\$prefix, ".R_sessionInfo.log")) +print(sessionInfo()) +sink() + +################################################ +################################################ +## VERSIONS FILE ## +################################################ +################################################ + +r.version <- strsplit(version[['version.string']], ' ')[[1]][3] +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-base:', r.version), + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config new file mode 100644 index 00000000000..c0c3b211e0d --- /dev/null +++ b/modules/nf-core/propr/propr/tests/alr_pcorbshrink.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation alr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcor.config b/modules/nf-core/propr/propr/tests/clr_pcor.config new file mode 100644 index 00000000000..2e6d1b19db6 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_pcor.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric pcor --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config b/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config new file mode 100644 index 00000000000..435440c810e --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_pcorbshrink.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric pcor.bshrink --permutation 10 --cutoff_min 0.001 --cutoff_max 0.01 --cutoff_interval 0.001 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho.config b/modules/nf-core/propr/propr/tests/clr_rho.config new file mode 100644 index 00000000000..6b32ac273ae --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_rho.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation clr --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/clr_rho_alpha.config b/modules/nf-core/propr/propr/tests/clr_rho_alpha.config new file mode 100644 index 00000000000..7f151a801d9 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/clr_rho_alpha.config @@ -0,0 +1,3 @@ +process { + ext.args = {"--transformation alr --alpha 0.2 --metric rho --permutation 10 --cutoff_min 0.05 --cutoff_max 0.95 --cutoff_interval 0.1 --fixseed true"} +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/main.nf.test b/modules/nf-core/propr/propr/tests/main.nf.test new file mode 100644 index 00000000000..b56e233f164 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/main.nf.test @@ -0,0 +1,163 @@ +nextflow_process { + + name "Test Process PROPR_PROPR" + script "../main.nf" + process "PROPR_PROPR" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/propr" + + test("Test propr/propr using default options") { + + tag "default" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr using default options - matrix") }, + { assert snapshot(process.out.versions).match("versions") } + ) + } + } + + test("Test propr/propr while running clr+pcor.bshrink explicitly") { + + tag "clr_pcorbshrink" + config "./clr_pcorbshrink.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor.bshrink explicitly - matrix")}, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor.bshrink explicitly - fdr")} + ) + } + } + + test("Test propr/propr while running alr+pcor.bshrink") { + + tag "alr_pcorbshrink" + config "./alr_pcorbshrink.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + // TODO also check that the first columns are the same as the above processes + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running alr+pcor.bshrink - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running alr+pcor.bshrink - fdr") } + ) + } + } + + test("Test propr/propr while running clr+rho") { + + tag "clr_rho" + config "./clr_rho.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho - fdr") } + ) + } + } + + test("Test propr/propr while running clr+pcor") { + + tag "clr_pcor" + config "./clr_pcor.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+pcor - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+pcor - fdr") } + ) + } + } + + test("Test propr/propr while running clr+rho with boxcox transformation") { + + tag "clr_rho_alpha" + config "./clr_rho_alpha.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], + file(params.test_data['mus_musculus']['genome']['rnaseq_matrix'], checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out.matrix).match("Test propr/propr while running clr+rho with boxcox transformation - matrix") }, + { assert snapshot(process.out.fdr).match("Test propr/propr while running clr+rho with boxcox transformation - fdr") } + ) + } + } + + +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/main.nf.test.snap b/modules/nf-core/propr/propr/tests/main.nf.test.snap new file mode 100644 index 00000000000..fc4bab2676b --- /dev/null +++ b/modules/nf-core/propr/propr/tests/main.nf.test.snap @@ -0,0 +1,153 @@ +{ + "Test propr/propr while running clr+pcor - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,5bd6a9c2d5899dedfec8ebfbabeb532e" + ] + ] + ], + "timestamp": "2024-02-08T17:26:29.208872" + }, + "Test propr/propr while running alr+pcor.bshrink - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,e2cbc066fa7635e9ea4ec198987d11d0" + ] + ] + ], + "timestamp": "2024-02-08T17:25:50.245558" + }, + "Test propr/propr while running clr+rho - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,32be6cc96d2d5563f779d2eec9c7ed34" + ] + ] + ], + "timestamp": "2024-02-08T17:26:07.762495" + }, + "Test propr/propr while running clr+rho - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,53865e6c2b05e022277df6dc1188c461" + ] + ] + ], + "timestamp": "2024-02-08T17:26:07.42551" + }, + "Test propr/propr while running clr+pcor - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,c0147540e44c63a439c28d24315bbc83" + ] + ] + ], + "timestamp": "2024-02-08T17:26:29.63825" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,41b77e268a30b7f345e225da7725ca72" + ] + ], + "timestamp": "2024-02-08T17:24:43.680647" + }, + "Test propr/propr while running alr+pcor.bshrink - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,d446cc30af27643df8555b2924e3c0a1" + ] + ] + ], + "timestamp": "2024-02-08T17:25:50.75822" + }, + "Test propr/propr using default options - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" + ] + ] + ], + "timestamp": "2024-02-08T17:24:43.376746" + }, + "Test propr/propr while running clr+rho with boxcox transformation - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,a0fc0d01dddb4bd285306766eefeff67" + ] + ] + ], + "timestamp": "2024-02-08T17:26:45.807815" + }, + "Test propr/propr while running clr+rho with boxcox transformation - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,e30643e340aa88e3acd4c181f9e4ba81" + ] + ] + ], + "timestamp": "2024-02-08T17:26:44.864893" + }, + "Test propr/propr while running clr+pcor.bshrink explicitly - matrix": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.propr.tsv:md5,1aed2bed28b3f6cff481065f535e6d24" + ] + ] + ], + "timestamp": "2024-02-08T17:25:15.746961" + }, + "Test propr/propr while running clr+pcor.bshrink explicitly - fdr": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.fdr.tsv:md5,dc9e6f135064363c503e83105a9c9b69" + ] + ] + ], + "timestamp": "2024-02-08T17:25:16.230468" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propr/tests/tags.yml b/modules/nf-core/propr/propr/tests/tags.yml new file mode 100644 index 00000000000..539706d46e1 --- /dev/null +++ b/modules/nf-core/propr/propr/tests/tags.yml @@ -0,0 +1,2 @@ +propr/propr: + - "modules/nf-core/propr/propr/**"