diff --git a/CHANGELOG.md b/CHANGELOG.md index e2466879..f8cc609f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### `Changed` +- [#719](https://github.com/nf-core/ampliseq/pull/719) - Versions of all (instead of selected) processes are now exported to `pipeline_info/software_versions.yml` + ### `Fixed` - [#697](https://github.com/nf-core/ampliseq/pull/697),[#699](https://github.com/nf-core/ampliseq/pull/699),[#713](https://github.com/nf-core/ampliseq/pull/713) - Template update for nf-core/tools version 2.13.1 diff --git a/modules/local/barrnapsummary.nf b/modules/local/barrnapsummary.nf index 20064bcb..89cefff9 100644 --- a/modules/local/barrnapsummary.nf +++ b/modules/local/barrnapsummary.nf @@ -11,7 +11,8 @@ process BARRNAPSUMMARY { output: path "summary.tsv" , emit: summary - path "*warning.txt" , emit: warning + path "*warning.txt", emit: warning + path "versions.yml", emit: versions when: task.ext.when == null || task.ext.when diff --git a/modules/local/format_taxonomy.nf b/modules/local/format_taxonomy.nf index 8981eaa3..e2e6cf9b 100644 --- a/modules/local/format_taxonomy.nf +++ b/modules/local/format_taxonomy.nf @@ -21,17 +21,17 @@ process FORMAT_TAXONOMY { script: """ - ${params.dada_ref_databases[params.dada_ref_taxonomy]["fmtscript"]} + ${params.dada_ref_databases[params.dada_ref_taxonomy]["fmtscript"]} \\ #Giving out information - echo -e "--dada_ref_taxonomy: ${params.dada_ref_taxonomy}\n" >ref_taxonomy.${suffix}.txt - echo -e "Title: ${params.dada_ref_databases[params.dada_ref_taxonomy]["title"]}\n" >>ref_taxonomy.${suffix}.txt - echo -e "Citation: ${params.dada_ref_databases[params.dada_ref_taxonomy]["citation"]}\n" >>ref_taxonomy.${suffix}.txt + echo -e "--dada_ref_taxonomy: ${params.dada_ref_taxonomy}\\n" >ref_taxonomy.${suffix}.txt + echo -e "Title: ${params.dada_ref_databases[params.dada_ref_taxonomy]["title"]}\\n" >>ref_taxonomy.${suffix}.txt + echo -e "Citation: ${params.dada_ref_databases[params.dada_ref_taxonomy]["citation"]}\\n" >>ref_taxonomy.${suffix}.txt echo "All entries: ${params.dada_ref_databases[params.dada_ref_taxonomy]}" >>ref_taxonomy.${suffix}.txt cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(bash --version | sed -n 1p | sed 's/GNU bash, version //g') + bash: \$(bash --version | sed -n 1p | grep -Eo 'version [[:alnum:].]+' | sed 's/version //') END_VERSIONS """ } diff --git a/modules/local/format_taxonomy_qiime.nf b/modules/local/format_taxonomy_qiime.nf index 6d652745..1fa1dad8 100644 --- a/modules/local/format_taxonomy_qiime.nf +++ b/modules/local/format_taxonomy_qiime.nf @@ -21,17 +21,17 @@ process FORMAT_TAXONOMY_QIIME { script: """ - ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["fmtscript"]} + ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["fmtscript"]} \\ #Giving out information - echo -e "--qiime_ref_taxonomy: ${params.qiime_ref_taxonomy}\n" >ref_taxonomy.txt - echo -e "Title: ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["title"]}\n" >>ref_taxonomy.txt - echo -e "Citation: ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["citation"]}\n" >>ref_taxonomy.txt + echo -e "--qiime_ref_taxonomy: ${params.qiime_ref_taxonomy}\\n" >ref_taxonomy.txt + echo -e "Title: ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["title"]}\\n" >>ref_taxonomy.txt + echo -e "Citation: ${params.qiime_ref_databases[params.qiime_ref_taxonomy]["citation"]}\\n" >>ref_taxonomy.txt echo "All entries: ${params.qiime_ref_databases[params.qiime_ref_taxonomy]}" >>ref_taxonomy.txt cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(bash --version | sed -n 1p | sed 's/GNU bash, version //g') + bash: \$(bash --version | sed -n 1p | grep -Eo 'version [[:alnum:].]+' | sed 's/version //') END_VERSIONS """ } diff --git a/modules/local/format_taxonomy_sidle.nf b/modules/local/format_taxonomy_sidle.nf index 72e55cd7..f5544aca 100644 --- a/modules/local/format_taxonomy_sidle.nf +++ b/modules/local/format_taxonomy_sidle.nf @@ -23,17 +23,17 @@ process FORMAT_TAXONOMY_SIDLE { script: def derep = params.sidle_ref_databases[params.sidle_ref_taxonomy]["derep"] ?: "99" """ - ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["fmtscript"]} ${derep} + ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["fmtscript"]} ${derep} \\ #Giving out information - echo -e "--sidle_ref_taxonomy: ${params.sidle_ref_taxonomy}\n" >ref_taxonomy.${suffix}.txt - echo -e "Title: ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["title"]}\n" >>ref_taxonomy.${suffix}.txt - echo -e "Citation: ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["citation"]}\n" >>ref_taxonomy.${suffix}.txt + echo -e "--sidle_ref_taxonomy: ${params.sidle_ref_taxonomy}\\n" >ref_taxonomy.${suffix}.txt + echo -e "Title: ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["title"]}\\n" >>ref_taxonomy.${suffix}.txt + echo -e "Citation: ${params.sidle_ref_databases[params.sidle_ref_taxonomy]["citation"]}\\n" >>ref_taxonomy.${suffix}.txt echo "All entries: ${params.sidle_ref_databases[params.sidle_ref_taxonomy]}" >>ref_taxonomy.${suffix}.txt cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(bash --version | sed -n 1p | sed 's/GNU bash, version //g') + bash: \$(bash --version | sed -n 1p | grep -Eo 'version [[:alnum:].]+' | sed 's/version //') END_VERSIONS """ } diff --git a/modules/local/format_taxonomy_sintax.nf b/modules/local/format_taxonomy_sintax.nf index 7ccfa745..06fd25fd 100644 --- a/modules/local/format_taxonomy_sintax.nf +++ b/modules/local/format_taxonomy_sintax.nf @@ -19,17 +19,17 @@ process FORMAT_TAXONOMY_SINTAX { script: """ - ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["fmtscript"]} + ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["fmtscript"]} \\ #Giving out information - echo -e "--sintax_ref_taxonomy: ${params.sintax_ref_taxonomy}\n" >ref_taxonomy_sintax.txt - echo -e "Title: ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["title"]}\n" >>ref_taxonomy_sintax.txt - echo -e "Citation: ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["citation"]}\n" >>ref_taxonomy_sintax.txt + echo -e "--sintax_ref_taxonomy: ${params.sintax_ref_taxonomy}\\n" >ref_taxonomy_sintax.txt + echo -e "Title: ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["title"]}\\n" >>ref_taxonomy_sintax.txt + echo -e "Citation: ${params.sintax_ref_databases[params.sintax_ref_taxonomy]["citation"]}\\n" >>ref_taxonomy_sintax.txt echo "All entries: ${params.sintax_ref_databases[params.sintax_ref_taxonomy]}" >>ref_taxonomy_sintax.txt cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(bash --version | sed -n 1p | sed 's/GNU bash, version //g') + bash: \$(bash --version | sed -n 1p | grep -Eo 'version [[:alnum:].]+' | sed 's/version //') END_VERSIONS """ } diff --git a/modules/local/phyloseq_inasv.nf b/modules/local/phyloseq_inasv.nf index f66d1669..cd750acb 100644 --- a/modules/local/phyloseq_inasv.nf +++ b/modules/local/phyloseq_inasv.nf @@ -22,7 +22,7 @@ process PHYLOSEQ_INASV { cat <<-END_VERSIONS > versions.yml "${task.process}": - bash: \$(bash --version | sed -n 1p | sed 's/GNU bash, version //g') + bash: \$(bash --version | sed -n 1p | grep -Eo 'version [[:alnum:].]+' | sed 's/version //') END_VERSIONS """ } diff --git a/subworkflows/local/cutadapt_workflow.nf b/subworkflows/local/cutadapt_workflow.nf index 6bd43de0..eebdf347 100644 --- a/subworkflows/local/cutadapt_workflow.nf +++ b/subworkflows/local/cutadapt_workflow.nf @@ -14,7 +14,10 @@ workflow CUTADAPT_WORKFLOW { ch_file illumina_pe_its double_primer + main: + ch_versions_cutadapt_workflow = Channel.empty() + CUTADAPT_BASIC ( ch_file ).reads.set { ch_trimmed_reads } CUTADAPT_BASIC.out.log .map { @@ -24,7 +27,9 @@ workflow CUTADAPT_WORKFLOW { [ meta, log ] } .groupTuple(by: 0 ) .set { ch_cutadapt_logs } + ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_BASIC.out.versions ) CUTADAPT_SUMMARY_STD ( "cutadapt_standard", ch_cutadapt_logs ) + ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_STD.out.versions ) if (illumina_pe_its) { CUTADAPT_READTHROUGH ( ch_trimmed_reads ).reads.set { ch_trimmed_reads } @@ -42,7 +47,9 @@ workflow CUTADAPT_WORKFLOW { .set { ch_cutadapt_doubleprimer_logs } CUTADAPT_SUMMARY_DOUBLEPRIMER ( "cutadapt_doubleprimer", ch_cutadapt_doubleprimer_logs ) ch_summaries = CUTADAPT_SUMMARY_STD.out.tsv.combine( CUTADAPT_SUMMARY_DOUBLEPRIMER.out.tsv ) + ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_DOUBLEPRIMER.out.versions ) CUTADAPT_SUMMARY_MERGE ( "merge", ch_summaries ) + ch_versions_cutadapt_workflow = ch_versions_cutadapt_workflow.mix( CUTADAPT_SUMMARY_MERGE.out.versions ) } else { CUTADAPT_SUMMARY_MERGE ( "copy", CUTADAPT_SUMMARY_STD.out.tsv ) } @@ -68,8 +75,8 @@ workflow CUTADAPT_WORKFLOW { } emit: - reads = ch_trimmed_reads_passed - logs = CUTADAPT_BASIC.out.log - summary = CUTADAPT_SUMMARY_MERGE.out.tsv - versions= CUTADAPT_BASIC.out.versions + reads = ch_trimmed_reads_passed + logs = CUTADAPT_BASIC.out.log + summary = CUTADAPT_SUMMARY_MERGE.out.tsv + versions = ch_versions_cutadapt_workflow } diff --git a/subworkflows/local/dada2_preprocessing.nf b/subworkflows/local/dada2_preprocessing.nf index 0715a621..0e4889d0 100644 --- a/subworkflows/local/dada2_preprocessing.nf +++ b/subworkflows/local/dada2_preprocessing.nf @@ -132,6 +132,7 @@ workflow DADA2_PREPROCESSING { ch_DADA2_QUALITY2_SVG = Channel.empty() if ( !params.skip_dada_quality ) { DADA2_QUALITY2 ( ch_all_preprocessed_reads.dump(tag: 'into_dada2_quality2') ) + ch_versions_dada2_preprocessing = ch_versions_dada2_preprocessing.mix(DADA2_QUALITY2.out.versions) DADA2_QUALITY2.out.warning.subscribe { if ( it.baseName.toString().startsWith("WARNING") ) log.warn it.baseName.toString().replace("WARNING ","DADA2_QUALITY2: ") } ch_DADA2_QUALITY2_SVG = DADA2_QUALITY2.out.svg } diff --git a/subworkflows/local/dada2_taxonomy_wf.nf b/subworkflows/local/dada2_taxonomy_wf.nf index 71fe438f..7d1037d3 100644 --- a/subworkflows/local/dada2_taxonomy_wf.nf +++ b/subworkflows/local/dada2_taxonomy_wf.nf @@ -46,6 +46,7 @@ workflow DADA2_TAXONOMY_WF { CUTADAPT_TAXONOMY ( ch_assigntax ).reads .map { meta, db -> db } .set { ch_assigntax } + ch_versions_dada_taxonomy = ch_versions_dada_taxonomy.mix( CUTADAPT_TAXONOMY.out.versions ) } //set file name prefix diff --git a/subworkflows/local/kraken2_taxonomy_wf.nf b/subworkflows/local/kraken2_taxonomy_wf.nf index f7d2ac48..9404b122 100644 --- a/subworkflows/local/kraken2_taxonomy_wf.nf +++ b/subworkflows/local/kraken2_taxonomy_wf.nf @@ -32,6 +32,7 @@ workflow KRAKEN2_TAXONOMY_WF { def meta = [:] meta.id = val_kraken2_ref_taxonomy [ meta, db ] } ) + ch_versions_kraken2_taxonomy = ch_versions_kraken2_taxonomy.mix(UNTAR.out.versions) ch_kraken2db = UNTAR.out.untar.map{ it[1] } ch_kraken2db = ch_kraken2db.mix(ch_kraken2_ref_taxonomy.dir) diff --git a/subworkflows/local/phyloseq_workflow.nf b/subworkflows/local/phyloseq_workflow.nf index 3b6d9dd4..b96fa814 100644 --- a/subworkflows/local/phyloseq_workflow.nf +++ b/subworkflows/local/phyloseq_workflow.nf @@ -39,6 +39,6 @@ workflow PHYLOSEQ_WORKFLOW { PHYLOSEQ ( ch_tax.combine(ch_phyloseq_inasv), ch_phyloseq_inmeta, ch_phyloseq_intree ) emit: - rds = PHYLOSEQ.out.rds - versions= PHYLOSEQ.out.versions + rds = PHYLOSEQ.out.rds + versions = PHYLOSEQ.out.versions } diff --git a/subworkflows/local/qiime2_ancom.nf b/subworkflows/local/qiime2_ancom.nf index ce308d78..fb2cd9cf 100644 --- a/subworkflows/local/qiime2_ancom.nf +++ b/subworkflows/local/qiime2_ancom.nf @@ -16,12 +16,15 @@ workflow QIIME2_ANCOM { tax_agglom_max main: + ch_versions_qiime2_ancom = Channel.empty() + //Filter ASV table to get rid of samples that have no metadata values ch_metadata .combine( ch_asv ) .combine( ch_metacolumn_all ) .set{ ch_for_filtersamples } QIIME2_FILTERSAMPLES_ANCOM ( ch_for_filtersamples ) + ch_versions_qiime2_ancom = ch_versions_qiime2_ancom.mix(QIIME2_FILTERSAMPLES_ANCOM.out.versions) //ANCOM on various taxonomic levels ch_taxlevel = Channel.of( tax_agglom_min..tax_agglom_max ) @@ -31,10 +34,13 @@ workflow QIIME2_ANCOM { .combine( ch_taxlevel ) .set{ ch_for_ancom_tax } QIIME2_ANCOM_TAX ( ch_for_ancom_tax ) + ch_versions_qiime2_ancom = ch_versions_qiime2_ancom.mix(QIIME2_ANCOM_TAX.out.versions) QIIME2_ANCOM_TAX.out.ancom.subscribe { if ( it.baseName[0].toString().startsWith("WARNING") ) log.warn it.baseName[0].toString().replace("WARNING ","QIIME2_ANCOM_TAX: ") } QIIME2_ANCOM_ASV ( ch_metadata.combine( QIIME2_FILTERSAMPLES_ANCOM.out.qza.flatten() ) ) + ch_versions_qiime2_ancom = ch_versions_qiime2_ancom.mix(QIIME2_ANCOM_ASV.out.versions) emit: - ancom = QIIME2_ANCOM_ASV.out.ancom.mix(QIIME2_ANCOM_TAX.out.ancom) + ancom = QIIME2_ANCOM_ASV.out.ancom.mix(QIIME2_ANCOM_TAX.out.ancom) + versions = ch_versions_qiime2_ancom } diff --git a/subworkflows/local/qiime2_barplotavg.nf b/subworkflows/local/qiime2_barplotavg.nf index a052027c..e65d7d05 100644 --- a/subworkflows/local/qiime2_barplotavg.nf +++ b/subworkflows/local/qiime2_barplotavg.nf @@ -14,10 +14,12 @@ workflow QIIME2_BARPLOTAVG { metadata_category_barplot main: + ch_versions_qiime2_barplotavg = Channel.empty() ch_metadata_category_barplot = Channel.fromList(metadata_category_barplot.tokenize(',')) //Import raltive ASV table QIIME2_INASV_BPAVG ( ch_rel_tsv ) + ch_versions_qiime2_barplotavg = ch_versions_qiime2_barplotavg.mix(QIIME2_INASV_BPAVG.out.versions) //group by metadata category (ch_metadata_category_barplot) QIIME2_FEATURETABLE_GROUP ( @@ -25,8 +27,12 @@ workflow QIIME2_BARPLOTAVG { .combine(ch_metadata) .combine(ch_metadata_category_barplot) ) + ch_versions_qiime2_barplotavg = ch_versions_qiime2_barplotavg.mix(QIIME2_FEATURETABLE_GROUP.out.versions) //Barplot QIIME2_BPAVG ( [], QIIME2_FEATURETABLE_GROUP.out.qza, ch_tax, 'average' ) + ch_versions_qiime2_barplotavg = ch_versions_qiime2_barplotavg.mix(QIIME2_BPAVG.out.versions) + emit: + versions = ch_versions_qiime2_barplotavg } diff --git a/subworkflows/local/qiime2_diversity.nf b/subworkflows/local/qiime2_diversity.nf index 02f0d91e..8d47a3ca 100644 --- a/subworkflows/local/qiime2_diversity.nf +++ b/subworkflows/local/qiime2_diversity.nf @@ -24,21 +24,26 @@ workflow QIIME2_DIVERSITY { diversity_rarefaction_depth main: + ch_versions_qiime2_diversity = Channel.empty() + //Phylogenetic tree for beta & alpha diversities if (!ch_tree) { QIIME2_TREE ( ch_seq ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_TREE.out.versions) ch_tree = QIIME2_TREE.out.qza } //Alpha-rarefaction if (!skip_alpha_rarefaction) { QIIME2_ALPHARAREFACTION ( ch_metadata, ch_asv, ch_tree, ch_stats ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_ALPHARAREFACTION.out.versions) } //Calculate diversity indices if (!skip_diversity_indices) { QIIME2_DIVERSITY_CORE ( ch_metadata, ch_asv, ch_tree, ch_stats, diversity_rarefaction_depth ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_DIVERSITY_CORE.out.versions) //Print warning if rarefaction depth is <10000 QIIME2_DIVERSITY_CORE.out.depth.subscribe { if ( it.baseName.toString().startsWith("WARNING") ) log.warn it.baseName.toString().replace("WARNING ","QIIME2_DIVERSITY_CORE: ") } @@ -47,6 +52,7 @@ workflow QIIME2_DIVERSITY { .combine( QIIME2_DIVERSITY_CORE.out.vector.flatten() ) .set{ ch_to_diversity_alpha } QIIME2_DIVERSITY_ALPHA ( ch_to_diversity_alpha ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_DIVERSITY_ALPHA.out.versions) //beta_diversity ( ch_metadata, DIVERSITY_CORE.out.qza, ch_metacolumn_pairwise ) ch_metadata @@ -54,6 +60,7 @@ workflow QIIME2_DIVERSITY { .combine( ch_metacolumn_pairwise ) .set{ ch_to_diversity_beta } QIIME2_DIVERSITY_BETA ( ch_to_diversity_beta ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_DIVERSITY_BETA.out.versions) //adonis ( ch_metadata, DIVERSITY_CORE.out.qza ) if (params.qiime_adonis_formula) { @@ -63,6 +70,7 @@ workflow QIIME2_DIVERSITY { .combine( ch_qiime_adonis_formula ) .set{ ch_to_diversity_beta } QIIME2_DIVERSITY_ADONIS ( ch_to_diversity_beta ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_DIVERSITY_ADONIS.out.versions) } //beta_diversity_ordination ( ch_metadata, DIVERSITY_CORE.out.qza ) @@ -70,12 +78,14 @@ workflow QIIME2_DIVERSITY { .combine( QIIME2_DIVERSITY_CORE.out.pcoa.flatten() ) .set{ ch_to_diversity_betaord } QIIME2_DIVERSITY_BETAORD ( ch_to_diversity_betaord ) + ch_versions_qiime2_diversity = ch_versions_qiime2_diversity.mix(QIIME2_DIVERSITY_BETAORD.out.versions) } emit: - depth = !skip_diversity_indices ? QIIME2_DIVERSITY_CORE.out.depth : [] - alpha = !skip_diversity_indices ? QIIME2_DIVERSITY_ALPHA.out.alpha : [] - beta = !skip_diversity_indices ? QIIME2_DIVERSITY_BETA.out.beta : [] - betaord = !skip_diversity_indices ? QIIME2_DIVERSITY_BETAORD.out.beta : [] - adonis = !skip_diversity_indices && params.qiime_adonis_formula ? QIIME2_DIVERSITY_ADONIS.out.html : [] + depth = !skip_diversity_indices ? QIIME2_DIVERSITY_CORE.out.depth : [] + alpha = !skip_diversity_indices ? QIIME2_DIVERSITY_ALPHA.out.alpha : [] + beta = !skip_diversity_indices ? QIIME2_DIVERSITY_BETA.out.beta : [] + betaord = !skip_diversity_indices ? QIIME2_DIVERSITY_BETAORD.out.beta : [] + adonis = !skip_diversity_indices && params.qiime_adonis_formula ? QIIME2_DIVERSITY_ADONIS.out.html : [] + versions = ch_versions_qiime2_diversity } diff --git a/subworkflows/local/qiime2_export.nf b/subworkflows/local/qiime2_export.nf index 9308f777..a52942f4 100644 --- a/subworkflows/local/qiime2_export.nf +++ b/subworkflows/local/qiime2_export.nf @@ -23,29 +23,39 @@ workflow QIIME2_EXPORT { tax_agglom_max main: + ch_versions_qiime2_export = Channel.empty() + //export_filtered_dada_output (optional) QIIME2_EXPORT_ABSOLUTE ( ch_asv, ch_seq, ch_tax, tax_agglom_min, tax_agglom_max ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(QIIME2_EXPORT_ABSOLUTE.out.versions) //RelativeAbundanceASV (optional) QIIME2_EXPORT_RELASV ( ch_asv ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(QIIME2_EXPORT_RELASV.out.versions) //RelativeAbundanceReducedTaxa (optional) QIIME2_EXPORT_RELTAX ( ch_asv, ch_tax, tax_agglom_min, tax_agglom_max ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(QIIME2_EXPORT_RELTAX.out.versions) //combine_table.r (optional), similar to DADA2_table.tsv but with additionally taxonomy merged COMBINE_TABLE_QIIME2 ( QIIME2_EXPORT_RELASV.out.tsv, QIIME2_EXPORT_ABSOLUTE.out.fasta, ch_QIIME2_tax_tsv, 'rel-table-ASV_with-QIIME2-tax.tsv' ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(COMBINE_TABLE_QIIME2.out.versions) //combine_table.r (optional), similar to DADA2_table.tsv but with additionally taxonomy merged COMBINE_TABLE_DADA2 ( QIIME2_EXPORT_RELASV.out.tsv, QIIME2_EXPORT_ABSOLUTE.out.fasta, ch_DADA2_tax_tsv, 'rel-table-ASV_with-DADA2-tax.tsv' ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(COMBINE_TABLE_DADA2.out.versions) //combine_table.r (optional), similar to DADA2_table.tsv but with additionally taxonomy merged COMBINE_TABLE_PPLACE ( QIIME2_EXPORT_RELASV.out.tsv, QIIME2_EXPORT_ABSOLUTE.out.fasta, ch_pplace_tax_tsv, 'rel-table-ASV_with-PPLACE-tax.tsv' ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(COMBINE_TABLE_PPLACE.out.versions) //combine_table.r (optional), similar to DADA2_table.tsv but with additionally taxonomy merged COMBINE_TABLE_SINTAX ( QIIME2_EXPORT_RELASV.out.tsv, QIIME2_EXPORT_ABSOLUTE.out.fasta, ch_SINTAX_tax_tsv, 'rel-table-ASV_with-SINTAX-tax.tsv' ) + ch_versions_qiime2_export = ch_versions_qiime2_export.mix(COMBINE_TABLE_SINTAX.out.versions) emit: - abs_fasta = QIIME2_EXPORT_ABSOLUTE.out.fasta - abs_tsv = QIIME2_EXPORT_ABSOLUTE.out.tsv - rel_tsv = QIIME2_EXPORT_RELASV.out.tsv + abs_fasta = QIIME2_EXPORT_ABSOLUTE.out.fasta + abs_tsv = QIIME2_EXPORT_ABSOLUTE.out.tsv + rel_tsv = QIIME2_EXPORT_RELASV.out.tsv + versions = ch_versions_qiime2_export } diff --git a/subworkflows/local/qiime2_taxonomy.nf b/subworkflows/local/qiime2_taxonomy.nf index 03b1625d..010a09dd 100644 --- a/subworkflows/local/qiime2_taxonomy.nf +++ b/subworkflows/local/qiime2_taxonomy.nf @@ -15,7 +15,7 @@ workflow QIIME2_TAXONOMY { QIIME2_CLASSIFY ( ch_classifier, QIIME2_INSEQ.out.qza ) emit: - qza = QIIME2_CLASSIFY.out.qza - tsv = QIIME2_CLASSIFY.out.tsv - versions= QIIME2_INSEQ.out.versions + qza = QIIME2_CLASSIFY.out.qza + tsv = QIIME2_CLASSIFY.out.tsv + versions = QIIME2_INSEQ.out.versions.mix(QIIME2_CLASSIFY.out.versions) } diff --git a/subworkflows/local/sidle_wf.nf b/subworkflows/local/sidle_wf.nf index 9b091b3e..d65fe571 100644 --- a/subworkflows/local/sidle_wf.nf +++ b/subworkflows/local/sidle_wf.nf @@ -31,6 +31,7 @@ workflow SIDLE_WF { if (!params.sidle_ref_tax_custom) { //standard ref taxonomy input from conf/ref_databases.config, one tar.gz / tgz with all files FORMAT_TAXONOMY_SIDLE ( ch_sidle_ref_taxonomy, val_sidle_ref_taxonomy ) + ch_sidle_versions = ch_sidle_versions.mix(FORMAT_TAXONOMY_SIDLE.out.versions) ch_db_sequences = FORMAT_TAXONOMY_SIDLE.out.seq ch_db_alignedsequences = FORMAT_TAXONOMY_SIDLE.out.alnseq ch_db_taxonomy = FORMAT_TAXONOMY_SIDLE.out.tax diff --git a/subworkflows/local/sintax_taxonomy_wf.nf b/subworkflows/local/sintax_taxonomy_wf.nf index 99bbf971..ee9c9beb 100644 --- a/subworkflows/local/sintax_taxonomy_wf.nf +++ b/subworkflows/local/sintax_taxonomy_wf.nf @@ -20,6 +20,7 @@ workflow SINTAX_TAXONOMY_WF { //format taxonomy file FORMAT_TAXONOMY_SINTAX ( ch_sintax_ref_taxonomy ) + ch_versions_sintax_taxonomy = ch_versions_sintax_taxonomy.mix(FORMAT_TAXONOMY_SINTAX.out.versions) ch_sintaxdb = FORMAT_TAXONOMY_SINTAX.out.db //set file prefix @@ -44,6 +45,7 @@ workflow SINTAX_TAXONOMY_WF { //convert SINTAX output to DADA2 like taxonomy table FORMAT_TAXRESULTS_SINTAX( VSEARCH_SINTAX.out.tsv, ch_full_fasta, ASV_tax_name2 + '.tsv', sintax_taxlevels ) + ch_versions_sintax_taxonomy = ch_versions_sintax_taxonomy.mix(FORMAT_TAXRESULTS_SINTAX.out.versions) ch_sintax_tax = FORMAT_TAXRESULTS_SINTAX.out.tsv emit: diff --git a/workflows/ampliseq.nf b/workflows/ampliseq.nf index 380e6bf6..d1d306c0 100644 --- a/workflows/ampliseq.nf +++ b/workflows/ampliseq.nf @@ -362,7 +362,7 @@ workflow AMPLISEQ { params.double_primer ).reads.set { ch_trimmed_reads } ch_multiqc_files = ch_multiqc_files.mix(CUTADAPT_WORKFLOW.out.logs.collect{it[1]}) - ch_versions = ch_versions.mix(CUTADAPT_WORKFLOW.out.versions.first()) + ch_versions = ch_versions.mix(CUTADAPT_WORKFLOW.out.versions) } else { ch_trimmed_reads = RENAME_RAW_DATA_FILES.out.fastq } @@ -387,10 +387,12 @@ workflow AMPLISEQ { if ( !params.illumina_novaseq ) { DADA2_ERR ( ch_filt_reads ) ch_errormodel = DADA2_ERR.out.errormodel + ch_versions = ch_versions.mix(DADA2_ERR.out.versions) } else { DADA2_ERR ( ch_filt_reads ) NOVASEQ_ERR ( DADA2_ERR.out.errormodel ) ch_errormodel = NOVASEQ_ERR.out.errormodel + ch_versions = ch_versions.mix(DADA2_ERR.out.versions) } //group by meta @@ -398,9 +400,10 @@ workflow AMPLISEQ { .join( ch_errormodel ) .set { ch_derep_errormodel } DADA2_DENOISING ( ch_derep_errormodel.dump(tag: 'into_denoising') ) - ch_versions = ch_versions.mix(DADA2_DENOISING.out.versions.first()) + ch_versions = ch_versions.mix(DADA2_DENOISING.out.versions) DADA2_RMCHIMERA ( DADA2_DENOISING.out.seqtab ) + ch_versions = ch_versions.mix(DADA2_RMCHIMERA.out.versions) //group by sequencing run & group by meta DADA2_PREPROCESSING.out.logs @@ -409,16 +412,19 @@ workflow AMPLISEQ { .join( DADA2_RMCHIMERA.out.rds ) .set { ch_track_numbers } DADA2_STATS ( ch_track_numbers ) + ch_versions = ch_versions.mix(DADA2_STATS.out.versions) //merge if several runs, otherwise just publish DADA2_MERGE ( DADA2_STATS.out.stats.map { meta, stats -> stats }.collect(), DADA2_RMCHIMERA.out.rds.map { meta, rds -> rds }.collect() ) + ch_versions = ch_versions.mix(DADA2_MERGE.out.versions) //merge cutadapt_summary and dada_stats files if (!params.skip_cutadapt) { MERGE_STATS_STD (CUTADAPT_WORKFLOW.out.summary, DADA2_MERGE.out.dada2stats) ch_stats = MERGE_STATS_STD.out.tsv + ch_versions = ch_versions.mix(MERGE_STATS_STD.out.versions) } else { ch_stats = DADA2_MERGE.out.dada2stats } @@ -475,9 +481,9 @@ workflow AMPLISEQ { meta.id = "ASV_post_clustering" [ meta, fasta ] } VSEARCH_CLUSTER ( ch_fasta_for_clustering ) - ch_versions = ch_versions.mix(VSEARCH_CLUSTER.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(VSEARCH_CLUSTER.out.versions) FILTER_CLUSTERS ( VSEARCH_CLUSTER.out.clusters, ch_dada2_asv ) - ch_versions = ch_versions.mix(FILTER_CLUSTERS.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(FILTER_CLUSTERS.out.versions) ch_dada2_fasta = FILTER_CLUSTERS.out.fasta ch_dada2_asv = FILTER_CLUSTERS.out.asv } @@ -488,6 +494,7 @@ workflow AMPLISEQ { if ( params.input_fasta ) { FORMAT_FASTAINPUT( ch_input_fasta ) ch_unfiltered_fasta = FORMAT_FASTAINPUT.out.fasta + ch_versions = ch_versions.mix(FORMAT_FASTAINPUT.out.versions) } else { ch_unfiltered_fasta = ch_dada2_fasta } @@ -497,16 +504,19 @@ workflow AMPLISEQ { // if ( !params.skip_barrnap && params.filter_ssu && !params.multiregion ) { BARRNAP ( ch_unfiltered_fasta ) + ch_versions = ch_versions.mix(BARRNAP.out.versions) BARRNAPSUMMARY ( BARRNAP.out.gff.collect() ) + ch_versions = ch_versions.mix(BARRNAPSUMMARY.out.versions) BARRNAPSUMMARY.out.warning.subscribe { if ( it.baseName.toString().startsWith("WARNING") ) { error("Barrnap could not identify any rRNA in the ASV sequences! This will result in all sequences being removed with SSU filtering.") } } ch_barrnapsummary = BARRNAPSUMMARY.out.summary - ch_versions = ch_versions.mix(BARRNAP.out.versions.ifEmpty(null)) FILTER_SSU ( ch_unfiltered_fasta, ch_dada2_asv.ifEmpty( [] ), BARRNAPSUMMARY.out.summary ) + ch_versions = ch_versions.mix(FILTER_SSU.out.versions) MERGE_STATS_FILTERSSU ( ch_stats, FILTER_SSU.out.stats ) + ch_versions = ch_versions.mix(MERGE_STATS_FILTERSSU.out.versions) ch_stats = MERGE_STATS_FILTERSSU.out.tsv ch_dada2_fasta = FILTER_SSU.out.fasta ch_dada2_asv = FILTER_SSU.out.asv @@ -515,7 +525,8 @@ workflow AMPLISEQ { BARRNAPSUMMARY ( BARRNAP.out.gff.collect() ) BARRNAPSUMMARY.out.warning.subscribe { if ( it.baseName.toString().startsWith("WARNING") ) log.warn "Barrnap could not identify any rRNA in the ASV sequences. We recommended to use the --skip_barrnap option for these sequences." } ch_barrnapsummary = BARRNAPSUMMARY.out.summary - ch_versions = ch_versions.mix(BARRNAP.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(BARRNAP.out.versions) + ch_versions = ch_versions.mix(BARRNAPSUMMARY.out.versions) ch_dada2_fasta = ch_unfiltered_fasta } else { ch_barrnapsummary = Channel.empty() @@ -527,7 +538,7 @@ workflow AMPLISEQ { // if ( (params.min_len_asv || params.max_len_asv) && !params.multiregion ) { FILTER_LEN_ASV ( ch_dada2_fasta, ch_dada2_asv.ifEmpty( [] ) ) - ch_versions = ch_versions.mix(FILTER_LEN_ASV.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(FILTER_LEN_ASV.out.versions) MERGE_STATS_FILTERLENASV ( ch_stats, FILTER_LEN_ASV.out.stats ) ch_stats = MERGE_STATS_FILTERLENASV.out.tsv ch_dada2_fasta = FILTER_LEN_ASV.out.fasta @@ -541,8 +552,9 @@ workflow AMPLISEQ { // if ( params.filter_codons && !params.multiregion ) { FILTER_CODONS ( ch_dada2_fasta, ch_dada2_asv.ifEmpty( [] ) ) - ch_versions = ch_versions.mix(FILTER_CODONS.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(FILTER_CODONS.out.versions) MERGE_STATS_CODONS( ch_stats, FILTER_CODONS.out.stats ) + ch_versions = ch_versions.mix(MERGE_STATS_CODONS.out.versions) ch_stats = MERGE_STATS_CODONS.out.tsv ch_dada2_fasta = FILTER_CODONS.out.fasta ch_dada2_asv = FILTER_CODONS.out.asv @@ -567,7 +579,7 @@ workflow AMPLISEQ { outfile = params.its_partial ? "ASV_ITS_seqs.ITS2.full_and_partial.fasta" : "ASV_ITS_seqs.ITS2.fasta" } ITSX_CUTASV ( ch_full_fasta, outfile ) - ch_versions = ch_versions.mix(ITSX_CUTASV.out.versions.ifEmpty(null)) + ch_versions = ch_versions.mix(ITSX_CUTASV.out.versions) FILTER_LEN_ITSX ( ITSX_CUTASV.out.fasta, [] ) ch_fasta = FILTER_LEN_ITSX.out.fasta } @@ -581,6 +593,7 @@ workflow AMPLISEQ { if (!params.dada_ref_tax_custom) { //standard ref taxonomy input from conf/ref_databases.config FORMAT_TAXONOMY ( ch_dada_ref_taxonomy.collect(), val_dada_ref_taxonomy ) + ch_versions = ch_versions.mix(FORMAT_TAXONOMY.out.versions) ch_assigntax = FORMAT_TAXONOMY.out.assigntax ch_addspecies = FORMAT_TAXONOMY.out.addspecies } @@ -664,7 +677,7 @@ workflow AMPLISEQ { ch_fasta, ch_qiime_classifier ) - ch_versions = ch_versions.mix( QIIME2_TAXONOMY.out.versions.ifEmpty(null) ) //usually a .first() is here, dont know why this leads here to a warning + ch_versions = ch_versions.mix( QIIME2_TAXONOMY.out.versions ) ch_qiime2_tax = QIIME2_TAXONOMY.out.tsv ch_tax_for_phyloseq = ch_tax_for_phyloseq.mix ( PHYLOSEQ_INTAX_QIIME2 ( ch_qiime2_tax ).tsv.map { it = [ "qiime2", file(it) ] } ) } else { @@ -677,11 +690,14 @@ workflow AMPLISEQ { if ( run_qiime2 ) { // Import ASV abundance table and sequences into QIIME2 QIIME2_INASV ( ch_dada2_asv ) + ch_versions = ch_versions.mix( QIIME2_INASV.out.versions ) QIIME2_INSEQ ( ch_fasta ) + ch_versions = ch_versions.mix( QIIME2_INSEQ.out.versions ) // Import phylogenetic tree into QIIME2 if ( params.pplace_tree ) { ch_tree = QIIME2_INTREE ( FASTA_NEWICK_EPANG_GAPPA.out.grafted_phylogeny ).qza + ch_versions = ch_versions.mix( QIIME2_INTREE.out.versions ) } else if (params.multiregion) { ch_tree = SIDLE_WF.out.tree_qza } else { ch_tree = [] } @@ -734,10 +750,13 @@ workflow AMPLISEQ { params.min_samples, params.exclude_taxa ) + ch_versions = ch_versions.mix( QIIME2_TABLEFILTERTAXA.out.versions ) QIIME2_SEQFILTERTABLE ( QIIME2_TABLEFILTERTAXA.out.qza, QIIME2_INSEQ.out.qza ) + ch_versions = ch_versions.mix( QIIME2_SEQFILTERTABLE.out.versions ) FILTER_STATS ( ch_dada2_asv, QIIME2_TABLEFILTERTAXA.out.tsv ) ch_versions = ch_versions.mix( FILTER_STATS.out.versions.ifEmpty(null) ) MERGE_STATS_FILTERTAXA (ch_stats, FILTER_STATS.out.tsv) + ch_versions = ch_versions.mix( MERGE_STATS_FILTERTAXA.out.versions ) ch_asv = QIIME2_TABLEFILTERTAXA.out.qza ch_seq = QIIME2_SEQFILTERTABLE.out.qza ch_tsv = QIIME2_TABLEFILTERTAXA.out.tsv @@ -749,29 +768,35 @@ workflow AMPLISEQ { //Export various ASV tables if (!params.skip_abundance_tables) { QIIME2_EXPORT ( ch_asv, ch_seq, ch_tax, ch_qiime2_tax, ch_dada2_tax, ch_pplace_tax, ch_sintax_tax, tax_agglom_min, tax_agglom_max ) + ch_versions = ch_versions.mix( QIIME2_EXPORT.out.versions ) } if (!params.skip_barplot) { QIIME2_BARPLOT ( ch_metadata, ch_asv, ch_tax, '' ) + ch_versions = ch_versions.mix( QIIME2_BARPLOT.out.versions ) } if (params.metadata_category_barplot) { QIIME2_BARPLOTAVG ( ch_metadata, QIIME2_EXPORT.out.rel_tsv, ch_tax, params.metadata_category_barplot ) + ch_versions = ch_versions.mix( QIIME2_BARPLOTAVG.out.versions ) } //Select metadata categories for diversity analysis & ancom if (params.metadata_category) { ch_metacolumn_all = Channel.fromList(params.metadata_category.tokenize(',')) METADATA_PAIRWISE ( ch_metadata ).category.set { ch_metacolumn_pairwise } + ch_versions = ch_versions.mix( METADATA_PAIRWISE.out.versions ) ch_metacolumn_pairwise = ch_metacolumn_pairwise.splitCsv().flatten() ch_metacolumn_pairwise = ch_metacolumn_all.join(ch_metacolumn_pairwise) } else if (!params.skip_ancom || !params.skip_diversity_indices) { METADATA_ALL ( ch_metadata ).category.set { ch_metacolumn_all } + ch_versions = ch_versions.mix( METADATA_ALL.out.versions ) //return empty channel if no appropriate column was found ch_metacolumn_all.branch { passed: it != "" }.set { result } ch_metacolumn_all = result.passed ch_metacolumn_all = ch_metacolumn_all.splitCsv().flatten() METADATA_PAIRWISE ( ch_metadata ).category.set { ch_metacolumn_pairwise } + ch_versions = ch_versions.mix( METADATA_PAIRWISE.out.versions ) ch_metacolumn_pairwise = ch_metacolumn_pairwise.splitCsv().flatten() } else { ch_metacolumn_all = Channel.empty() @@ -792,6 +817,7 @@ workflow AMPLISEQ { params.skip_diversity_indices, params.diversity_rarefaction_depth ) + ch_versions = ch_versions.mix( QIIME2_DIVERSITY.out.versions ) } //Perform ANCOM tests @@ -804,6 +830,7 @@ workflow AMPLISEQ { tax_agglom_min, tax_agglom_max ) + ch_versions = ch_versions.mix( QIIME2_ANCOM.out.versions ) } } else { ch_tsv = ch_dada2_asv