diff --git a/CHANGELOG.md b/CHANGELOG.md index 208a5d02..f5ddba47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [[#431](https://github.com/nf-core/differentialabundance/pull/431)] - Add differential and functional subworkflows. ([@suzannejin](https://github.com/suzannejin), co-authored by [@bjlang](https://github.com/bjlang) and [@caraiz2001](https://github.com/caraiz2001), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#421](https://github.com/nf-core/differentialabundance/pull/421)] - Add immunedeconv module ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#380](https://github.com/nf-core/differentialabundance/pull/380)] - Replace local filter_diff_table module with nf-core one, and create nf-tests for tabular_to_gsea_chip. ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#358](https://github.com/nf-core/differentialabundance/pull/358)] - Added software version check in nf-tests and gene biotype column check in `.Rmd` ([@atrigila](https://github.com/atrigila), review by [@pinin4fjords](https://github.com/pinin4fjords)) @@ -32,6 +33,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [[#431](https://github.com/nf-core/differentialabundance/pull/431)] - Replace the calls to differential and functional analysis modules by subworkflows. ([@suzannejin](https://github.com/suzannejin), review by [@pinin4fjords](https://github.com/pinin4fjords)) - [[#410](https://github.com/nf-core/differentialabundance/pull/410)] - Update contrasts file format to allow yaml ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)). - [[#374](https://github.com/nf-core/differentialabundance/pull/374)] - Update all modules and subworkflows ([@nschcolnicov](https://github.com/nschcolnicov), review by [@pinin4fjords](https://github.com/pinin4fjords)). - [[#348](https://github.com/nf-core/differentialabundance/pull/348)] - Update test_full profile matrix file and indentation of profiles in nextflow.config ([@nschcolnicov](https://github.com/nschcolnicov), review by [@WackerO](https://github.com/WackerO) and [@pinin4fjords](https://github.com/pinin4fjords)) diff --git a/assets/differentialabundance_report.Rmd b/assets/differentialabundance_report.Rmd index 3eb3379e..dc9283b5 100644 --- a/assets/differentialabundance_report.Rmd +++ b/assets/differentialabundance_report.Rmd @@ -367,7 +367,10 @@ if (is.null(differential_file_suffix)) { differential_file_suffix <- ifelse(params$study_type %in% c('rnaseq'), ".deseq2.results.tsv", ".limma.results.tsv") } differential_files <- lapply(contrasts$id, function(d){ - file.path(params$input_dir, paste0(gsub(' |;', '_', d), differential_file_suffix)) + file.path(params$input_dir, paste0(gsub(' |;', '_', d), '_', params$study_name, differential_file_suffix)) +}) +differential_names <- lapply(contrasts$id, function(d){ + paste0(gsub(' |;', '_', d), '_', params$study_name) }) # Initialize vector to store warning messages before merging tables @@ -428,7 +431,7 @@ results <- lapply(differential_files, function(diff_file) { differential_results <- lapply(results, `[[`, "diff_features") warnings_list <- unlist(lapply(results, `[[`, "warnings")) -names(differential_results) <- contrasts$id +names(differential_results) <- differential_names ``` @@ -978,8 +981,8 @@ if (any(unlist(params[paste0(possible_gene_set_methods, '_run')]))){ gmt_name <- basename(tools::file_path_sans_ext(gmt_file)) cat("\n##### ", gmt_name ," {.tabset}\n") - reference_gsea_tables <- paste0(contrasts$id, ".", gmt_name, '.gsea_report_for_', contrasts$reference, '.tsv') - target_gsea_tables <- paste0(contrasts$id, ".", gmt_name, '.gsea_report_for_', contrasts$target, '.tsv') + reference_gsea_tables <- paste0(differential_names, ".", gmt_name, '.gsea_report_for_', contrasts$reference, '.tsv') + target_gsea_tables <- paste0(differential_names, ".", gmt_name, '.gsea_report_for_', contrasts$target, '.tsv') for (i in 1:nrow(contrasts)){ cat("\n###### ", contrast_descriptions[i], "\n") target_gsea_results <- read_metadata(target_gsea_tables[i])[,c(-2,-3)] @@ -997,23 +1000,23 @@ if (any(unlist(params[paste0(possible_gene_set_methods, '_run')]))){ ifelse(params$gprofiler2_significant, paste0(" Enrichment was only considered if significant, i.e. adjusted p-value <= ", params$gprofiler2_max_qval, "."), "Enrichment was also considered if not significant."), "\n")) # Make sure to grab only non-empty files - for (i in 1:nrow(contrasts)) { - cat(paste0("\n##### ", contrasts$id[i], "\n")) - - table <- paste0(contrasts$id[i], ".gprofiler2.all_enriched_pathways.tsv") - table_path <- file.path(params$input_dir, table) - if (!file.exists(table_path) || file.size(table_path) == 0){ - cat(paste0("No ", ifelse(params$gprofiler2_significant, "significantly", ""), " enriched pathways were found for this contrast.")) - } else { - all_enriched <- read.table(table_path, header=T, sep="\t", quote="\"") - all_enriched <- data.frame("Pathway name" = all_enriched$term_name, "Pathway code" = all_enriched$term_id, - "Differential features" = all_enriched$intersection_size, "Pathway size" = all_enriched$term_size, - "Differential fraction" = (all_enriched$intersection_size/all_enriched$term_size), - "Adjusted p value" = all_enriched$p_value, check.names = FALSE) - all_enriched <- round_dataframe_columns(all_enriched, digits=params$report_round_digits) - print(htmltools::tagList(datatable(all_enriched, caption = paste('Enriched pathways in', contrasts$id[i], " (check", table, "for more detail)"), rownames = FALSE))) - } - cat("\n") + for (name in differential_names) { + cat(paste0("\n##### ", name, "\n")) + + table <- paste0(name, ".gprofiler2.all_enriched_pathways.tsv") + table_path <- file.path(params$input_dir, table) + if (!file.exists(table_path) || file.size(table_path) == 0){ + cat(paste0("No ", ifelse(params$gprofiler2_significant, "significantly", ""), " enriched pathways were found for this contrast.")) + } else { + all_enriched <- read.table(table_path, header=T, sep="\t", quote="\"") + all_enriched <- data.frame("Pathway name" = all_enriched$term_name, "Pathway code" = all_enriched$term_id, + "Differential features" = all_enriched$intersection_size, "Pathway size" = all_enriched$term_size, + "Differential fraction" = (all_enriched$intersection_size/all_enriched$term_size), + "Adjusted p value" = all_enriched$p_value, check.names = FALSE) + all_enriched <- round_dataframe_columns(all_enriched, digits=params$report_round_digits) + print(htmltools::tagList(datatable(all_enriched, caption = paste('Enriched pathways in', name, " (check", table, "for more detail)"), rownames = FALSE))) + } + cat("\n") } } } diff --git a/conf/modules.config b/conf/modules.config index fe083970..9df3563b 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -187,8 +187,7 @@ process { "--vst_nsub $params.deseq2_vst_nsub", "--shrink_lfc $params.deseq2_shrink_lfc", "--cores $params.deseq2_cores", - "--subset_to_contrast_samples $params.differential_subset_to_contrast_samples", - ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), + ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), // TODO check what is the impact of blocking for NORM ].join(' ').trim() } } @@ -238,6 +237,37 @@ process { ].join(' ').trim() } } + withName: LIMMA_NORM { + ext.prefix = 'all' + publishDir = [ + [ + path: { "${params.outdir}/tables/processed_abundance" }, + mode: params.publish_dir_mode, + pattern: '*.{normalised_counts}.tsv' + ], + ] + ext.when = params.limma_use_voom + ext.args = { [ + "--probe_id_col \"${params.features_id_col}\"", + "--sample_id_col \"${params.observations_id_col}\"", + "--ndups \"${params.limma_ndups}\"", + "--spacing \"${params.limma_spacing}\"", + "--block \"${params.limma_block}\"", + "--correlation ${params.limma_correlation}", + "--method \"${params.limma_method}\"", + "--proportion ${params.limma_proportion}", + "--stdev.coef.lim \"${params.limma_stdev_coef_lim}\"", + "--trend ${params.limma_trend}", + "--robust ${params.limma_robust}", + "--winsor.tail.p \"${params.limma_winsor_tail_p}\"", + "--p.value ${params.limma_p_value}", + "--lfc ${params.limma_lfc}", + "--confint ${params.limma_confint}", + "--use_voom \"${params.limma_use_voom}\"", + ((meta.blocking == null) ? '' : "--blocking_variables $meta.blocking"), + ].join(' ').trim() } + } + withName: LIMMA_DIFFERENTIAL { ext.prefix = { "${meta.id}" } publishDir = [ @@ -494,7 +524,7 @@ process { ] } - withName: 'TABULAR_TO_GSEA_CHIP' { + withName: 'CUSTOM_TABULARTOGSEACHIP' { publishDir = [ enabled: false ] diff --git a/modules.json b/modules.json index c28c3c5a..40885b27 100644 --- a/modules.json +++ b/modules.json @@ -17,23 +17,28 @@ }, "custom/filterdifferentialtable": { "branch": "master", - "git_sha": "833a65446ea117d092d4940f098236b6766e7aac", - "installed_by": ["modules"] + "git_sha": "045f0fbb65edaff2ca5002754dfa767d93551c66", + "installed_by": ["abundance_differential_filter", "modules"] }, "custom/matrixfilter": { "branch": "master", "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", "installed_by": ["modules"] }, + "custom/tabulartogseachip": { + "branch": "master", + "git_sha": "7900e49fb84969a2479ecfbeef7bcbe296513c90", + "installed_by": ["differential_functional_enrichment"] + }, "custom/tabulartogseacls": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "git_sha": "c835e1647a2e16237ae9d1db3d27351297f290c5", + "installed_by": ["differential_functional_enrichment", "modules"] }, "custom/tabulartogseagct": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "git_sha": "c835e1647a2e16237ae9d1db3d27351297f290c5", + "installed_by": ["differential_functional_enrichment", "modules"] }, "deseq2/differential": { "branch": "master", @@ -47,13 +52,13 @@ }, "gprofiler2/gost": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", + "installed_by": ["differential_functional_enrichment", "modules"] }, "gsea/gsea": { "branch": "master", - "git_sha": "666652151335353eef2fcd58880bcef5bc2928e1", - "installed_by": ["modules"] + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", + "installed_by": ["differential_functional_enrichment", "modules"] }, "gunzip": { "branch": "master", @@ -67,8 +72,18 @@ }, "limma/differential": { "branch": "master", - "git_sha": "136f443c0a6d5c526410c7c9b73ce51ef457c341", - "installed_by": ["modules"] + "git_sha": "784b3a38aeafe9bb7e38f1369704dd5e6bcaf9f0", + "installed_by": ["abundance_differential_filter", "modules"] + }, + "propr/grea": { + "branch": "master", + "git_sha": "138b2c45dde12b2075d6fe15a5d374b48d166d4a", + "installed_by": ["differential_functional_enrichment"] + }, + "propr/propd": { + "branch": "master", + "git_sha": "0e9cb409c32d3ec4f0d3804588e4778971c09b7e", + "installed_by": ["abundance_differential_filter"] }, "proteus/readproteingroups": { "branch": "master", @@ -114,6 +129,16 @@ }, "subworkflows": { "nf-core": { + "abundance_differential_filter": { + "branch": "master", + "git_sha": "2b977a47af8a319f6ef6e7b918e7bb64babbaa04", + "installed_by": ["subworkflows"] + }, + "differential_functional_enrichment": { + "branch": "master", + "git_sha": "6506b7bc2a369f0c21dc4fbc5e8d2af6c3e1a90b", + "installed_by": ["subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "c2b22d85f30a706a3073387f30380704fcae013b", diff --git a/modules/local/tabulartogseachip/main.nf b/modules/local/tabulartogseachip/main.nf deleted file mode 100644 index 314a2e70..00000000 --- a/modules/local/tabulartogseachip/main.nf +++ /dev/null @@ -1,54 +0,0 @@ -process TABULAR_TO_GSEA_CHIP { - - tag "$id" - label 'process_single' - - conda "${moduleDir}/environment.yml" - container "community.wave.seqera.io/library/gawk:5.1.0--fa97c4ccf4cfbc4b" - - input: - path tsv - tuple val(id), val(symbol) - - output: - path "*.chip" , emit: chip - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def VERSION = '9.1' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - """ - function find_column_number { - file=\$1 - column=\$2 - - head -n 1 \$file | tr '\\t' '\\n' | grep -n "^\${column}\$" | awk -F':' '{print \$1}' - } - - id_col=\$(find_column_number $tsv $id) - symbol_col=\$(find_column_number $tsv $symbol) - outfile=\$(echo $tsv | sed 's/\\(.*\\)\\..*/\\1/').chip - - echo -e "Probe Set ID\\tGene Symbol\\tGene Title" > \${outfile}.tmp - tail -n +2 $tsv | awk -F'\\t' -v id=\$id_col -v symbol=\$symbol_col '{print \$id"\\t"\$symbol"\\tNA"}' >> \${outfile}.tmp - mv \${outfile}.tmp \${outfile} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) - END_VERSIONS - """ - - stub: - """ - touch stub.chip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) - END_VERSIONS - """ - -} diff --git a/modules/local/tabulartogseachip/meta.yml b/modules/local/tabulartogseachip/meta.yml deleted file mode 100644 index aa9d7d93..00000000 --- a/modules/local/tabulartogseachip/meta.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: tabular_to_gsea_chip -description: Convert tabular data into GSEA-compatible CHIP files. -keywords: - - GSEA - - CHIP - - Bioinformatics -tools: - - gawk: - description: | - GNU Awk (gawk) is a powerful programming language designed for text processing and typically used as a data extraction and reporting tool. - It is used here to manipulate tabular data and create the CHIP file format. - homepage: https://www.gnu.org/software/gawk/ - documentation: https://www.gnu.org/software/gawk/manual/ - licence: ["GPL-3.0-or-later"] -input: - - tsv: - type: file - description: | - Tab-separated values (TSV) file containing data to be converted into a CHIP file. - - - id: - type: string - description: | - Feature ID attribute in the abundance table as well as in the GTF file (e.g. the gene_id field). - - symbol: - type: string - description: | - Feature name attribute in the abundance table as well as in the GTF file (e.g. the gene symbol field). -output: - - chip: - type: file - description: Generated GSEA-compatible CHIP file. - pattern: "*.chip" - - versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@pinin4fjords" # Replace with actual author handles -maintainers: - - "@nschcolnicov" diff --git a/modules/local/tabulartogseachip/tests/main.nf.test b/modules/local/tabulartogseachip/tests/main.nf.test deleted file mode 100644 index e6c5321b..00000000 --- a/modules/local/tabulartogseachip/tests/main.nf.test +++ /dev/null @@ -1,49 +0,0 @@ -nextflow_process { - - name "Test Process TABULAR_TO_GSEA_CHIP" - script "../main.nf" - process "TABULAR_TO_GSEA_CHIP" - tag "modules" - tag "modules_nfcore" - tag "tabular_to_gsea_chip" - - test("test_tabular_to_gsea_chip") { - - when { - process { - """ - input[0] = Channel.fromPath("https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/differentialabundance/modules_testdata/Mus_musculus.anno.feature_metadata.tsv") - input[1] = ["gene_id", "gene_name"] - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() }, - ) - } - } - - test("test_tabular_to_gsea_chip - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.fromPath("https://raw.githubusercontent.com/nf-core/test-datasets/refs/heads/differentialabundance/modules_testdata/Mus_musculus.anno.feature_metadata.tsv") - input[1] = ["gene_id", "gene_name"] - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() }, - ) - } - } -} diff --git a/modules/local/tabulartogseachip/tests/main.nf.test.snap b/modules/local/tabulartogseachip/tests/main.nf.test.snap deleted file mode 100644 index 29d017ed..00000000 --- a/modules/local/tabulartogseachip/tests/main.nf.test.snap +++ /dev/null @@ -1,48 +0,0 @@ -{ - "test_tabular_to_gsea_chip - stub": { - "content": [ - { - "0": [ - "stub.chip:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - "1": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ], - "chip": [ - "stub.chip:md5,d41d8cd98f00b204e9800998ecf8427e" - ], - "versions": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" - }, - "timestamp": "2024-12-06T21:03:06.781994447" - }, - "test_tabular_to_gsea_chip": { - "content": [ - { - "0": [ - "Mus_musculus.anno.feature_metadata.chip:md5,5abf60bb982bb2ff5b8b3e37f14a21e4" - ], - "1": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ], - "chip": [ - "Mus_musculus.anno.feature_metadata.chip:md5,5abf60bb982bb2ff5b8b3e37f14a21e4" - ], - "versions": [ - "versions.yml:md5,a422b1a01e86be433a25d1776d497f5a" - ] - } - ], - "meta": { - "nf-test": "0.9.0", - "nextflow": "24.10.2" - }, - "timestamp": "2024-12-06T21:02:58.608468636" - } -} \ No newline at end of file diff --git a/modules/nf-core/custom/filterdifferentialtable/main.nf b/modules/nf-core/custom/filterdifferentialtable/main.nf index 6ee226f0..8f5fc778 100644 --- a/modules/nf-core/custom/filterdifferentialtable/main.nf +++ b/modules/nf-core/custom/filterdifferentialtable/main.nf @@ -9,10 +9,8 @@ process CUSTOM_FILTERDIFFERENTIALTABLE { input: tuple val(meta), path(input_file) - val(logFC_column) - val(FC_threshold) - val(padj_column) - val(padj_threshold) + tuple val(logfc_column), val(fc_threshold), val(fc_cardinality) + tuple val(stat_column), val(stat_threshold), val(stat_cardinality) output: tuple val(meta), path("*_filtered.tsv"), emit: filtered @@ -41,14 +39,27 @@ process CUSTOM_FILTERDIFFERENTIALTABLE { table = pd.read_csv("${input_file}", sep=sep) # Calculate log2 fold change threshold - logFC_threshold = log2(float("${FC_threshold}")) + logfc_threshold = log2(float("${fc_threshold}")) + + # define evaluation + def evaluate_condition(x, threshold, cardinality): + if cardinality == ">=": + return x >= threshold + elif cardinality == "<=": + return x <= threshold + elif cardinality == ">": + return x > threshold + elif cardinality == "<": + return x < threshold + else: + raise ValueError(f"Invalid cardinality: {cardinality}") # Apply filters mask = ( - table["${logFC_column}"].notna() & - table["${padj_column}"].notna() & - (table["${logFC_column}"].abs() >= logFC_threshold) & - (table["${padj_column}"] <= float("${padj_threshold}")) + table["${logfc_column}"].notna() & + table["${stat_column}"].notna() & + table["${logfc_column}"].abs().apply(lambda x: evaluate_condition(x, logfc_threshold, "${fc_cardinality}")) & + table["${stat_column}"].apply(lambda x: evaluate_condition(x, float("${stat_threshold}"), "${stat_cardinality}")) ) filtered_table = table[mask] diff --git a/modules/nf-core/custom/filterdifferentialtable/meta.yml b/modules/nf-core/custom/filterdifferentialtable/meta.yml index 236eae1f..4f3402a4 100644 --- a/modules/nf-core/custom/filterdifferentialtable/meta.yml +++ b/modules/nf-core/custom/filterdifferentialtable/meta.yml @@ -4,6 +4,7 @@ keywords: - filter - differential expression - logFC + - significance statistic - p-value tools: - "pandas": @@ -26,18 +27,30 @@ input: type: file description: Input differential expression table (CSV, TSV, or TXT format) pattern: "*.{csv,tsv,txt}" - - - logFC_column: + - - logfc_column: type: string description: Name of the column containing log fold change values - - - FC_threshold: + - fc_threshold: type: float description: Fold change threshold for filtering - - - padj_column: + - fc_cardinality: type: string - description: Name of the column containing adjusted p-values - - - padj_threshold: + description: | + Operator to compare the fold change values with the threshold. + Valid values are: ">=", "<=", ">", "<". + - - stat_column: + type: string + description: | + Name of the column containing the significance statistic values + (eg. adjusted p-values). + - stat_threshold: type: float - description: Adjusted p-value threshold for filtering + description: Statistic threshold for filtering + - stat_cardinality: + type: string + description: | + Operator to compare the column values with the threshold. + Valid values are: ">=", "<=", ">", "<". output: - filtered: - meta: diff --git a/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test b/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test index 42ef28e6..b478b38b 100644 --- a/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test +++ b/modules/nf-core/custom/filterdifferentialtable/tests/main.nf.test @@ -15,10 +15,8 @@ nextflow_process { process { """ input[0] = [ [ id:'test' ], file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.deseq2.results.tsv", checkIfExists: true) ] - input[1] = 'log2FoldChange' - input[2] = 2 - input[3] = 'padj' - input[4] = 0.05 + input[1] = Channel.of(['log2FoldChange', 2, '>=']) + input[2] = Channel.of(['padj', 0.05, '<=']) """ } } diff --git a/modules/local/tabulartogseachip/environment.yml b/modules/nf-core/custom/tabulartogseachip/environment.yml similarity index 63% rename from modules/local/tabulartogseachip/environment.yml rename to modules/nf-core/custom/tabulartogseachip/environment.yml index a6e8e310..cc49deff 100644 --- a/modules/local/tabulartogseachip/environment.yml +++ b/modules/nf-core/custom/tabulartogseachip/environment.yml @@ -1,6 +1,5 @@ channels: - conda-forge - bioconda - dependencies: - - conda-forge::gawk=5.1.0 + - "conda-forge::gawk=5.1.0" diff --git a/modules/nf-core/custom/tabulartogseachip/main.nf b/modules/nf-core/custom/tabulartogseachip/main.nf new file mode 100644 index 00000000..c0622cda --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/main.nf @@ -0,0 +1,56 @@ +process CUSTOM_TABULARTOGSEACHIP { + + label 'process_single' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/gawk:5.1.0' : + 'biocontainers/gawk:5.1.0' }" + + input: + tuple val(meta), path(tabular) + tuple val(id) , val(symbol) + + output: + tuple val(meta), path("*.chip"), emit: chip + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + function find_column_number { + file=\$1 + column=\$2 + + head -n 1 \$file | tr '\\t' '\\n' | grep -n "^\${column}\$" | awk -F':' '{print \$1}' + } + + id_col=\$(find_column_number $tabular $id) + symbol_col=\$(find_column_number $tabular $symbol) + outfile=${prefix}.chip + + echo -e "Probe Set ID\\tGene Symbol\\tGene Title" > \${outfile}.tmp + tail -n +2 $tabular | awk -F'\\t' -v id=\$id_col -v symbol=\$symbol_col '{print \$id"\\t"\$symbol"\\tNA"}' >> \${outfile}.tmp + mv \${outfile}.tmp \${outfile} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + outfile=${prefix}.chip + touch \$outfile + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gawk: \$(echo \$(gawk --version 2>&1) | sed 's/^.*GNU Awk //; s/, .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/custom/tabulartogseachip/meta.yml b/modules/nf-core/custom/tabulartogseachip/meta.yml new file mode 100644 index 00000000..5759874c --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/meta.yml @@ -0,0 +1,53 @@ +name: "custom_tabulartogseachip" +description: Make a GSEA class file (.chip) from tabular inputs +keywords: + - gsea + - chip + - convert + - tabular +tools: + - custom: + description: "Make a GSEA annotation file (.chip) from tabular inputs" + tool_dev_url: "https://github.com/nf-core/modules/blob/master/modules/nf-core/custom/tabulartogseachip/main.nf" + identifier: "" +input: + - - meta: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - tabular: + type: file + description: | + Tabular (NOTE that for the moment it only works for TSV file) containing a column with the + features ids, and another column with the features symbols. + pattern: "*.{tsv}" + - - id: + type: string + description: The name of the column containing feature ids + - symbol: + type: string + description: The name of the column containing feature symbols +output: + - chip: + - meta: + type: map + description: Groovy Map containing metadata e.g. [ id:'test', ... ] + - "*.chip": + type: file + description: | + A categorical class format file (.chip) as defined by the Broad + documentation at + https://software.broadinstitute.org/cancer/software/gsea/wiki/index.php/Data_formats + pattern: "*.chip" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@pinin4fjords" + - "@suzannejin" +maintainers: + - "@pinin4fjords" diff --git a/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test new file mode 100644 index 00000000..6c2025a1 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test @@ -0,0 +1,68 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEACHIP" + script "../main.nf" + process "CUSTOM_TABULARTOGSEACHIP" + + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "custom/tabulartogseachip" + + test("test tsv to chip") { + + when { + process { + """ + input[0] = Channel + .fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + .map { it -> [ + [id:it.baseName], it + ]} + input[1] = Channel.of(['gene_id', 'gene_name']) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.chip, + process.out.versions + ).match() } + ) + } + + } + + test("test tsv to chip - stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel + .fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + .map { it -> [ + [id:it.baseName], it + ]} + input[1] = Channel.of(['gene_id', 'gene_name']) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.chip, + process.out.versions + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap new file mode 100644 index 00000000..bb66d232 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseachip/tests/main.nf.test.snap @@ -0,0 +1,42 @@ +{ + "test tsv to chip": { + "content": [ + [ + [ + { + "id": "SRP254919.salmon.merged.gene_counts.top1000cov" + }, + "SRP254919.salmon.merged.gene_counts.top1000cov.chip:md5,2ab8a685c675ce2fb97142526766044a" + ] + ], + [ + "versions.yml:md5,61dab2d2b9aa1333c4c3bfd7bd893ce5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-16T18:05:22.341224384" + }, + "test tsv to chip - stub": { + "content": [ + [ + [ + { + "id": "SRP254919.salmon.merged.gene_counts.top1000cov" + }, + "SRP254919.salmon.merged.gene_counts.top1000cov.chip:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + "versions.yml:md5,61dab2d2b9aa1333c4c3bfd7bd893ce5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-17T13:14:53.792845507" + } +} diff --git a/modules/nf-core/custom/tabulartogseacls/environment.yml b/modules/nf-core/custom/tabulartogseacls/environment.yml index c7eb9bd1..ae4fa457 100644 --- a/modules/nf-core/custom/tabulartogseacls/environment.yml +++ b/modules/nf-core/custom/tabulartogseacls/environment.yml @@ -2,4 +2,9 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::coreutils=8.30 + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/custom/tabulartogseacls/main.nf b/modules/nf-core/custom/tabulartogseacls/main.nf index 5e6fd37a..dea4c3e6 100644 --- a/modules/nf-core/custom/tabulartogseacls/main.nf +++ b/modules/nf-core/custom/tabulartogseacls/main.nf @@ -1,18 +1,18 @@ process CUSTOM_TABULARTOGSEACLS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(samples) output: tuple val(meta), path("*.cls"), emit: cls - path "versions.yml" , emit: versions + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -20,15 +20,17 @@ process CUSTOM_TABULARTOGSEACLS { script: def args = task.ext.args ?: [] def prefix = task.ext.prefix ?: "${meta.id}" - def separator = args.separator ? "${args.separator}" : ( samples.getName().endsWith(".tsv") ? '\t': ',' ) - separator = separator == '\t' ? '\\t': separator + def separator = args.separator ? "${args.separator}" : (samples.getName().endsWith(".tsv") ? '\t' : ',') + separator = separator == '\t' ? '\\t' : separator def variable = args.variable - if ( !variable ) error "Supply a variable in the sample sheet from which to derive classes" + if (!variable) { + error("Supply a variable in the sample sheet from which to derive classes") + } """ cls_file=${prefix}.cls - column_number=\$(cat $samples | head -n 1 | tr '$separator' "\\n" | grep -En "^$variable\$" | awk -F':' '{print \$1}') - classes=\$(tail -n +2 $samples | awk -F'$separator' '{print \$'\$column_number'}' | sed 's/^\$/empty/g') + column_number=\$(cat ${samples} | head -n 1 | tr '${separator}' "\\n" | grep -En "^${variable}\$" | awk -F':' '{print \$1}') + classes=\$(tail -n +2 ${samples} | awk -F'${separator}' '{print \$'\$column_number'}' | sed 's/^\$/empty/g') unique_classes=\$(echo -e "\$classes" | awk '!x[\$0]++') echo -e "\$(echo -e \"\$classes\" | wc -l) \$(echo -e \"\$unique_classes\" | wc -l) 1" > \$cls_file @@ -38,7 +40,18 @@ process CUSTOM_TABULARTOGSEACLS { cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.cls + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') + END_VERSIONS + """ + } diff --git a/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test new file mode 100644 index 00000000..652aee9d --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test @@ -0,0 +1,63 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEACLS" + script "../main.nf" + process "CUSTOM_TABULARTOGSEACLS" + config "./nextflow.config" + tag "modules" + tag "modules_nfcore" + tag "custom_tabulartogseacls" + tag "custom" + tag "custom/tabulartogseacls" + + test("test_custom_tabulartogseacls") { + + when { + params { + module_args = [ "separator": "\t", "variable": "treatment" ] + } + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_sample_number', variable:'treatment', reference:'mCherry', target:'hND6', blocking:'sample_number'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.sample_metadata.tsv", checkIfExists: true) + ] + """ + + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_custom_tabulartogseacls - stub") { + + options "-stub" + + when { + params { + module_args = { [ "separator": "\t", "variable": "treatment" ] } + } + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_sample_number', variable:'treatment', reference:'mCherry', target:'hND6', blocking:'sample_number'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.sample_metadata.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap new file mode 100644 index 00000000..3c808a4a --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "test_custom_tabulartogseacls - stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ], + "cls": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:30.548463583" + }, + "test_custom_tabulartogseacls": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,7b887159417842b1fe87afebe4f8c2b7" + ] + ], + "1": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ], + "cls": [ + [ + { + "id": "treatment_mCherry_hND6_sample_number", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number" + }, + "treatment_mCherry_hND6_sample_number.cls:md5,7b887159417842b1fe87afebe4f8c2b7" + ] + ], + "versions": [ + "versions.yml:md5,bdeacaf3413865c27625dce2b7adcd9e" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:22.003232009" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config b/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config new file mode 100644 index 00000000..ad3d36ef --- /dev/null +++ b/modules/nf-core/custom/tabulartogseacls/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = params.module_args +} diff --git a/modules/nf-core/custom/tabulartogseagct/environment.yml b/modules/nf-core/custom/tabulartogseagct/environment.yml index c7eb9bd1..ae4fa457 100644 --- a/modules/nf-core/custom/tabulartogseagct/environment.yml +++ b/modules/nf-core/custom/tabulartogseagct/environment.yml @@ -2,4 +2,9 @@ channels: - conda-forge - bioconda dependencies: - - conda-forge::coreutils=8.30 + - conda-forge::coreutils=9.5 + - conda-forge::grep=3.11 + - conda-forge::gzip=1.13 + - conda-forge::lbzip2=2.5 + - conda-forge::sed=4.8 + - conda-forge::tar=1.34 diff --git a/modules/nf-core/custom/tabulartogseagct/main.nf b/modules/nf-core/custom/tabulartogseagct/main.nf index 4f2fa7b5..6ac17922 100644 --- a/modules/nf-core/custom/tabulartogseagct/main.nf +++ b/modules/nf-core/custom/tabulartogseagct/main.nf @@ -1,18 +1,18 @@ process CUSTOM_TABULARTOGSEAGCT { - tag "$meta.id" + tag "${meta.id}" label 'process_single' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'nf-core/ubuntu:20.04' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/52/52ccce28d2ab928ab862e25aae26314d69c8e38bd41ca9431c67ef05221348aa/data' + : 'community.wave.seqera.io/library/coreutils_grep_gzip_lbzip2_pruned:838ba80435a629f8'}" input: tuple val(meta), path(tabular) output: tuple val(meta), path("*.gct"), emit: gct - path "versions.yml" , emit: versions + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when @@ -20,21 +20,31 @@ process CUSTOM_TABULARTOGSEAGCT { script: def args = task.ext.args ?: [] def prefix = task.ext.prefix ?: "${meta.id}" - def separator = args.separator ? "${args.separator}" : ( tabular.getName().endsWith(".csv") ? ',': '\t' ) - separator = separator == '\t' ? '\\t': separator + def separator = args.separator ? "${args.separator}" : (tabular.getName().endsWith(".csv") ? ',' : '\t') + separator = separator == '\t' ? '\\t' : separator """ - n_columns=\$(head -n 1 $tabular | tr "$separator" "\\n" | wc -l) - n_lines=\$(wc -l < $tabular) + n_columns=\$(head -n 1 ${tabular} | tr "${separator}" "\\n" | wc -l) + n_lines=\$(wc -l < ${tabular}) gct_file=${prefix}.gct echo -e "#1.2\$(printf '\\t%.0s' {1..\$n_columns})\\n\$((n_lines-1))\\t\$((n_columns-1))\$(printf '\\t%.0s' {1..\$((n_columns-1))})" > \$gct_file - echo -e "NAME\\tDESCRIPTION\\t\$(head -n 1 $tabular | cut -f1 -d\$'$separator' --complement | awk -F'$separator' 'BEGIN { OFS = "\\t"}; {\$1=\$1}1' )" >> \$gct_file - cat $tabular | tail -n +2 | awk -F'$separator' 'BEGIN { OFS = "\\t"} {\$1=\$1"\\tNA"}1' >> \$gct_file + echo -e "NAME\\tDESCRIPTION\\t\$(head -n 1 ${tabular} | cut -f1 -d\$'${separator}' --complement | awk -F'${separator}' 'BEGIN { OFS = "\\t"}; {\$1=\$1}1' )" >> \$gct_file + cat ${tabular} | tail -n +2 | awk -F'${separator}' 'BEGIN { OFS = "\\t"} {\$1=\$1"\\tNA"}1' >> \$gct_file cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(echo \$(bash --version | grep -Eo 'version [[:alnum:].]+' | sed 's/version //')) + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.gct + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(mawk -W version | head -n 1 | awk '{print \$2}') END_VERSIONS """ } diff --git a/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test new file mode 100644 index 00000000..dc51b363 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test @@ -0,0 +1,56 @@ +nextflow_process { + + name "Test Process CUSTOM_TABULARTOGSEAGCT" + script "../main.nf" + process "CUSTOM_TABULARTOGSEAGCT" + tag "modules" + tag "modules_nfcore" + tag "custom_tabulartogseagct" + tag "custom" + tag "custom/tabulartogseagct" + + test("test_custom_tabulartogseagct") { + + when { + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_', variable:'treatment', reference:'mCherry', target:'hND6', blocking:''], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/all.normalised_counts.tsv",checkIfExists: true) + ] + """ + + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_custom_tabulartogseagct - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [id:'treatment_mCherry_hND6_', variable:'treatment', reference:'mCherry', target:'hND6', blocking:''], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/all.normalised_counts.tsv",checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap new file mode 100644 index 00000000..612b8b14 --- /dev/null +++ b/modules/nf-core/custom/tabulartogseagct/tests/main.nf.test.snap @@ -0,0 +1,84 @@ +{ + "test_custom_tabulartogseagct": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,9727aca45da7ebe619a1f964c9813eee" + ] + ], + "1": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ], + "gct": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,9727aca45da7ebe619a1f964c9813eee" + ] + ], + "versions": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:51.307267504" + }, + "test_custom_tabulartogseagct - stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ], + "gct": [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.gct:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,2cafb8acd2b6a49ec44971051349eb17" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-13T21:25:59.490069672" + } +} \ No newline at end of file diff --git a/modules/nf-core/gprofiler2/gost/main.nf b/modules/nf-core/gprofiler2/gost/main.nf index acb18b93..5e8055f7 100644 --- a/modules/nf-core/gprofiler2/gost/main.nf +++ b/modules/nf-core/gprofiler2/gost/main.nf @@ -4,13 +4,13 @@ process GPROFILER2_GOST { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-3712554873398d849d0d11b22440f41febbc4ede:aa19bb8afc0ec6456a4f3cd650f7577c3bbdd4f3-0': - 'biocontainers/mulled-v2-3712554873398d849d0d11b22440f41febbc4ede:aa19bb8afc0ec6456a4f3cd650f7577c3bbdd4f3-0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e4/e4b0e10a72db4ad519c128c4e3cef6e10bc1a83440af31f105ab389a5532589a/data': + 'community.wave.seqera.io/library/r-ggplot2_r-gprofiler2:fab855ea9f680400' }" input: tuple val(meta), path(de_file) - path(gmt_file) - path(background_file) + tuple val(meta2), path(gmt_file) + tuple val(meta3), path(background_file) output: tuple val(meta), path("*.gprofiler2.all_enriched_pathways.tsv") , emit: all_enrich @@ -28,4 +28,24 @@ process GPROFILER2_GOST { script: template 'gprofiler2_gost.R' + + stub: + def prefix = task.ext.prefix ?: meta.id + """ + touch ${prefix}.gprofiler2.all_enriched_pathways.tsv + touch ${prefix}.gprofiler2.gost_results.rds + touch ${prefix}.gprofiler2.gostplot.png + touch ${prefix}.gprofiler2.gostplot.html + touch ${prefix}.gprofiler2.*.sub_enriched_pathways.tsv + touch ${prefix}.gprofiler2.*.sub_enriched_pathways.png + touch ${prefix}.ENSG_filtered.gmt + touch ${prefix}.R_sessionInfo.log + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') + r-ggplot2: \$(Rscript -e "library(ggplot2); cat(as.character(packageVersion('ggplot2')))") + r-gprofiler2: \$(Rscript -e "library(gprofiler2); cat(as.character(packageVersion('gprofiler2')))") + END_VERSIONS + """ } diff --git a/modules/nf-core/gprofiler2/gost/meta.yml b/modules/nf-core/gprofiler2/gost/meta.yml index 33c9bff2..2ec9318b 100644 --- a/modules/nf-core/gprofiler2/gost/meta.yml +++ b/modules/nf-core/gprofiler2/gost/meta.yml @@ -27,12 +27,18 @@ input: pattern: "*.{csv,tsv}" description: | CSV or TSV-format tabular file with differential analysis outputs - - - gmt_file: + - - meta2: + type: map + description: Groovy map + - gmt_file: type: file pattern: "*.gmt" description: | Path to a GMT file downloaded from g:profiler that should be queried instead of the online databases - - - background_file: + - - meta3: + type: map + description: Groovy map + - background_file: type: file pattern: "*.{csv,tsv,txt}" description: | diff --git a/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R b/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R index 1de2a754..0e2c0f1e 100644 --- a/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R +++ b/modules/nf-core/gprofiler2/gost/templates/gprofiler2_gost.R @@ -449,7 +449,7 @@ gprofiler2.version <- as.character(packageVersion('gprofiler2')) ggplot2.version <- as.character(packageVersion('ggplot2')) writeLines( c( - '"\${task.process}":', + '"$task.process":', paste(' r-base:', r.version), paste(' r-ggplot2:', ggplot2.version), paste(' r-gprofiler2:', gprofiler2.version) diff --git a/modules/nf-core/gprofiler2/gost/tests/main.nf.test b/modules/nf-core/gprofiler2/gost/tests/main.nf.test new file mode 100644 index 00000000..e2528ef2 --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/main.nf.test @@ -0,0 +1,122 @@ +nextflow_process { + + name "Test Process GPROFILER2_GOST" + script "../main.nf" + process "GPROFILER2_GOST" + config "./nextflow.config" + + tag "modules" + tag "modules_nfcore" + tag "gprofiler" + tag "gprofiler_gost" + tag "gost" + tag "gprofiler2/gost" + tag "gprofiler2" + + test("test") { + + when { + params{ + gprofiler2_significant = true + gprofiler2_measure_underrepresentation = false + gprofiler2_correction_method = "gSCS" + gprofiler2_evcodes = false + gprofiler2_max_qval = 0.05 + gprofiler2_domain_scope = "annotated" + gprofiler2_min_diff = 1 + report_round_digits = 4 + gprofiler2_palette_name = "Blues" + differential_feature_id_column = "gene_id" + gprofiler2_token = null + gprofiler2_organism = "mmusculus" + gprofiler2_background_column = null + gprofiler2_sources = null + + module_args = [ + "--significant \"${params.gprofiler2_significant}\"", + "--measure_underrepresentation \"${params.gprofiler2_measure_underrepresentation}\"", + "--correction_method \"${params.gprofiler2_correction_method}\"", + "--evcodes \"${params.gprofiler2_evcodes}\"", + "--pval_threshold \"${params.gprofiler2_max_qval}\"", + "--domain_scope ${params.gprofiler2_domain_scope}", + "--min_diff \"${params.gprofiler2_min_diff}\"", + "--round_digits ${params.report_round_digits}", + "--palette_name \"${params.gprofiler2_palette_name}\"", + ((params.differential_feature_id_column == null) ? '' : "--de_id_column \"${params.differential_feature_id_column}\""), + ((params.gprofiler2_token == null) ? '' : "--token \"${params.gprofiler2_token}\""), + ((params.gprofiler2_organism == null) ? '' : "--organism \"${params.gprofiler2_organism}\""), + ((params.gprofiler2_background_column == null) ? '' : "--background_column \"${params.gprofiler2_background_column}\""), + ((params.gprofiler2_sources == null) ? '' : "--sources \"${params.gprofiler2_sources}\"") + ].join(' ').trim() + } + process { + """ + input[0] = [ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true) + ] + input[1] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists: true) + ] + input[2] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/study.filtered.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.all_enrich, + process.out.sub_enrich, + file(process.out.plot_png[0][1]).name, //assert unstable file + process.out.sub_plot[0][1].collect{ file(it).name }, //assert unstable file + process.out.filtered_gmt, + process.out.session_info.collect{ meta,session_info -> file(session_info).name }, //assert unstable file + process.out.versions, + process.out.plot_html.collect{ meta,html -> file(html).name }, //assert unstable file + process.out.rds.collect{ meta,rds -> file(rds).name } //assert unstable file + ).match() + } + ) + } + } + + test("stub") { + + options "-stub" + + when { + params{ + module_args = null + } + process { + """ + input[0] = [ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true) + ] + input[1] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists: true) + ] + input[2] = [ + ['id': 'test'], + file(params.modules_testdata_base_path + "genomics/mus_musculus/rnaseq_expression/study.filtered.tsv", checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } +} diff --git a/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap b/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap new file mode 100644 index 00000000..eec8d87c --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/main.nf.test.snap @@ -0,0 +1,281 @@ +{ + "test": { + "content": [ + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,1134a02ca061c463bcbff277eefbfb19" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,d527b94cdb160070bcaa0bfb0cecf914", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,ef418c3f06d50446317928e37ec8ddfb", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,e460d4917feb0b64d334a528f59e0731", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.tsv:md5,865d8f092503552831c51d775a98c6eb", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,413724002abe683f376ea914d4f21ade", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.tsv:md5,fce81051d7af955ddb2925ba2da9ff57", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,e89e1876698ea644671a0720c85f4dbb", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.tsv:md5,e272217ec7fcf01ea463ab8bcc8335cf", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.tsv:md5,fdd1efa836d85bb127e933e925290cba" + ] + ] + ], + "Condition_genotype_WT_KO.gprofiler2.gostplot.png", + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.png", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.png" + ], + [ + + ], + [ + "R_sessionInfo.log" + ], + [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gostplot.html" + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-21T11:29:54.746689985" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ENSG_filtered.gmt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ], + "all_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "filtered_gmt": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ENSG_filtered.gmt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "plot_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "plot_png": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rds": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.gost_results.rds:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "session_info": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.R_sessionInfo.log:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sub_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "sub_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,7ff4ab78463faf97bba7e698ed9a9069" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-21T11:31:33.394855046" + } +} \ No newline at end of file diff --git a/modules/nf-core/gprofiler2/gost/tests/nextflow.config b/modules/nf-core/gprofiler2/gost/tests/nextflow.config new file mode 100644 index 00000000..1a77344d --- /dev/null +++ b/modules/nf-core/gprofiler2/gost/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = params.module_args +} \ No newline at end of file diff --git a/modules/nf-core/gsea/gsea/main.nf b/modules/nf-core/gsea/gsea/main.nf index 6a060c46..254d68d3 100644 --- a/modules/nf-core/gsea/gsea/main.nf +++ b/modules/nf-core/gsea/gsea/main.nf @@ -4,13 +4,13 @@ process GSEA_GSEA { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/gsea:4.3.2--hdfd78af_0': - 'biocontainers/gsea:4.3.2--hdfd78af_0' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/0f/0f4fe28961396eeeaa98484cb4f2db5c79abfdf117700df132312fe5c41bff81/data': + 'community.wave.seqera.io/library/gsea:4.3.2--a7421d7504fd7c81' }" input: tuple val(meta), path(gct), path(cls), path(gene_sets) tuple val(reference), val(target) - path(chip) // Optional identifier mapping file + tuple val(meta2), path(chip) // Optional identifier mapping file output: tuple val(meta), path("*.rpt") , emit: rpt @@ -26,29 +26,26 @@ process GSEA_GSEA { tuple val(meta), path("*heat_map_1.png") , emit: heatmap tuple val(meta), path("*pvalues_vs_nes_plot.png") , emit: pvalues_vs_nes_plot tuple val(meta), path("*ranked_list_corr_2.png") , emit: ranked_list_corr - tuple val(meta), path("*butterfly_plot.png") , emit: butterfly_plot, optional: true - tuple val(meta), path("*[!gene_set_size|gsea_report|ranked_gene_list]*.tsv"), emit: gene_set_tsv, optional: true - tuple val(meta), path("*[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html"), emit: gene_set_html, optional: true - tuple val(meta), path("*[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png"), emit: gene_set_heatmap, optional: true - tuple val(meta), path("*_snapshot*.html") , emit: snapshot, optional: true - tuple val(meta), path("*enplot*.png") , emit: gene_set_enplot, optional: true - tuple val(meta), path("*gset_rnd_es_dist*.png") , emit: gene_set_dist, optional: true - tuple val(meta), path("*.zip") , emit: archive, optional: true + tuple val(meta), path("*butterfly_plot.png") , emit: butterfly_plot , optional: true + tuple val(meta), path("gene_sets_*.tsv") , emit: gene_set_tsv , optional: true + tuple val(meta), path("gene_sets_*.html") , emit: gene_set_html , optional: true + tuple val(meta), path("gene_sets_*.png") , emit: gene_set_heatmap, optional: true + tuple val(meta), path("*_snapshot*.html") , emit: snapshot , optional: true + tuple val(meta), path("*enplot*.png") , emit: gene_set_enplot , optional: true + tuple val(meta), path("*gset_rnd_es_dist*.png") , emit: gene_set_dist , optional: true + tuple val(meta), path("*.zip") , emit: archive , optional: true path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - - // Remove any trailing dots from prefix when passed as report label, so - // GSEA doesn't produce double-dotted top-level outputs - def rpt_label = prefix.replaceAll('\\.$', '') - + def rpt_label = prefix.replaceAll('\\.$', '') // Remove any trailing dots from prefix when passed as report label, so GSEA doesn't produce double-dotted top-level outputs def chip_command = chip ? "-chip $chip -collapse true" : '' + def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ # Run GSEA @@ -78,9 +75,71 @@ process GSEA_GSEA { sed -i.bak "s/\$f/${prefix}\${f}/g" *.rpt *.html && rm *.bak done + # Rename files so that they can be properly referenced by the output channels + # Function to rename files based on the given pattern + rename_files() { + local pattern=\$1 + local exclude_patterns=\$2 + local extension=\$3 + + # Find files matching the pattern but not matching the exclusion patterns + find . -type f -name "\$pattern" | while read -r file; do + # Exclude files based on the provided exclusion patterns + if ! echo "\$file" | grep -qE "\$exclude_patterns"; then + # Rename the file by adding the prefix "gene_sets_" + mv "\$file" "\$(dirname "\$file")/gene_sets_\$(basename "\$file")" + fi + done + } + + # Pattern and exclusion for .tsv files + tsv_pattern="*.tsv" + tsv_exclude="gene_set_size|gsea_report|ranked_gene_list" + + # Pattern and exclusion for .html files + html_pattern="*.html" + html_exclude="gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot" + + # Pattern and exclusion for .png files + png_pattern="*.png" + png_exclude="butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr" + + # Rename .tsv files + rename_files "\$tsv_pattern" "\$tsv_exclude" ".tsv" + + # Rename .html files + rename_files "\$html_pattern" "\$html_exclude" ".html" + + # Rename .png files + rename_files "\$png_pattern" "\$png_exclude" ".png" + + cat <<-END_VERSIONS > versions.yml "${task.process}": gsea: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '4.3.2' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.rpt + touch ${prefix}.index.html + touch ${prefix}.heat_map_corr_plot.html + touch ${prefix}.gsea_report_for_${reference}.tsv + touch ${prefix}.gsea_report_for_${reference}.html + touch ${prefix}.gsea_report_for_${target}.tsv + touch ${prefix}.gsea_report_for_${target}.html + touch ${prefix}.ranked_gene_list*.tsv + touch ${prefix}.gene_set_sizes.tsv + touch ${prefix}.global_es_histogram.png + touch ${prefix}.heat_map_1.png + touch ${prefix}.pvalues_vs_nes_plot.png + touch ${prefix}.ranked_list_corr_2.png + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + gsea: $VERSION + """ } diff --git a/modules/nf-core/gsea/gsea/meta.yml b/modules/nf-core/gsea/gsea/meta.yml index f3ce403f..41a22941 100644 --- a/modules/nf-core/gsea/gsea/meta.yml +++ b/modules/nf-core/gsea/gsea/meta.yml @@ -40,7 +40,10 @@ input: description: | String indicating which of the classes in the cls file should be used as the target level of the comparison. - - - chip: + - - meta2: + type: map + description: Groovy map + - chip: type: file description: | optional Broad-style chip file mapping identifiers in gct to @@ -182,31 +185,31 @@ output: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!gene_set_size|gsea_report|ranked_gene_list]*.tsv": + - "gene_sets_*.tsv": type: list description: Where -make_sets is not set to false, TSV files, one file for each gene set, with detail on enrichment for each gene - pattern: "[!gene_set_size|gsea_report|ranked_gene_list]*.tsv" + pattern: "gene_sets_*.tsv" - gene_set_html: - meta: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html": + - "gene_sets_*.html": type: list description: Where -make_sets is not set to false, HTML files, one file for each gene set, with detail on enrichment for each gene - pattern: "[!gsea_report|heat_map_corr_plot|index|pos_snapshot|neg_snapshot]*.html" + pattern: "gene_sets_*.html" - gene_set_heatmap: - meta: type: map description: | Groovy Map containing metadata, at a minimum an id e.g. [ id:'test' ] - - "*[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png": + - "gene_sets_*.png": type: list description: Where -make_sets is not set to false, PNG-format heatmaps, one file for each gene set, showing expression for each gene - pattern: "[!butterfly|enplot|global_es_histogram|gset_rnd_es_dist|heat_map|pvalues_vs_nes_plot|ranked_list_corr]*.png" + pattern: "gene_sets_*.png" - snapshot: - meta: type: map @@ -255,3 +258,4 @@ authors: - "@pinin4fjords" maintainers: - "@pinin4fjords" + - "@nschcolnicov" diff --git a/modules/nf-core/gsea/gsea/tests/main.nf.test b/modules/nf-core/gsea/gsea/tests/main.nf.test new file mode 100644 index 00000000..1f97e97a --- /dev/null +++ b/modules/nf-core/gsea/gsea/tests/main.nf.test @@ -0,0 +1,84 @@ +nextflow_process { + + name "Test Process GSEA_GSEA" + script "../main.nf" + process "GSEA_GSEA" + + tag "modules" + tag "modules_nfcore" + tag "gsea_gsea" + tag "gsea" + tag "gsea/gsea" + + test("test") { + + when { + process { + """ + input[0] = [['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_treatment_Control_Treated.gct", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_genotype_WT_KO.cls", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists:true)] + input[1] = ['WT', 'KO'] + input[2] = [ + ['id': 'test'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Mus_musculus.anno.feature_metadata.chip", checkIfExists:true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot( + process.out.rpt.collect{ meta,rpt -> file(rpt).name }, //assert unstable file + process.out.index_html.collect{ meta,index_html -> file(index_html).name }, //assert unstable file + process.out.heat_map_corr_plot, + process.out.report_tsvs_ref, + process.out.report_htmls_ref.collect{ meta,report_htmls_ref -> file(report_htmls_ref).name }, //assert unstable file + process.out.report_tsvs_target, + process.out.report_htmls_target.collect{ meta,report_htmls_target -> file(report_htmls_target).name }, //assert unstable file + process.out.ranked_gene_list, + process.out.gene_set_sizes, + process.out.histogram.collect{ meta,histogram -> file(histogram).name }, //assert unstable file + process.out.heatmap.collect{ meta,heatmap -> file(heatmap).name }, //assert unstable file + process.out.pvalues_vs_nes_plot.collect{ meta,pvalues_vs_nes_plot -> file(pvalues_vs_nes_plot).name }, //assert unstable file + process.out.ranked_list_corr.collect{ meta,ranked_list_corr -> file(ranked_list_corr).name }, //assert unstable file + process.out.butterfly_plot.collect{ meta,butterfly_plot -> file(butterfly_plot).name }, //assert unstable file + process.out.gene_set_tsv, + process.out.gene_set_html[0][1].collect{ file(it).name }, //assert unstable file + process.out.gene_set_heatmap[0][1].collect{ file(it).name }, // unstable file and unstable name + process.out.snapshot[0][1].collect{ file(it).name }, //assert unstable file + process.out.gene_set_enplot[0][1].collect{ file(it).name }, // unstable file and unstable name + process.out.gene_set_dist[0][1].collect{ file(it).name }, //assert unstable file + process.out.archive, + process.out.versions + ).match() + } + ) + } + } + + test("stub") { + + options "-stub" + + when { + process { + """ + input[0] = [['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_treatment_Control_Treated.gct", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Condition_genotype_WT_KO.cls", checkIfExists:true), file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt", checkIfExists:true)] + input[1] = ['WT', 'KO'] + input[2] = [ + ['id': 'test'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/modules/data/genomics/mus_musculus/gene_set_analysis/Mus_musculus.anno.feature_metadata.chip", checkIfExists:true) + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + ) + } + } +} diff --git a/modules/nf-core/gsea/gsea/tests/main.nf.test.snap b/modules/nf-core/gsea/gsea/tests/main.nf.test.snap new file mode 100644 index 00000000..5ed2fe53 --- /dev/null +++ b/modules/nf-core/gsea/gsea/tests/main.nf.test.snap @@ -0,0 +1,692 @@ +{ + "test": { + "content": [ + [ + "Condition_genotype_WT_KO.Gsea.rpt" + ], + [ + "Condition_genotype_WT_KOindex.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOheat_map_corr_plot.html:md5,129c561984542746bc50c3f6db9c7c5e" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgsea_report_for_WT.tsv:md5,674b21a1646cc554d6686ddd67c55dab" + ] + ], + [ + "Condition_genotype_WT_KOgsea_report_for_WT.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgsea_report_for_KO.tsv:md5,a4e7de6cf0400befc6e52e379c89c178" + ] + ], + [ + "Condition_genotype_WT_KOgsea_report_for_KO.html" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOranked_gene_list_KO_versus_WT.tsv:md5,3ae0171ae04398f350cd3e0f183b9d67" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KOgene_set_sizes.tsv:md5,61ca77f6b13620a78170c0b9366b8425" + ] + ], + [ + "Condition_genotype_WT_KOglobal_es_histogram.png" + ], + [ + "Condition_genotype_WT_KOheat_map_1.png" + ], + [ + "Condition_genotype_WT_KOpvalues_vs_nes_plot.png" + ], + [ + "Condition_genotype_WT_KOranked_list_corr_2.png" + ], + [ + "Condition_genotype_WT_KObutterfly_plot.png" + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS.tsv:md5,0e7035e5cbaba4a35d87538da823e05c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE.tsv:md5,46cee22eddeac12e1d8643e539c6c397", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS.tsv:md5,3b4a7f1b28282bf886c9c06d73f61e45", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION.tsv:md5,e9d02a848a5aca73a22a6aef7473defd", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE.tsv:md5,84eed15b2aad41077b2a4c5367c05782", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS.tsv:md5,302c2afbf1b77c6eccd7983fb657007c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM.tsv:md5,967e4be880742f32720419fe879b7cc7", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION.tsv:md5,6c5bece0e26c1e1b32d9d47b10651baf", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT.tsv:md5,0d3dfe9073ddbbfa3a6f0c7bcb4c8601", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR.tsv:md5,975b4b3905685e73500ec49cd54a2c03", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION.tsv:md5,122c6786499f76f5ec0c6ce604b52aa0", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,7fea0527089b002ccf840223a60ecbf4", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE.tsv:md5,a838545de228235bc4f8830b5777e893", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM.tsv:md5,926ddf4b74ad3a6d76bc99e82ae6aaf3", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS.tsv:md5,4dcdce8b8db83dd971800f2ff18ccbeb", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING.tsv:md5,2d508b31d0ec00228db110a0e9e2f059", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM.tsv:md5,bb723be28feecbbc68909fdb17f8e2f4", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA.tsv:md5,e3a7d53519ee12377377659743d9cf4c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING.tsv:md5,4bcc7835887602c732c85ef2db4f5584", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,18e50d2154c81700b2c44ee848ced133", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,fb6fcf993118271ee3340e9a12de0ed7", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN.tsv:md5,d0649d9c33c0f81bf4e8e2dcdb6a036d", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP.tsv:md5,1b4411d95e2bf08db2bae06996d6729c", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS.tsv:md5,564c3e924517993e6eac6819a5f53d92", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING.tsv:md5,e91e740dac62555b603bf44c427e671e", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,75095d76fc23eccb98d67e045839d4a9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY.tsv:md5,ce4a9fc08c539fc4d930f81e08a2db55", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS.tsv:md5,9df68cbfc6e4666d18ff6d214c5f1544", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME.tsv:md5,f0e60a2f8bc511be09ff8f04886eca61", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING.tsv:md5,f76d919c3e1342304bb69e50a58c81d9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION.tsv:md5,f16a1fcc6e9b4fd976b3c9fefd0f8dc9", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY.tsv:md5,66bcbea77b774b7d0542abeb460bfef8", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING.tsv:md5,5970edfc5faad9bb73408d75a2f40350", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN.tsv:md5,bb751fac5d95a22e6872ef347038cd4e", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP.tsv:md5,8cfe52d138bc42ec8fd7d2c6fbf6761f", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,b45d874ea3fdd7cd4f8bd09843eaa941", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM.tsv:md5,ca28e2bd7b3584d1354e97b09a37f8af", + "gene_sets_Condition_genotype_WT_KOSymbol_to_probe_set_mapping_details.tsv:md5,a8bed433fe3e8081495c82226ec44917" + ] + ] + ], + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING.html", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM.html" + ], + [ + "gene_sets_Condition_genotype_WT_KOHALLMARK_ADIPOGENESIS_13.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANDROGEN_RESPONSE_100.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ANGIOGENESIS_94.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_JUNCTION_55.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APICAL_SURFACE_82.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_APOPTOSIS_40.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_BILE_ACID_METABOLISM_31.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COAGULATION_34.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_COMPLEMENT_91.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_DNA_REPAIR_43.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION_67.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_EARLY_58.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_ESTROGEN_RESPONSE_LATE_70.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_FATTY_ACID_METABOLISM_16.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_GLYCOLYSIS_97.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEDGEHOG_SIGNALING_61.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HEME_METABOLISM_28.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_HYPOXIA_103.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL2_STAT5_SIGNALING_106.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_IL6_JAK_STAT3_SIGNALING_46.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_INTERFERON_ALPHA_RESPONSE_52.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_DN_109.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_KRAS_SIGNALING_UP_85.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_MYOGENESIS_64.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_NOTCH_SIGNALING_73.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_OXIDATIVE_PHOSPHORYLATION_4.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_P53_PATHWAY_22.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PANCREAS_BETA_CELLS_37.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PEROXISOME_7.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PI3K_AKT_MTOR_SIGNALING_49.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_PROTEIN_SECRETION_10.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY_25.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_TGF_BETA_SIGNALING_79.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_DN_76.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_UV_RESPONSE_UP_88.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_WNT_BETA_CATENIN_SIGNALING_112.png", + "gene_sets_Condition_genotype_WT_KOHALLMARK_XENOBIOTIC_METABOLISM_19.png" + ], + [ + "Condition_genotype_WT_KOneg_snapshot.html", + "Condition_genotype_WT_KOpos_snapshot.html" + ], + [ + "Condition_genotype_WT_KOenplot_HALLMARK_ADIPOGENESIS_12.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ANDROGEN_RESPONSE_99.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ANGIOGENESIS_93.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APICAL_JUNCTION_54.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APICAL_SURFACE_81.png", + "Condition_genotype_WT_KOenplot_HALLMARK_APOPTOSIS_39.png", + "Condition_genotype_WT_KOenplot_HALLMARK_BILE_ACID_METABOLISM_30.png", + "Condition_genotype_WT_KOenplot_HALLMARK_COAGULATION_33.png", + "Condition_genotype_WT_KOenplot_HALLMARK_COMPLEMENT_90.png", + "Condition_genotype_WT_KOenplot_HALLMARK_DNA_REPAIR_42.png", + "Condition_genotype_WT_KOenplot_HALLMARK_EPITHELIAL_MESENCHYMAL_TRANSITION_66.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ESTROGEN_RESPONSE_EARLY_57.png", + "Condition_genotype_WT_KOenplot_HALLMARK_ESTROGEN_RESPONSE_LATE_69.png", + "Condition_genotype_WT_KOenplot_HALLMARK_FATTY_ACID_METABOLISM_15.png", + "Condition_genotype_WT_KOenplot_HALLMARK_GLYCOLYSIS_96.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HEDGEHOG_SIGNALING_60.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HEME_METABOLISM_27.png", + "Condition_genotype_WT_KOenplot_HALLMARK_HYPOXIA_102.png", + "Condition_genotype_WT_KOenplot_HALLMARK_IL2_STAT5_SIGNALING_105.png", + "Condition_genotype_WT_KOenplot_HALLMARK_IL6_JAK_STAT3_SIGNALING_45.png", + "Condition_genotype_WT_KOenplot_HALLMARK_INTERFERON_ALPHA_RESPONSE_51.png", + "Condition_genotype_WT_KOenplot_HALLMARK_KRAS_SIGNALING_DN_108.png", + "Condition_genotype_WT_KOenplot_HALLMARK_KRAS_SIGNALING_UP_84.png", + "Condition_genotype_WT_KOenplot_HALLMARK_MYOGENESIS_63.png", + "Condition_genotype_WT_KOenplot_HALLMARK_NOTCH_SIGNALING_72.png", + "Condition_genotype_WT_KOenplot_HALLMARK_OXIDATIVE_PHOSPHORYLATION_3.png", + "Condition_genotype_WT_KOenplot_HALLMARK_P53_PATHWAY_21.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PANCREAS_BETA_CELLS_36.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PEROXISOME_6.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PI3K_AKT_MTOR_SIGNALING_48.png", + "Condition_genotype_WT_KOenplot_HALLMARK_PROTEIN_SECRETION_9.png", + "Condition_genotype_WT_KOenplot_HALLMARK_REACTIVE_OXIGEN_SPECIES_PATHWAY_24.png", + "Condition_genotype_WT_KOenplot_HALLMARK_TGF_BETA_SIGNALING_78.png", + "Condition_genotype_WT_KOenplot_HALLMARK_UV_RESPONSE_DN_75.png", + "Condition_genotype_WT_KOenplot_HALLMARK_UV_RESPONSE_UP_87.png", + "Condition_genotype_WT_KOenplot_HALLMARK_WNT_BETA_CATENIN_SIGNALING_111.png", + "Condition_genotype_WT_KOenplot_HALLMARK_XENOBIOTIC_METABOLISM_18.png" + ], + [ + "Condition_genotype_WT_KOgset_rnd_es_dist_101.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_104.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_107.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_11.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_110.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_113.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_14.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_17.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_20.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_23.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_26.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_29.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_32.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_35.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_38.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_41.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_44.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_47.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_5.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_50.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_53.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_56.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_59.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_62.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_65.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_68.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_71.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_74.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_77.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_8.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_80.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_83.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_86.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_89.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_92.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_95.png", + "Condition_genotype_WT_KOgset_rnd_es_dist_98.png" + ], + [ + + ], + [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-09T12:59:01.403655519" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.rpt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "10": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_1.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "11": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.pvalues_vs_nes_plot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "12": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_list_corr_2.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "13": [ + + ], + "14": [ + + ], + "15": [ + + ], + "16": [ + + ], + "17": [ + + ], + "18": [ + + ], + "19": [ + + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_corr_plot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "20": [ + + ], + "21": [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ], + "3": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "7": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_gene_list*.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "8": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gene_set_sizes.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "9": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.global_es_histogram.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "archive": [ + + ], + "butterfly_plot": [ + + ], + "gene_set_dist": [ + + ], + "gene_set_enplot": [ + + ], + "gene_set_heatmap": [ + + ], + "gene_set_html": [ + + ], + "gene_set_sizes": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gene_set_sizes.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gene_set_tsv": [ + + ], + "heat_map_corr_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_corr_plot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "heatmap": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.heat_map_1.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "histogram": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.global_es_histogram.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "index_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.index.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "pvalues_vs_nes_plot": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.pvalues_vs_nes_plot.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ranked_gene_list": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_gene_list*.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "ranked_list_corr": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.ranked_list_corr_2.png:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_htmls_ref": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_htmls_target": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_tsvs_ref": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_WT.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "report_tsvs_target": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.gsea_report_for_KO.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "rpt": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch" + }, + "Condition_genotype_WT_KO.rpt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "snapshot": [ + + ], + "versions": [ + "versions.yml:md5,957596d9ab6aad1125546a4279696a38" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-08T17:41:24.591802253" + } +} \ No newline at end of file diff --git a/modules/nf-core/limma/differential/main.nf b/modules/nf-core/limma/differential/main.nf index be6c72ec..b7106c39 100644 --- a/modules/nf-core/limma/differential/main.nf +++ b/modules/nf-core/limma/differential/main.nf @@ -5,7 +5,7 @@ process LIMMA_DIFFERENTIAL { conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/af/afd9579a0ff62890ff451d82b360d85e82a0d61a3da40736ee0eee4e45926269/data' : - 'community.wave.seqera.io/library/bioconductor-limma_bioconductor-edger:54dd09078d5db3b3' }" + 'community.wave.seqera.io/library/bioconductor-edger_bioconductor-limma:176c202c82450990' }" input: tuple val(meta), val(contrast_variable), val(reference), val(target) diff --git a/modules/nf-core/propr/grea/environment.yml b/modules/nf-core/propr/grea/environment.yml new file mode 100644 index 00000000..9744dab9 --- /dev/null +++ b/modules/nf-core/propr/grea/environment.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::bioconductor-limma=3.58.1 + - conda-forge::r-propr=5.1.5 diff --git a/modules/nf-core/propr/grea/main.nf b/modules/nf-core/propr/grea/main.nf new file mode 100644 index 00000000..fd727208 --- /dev/null +++ b/modules/nf-core/propr/grea/main.nf @@ -0,0 +1,24 @@ +process PROPR_GREA { + tag "$meta.id" + label 'process_high' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b6/b65f7192866fbd9a947df15b104808abb720e7a224bbe3ca8f7f8f680f52c97a/data' : + 'community.wave.seqera.io/library/bioconductor-limma_r-propr:f52f1d4fea746393' }" + + input: + tuple val(meta), path(adjacency) + tuple val(meta2), path(gmt) + + output: + tuple val(meta), path("*.grea.tsv"), emit: results + path "versions.yml", emit: versions + path "*.R_sessionInfo.log", emit: session_info + + when: + task.ext.when == null || task.ext.when + + script: + template 'grea.R' +} diff --git a/modules/nf-core/propr/grea/meta.yml b/modules/nf-core/propr/grea/meta.yml new file mode 100644 index 00000000..cc0613d3 --- /dev/null +++ b/modules/nf-core/propr/grea/meta.yml @@ -0,0 +1,75 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json +name: "propr_grea" +description: Perform Gene Ratio Enrichment Analysis +keywords: + - propr + - grea + - logratio + - differential expression + - functional enrichment + - functional analysis +tools: + - "grea": + description: "Gene Ratio Enrichment Analysis" + 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.2202/1544-6115.1175" + licence: ["GPL-2"] + identifier: biotools:propr +input: + - - meta: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - adjacency: + type: file + description: | + Adjacency matrix representing the graph connections (ie. 1 for edges, 0 otherwise). + This can be the adjacency matrix output from gene ratio approaches like propr/propd. + pattern: "*.{csv,tsv}" + - - meta2: + type: map + description: | + Groovy Map containing data information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - gmt: + type: file + description: | + A tab delimited file format that describes gene sets. The first column is the + concept id (eg. GO term, pathway, etc), the second column is the concept description, and the + rest are nodes (eg. genes) that is associated to the given concept. + pattern: "*.{gmt}" +output: + - results: + - meta: + type: file + description: | + Groovy Map containing sample information. + This can be used at the workflow level to pass optional parameters to the module. + [id: 'test', ...] + - "*.grea.tsv": + type: file + description: | + Output file containing the information about the tested concepts (ie. gene sets) + and enrichment statistics. + pattern: "*.grea.tsv" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" + - session_info: + - "*.R_sessionInfo.log": + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" +authors: + - "@caraiz2001" + - "@suzannejin" +maintainers: + - "@caraiz2001" + - "@suzannejin" diff --git a/modules/nf-core/propr/grea/templates/grea.R b/modules/nf-core/propr/grea/templates/grea.R new file mode 100644 index 00000000..3b761f89 --- /dev/null +++ b/modules/nf-core/propr/grea/templates/grea.R @@ -0,0 +1,300 @@ +#!/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 (determined by file extension) +#' +#' @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)) # Get the file extension + + if (ext == "tsv" || ext == "txt") { # If the file is a tsv or txt file + separator <- "\\t" # Set the separator variable to tab + } else if (ext == "csv") { # If the file is a csv file + separator <- "," + } else { + stop(paste("Unknown separator for", ext)) + } + + mat <- read.delim( # Read the file + file, + sep = separator, # Set the separator defined above + header = header, + row.names = row.names, + check.names = check.names + ) +} + +#' Loads the .gmt file and converts it into a knowledge database +#' +#' @param filename path of the .gmt file +#' @param nodes vector of node (eg. gene) names. Note that this set should be as +#' complete as possible. So it should not only contain the target genes but also +#' the background genes. +#' @return a list with: +#' `db` A knowledge database (matrix) where each row is a graph node (eg. gene) +#' and each column is a concept (eg. GO term, pathway, etc). +#' `description` A list of descriptions for each concept. +load_gmt <- function(filename, nodes) { + + # read gmt file + gmt <- readLines(filename) + gmt <- strsplit(gmt, "\\t") + + # initialize database matrix + db <- matrix(0, nrow = length(nodes), ncol = length(gmt)) + rownames(db) <- nodes + colnames(db) <- sapply(gmt, function(entry) entry[[1]]) + + # description of the concepts + description <- list() + + # for concept in gmt + for (i in 1:length(gmt)) { + + # get concept and description + concept <- gmt[[i]][[1]] + description[[concept]] <- gmt[[i]][[2]] + + # fill 1 if gene is in concept + nodes_in_concept <- gmt[[i]][-c(1, 2)] + nodes_in_concept <- nodes_in_concept[nodes_in_concept %in% nodes] + db[nodes_in_concept, i] <- 1 + } + + return(list(db = db, description = description)) +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input data + adj = '$adjacency', # adjacency matrix + gmt = '$gmt', # knowledge database .gmt file + + # parameters for gene sets + set_min = 15, # minimum number of genes in a set + set_max = 500, # maximum number of genes in a set + + # parameters for permutation test + permutation = 100, # number of permutations to perform + + # other parameters + seed = NA, # seed for reproducibility + round_digits = NA, # number of digits to round results + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + adj = 'character', + gmt = 'character', + set_min = 'numeric', + set_max = 'numeric', + permutation = 'numeric', + seed = 'numeric', + round_digits = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_ext <- ifelse('$task.ext.args' == 'null', '', '$task.ext.args') +args_opt <- parse_args(args_ext) +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('adj', 'gmt') # defines a vector required_opts containing the names of the required parameters. +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('adj', 'gmt')){ + 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 are valid + +if (opt\$permutation < 0) { + stop('permutation should be a positive integer') +} + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Enrichment analysis ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# load adjacency matrix +# this matrix should have gene x gene dimensions + +message("Loading input data") + +adj <- as.matrix(read_delim_flexible( + opt\$adj, + header = TRUE, + row.names = 1, + check.names = FALSE +)) +if (nrow(adj) != ncol(adj)) { + stop('Adjacency matrix should be a squared matrix that reflects the connections between all the nodes') +} +if (!all(rownames(adj) == colnames(adj))) { + stop('Adjacency matrix row names are not equal to column names') +} + +# load and process knowledge database + +gmt <- load_gmt( + opt\$gmt, + rownames(adj) # adj should contain all the nodes (target and background) +) + +# filter gene sets +# gene sets with less than set_min or more than set_max genes are removed + +idx <- which(colSums(gmt\$db) > opt\$set_min & colSums(gmt\$db) < opt\$set_max) +if (length(idx) == 0){ + stop("No gene set pass the filter of set_min=", opt\$set_min, " and set_max=", opt\$set_max) +} +gmt\$db <- gmt\$db[, idx] +gmt\$description <- gmt\$description[idx] + +# run GREA +# Basically, it calculates the odds ratio of the graph being enriched in each concept, +# and the FDR of the odds ratio through permutation tests + +message("Running GREA") + +odds <- runGraflex( + adj, + gmt\$db, + p=opt\$permutation, + ncores=opt\$ncores +) +odds\$Description <- sapply(odds\$Concept, function(concept) + gmt\$description[[concept]] +) + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +if (!is.na(opt\$round_digits)) { + for (col in c('Odds', 'LogOR', 'FDR.under', 'FDR.over')){ + odds[,col] <- round(odds[,col], opt\$round_digits) + } +} + +write.table( + odds, + file = paste0(opt\$prefix, '.grea.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 ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/grea/tests/grea_test.config b/modules/nf-core/propr/grea/tests/grea_test.config new file mode 100644 index 00000000..7d354c01 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/grea_test.config @@ -0,0 +1,14 @@ +process { + // set single core for reproducibility + // NOTE this method relies on parallelization and permutation tests + // The permutations are done within each node, which makes set.seed not working properly when + // different nodes are starting/ending depending on the case + cpus = 1 + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/grea/tests/main.nf.test b/modules/nf-core/propr/grea/tests/main.nf.test new file mode 100644 index 00000000..38a015e4 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test @@ -0,0 +1,66 @@ +nextflow_process { + + name "Test Process PROPR_GREA" + script "../main.nf" + process "PROPR_GREA" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/grea" + tag "propr/propd" + + test("test grea chained to propd") { + + tag "default" + config "./grea_test.config" + + setup { + run("PROPR_PROPD") { + script "../../propd/main.nf" + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + } + + when { + process { + """ + input[0] = PROPR_PROPD.out.adjacency + input[1] = [ + [id: 'test'], + file(params.modules_testdata_base_path + 'genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results, + process.out.versions + ).match()} + ) + } + } +} diff --git a/modules/nf-core/propr/grea/tests/main.nf.test.snap b/modules/nf-core/propr/grea/tests/main.nf.test.snap new file mode 100644 index 00000000..6c5dd533 --- /dev/null +++ b/modules/nf-core/propr/grea/tests/main.nf.test.snap @@ -0,0 +1,26 @@ +{ + "test grea chained to propd": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + [ + "versions.yml:md5,060fcd8ce4afc482e237fa75686a0aba" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.2" + }, + "timestamp": "2024-12-11T13:00:02.026244403" + } +} diff --git a/modules/nf-core/propr/grea/tests/tags.yml b/modules/nf-core/propr/grea/tests/tags.yml new file mode 100644 index 00000000..e7f80baf --- /dev/null +++ b/modules/nf-core/propr/grea/tests/tags.yml @@ -0,0 +1,2 @@ +propr/grea: + - "modules/nf-core/propr/grea/**" diff --git a/modules/nf-core/propr/propd/environment.yml b/modules/nf-core/propr/propd/environment.yml new file mode 100644 index 00000000..9744dab9 --- /dev/null +++ b/modules/nf-core/propr/propd/environment.yml @@ -0,0 +1,7 @@ +channels: + - conda-forge + - bioconda + +dependencies: + - bioconda::bioconductor-limma=3.58.1 + - conda-forge::r-propr=5.1.5 diff --git a/modules/nf-core/propr/propd/main.nf b/modules/nf-core/propr/propd/main.nf new file mode 100644 index 00000000..54b81c8e --- /dev/null +++ b/modules/nf-core/propr/propd/main.nf @@ -0,0 +1,30 @@ +process PROPR_PROPD { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/b6/b65f7192866fbd9a947df15b104808abb720e7a224bbe3ca8f7f8f680f52c97a/data' : + 'community.wave.seqera.io/library/bioconductor-limma_r-propr:f52f1d4fea746393' }" + + input: + tuple val(meta), val(contrast_variable), val(reference), val(target) + tuple val(meta2), path(samplesheet), path(counts) + + output: + tuple val(meta), path("*.propd.genewise.tsv") , emit: results_genewise + tuple val(meta), path("*.propd.genewise.png") , emit: genewise_plot + tuple val(meta), path("*.propd.rds") , emit: rdata , optional:true + tuple val(meta), path("*.propd.pairwise.tsv") , emit: results_pairwise , optional:true + tuple val(meta), path("*.propd.pairwise_filtered.tsv"), emit: results_pairwise_filtered, optional:true + tuple val(meta), path("*.propd.adjacency.csv") , emit: adjacency , optional:true + tuple val(meta), path("*.propd.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 'propd.R' +} diff --git a/modules/nf-core/propr/propd/meta.yml b/modules/nf-core/propr/propd/meta.yml new file mode 100644 index 00000000..57f1521f --- /dev/null +++ b/modules/nf-core/propr/propd/meta.yml @@ -0,0 +1,172 @@ +name: "propr_propd" +description: Perform differential proportionality analysis +keywords: + - differential + - proportionality + - logratio + - expression + - propr + - propd +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"] + identifier: biotools:propr +input: + - - meta: + type: map + description: | + Groovy Map containing contrast information. This can be used at the + workflow level to pass optional parameters to the module, e.g. + [ id:'contrast1', blocking:'patient' ] passed in as ext.args like: + '--blocking_variable $meta.blocking'. + - contrast_variable: + type: string + description: | + The column in the sample sheet that should be used to define groups for + comparison + - reference: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the reference samples + - target: + type: string + description: | + The value within the contrast_variable column of the sample sheet that + should be used to derive the target samples + - - meta2: + type: map + description: | + Groovy map containing study-wide metadata related to the sample sheet + and matrix + - samplesheet: + type: file + description: | + CSV or TSV format sample sheet with sample metadata + - counts: + type: file + description: | + Raw TSV or CSV format expression matrix as output from the nf-core + RNA-seq workflow +output: + - results_genewise: + - meta: + type: file + description: | + TSV-format table of genes associated with differential expression + information as compiled from the propd results + pattern: "*.propd.genewise.tsv" + - "*.propd.genewise.tsv": + type: file + description: | + TSV-format table of genes associated with differential expression + information as compiled from the propd results + pattern: "*.propd.genewise.tsv" + - genewise_plot: + - meta: + type: file + description: | + PNG-format plot of accumulated between group variance vs median log + fold change. Genes with high between group variance and high log fold + change are likely to be differentially expressed. + pattern: "*.propd.genewise.png" + - "*.propd.genewise.png": + type: file + description: | + PNG-format plot of accumulated between group variance vs median log + fold change. Genes with high between group variance and high log fold + change are likely to be differentially expressed. + pattern: "*.propd.genewise.png" + - rdata: + - meta: + type: file + description: | + (Optional) R data containing propd object + pattern: "*.propd.rds" + - "*.propd.rds": + type: file + description: | + (Optional) R data containing propd object + pattern: "*.propd.rds" + - results_pairwise: + - meta: + type: file + description: | + (Optional) TSV-format table of the native propd pairwise results. This + table contains the differential proportionality values associated to + each pair of genes. + pattern: "*.propd.pairwise.tsv" + - "*.propd.pairwise.tsv": + type: file + description: | + (Optional) TSV-format table of the native propd pairwise results. This + table contains the differential proportionality values associated to + each pair of genes. + pattern: "*.propd.pairwise.tsv" + - results_pairwise_filtered: + - meta: + type: file + description: | + (Optional) TSV-format table of the filtered propd pairwise results. This + table contains the pairs of genes with significant differential + proportionality values. + pattern: "*.propd.pairwise_filtered.tsv" + - "*.propd.pairwise_filtered.tsv": + type: file + description: | + (Optional) TSV-format table of the filtered propd pairwise results. This + table contains the pairs of genes with significant differential + proportionality values. + pattern: "*.propd.pairwise_filtered.tsv" + - adjacency: + - meta: + type: file + description: | + (Optional) CSV-format table of the adjacency matrix defining a graph, with + edges (1) associated to pairs of genes that are significantly differentially + proportional. + pattern: "*.propd.adjacency.csv" + - "*.propd.adjacency.csv": + type: file + description: | + (Optional) CSV-format table of the adjacency matrix defining a graph, with + edges (1) associated to pairs of genes that are significantly differentially + proportional. + pattern: "*.propd.adjacency.csv" + - fdr: + - meta: + type: file + description: | + (Optional) TSV-format table of FDR values. When permutation tests is performed, + this table is generated with the FDR values calculated by the permutation tests. + This is a more conservative test than the default BH method, but more + computationally expensive. + pattern: "*.propd.fdr.tsv" + - "*.propd.fdr.tsv": + type: file + description: | + (Optional) TSV-format table of FDR values. When permutation tests is performed, + this table is generated with the FDR values calculated by the permutation tests. + This is a more conservative test than the default BH method, but more + computationally expensive. + pattern: "*.propd.fdr.tsv" + - session_info: + - "*.R_sessionInfo.log": + type: file + description: dump of R SessionInfo + pattern: "*.R_sessionInfo.log" + - versions: + - versions.yml: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@suzannejin" + - "@caraiz2001" +maintainers: + - "@suzannejin" diff --git a/modules/nf-core/propr/propd/templates/propd.R b/modules/nf-core/propr/propd/templates/propd.R new file mode 100644 index 00000000..d75e3d2c --- /dev/null +++ b/modules/nf-core/propr/propd/templates/propd.R @@ -0,0 +1,725 @@ +#!/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 + ) +} + +#' Get genewise table with logfold changes and connectivity information +#' +#' This function calculates the logfold changes of genes with respect to the reference set, +#' which is dynamically defined as the set of genes that are significantly proportional to +#' each target gene. Note that the output table will only contain genes that are significantly +#' proportional to at least one other gene. +#' +#' @param results Data frame with significant pairs +#' @return Data frame with the following columns: +#' - lfc = overall logfold change of the gene with respect to the reference set +#' - lfc_error = median average deviation of the logfold changes -> this reflects the error +#' - connectivity = size of the reference set -> this also reflects the connectivity of the gene +# - weighted_connectivity = this reflects the weighted connectivity of the gene, so the lower +#' the theta the closer to 1 full connectivity. One can also interpret this as the accumulated +#' between group variance of the gene (as the theta values reflects the between group variance +#' vs within group variance). +get_genewise_information <- function(results) { + + message("Alert: Genewise information is computed based on pairwise ratios.") + + # get unique genes + + genes <- unique(c(results\$Pair, results\$Partner)) + n_genes <- length(genes) + + # create empty matrix + + mat <- data.frame( + 'features_id_col' = character(n_genes), + lfc = numeric(n_genes), + lfc_error = numeric(n_genes), + connectivity = numeric(n_genes), + weighted_connectivity = numeric(n_genes) + ) + colnames(mat) <- c(opt\$features_id_col, 'lfc', 'lfc_error', 'connectivity', 'weighted_connectivity') + mat[, 1] <- genes + + i <- 0 + for (gene in genes){ + i <- i + 1 + + # get rows with this gene involved + # NOTE that gene can be a partner or a pair and we have to consider both cases. + # NOTE that reference set is the set of genes that are partners or pairs of the gene. + # In other words, the set of genes that are significantly proportional to the gene, + # hence connected to the gene in the network. + + idx1 <- which(results[,1] == gene) + idx2 <- which(results[,2] == gene) + reference_idx <- union(idx1, idx2) + + # calculate logfold changes of the gene with respect to the reference set + # Differently to the approach usually implemented in methods like DESeq2, + # here we have a dynamic reference defined by all the genes significantly proportional to the target gene. + + logfoldchange1 <- results[idx1, 'lrm1'] - results[idx1, 'lrm2'] + logfoldchange2 <- results[idx2, 'lrm2'] - results[idx2, 'lrm1'] + logfoldchanges <- union(logfoldchange1, logfoldchange2) + + # fill in matrix values + + mat[i, 'lfc'] <- median(logfoldchanges) + mat[i, 'lfc_error'] <- mad(logfoldchanges) + mat[i, 'connectivity'] <- length(reference_idx) + mat[i, 'weighted_connectivity'] <- sum(1 - results[reference_idx, 'theta']) + } + + return(mat) +} + +#' Plot genewise information +#' +#' This function plots the genewise information, which is a scatter plot of the logfold changes +#' of the genes with respect to the reference set (x-axis) and the accumulated between group variance +#' of the genes (y-axis). The accumulated between group variance is calculated as the sum of 1 - theta +#' values of the genes that are significantly proportional to the target gene. This can be interpreted +#' as the weighted connectivity of the gene in the network. +#' +#' @param results Data frame with genewise information +#' @param output Output png file name +plot_genewise_information <- function(results, output) { + + # create figure + png(output, width=1200, height=600) # Adjust width to accommodate two plots side by side + par(mfrow = c(1, 2)) + + # plot scatter plot with normal y-axis + plot( + results\$lfc, + results\$weighted_connectivity, + xlab = 'Logfold change', + ylab = 'Accumulated between group variance', + main = 'Normal Y-axis' + ) + + # plot scatter plot with log10 y-axis + plot( + results\$lfc, + results\$weighted_connectivity, + xlab = 'Logfold change', + ylab = 'Accumulated between group variance', + log = 'y', + main = 'Log10 Y-axis' + ) + + dev.off() +} + +################################################ +################################################ +## Parse arguments ## +################################################ +################################################ + +# Set defaults and classes + +opt <- list( + prefix = ifelse('$task.ext.prefix' == 'null', '$meta.id', '$task.ext.prefix'), + + # input count matrix + counts = '$counts', + features_id_col = 'gene_id', # column name of feature ids + + # comparison groups + samplesheet = '$samplesheet', + obs_id_col = 'sample', # column name of observation ids + contrast_variable = "$contrast_variable", # column name of contrast variable + reference_group = "$reference", # reference group for contrast variable + target_group = "$target", # target group for contrast variable + + # parameters for computing differential proportionality + alpha = NA, # alpha for boxcox transformation + moderated = TRUE, # use moderated theta + + # parameters for getting the significant differentially proportional pairs + fdr = 0.05, # FDR threshold + permutation = 0, # if permutation > 0, use permutation test to compute FDR + number_of_cutoffs = 100, # number of cutoffs for permutation test + + # saving options + # note that pairwise outputs are very large, so it is recommended to save them only when needed + save_pairwise_full = FALSE, # save full pairwise results + save_pairwise = FALSE, # save filtered pairwise results + save_adjacency = FALSE, # save adjacency matrix + save_rdata = FALSE, # save rdata + + # other parameters + seed = NA, # seed for reproducibility + round_digits = NA, # number of digits to round results + ncores = as.integer('$task.cpus') +) + +opt_types <- list( + prefix = 'character', + counts = 'character', + samplesheet = 'character', + features_id_col = 'character', + obs_id_col = 'character', + contrast_variable = 'character', + reference_group = 'character', + target_group = 'character', + alpha = 'numeric', + moderated = 'logical', + fdr = 'numeric', + permutation = 'numeric', + number_of_cutoffs = 'numeric', + save_pairwise_full = 'logical', + save_pairwise = 'logical', + save_adjacency = 'logical', + save_rdata = 'logical', + seed = 'numeric', + round_digits = 'numeric', + ncores = 'numeric' +) + +# Apply parameter overrides + +args_ext <- ifelse('$task.ext.args' == 'null', '', '$task.ext.args') +args_opt <- parse_args(args_ext) +for ( ao in names(args_opt)){ + if (! ao %in% names(opt)){ + stop(paste("Invalid option:", ao)) + } else { + + # Preserve classes from defaults where possible + args_opt[[ao]] <- as(args_opt[[ao]], opt_types[[ao]]) + + # handle NA, and avoid errors when NA is provided by user as character + if (args_opt[[ao]] %in% c('NA', NA)) args_opt[[ao]] <- NA + + # replace values + opt[[ao]] <- args_opt[[ao]] + } +} + +# Check if required parameters have been provided + +required_opts <- c('counts','samplesheet','contrast_variable','reference_group','target_group') +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('counts','samplesheet')){ + 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 are valid + +if (opt\$permutation < 0) { + stop('permutation should be a positive integer') +} + +print(opt) + +################################################ +################################################ +## Finish loading libraries ## +################################################ +################################################ + +library(propr) + +################################################ +################################################ +## Load data ## +################################################ +################################################ + +# set seed when required + +if (!is.na(opt\$seed)) { + warning('Setting seed ', opt\$seed, ' for reproducibility') + set.seed(opt\$seed) +} + +# read input matrix + +counts <- read_delim_flexible( + opt\$counts, + header = TRUE, + row.names = opt\$features_id_col, + check.names = FALSE +) +counts <- t(counts) # transpose matrix to have features (genes) as columns + +# read input samplesheet + +samplesheet <- read_delim_flexible( + opt\$samplesheet, + header = TRUE, + row.names = opt\$obs_id_col, + check.names = FALSE +) + +# Check that all samples specified in the input samplesheet are present in the counts +# table. Assuming they are, subset and sort the count table to match the samplesheet + +missing_samples <- + samplesheet[!rownames(samplesheet) %in% rownames(counts), opt\$sample_id_col] + +if (length(missing_samples) > 0) { + stop(paste( + length(missing_samples), + 'specified samples missing from count table:', + paste(missing_samples, collapse = ',') + )) +} else{ + counts <- counts[rownames(samplesheet),] # this will remove non-sample columns, such as metadata columns + counts <- apply(counts, 2, as.numeric) # if there is a column with non-numeric values, the rest of the matrix will be coerced to character. This will convert it back to numeric +} + +# parse group and filter matrix and group values, keeping only the contrasted groups +# TODO propd can also handle more than two groups but that don't work properly with +# the current contrast format. Should we provide an alternative way to do that? + +idx <- which(samplesheet[,opt\$contrast_variable] %in% c(opt\$reference_group, opt\$target_group)) +counts <- counts[idx,] +samplesheet <- samplesheet[idx,] +group <- as.vector(samplesheet[,opt\$contrast_variable]) +group <- as.character(group) +if (length(group) != nrow(counts)) stop('Error when parsing group') +if (length(unique(group)) != 2) stop('Only two groups are allowed for contrast') + +################################################ +################################################ +## Perform differential proportionality ## +################################################ +################################################ + +# calculate the differential proportionality theta values + +pd <- propd( + counts, + group = group, + alpha = opt\$alpha, + weighted = FALSE, + p = opt\$permutation +) + +# calculate theta moderated, when required +# and calculate F-stat + +pd <- updateF( + pd, + moderated = opt\$moderated +) +if (opt\$moderated) pd <- setActive(pd, what='theta_mod') + +# get significant results based on the FDR-adjusted F-stat p-values, if permutation == 0 +# otherwise get them based on the FDR obtained from permutation tests (more computationally expensive but likely more conservative FDRs) + +if (opt\$permutation == 0) { + + warning('FDR-adjusted p-values are used to get significant pairs.') + + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. + + theta_cutoff <- getCutoffFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + if (opt\$save_adjacency) { + adj <- getAdjacencyFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + } + + # get significant pairs + + results_pairwise <- getSignificantResultsFstat( + pd, + pval = opt\$fdr, + fdr_adjusted = TRUE + ) + + # parse genewise information from pairwise results + + results_genewise <- get_genewise_information(results_pairwise) + } + +} else { + + warning('Permutation tests are used to compute FDR values.') + + # calculate FDR values using permutation tests + # This test is computationally expensive but it is likely to + # provide more conservative FDR values. + # This part will call the updateCutoffs function iteratively + # as far as it does not find a meaningful theta value + # and does not reach the maximum number of iterations. + + fdr_table <- data.frame( + 'cutoff' = numeric(0), + 'randcounts' = numeric(0), + 'truecounts' = numeric(0), + 'FDR' = numeric(0) + ) + theta_cutoff <- FALSE + max_cutoff <- 1 + ntry <- 0 + while (!theta_cutoff & max_cutoff > 0 & ntry < 10) { + ntry <- ntry + 1 + + # get a list of theta values served as cutoff to calculate the FDR values + # Given a theta value as cutoff, the FDR is defined as the proportion of + # false positives obtained from the null distribution vs the total number + # of positives obtained from the real data. + + cutoffs <- as.numeric(quantile( + pd@results[pd@results\$theta < max_cutoff, 'theta'], + seq(0, 1, length.out = opt\$number_of_cutoffs) + )) + + # update FDR values + + pd <- updateCutoffs( + pd, + custom_cutoffs = cutoffs, + ncores = opt\$ncores + ) + fdr_table <- rbind( + pd@fdr[pd@fdr\$cutoff < max_cutoff,], + fdr_table + ) + + # get theta value for which FDR is below desired threshold + # theta_cutoff is FALSE when no theta value has FDR below desired threshold + # otherwise it is the theta value for which FDR is below desired threshold + # Only when there is a meaningful theta, we can compute the next steps + # that involve extracting the significant pairs. + + theta_cutoff <- getCutoffFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + + # update maximum theta value to test the FDR values for the next iteration + + part <- pd@fdr[which(pd@fdr\$truecounts > 0),] + max_cutoff <- ifelse(nrow(part) > 1, min(part\$cutoff), 0) + } + + if (theta_cutoff) { + + warning('Significant theta value found: ', theta_cutoff) + + # get adjacency matrix + # this matrix will have 1s for significant pairs and 0s for the rest + # diagonals are set to 0 + + if (opt\$save_adjacency) { + adj <- getAdjacencyFDR( + pd, + fdr=opt\$fdr, + window_size=1 + ) + } + + # get significant pairs + + results_pairwise <- getSignificantResultsFDR( + pd, + fdr = opt\$fdr, + window_size = 1 + ) + + # parse genewise information from pairwise results + + results_genewise <- get_genewise_information(results_pairwise) + } +} + +# deal with the situation when no significant thetas are found +# For the moment, we just create empty tables with the same data structure + +if (!theta_cutoff) { + warning('No theta value has FDR below desired threshold.') + + # create empty adjacency matrix + + if (opt\$save_adjacency) { + adj <- matrix(0, nrow=ncol(counts), ncol=ncol(counts)) + colnames(adj) <- rownames(adj) <- colnames(counts) + } + + # create empty pairwise results table + + if (opt\$save_pairwise) { + results <- data.frame( + 'Pair' = character(0), + 'Partner' = character(0), + 'theta' = numeric(0), + 'Fstat' = numeric(0), + 'Pval' = numeric(0), + 'FDR' = numeric(0) + ) + results_pairwise <- results + } + + # create empty genewise results table + + results_genewise <- data.frame( + 'features_id_col' = character(0), + lfc = numeric(0), + lfc_error = numeric(0), + connectivity = numeric(0), + weighted_connectivity = numeric(0) + ) + colnames(results_genewise) <- c(opt\$features_id_col, 'lfc', 'lfc_error', 'connectivity', 'weighted_connectivity') + +} + +################################################ +################################################ +## Generate outputs ## +################################################ +################################################ + +# save plot of genewise information +# save empty plot if no DE genes were found + +if (nrow(results_genewise) > 0) { + plot_genewise_information( + results_genewise, + paste0(opt\$prefix, '.propd.genewise.png') + ) +} else { + warning('No genewise information to plot.') + png(paste0(opt\$prefix, '.propd.genewise.png')) + plot.new() + dev.off() +} + +# save main results - genewise + +results_genewise <- results_genewise[order( + results_genewise\$weighted_connectivity, + abs(results_genewise\$lfc), + decreasing = TRUE +),] + +if (!is.na(opt\$round_digits)) { + cols <- sapply(results_genewise, is.numeric) + results_genewise[,cols] <- round( + results_genewise[,cols], + digits = opt\$round_digits + ) +} + +write.table( + results_genewise, + file = paste0(opt\$prefix, '.propd.genewise.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE +) + +# save rdata, if required + +if (opt\$save_rdata) { + saveRDS( + pd, + file = paste0(opt\$prefix, '.propd.rds') + ) +} + +# save pairwise results, if required + +if (opt\$save_pairwise) { + + # unfiltered pairwise results table + + if (opt\$save_pairwise_full) { + results <- getResults(pd) + rm(pd) + results <- results[order( + results\$theta, + results\$FDR + ), c('Pair', 'Partner', 'theta', 'Fstat', 'Pval', 'FDR')] + + if (!is.na(opt\$round_digits)) { + cols <- sapply(results, is.numeric) + results[,cols] <- round( + results[,cols], + digits = opt\$round_digits + ) + } + + write.table( + results, + file = paste0(opt\$prefix, '.propd.pairwise.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) + } + + # filtered pairwise results table + + results_pairwise <- results_pairwise[order( + results_pairwise\$theta, + results_pairwise\$FDR + ), c('Pair', 'Partner', 'theta', 'Fstat', 'Pval', 'FDR')] + + if (!is.na(opt\$round_digits)) { + cols <- sapply(results_pairwise, is.numeric) + results_pairwise[,cols] <- round( + results_pairwise[,cols], + digits = opt\$round_digits + ) + } + + write.table( + results_pairwise, + file = paste0(opt\$prefix, '.propd.pairwise_filtered.tsv'), + col.names = TRUE, + row.names = FALSE, + sep = '\\t', + quote = FALSE + ) +} + +# save adjacency matrix, if required + +if (opt\$save_adjacency) { + write.table( + adj, + file = paste0(opt\$prefix, '.propd.adjacency.csv'), + col.names = TRUE, + row.names = TRUE, + sep = ',', + quote = FALSE + ) +} + +# save FDR values, if permutation tests were run + +if (opt\$permutation > 0) { + fdr_table <- fdr_table[order(fdr_table\$cutoff),] + + if (!is.na(opt\$round_digits)) { + fdr_table\$FDR <- round( + fdr_table\$FDR, + digits = opt\$round_digits + ) + } + + write.table( + fdr_table, + file = paste0(opt\$prefix, '.propd.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 ## +################################################ +################################################ + +propr.version <- as.character(packageVersion('propr')) + +writeLines( + c( + '"${task.process}":', + paste(' r-propr:', propr.version) + ), +'versions.yml') + +################################################ +################################################ +################################################ +################################################ diff --git a/modules/nf-core/propr/propd/tests/boxcox.config b/modules/nf-core/propr/propd/tests/boxcox.config new file mode 100644 index 00000000..f288b876 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/boxcox.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--alpha 0.1 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/default.config b/modules/nf-core/propr/propd/tests/default.config new file mode 100644 index 00000000..ee1ed788 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/default.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/main.nf.test b/modules/nf-core/propr/propd/tests/main.nf.test new file mode 100755 index 00000000..ed0de177 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test @@ -0,0 +1,176 @@ +nextflow_process { + + name "Test Process PROPR_PROPD" + script "../main.nf" + process "PROPR_PROPD" + + tag "modules" + tag "modules_nfcore" + tag "propr" + tag "propr/propd" + + test("Test propr/propd using default params") { + + tag "default" + config "./default.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when saving all outputs") { + + tag "save_all" + config "./save_all.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.results_pairwise, + process.out.results_pairwise_filtered, + process.out.results_adjacency, + process.out.versions, + file(process.out.genewise_plot[0][1]).name, + file(process.out.rdata[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when using Box-cox transformation") { + + tag "boxcox" + config "./boxcox.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } + + test("Test propr/propd when using permutation tests") { + + tag "permutation" + config "./permutation.config" + + when { + process { + """ + expression_test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/' + + ch_contrasts = Channel.fromPath(file(expression_test_data_dir + 'SRP254919.contrasts.csv', checkIfExists: true)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + .first() + ch_matrix = [ + [id: 'test'], + file(expression_test_data_dir + 'SRP254919.samplesheet.csv', checkIfExists: true), + file(expression_test_data_dir + 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', checkIfExists: true) + ] + + input[0] = ch_contrasts + input[1] = ch_matrix + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.results_genewise, + process.out.fdr, + process.out.versions, + file(process.out.genewise_plot[0][1]).name + ).match()} + ) + } + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/main.nf.test.snap b/modules/nf-core/propr/propd/tests/main.nf.test.snap new file mode 100644 index 00000000..318a5f0b --- /dev/null +++ b/modules/nf-core/propr/propd/tests/main.nf.test.snap @@ -0,0 +1,140 @@ +{ + "Test propr/propd using default params": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:11:40.654796611" + }, + "Test propr/propd when using Box-cox transformation": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,6e8f9c57051a286b85cee317a87c8162" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:12:22.252395938" + }, + "Test propr/propd when using permutation tests": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,0ae150edfbd22a35f9ed1c7213217579" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.fdr.tsv:md5,9c7011afa34a2ce7e33da9a6a6820c7e" + ] + ], + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:13:03.55054778" + }, + "Test propr/propd when saving all outputs": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.pairwise.tsv:md5,ff79479ea826c54aa178b0376784cbf1" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6_", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "" + }, + "treatment_mCherry_hND6_.propd.pairwise_filtered.tsv:md5,9473f045ca1acfe1f9d6138528f743d1" + ] + ], + null, + [ + "versions.yml:md5,1d96e70c16cc53a1d7b2e1a54fd8b7e8" + ], + "treatment_mCherry_hND6_.propd.genewise.png", + "treatment_mCherry_hND6_.propd.rds" + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.1" + }, + "timestamp": "2024-11-27T10:12:01.936451896" + } +} \ No newline at end of file diff --git a/modules/nf-core/propr/propd/tests/permutation.config b/modules/nf-core/propr/propd/tests/permutation.config new file mode 100644 index 00000000..c7718a74 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/permutation.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--permutation 10 --number_of_cutoffs 10 --seed 123 --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/save_all.config b/modules/nf-core/propr/propd/tests/save_all.config new file mode 100644 index 00000000..ba7edfd5 --- /dev/null +++ b/modules/nf-core/propr/propd/tests/save_all.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--save_pairwise_full true --save_pairwise true --save_adjacency true --save_rdata true --round_digits 5"} + } +} diff --git a/modules/nf-core/propr/propd/tests/tags.yml b/modules/nf-core/propr/propd/tests/tags.yml new file mode 100755 index 00000000..ba65ca0a --- /dev/null +++ b/modules/nf-core/propr/propd/tests/tags.yml @@ -0,0 +1,2 @@ +propr/propd: + - "modules/nf-core/propr/propd/**" diff --git a/subworkflows/nf-core/abundance_differential_filter/main.nf b/subworkflows/nf-core/abundance_differential_filter/main.nf new file mode 100644 index 00000000..d2617fb5 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/main.nf @@ -0,0 +1,197 @@ +// +// Perform differential analysis +// + +include { LIMMA_DIFFERENTIAL } from '../../../modules/nf-core/limma/differential/main' +include { LIMMA_DIFFERENTIAL as LIMMA_NORM } from '../../../modules/nf-core/limma/differential/main' +include { DESEQ2_DIFFERENTIAL } from '../../../modules/nf-core/deseq2/differential/main' +include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../../../modules/nf-core/deseq2/differential/main' +include { PROPR_PROPD } from '../../../modules/nf-core/propr/propd/main' +include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../../../modules/nf-core/custom/filterdifferentialtable/main' + +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} + +workflow ABUNDANCE_DIFFERENTIAL_FILTER { + take: + // Things we may need to iterate + ch_input // [[meta_input], counts, analysis method, fc_threshold, stat_threshold] + + // Workflow-wide things, we don't need to iterate + ch_samplesheet // [ meta_exp, samplesheet ] + ch_transcript_lengths // [ meta_exp, transcript_lengths] + ch_control_features // [meta_exp, control_features] + ch_contrasts // [[ meta_contrast, contrast_variable, reference, target ]] + + main: + + // Set up how the channels crossed below will be used to generate channels for processing + def criteria = multiMapCriteria { meta_input, abundance, analysis_method, fc_threshold, stat_threshold, meta_exp, samplesheet, meta_contrasts, variable, reference, target -> + def meta_for_diff = mergeMaps(meta_contrasts, meta_input) + [ 'method': analysis_method ] + def meta_input_new = meta_input + [ 'method': analysis_method ] + samples_and_matrix: + [ meta_input_new, samplesheet, abundance ] + contrasts_for_diff: + [ meta_for_diff, variable, reference, target ] + filter_params: + [ meta_for_diff, [ 'fc_threshold': fc_threshold, 'stat_threshold': stat_threshold ]] + contrasts_for_norm: + [ meta_input_new, variable, reference, target ] + } + + // For DIFFERENTIAL modules we need to cross the things we're iterating so we + // run differential analysis for every combination of matrix and contrast + inputs = ch_input + .combine(ch_samplesheet) + .combine(ch_contrasts) + .multiMap(criteria) + + // We only need a normalised matrix from one contrast. The reason we don't + // simply use the first output from DIFFERENTIAL modules is that depending + // on the contrast setting etc, these modules may subset matrices, hence + // not returning the full normalized matrix as NORM modules would do. + norm_inputs = ch_input + .combine(ch_samplesheet) + .combine(ch_contrasts.first()) // Just taking the first contrast + .multiMap(criteria) + + // ---------------------------------------------------- + // Run Limma + // ---------------------------------------------------- + + // NOTE that we run LIMMA_NORM just once to generate a normalised matrix. + // As explained above, this is done to avoid obtaining a subset matrix + // from LIMMA_DIFFERENTIAL. + + // Also NOTE that LIMMA_DIFFERENTIAL don't use the normalized matrix from + // LIMMA_NORM directly. It internally runs normalization + DE analysis. + + LIMMA_NORM( + norm_inputs.contrasts_for_norm.filter{it[0].method == 'limma'}, + norm_inputs.samples_and_matrix.filter{it[0].method == 'limma'} + ) + + LIMMA_DIFFERENTIAL( + inputs.contrasts_for_diff.filter{ it[0].method == 'limma' }, + inputs.samples_and_matrix.filter{ it[0].method == 'limma' } + ) + + // ---------------------------------------------------- + // Run DESeq2 + // ---------------------------------------------------- + + // NOTE that we run DESEQ2_NORM just once to generate a normalised matrix. + // As explained above, this is done to avoid obtaining a subset matrix + // from DESEQ2_DIFFERENTIAL. + + // Also NOTE that DESEQ2_DIFFERENTIAL don't use the normalized matrix from + // DESEQ2_NORM directly. It internally runs normalization + DE analysis. + + DESEQ2_NORM( + norm_inputs.contrasts_for_norm.filter{it[0].method == 'deseq2'}, + norm_inputs.samples_and_matrix.filter{it[0].method == 'deseq2'}, + ch_control_features.first(), + ch_transcript_lengths.first() + ) + + DESEQ2_DIFFERENTIAL( + inputs.contrasts_for_diff.filter{it[0].method == 'deseq2'}, + inputs.samples_and_matrix.filter{it[0].method == 'deseq2'}, + ch_control_features.first(), + ch_transcript_lengths.first() + ) + + // ---------------------------------------------------- + // Run propd + // ---------------------------------------------------- + + // NOTE that this method don't rely on normalization, hence it does + // not produce a normalized matrix. + + PROPR_PROPD( + inputs.contrasts_for_diff.filter{it[0].method == 'propd'}, + inputs.samples_and_matrix.filter { it[0].method == 'propd' } + ) + + // ---------------------------------------------------- + // Collect results + // ---------------------------------------------------- + + ch_results = DESEQ2_DIFFERENTIAL.out.results + .mix(LIMMA_DIFFERENTIAL.out.results) + .mix(PROPR_PROPD.out.results_genewise) + + ch_normalised_matrix = DESEQ2_NORM.out.normalised_counts + .mix(LIMMA_NORM.out.normalised_counts) + + ch_model = DESEQ2_DIFFERENTIAL.out.model + .mix(LIMMA_DIFFERENTIAL.out.model) + + ch_variance_stabilised_matrix = DESEQ2_NORM.out.rlog_counts.ifEmpty([[],[]]) + .mix(DESEQ2_NORM.out.vst_counts.ifEmpty([[],[]])) + .groupTuple() + .filter{ meta, files -> meta != [] } + + ch_versions = DESEQ2_DIFFERENTIAL.out.versions + .mix(LIMMA_DIFFERENTIAL.out.versions) + .mix(PROPR_PROPD.out.versions) + + // ---------------------------------------------------- + // Filter DE results + // ---------------------------------------------------- + + ch_diff_filter_params = ch_results + .join(inputs.filter_params) + .multiMap { meta, results, filter_meta -> + def method_params = [ + 'deseq2': [ + fc_column: 'log2FoldChange', fc_cardinality: '>=', + stat_column: 'padj', stat_cardinality: '<=' + ], + 'limma' : [ + fc_column: 'logFC', fc_cardinality: '>=', + stat_column: 'adj.P.Val', stat_cardinality: '<=' + ], + 'propd' : [ + fc_column: 'lfc', fc_cardinality: '>=', + stat_column: 'weighted_connectivity', stat_cardinality: '>=' + ] + ] + filter_input: [meta + filter_meta, results] + fc_input: [ + method_params[meta.method].fc_column, + filter_meta.fc_threshold, + method_params[meta.method].fc_cardinality + ] + stat_input: [ + method_params[meta.method].stat_column, + filter_meta.stat_threshold, + method_params[meta.method].stat_cardinality + ] + } + + // Filter differential results + CUSTOM_FILTERDIFFERENTIALTABLE( + ch_diff_filter_params.filter_input, + ch_diff_filter_params.fc_input, + ch_diff_filter_params.stat_input + ) + + emit: + // main results + results_genewise = ch_results + results_genewise_filtered = CUSTOM_FILTERDIFFERENTIALTABLE.out.filtered + + // pairwise results + adjacency = PROPR_PROPD.out.adjacency + + // other + normalised_matrix = ch_normalised_matrix + variance_stabilised_matrix = ch_variance_stabilised_matrix + model = ch_model + versions = ch_versions +} diff --git a/subworkflows/nf-core/abundance_differential_filter/meta.yml b/subworkflows/nf-core/abundance_differential_filter/meta.yml new file mode 100644 index 00000000..cc22f805 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/meta.yml @@ -0,0 +1,140 @@ +input: + - ch_input: + description: Channel with input data for differential analysis + structure: + - meta_input: + type: map + description: Metadata map + - counts: + type: file + description: Count matrix file + - analysis_method: + type: value + description: Analysis method (deseq2, limma, or propd) + - fc_threshold: + type: value + description: Fold change threshold for filtering + - stat_threshold: + type: value + description: | + Threshold for filtering the significance statistics + (eg. adjusted p-values in the case of deseq2 or limma, + weighted connectivity in the case of propd) + - ch_samplesheet: + description: Channel with sample information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - samplesheet: + type: file + description: Sample information file + - ch_transcript_lengths: + description: Channel with transcript length information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - transcript_lengths: + type: file + description: Transcript length information file + - ch_control_features: + description: Channel with control features information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - control_features: + type: file + description: Control features information file + - ch_contrasts: + description: Channel with contrast information + structure: + - meta_contrast: + type: map + description: Contrast metadata map + - contrast_variable: + type: value + description: Contrast variable + - reference: + type: value + description: Reference level + - target: + type: value + description: Target level + +output: + - versions: + description: Channel containing software versions file + structure: + - versions.yml: + type: file + description: File containing versions of the software used + - results_genewise: + description: Channel containing unfiltered differential analysis results + structure: + - meta: + type: map + description: Metadata map + - results: + type: file + description: Unfiltered differential analysis results file + pattern: "*.{csv,tsv}" + - results_genewise_filtered: + description: Channel containing filtered differential analysis results + structure: + - meta: + type: map + description: Metadata map + - filtered_results: + type: file + description: Filtered differential analysis results file + pattern: "*.{csv,tsv}" + - adjacency: + description: Channel containing the adjacency matrix suited for downstream graph-based functional analysis + structure: + - meta: + type: map + description: Metadata map + - adjacency_matrix: + type: file + description: Adjacency matrix file + pattern: "*.{csv,tsv}" + - normalised_matrix: + description: Channel containing normalised count matrix + structure: + - meta: + type: map + description: Metadata map + - matrix: + type: file + description: Normalised count matrix file + pattern: "*.{csv,tsv}" + - variance_stabilised_matrix: + description: Channel containing variance stabilised count matrix (DESeq2 only) + structure: + - meta: + type: map + description: Metadata map + - matrix: + type: file + description: Variance stabilised count matrix file + pattern: "*.{csv,tsv}" + - model: + description: Channel containing statistical model object from differential analysis + structure: + - meta: + type: map + description: Metadata map + - model: + type: file + description: Statistical model object file + pattern: "*.rds" +authors: + - "@pinin4fjords" + - "@bjlang" + - "@caraiz2001" + - "@suzannejin" +maintainers: + - "@pinin4fjords" + - "@suzannejin" diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config new file mode 100644 index 00000000..d6918e56 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_basic.config @@ -0,0 +1,14 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config new file mode 100644 index 00000000..14fcfefa --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_basic.config @@ -0,0 +1,28 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config new file mode 100644 index 00000000..dda5df4b --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/deseq2_limmavoom_propd_basic.config @@ -0,0 +1,33 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } + + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5 --save_adjacency true"} + ext.prefix = { "${meta.id}_${meta.method}" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config b/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config new file mode 100644 index 00000000..59eddbc3 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/limma_basic_microarray.config @@ -0,0 +1,22 @@ +process { + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--sample_id_col name", + "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm" } + } + + withName: 'AFFY_JUSTRMA' { + ext.args = "--sample_name_col name" + publishDir = [ enabled: false ] + } + withName: 'UNTAR' { + publishDir = [ enabled: false ] + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config b/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config new file mode 100644 index 00000000..241679da --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/limma_voom.config @@ -0,0 +1,17 @@ +process { + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } +} diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test new file mode 100644 index 00000000..500a2e80 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test @@ -0,0 +1,527 @@ +nextflow_workflow { + + name "Test Workflow ABUNDANCE_DIFFERENTIAL_FILTER" + script "../main.nf" + workflow "ABUNDANCE_DIFFERENTIAL_FILTER" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/abundance_differential_filter" + tag "custom/filterdifferentialtable" + tag "limma/differential" + tag "deseq2/differential" + tag "propr/propd" + tag "affy/justrma" + tag "untar" + + test("deseq2 - mouse - basic") { + config './deseq2_basic.config' + tag "deseq2_basic" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("limma - basic - microarray") { + config './limma_basic_microarray.config' + tag "limma_basic_microarray" + + setup { + run("UNTAR") { + script "../../../../modules/nf-core/untar/main.nf" + process { + """ + input[0] = [ + [id: 'test'], + file(params.modules_testdata_base_path + "genomics/homo_sapiens/array_expression/GSE38751_RAW.tar", checkIfExists: true) + ] + """ + } + } + run("AFFY_JUSTRMA") { + script "../../../../modules/nf-core/affy/justrma/main.nf" + process { + """ + ch_samplesheet = Channel.of([ + [ id:'test'], + file(params.modules_testdata_base_path + "genomics/homo_sapiens/array_expression/GSE38751.csv", checkIfExists: true) + ] + ) + input[0] = ch_samplesheet.join(UNTAR.out.untar) + input[1] = [[],[]] + """ + } + } + } + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/homo_sapiens/array_expression/', + contrasts_file: 'GSE38751.contrasts.csv', + samplesheet_file: 'GSE38751.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.of(['id': 'diagnosis_normal_uremia', 'variable': 'diagnosis', 'reference': 'normal', 'target': 'uremia']) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = AFFY_JUSTRMA.out.expression.map{ meta, file -> [ + meta, + file, + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]} + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("limma - voom") { + config './limma_voom.config' + tag "limma_voom" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert path(workflow.out.results_genewise[0][1]).getText().contains("ENSMUSG00000023978\t2.84055986312942") }, + { assert snapshot( + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 - with transcript lengths") { + config './deseq2_basic.config' + tag "deseq2_with_lengths" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv', + lengths_file: 'SRP254919.spoofed_lengths.tsv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.lengths_file) + ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("propd - mouse - basic") { + tag 'propd' + config './propd_basic.config' + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', // analysis method + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.adjacency, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 and limma - mouse - basic") { + config './deseq2_limmavoom_basic.config' + tag "deseq2+limmavoom" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.value([ [], [] ]) + ch_control_features = Channel.value([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("deseq2 + limma-voom + propd - mouse - basic") { + tag "deseq2+limmavoom+propd" + config './deseq2_limmavoom_propd_basic.config' + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.value([ [], [] ]) + ch_control_features = Channel.value([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot( + workflow.out.results_genewise, + workflow.out.results_genewise_filtered, + workflow.out.adjacency, + workflow.out.normalised_matrix, + workflow.out.variance_stabilised_matrix, + workflow.out.model, + workflow.out.versions + ).match() } + ) + } + } + + test("stub") { + config './deseq2_basic.config' + tag "stub" + + options "-stub" + + when { + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap new file mode 100644 index 00000000..6795359a --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/main.nf.test.snap @@ -0,0 +1,1091 @@ +{ + "limma - basic - microarray": { + "content": [ + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma" + }, + "diagnosis_normal_uremia_test_limma.limma.results.tsv:md5,4f0944b54b3ab7aa6ded5dd4b4e82802" + ] + ], + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "diagnosis_normal_uremia_test_filtered.tsv:md5,a971455ece4ae3c3ab902407b36fc6a5" + ] + ], + [ + + ], + [ + [ + { + "id": "diagnosis_normal_uremia_test", + "variable": "diagnosis", + "reference": "normal", + "target": "uremia", + "method": "limma" + }, + "diagnosis_normal_uremia_test_limma.limma.model.txt:md5,70b000f632b8bdba4917046362dd876b" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:51:17.162826924" + }, + "deseq2 and limma - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.results.tsv:md5,ff36827b7869a8a3c3c905efedcafc93" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.results.tsv:md5,5f34e79dbcb5ba1908d797548921d7fc" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:53:11.245100955" + }, + "limma - voom": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ] + ], + [ + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:51:32.460857013" + }, + "deseq2 + limma-voom + propd - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.results.tsv:md5,ff36827b7869a8a3c3c905efedcafc93" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test_propd.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.results.tsv:md5,5f34e79dbcb5ba1908d797548921d7fc" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test_propd.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test_propd.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test_propd.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ], + [ + { + "id": "test", + "method": "limma" + }, + "test_limma_voom_norm.normalised_counts.tsv:md5,2aa4880ba5ae246a728b25f4316ca2ca" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "limma" + }, + "treatment_mCherry_hND6__test_limma_voom.limma.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "limma" + }, + "treatment_mCherry_hND6_sample_number_test_limma_voom.limma.model.txt:md5,3b96713b4e3f027b0347859f02a9038d" + ] + ], + [ + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,1ddaab440e2528c688c05a02dd066f12", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:53:54.80697542" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "4": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "5": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "6": [ + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03", + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03" + ], + "adjacency": [ + + ], + "model": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.model.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "normalised_matrix": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.normalised_counts.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results_genewise": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test.deseq2.results.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "results_genewise_filtered": [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "variance_stabilised_matrix": [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test.rlog.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03", + "versions.yml:md5,05e3901f6d78f8839a7e07f422e9bc03" + ] + } + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:54:12.823125892" + }, + "deseq2 - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,791cdba2615a445cded13cae95df73ef" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,2438053a4bdc869f467a12d3c22c7ba7" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,7829ead408f4c9cad4277598a231c494" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,8b084475c9e7e1b34a510a73b613ff39" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,46ab7200c626649ab6256ed797ef5071" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,b1adc1fba6bd0c8b55973608f4b97030" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:50:35.085607799" + }, + "deseq2 - with transcript lengths": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.results.tsv:md5,944176b73455aa7c8de3ec32c03edef6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.results.tsv:md5,6a9bc76c9d54034c90fa159372f97516" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,a48241fb5f24d961d3cce208f060b624" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2", + "fc_threshold": 1.5, + "stat_threshold": 0.05 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,04d6911dce789f284c929694aa3d99b0" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.normalised_counts.tsv:md5,7050f44c460cc13e3f101d048d503527" + ] + ], + [ + [ + { + "id": "test", + "method": "deseq2" + }, + "test_deseq2_norm.rlog.tsv:md5,22a4b117246b2317e0f4daf7919703f2" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "deseq2" + }, + "treatment_mCherry_hND6__test_deseq2.deseq2.model.txt:md5,d2113d82b76046c319e6602da2ad74d6" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "deseq2" + }, + "treatment_mCherry_hND6_sample_number_test_deseq2.deseq2.model.txt:md5,fa05126a58cb67c107d45426b0bdea83" + ] + ], + [ + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5", + "versions.yml:md5,2c0576aefff8da32c7c0cfd8529aa4b5" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:52:07.822745077" + }, + "propd - mouse - basic": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test.propd.genewise.tsv:md5,bdc19a4b7430f248cd332287b630c872" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6__test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd", + "fc_threshold": 1.5, + "stat_threshold": 100 + }, + "treatment_mCherry_hND6_sample_number_test_filtered.tsv:md5,432b2ba4e63fd8f7e2aee74e5b71b0a5" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method": "propd" + }, + "treatment_mCherry_hND6__test.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method": "propd" + }, + "treatment_mCherry_hND6_sample_number_test.propd.adjacency.csv:md5,3a947ffd8172990c6207aa7561a41cb8" + ] + ], + [ + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622", + "versions.yml:md5,da1c8ede6b02429770a53b2556e20622" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-14T16:52:25.336720308" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config b/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config new file mode 100644 index 00000000..3c9167c4 --- /dev/null +++ b/subworkflows/nf-core/abundance_differential_filter/tests/propd_basic.config @@ -0,0 +1,5 @@ +process { + withName: 'PROPR_PROPD' { + ext.args = {"--round_digits 5 --save_adjacency true"} + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/main.nf b/subworkflows/nf-core/differential_functional_enrichment/main.nf new file mode 100644 index 00000000..ff18aedc --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/main.nf @@ -0,0 +1,149 @@ + +// +// Perform enrichment analysis +// +include { GPROFILER2_GOST } from "../../../modules/nf-core/gprofiler2/gost/main.nf" +include { CUSTOM_TABULARTOGSEAGCT } from '../../../modules/nf-core/custom/tabulartogseagct/main.nf' +include { CUSTOM_TABULARTOGSEACLS } from '../../../modules/nf-core/custom/tabulartogseacls/main.nf' +include { CUSTOM_TABULARTOGSEACHIP } from '../../../modules/nf-core/custom/tabulartogseachip/main.nf' +include { GSEA_GSEA } from '../../../modules/nf-core/gsea/gsea/main.nf' +include { PROPR_GREA } from "../../../modules/nf-core/propr/grea/main.nf" + +// Combine meta maps, including merging non-identical values of shared keys (e.g. 'id') +def mergeMaps(meta, meta2){ + (meta + meta2).collectEntries { k, v -> + meta[k] && meta[k] != v ? [k, "${meta[k]}_${v}"] : [k, v] + } +} + +workflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT { + take: + // input data for functional analysis + // Note that genesets and background are optional depending on the method. + // Please set to [] if not provided, eg: [meta, input, [], [], method] + ch_input // [ meta_input, input file, genesets file, background file, method to run ] + + // other - for the moment these files are only needed for GSEA + // as it is the only one that takes expression data as input + // if in the future this setting is changed, this section could be removed + ch_contrasts // [ meta_contrast, contrast_variable, reference, target ] + ch_samplesheet // [ meta_exp, samples sheet ] + ch_featuresheet // [ meta_exp, features sheet, features id, features symbol ] + + main: + + ch_versions = Channel.empty() + + // Add method information into meta map of ch_input + // This information is used later to determine which method to run for each input + // Also, reorganize the structure to match them with the modules' input organization + + ch_input = ch_input + .multiMap { + meta_input, file, genesets, background, analysis_method -> + def meta_new = meta_input + [ 'method': analysis_method ] + input: + [ meta_new, file ] + genesets: + [ meta_new, genesets ] // NOTE here we assume that the modules will not make use of meta_genesets and meta_background + background: + [ meta_new, background ] + } + + // In the case of GSEA, it needs additional files coming from other channels that other methods don't use + // here we define the input channel for the GSEA section + + def criteria = multiMapCriteria { meta_input, input, genesets, meta_exp, samplesheet, featuresheet, features_id, features_symbol, meta_contrasts, variable, reference, target -> + def meta_contrasts_new = meta_contrasts + [ 'variable': variable, 'reference': reference, 'target': target ] // make sure variable, reference, target are in the meta + def meta_all = mergeMaps(meta_contrasts_new, meta_input) + input: + [ meta_all, input ] + genesets: + [ meta_all, genesets ] + contrasts_and_samples: + [ meta_all, samplesheet ] + features: + [ meta_exp, featuresheet ] + features_cols: + [ features_id, features_symbol ] + } + ch_preinput_for_gsea = ch_input.input + .join(ch_input.genesets) + .filter{ it[0].method == 'gsea' } + .combine(ch_samplesheet.join(ch_featuresheet)) + .combine(ch_contrasts) + .multiMap(criteria) + + // ---------------------------------------------------- + // Perform enrichment analysis with gprofiler2 + // ---------------------------------------------------- + + GPROFILER2_GOST( + ch_input.input.filter{ it[0].method == 'gprofiler2' }, + ch_input.genesets.filter{ it[0].method == 'gprofiler2'}, + ch_input.background.filter{ it[0].method == 'gprofiler2'} + ) + + // ---------------------------------------------------- + // Perform enrichment analysis with GSEA + // ---------------------------------------------------- + + // NOTE that GCT input can be more than 1, if they come from different tools (eg. limma, deseq2). + // CLS input can be as many as combinations of input x contrasts + // Whereas features can be only one file. + + CUSTOM_TABULARTOGSEAGCT(ch_preinput_for_gsea.input) + + CUSTOM_TABULARTOGSEACLS(ch_preinput_for_gsea.contrasts_and_samples) + + CUSTOM_TABULARTOGSEACHIP( + ch_preinput_for_gsea.features.first(), + ch_preinput_for_gsea.features_cols.first() + ) + + ch_input_for_gsea = CUSTOM_TABULARTOGSEAGCT.out.gct + .join(CUSTOM_TABULARTOGSEACLS.out.cls) + .join( ch_preinput_for_gsea.genesets ) + + GSEA_GSEA( + ch_input_for_gsea, + ch_input_for_gsea.map{ tuple(it[0].reference, it[0].target) }, + CUSTOM_TABULARTOGSEACHIP.out.chip.first() + ) + + // ---------------------------------------------------- + // Perform enrichment analysis with GREA + // ---------------------------------------------------- + + PROPR_GREA( + ch_input.input.filter{ it[0].method == 'grea' }, + ch_input.genesets.filter{ it[0].method == 'grea' } + ) + + // collect versions info + ch_versions = ch_versions + .mix(GPROFILER2_GOST.out.versions) + .mix(CUSTOM_TABULARTOGSEAGCT.out.versions) + .mix(CUSTOM_TABULARTOGSEACLS.out.versions) + .mix(CUSTOM_TABULARTOGSEACHIP.out.versions) + .mix(GSEA_GSEA.out.versions) + .mix(PROPR_GREA.out.versions) + + emit: + // here we emit the outputs that will be useful afterwards in the + // nf-core/differentialabundance pipeline + + // gprofiler2-specific outputs + gprofiler2_all_enrich = GPROFILER2_GOST.out.all_enrich + gprofiler2_sub_enrich = GPROFILER2_GOST.out.sub_enrich + gprofiler2_plot_html = GPROFILER2_GOST.out.plot_html + + // gsea-specific outputs + gsea_report = GSEA_GSEA.out.report_tsvs_ref.join(GSEA_GSEA.out.report_tsvs_target) + + // grea-specific outputs + grea_results = PROPR_GREA.out.results + + // tool versions + versions = ch_versions +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/meta.yml b/subworkflows/nf-core/differential_functional_enrichment/meta.yml new file mode 100644 index 00000000..d03a20da --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/meta.yml @@ -0,0 +1,151 @@ +name: "differential_functional_enrichment" +description: Run functional analysis on differential abundance analysis output +keywords: + - functional analysis + - functional enrichment + - differential + - over-representation analysis +components: + - gprofiler2/gost + - gsea/gsea + - propr/grea +input: + - ch_input: + description: Channel with the input data for functional analysis. + structure: + - meta_input: + type: map + description: Metadata map + - input: + type: file + description: | + Input file. This should be the DE statistics obtained from the DE modules, + or the normalized abundance matrix (in the case of running GSEA). + - genesets: + type: file + description: | + Gene sets database. Currently all methods support GMT format. + - background: + type: file + description: | + Background features for functional analysis. + For the moment, it is only required for gprofiler2. + - analysis_method: + type: value + description: Analysis method (gprofiler2, gsea, or grea) + - ch_contrasts: + description: Channel with contrast information + structure: + - meta_contrast: + type: map + description: Contrast metadata map + - contrast_variable: + type: value + description: Contrast variable + - reference: + type: value + description: Reference level + - target: + type: value + description: Target level + - ch_samplesheet: + description: Channel with sample information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - samplesheet: + type: file + description: Sample information file + pattern: "*.{csv,tsv}" + - ch_featuresheet: + description: Channel with features information + structure: + - meta_exp: + type: map + description: Experiment metadata map + - features: + type: file + description: Features information file + pattern: "*.{csv,tsv}" + - features_id: + type: value + description: Features id column + - features_symbol: + type: value + description: Features symbol column + +output: + - versions: + type: file + description: | + File containing software versions + Structure: [ path(versions.yml) ] + pattern: "versions.yml" + - gprofiler2_all_enrich: + description: Channel containing the main enrichment table output from gprofiler2 + structure: + - meta: + type: map + description: Metadata map + - all_enrich: + type: file + description: table listing all enriched pathways that were found by gprofiler2. + It can be empty, if none is found. + pattern: "*.gprofiler2.all_enriched_pathways.tsv" + - gprofiler2_sub_enrich: + description: Channel containing the secondary enrichment table output from gprofiler. + structure: + - meta: + type: map + description: Metadata map + - sub_enrich: + type: file + description: | + table listing enriched pathways that were found from one particular source. + Note that it will only be created if any were found. + pattern: "*.gprofiler2.*.sub_enriched_pathways.tsv" + - gprofiler2_plot_html: + description: Channel containing the html report generated from gprofiler2. + structure: + - meta: + type: map + description: Metadata map + - plot_html: + type: file + description: | + Channel containing HTML file; interactive Manhattan plot of all enriched pathways. + Note that this file will only be generated if enriched pathways were found. + pattern: "*.gprofiler2.gostplot.html" + - gsea_report: + description: Channel containing all the output from GSEA needed for further reporting. + structure: + - meta: + type: map + description: Metadata map + - reports_ref: + type: file + description: Main TSV results report file for the reference group. + pattern: "*gsea_report_for_${reference}.tsv" + - reports_target: + type: file + description: Main TSV results report file for the target group. + pattern: "*gsea_report_for_${target}.tsv" + - grea_results: + description: | + Channel containing the output from GREA. + structure: + - meta: + type: map + description: Metadata map + - results: + type: file + description: Main TSV results file. + pattern: "*.grea.tsv" +authors: + - "@suzannejin" + - "@bjlang" + - "@caraiz2001" +maintainers: + - "@suzannejin" + - "@pinin4fjords" diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/all.config b/subworkflows/nf-core/differential_functional_enrichment/tests/all.config new file mode 100644 index 00000000..7f092f0d --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/all.config @@ -0,0 +1,64 @@ +process { + + cpus = 1 + + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'LIMMA_DIFFERENTIAL' { + ext.args = { [ + "--blocking_variables $meta.blocking", + "--sample_id_col sample", + "--probe_id_col gene_id", + "--use_voom TRUE" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}_voom" } + } + + withName: 'LIMMA_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_voom_norm" } + } + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } + + withName: 'CUSTOM_TABULARTOGSEACLS' { + ext.args = { [ "variable": "$meta.variable" ] } + } + + withName: 'GSEA_GSEA' { + ext.args = { "-rnd_seed 10" } + ext.prefix = { "${meta.id}.${gene_sets.baseName}." } + } + + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config new file mode 100644 index 00000000..458bb6dd --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gprofiler2.config @@ -0,0 +1,30 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config new file mode 100644 index 00000000..4ec648e6 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/deseq2_gsea.config @@ -0,0 +1,23 @@ +process { + withName: 'DESEQ2_DIFFERENTIAL' { + ext.args = { [ + "--round_digits 5", + "--vs_method rlog", + (meta.blocking == null) ? "" : "--blocking_variables $meta.blocking" + ].join(' ').trim() } + ext.prefix = { "${meta.id}_${meta.method}" } + } + + withName: 'DESEQ2_NORM' { + ext.prefix = { "${meta.id}_${meta.method}_norm --round_digits 5" } + } + + withName: 'CUSTOM_TABULARTOGSEACLS' { + ext.args = { [ "variable": "$meta.variable" ] } + } + + withName: 'GSEA_GSEA' { + ext.args = { "-rnd_seed 10" } + ext.prefix = { "${meta.id}.${gene_sets.baseName}." } + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config b/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config new file mode 100644 index 00000000..1fe3a1c9 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/gprofiler2.config @@ -0,0 +1,17 @@ +process { + withName: 'GPROFILER2_GOST' { + ext.args = [ + "--significant true", + "--measure_underrepresentation false", + "--correction_method gSCS", + "--evcodes false", + "--pval_threshold 0.05", + "--domain_scope annotated", + "--min_diff 1", + "--round_digits 4", + "--palette_name Blues", + "--de_id_column gene_id", + "--organism mmusculus" + ].join(' ').trim() + } +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test new file mode 100644 index 00000000..e1138d4f --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test @@ -0,0 +1,490 @@ +nextflow_workflow { + + name "Test Subworkflow DIFFERENTIAL_FUNCTIONAL_ENRICHMENT" + script "../main.nf" + workflow "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT" + + tag "subworkflows" + tag "subworkflows_nfcore" + tag "subworkflows/differential_functional_enrichment" + tag "gprofiler2" + tag "gprofiler2/gost" + tag "gsea" + tag "gsea/gsea" + tag "propr" + tag "propr/grea" + + test("test gprofiler2 - mouse") { + tag 'gprofiler2_basic' + config './gprofiler2.config' + // NOTE that this generates the same outputs as the module GPROFILER2_GOST test + + when { + workflow { + """ + ch_input = Channel.of([ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true), + [], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/study.filtered.tsv", checkIfExists: true), + 'gprofiler2' + ]) + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()} + ) + } + } + + test("deseq2 + gprofiler2 - mouse") { + tag "deseq2+gprofiler2" + config "./deseq2_gprofiler2.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // padj threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, [], [], 'gprofiler2'] + } + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()}, + ) + } + } + + test("deseq2 + gsea - mouse") { + tag "deseq2+gsea" + config "./deseq2_gsea.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', // analysis method + 1.5, // FC threshold + 0.05 // padj threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + // Define test data + def test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/' + def testData = [ + contrasts_file: test_data_dir + 'rnaseq_expression/SRP254919.contrasts.csv', + abundance_file: test_data_dir + 'rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: test_data_dir + 'rnaseq_expression/SRP254919.samplesheet.csv', + genesets_file: test_data_dir + 'gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt' + ] + + // define input channels + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix + .combine(Channel.fromPath(testData.genesets_file)) + .map { meta, matrix, genesets -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, matrix, genesets, [], 'gsea'] + } + ch_contrasts = Channel.fromPath(file(testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.samplesheet_file) + ]) + ch_featuresheet = Channel.of([ + [ id:'test' ], + file(testData.abundance_file), + 'gene_id', + 'gene_name' + ]) + + input[0] = ch_input + input[1] = ch_contrasts + input[2] = ch_samplesheet + input[3] = ch_featuresheet + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gsea_report, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()} + ) + } + } + + test("propd + grea - mouse") { + tag "propd+grea" + config "./propd_grea.config" + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', // analysis method + 1.5, // FC threshold + 100 // stat threshold + ]) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + ch_input = ABUNDANCE_DIFFERENTIAL_FILTER.out.adjacency + .combine(Channel.fromPath(params.modules_testdata_base_path + 'genomics/mus_musculus/gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt')) + .map { meta, results, genesets -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, genesets, [], 'grea'] + } + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.grea_results, + path(workflow.out.versions.get(0)).yaml, + workflow.out.versions + ).match()}, + ) + } + } + + test("deseq2|limmavoom|propd + gprofiler2|gsea|gsea - mouse") { + tag 'all' + config './all.config' + + setup { + run("ABUNDANCE_DIFFERENTIAL_FILTER") { + script "../../abundance_differential_filter/main.nf" + workflow { + """ + // Define test data + def testData = [ + expression_test_data_dir: params.modules_testdata_base_path + 'genomics/mus_musculus/rnaseq_expression/', + contrasts_file: 'SRP254919.contrasts.csv', + abundance_file: 'SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: 'SRP254919.samplesheet.csv' + ] + + // Define inputs + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.samplesheet_file) + ]) + ch_transcript_lengths = Channel.of([ [], [] ]) + ch_control_features = Channel.of([ [], [] ]) + ch_contrasts = Channel.fromPath(file(testData.expression_test_data_dir + testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_input = Channel.of( + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'deseq2', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'limma', + 1.5, // FC threshold + 0.05 // stat (adjusted p-value) threshold + ], + [ + [ id:'test' ], + file(testData.expression_test_data_dir + testData.abundance_file), + 'propd', + 1.5, // FC threshold + 100 // stat (weighted connectivity) threshold + ] + ) + + input[0] = ch_input + input[1] = ch_samplesheet + input[2] = ch_transcript_lengths + input[3] = ch_control_features + input[4] = ch_contrasts + """ + } + } + } + + when { + workflow { + """ + // Define test data + def test_data_dir = params.modules_testdata_base_path + 'genomics/mus_musculus/' + def testData = [ + contrasts_file: test_data_dir + 'rnaseq_expression/SRP254919.contrasts.csv', + abundance_file: test_data_dir + 'rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv', + samplesheet_file: test_data_dir + 'rnaseq_expression/SRP254919.samplesheet.csv', + genesets_file: test_data_dir + 'gene_set_analysis/mh.all.v2022.1.Mm.symbols.gmt' + ] + + // define input channels + ch_input_for_gprofiler2 = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'gprofiler2'] + } + ch_input_for_gsea = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'gsea'] + } + ch_input_for_grea = ABUNDANCE_DIFFERENTIAL_FILTER.out.adjacency + .map { meta, results -> + def meta_new = meta - ['method': meta.method] + meta_new.method_de = meta.method + [meta_new, results, 'grea'] + } + ch_input = ch_input_for_gprofiler2 + .mix(ch_input_for_gsea) + .mix(ch_input_for_grea) + .combine(Channel.fromPath(testData.genesets_file)) + .map { meta, input_file, method, genesets -> + [meta, input_file, genesets, [], method] + } + + // define gsea-specific inputs + ch_contrasts = Channel.fromPath(file(testData.contrasts_file)) + .splitCsv ( header:true, sep:',' ) + .map{ + tuple(it, it.variable, it.reference, it.target) + } + ch_samplesheet = Channel.of([ + [ id:'test' ], + file(testData.samplesheet_file) + ]) + ch_featuresheet = Channel.of([ + [ id:'test' ], + file(testData.abundance_file), + 'gene_id', + 'gene_name' + ]) + + input[0] = ch_input + input[1] = ch_contrasts + input[2] = ch_samplesheet + input[3] = ch_featuresheet + """ + } + } + + then { + assertAll( + { assert workflow.success}, + { assert snapshot( + workflow.out.gprofiler2_all_enrich, + workflow.out.gprofiler2_sub_enrich, + workflow.out.gprofiler2_plot_html.collect{ meta, html -> file(html).name }, //assert unstable file + workflow.out.gsea_report, + workflow.out.grea_results, + workflow.out.versions + ).match()}, + ) + } + + } + + test("stub") { + tag 'gprofiler2_basic' + config './gprofiler2.config' + options '-stub' + + when { + workflow { + """ + ch_input = Channel.of([ + ['id':'Condition_genotype_WT_KO', 'variable':'Condition genotype', 'reference':'WT', 'target':'KO', 'blocking':'batch'], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/Condition_genotype_WT_KO.deseq2.results_filtered.tsv", checkIfExists: true), + [], + file("https://github.com/nf-core/test-datasets/raw/refs/heads/differentialabundance/modules_testdata/study.filtered.tsv", checkIfExists: true), + 'gprofiler2' + ]) + + input[0] = ch_input + input[1] = Channel.of([[], [], [], []]) + input[2] = Channel.of([[], []]) + input[3] = Channel.of([[], [], [], []]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out).match() } + ) + } + } + +} diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap new file mode 100644 index 00000000..5591114c --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/main.nf.test.snap @@ -0,0 +1,600 @@ +{ + "deseq2|limmavoom|propd + gprofiler2|gsea|gsea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d586d92fb6cc3e41d493d14c4d9a7d92" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "limma", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 100, + "method_de": "propd", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,fa880c70d06f56d8dad0ac8078e6233c" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "limma", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 100, + "method_de": "propd", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6__test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,4c95059438af872253aa95a5ff127fca", + "treatment_mCherry_hND6__test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,b4e4009e067f723694efc1a46a609e2b", + "treatment_mCherry_hND6__test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,ece72606ce6d1d037cfd5f5b198233a8", + "treatment_mCherry_hND6__test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,dc7b6f67903e25076ab95a7e1bb39bbe" + ] + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,dc27af1c941636f8b03e8c8724773725", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,09b7770d59d2efa8a58f300a16a41ae7", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,a261d658ca1b1ec0511e55da734d7810", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,3cbdbbb1c5b232ab73d35d4a0953d19c", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,8472cb5792bf7ec044bb95df356ad47e" + ] + ] + ], + [ + "treatment_mCherry_hND6__test.gprofiler2.gostplot.html", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.gostplot.html" + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "limma", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,a4dcc9581c9c63d35ef32ee0df882074" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "limma", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,a4dcc9581c9c63d35ef32ee0df882074" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6__test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6_sample_number_test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + [ + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,f2db818ec8143f64399247548098b643", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:12:40.203142527" + }, + "propd + grea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6__test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "propd", + "method": "grea" + }, + "treatment_mCherry_hND6_sample_number_test.grea.tsv:md5,786faeccf39926d2f7c980ef549a2697" + ] + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:PROPR_GREA": { + "r-propr": "5.1.5" + } + }, + [ + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb", + "versions.yml:md5,cd9cd1563a983e586b15fd2276da8bfb" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:10:22.944909501" + }, + "deseq2 + gprofiler2 - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6__test.gprofiler2.all_enriched_pathways.tsv:md5,d586d92fb6cc3e41d493d14c4d9a7d92" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + "treatment_mCherry_hND6_sample_number_test.gprofiler2.all_enriched_pathways.tsv:md5,fa880c70d06f56d8dad0ac8078e6233c" + ] + ], + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6__test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,4c95059438af872253aa95a5ff127fca", + "treatment_mCherry_hND6__test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,b4e4009e067f723694efc1a46a609e2b", + "treatment_mCherry_hND6__test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,ece72606ce6d1d037cfd5f5b198233a8", + "treatment_mCherry_hND6__test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,dc7b6f67903e25076ab95a7e1bb39bbe" + ] + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "fc_threshold": 1.5, + "stat_threshold": 0.05, + "method_de": "deseq2", + "method": "gprofiler2" + }, + [ + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,dc27af1c941636f8b03e8c8724773725", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,09b7770d59d2efa8a58f300a16a41ae7", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,a261d658ca1b1ec0511e55da734d7810", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,3cbdbbb1c5b232ab73d35d4a0953d19c", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,8472cb5792bf7ec044bb95df356ad47e" + ] + ] + ], + [ + "treatment_mCherry_hND6__test.gprofiler2.gostplot.html", + "treatment_mCherry_hND6_sample_number_test.gprofiler2.gostplot.html" + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GPROFILER2_GOST": { + "r-base": "4.3.3", + "r-ggplot2": "3.4.3", + "r-gprofiler2": "0.2.2" + } + }, + [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51", + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:08:35.939943561" + }, + "test gprofiler2 - mouse": { + "content": [ + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,1134a02ca061c463bcbff277eefbfb19" + ] + ], + [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + [ + "Condition_genotype_WT_KO.gprofiler2.GO:BP.sub_enriched_pathways.tsv:md5,d527b94cdb160070bcaa0bfb0cecf914", + "Condition_genotype_WT_KO.gprofiler2.GO:CC.sub_enriched_pathways.tsv:md5,ef418c3f06d50446317928e37ec8ddfb", + "Condition_genotype_WT_KO.gprofiler2.GO:MF.sub_enriched_pathways.tsv:md5,e460d4917feb0b64d334a528f59e0731", + "Condition_genotype_WT_KO.gprofiler2.HP.sub_enriched_pathways.tsv:md5,865d8f092503552831c51d775a98c6eb", + "Condition_genotype_WT_KO.gprofiler2.KEGG.sub_enriched_pathways.tsv:md5,413724002abe683f376ea914d4f21ade", + "Condition_genotype_WT_KO.gprofiler2.MIRNA.sub_enriched_pathways.tsv:md5,fce81051d7af955ddb2925ba2da9ff57", + "Condition_genotype_WT_KO.gprofiler2.REAC.sub_enriched_pathways.tsv:md5,e89e1876698ea644671a0720c85f4dbb", + "Condition_genotype_WT_KO.gprofiler2.TF.sub_enriched_pathways.tsv:md5,e272217ec7fcf01ea463ab8bcc8335cf", + "Condition_genotype_WT_KO.gprofiler2.WP.sub_enriched_pathways.tsv:md5,fdd1efa836d85bb127e933e925290cba" + ] + ] + ], + [ + "Condition_genotype_WT_KO.gprofiler2.gostplot.html" + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GPROFILER2_GOST": { + "r-base": "4.3.3", + "r-ggplot2": "3.4.3", + "r-gprofiler2": "0.2.2" + } + }, + [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:07:42.734133807" + }, + "deseq2 + gsea - mouse": { + "content": [ + [ + [ + { + "id": "treatment_mCherry_hND6__test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ], + [ + { + "id": "treatment_mCherry_hND6_sample_number_test", + "variable": "treatment", + "reference": "mCherry", + "target": "hND6", + "blocking": "sample_number", + "method_de": "deseq2", + "method": "gsea" + }, + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_test.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv:md5,354a961c7e1417db2bf1f7e8d00c54f0" + ] + ], + { + "DIFFERENTIAL_FUNCTIONAL_ENRICHMENT:GSEA_GSEA": { + "gsea": "4.3.2" + } + }, + [ + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,25ab98049a601f4940f3e5a24aa73f55", + "versions.yml:md5,f2db818ec8143f64399247548098b643", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f3be00003ea786284231f77c03c92eed", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a", + "versions.yml:md5,f823a4e0a4d8744b89aff1391ca74e3a" + ] + ], + "meta": { + "nf-test": "0.9.2", + "nextflow": "24.10.4" + }, + "timestamp": "2025-01-24T15:09:55.875311067" + }, + "stub": { + "content": [ + { + "0": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + + ], + "4": [ + + ], + "5": [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ], + "gprofiler2_all_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.all_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gprofiler2_plot_html": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.gostplot.html:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "gprofiler2_sub_enrich": [ + [ + { + "id": "Condition_genotype_WT_KO", + "variable": "Condition genotype", + "reference": "WT", + "target": "KO", + "blocking": "batch", + "method": "gprofiler2" + }, + "Condition_genotype_WT_KO.gprofiler2.*.sub_enriched_pathways.tsv:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "grea_results": [ + + ], + "gsea_report": [ + + ], + "versions": [ + "versions.yml:md5,7861e3047b941b86ef50124168a13b51" + ] + } + ], + "meta": { + "nf-test": "0.9.1", + "nextflow": "24.10.3" + }, + "timestamp": "2025-01-24T17:38:14.74535" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config b/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config new file mode 100644 index 00000000..c1a28351 --- /dev/null +++ b/subworkflows/nf-core/differential_functional_enrichment/tests/propd_grea.config @@ -0,0 +1,15 @@ +process { + // set single core for reproducibility + // NOTE that GREA module relies on parallelization and permutation tests + // The permutations are done within each node, which makes set.seed not working properly when + // different nodes are starting/ending depending on the case + cpus = 1 + + withName: "PROPR_PROPD"{ + ext.args = { "--round_digits 5 --save_adjacency true --features_id_col gene_name"} + } + withName: "PROPR_GREA"{ + ext.args = { "--permutation 10 --set_min 10 --seed 123 --round_digits 5"} + } +} + diff --git a/tests/.nftignore b/tests/.nftignore index cfb2b95c..604f6bbe 100644 --- a/tests/.nftignore +++ b/tests/.nftignore @@ -5,11 +5,12 @@ report/gsea/**/*butterfly_plot.png report/gsea/**/*.gsea_report_for_hND6.tsv report/gsea/**/*.symbols.Gsea.rpt report/gsea/**/*.html -report/gsea/phenotype_uninvolved_lesional/**/*.png -report/gsea/**/phenotype_uninvolved_lesional.*.gsea_report_for_*.tsv +report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png +report/gsea/**/phenotype_uninvolved_lesional_GSE50790.*.gsea_report_for_*.tsv report/*.html report/*.zip *html shinyngs_app/**/data.rds -report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv} -report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv} +report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv} +report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv} +**/*.png diff --git a/tests/test.nf.test.snap b/tests/test.nf.test.snap index 031afac0..da0cd114 100644 --- a/tests/test.nf.test.snap +++ b/tests/test.nf.test.snap @@ -1,8 +1,17 @@ { "Test profile - csv contrasts": { "content": [ - 22, + 23, { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "DESEQ2_DIFFERENTIAL": { "r-base": "4.1.3", "bioconductor-deseq2": "1.34.0" @@ -22,9 +31,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.1.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-shinyngs": "2.1.0" }, @@ -35,20 +41,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -64,60 +70,60 @@ "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -127,10 +133,10 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/immunedeconv", "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", "tables/processed_abundance", @@ -138,51 +144,29 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "volcano.png:md5,32d82a790e028f9476972a7f38190430", - "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", - "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", - "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", - "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", - "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", - "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" @@ -190,14 +174,23 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-22T15:46:19.634502588" + "timestamp": "2025-02-04T16:23:35.713188367" }, "Test profile - yml contrasts": { "content": [ - 22, + 23, { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "DESEQ2_DIFFERENTIAL": { "r-base": "4.1.3", "bioconductor-deseq2": "1.34.0" @@ -217,9 +210,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.1.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-shinyngs": "2.1.0" }, @@ -230,20 +220,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -259,60 +249,60 @@ "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png", "plots/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -322,10 +312,10 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/immunedeconv", "tables/immunedeconv/SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv", "tables/processed_abundance", @@ -333,51 +323,29 @@ "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", - "volcano.png:md5,32d82a790e028f9476972a7f38190430", - "volcano.png:md5,592d4a7d9c40761c185d4f81922ca23b", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,dfe51910e230ae9cc2bc9fa5651666ba", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,54d956233af15c43d48f09bb012a7d7e", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,0703c421c53b260f91568dfc0436c054", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,776cdc3ee4e25b348ab0625213c6168f", - "density.png:md5,2206a91f473ae24358de4fedc07d4ad1", - "mad_correlation.png:md5,25d424021ef2bac231cb0d1b13cc1728", - "pca2d.png:md5,af05a9aed66f321b0d266d9c8fba84cc", - "pca3d.png:md5,3f2a80315f56a779dc95b32a682d0e42", - "sample_dendrogram.png:md5,ad6c58adf67436d69d390e0a7665b3e4", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot1_stacked_bar_chart.png:md5,a4bed902e7df56a836b78d68e06d1359", - "SRP254919.salmon.merged.gene_counts.top1000cov.plot2_points_with_facets.png:md5,a6a510a099f7a7e27893a9b5ef45c8b1", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,dbe3720197761f3862d568879aa63977", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,06d071c32b90ddec7c8d37728730d7f4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,c1953f2787972171746a358e0ed2cb17", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,93aeaf605ce766a6a5fec954035d91b5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,644895110df73cc6af88ffe2457da33b", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,a14c4be775eb8a8c6deba857f5e2ce52", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,07e580fa86de237281de6a59b4d84716", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,efd220be2b0215645dbf6a517ef1b5bf", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,30cfd08715168536aab8a088009d3bc4", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,42ad391a5d3b2e4e7931af3088cc6400", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,cd67e101a9f0edf196ee0cd8491f8774", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,b41cbaacd04a25b45295f3f987ff7500", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,98fa3ec0992859d2a524ecce1259f0ed", "SRP254919.salmon.merged.gene_counts.top1000cov.deconvolution_results.tsv:md5,3d7ed4550a0da2f63fcfd2e74605e7a3", "all.normalised_counts.tsv:md5,1d7ad0c02b483f2eff1a5b357a74d011", "all.vst.tsv:md5,a08d06d3c3218619b7bd85beead467bd" @@ -385,8 +353,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-22T15:44:36.759568148" + "timestamp": "2025-02-04T16:10:38.458716344" } } \ No newline at end of file diff --git a/tests/test_affy.nf.test b/tests/test_affy.nf.test index 5fab9052..4e612ea7 100644 --- a/tests/test_affy.nf.test +++ b/tests/test_affy.nf.test @@ -17,9 +17,8 @@ nextflow_pipeline { then { // stable_name: All files + folders in ${params.outdir}/ with a stable name def stable_name = getAllFilesFromDir(params.outdir, relative: true, includeDir: true, ignore: ['pipeline_info/*.{html,json,txt}', - 'report/gsea/phenotype_uninvolved_lesional/**/*.png', - 'report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_GLYCOLYSIS.{html,tsv}', - 'report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.{html,tsv}']) + 'report/gsea/phenotype_uninvolved_lesional_GSE50790/**/*.png' + ]) // stable_path: All files in ${params.outdir}/ with stable content def stable_path = getAllFilesFromDir(params.outdir, ignoreFile: 'tests/.nftignore') assertAll( diff --git a/tests/test_affy.nf.test.snap b/tests/test_affy.nf.test.snap index 00134426..1cf1e3e2 100644 --- a/tests/test_affy.nf.test.snap +++ b/tests/test_affy.nf.test.snap @@ -7,6 +7,15 @@ "r-base": "4.3.1", "bioconductor-affy": "1.78.0" }, + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "GSEA_GSEA": { "gsea": "4.3.2" }, @@ -20,9 +29,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.1.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-shinyngs": "2.1.0" }, @@ -35,14 +41,14 @@ "other/affy", "other/affy/raw._eset.rds", "other/limma", - "other/limma/phenotype_uninvolved_lesional.MArrayLM.limma.rds", + "other/limma/phenotype_uninvolved_lesional_GSE50790.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/phenotype_uninvolved_lesional", - "plots/differential/phenotype_uninvolved_lesional/png", - "plots/differential/phenotype_uninvolved_lesional/png/volcano.png", + "plots/differential/phenotype_uninvolved_lesional_GSE50790", + "plots/differential/phenotype_uninvolved_lesional_GSE50790/png", + "plots/differential/phenotype_uninvolved_lesional_GSE50790/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/phenotype", @@ -55,93 +61,95 @@ "plots/exploratory/phenotype/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/phenotype_uninvolved_lesional.limma.mean_difference.png", + "plots/qc/phenotype_uninvolved_lesional_GSE50790.limma.mean_difference.png", "report", "report/GSE50790.html", "report/GSE50790.zip", "report/gsea", - "report/gsea/phenotype_uninvolved_lesional", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Gsea.rpt", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.heat_map_corr_plot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.index.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.neg_snapshot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.pos_snapshot.html", - "report/gsea/phenotype_uninvolved_lesional/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_P53_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Gsea.rpt", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_lesional.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gsea_report_for_uninvolved.tsv", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.heat_map_corr_plot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.index.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.neg_snapshot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.pos_snapshot.html", + "report/gsea/phenotype_uninvolved_lesional_GSE50790/h.all.v2022.1.Hs.symbols/phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv", "shinyngs_app", "shinyngs_app/GSE50790", "shinyngs_app/GSE50790/app.R", @@ -151,8 +159,8 @@ "tables/annotation", "tables/annotation/hgu133plus2.annotation.tsv", "tables/differential", - "tables/differential/phenotype_uninvolved_lesional.limma.results.tsv", - "tables/differential/phenotype_uninvolved_lesional.limma.results_filtered.tsv", + "tables/differential/phenotype_uninvolved_lesional_GSE50790.limma.results.tsv", + "tables/differential/phenotype_uninvolved_lesional_GSE50790.limma.results_filtered.tsv", "tables/processed_abundance", "untar", "untar/GSE50790", @@ -167,59 +175,51 @@ ], [ "raw._eset.rds:md5,8c6c7807ce6c5d8204bd681b941eeb0f", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", - "volcano.png:md5,d4381dd34786c58e25b8e4ed1fa8bf26", + "phenotype_uninvolved_lesional_GSE50790.MArrayLM.limma.rds:md5,b5ef9fc63c87a83bf925f9284d83663f", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,552c6cf37521fae8170368e3adb4da80", - "density.png:md5,d03da965d4260ac137eccd2b193c38ca", - "mad_correlation.png:md5,2d448f4560bde14a1c56b42f8d9030ca", - "pca2d.png:md5,38cf71613192a86a72c44294b885aa41", - "pca3d.png:md5,1aa274734110ab804ce6503e5f555c85", - "sample_dendrogram.png:md5,69e00857f24a2aa4c02042bdb87d4fd8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", - "phenotype_uninvolved_lesional.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ADIPOGENESIS.tsv:md5,6dcf05651f6b0386fe089eaa421c3127", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ALLOGRAFT_REJECTION.tsv:md5,e9dd4c2530785273c996dbf8e989e4cb", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ANDROGEN_RESPONSE.tsv:md5,ed31e69bedf9bfdef793db64f60e0e3d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APICAL_JUNCTION.tsv:md5,b7ffdef669d6e8a7d6065b0ee4d94f08", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_APOPTOSIS.tsv:md5,6ce114c47b7c57eb2713e7b193b42561", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_BILE_ACID_METABOLISM.tsv:md5,802fc042c26bdcabe683df4597c0086e", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_CHOLESTEROL_HOMEOSTASIS.tsv:md5,6cf88fbf37fc53d31d7731635703d73b", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_COMPLEMENT.tsv:md5,a928545b2651eb1978899a89c2a039f6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_DNA_REPAIR.tsv:md5,ae2479a57c448a887af0d356b404601c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_E2F_TARGETS.tsv:md5,3e9cb1309eef19fe0bbe6918ce2bb1f2", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_ESTROGEN_RESPONSE_EARLY.tsv:md5,695b5bd61210e9fd4e76993cee00c63d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_FATTY_ACID_METABOLISM.tsv:md5,cb069d05610994d1e43ea84de165bcd0", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_G2M_CHECKPOINT.tsv:md5,09eba22af78006f69a9d0cb1bee27331", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL2_STAT5_SIGNALING.tsv:md5,38824ee08434a02049cf7f57c43545d5", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_IL6_JAK_STAT3_SIGNALING.tsv:md5,ab80e349a52b1b17d350d488d552f2b6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INFLAMMATORY_RESPONSE.tsv:md5,99983d81cd0ee6bc9c5e078ea311147c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_ALPHA_RESPONSE.tsv:md5,0ae74dbc3afa49b86418a819bf69e431", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_INTERFERON_GAMMA_RESPONSE.tsv:md5,3ebd3f6f7a503344dc241c9477bf5716", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,938d36847cf76e8c21701685f94b66b8", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MITOTIC_SPINDLE.tsv:md5,b65a1c48b013bca7fbee8ad817d7765d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MTORC1_SIGNALING.tsv:md5,a0ccd62aae522f2639efd92f0da80c38", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V1.tsv:md5,8d3bc922ce0fad0eaa2d559cea0c93f1", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYC_TARGETS_V2.tsv:md5,86a9ffb8afabb8f2b5250455dffd1c80", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_MYOGENESIS.tsv:md5,332f9386161436cd69d4b830e0f392d6", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_NOTCH_SIGNALING.tsv:md5,53bc5acac191f31dcdbfe62fcf396358", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_OXIDATIVE_PHOSPHORYLATION.tsv:md5,faab3d7cea1ff32b5c224587246ad34e", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PEROXISOME.tsv:md5,66a120807b07d920c876b65b3925264c", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_PROTEIN_SECRETION.tsv:md5,d13300c61a1e99a0b05ef18fac74c42d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_REACTIVE_OXYGEN_SPECIES_PATHWAY.tsv:md5,33429d1e3f2342c6c0e7b499035bd8da", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TGF_BETA_SIGNALING.tsv:md5,628b415522f9430bcc297e84e54ddd27", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_TNFA_SIGNALING_VIA_NFKB.tsv:md5,fa440cf1e030098632f5bd177a5f4abe", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UNFOLDED_PROTEIN_RESPONSE.tsv:md5,28f52aea571329ffeac92487bb728601", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_UV_RESPONSE_DN.tsv:md5,ee52c4c5f2063b0d1aabdf6301651a83", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.HALLMARK_WNT_BETA_CATENIN_SIGNALING.tsv:md5,4f11dba4f7cbc92f589bef27c182d91d", + "gene_sets_phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,a619edb7acb1a0208389f7faf35eb30c", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.gene_set_sizes.tsv:md5,77b53b0ca686ede9fe15ca448340f9f5", + "phenotype_uninvolved_lesional_GSE50790.h.all.v2022.1.Hs.symbols.ranked_gene_list_lesional_versus_uninvolved.tsv:md5,72dfaeff534ba9a2b32f63524e835dc4", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "hgu133plus2.annotation.tsv:md5,f2b82ef12b2a2e8e575de06766583d96", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", + "phenotype_uninvolved_lesional_GSE50790.limma.results.tsv:md5,686e871be0f1b435e161f84f6518cfc3", + "phenotype_uninvolved_lesional_GSE50790.limma.results_filtered.tsv:md5,f7f9f8914173ecb4a9af2d35afd62aae", "GSM1229341_Gudjohnsson_001_6690_PP.CEL.gz:md5,259d0908211a071351450f366fd51cad", "GSM1229342_Gudjohnsson_002_6690_PN.CEL.gz:md5,31cc2b8b26e210760b8ebd4b304b52ba", "GSM1229343_Gudjohnsson_003_7450_PN.CEL.gz:md5,713a3ca75a883cbff6da0be7bd251422", @@ -232,8 +232,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:11:49.515049379" + "timestamp": "2025-02-04T17:09:00.489407892" } -} +} \ No newline at end of file diff --git a/tests/test_maxquant.nf.test.snap b/tests/test_maxquant.nf.test.snap index 0ce04c06..2e8c18b7 100644 --- a/tests/test_maxquant.nf.test.snap +++ b/tests/test_maxquant.nf.test.snap @@ -29,10 +29,10 @@ [ "other", "other/limma", - "other/limma/fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_FoB.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds", - "other/limma/genotype_celltype_t1_t2.MArrayLM.limma.rds", + "other/limma/fakebatch_fakeBatch_b1_b2_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_FoB_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_MZ_fakeBatch_PXD043349.MArrayLM.limma.rds", + "other/limma/genotype_celltype_t1_t2_PXD043349.MArrayLM.limma.rds", "other/proteus", "other/proteus/Celltype", "other/proteus/Celltype/normalizeMedian.normalized_proteingroups.rds", @@ -45,18 +45,18 @@ "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/fakebatch_fakeBatch_b1_b2", - "plots/differential/fakebatch_fakeBatch_b1_b2/png", - "plots/differential/fakebatch_fakeBatch_b1_b2/png/volcano.png", - "plots/differential/genotype_celltype_t1_FoB", - "plots/differential/genotype_celltype_t1_FoB/png", - "plots/differential/genotype_celltype_t1_FoB/png/volcano.png", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch/png", - "plots/differential/genotype_celltype_t1_MZ_fakeBatch/png/volcano.png", - "plots/differential/genotype_celltype_t1_t2", - "plots/differential/genotype_celltype_t1_t2/png", - "plots/differential/genotype_celltype_t1_t2/png/volcano.png", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349/png", + "plots/differential/fakebatch_fakeBatch_b1_b2_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_FoB_PXD043349", + "plots/differential/genotype_celltype_t1_FoB_PXD043349/png", + "plots/differential/genotype_celltype_t1_FoB_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349/png", + "plots/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349/png/volcano.png", + "plots/differential/genotype_celltype_t1_t2_PXD043349", + "plots/differential/genotype_celltype_t1_t2_PXD043349/png", + "plots/differential/genotype_celltype_t1_t2_PXD043349/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/Celltype", @@ -88,23 +88,23 @@ "plots/proteus/fakeBatch/normalizeMedian.normalized_mean_variance_relationship.png", "plots/proteus/fakeBatch/raw_distributions.png", "plots/qc", - "plots/qc/fakebatch_fakeBatch_b1_b2.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_FoB.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png", - "plots/qc/genotype_celltype_t1_t2.limma.mean_difference.png", + "plots/qc/fakebatch_fakeBatch_b1_b2_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_FoB_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.mean_difference.png", + "plots/qc/genotype_celltype_t1_t2_PXD043349.limma.mean_difference.png", "report", "report/PXD043349.html", "report/PXD043349.zip", "tables", "tables/differential", - "tables/differential/fakebatch_fakeBatch_b1_b2.limma.results.tsv", - "tables/differential/fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_FoB.limma.results.tsv", - "tables/differential/genotype_celltype_t1_FoB.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv", - "tables/differential/genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv", - "tables/differential/genotype_celltype_t1_t2.limma.results.tsv", - "tables/differential/genotype_celltype_t1_t2.limma.results_filtered.tsv", + "tables/differential/fakebatch_fakeBatch_b1_b2_PXD043349.limma.results.tsv", + "tables/differential/fakebatch_fakeBatch_b1_b2_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_FoB_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_FoB_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results_filtered.tsv", + "tables/differential/genotype_celltype_t1_t2_PXD043349.limma.results.tsv", + "tables/differential/genotype_celltype_t1_t2_PXD043349.limma.results_filtered.tsv", "tables/proteus", "tables/proteus/Celltype", "tables/proteus/Celltype/normalizeMedian.normalized_proteingroups_tab.tsv", @@ -114,53 +114,25 @@ "tables/proteus/fakeBatch/raw_proteingroups_tab.tsv" ], [ - "fakebatch_fakeBatch_b1_b2.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", - "genotype_celltype_t1_FoB.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", - "genotype_celltype_t1_MZ_fakeBatch.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", - "genotype_celltype_t1_t2.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", + "fakebatch_fakeBatch_b1_b2_PXD043349.MArrayLM.limma.rds:md5,f321bf1e4fd44827810df9a9c38776d6", + "genotype_celltype_t1_FoB_PXD043349.MArrayLM.limma.rds:md5,4f0cb9d82aa3c0464cee5eca69248589", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.MArrayLM.limma.rds:md5,2021a25cc716b10830ff6851044b6b9d", + "genotype_celltype_t1_t2_PXD043349.MArrayLM.limma.rds:md5,34cc962386f20c6e001ab28f035df781", "normalizeMedian.normalized_proteingroups.rds:md5,da660b225f066a1e87bf8bb4196adcc6", "raw_proteingroups.rds:md5,0b38726c41e7b32213e5e15380c29612", "R_sessionInfo.log:md5,411badddf7904da0ed1de02b544109d2", "normalizeMedian.normalized_proteingroups.rds:md5,6f7def9ce31c8ee07f649675db394848", "raw_proteingroups.rds:md5,daef7d25977a1628870dee75e2977ee3", - "volcano.png:md5,3d64aa38b9c321f1162565a28d254bd1", - "volcano.png:md5,2497d3bd1e925d358b5856a21209f4bc", - "volcano.png:md5,1b28d0983a895d0619c470553a1be47f", - "volcano.png:md5,198730d78767da2e46ce6e1d25f52e64", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,17074b29c8babf56c5b884c13429c81e", - "density.png:md5,919c3d2f01bae9ba6c656f0223d2d19f", - "mad_correlation.png:md5,e2033c95c4c5b3d695d65158a6a246e4", - "pca2d.png:md5,50ff3bd8c8de40f32f078fe879c72d55", - "pca3d.png:md5,c3ced5600509551d5e0410019c717445", - "sample_dendrogram.png:md5,49bcc85503e49cb9da71e86973db3263", - "boxplot.png:md5,bb306103d822eecc37c29bb07674d29f", - "density.png:md5,d5a5e915557eab1fc05a914571b27f02", - "mad_correlation.png:md5,e14dd0b2ab73187658b386dfc6227d37", - "pca2d.png:md5,ed7f1342d245d5764898b637a6530c8d", - "pca3d.png:md5,dcedf79d5795c48a57117a2279dd4a0e", - "sample_dendrogram.png:md5,bacaf55f4f5863992ce7c166cde9c5b9", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "normalizeMedian.normalized_dendrogram.png:md5,6bf22a6e3aba7d3c53dc80d3bbd2bb27", - "normalizeMedian.normalized_distributions.png:md5,39b6f96288b8cd2e7dd2d02f424d6d78", - "normalizeMedian.normalized_mean_variance_relationship.png:md5,4ed879017fcbe0ea8279bd362ac0d9bd", - "raw_distributions.png:md5,1def04dd0f8cb116164e91a6aaab11ce", - "normalizeMedian.normalized_dendrogram.png:md5,181e8e0ccad205a19414975dee1f3ca0", - "normalizeMedian.normalized_distributions.png:md5,eff54bf61eafda77f8891e41239aaf9c", - "normalizeMedian.normalized_mean_variance_relationship.png:md5,b5ba9b01fe4534191e3e577302beaead", - "raw_distributions.png:md5,086370f56bc89e418744dc77f445e5e5", - "fakebatch_fakeBatch_b1_b2.limma.mean_difference.png:md5,45da19bbbebe47c7b08216e585f0d6d1", - "genotype_celltype_t1_FoB.limma.mean_difference.png:md5,8c5902f2ce99d4e540349423153e01b8", - "genotype_celltype_t1_MZ_fakeBatch.limma.mean_difference.png:md5,7236512b3247375627c3fc26a0f03bb4", - "genotype_celltype_t1_t2.limma.mean_difference.png:md5,c1fa7df4bf312921631f1e9349b43b34", - "fakebatch_fakeBatch_b1_b2.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", - "fakebatch_fakeBatch_b1_b2.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", - "genotype_celltype_t1_FoB.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", - "genotype_celltype_t1_FoB.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", - "genotype_celltype_t1_MZ_fakeBatch.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", - "genotype_celltype_t1_MZ_fakeBatch.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", - "genotype_celltype_t1_t2.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", - "genotype_celltype_t1_t2.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", + "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results.tsv:md5,2e04750d6c02cf37ed489601980d19b8", + "fakebatch_fakeBatch_b1_b2_PXD043349.limma.results_filtered.tsv:md5,6842d5af760839cda6f23d64a3300a09", + "genotype_celltype_t1_FoB_PXD043349.limma.results.tsv:md5,990fa0b6a9618bcb03d4c6726f0d518a", + "genotype_celltype_t1_FoB_PXD043349.limma.results_filtered.tsv:md5,941463996b8790278d7062a48fbc3419", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results.tsv:md5,a0cd63a2f76307016904a4463e3b1791", + "genotype_celltype_t1_MZ_fakeBatch_PXD043349.limma.results_filtered.tsv:md5,b3120632d1f653e97d18342089157930", + "genotype_celltype_t1_t2_PXD043349.limma.results.tsv:md5,8e6f5de58fc478aa954350fc159a9b57", + "genotype_celltype_t1_t2_PXD043349.limma.results_filtered.tsv:md5,9db67d9283e7fb2f4f604fd63ec40e4d", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", "raw_proteingroups_tab.tsv:md5,33a8791f84c676ea1aea4842231acb6a", "normalizeMedian.normalized_proteingroups_tab.tsv:md5,154fcd8d23409981b897d153e7b7e34e", @@ -169,8 +141,8 @@ ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:13:14.296845013" + "timestamp": "2025-02-04T16:34:30.49106646" } -} +} \ No newline at end of file diff --git a/tests/test_nogtf.nf.test.snap b/tests/test_nogtf.nf.test.snap index a1907f19..0dca00b8 100644 --- a/tests/test_nogtf.nf.test.snap +++ b/tests/test_nogtf.nf.test.snap @@ -23,20 +23,20 @@ [ "other", "other/deseq2", - "other/deseq2/treatment_mCherry_hND6_.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_.deseq2.sizefactors.tsv", - "other/deseq2/treatment_mCherry_hND6_sample_number.dds.rld.rds", - "other/deseq2/treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6__SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds", + "other/deseq2/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -49,8 +49,8 @@ "plots/exploratory/treatment/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.deseq2.dispersion.png", - "plots/qc/treatment_mCherry_hND6_sample_number.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.deseq2.dispersion.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.dispersion.png", "report", "report/SRP254919.html", "report/SRP254919.zip", @@ -61,45 +61,35 @@ "shinyngs_app/versions.yml", "tables", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_.deseq2.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv", "tables/processed_abundance", "tables/processed_abundance/all.normalised_counts.tsv", "tables/processed_abundance/all.vst.tsv" ], [ - "treatment_mCherry_hND6_.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", - "treatment_mCherry_hND6_.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "treatment_mCherry_hND6_sample_number.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", - "treatment_mCherry_hND6_sample_number.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", - "volcano.png:md5,db4fda5e682a1659af157c11985d0783", - "volcano.png:md5,396facf5c1dbe8b445e3360e6280f9c1", + "treatment_mCherry_hND6__SRP254919.dds.rld.rds:md5,6169c02c9c5dc9bfbd907d1d0ffe5442", + "treatment_mCherry_hND6__SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", + "treatment_mCherry_hND6_sample_number_SRP254919.dds.rld.rds:md5,4ef00951aa423f2b5d1ab797b16ff20d", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.sizefactors.tsv:md5,402909515e7ae8d53d091bf5ad9bc5fd", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,25940632bb9493d3ca2868fdaffdf6c0", - "density.png:md5,042695a1d452549a92a1ba91f342cfb0", - "mad_correlation.png:md5,9fbc55281829a254a99d735a729a332f", - "pca2d.png:md5,0406ba91b742676689417add1f20ebbd", - "pca3d.png:md5,99fd4104a7c08b5eae0ff88dc7eaf0d0", - "sample_dendrogram.png:md5,4fda57a4e2b34c063d233558d509f7a8", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6_.deseq2.dispersion.png:md5,ed14d196fadbe460d560982ef1e2ac91", - "treatment_mCherry_hND6_sample_number.deseq2.dispersion.png:md5,d0f07f97c7f5c660b173d85b85ed50b9", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", - "treatment_mCherry_hND6_.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", - "treatment_mCherry_hND6_.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", - "treatment_mCherry_hND6_sample_number.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", - "treatment_mCherry_hND6_sample_number.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", + "treatment_mCherry_hND6__SRP254919.deseq2.results.tsv:md5,d9e894aeb89aa5bc79bf7ce31304d7c0", + "treatment_mCherry_hND6__SRP254919.deseq2.results_filtered.tsv:md5,630820ec91287d8bcb2e5882431c09c3", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results.tsv:md5,02b1c8f3c2987b0cb1a64913dd90bf26", + "treatment_mCherry_hND6_sample_number_SRP254919.deseq2.results_filtered.tsv:md5,1e1c8edb0aa5acee308bc1fc81d1aa16", "all.normalised_counts.tsv:md5,e960aa685547a3ea778523da84fae136", "all.vst.tsv:md5,ea4e437ee57b2c5ef8c19d427656e3c6" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:14:39.706638148" + "timestamp": "2025-02-04T16:34:10.733187148" } -} +} \ No newline at end of file diff --git a/tests/test_rnaseq_limma.nf.test.snap b/tests/test_rnaseq_limma.nf.test.snap index 4ffb3c88..a370b614 100644 --- a/tests/test_rnaseq_limma.nf.test.snap +++ b/tests/test_rnaseq_limma.nf.test.snap @@ -1,8 +1,17 @@ { "Test rnaseq limma profile": { "content": [ - 20, + 22, { + "CUSTOM_TABULARTOGSEACHIP": { + "gawk": "5.1.0" + }, + "CUSTOM_TABULARTOGSEACLS": { + "awk": "1.3.4" + }, + "CUSTOM_TABULARTOGSEAGCT": { + "awk": "1.3.4" + }, "GSEA_GSEA": { "gsea": "4.3.2" }, @@ -22,9 +31,6 @@ "PLOT_EXPLORATORY": { "r-shinyngs": "2.1.0" }, - "TABULAR_TO_GSEA_CHIP": { - "bash": "5.2.21 3" - }, "VALIDATOR": { "r-shinyngs": "2.1.0" }, @@ -35,18 +41,18 @@ [ "other", "other/limma", - "other/limma/treatment_mCherry_hND6_.MArrayLM.limma.rds", - "other/limma/treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds", + "other/limma/treatment_mCherry_hND6__SRP254919.MArrayLM.limma.rds", + "other/limma/treatment_mCherry_hND6_sample_number_SRP254919.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/treatment_mCherry_hND6_", - "plots/differential/treatment_mCherry_hND6_/png", - "plots/differential/treatment_mCherry_hND6_/png/volcano.png", - "plots/differential/treatment_mCherry_hND6_sample_number", - "plots/differential/treatment_mCherry_hND6_sample_number/png", - "plots/differential/treatment_mCherry_hND6_sample_number/png/volcano.png", + "plots/differential/treatment_mCherry_hND6__SRP254919", + "plots/differential/treatment_mCherry_hND6__SRP254919/png", + "plots/differential/treatment_mCherry_hND6__SRP254919/png/volcano.png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png", + "plots/differential/treatment_mCherry_hND6_sample_number_SRP254919/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/treatment", @@ -59,60 +65,60 @@ "plots/exploratory/treatment/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/treatment_mCherry_hND6_.limma.mean_difference.png", - "plots/qc/treatment_mCherry_hND6_sample_number.limma.mean_difference.png", + "plots/qc/treatment_mCherry_hND6__SRP254919.limma.mean_difference.png", + "plots/qc/treatment_mCherry_hND6_sample_number_SRP254919.limma.mean_difference.png", "report", "report/SRP254919.html", "report/SRP254919.zip", "report/gsea", - "report/gsea/treatment_mCherry_hND6_", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", - "report/gsea/treatment_mCherry_hND6_sample_number", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Gsea.rpt", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.index.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", - "report/gsea/treatment_mCherry_hND6_sample_number/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6__SRP254919", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6__SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Gsea.rpt", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.butterfly_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.global_es_histogram.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_hND6.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gset_rnd_es_dist_5.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_1.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.heat_map_corr_plot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.index.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.neg_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pos_snapshot.html", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.pvalues_vs_nes_plot.png", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv", + "report/gsea/treatment_mCherry_hND6_sample_number_SRP254919/mh.all.v2022.1.Mm.symbols/treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png", "shinyngs_app", "shinyngs_app/SRP254919", "shinyngs_app/SRP254919/app.R", @@ -122,59 +128,42 @@ "tables/annotation", "tables/annotation/Mus_musculus.anno.tsv", "tables/differential", - "tables/differential/treatment_mCherry_hND6_.limma.results.tsv", - "tables/differential/treatment_mCherry_hND6_.limma.results_filtered.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.limma.results.tsv", - "tables/differential/treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv" + "tables/differential/treatment_mCherry_hND6__SRP254919.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6__SRP254919.limma.results_filtered.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.limma.results.tsv", + "tables/differential/treatment_mCherry_hND6_sample_number_SRP254919.limma.results_filtered.tsv", + "tables/processed_abundance", + "tables/processed_abundance/all.normalised_counts.tsv" ], [ - "treatment_mCherry_hND6_.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", - "treatment_mCherry_hND6_sample_number.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", - "volcano.png:md5,aa3d307fc1bb3284c5a29a469dc9a75e", - "volcano.png:md5,e24eaad248b42383269daaa8b98895b9", + "treatment_mCherry_hND6__SRP254919.MArrayLM.limma.rds:md5,5727192a1f8175594f4a148306f23988", + "treatment_mCherry_hND6_sample_number_SRP254919.MArrayLM.limma.rds:md5,385f960f9330a1dd6bbf4b00166bc96e", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,fddc3f29ff4561a856cd2d58a1dfe637", - "density.png:md5,d7552dab8e578124da77edaeff22dccf", - "mad_correlation.png:md5,340df9eb381307cf4d98d79da3213e6f", - "pca2d.png:md5,ce23b7e9b1300fb83bd593781fc70648", - "pca3d.png:md5,458d2c497557113ec203fe38186f5e1c", - "sample_dendrogram.png:md5,eb02da7195194e0d56578df41022f9bf", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "treatment_mCherry_hND6_.limma.mean_difference.png:md5,88ec38c7fb92b3f52675e7c9650bfbcd", - "treatment_mCherry_hND6_sample_number.limma.mean_difference.png:md5,4f2ff615728c95914dc773b7d986b5e7", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,cd78da35019246e48a0347f889927512", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,35c67dd6865094465ffbce6a237d46dc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN_4.png:md5,415d2e0dbe0caede5b51576fc87d6403", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.enplot_HALLMARK_KRAS_SIGNALING_DN_3.png:md5,797a90883b69b03fecf0c21158db4ef5", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.global_es_histogram.png:md5,cd78da35019246e48a0347f889927512", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.heat_map_1.png:md5,7d54dd389febc1cd883685ff38f53334", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", - "treatment_mCherry_hND6_sample_number.mh.all.v2022.1.Mm.symbols.ranked_list_corr_2.png:md5,35c67dd6865094465ffbce6a237d46dc", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6__SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.HALLMARK_KRAS_SIGNALING_DN.tsv:md5,d47ccff0732fb808d25f91fd7ef15f1c", + "gene_sets_treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.Symbol_to_probe_set_mapping_details.tsv:md5,e000a1b93ebbb7eb347d9ce666fd5e26", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gene_set_sizes.tsv:md5,e3049abd72c25ff6d7cd75b14135d245", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.gsea_report_for_mCherry.tsv:md5,ce8792382ae299749445767ff16aaecc", + "treatment_mCherry_hND6_sample_number_SRP254919.mh.all.v2022.1.Mm.symbols.ranked_gene_list_hND6_versus_mCherry.tsv:md5,2054b247acc714589b7f1e4f25a348d8", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "Mus_musculus.anno.tsv:md5,c1d7f21e64bd00f845ec6545c123a1fb", - "treatment_mCherry_hND6_.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", - "treatment_mCherry_hND6_.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", - "treatment_mCherry_hND6_sample_number.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", - "treatment_mCherry_hND6_sample_number.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce" + "treatment_mCherry_hND6__SRP254919.limma.results.tsv:md5,26df55a9c0fd182977396f75337d5fc4", + "treatment_mCherry_hND6__SRP254919.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "treatment_mCherry_hND6_sample_number_SRP254919.limma.results.tsv:md5,2a3937bfc95a1d0a0cbed1f2da4b0bd2", + "treatment_mCherry_hND6_sample_number_SRP254919.limma.results_filtered.tsv:md5,0bfc9215edc6aad064c3ce6abc81bfce", + "all.normalised_counts.tsv:md5,7510c89d6665176d5026b7af0a64344d" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:17:03.326723612" + "timestamp": "2025-02-04T16:31:49.020898734" } -} +} \ No newline at end of file diff --git a/tests/test_soft.nf.test.snap b/tests/test_soft.nf.test.snap index 699b39fa..f9cc1c5d 100644 --- a/tests/test_soft.nf.test.snap +++ b/tests/test_soft.nf.test.snap @@ -29,14 +29,14 @@ "other/affy", "other/affy/normalised.eset.rds", "other/limma", - "other/limma/phenotype_uninvolved_lesional.MArrayLM.limma.rds", + "other/limma/phenotype_uninvolved_lesional_study.MArrayLM.limma.rds", "pipeline_info", "pipeline_info/collated_versions.yml", "plots", "plots/differential", - "plots/differential/phenotype_uninvolved_lesional", - "plots/differential/phenotype_uninvolved_lesional/png", - "plots/differential/phenotype_uninvolved_lesional/png/volcano.png", + "plots/differential/phenotype_uninvolved_lesional_study", + "plots/differential/phenotype_uninvolved_lesional_study/png", + "plots/differential/phenotype_uninvolved_lesional_study/png/volcano.png", "plots/differential/versions.yml", "plots/exploratory", "plots/exploratory/phenotype", @@ -49,7 +49,7 @@ "plots/exploratory/phenotype/png/sample_dendrogram.png", "plots/exploratory/versions.yml", "plots/qc", - "plots/qc/phenotype_uninvolved_lesional.limma.mean_difference.png", + "plots/qc/phenotype_uninvolved_lesional_study.limma.mean_difference.png", "report", "report/study.html", "report/study.zip", @@ -62,36 +62,28 @@ "tables/annotation", "tables/annotation/normalised.annotation.tsv", "tables/differential", - "tables/differential/phenotype_uninvolved_lesional.limma.results.tsv", - "tables/differential/phenotype_uninvolved_lesional.limma.results_filtered.tsv", + "tables/differential/phenotype_uninvolved_lesional_study.limma.results.tsv", + "tables/differential/phenotype_uninvolved_lesional_study.limma.results_filtered.tsv", "tables/processed_abundance", "tables/processed_abundance/normalised.matrix.tsv" ], [ "normalised.eset.rds:md5,ee83ece8b75d711163af9dd9300db49a", - "phenotype_uninvolved_lesional.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", - "volcano.png:md5,18e35512a52ff82be16cc14330c1ac89", + "phenotype_uninvolved_lesional_study.MArrayLM.limma.rds:md5,eecc9b0267ce9a5d3a1330da7fbce4cc", "versions.yml:md5,3b79bd76b788bcfe6a346b1d0d2dba36", - "boxplot.png:md5,4d366be0ef28c1aaabebf1529e2b9dc0", - "density.png:md5,551c933a5d3dfe216dc000de19d9725f", - "mad_correlation.png:md5,60f9c0e924d52a569d976a3fb2c22a43", - "pca2d.png:md5,aad430028daa7ffa7cd6bea1c6c41d43", - "pca3d.png:md5,d32182b1005d696da648170f3bd9dbe8", - "sample_dendrogram.png:md5,b66045a3c9df5310f3241544c50f3fd1", "versions.yml:md5,837080c1af397890cab637f12f6c4851", - "phenotype_uninvolved_lesional.limma.mean_difference.png:md5,570bc62fbad15b7b25eaea786a416ace", "app.R:md5,bedcfc45b6cdcc2b8fe3627987e2b17a", "versions.yml:md5,27cf350d1f743e60e64b4434cf6d4687", "normalised.annotation.tsv:md5,40300ae222ae35fa54daf10a1b86e830", - "phenotype_uninvolved_lesional.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", - "phenotype_uninvolved_lesional.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", + "phenotype_uninvolved_lesional_study.limma.results.tsv:md5,2cfa653fffb034be4b82abf306c87bc5", + "phenotype_uninvolved_lesional_study.limma.results_filtered.tsv:md5,6a198c35b193bab0b3148d147c7b08e3", "normalised.matrix.tsv:md5,230f87f91c0c1a7e2ab354200c4b978c" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.3" + "nextflow": "24.10.4" }, - "timestamp": "2025-01-17T15:18:54.261796571" + "timestamp": "2025-02-04T16:25:47.716237078" } -} +} \ No newline at end of file diff --git a/workflows/differentialabundance.nf b/workflows/differentialabundance.nf index 19d91e34..e8b9e04b 100644 --- a/workflows/differentialabundance.nf +++ b/workflows/differentialabundance.nf @@ -1,6 +1,6 @@ /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - IMPORT MODULES / SUBWORKFLOWS / FUNCTIONS + HANDLE INPUT PARAMETERS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ @@ -56,13 +56,13 @@ if (params.study_type == 'affy_array') { } // Check optional parameters -if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = [[],[]] } -if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = [[],[]] } +if (params.transcript_length_matrix) { ch_transcript_lengths = Channel.of([ exp_meta, file(params.transcript_length_matrix, checkIfExists: true)]).first() } else { ch_transcript_lengths = Channel.of([[],[]]) } +if (params.control_features) { ch_control_features = Channel.of([ exp_meta, file(params.control_features, checkIfExists: true)]).first() } else { ch_control_features = Channel.of([[],[]]) } def run_gene_set_analysis = params.gsea_run || params.gprofiler2_run +ch_gene_sets = Channel.of([[]]) if (run_gene_set_analysis) { - ch_gene_sets = Channel.of([]) // For methods that can run without gene sets if (params.gene_sets_files) { gene_sets_files = params.gene_sets_files.split(",") ch_gene_sets = Channel.of(gene_sets_files).map { file(it, checkIfExists: true) } @@ -74,12 +74,24 @@ if (run_gene_set_analysis) { } else if (params.gprofiler2_run) { if (!params.gprofiler2_token && !params.gprofiler2_organism) { error("To run gprofiler2, please provide a run token, GMT file or organism!") - } else { - ch_gene_sets = [[]] // For gprofiler2 which calls ch_gene_sets.first() } } } +// Define tool channel +tools_differential = [ + method : ((params.study_type in ['affy_array', 'geo_soft_file', 'maxquant']) || + (params.study_type == 'rnaseq' && params.differential_use_limma)) + ? 'limma' : 'deseq2', + fc_threshold : params.differential_min_fold_change, + stat_threshold: params.differential_max_qval +] +tools_functional = params.gprofiler2_run ? + [method: 'gprofiler2', input_type: 'filtered'] : + (params.gsea_run ? [method: 'gsea', input_type: 'norm'] : []) +ch_tools = Channel.of([tools_differential, tools_functional]) + +// report related files report_file = file(params.report_file, checkIfExists: true) logo_file = file(params.logo_file, checkIfExists: true) css_file = file(params.css_file, checkIfExists: true) @@ -98,8 +110,6 @@ citations_file = file(params.citations_file, checkIfExists: true) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { TABULAR_TO_GSEA_CHIP } from '../modules/local/tabulartogseachip' -include { CUSTOM_FILTERDIFFERENTIALTABLE } from '../modules/nf-core/custom/filterdifferentialtable/main' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -116,15 +126,8 @@ include { SHINYNGS_APP } from '../modules/n include { SHINYNGS_STATICEXPLORATORY as PLOT_EXPLORATORY } from '../modules/nf-core/shinyngs/staticexploratory/main' include { SHINYNGS_STATICDIFFERENTIAL as PLOT_DIFFERENTIAL } from '../modules/nf-core/shinyngs/staticdifferential/main' include { SHINYNGS_VALIDATEFOMCOMPONENTS as VALIDATOR } from '../modules/nf-core/shinyngs/validatefomcomponents/main' -include { DESEQ2_DIFFERENTIAL as DESEQ2_NORM } from '../modules/nf-core/deseq2/differential/main' -include { DESEQ2_DIFFERENTIAL } from '../modules/nf-core/deseq2/differential/main' -include { LIMMA_DIFFERENTIAL } from '../modules/nf-core/limma/differential/main' include { CUSTOM_MATRIXFILTER } from '../modules/nf-core/custom/matrixfilter/main' include { ATLASGENEANNOTATIONMANIPULATION_GTF2FEATUREANNOTATION as GTF_TO_TABLE } from '../modules/nf-core/atlasgeneannotationmanipulation/gtf2featureannotation/main' -include { GSEA_GSEA } from '../modules/nf-core/gsea/gsea/main' -include { GPROFILER2_GOST } from '../modules/nf-core/gprofiler2/gost/main' -include { CUSTOM_TABULARTOGSEAGCT } from '../modules/nf-core/custom/tabulartogseagct/main' -include { CUSTOM_TABULARTOGSEACLS } from '../modules/nf-core/custom/tabulartogseacls/main' include { RMARKDOWNNOTEBOOK } from '../modules/nf-core/rmarkdownnotebook/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_RAW } from '../modules/nf-core/affy/justrma/main' include { AFFY_JUSTRMA as AFFY_JUSTRMA_NORM } from '../modules/nf-core/affy/justrma/main' @@ -134,6 +137,39 @@ include { ZIP as MAKE_REPORT_BUNDLE } from '../modules/n include { IMMUNEDECONV } from '../modules/nf-core/immunedeconv/main' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' +// +// SUBWORKFLOW: Installed directly from nf-core/modules +// +include { ABUNDANCE_DIFFERENTIAL_FILTER } from '../subworkflows/nf-core/abundance_differential_filter/main' +include { DIFFERENTIAL_FUNCTIONAL_ENRICHMENT } from '../subworkflows/nf-core/differential_functional_enrichment/main' + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + DEFINE MAP CRITERIAS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +// When running differential and functional subworkflows, the method used +// to produce a given output is stored in the metadata 'method'. +// To avoid metadata overlapping, these criterias are used to replace +// 'method' by 'method_differential' or 'method_functional' afterwards. + +def methodCriteriaDifferential = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_differential'] = it[0].method + return [meta, it[1]] +} +def methodCriteriaFunctional = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_functional'] = it[0].method + return [meta, it[1]] +} +def methodCriteriaFunctionalFlatten = { it -> + def meta = it[0] - ['method': it[0].method] + meta['method_functional'] = it[0].method + return [meta, it[1..it.size()-1]].flatten() +} + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -360,172 +396,98 @@ workflow DIFFERENTIALABUNDANCE { VALIDATOR.out.sample_meta ) - // Prepare inputs for differential processes - - ch_samples_and_matrix = VALIDATOR.out.sample_meta - .join(CUSTOM_MATRIXFILTER.out.filtered) // -> meta, samplesheet, filtered matrix - .first() - - if (params.study_type == 'affy_array' || - params.study_type == 'geo_soft_file' || - params.study_type == 'maxquant' || - (params.study_type == 'rnaseq' && params.differential_use_limma) - ) { - - LIMMA_DIFFERENTIAL ( - ch_contrasts, - ch_samples_and_matrix - ) - ch_differential = LIMMA_DIFFERENTIAL.out.results - ch_model = LIMMA_DIFFERENTIAL.out.model + // ======================================================================== + // Differential analysis + // ======================================================================== - ch_versions = ch_versions - .mix(LIMMA_DIFFERENTIAL.out.versions) - - if (params.study_type == 'rnaseq') { - ch_norm = LIMMA_DIFFERENTIAL.out.normalised_counts.first() - } - - ch_processed_matrices = ch_norm - .map{ it.tail() } - .first() - - } else { - DESEQ2_NORM ( - ch_contrasts.first(), - ch_samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - // Run the DESeq differential module, which doesn't take the feature - // annotations - - DESEQ2_DIFFERENTIAL ( - ch_contrasts, - ch_samples_and_matrix, - ch_control_features, - ch_transcript_lengths - ) - - // Let's make the simplifying assumption that the processed matrices from - // the DESeq runs are the same across contrasts. We run the DESeq process - // with matrices once for each contrast because DESeqDataSetFromMatrix() - // takes the model, and the model can vary between contrasts if the - // blocking factors included differ. But the normalised and - // variance-stabilised matrices are not (IIUC) impacted by the model. - - ch_norm = DESEQ2_NORM.out.normalised_counts - ch_differential = DESEQ2_DIFFERENTIAL.out.results - ch_model = DESEQ2_DIFFERENTIAL.out.model - - ch_versions = ch_versions - .mix(DESEQ2_DIFFERENTIAL.out.versions) + // Prepare inputs for differential processes - ch_processed_matrices = ch_norm - if ('rlog' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.rlog_counts) + ch_differential_input = CUSTOM_MATRIXFILTER.out.filtered + .combine(ch_tools) + .map { meta, matrix, tools_differential, tools_functional -> + [ + meta, + matrix, + tools_differential.method, + tools_differential.fc_threshold, + tools_differential.stat_threshold + ] } - if ('vst' in params.deseq2_vs_method){ - ch_processed_matrices = ch_processed_matrices.join(DESEQ2_NORM.out.vst_counts) - } - ch_processed_matrices = ch_processed_matrices - .map{ it.tail() } - } - // We'll use a local module to filter the differential tables and create output files that contain only differential features - ch_logfc = Channel.value([ params.differential_fc_column, params.differential_min_fold_change ]) - ch_padj = Channel.value([ params.differential_qval_column, params.differential_max_qval ]) + // Run differential analysis - CUSTOM_FILTERDIFFERENTIALTABLE( - ch_differential, - ch_logfc.map{it[0]}, - ch_logfc.map{it[1]}, - ch_padj.map{it[0]}, - ch_padj.map{it[1]} + ABUNDANCE_DIFFERENTIAL_FILTER( + ch_differential_input, + VALIDATOR.out.sample_meta, + ch_transcript_lengths, + ch_control_features, + ch_contrasts ) - // Run a gene set analysis where directed + // collect differential results + // meta.method would be replaced by meta.method_differential - // Currently, we're letting GSEA work on the expression data. In future we - // will allow use of GSEA preranked instead, which will work with the fold - // changes/ p values from DESeq2 + ch_differential_results = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise.map(methodCriteriaDifferential) + ch_differential_results_filtered = ABUNDANCE_DIFFERENTIAL_FILTER.out.results_genewise_filtered.map(methodCriteriaDifferential) + ch_differential_model = ABUNDANCE_DIFFERENTIAL_FILTER.out.model.map(methodCriteriaDifferential) + ch_differential_norm = ABUNDANCE_DIFFERENTIAL_FILTER.out.normalised_matrix.map(methodCriteriaDifferential) + ch_differential_var = ABUNDANCE_DIFFERENTIAL_FILTER.out.variance_stabilised_matrix.filter{ it != null}.map(methodCriteriaDifferential) - if (params.gsea_run){ - - // For GSEA, we need to convert normalised counts to a GCT format for - // input, and process the sample sheet to generate class definitions - // (CLS) for the variable used in each contrast - - CUSTOM_TABULARTOGSEAGCT ( ch_norm ) - - // TODO: update CUSTOM_TABULARTOGSEACLS for value channel input per new - // guidlines (rather than meta usage employed here) - - ch_contrasts_and_samples = ch_contrasts - .map{it[0]} // revert back to contrasts meta map - .combine( VALIDATOR.out.sample_meta.map { it[1] } ) - - CUSTOM_TABULARTOGSEACLS(ch_contrasts_and_samples) - - TABULAR_TO_GSEA_CHIP( - VALIDATOR.out.feature_meta.map{ it[1] }, - [params.features_id_col, params.features_name_col] - ) - - // The normalised matrix does not always have a contrast meta, so we - // need a combine rather than a join here - // Also add file name to metamap for easy access from modules.config - - ch_gsea_inputs = CUSTOM_TABULARTOGSEAGCT.out.gct - .map{ it.tail() } - .combine(CUSTOM_TABULARTOGSEACLS.out.cls) - .map{ tuple(it[1], it[0], it[2]) } - .combine(ch_gene_sets) - - GSEA_GSEA( - ch_gsea_inputs, - ch_gsea_inputs.map{ tuple(it[0].reference, it[0].target) }, // * - TABULAR_TO_GSEA_CHIP.out.chip.first() - ) + ch_versions = ch_versions + .mix(ABUNDANCE_DIFFERENTIAL_FILTER.out.versions) - // * Note: GSEA module currently uses a value channel for the mandatory - // non-file arguments used to define contrasts, hence the indicated - // usage of map to perform that transformation. An active subject of - // debate + if (params.study_type == 'rnaseq') ch_norm = ch_differential_norm - ch_gsea_results = GSEA_GSEA.out.report_tsvs_ref - .join(GSEA_GSEA.out.report_tsvs_target) + // ======================================================================== + // Functional analysis + // ======================================================================== - // Record GSEA versions - ch_versions = ch_versions - .mix(TABULAR_TO_GSEA_CHIP.out.versions) - .mix(GSEA_GSEA.out.versions) - } + // Prepare background file - for the moment it is only needed for gprofiler2 + ch_background = Channel.of([[]]) if (params.gprofiler2_run) { - - // For gprofiler2, use only features that are considered differential - ch_filtered_diff = CUSTOM_FILTERDIFFERENTIALTABLE.out.filtered - - if (!params.gprofiler2_background_file) { - // If deactivated, use empty list as "background" - ch_background = [] - } else if (params.gprofiler2_background_file == "auto") { + if (params.gprofiler2_background_file == "auto") { // If auto, use input matrix as background ch_background = CUSTOM_MATRIXFILTER.out.filtered.map{it.tail()}.first() } else { ch_background = Channel.from(file(params.gprofiler2_background_file, checkIfExists: true)) } + } - // For gprofiler2, token and organism have priority and will override a gene_sets file + // Prepare input for functional analysis - GPROFILER2_GOST( - ch_filtered_diff, - ch_gene_sets.first(), - ch_background - ) - } + ch_functional_input = ch_differential_results_filtered.combine(ch_tools.filter{it[1].input_type == 'filtered'}) + .mix(ch_norm.combine(ch_tools.filter{it[1].input_type == 'norm'})) + .combine(ch_gene_sets) + .combine(ch_background) + .map { meta, input, tools_differential, tools_functional, gene_sets, background -> + if (!('method_differential' in meta) || (meta.method_differential == tools_differential.method)) { + return [meta, input, gene_sets, background, tools_functional.method] + } + } + + // Run functional analysis + + DIFFERENTIAL_FUNCTIONAL_ENRICHMENT( + ch_functional_input, + ch_contrasts, + VALIDATOR.out.sample_meta, + VALIDATOR.out.feature_meta.combine(Channel.of([params.features_id_col, params.features_name_col])) + ) + + // Prepare the results for downstream analysis + + ch_gsea_results = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gsea_report.map(methodCriteriaFunctionalFlatten) + gprofiler2_plot_html = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_plot_html.map(methodCriteriaFunctional) + gprofiler2_all_enrich = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_all_enrich.map(methodCriteriaFunctional) + gprofiler2_sub_enrich = DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.gprofiler2_sub_enrich.map(methodCriteriaFunctional) + + ch_versions = ch_versions + .mix(DIFFERENTIAL_FUNCTIONAL_ENRICHMENT.out.versions) + + // ======================================================================== + // Plot figures + // ======================================================================== // The exploratory plots are made by coloring by every unique variable used // to define contrasts @@ -538,31 +500,43 @@ workflow DIFFERENTIALABUNDANCE { // For geoquery we've done no matrix processing and been supplied with the // normalised matrix, which can be passed through to downstream analysis - if (params.study_type == "geo_soft_file") { - ch_mat = ch_norm + ch_mat = ch_norm.map {meta, norm -> [meta, [norm]]} } else { - ch_mat = ch_raw.combine(ch_processed_matrices) + ch_mat = ch_raw + .combine(ch_norm) + .combine( ch_differential_var.ifEmpty([[],[]]) ) + .map { meta_exp, raw, meta_norm, norm, meta_var, matrices -> + def matrices_new = [raw, norm] + matrices + if ((meta_norm.subMap(meta_exp.keySet()) == meta_exp) && + (meta_var == [] || meta_norm == meta_var) + ) { + return [meta_norm, matrices_new] + } + } } - ch_all_matrices = VALIDATOR.out.sample_meta // meta, samples + ch_all_matrices = VALIDATOR.out.sample_meta // meta, samples .join(VALIDATOR.out.feature_meta) // meta, samples, features - .join(ch_mat) // meta, samples, features, raw, norm (or just norm) - .map{ - tuple(it[0], it[1], it[2], it[3..it.size()-1]) + .combine(ch_mat) + .map { meta_exp, samples, features, meta_mat, matrices -> + if (meta_mat.subMap(meta_exp.keySet()) == meta_exp) { + return [meta_mat, samples, features, matrices] + } } - .first() + + // Exploratory analysis PLOT_EXPLORATORY( ch_contrast_variables .combine(ch_all_matrices.map{ it.tail() }) ) - // Differential analysis using the results of DESeq2 + // Differential analysis PLOT_DIFFERENTIAL( - ch_differential, - ch_all_matrices + ch_differential_results, + ch_all_matrices.first() ) // Gather software versions @@ -572,9 +546,11 @@ workflow DIFFERENTIALABUNDANCE { .mix(PLOT_EXPLORATORY.out.versions) .mix(PLOT_DIFFERENTIAL.out.versions) - // + // ======================================================================== + // Generate report + // ======================================================================== + // Collate and save software versions - // ch_collated_versions = softwareVersionsToYAML(ch_versions) .collectFile(storeDir: "${params.outdir}/pipeline_info", name: 'collated_versions.yml', sort: true, newLine: true) @@ -596,8 +572,8 @@ workflow DIFFERENTIALABUNDANCE { .combine(ch_logo_file) .combine(ch_css_file) .combine(ch_citations_file) - .combine(ch_differential.map{it[1]}.toList()) - .combine(ch_model.map{it[1]}.toList()) + .combine(ch_differential_results.map{it[1]}.toList()) + .combine(ch_differential_model.map{it[1]}.toList()) if (params.gsea_run){ ch_report_input_files = ch_report_input_files @@ -608,10 +584,9 @@ workflow DIFFERENTIALABUNDANCE { if (params.gprofiler2_run){ ch_report_input_files = ch_report_input_files - .combine(GPROFILER2_GOST.out.plot_html.map{it[1]}.flatMap().toList()) - .combine(GPROFILER2_GOST.out.all_enrich.map{it[1]}.flatMap().toList()) - .combine(GPROFILER2_GOST.out.sub_enrich.map{it[1]}.flatMap().toList()) - GPROFILER2_GOST.out.plot_html + .combine(gprofiler2_plot_html.map{it[1]}.flatMap().toList()) + .combine(gprofiler2_all_enrich.map{it[1]}.flatMap().toList()) + .combine(gprofiler2_sub_enrich.map{it[1]}.flatMap().toList()) } // Run IMMUNEDECONV @@ -632,15 +607,15 @@ workflow DIFFERENTIALABUNDANCE { // Make a new contrasts file from the differential metas to guarantee the // same order as the differential results - ch_app_differential = ch_differential.first().map{it[0].keySet().tail().join(',')} + ch_app_differential = ch_differential_results.first().map{it[0].keySet().tail().join(',')} .concat( - ch_differential.map{it[0].values().tail().join(',')} + ch_differential_results.map{it[0].values().tail().join(',')} ) .collectFile(name: 'contrasts.csv', newLine: true, sort: false) .map{ tuple(exp_meta, it) } - .combine(ch_differential.map{it[1]}.collect().map{[it]}) + .combine(ch_differential_results.map{it[1]}.collect().map{[it]}) SHINYNGS_APP( ch_all_matrices, // meta, samples, features, [ matrices ] @@ -686,6 +661,7 @@ workflow DIFFERENTIALABUNDANCE { params.findAll{ k,v -> k.matches(params_pattern) } + [report_file_names, it.collect{ f -> f.name}].transpose().collectEntries() } + // Render the final report RMARKDOWNNOTEBOOK( ch_report_file,