diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 30e6602..7a527a3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -11,7 +11,7 @@ jobs: pre-commit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Set up Python 3.14 uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6 @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out pipeline code - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Install Nextflow uses: nf-core/setup-nextflow@v2 @@ -71,7 +71,7 @@ jobs: - name: Upload linting log file artifact if: ${{ always() }} - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: linting-logs path: | diff --git a/.github/workflows/nf-test.yml b/.github/workflows/nf-test.yml index afcd1fd..f1cbbb0 100644 --- a/.github/workflows/nf-test.yml +++ b/.github/workflows/nf-test.yml @@ -81,7 +81,7 @@ jobs: - isMain: false profile: "singularity" NXF_VER: - - "24.10.5" + - "25.10.0" - "latest-everything" env: NXF_ANSI_LOG: false diff --git a/.nf-core.yml b/.nf-core.yml index 1a471a8..9c7cdea 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -1,6 +1,6 @@ repository_type: pipeline -nf_core_version: 3.4.1 +nf_core_version: 3.5.2 lint: {} diff --git a/.prettierignore b/.prettierignore index 2255e3e..dd749d4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -12,3 +12,5 @@ testing* bin/ .nf-test/ ro-crate-metadata.json +modules/nf-core/ +subworkflows/nf-core/ diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index 622e184..fade6e7 100644 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -35,6 +35,10 @@ report_section_order: bcftools: order: 100 +custom_logo: "nf-core-bactmap_logo_light.png" +custom_logo_url: https://nf-co.re/bactmap +custom_logo_title: "nf-core/bactmap" + # List of run modules run_modules: - fastqc diff --git a/assets/nf-core-bactmap_logo_light.png b/assets/nf-core-bactmap_logo_light.png index 47f376d..9fd8de1 100644 Binary files a/assets/nf-core-bactmap_logo_light.png and b/assets/nf-core-bactmap_logo_light.png differ diff --git a/conf/modules.config b/conf/modules.config index f22bb75..cc7186e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -15,77 +15,93 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] - withName: 'BWAMEM2_INDEX' { + withName: BWAMEM2_INDEX { publishDir = [ path: { "${params.outdir}/bwamem2/index" }, mode: params.publish_dir_mode, ] } - withName: 'BOWTIE2_BUILD' { + withName: BOWTIE2_BUILD { publishDir = [ path: { "${params.outdir}/bowtie2/build" }, mode: params.publish_dir_mode, ] } - withName: 'SAMTOOLS_FAIDX' { + withName: SAMTOOLS_FAIDX { publishDir = [ path: { "${params.outdir}/samtools/faidx" }, mode: params.publish_dir_mode, - pattern: '*.{fai,gzi}' + pattern: '*.{fai,gzi}', ] } - withName: 'FASTQSCAN_RAW' { + withName: FASTQSCAN_RAW { ext.prefix = { "${meta.id}_${meta.run_accession}.raw" } publishDir = [ path: { "${params.outdir}/fastqscan/raw" }, mode: params.publish_dir_mode, - pattern: '*.json' + pattern: '*.json', ] } - withName: 'FASTQSCANPARSE_RAW' { + withName: FASTQSCANPARSE_RAW { ext.prefix = { "raw" } publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'FASTQC' { - ext.args = '--quiet' + withName: FASTQC { + ext.args = '--quiet' ext.prefix = { "${meta.id}_${meta.run_accession}_raw" } publishDir = [ path: { "${params.outdir}/fastqc/raw" }, mode: params.publish_dir_mode, - pattern: '*.{html,zip}' + pattern: '*.{html,zip}', ] } - withName: 'FASTQC_PROCESSED' { - ext.args = '--quiet' + withName: FASTQC_PROCESSED { + ext.args = '--quiet' ext.prefix = { "${meta.id}_${meta.run_accession}_processed" } publishDir = [ path: { "${params.outdir}/fastqc/processed" }, mode: params.publish_dir_mode, - pattern: '*.{html,zip}' + pattern: '*.{html,zip}', ] } - withName: 'FASTP_SINGLE' { + withName: FALCO { + ext.prefix = { "${meta.id}_${meta.run_accession}_raw_falco" } + publishDir = [ + path: { "${params.outdir}/falco/raw" }, + mode: params.publish_dir_mode, + pattern: '*.{html,txt,zip}', + ] + } + + withName: FALCO_PROCESSED { + ext.prefix = { "${meta.id}_${meta.run_accession}_processed_falco" } + publishDir = [ + path: { "${params.outdir}/falco/processed" }, + mode: params.publish_dir_mode, + pattern: '*.{html,txt,zip}', + ] + } + + withName: FASTP_SINGLE { ext.args = [ - // trimming options params.shortread_qc_skipadaptertrim ? "--disable_adapter_trimming" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter_sequence ${params.shortread_qc_adapter1}" : "", - // filtering options "--length_required ${params.shortread_qc_minlength}", - "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10" + "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -93,35 +109,31 @@ process { path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, - pattern: '*.{log,html,json}' + pattern: '*.{log,html,json}', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_analysis_ready_fastqs, - // Don't know why `!` doesn't work here, but `== false` makes it work... - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FASTP_PAIRED' { + withName: FASTP_PAIRED { ext.args = [ - // collapsing options - option to retain singletons params.shortread_qc_includeunmerged ? '--include_unmerged' : '', - // trimming options params.shortread_qc_skipadaptertrim ? "--disable_adapter_trimming" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter_sequence ${params.shortread_qc_adapter1}" : "", params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter2 ? "--adapter_sequence_r2 ${params.shortread_qc_adapter2}" : "--detect_adapter_for_pe", - // filtering options "--length_required ${params.shortread_qc_minlength}", - "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10" + "--cut_front --cut_tail --trim_poly_x --cut_mean_quality 30 --qualified_quality_phred 30 --unqualified_percent_limit 10", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -129,29 +141,27 @@ process { path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/fastp" }, mode: params.publish_dir_mode, - pattern: '*.{log,html,json}' + pattern: '*.{log,html,json}', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: params.shortread_qc_mergepairs ? '*merged.fastq.gz' : '*.fastp.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'ADAPTERREMOVAL_SINGLE' { + withName: ADAPTERREMOVAL_SINGLE { ext.args = [ - // trimming options params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", - // filtering options - "--minlength ${params.shortread_qc_minlength}" + "--minlength ${params.shortread_qc_minlength}", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -159,32 +169,29 @@ process { path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, - pattern: '*.settings' + pattern: '*.settings', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*truncated.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'ADAPTERREMOVAL_PAIRED' { + withName: ADAPTERREMOVAL_PAIRED { ext.args = [ - // collapsing options params.shortread_qc_mergepairs ? "--collapse" : "", - // trimming options - params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", // adding adapter list happens at module input channel level + params.shortread_qc_skipadaptertrim ? "--adapter1 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter1 ? "--adapter1 ${params.shortread_qc_adapter1}" : "", params.shortread_qc_skipadaptertrim ? "--adapter2 ''" : params.shortread_qc_adapterlist ? "" : params.shortread_qc_adapter2 ? "--adapter2 ${params.shortread_qc_adapter2}" : "", - // filtering options - "--minlength ${params.shortread_qc_minlength}" + "--minlength ${params.shortread_qc_minlength}", ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ @@ -192,436 +199,473 @@ process { path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/adapterremoval" }, mode: params.publish_dir_mode, - pattern: '*.settings' + pattern: '*.settings', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*{truncated.fastq,singleton.truncated}.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && !params.shortread_qc_mergepairs && params.save_analysis_ready_fastqs ? it : null} + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && !params.shortread_qc_mergepairs && params.save_analysis_ready_fastqs ? it : null }, + ], + ] + } + + // AdapterRemoval separate output merging + withName: CAT_FASTQ { + ext.prefix = { "${meta.id}_${meta.run_accession}" } + publishDir = [ + [ + path: { "${params.outdir}/analysis_ready_fastqs" }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + enabled: params.save_analysis_ready_fastqs, + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null }, ] ] } - withName: 'PORECHOP_PORECHOP' { + withName: PORECHOP_PORECHOP { ext.prefix = { "${meta.id}_${meta.run_accession}_porechop" } publishDir = [ [ path: { "${params.outdir}/porechop" }, mode: params.publish_dir_mode, pattern: '*_porechop.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/porechop" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*_porechop.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'PORECHOP_ABI' { + withName: PORECHOP_ABI { ext.prefix = { "${meta.id}_${meta.run_accession}_porechop_abi" } publishDir = [ [ path: { "${params.outdir}/porechop_abi" }, mode: params.publish_dir_mode, pattern: '*_porechop_abi.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/porechop_abi" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*porechop_abi.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && params.longread_qc_skipqualityfilter && !params.longread_qc_skipadaptertrim && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FILTLONG' { - ext.args = [ + withName: FILTLONG { + ext.args = [ "--min_length ${params.longread_qc_qualityfilter_minlength}", "--keep_percent ${params.longread_qc_qualityfilter_keeppercent}", - "--target_bases ${params.longread_qc_qualityfilter_targetbases}" - ] - .join(' ').trim() + "--target_bases ${params.longread_qc_qualityfilter_targetbases}", + ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}_filtered" } publishDir = [ [ path: { "${params.outdir}/filtlong" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/filtlong" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'NANOQ' { - ext.args = [ + withName: NANOQ { + ext.args = [ "-vv", "--min-len ${params.longread_qc_qualityfilter_minlength}", - "--min-qual ${params.longread_qc_qualityfilter_minquality}" - ] - .join(' ').trim() + "--min-qual ${params.longread_qc_qualityfilter_minquality}", + ].join(' ').trim() ext.prefix = { "${meta.id}_${meta.run_accession}_filtered" } publishDir = [ [ path: { "${params.outdir}/nanoq" }, mode: params.publish_dir_mode, pattern: '*_filtered.fastq.gz', - enabled: params.save_preprocessed_reads + enabled: params.save_preprocessed_reads, ], [ path: { "${params.outdir}/nanoq" }, mode: params.publish_dir_mode, - pattern: '*_filtered.stats' + pattern: '*_filtered.stats', ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*_filtered.fastq.gz', enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + saveAs: { (params.perform_runmerging == false || (params.perform_runmerging && !meta.is_multirun)) && !params.perform_longread_hostremoval && !params.longread_qc_skipqualityfilter && params.perform_longread_qc && params.save_analysis_ready_fastqs ? it : null }, + ], ] } - withName: 'FASTQSCAN_PROCESSED' { + withName: FASTQSCAN_PROCESSED { ext.prefix = { "${meta.id}_${meta.run_accession}.processed" } publishDir = [ path: { "${params.outdir}/fastqscan/processed" }, mode: params.publish_dir_mode, - pattern: '*.json' + pattern: '*.json', ] } - withName: 'FASTQSCANPARSE_PROCESSED' { + withName: FASTQSCANPARSE_PROCESSED { ext.prefix = { "processed" } publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'READ_STATS' { + withName: READ_STATS { ext.prefix = { "${meta.id}_${meta.run_accession}" } publishDir = [ path: { "${params.outdir}/read_stats" }, mode: params.publish_dir_mode, - pattern: '*.csv' + pattern: '*.csv', ] } - withName: 'READSTATS_PARSE' { + withName: READSTATS_PARSE { publishDir = [ path: { "${params.outdir}/summaries" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - // AdapterRemoval separate output merging - withName: 'CAT_FASTQ' { + withName: MERGE_RUNS { ext.prefix = { "${meta.id}" } publishDir = [ + [ + path: { "${params.outdir}/run_merging/" }, + mode: params.publish_dir_mode, + pattern: '*.fastq.gz', + enabled: params.save_runmerged_reads, + ], [ path: { "${params.outdir}/analysis_ready_fastqs" }, mode: params.publish_dir_mode, pattern: '*.fastq.gz', - enabled: params.save_analysis_ready_fastqs, - saveAs: { ( params.perform_runmerging == false || ( params.perform_runmerging && !meta.is_multirun ) ) && params.perform_shortread_qc && params.save_analysis_ready_fastqs ? it : null } - ] + enabled: params.perform_runmerging && params.save_analysis_ready_fastqs, + ], ] } - withName: 'RASUSA' { + withName: RASUSA { ext.prefix = { "${meta.id}.subsampled" } ext.args = '--seed 23032021' publishDir = [ path: { "${params.outdir}/rasusa" }, mode: params.publish_dir_mode, - pattern: '*.fastq.gz' + pattern: '*.fastq.gz', ] } - withName: 'BOWTIE2_ALIGN' { + withName: BOWTIE2_ALIGN { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bowtie2/align" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ] } - withName: 'BWAMEM2_MEM' { + withName: BWAMEM2_MEM { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bwamem2/mem" }, mode: params.publish_dir_mode, - pattern: '*.log' + pattern: '*.log', ] } - withName: 'SAMTOOLS_SORT' { + withName: SAMTOOLS_SORT { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/sort" }, mode: params.publish_dir_mode, - pattern: '*.{bam,bai}' + pattern: '*.{bam,bai}', ] } - withName: 'SAMTOOLS_INDEX' { + withName: SAMTOOLS_INDEX { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/sort" }, mode: params.publish_dir_mode, - pattern: '*.bai' + pattern: '*.bai', ] } - withName: 'SAMTOOLS_STATS' { + withName: SAMTOOLS_STATS { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.stats' + pattern: '*.stats', ] } - withName: 'SAMTOOLS_FLAGSTAT' { + withName: SAMTOOLS_FLAGSTAT { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.flagstat' + pattern: '*.flagstat', ] } - withName: 'SAMTOOLS_IDXSTATS' { + withName: SAMTOOLS_IDXSTATS { ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/samtools/stats" }, mode: params.publish_dir_mode, - pattern: '*.idxstats' + pattern: '*.idxstats', ] } - withName: 'FREEBAYES' { - ext.args = '-p 2 -P 0 -C 2 -F 0.05 --min-coverage 10 --min-repeat-entropy 1.0 -q 13 -m 60 --strict-vcf' + withName: FREEBAYES { + ext.args = '-p 1 -P 0 -C 2 -F 0.05 --min-coverage 10 --min-repeat-entropy 1.0 -q 13 -m 30 --strict-vcf' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/freebayes" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'MINIMAP2_INDEX' { + withName: MINIMAP2_INDEX { ext.args = '' publishDir = [ path: { "${params.outdir}/minimap2/index" }, mode: params.publish_dir_mode, - pattern: '*.mmi' + pattern: '*.mmi', ] } - withName: 'MINIMAP2_ALIGN' { + withName: MINIMAP2_ALIGN { ext.args = '--cs --MD -x map-ont' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/minimap2/align" }, mode: params.publish_dir_mode, - pattern: '*.{bam,bai}' + pattern: '*.{bam,bai}', ] } - withName: 'CLAIR3' { + withName: CLAIR3 { ext.args = '--include_all_ctgs --haploid_precise --no_phasing_for_fa --enable_long_indel' publishDir = [ path: { "${params.outdir}/clair3/" }, mode: params.publish_dir_mode, - pattern: '*.{vcf.gz,tbi}' + pattern: '*.vcf.gz', ] } - withName: 'BCFTOOLS_SORT' { + withName: BCFTOOLS_SORT { ext.args = '' ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/bcftools/sort" }, mode: params.publish_dir_mode, - pattern: '*.vcf.gz' + pattern: '*.vcf.gz', ] } - withName: 'BCFTOOLS_INDEX' { + withName: BCFTOOLS_INDEX { ext.args = '--tbi' ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/bcftools/sort" }, mode: params.publish_dir_mode, - pattern: '*.{tbi,csi}' + pattern: '*.{tbi,csi}', ] } - withName: 'BCFTOOLS_FILTER' { - ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' - //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual --exclude "%QUAL<25 || FORMAT/DP<10"' + //final Illumina vcf file + withName: BCFTOOLS_FILTER { + //ext.args = '--write-index=tbi --output-type z --soft-filter LowQual' + ext.args = '--write-index=tbi --output-type z -i "QUAL > 20 && INFO/SAF > 0 && INFO/SAR > 0 && (INFO/SRF > 0 || INFO/SRR > 0) && (INFO/AO / INFO/DP) > 0.9"' ext.prefix = { "${meta.id}.filtered" } publishDir = [ path: { "${params.outdir}/bcftools/filter" }, mode: params.publish_dir_mode, - pattern: '*.{vcf.gz,tbi,csi}' + pattern: '*.{vcf.gz,tbi,csi}', ] } - withName: 'BCFTOOLS_STATS' { + withName: BCFTOOLS_VIEW { + ext.args = '-f PASS --write-index=tbi --output-type z' + ext.prefix = { "${meta.id}.filtered.pass" } + publishDir = [ + path: { "${params.outdir}/bcftools/view" }, + mode: params.publish_dir_mode, + pattern: '*.vcf.gz', + ] + } + + //final ONT vcf file + withName: BCFTOOLS_NORM { + ext.args = '--output-type z -a -m -both --write-index=tbi' + ext.prefix = { "${meta.id}.filtered.norm" } + publishDir = [ + path: { "${params.outdir}/filtered_variants" }, + mode: params.publish_dir_mode, + pattern: '*.{vcf.gz,tbi,csi}', + ] + } + + withName: BCFTOOLS_STATS { ext.args = '' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/stats" }, mode: params.publish_dir_mode, - pattern: '*.txt' + pattern: '*.txt', ] } - withName: 'BCFTOOLS_QUERY' { + withName: BCFTOOLS_QUERY { ext.args = "-f'%CHROM\t%POS0\t%END\n'" ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/query" }, mode: params.publish_dir_mode, - pattern: '*.txt' + pattern: '*.txt', ] } - withName: 'BEDTOOLS_GENOMECOV' { + withName: BEDTOOLS_GENOMECOV { ext.args = '-bga' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bedtools/genomecov" }, mode: params.publish_dir_mode, - pattern: '*.bed' + pattern: '*.bed', ] } - withName: 'BEDTOOLS_SUBTRACT' { + withName: BEDTOOLS_SUBTRACT { ext.args = '' ext.prefix = { "${meta.id}.subtracted" } publishDir = [ path: { "${params.outdir}/bedtools/subtract" }, mode: params.publish_dir_mode, - pattern: '*.bed' + pattern: '*.bed', ] } - withName: 'BCFTOOLS_CONSENSUS' { + withName: BCFTOOLS_CONSENSUS { //ext.args = '-i "FORMAT/VAF > 0.90 & INFO/MQ >= 20 & FORMAT/DP >= 10"' ext.prefix = { "${meta.id}" } publishDir = [ path: { "${params.outdir}/bcftools/consensus" }, mode: params.publish_dir_mode, - pattern: '*.fa' + pattern: '*.fa', ] } - withName: 'RENAME_FASTA_HEADER' { + withName: RENAME_FASTA_HEADER { ext.args = '' ext.prefix = { "${meta.id}.renamed" } publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, - enabled: false + enabled: false, ] } - withName: 'CONCATENATE_FASTA' { + withName: CONCATENATE_FASTA { ext.args = '' publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, mode: params.publish_dir_mode, - pattern: '*.fa' + pattern: '*.fa', ] } - withName: 'SEQTK_COMP' { + withName: SEQTK_COMP { ext.agrs = '' publishDir = [ path: { "${params.outdir}/seqtk/" }, mode: params.publish_dir_mode, - pattern: '*.tsv' + pattern: '*.tsv', ] } - withName: 'SEQTK_PARSE' { + withName: SEQTK_PARSE { ext.agrs = '' publishDir = [ path: { "${params.outdir}/summaries/" }, mode: params.publish_dir_mode, - pattern: 'mapping_summary.tsv' + pattern: 'mapping_summary.tsv', ] } - withName: 'ALIGNPSEUDOGENOMES' { + withName: ALIGNPSEUDOGENOMES { ext.args = '' publishDir = [ path: { "${params.outdir}/pseudogenomes/" }, mode: params.publish_dir_mode, - pattern: '*.fas' + pattern: '*.fas', ] } - withName: 'SNPSITES' { + withName: SNPSITES { ext.args = '' publishDir = [ path: { "${params.outdir}/snp-sites" }, mode: params.publish_dir_mode, - pattern: '*.{fas,txt}' + pattern: '*.{fas,txt}', ] } - withName: 'MULTIQC' { - ext.args = { params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' } + withName: MULTIQC { + ext.args = { params.multiqc_title ? "--title \"${params.multiqc_title}\"" : '' } publishDir = [ path: { "${params.outdir}/multiqc" }, mode: params.publish_dir_mode, - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + saveAs: { filename -> filename.equals('versions.yml') ? null : filename }, ] - } } diff --git a/docs/images/nf-core-bactmap_logo_dark.png b/docs/images/nf-core-bactmap_logo_dark.png index 9e7daef..4d3f130 100644 Binary files a/docs/images/nf-core-bactmap_logo_dark.png and b/docs/images/nf-core-bactmap_logo_dark.png differ diff --git a/docs/images/nf-core-bactmap_logo_light.png b/docs/images/nf-core-bactmap_logo_light.png index f86b9a7..819530b 100644 Binary files a/docs/images/nf-core-bactmap_logo_light.png and b/docs/images/nf-core-bactmap_logo_light.png differ diff --git a/docs/output.md b/docs/output.md index 5e97dce..fd95270 100644 --- a/docs/output.md +++ b/docs/output.md @@ -31,7 +31,8 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d - [SAMtools stats](#samtools-stats) - Statistics from mapping - [FreeBayes](#freebayes) - Variant calling for Illumina reads - [Clair3](#clair3) - Variant calling for Nanopore reads -- [BCFtools filter](#bcftools-filter) - Filtering of variants +- [BCFtools filter](#bcftools-filter) - Filtering of Illumina variants +- [BCFtools norm](#bcftools-norm) - Normalisation of ONT variants - [BCFtools stats](#bcftools-stats) - Statistics from variant calling - [BCFtools consensus](#bcftools-consensus) - Convert filtered bcf to pseudogenome fasta - [seqtk](#seqtk) - Summarise mapping statistics @@ -313,14 +314,14 @@ It is used with nf-core/bactmap to map short reads to the reference genome. :::info -While there is a dedicated section in the MultiQC HTML for BWA-MEM2, these values are not displayed by default in the General Stats table. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. +While there is a dedicated section in the MultiQC HTML for BWA-MEM2, these values are not displayed by default in the General Stats table. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. By default the bam files created are not saved since sorted bam files are produced in the next step ::: ### minimap2 [minimap2](https://github.com/lh3/minimap2) is an alignment tool suited to mapping long reads to reference sequences. -It is used with nf-core/bactmap to map short reads to the reference genome. +It is used with nf-core/bactmap to map long reads to the reference genome.
Output files @@ -328,8 +329,10 @@ It is used with nf-core/bactmap to map short reads to the reference genome. - `minimap2/` - `build/` - `*.mmi2`: minimap2 indices of reference genome. - -
+ - `align/` + - `.bam`: BAM file containing reads that aligned against the user-supplied reference genome as well as unmapped reads + - `.bam.bai`: Index file for the BAM file + :::info minimap2 is not yet supported as a module in MultiQC and therefore there is no dedicated section in the MultiQC HTML. Rather, alignment statistics to host genome is reported via samtools stats module in MultiQC report. @@ -373,9 +376,7 @@ FreeBayes is a haplotype-based variant detector designed to find SNPs, indels, a Output files - `freebayes/` - - `variants/` - - `.vcf.gz`: VCF file containing variants - - `.vcf.gz.tbi`: Index file for the VCF file + - `.vcf.gz`: VCF file containing variants @@ -387,10 +388,7 @@ Clair3 is a variant caller for long-read data. It is used with nf-core/bactmap t Output files - `clair3/` - - `variants/` - - `.vcf.gz`: VCF file containing variants - - `.vcf.gz.tbi`: Index file for the VCF file - - `.vcf.gz.stats`: Statistics file for the VCF + - `.vcf.gz`: VCF file containing variants @@ -401,8 +399,20 @@ The `BCFtools` software is used to call and filter variants found within the bam
Output files -- `variants/filtered` - - `.vcf.gz` filtered vcf files containing variants +- `filtered_variants` + - `.filtered.vcf.gz` filtered vcf files containing variants + +
+ +### BCFtools norm + +`BCFtools` norm is used to normalize the variant calls from ONT data. + +
+Output files + +- `filtered_variants` + - `.filtered.vcf.gz` filtered vcf files containing variants
diff --git a/main.nf b/main.nf index b9a2894..ebbd9ce 100644 --- a/main.nf +++ b/main.nf @@ -81,7 +81,10 @@ workflow { params.monochrome_logs, args, params.outdir, - params.input + params.input, + params.help, + params.help_full, + params.show_hidden ) // diff --git a/modules.json b/modules.json index 05bcf1b..61b95dc 100644 --- a/modules.json +++ b/modules.json @@ -12,37 +12,47 @@ }, "bcftools/filter": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/index": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, + "bcftools/norm": { + "branch": "master", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", + "installed_by": ["modules"] + }, "bcftools/query": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bcftools/sort": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["bam_variant_calling_sort_freebayes_bcftools"] }, "bcftools/stats": { "branch": "master", - "git_sha": "f17049e03697726ace7499d2fe342f892594f6f3", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", + "installed_by": ["modules"] + }, + "bcftools/view": { + "branch": "master", + "git_sha": "6383d8fe58f9498eecd5aa303e71a4a932d1e9f6", "installed_by": ["modules"] }, "bedtools/subtract": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "88d43dad73a675e66bff49ebb57fe657a5909018", "installed_by": ["modules"] }, "bowtie2/align": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "bowtie2/build": { @@ -52,17 +62,17 @@ }, "bwamem2/index": { "branch": "master", - "git_sha": "b2902040b9cb9b7b32b62400f1c024a709bd4812", + "git_sha": "d86336f3e7ae0d5f76c67b0859409769cfeb2af2", "installed_by": ["modules"] }, "bwamem2/mem": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "d86336f3e7ae0d5f76c67b0859409769cfeb2af2", "installed_by": ["modules"] }, "cat/fastq": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "cf735af4433f2dc8e410f67012dff824ef9990eb", "installed_by": ["modules"] }, "falco": { @@ -72,12 +82,12 @@ }, "fastp": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "b8f1de0ac853ae5b56c63450d47438f899c553d0", "installed_by": ["modules"] }, "fastqc": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "5bdb098216aaf5df9c3b6343e6204cd932503c16", "installed_by": ["modules"] }, "fastqscan": { @@ -97,22 +107,22 @@ }, "gunzip": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "96c57dfd98a0641886a67bd449fe33ee2ec0e374", "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "multiqc": { "branch": "master", - "git_sha": "e10b76ca0c66213581bec2833e30d31f239dec0b", + "git_sha": "80cba9452fb1e9bb79884976fa1ca0e671949aa2", "installed_by": ["modules"] }, "nanoq": { @@ -127,17 +137,17 @@ }, "porechop/porechop": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "e753770db613ce014b3c4bc94f6cba443427b726", "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "9a48bce39a67e2cb34b8f125fc1d50f0ad98b616", "installed_by": ["modules"] }, "samtools/flagstat": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "e334e12a1e985adc5ffc3fc78a68be1de711de45", "installed_by": ["bam_stats_samtools"] }, "samtools/idxstats": { @@ -148,21 +158,21 @@ "samtools/index": { "branch": "master", "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "installed_by": ["bam_sort_stats_samtools", "modules"] }, "samtools/sort": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", - "installed_by": ["modules"] + "git_sha": "5cb9a8694da0a0e550921636bb60bc8c56445fd7", + "installed_by": ["bam_sort_stats_samtools", "modules"] }, "samtools/stats": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "fe93fde0845f907fc91ad7cc7d797930408824df", "installed_by": ["bam_stats_samtools", "modules"] }, "seqtk/comp": { "branch": "master", - "git_sha": "41dfa3f7c0ffabb96a6a813fe321c6d1cc5b6e46", + "git_sha": "a46713779030a5f508117080cbf4b693dd4c6e33", "installed_by": ["modules"] }, "snpsites": { @@ -174,11 +184,16 @@ }, "subworkflows": { "nf-core": { - "bam_stats_samtools": { + "bam_sort_stats_samtools": { "branch": "master", - "git_sha": "c8be52dba1166c678e74cda9c3a3c221635c8bb1", + "git_sha": "eed5d14302a6c9070dcc25feeab707a27a4b3254", "installed_by": ["subworkflows"] }, + "bam_stats_samtools": { + "branch": "master", + "git_sha": "eed5d14302a6c9070dcc25feeab707a27a4b3254", + "installed_by": ["bam_sort_stats_samtools", "subworkflows"] + }, "utils_nextflow_pipeline": { "branch": "master", "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", @@ -186,12 +201,12 @@ }, "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "05954dab2ff481bcb999f24455da29a5828af08d", + "git_sha": "65f5e638d901a51534c68fd5c1c19e8112fb4df1", "installed_by": ["subworkflows"] }, "utils_nfschema_plugin": { "branch": "master", - "git_sha": "dcd088f483cede0c3df4034d405126f05a764cc7", + "git_sha": "fdc08b8b1ae74f56686ce21f7ea11ad11990ce57", "installed_by": ["subworkflows"] } } diff --git a/modules/local/clair3/environment.yml b/modules/local/clair3/environment.yml index e1a7b84..cc814bb 100644 --- a/modules/local/clair3/environment.yml +++ b/modules/local/clair3/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - "bioconda::clair3=1.0.10" + - "bioconda::clair3=1.2.0" diff --git a/modules/local/clair3/main.nf b/modules/local/clair3/main.nf index 2354b63..2ea01f4 100644 --- a/modules/local/clair3/main.nf +++ b/modules/local/clair3/main.nf @@ -3,9 +3,9 @@ process CLAIR3 { label 'process_high' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/clair3:1.0.10--py39hd649744_1': - 'biocontainers/clair3:1.0.10--py39hd649744_1' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e7/e70b0f4389028f4dc88efde1aac7139927c898cf7add680e14724d97fecd3d32/data' + : 'community.wave.seqera.io/library/clair3:1.2.0--b1b03d4e9d1b6a2e'}" input: tuple val(meta), path(bam), path(bai), path(model), val(platform) @@ -33,9 +33,20 @@ process CLAIR3 { --output=. \\ --platform=$platform \\ --model_path=$model \\ - --sample_name=${prefix} \\ $args + # Rename to add prefix + for file in merge_output.vcf.gz \ + merge_output.vcf.gz.tbi \ + phased_merge_output.vcf.gz \ + phased_merge_output.vcf.gz.tbi \ + merge_output.gvcf.gz \ + merge_output.gvcf.gz.tbi; do + if [ -e "\$file" ]; then + mv "\$file" "${prefix}\$file" + fi + done + cat <<-END_VERSIONS > versions.yml "${task.process}": clair3: \$(run_clair3.sh --version |& sed '1!d ; s/Clair3 v//') @@ -44,12 +55,14 @@ process CLAIR3 { stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + prefix = task.ext.prefix ?: "${meta.id}" """ - echo "" | gzip > ${prefix}.phased_merge_output.vcf.gz - touch ${prefix}.phased_merge_output.vcf.gz.tbi - echo "" | gzip > ${prefix}.merge_output.vcf.gz - touch ${prefix}.merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}phased_merge_output.vcf.gz + touch ${prefix}phased_merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}merge_output.vcf.gz + touch ${prefix}merge_output.vcf.gz.tbi + echo "" | gzip > ${prefix}merge_output.gvcf.gz + touch ${prefix}merge_output.gvcf.gz.tbi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/filter/main.nf b/modules/nf-core/bcftools/filter/main.nf index 920eed3..4b55881 100644 --- a/modules/nf-core/bcftools/filter/main.nf +++ b/modules/nf-core/bcftools/filter/main.nf @@ -1,20 +1,20 @@ process BCFTOOLS_FILTER { - tag "$meta.id" + 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(tbi) output: tuple val(meta), path("*.${extension}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -23,51 +23,56 @@ process BCFTOOLS_FILTER { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" - if ("$vcf" == "${prefix}.${extension}") error "Input and output names are the same, set prefix in module configuration to disambiguate!" + if ("${vcf}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } """ bcftools filter \\ --output ${prefix}.${extension} \\ --threads ${task.cpus} \\ - $args \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${vcf} """ stub: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : - args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : - args.contains("--write-index") || args.contains("-W") ? "csi" : - "" + extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" - if ("$vcf" == "${prefix}.${extension}") error "Input and output names are the same, set prefix in module configuration to disambiguate!" + if ("${vcf}" == "${prefix}.${extension}") { + error("Input and output names are the same, set prefix in module configuration to disambiguate!") + } """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/filter/meta.yml b/modules/nf-core/bcftools/filter/meta.yml index 8ebad81..4ab447f 100644 --- a/modules/nf-core/bcftools/filter/meta.yml +++ b/modules/nf-core/bcftools/filter/meta.yml @@ -63,13 +63,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/filter/tests/main.nf.test b/modules/nf-core/bcftools/filter/tests/main.nf.test index fadff0e..42cb8ab 100644 --- a/modules/nf-core/bcftools/filter/tests/main.nf.test +++ b/modules/nf-core/bcftools/filter/tests/main.nf.test @@ -31,7 +31,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf") } ) } - } test("sarscov2 - vcf_gz_index") { @@ -57,12 +56,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi") { @@ -88,12 +86,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi") { @@ -119,12 +116,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - vcf - bcf output") { @@ -149,7 +145,6 @@ nextflow_process { { assert snapshot(process.out).match("bcf output") } ) } - } test("sarscov2 - vcf.gz, tbi - region filter") { @@ -174,7 +169,6 @@ nextflow_process { { assert snapshot(process.out).match("region filter") } ) } - } test("sarscov2 - vcf - stub") { @@ -200,7 +194,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf - stub") } ) } - } test("sarscov2 - vcf_gz_index - stub") { @@ -227,7 +220,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi - stub") { @@ -254,7 +246,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi - stub") { @@ -281,7 +272,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } - -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/filter/tests/main.nf.test.snap b/modules/nf-core/bcftools/filter/tests/main.nf.test.snap index 7f4d423..798dade 100644 --- a/modules/nf-core/bcftools/filter/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/filter/tests/main.nf.test.snap @@ -17,7 +17,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -33,16 +37,20 @@ "bcf_test_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:35.716305" + "timestamp": "2026-01-20T12:02:38.075538496" }, "sarscov2 - vcf_gz_index_tbi - stub": { "content": [ @@ -67,7 +75,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -88,16 +100,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:54.386135" + "timestamp": "2026-01-20T12:03:09.787136694" }, "vcf": { "content": [ @@ -117,7 +133,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -133,16 +153,20 @@ "vcf_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:13.726932" + "timestamp": "2026-01-20T12:02:00.400038419" }, "bcf output": { "content": [ @@ -162,7 +186,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -178,16 +206,20 @@ "bcf_test.bcf.gz:md5,c8a304c8d2892039201154153c8cd536" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:31.219355" + "timestamp": "2026-01-20T12:02:30.237925195" }, "sarscov2 - vcf_gz_index": { "content": [ @@ -210,15 +242,21 @@ [ ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:18.126698" + "timestamp": "2026-01-20T12:02:07.949745874" }, "sarscov2 - vcf_gz_index_csi": { "content": [ @@ -241,15 +279,21 @@ [ ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:22.522678" + "timestamp": "2026-01-20T12:02:15.417109301" }, "vcf - stub": { "content": [ @@ -269,7 +313,11 @@ ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ @@ -285,16 +333,20 @@ "vcf_test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:40.997176" + "timestamp": "2026-01-20T12:02:46.265722559" }, "sarscov2 - vcf_gz_index - stub": { "content": [ @@ -319,7 +371,11 @@ ] ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -340,16 +396,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:45.224157" + "timestamp": "2026-01-20T12:02:54.301083152" }, "sarscov2 - vcf_gz_index_csi - stub": { "content": [ @@ -374,7 +434,11 @@ ] ], "3": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -395,16 +459,20 @@ "vcf_test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:49.650863" + "timestamp": "2026-01-20T12:03:02.260111336" }, "sarscov2 - vcf_gz_index_tbi": { "content": [ @@ -427,14 +495,20 @@ "vcf_test_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,66d244ab9257f8ac147f43946e2e751d" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_FILTER", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:11:26.846112" + "timestamp": "2026-01-20T12:02:23.055607519" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/index/main.nf b/modules/nf-core/bcftools/index/main.nf index 16ff775..8635a1a 100644 --- a/modules/nf-core/bcftools/index/main.nf +++ b/modules/nf-core/bcftools/index/main.nf @@ -1,51 +1,40 @@ process BCFTOOLS_INDEX { - tag "$meta.id" + tag "${meta.id}" label 'process_low' 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf) output: - tuple val(meta), path("*.csi"), optional:true, emit: csi - tuple val(meta), path("*.tbi"), optional:true, emit: tbi - path "versions.yml" , emit: versions + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" """ bcftools \\ index \\ - $args \\ - --threads $task.cpus \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + --threads ${task.cpus} \\ + ${vcf} """ stub: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--tbi") || args.contains("-t") ? "tbi" : - "csi" + def extension = args.contains("--tbi") || args.contains("-t") + ? "tbi" + : "csi" """ touch ${vcf}.${extension} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/index/meta.yml b/modules/nf-core/bcftools/index/meta.yml index 74707ac..4e4bdc8 100644 --- a/modules/nf-core/bcftools/index/meta.yml +++ b/modules/nf-core/bcftools/index/meta.yml @@ -55,13 +55,27 @@ output: -t parameter) pattern: "*.tbi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software version - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@jfy133" maintainers: diff --git a/modules/nf-core/bcftools/index/tests/main.nf.test b/modules/nf-core/bcftools/index/tests/main.nf.test index 9b37485..b38c6ad 100644 --- a/modules/nf-core/bcftools/index/tests/main.nf.test +++ b/modules/nf-core/bcftools/index/tests/main.nf.test @@ -27,11 +27,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions).match() + process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } - } test("sarscov2 - vcf - tbi") { @@ -54,11 +53,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions).match() + process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } - } test("sarscov2 - vcf - csi - stub") { @@ -82,7 +80,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - vcf - tbi - stub") { @@ -107,7 +104,5 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } - -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/index/tests/main.nf.test.snap b/modules/nf-core/bcftools/index/tests/main.nf.test.snap index 30f6f7c..2074e97 100644 --- a/modules/nf-core/bcftools/index/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/index/tests/main.nf.test.snap @@ -14,7 +14,11 @@ ], "2": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -27,16 +31,20 @@ "tbi": [ ], - "versions": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:33.825153" + "timestamp": "2026-01-20T12:03:32.869223843" }, "sarscov2 - vcf - tbi": { "content": [ @@ -48,15 +56,21 @@ "test.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:28.804939" + "timestamp": "2026-01-20T12:03:24.708477718" }, "sarscov2 - vcf - tbi - stub": { "content": [ @@ -73,7 +87,11 @@ ] ], "2": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ], "csi": [ @@ -86,16 +104,20 @@ "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:38.852782" + "timestamp": "2026-01-20T12:03:40.444304193" }, "sarscov2 - vcf - csi": { "content": [ @@ -107,14 +129,20 @@ "test.vcf.gz.csi" ] ], - [ - "versions.yml:md5,cea31a4d868054c7308a4129232a1f0e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_INDEX", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:12:24.498904" + "timestamp": "2026-01-20T12:03:17.363152216" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/norm/environment.yml b/modules/nf-core/bcftools/norm/environment.yml new file mode 100644 index 0000000..ba863b3 --- /dev/null +++ b/modules/nf-core/bcftools/norm/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf new file mode 100644 index 0000000..443c8bb --- /dev/null +++ b/modules/nf-core/bcftools/norm/main.nf @@ -0,0 +1,71 @@ +process BCFTOOLS_NORM { + 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcf), path(tbi) + tuple val(meta2), path(fasta) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" + """ + bcftools norm \\ + --fasta-ref ${fasta} \\ + --output ${prefix}.${extension} \\ + ${args} \\ + --threads ${task.cpus} \\ + ${vcf} + """ + + stub: + def args = task.ext.args ?: '--output-type z' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf.gz" + def index = '' + if (extension in ['vcf.gz', 'bcf', 'bcf.gz']) { + if (['--write-index=tbi', '-W=tbi'].any { arg -> args.contains(arg) } && extension == 'vcf.gz') { + index = 'tbi' + } + else if (['--write-index=tbi', '-W=tbi', '--write-index=csi', '-W=csi', '--write-index', '-W'].any { arg -> args.contains(arg) }) { + index = 'csi' + } + } + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = index ? "touch ${prefix}.${extension}.${index}" : "" + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + """ +} diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml new file mode 100644 index 0000000..9feecac --- /dev/null +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -0,0 +1,107 @@ +name: bcftools_norm +description: Normalize VCF file +keywords: + - normalize + - norm + - variant calling + - VCF +tools: + - norm: + description: | + Normalize VCF files. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be normalized + e.g. 'file1.vcf' + pattern: "*.{vcf,vcf.gz}" + ontologies: [] + - tbi: + type: file + description: | + An optional index of the VCF file (for when the VCF is compressed) + pattern: "*.vcf.gz.tbi" + ontologies: [] + - - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: One of uncompressed VCF (.vcf), compressed VCF (.vcf.gz), compressed + BCF (.bcf.gz) or uncompressed BCF (.bcf) normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@abhi18av" + - "@ramprasadn" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test b/modules/nf-core/bcftools/norm/tests/main.nf.test new file mode 100644 index 0000000..0585175 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test @@ -0,0 +1,545 @@ +nextflow_process { + + name "Test Process BCFTOOLS_NORM" + script "../main.nf" + process "BCFTOOLS_NORM" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/norm" + + test("sarscov2 - [ vcf, [] ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } } + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output") { + + config "./nextflow.bcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output") { + + config "./nextflow.bcf_gz.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta -stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf output -stub") { + + config "./nextflow.vcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub") { + + config "./nextflow.vcf.config" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf output - stub") { + + config "./nextflow.bcf.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub") { + + config "./nextflow.bcf_gz.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + [] + ] + input[1] = [ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.gz', checkIfExists: true) + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } + + +} diff --git a/modules/nf-core/bcftools/norm/tests/main.nf.test.snap b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap new file mode 100644 index 0000000..ee2dadf --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/main.nf.test.snap @@ -0,0 +1,876 @@ +{ + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:29.987030961" + }, + "sarscov2 - [ vcf, [] ], fasta - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:06.488086505" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:34.863776359" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:54.718705045" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf_gz output": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:43.007377633" + }, + "sarscov2 - [ vcf, [] ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:07:54.877084219" + }, + "sarscov2 - [ vcf, tbi ], fasta - vcf output -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:22.220435939" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,bf88706ef69c44ca9e287bc953ba3593" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:58.483532889" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:10:03.22576704" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:28.356741947" + }, + "sarscov2 - [ vcf, tbi ], fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:27.281315407" + }, + "sarscov2 - [ vcf, tbi ], fasta -stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:14.249715835" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf_gz output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:46.665932019" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T07:52:58.381931979" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:09:38.144449162" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:10:10.602984345" + }, + "sarscov2 - [ vcf, [] ], fasta - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz:md5,63e5adbaf3dd94550e9e3d7935dd28db" + ] + ], + [ + [ + { + "id": "test" + }, + "test_vcf.vcf.gz.csi" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.04.2" + }, + "timestamp": "2024-06-05T13:53:09.808834237" + }, + "sarscov2 - [ vcf, tbi ], fasta - bcf output": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "test" + }, + "test_norm.bcf.gz:md5,638c3c25bdd495c90ecbccb69ee77f07" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_NORM", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:08:51.053195842" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config new file mode 100644 index 0000000..b79af86 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type b --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config new file mode 100644 index 0000000..f36f397 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.bcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type u --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.config b/modules/nf-core/bcftools/norm/tests/nextflow.config new file mode 100644 index 0000000..510803b --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config new file mode 100644 index 0000000..10bf93e --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type v --no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config new file mode 100644 index 0000000..b31dd2d --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/nextflow.vcf_gz.config @@ -0,0 +1,4 @@ +process { + ext.args = '-m -any --output-type z ---no-version' + ext.prefix = "test_norm" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config new file mode 100644 index 0000000..7dd696e --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..aebffb6 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..b192ae7 --- /dev/null +++ b/modules/nf-core/bcftools/norm/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index 91e0880..726360f 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -1,11 +1,11 @@ process BCFTOOLS_QUERY { - tag "$meta.id" + tag "${meta.id}" label 'process_single' 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf), path(tbi) @@ -15,7 +15,7 @@ process BCFTOOLS_QUERY { output: tuple val(meta), path("*.${suffix}"), emit: output - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -26,20 +26,15 @@ process BCFTOOLS_QUERY { suffix = task.ext.suffix ?: "txt" def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" """ bcftools query \\ - $regions_file \\ - $targets_file \\ - $samples_file \\ - $args \\ - $vcf \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${args} \\ + ${vcf} \\ > ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ stub: @@ -47,10 +42,5 @@ process BCFTOOLS_QUERY { suffix = task.ext.suffix ?: "txt" """ touch ${prefix}.${suffix} \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/query/meta.yml b/modules/nf-core/bcftools/query/meta.yml index a66692d..6bcb5e5 100644 --- a/modules/nf-core/bcftools/query/meta.yml +++ b/modules/nf-core/bcftools/query/meta.yml @@ -60,13 +60,27 @@ output: type: file description: BCFTools query output file ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@abhi18av" - "@drpatelh" diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test b/modules/nf-core/bcftools/query/tests/main.nf.test index 39e67b3..63ac5af 100644 --- a/modules/nf-core/bcftools/query/tests/main.nf.test +++ b/modules/nf-core/bcftools/query/tests/main.nf.test @@ -16,7 +16,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) @@ -33,11 +33,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.output, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], vcf, tsv, []") { @@ -45,7 +44,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) @@ -62,11 +61,10 @@ nextflow_process { { assert process.success }, { assert snapshot( process.out.output, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } test("sarscov2 - [vcf, tbi], [], [], [] - stub") { @@ -74,7 +72,7 @@ nextflow_process { when { process { """ - input[0] = [ + input[0] = [ [ id:'out' ], // meta map file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) @@ -91,11 +89,9 @@ nextflow_process { { assert process.success }, { assert snapshot( file(process.out.output[0][1]).name, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() } ) } - } - } diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test.snap b/modules/nf-core/bcftools/query/tests/main.nf.test.snap index 0e63815..5168ef3 100644 --- a/modules/nf-core/bcftools/query/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/query/tests/main.nf.test.snap @@ -9,28 +9,40 @@ "out.txt:md5,75a6bd0084e2e1838cf7baba11b99d19" ] ], - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:40:03.990658" + "timestamp": "2026-01-20T12:16:54.523612853" }, "sarscov2 - [vcf, tbi], [], [], [] - stub": { "content": [ "out.txt", - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:40:08.930802" + "timestamp": "2026-01-20T12:17:00.64798632" }, "sarscov2 - [vcf, tbi], [], [], []": { "content": [ @@ -42,14 +54,20 @@ "out.txt:md5,87a2ab194e1ee3219b44e58429ec3307" ] ], - [ - "versions.yml:md5,0a0bd969f3e1b1dfc5617547cf2d9b6e" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_QUERY", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:39:59.366475" + "timestamp": "2026-01-20T12:16:47.953130141" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/tests/nextflow.config b/modules/nf-core/bcftools/query/tests/nextflow.config index da81c2a..8547ec1 100644 --- a/modules/nf-core/bcftools/query/tests/nextflow.config +++ b/modules/nf-core/bcftools/query/tests/nextflow.config @@ -1,3 +1,3 @@ process { ext.args = "-f '%CHROM %POS %REF %ALT[%SAMPLE=%GT]'" -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/sort/main.nf b/modules/nf-core/bcftools/sort/main.nf index 294d476..e0dfad2 100644 --- a/modules/nf-core/bcftools/sort/main.nf +++ b/modules/nf-core/bcftools/sort/main.nf @@ -1,20 +1,20 @@ process BCFTOOLS_SORT { - tag "$meta.id" + 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: tuple val(meta), path(vcf) output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf - tuple val(meta), path("*.tbi") , emit: tbi, optional: true - tuple val(meta), path("*.csi") , emit: csi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -22,49 +22,51 @@ process BCFTOOLS_SORT { script: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def max_memory = task.memory ? "--max-mem ${task.memory.toUnit('MB') * 0.9}M" : "" """ bcftools \\ sort \\ --output ${prefix}.${extension} \\ --temp-dir . \\ - $args \\ - $vcf - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${max_memory} \\ + ${args} \\ + ${vcf} """ stub: def args = task.ext.args ?: '--output-type z' def prefix = task.ext.prefix ?: "${meta.id}" - def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : - args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : - args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : - args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : - "vcf" - def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") ? "tbi" : - args.contains("--write-index=csi") || args.contains("-W=csi") ? "csi" : - args.contains("--write-index") || args.contains("-W") ? "csi" : - "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" def create_index = extension.endsWith(".gz") && index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${index}" : "" """ ${create_cmd} ${prefix}.${extension} ${create_index} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/sort/meta.yml b/modules/nf-core/bcftools/sort/meta.yml index c15487c..1c3f2a5 100644 --- a/modules/nf-core/bcftools/sort/meta.yml +++ b/modules/nf-core/bcftools/sort/meta.yml @@ -58,13 +58,27 @@ output: description: Default VCF file index pattern: "*.csi" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@Gwennid" maintainers: diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test b/modules/nf-core/bcftools/sort/tests/main.nf.test index b9bdd76..bda7bac 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test @@ -27,7 +27,6 @@ nextflow_process { { assert snapshot(process.out).match("vcf") } ) } - } test("sarscov2 - vcf_gz_index") { @@ -52,12 +51,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi") { @@ -82,12 +80,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi") { @@ -112,12 +109,11 @@ nextflow_process { process.out.vcf, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match() }, { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } test("sarscov2 - vcf - stub") { @@ -139,7 +135,6 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } test("sarscov2 - vcf_gz_index - stub") { @@ -165,7 +160,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_csi - stub") { @@ -191,7 +185,6 @@ nextflow_process { { assert process.out.csi[0][1].endsWith(".csi") } ) } - } test("sarscov2 - vcf_gz_index_tbi - stub") { @@ -217,6 +210,5 @@ nextflow_process { { assert process.out.tbi[0][1].endsWith(".tbi") } ) } - } -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap index 3cbca56..9b9e4dc 100644 --- a/modules/nf-core/bcftools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/sort/tests/main.nf.test.snap @@ -22,7 +22,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -43,16 +47,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:07.959267" + "timestamp": "2026-01-20T12:19:24.286732272" }, "vcf": { "content": [ @@ -72,7 +80,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -88,16 +100,20 @@ "test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:35.236174" + "timestamp": "2026-01-20T12:18:38.783455397" }, "sarscov2 - vcf_gz_index": { "content": [ @@ -120,15 +136,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:39.95133" + "timestamp": "2026-01-20T12:18:45.081447395" }, "sarscov2 - vcf_gz_index_csi": { "content": [ @@ -151,15 +173,21 @@ [ ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:44.50977" + "timestamp": "2026-01-20T12:18:51.194304667" }, "sarscov2 - vcf_gz_index - stub": { "content": [ @@ -184,7 +212,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -205,16 +237,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:58.749279" + "timestamp": "2026-01-20T12:19:11.413154111" }, "sarscov2 - vcf_gz_index_csi - stub": { "content": [ @@ -239,7 +275,11 @@ ] ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ [ @@ -260,16 +300,20 @@ "test_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:49:03.283017" + "timestamp": "2026-01-20T12:19:17.770087535" }, "sarscov2 - vcf - stub": { "content": [ @@ -289,7 +333,11 @@ ], "3": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ], "csi": [ @@ -305,16 +353,20 @@ "test.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:54.113947" + "timestamp": "2026-01-20T12:19:04.409593559" }, "sarscov2 - vcf_gz_index_tbi": { "content": [ @@ -337,14 +389,20 @@ "test_vcf.vcf.gz.tbi" ] ], - [ - "versions.yml:md5,9699a51675cf58ed9d61b4063de92229" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_SORT", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:48:48.979311" + "timestamp": "2026-01-20T12:18:57.536633502" } } \ No newline at end of file diff --git a/modules/nf-core/bcftools/stats/main.nf b/modules/nf-core/bcftools/stats/main.nf index 8eba6cd..ac77dd5 100644 --- a/modules/nf-core/bcftools/stats/main.nf +++ b/modules/nf-core/bcftools/stats/main.nf @@ -1,14 +1,14 @@ process BCFTOOLS_STATS { - tag "$meta.id" + tag "${meta.id}" label 'process_single' 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data': - 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" input: - tuple val(meta), path(vcf), path(tbi) + tuple val(meta), path(vcf), path(tbi) tuple val(meta2), path(regions) tuple val(meta3), path(targets) tuple val(meta4), path(samples) @@ -17,7 +17,7 @@ process BCFTOOLS_STATS { output: tuple val(meta), path("*stats.txt"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools when: task.ext.when == null || task.ext.when @@ -27,23 +27,18 @@ process BCFTOOLS_STATS { def prefix = task.ext.prefix ?: "${meta.id}" def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" - def samples_file = samples ? "--samples-file ${samples}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" def reference_fasta = fasta ? "--fasta-ref ${fasta}" : "" - def exons_file = exons ? "--exons ${exons}" : "" + def exons_file = exons ? "--exons ${exons}" : "" """ bcftools stats \\ - $args \\ - $regions_file \\ - $targets_file \\ - $samples_file \\ - $reference_fasta \\ - $exons_file \\ - $vcf > ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS + ${args} \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${reference_fasta} \\ + ${exons_file} \\ + ${vcf} > ${prefix}.bcftools_stats.txt """ stub: @@ -51,10 +46,5 @@ process BCFTOOLS_STATS { """ touch ${prefix}.bcftools_stats.txt - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/bcftools/stats/meta.yml b/modules/nf-core/bcftools/stats/meta.yml index 2cd634f..6416fb7 100644 --- a/modules/nf-core/bcftools/stats/meta.yml +++ b/modules/nf-core/bcftools/stats/meta.yml @@ -96,13 +96,27 @@ output: description: Text output file containing stats pattern: "*_{stats.txt}" ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test b/modules/nf-core/bcftools/stats/tests/main.nf.test index be618b0..e8a5598 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test @@ -29,11 +29,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - regions") { @@ -57,11 +56,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("regions_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("regions_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - targets") { @@ -86,11 +84,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("targets_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("targets_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - exons") { @@ -114,11 +111,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("exon_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("exon_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } test("sarscov2 - vcf_gz - reference") { @@ -143,11 +139,10 @@ nextflow_process { then { assertAll( { assert process.success }, - { assert snapshot(process.out.versions).match("ref_versions") }, + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match("ref_versions") }, { assert snapshot(file(process.out.stats.get(0).get(1)).readLines()[0..5]).match() }, ) } - } @@ -176,7 +171,5 @@ nextflow_process { { assert snapshot(process.out).match() } ) } - } - -} \ No newline at end of file +} diff --git a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap index cc33ddc..870d364 100644 --- a/modules/nf-core/bcftools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/bcftools/stats/tests/main.nf.test.snap @@ -35,15 +35,21 @@ }, "versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:57:51.913799" + "timestamp": "2026-01-20T12:19:36.943096649" }, "sarscov2 - vcf_gz - targets": { "content": [ @@ -64,27 +70,39 @@ }, "regions_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:57:56.503606" + "timestamp": "2026-01-20T12:19:43.504543106" }, "targets_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:01.116272" + "timestamp": "2026-01-20T12:19:49.943149098" }, "sarscov2 - vcf_gz - stub": { "content": [ @@ -98,7 +116,11 @@ ] ], "1": [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] ], "stats": [ [ @@ -108,40 +130,56 @@ "test.bcftools_stats.txt:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:15.742817" + "timestamp": "2026-01-20T12:20:09.654761076" }, "exon_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:05.795248" + "timestamp": "2026-01-20T12:19:56.837252836" }, "ref_versions": { "content": [ - [ - "versions.yml:md5,d901f4d7a114504db1dc5bc36f27f386" - ] + { + "versions_bcftools": [ + [ + "BCFTOOLS_STATS", + "bcftools", + "1.22" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-11T14:58:10.679821" + "timestamp": "2026-01-20T12:20:03.323950267" }, "sarscov2 - vcf_gz": { "content": [ diff --git a/modules/nf-core/bcftools/view/environment.yml b/modules/nf-core/bcftools/view/environment.yml new file mode 100644 index 0000000..ba863b3 --- /dev/null +++ b/modules/nf-core/bcftools/view/environment.yml @@ -0,0 +1,10 @@ +--- +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/environment-schema.json +channels: + - conda-forge + - bioconda +dependencies: + # renovate: datasource=conda depName=bioconda/htslib + - bioconda::htslib=1.22.1 + # renovate: datasource=conda depName=bioconda/bcftools + - bioconda::bcftools=1.22 diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf new file mode 100644 index 0000000..b3fd7b7 --- /dev/null +++ b/modules/nf-core/bcftools/view/main.nf @@ -0,0 +1,76 @@ +process BCFTOOLS_VIEW { + 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/47/474a5ea8dc03366b04df884d89aeacc4f8e6d1ad92266888e7a8e7958d07cde8/data' + : 'community.wave.seqera.io/library/bcftools_htslib:0a3fa2654b52006f'}" + + input: + tuple val(meta), path(vcf), path(index) + path regions + path targets + path samples + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + tuple val(meta), path("*.tbi"), emit: tbi, optional: true + tuple val(meta), path("*.csi"), emit: csi, optional: true + tuple val("${task.process}"), val('bcftools'), eval("bcftools --version | sed '1!d; s/^.*bcftools //'"), topic: versions, emit: versions_bcftools + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def regions_file = regions ? "--regions-file ${regions}" : "" + def targets_file = targets ? "--targets-file ${targets}" : "" + def samples_file = samples ? "--samples-file ${samples}" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + """ + bcftools view \\ + --output ${prefix}.${extension} \\ + ${regions_file} \\ + ${targets_file} \\ + ${samples_file} \\ + ${args} \\ + --threads ${task.cpus} \\ + ${vcf} + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") + ? "bcf.gz" + : args.contains("--output-type u") || args.contains("-Ou") + ? "bcf" + : args.contains("--output-type z") || args.contains("-Oz") + ? "vcf.gz" + : args.contains("--output-type v") || args.contains("-Ov") + ? "vcf" + : "vcf" + def stub_index = args.contains("--write-index=tbi") || args.contains("-W=tbi") + ? "tbi" + : args.contains("--write-index=csi") || args.contains("-W=csi") + ? "csi" + : args.contains("--write-index") || args.contains("-W") + ? "csi" + : "" + def create_cmd = extension.endsWith(".gz") ? "echo '' | gzip >" : "touch" + def create_index = extension.endsWith(".gz") && stub_index.matches("csi|tbi") ? "touch ${prefix}.${extension}.${stub_index}" : "" + """ + ${create_cmd} ${prefix}.${extension} + ${create_index} + """ +} diff --git a/modules/nf-core/bcftools/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml new file mode 100644 index 0000000..4676189 --- /dev/null +++ b/modules/nf-core/bcftools/view/meta.yml @@ -0,0 +1,112 @@ +name: bcftools_view +description: View, subset and filter VCF or BCF files by position and filtering expression. + Convert between VCF and BCF +keywords: + - variant calling + - view + - bcftools + - VCF +tools: + - view: + description: | + View, subset and filter VCF or BCF files by position and filtering expression. Convert between VCF and BCF + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + identifier: biotools:bcftools +input: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: | + The vcf file to be inspected. + e.g. 'file.vcf' + ontologies: [] + - index: + type: file + description: | + The tab index for the VCF file to be inspected. + e.g. 'file.tbi' + ontologies: [] + - regions: + type: file + description: | + Optionally, restrict the operation to regions listed in this file. + e.g. 'file.vcf' + ontologies: [] + - targets: + type: file + description: | + Optionally, restrict the operation to regions listed in this file (doesn't rely upon index files) + e.g. 'file.vcf' + ontologies: [] + - samples: + type: file + description: | + Optional, file of sample names to be included or excluded. + e.g. 'file.tsv' + ontologies: [] +output: + vcf: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.{vcf,vcf.gz,bcf,bcf.gz}": + type: file + description: VCF normalized output file + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" + ontologies: [] + tbi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.tbi": + type: file + description: Alternative VCF file index + pattern: "*.tbi" + ontologies: [] + csi: + - - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - "*.csi": + type: file + description: Default VCF file index + pattern: "*.csi" + ontologies: [] + versions_bcftools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +topics: + versions: + - - ${task.process}: + type: string + description: The process the versions were collected from + - bcftools: + type: string + description: The tool name + - "bcftools --version | sed '1!d; s/^.*bcftools //'": + type: string + description: The command used to generate the version of the tool +authors: + - "@abhi18av" +maintainers: + - "@abhi18av" diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test b/modules/nf-core/bcftools/view/tests/main.nf.test new file mode 100644 index 0000000..3ed2b90 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test @@ -0,0 +1,288 @@ +nextflow_process { + + name "Test Process BCFTOOLS_VIEW" + script "../main.nf" + process "BCFTOOLS_VIEW" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/view" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index") { + + config "./vcf_gz_index.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi") { + + config "./vcf_gz_index_csi.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi") { + + config "./vcf_gz_index_tbi.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.tbi.collect { it.collect { it instanceof Map ? it : file(it).name } }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } + + test("sarscov2 - [vcf, tbi], vcf, tsv, []") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test3.vcf.gz', checkIfExists: true) + input[2] = file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test2.targets.tsv.gz', checkIfExists: true) + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + config "./nextflow.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.vcf[0][1]).name, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub") { + + config "./vcf_gz_index.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi - stub") { + + config "./vcf_gz_index_csi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.csi[0][1].endsWith(".csi") } + ) + } + } + + test("sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub") { + + config "./vcf_gz_index_tbi.config" + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi', checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert process.out.tbi[0][1].endsWith(".tbi") } + ) + } + } +} diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test.snap b/modules/nf-core/bcftools/view/tests/main.nf.test.snap new file mode 100644 index 0000000..92972d1 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test.snap @@ -0,0 +1,393 @@ +{ + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:21:02.710815567" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:36.071823323" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + + ], + "2": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "3": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ], + "csi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:56.054811979" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_tbi - stub": { + "content": [ + { + "0": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + + ], + "3": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "vcf": [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:21:09.229049434" + }, + "sarscov2 - [vcf, tbi], vcf, tsv, []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,1bcbd0eff25d316ba915d06463aab17b" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:42.68820706" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + "out.vcf", + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:49.538986405" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi" + ] + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:22.451426124" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,8e722884ffb75155212a3fc053918766" + ] + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:16.040611233" + }, + "sarscov2 - [vcf, tbi], [], [], [] - vcf_gz_index_csi": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + [ + { + "id": "out", + "single_end": false + }, + "out_vcf.vcf.gz.csi" + ] + ], + [ + + ], + { + "versions_bcftools": [ + [ + "BCFTOOLS_VIEW", + "bcftools", + "1.22" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.2" + }, + "timestamp": "2026-01-20T12:20:29.512063514" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/view/tests/nextflow.config b/modules/nf-core/bcftools/view/tests/nextflow.config new file mode 100644 index 0000000..932e3ba --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = '--no-version --output-type v' +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index.config new file mode 100644 index 0000000..7dd696e --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index --no-version" +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config new file mode 100644 index 0000000..aebffb6 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index_csi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=csi --no-version" +} diff --git a/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config b/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config new file mode 100644 index 0000000..b192ae7 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/vcf_gz_index_tbi.config @@ -0,0 +1,4 @@ +process { + ext.prefix = { "${meta.id}_vcf" } + ext.args = "--output-type z --write-index=tbi --no-version" +} diff --git a/modules/nf-core/bedtools/subtract/main.nf b/modules/nf-core/bedtools/subtract/main.nf index c080844..1afc336 100644 --- a/modules/nf-core/bedtools/subtract/main.nf +++ b/modules/nf-core/bedtools/subtract/main.nf @@ -1,18 +1,18 @@ process BEDTOOLS_SUBTRACT { - 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/bedtools:2.31.1--hf5e1c6e_0' : - 'biocontainers/bedtools:2.31.1--hf5e1c6e_0' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/bedtools:2.31.1--hf5e1c6e_0' + : 'biocontainers/bedtools:2.31.1--hf5e1c6e_0'}" input: tuple val(meta), path(intervals1), path(intervals2) output: tuple val(meta), path("*.bed"), emit: bed - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('bedtools'), eval("bedtools --version | sed -e 's/bedtools v//g'"), topic: versions, emit: versions_bedtools when: task.ext.when == null || task.ext.when @@ -20,31 +20,21 @@ process BEDTOOLS_SUBTRACT { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - if ("$intervals1" == "${prefix}.bed" || - "$intervals2" == "${prefix}.bed") - error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + if ("${intervals1}" == "${prefix}.bed" || "${intervals2}" == "${prefix}.bed") { + error("Input and output names are the same, use \"task.ext.prefix\" to disambiguate!") + } """ bedtools \\ subtract \\ - -a $intervals1 \\ - -b $intervals2 \\ - $args \\ + -a ${intervals1} \\ + -b ${intervals2} \\ + ${args} \\ > ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") - END_VERSIONS """ } diff --git a/modules/nf-core/bedtools/subtract/meta.yml b/modules/nf-core/bedtools/subtract/meta.yml index 9519875..4efd8df 100644 --- a/modules/nf-core/bedtools/subtract/meta.yml +++ b/modules/nf-core/bedtools/subtract/meta.yml @@ -41,13 +41,27 @@ output: description: File containing the difference between the two sets of features patters: "*.bed" ontologies: [] + versions_bedtools: + - - ${task.process}: + type: string + description: The name of the process + - bedtools: + type: string + description: The name of the tool + - "bedtools --version | sed -e 's/bedtools v//g'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - bedtools: + type: string + description: The name of the tool + - "bedtools --version | sed -e 's/bedtools v//g'": + type: eval + description: The expression to obtain the version of the tool authors: - "@sidorov-si" maintainers: diff --git a/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap b/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap index 1dc0e6e..4a8df74 100644 --- a/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap +++ b/modules/nf-core/bedtools/subtract/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,1424765d0d00cc3f44f5e7745607effe" + [ + "BEDTOOLS_SUBTRACT", + "bedtools", + "2.31.1" + ] ], "bed": [ [ @@ -21,15 +25,19 @@ "test_subtract.bed:md5,63513c4dc69e8b481ce3b4b2a9f24259" ] ], - "versions": [ - "versions.yml:md5,1424765d0d00cc3f44f5e7745607effe" + "versions_bedtools": [ + [ + "BEDTOOLS_SUBTRACT", + "bedtools", + "2.31.1" + ] ] } ], "meta": { - "nf-test": "0.8.4", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-08-26T13:47:34.662548" + "timestamp": "2026-01-21T11:35:32.771087338" } } \ No newline at end of file diff --git a/modules/nf-core/bowtie2/align/meta.yml b/modules/nf-core/bowtie2/align/meta.yml index f38da12..0c12b28 100644 --- a/modules/nf-core/bowtie2/align/meta.yml +++ b/modules/nf-core/bowtie2/align/meta.yml @@ -14,7 +14,7 @@ tools: sequencing reads to long reference sequences. homepage: http://bowtie-bio.sourceforge.net/bowtie2/index.shtml documentation: http://bowtie-bio.sourceforge.net/bowtie2/manual.shtml - doi: 10.1038/nmeth.1923 + doi: 10.1186/gb-2009-10-3-r25 licence: ["GPL-3.0-or-later"] identifier: "" input: diff --git a/modules/nf-core/bowtie2/align/tests/large_index.config b/modules/nf-core/bowtie2/align/tests/large_index.config index fdc1c59..b2f0c40 100644 --- a/modules/nf-core/bowtie2/align/tests/large_index.config +++ b/modules/nf-core/bowtie2/align/tests/large_index.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_BUILD { ext.args = '--large-index' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/sam.config b/modules/nf-core/bowtie2/align/tests/sam.config index c1d8c35..14d94e9 100644 --- a/modules/nf-core/bowtie2/align/tests/sam.config +++ b/modules/nf-core/bowtie2/align/tests/sam.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_ALIGN { ext.args2 = '--output-fmt SAM' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/sam2.config b/modules/nf-core/bowtie2/align/tests/sam2.config index 4e85ff0..c39156f 100644 --- a/modules/nf-core/bowtie2/align/tests/sam2.config +++ b/modules/nf-core/bowtie2/align/tests/sam2.config @@ -2,4 +2,4 @@ process { withName: BOWTIE2_ALIGN { ext.args2 = '-O SAM' } -} \ No newline at end of file +} diff --git a/modules/nf-core/bowtie2/align/tests/tags.yml b/modules/nf-core/bowtie2/align/tests/tags.yml deleted file mode 100644 index ac47d1c..0000000 --- a/modules/nf-core/bowtie2/align/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -bowtie2/align: - - modules/nf-core/bowtie2/align/** diff --git a/modules/nf-core/bwamem2/index/environment.yml b/modules/nf-core/bwamem2/index/environment.yml index c069e28..f363744 100644 --- a/modules/nf-core/bwamem2/index/environment.yml +++ b/modules/nf-core/bwamem2/index/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 529c66e..62af1e3 100644 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -6,8 +6,8 @@ process BWAMEM2_INDEX { 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/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' : + 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/bwamem2/mem/environment.yml b/modules/nf-core/bwamem2/mem/environment.yml index c069e28..f363744 100644 --- a/modules/nf-core/bwamem2/mem/environment.yml +++ b/modules/nf-core/bwamem2/mem/environment.yml @@ -6,8 +6,8 @@ channels: dependencies: # renovate: datasource=conda depName=bioconda/bwa-mem2 - - bwa-mem2=2.2.1 + - bwa-mem2=2.3 # renovate: datasource=conda depName=bioconda/htslib - - htslib=1.21 + - htslib=1.22.1 # renovate: datasource=conda depName=bioconda/samtools - - samtools=1.21 + - samtools=1.22.1 diff --git a/modules/nf-core/bwamem2/mem/main.nf b/modules/nf-core/bwamem2/mem/main.nf index eab662a..27910cf 100644 --- a/modules/nf-core/bwamem2/mem/main.nf +++ b/modules/nf-core/bwamem2/mem/main.nf @@ -4,8 +4,8 @@ process BWAMEM2_MEM { 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/9a/9ac054213e67b3c9308e409b459080bbe438f8fd6c646c351bc42887f35a42e7/data' : - 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:e1f420694f8e42bd' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/e0/e05ce34b46ad42810eb29f74e4e304c0cb592b2ca15572929ed8bbaee58faf01/data' : + 'community.wave.seqera.io/library/bwa-mem2_htslib_samtools:db98f81f55b64113' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap b/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap index ec90701..b7d40a6 100644 --- a/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap +++ b/modules/nf-core/bwamem2/mem/tests/main.nf.test.snap @@ -1,17 +1,17 @@ { "sarscov2 - [fastq1, fastq2], index, fasta, false": { "content": [ - "9505760d66e1d5a5d34ab79a98228c6", + "e414c2d48e2e44c2c52c20ecd88e8bd8", "57aeef88ed701a8ebc8e2f0a381b2a6", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:57:52.782442426" + "timestamp": "2025-09-23T11:44:52.73673293" }, "sarscov2 - [fastq1, fastq2], index, fasta, true - stub": { "content": [ @@ -44,7 +44,7 @@ ] ], "5": [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ], "bam": [ [ @@ -74,56 +74,56 @@ ], "versions": [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:58:37.140104324" + "timestamp": "2025-09-23T11:45:14.834888709" }, "sarscov2 - [fastq1, fastq2], index, fasta, true": { "content": [ - "e0c38d5772ca5f4d5d9999f4477e933c", + "716ed1ef39deaad346ca7cf86e08f959", "af8628d9df18b2d3d4f6fd47ef2bb872", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:58:19.047052261" + "timestamp": "2025-09-23T11:45:04.750057645" }, "sarscov2 - fastq, index, fasta, false": { "content": [ - "58d05395bbb819e929885bde415947ae", + "283a83f604f3f5338acedfee349dccf4", "798439cbd7fd81cbcc5078022dc5479d", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:56:53.456559296" + "timestamp": "2025-09-23T11:44:28.57550711" }, "sarscov2 - fastq, index, fasta, true": { "content": [ - "276189f6f003f99a87664e74fad2893d", + "ed99048bb552cac58e39923b550b6d5b", "94fcf617f5b994584c4e8d4044e16b4f", [ - "versions.yml:md5,ca1b1dcf82b92fb0751816fca16a477a" + "versions.yml:md5,3574188ab1f33fd99cff9f5562dfb885" ] ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.5" + "nextflow": "25.04.7" }, - "timestamp": "2025-03-27T10:57:21.949711746" + "timestamp": "2025-09-23T11:44:40.437183765" } } \ No newline at end of file diff --git a/modules/nf-core/bwamem2/mem/tests/tags.yml b/modules/nf-core/bwamem2/mem/tests/tags.yml deleted file mode 100644 index 134efb2..0000000 --- a/modules/nf-core/bwamem2/mem/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -bwamem2/mem: - - "modules/nf-core/bwamem2/mem/**" diff --git a/modules/nf-core/cat/fastq/main.nf b/modules/nf-core/cat/fastq/main.nf index acfb6d0..0a195a3 100644 --- a/modules/nf-core/cat/fastq/main.nf +++ b/modules/nf-core/cat/fastq/main.nf @@ -12,23 +12,18 @@ process CAT_FASTQ { output: tuple val(meta), path("*.merged.fastq.gz"), emit: reads - path "versions.yml", emit: versions + tuple val("${task.process}"), val("cat"), eval("cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//'"), emit: versions_cat, topic: versions when: task.ext.when == null || task.ext.when script: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ cat ${readList.join(' ')} > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -42,11 +37,6 @@ process CAT_FASTQ { """ cat ${read1.join(' ')} > ${prefix}_1.merged.fastq.gz cat ${read2.join(' ')} > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") @@ -55,16 +45,11 @@ process CAT_FASTQ { stub: def prefix = task.ext.prefix ?: "${meta.id}" - def readList = reads instanceof List ? reads.collect { it.toString() } : [reads.toString()] + def readList = reads instanceof List ? reads.collect { item -> item.toString() } : [reads.toString()] if (meta.single_end) { if (readList.size >= 1) { """ echo '' | gzip > ${prefix}.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ files to concatenate in the process input") @@ -75,11 +60,6 @@ process CAT_FASTQ { """ echo '' | gzip > ${prefix}_1.merged.fastq.gz echo '' | gzip > ${prefix}_2.merged.fastq.gz - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - cat: \$(echo \$(cat --version 2>&1) | sed 's/^.*coreutils) //; s/ .*\$//') - END_VERSIONS """ } else { error("Could not find any FASTQ file pairs to concatenate in the process input") diff --git a/modules/nf-core/cat/fastq/meta.yml b/modules/nf-core/cat/fastq/meta.yml index 40d2f62..8fc03bd 100644 --- a/modules/nf-core/cat/fastq/meta.yml +++ b/modules/nf-core/cat/fastq/meta.yml @@ -34,13 +34,29 @@ output: description: Merged fastq file pattern: "*.{merged.fastq.gz}" ontologies: [] + versions_cat: + - - ${task.process}: + type: string + description: The process the versions were collected from + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - cat: + type: string + description: The tool name + - cat --version 2>&1 | head -n 1 | sed 's/^.*coreutils) //; s/ .*\$//': + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/cat/fastq/tests/main.nf.test.snap b/modules/nf-core/cat/fastq/tests/main.nf.test.snap index ee5ab36..e2a9424 100644 --- a/modules/nf-core/cat/fastq/tests/main.nf.test.snap +++ b/modules/nf-core/cat/fastq/tests/main.nf.test.snap @@ -22,7 +22,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -33,16 +37,20 @@ "test.merged.fastq.gz:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:04.902821069" + "timestamp": "2025-12-10T14:31:42.84401526" }, "test_cat_fastq_paired_end_same_name": { "content": [ @@ -60,7 +68,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -74,16 +86,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:57.476357974" + "timestamp": "2025-12-10T14:31:36.820489323" }, "test_cat_fastq_paired_end_same_name - stub": { "content": [ @@ -101,7 +117,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -115,16 +135,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:34.615815265" + "timestamp": "2025-12-10T14:32:06.262192935" }, "test_cat_fastq_single_end": { "content": [ @@ -139,7 +163,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -150,16 +178,20 @@ "test.merged.fastq.gz:md5,ee314a9bd568d06617171b0c85f508da" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:32.489874386" + "timestamp": "2025-12-10T14:31:18.859169785" }, "test_cat_fastq_single_end_same_name": { "content": [ @@ -174,7 +206,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -185,16 +221,20 @@ "test.merged.fastq.gz:md5,3ad9406595fafec8172368f9cd0b6a22" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:49.184759506" + "timestamp": "2025-12-10T14:31:30.942615287" }, "test_cat_fastq_single_end - stub": { "content": [ @@ -209,7 +249,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -220,16 +264,20 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:12.857293744" + "timestamp": "2025-12-10T14:31:48.827990633" }, "test_cat_fastq_paired_end_no_files": { "content": [ @@ -264,7 +312,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -275,16 +327,20 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:27.816080065" + "timestamp": "2025-12-10T14:32:00.586584379" }, "test_cat_fastq_paired_end": { "content": [ @@ -302,7 +358,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -316,16 +376,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:23:41.739469187" + "timestamp": "2025-12-10T14:31:25.159365603" }, "test_cat_fastq_single_end_no_files": { "content": [ @@ -353,7 +417,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -367,16 +435,20 @@ ] ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:21.178950408" + "timestamp": "2025-12-10T14:31:54.850702874" }, "test_cat_fastq_single_end_single_file - stub": { "content": [ @@ -391,7 +463,11 @@ ] ], "1": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ], "reads": [ [ @@ -402,15 +478,19 @@ "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,6ef4fd28546a005865b9454bbedbf81a" + "versions_cat": [ + [ + "CAT_FASTQ", + "cat", + "9.5" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.4" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-02-25T17:24:40.851404993" + "timestamp": "2025-12-10T14:32:11.746498148" } } \ No newline at end of file diff --git a/modules/nf-core/cat/fastq/tests/tags.yml b/modules/nf-core/cat/fastq/tests/tags.yml deleted file mode 100644 index 6ac4361..0000000 --- a/modules/nf-core/cat/fastq/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -cat/fastq: - - modules/nf-core/cat/fastq/** diff --git a/modules/nf-core/fastp/main.nf b/modules/nf-core/fastp/main.nf index ecac5b9..7538fc3 100644 --- a/modules/nf-core/fastp/main.nf +++ b/modules/nf-core/fastp/main.nf @@ -8,8 +8,7 @@ process FASTP { 'community.wave.seqera.io/library/fastp:1.0.1--c8b87fe62dcc103c' }" input: - tuple val(meta), path(reads) - path adapter_fasta + tuple val(meta), path(reads), path(adapter_fasta) val discard_trimmed_pass val save_trimmed_fail val save_merged @@ -30,9 +29,9 @@ process FASTP { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def adapter_list = adapter_fasta ? "--adapter_fasta ${adapter_fasta}" : "" - def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_1.fail.fastq.gz --unpaired2 ${prefix}_2.fail.fastq.gz" : '' - def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_1.fastp.fastq.gz" ) - def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_2.fastp.fastq.gz" + def fail_fastq = save_trimmed_fail && meta.single_end ? "--failed_out ${prefix}.fail.fastq.gz" : save_trimmed_fail && !meta.single_end ? "--failed_out ${prefix}.paired.fail.fastq.gz --unpaired1 ${prefix}_R1.fail.fastq.gz --unpaired2 ${prefix}_R2.fail.fastq.gz" : '' + def out_fq1 = discard_trimmed_pass ?: ( meta.single_end ? "--out1 ${prefix}.fastp.fastq.gz" : "--out1 ${prefix}_R1.fastp.fastq.gz" ) + def out_fq2 = discard_trimmed_pass ?: "--out2 ${prefix}_R2.fastp.fastq.gz" // Added soft-links to original fastqs for consistent naming in MultiQC // Use single ended for interleaved. Add --interleaved_in in config. if ( task.ext.args?.contains('--interleaved_in') ) { @@ -79,11 +78,11 @@ process FASTP { } else { def merge_fastq = save_merged ? "-m --merged_out ${prefix}.merged.fastq.gz" : '' """ - [ ! -f ${prefix}_1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_1.fastq.gz - [ ! -f ${prefix}_2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_2.fastq.gz + [ ! -f ${prefix}_R1.fastq.gz ] && ln -sf ${reads[0]} ${prefix}_R1.fastq.gz + [ ! -f ${prefix}_R2.fastq.gz ] && ln -sf ${reads[1]} ${prefix}_R2.fastq.gz fastp \\ - --in1 ${prefix}_1.fastq.gz \\ - --in2 ${prefix}_2.fastq.gz \\ + --in1 ${prefix}_R1.fastq.gz \\ + --in2 ${prefix}_R2.fastq.gz \\ $out_fq1 \\ $out_fq2 \\ --json ${prefix}.fastp.json \\ @@ -106,9 +105,9 @@ process FASTP { stub: def prefix = task.ext.prefix ?: "${meta.id}" def is_single_output = task.ext.args?.contains('--interleaved_in') || meta.single_end - def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_2.fastp.fastq.gz" + def touch_reads = (discard_trimmed_pass) ? "" : (is_single_output) ? "echo '' | gzip > ${prefix}.fastp.fastq.gz" : "echo '' | gzip > ${prefix}_R1.fastp.fastq.gz ; echo '' | gzip > ${prefix}_R2.fastp.fastq.gz" def touch_merged = (!is_single_output && save_merged) ? "echo '' | gzip > ${prefix}.merged.fastq.gz" : "" - def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_1.fail.fastq.gz ; echo '' | gzip > ${prefix}_2.fail.fastq.gz" + def touch_fail_fastq = (!save_trimmed_fail) ? "" : meta.single_end ? "echo '' | gzip > ${prefix}.fail.fastq.gz" : "echo '' | gzip > ${prefix}.paired.fail.fastq.gz ; echo '' | gzip > ${prefix}_R1.fail.fastq.gz ; echo '' | gzip > ${prefix}_R2.fail.fastq.gz" """ $touch_reads $touch_fail_fastq diff --git a/modules/nf-core/fastp/meta.yml b/modules/nf-core/fastp/meta.yml index b867327..324025f 100644 --- a/modules/nf-core/fastp/meta.yml +++ b/modules/nf-core/fastp/meta.yml @@ -25,11 +25,11 @@ input: respectively. If you wish to run interleaved paired-end data, supply as single-end data but with `--interleaved_in` in your `modules.conf`'s `ext.args` for the module. ontologies: [] - - adapter_fasta: - type: file - description: File in FASTA format containing possible adapters to remove. - pattern: "*.{fasta,fna,fas,fa}" - ontologies: [] + - adapter_fasta: + type: file + description: File in FASTA format containing possible adapters to remove. + pattern: "*.{fasta,fna,fas,fa}" + ontologies: [] - discard_trimmed_pass: type: boolean description: | diff --git a/modules/nf-core/fastp/tests/main.nf.test b/modules/nf-core/fastp/tests/main.nf.test index 30dbb8a..5125705 100644 --- a/modules/nf-core/fastp/tests/main.nf.test +++ b/modules/nf-core/fastp/tests/main.nf.test @@ -13,14 +13,19 @@ nextflow_process { process { """ + adapter_fasta = [] // empty list for no adapter file! + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -31,11 +36,11 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, - process.out.versions).match() } + process.out.versions).match() + } ) } } @@ -46,20 +51,22 @@ nextflow_process { process { """ - adapter_fasta = [] - save_trimmed_pass = true - save_trimmed_fail = false - save_merged = false + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -70,7 +77,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -85,14 +91,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -106,7 +117,6 @@ nextflow_process { { assert process.out.reads_merged == [] }, { assert snapshot( process.out.reads, - process.out.json, process.out.versions).match() } ) } @@ -118,14 +128,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -136,7 +151,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -151,15 +165,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -173,7 +194,6 @@ nextflow_process { process.out.reads, process.out.reads_fail, process.out.reads_merged, - process.out.json, process.out.versions).match() } ) } @@ -184,15 +204,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -203,7 +230,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("total reads: 75") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -217,15 +243,22 @@ nextflow_process { when { process { """ + adapter_fasta = file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) + input[1] = false input[2] = false - input[3] = false - input[4] = true + input[3] = true """ } } @@ -236,7 +269,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("
") }, { assert path(process.out.log.get(0).get(1)).getText().contains("total bases: 13683") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads_fail, process.out.reads_merged, @@ -250,14 +282,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -268,7 +306,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("single end (151 cycles)") }, { assert path(process.out.log.get(0).get(1)).getText().contains("reads passed filter: 99") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads, process.out.reads_fail, @@ -285,15 +322,22 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -304,7 +348,6 @@ nextflow_process { { assert path(process.out.html.get(0).get(1)).getText().contains("The input has little adapter percentage (~0.000000%), probably it's trimmed before.") }, { assert path(process.out.log.get(0).get(1)).getText().contains("Q30 bases: 12281(88.3716%)") }, { assert snapshot( - process.out.json, process.out.reads, process.out.reads, process.out.reads_fail, @@ -324,14 +367,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -352,20 +400,20 @@ nextflow_process { process { """ - adapter_fasta = [] - save_trimmed_pass = true - save_trimmed_fail = false - save_merged = false + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -386,14 +434,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -414,14 +467,19 @@ nextflow_process { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -442,15 +500,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = true + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = true - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -470,15 +533,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -498,15 +566,22 @@ nextflow_process { when { process { """ + adapter_fasta = file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) + discard_trimmed_pass = false + save_trimmed_fail = false + save_merged = true + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + [ + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) + ], + adapter_fasta ]) - input[1] = Channel.of([ file(params.modules_testdata_base_path + 'delete_me/fastp/adapters.fasta', checkIfExists: true) ]) - input[2] = false - input[3] = false - input[4] = true + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -526,14 +601,19 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] + [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -553,15 +633,20 @@ nextflow_process { when { process { """ + adapter_fasta = [] + discard_trimmed_pass = true + save_trimmed_fail = false + save_merged = false + input[0] = Channel.of([ [ id:'test', single_end:false ], // meta map [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ], + adapter_fasta ]) - input[1] = [] - input[2] = true - input[3] = false - input[4] = false + input[1] = discard_trimmed_pass + input[2] = save_trimmed_fail + input[3] = save_merged """ } } @@ -573,4 +658,4 @@ nextflow_process { ) } } -} \ No newline at end of file +} diff --git a/modules/nf-core/fastp/tests/main.nf.test.snap b/modules/nf-core/fastp/tests/main.nf.test.snap index 5b5eeb6..2276fc0 100644 --- a/modules/nf-core/fastp/tests/main.nf.test.snap +++ b/modules/nf-core/fastp/tests/main.nf.test.snap @@ -90,15 +90,6 @@ }, "test_fastp_paired_end": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,8073d8e7bd8966ece6c8177a784d016b" - ] - ], [ [ { @@ -106,8 +97,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", - "test_2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" + "test_R1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_R2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" ] ] ], @@ -122,22 +113,13 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:54:30.613836" + "timestamp": "2025-12-22T14:32:22.887952042" }, "test_fastp_paired_end_merged_adapterlist": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,538d8d0527d9c98a4c1f49bebbac1df0" - ] - ], [ [ { @@ -145,8 +127,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", - "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + "test_R1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_R2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" ] ] ], @@ -167,22 +149,13 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:54:55.200243" + "timestamp": "2025-12-22T14:32:53.752975682" }, "test_fastp_single_end_qc_only": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,dac771d6fc18baf9bd0b7067bdc04d52" - ] - ], [ ], @@ -209,7 +182,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-11T09:55:00.224217" + "timestamp": "2025-09-19T16:23:36.149003" }, "test_fastp_paired_end_trim_fail": { "content": [ @@ -220,8 +193,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", - "test_2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" + "test_R1.fastp.fastq.gz:md5,6ff32a64c5188b9a9192be1398c262c7", + "test_R2.fastp.fastq.gz:md5,db0cb7c9977e94ac2b4b446ebd017a8a" ] ] ], @@ -233,32 +206,23 @@ }, [ "test.paired.fail.fastq.gz:md5,409b687c734cedd7a1fec14d316e1366", - "test_1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", - "test_2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" + "test_R1.fail.fastq.gz:md5,4f273cf3159c13f79e8ffae12f5661f6", + "test_R2.fail.fastq.gz:md5,f97b9edefb5649aab661fbc9e71fc995" ] ] ], [ - ], - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,23ba6ce04e9d1c49bad55741a0e7eced" - ] ], [ "versions.yml:md5,c4974822658d02533e660fae343f281b" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:54:45.32191" + "timestamp": "2025-12-22T14:32:41.270456637" }, "fastp - stub test_fastp_interleaved": { "content": [ @@ -472,8 +436,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -553,8 +517,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -576,10 +540,10 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:55:37.413738" + "timestamp": "2025-12-22T14:33:44.204950729" }, "test_fastp_paired_end_merged - stub": { "content": [ @@ -591,8 +555,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -672,8 +636,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -695,22 +659,13 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:55:32.965652" + "timestamp": "2025-12-22T14:33:38.518882433" }, "test_fastp_paired_end_merged": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,6f716765d4cee428c41a4b361bb0db07" - ] - ], [ [ { @@ -718,8 +673,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", - "test_2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" + "test_R1.fastp.fastq.gz:md5,54b726a55e992a869fd3fa778afe1672", + "test_R2.fastp.fastq.gz:md5,29d3b33b869f7b63417b8ff07bb128ba" ] ] ], @@ -740,10 +695,10 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:54:50.001244" + "timestamp": "2025-12-22T14:32:47.366974895" }, "test_fastp_paired_end - stub": { "content": [ @@ -755,8 +710,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -830,8 +785,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -847,22 +802,13 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:55:14.414258" + "timestamp": "2025-12-22T14:33:16.494574544" }, "test_fastp_single_end": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,26b6549bf45cafb7b1127a8d32338754" - ] - ], [ [ { @@ -886,7 +832,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-11T09:54:25.511975" + "timestamp": "2025-09-19T16:23:08.469846" }, "test_fastp_single_end_trim_fail - stub": { "content": [ @@ -1011,8 +957,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1051,8 +997,8 @@ }, [ "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1096,8 +1042,8 @@ "single_end": false }, [ - "test_1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1109,8 +1055,8 @@ }, [ "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + "test_R1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" ] ] ], @@ -1123,10 +1069,10 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.04.8" }, - "timestamp": "2025-09-11T09:55:28.399328" + "timestamp": "2025-12-22T14:33:32.863505882" }, "fastp test_fastp_interleaved": { "content": [ @@ -1139,15 +1085,6 @@ "test.fastp.fastq.gz:md5,217d62dc13a23e92513a1bd8e1bcea39" ] ], - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,c4e4093a100ef3fa9740620d42bf90c4" - ] - ], [ "versions.yml:md5,c4974822658d02533e660fae343f281b" ] @@ -1156,19 +1093,10 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-11T09:54:35.970659" + "timestamp": "2025-09-19T16:23:16.479494" }, "test_fastp_single_end_trim_fail": { "content": [ - [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,27307e0f9154fc37e1cb84f207bf33e0" - ] - ], [ [ { @@ -1198,19 +1126,10 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-11T09:54:40.611616" + "timestamp": "2025-09-19T16:23:20.299076" }, "test_fastp_paired_end_qc_only": { "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,f411d75c34448fcad813ccd9b3d0fa3d" - ] - ], [ ], @@ -1237,7 +1156,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-11T09:55:04.894274" + "timestamp": "2025-09-19T16:23:40.113724" }, "test_fastp_paired_end_qc_only - stub": { "content": [ diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index 23e1663..4b3041d 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -11,9 +11,9 @@ process FASTQC { tuple val(meta), path(reads) output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions + tuple val(meta) , path("*.html") , emit: html + tuple val(meta) , path("*.zip") , emit: zip + tuple val("${task.process}"), val('fastqc'), eval('fastqc --version | sed "/FastQC v/!d; s/.*v//"'), emit: versions_fastqc, topic: versions when: task.ext.when == null || task.ext.when @@ -43,11 +43,6 @@ process FASTQC { --threads ${task.cpus} \\ --memory ${fastqc_memory} \\ ${renamed_files} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ stub: @@ -55,10 +50,5 @@ process FASTQC { """ touch ${prefix}.html touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS """ } diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index c8d9d02..49164c8 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -53,13 +53,28 @@ output: description: FastQC report archive pattern: "*_{fastqc.zip}" ontologies: [] + versions_fastqc: + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - fastqc --version | sed "/FastQC v/!d; s/.*v//": + type: eval + description: The expression to obtain the version of the tool authors: - "@drpatelh" - "@grst" @@ -70,3 +85,27 @@ maintainers: - "@grst" - "@ewels" - "@FelixKrueger" +containers: + conda: + linux_amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-af7a5314d5015c29_1/condalock + linux_arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-df99cb252670875a_2/condalock + docker: + linux_amd64: + build_id: bd-af7a5314d5015c29_1 + name: community.wave.seqera.io/library/fastqc:0.12.1--af7a5314d5015c29 + scanId: sc-a618548acbee5a8a_30 + linux_arm64: + build_id: bd-df99cb252670875a_2 + name: community.wave.seqera.io/library/fastqc:0.12.1--df99cb252670875a + scanId: sc-b5913ed5d42b22d2_18 + singularity: + linux_amd64: + build_id: bd-104d26ddd9519960_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--104d26ddd9519960 + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:e0c976cb2eca5fee72618a581537a4f8ea42fcae24c9b201e2e0f764fd28648a + linux_arm64: + build_id: bd-d56b505a93aef38a_1 + name: oras://community.wave.seqera.io/library/fastqc:0.12.1--d56b505a93aef38a + https: https://community.wave.seqera.io/v2/library/fastqc/blobs/sha256:fd39534bf298698cbe3ee4d4a6f1e73330ec4bca44c38dd9a4d06cb5ea838017 diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index e9d79a0..66c44da 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -30,7 +30,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -58,7 +58,7 @@ nextflow_process { { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -82,7 +82,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -106,7 +106,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -142,7 +142,7 @@ nextflow_process { { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } @@ -166,7 +166,7 @@ nextflow_process { { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(process.out.versions).match() } + { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } ) } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index d5db309..c8ee120 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,15 +1,21 @@ { "sarscov2 custom_prefix": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:16.374038" + "timestamp": "2025-10-28T16:39:14.518503" }, "sarscov2 single-end [fastq] - stub": { "content": [ @@ -33,7 +39,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -44,8 +54,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -59,10 +73,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:24.993809" + "timestamp": "2025-10-28T16:39:19.309008" }, "sarscov2 custom_prefix - stub": { "content": [ @@ -86,7 +100,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -97,8 +115,12 @@ "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -112,58 +134,82 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:10.93942" + "timestamp": "2025-10-28T16:39:44.94888" }, "sarscov2 interleaved [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:42.355718" + "timestamp": "2025-10-28T16:38:45.168496" }, "sarscov2 paired-end [bam]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:53.276274" + "timestamp": "2025-10-28T16:38:53.268919" }, "sarscov2 multiple [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:05.527626" + "timestamp": "2025-10-28T16:39:05.050305" }, "sarscov2 paired-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:31.188871" + "timestamp": "2025-10-28T16:38:37.2373" }, "sarscov2 paired-end [fastq] - stub": { "content": [ @@ -187,7 +233,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -198,8 +248,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -213,10 +267,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:34.273566" + "timestamp": "2025-10-28T16:39:24.450398" }, "sarscov2 multiple [fastq] - stub": { "content": [ @@ -240,7 +294,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -251,8 +309,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -266,22 +328,28 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:03:02.304411" + "timestamp": "2025-10-28T16:39:39.758762" }, "sarscov2 single-end [fastq]": { "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] + { + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:01:19.095607" + "timestamp": "2025-10-28T16:38:29.555068" }, "sarscov2 interleaved [fastq] - stub": { "content": [ @@ -305,7 +373,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -316,8 +388,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -331,10 +407,10 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:44.640184" + "timestamp": "2025-10-28T16:39:29.193136" }, "sarscov2 paired-end [bam] - stub": { "content": [ @@ -358,7 +434,11 @@ ] ], "2": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "html": [ [ @@ -369,8 +449,12 @@ "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" + "versions_fastqc": [ + [ + "FASTQC", + "fastqc", + "0.12.1" + ] ], "zip": [ [ @@ -384,9 +468,9 @@ } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.3" + "nf-test": "0.9.2", + "nextflow": "25.10.0" }, - "timestamp": "2024-07-22T11:02:53.550742" + "timestamp": "2025-10-28T16:39:34.144919" } } \ No newline at end of file diff --git a/modules/nf-core/gunzip/main.nf b/modules/nf-core/gunzip/main.nf index 3ffc8e9..a8533e7 100644 --- a/modules/nf-core/gunzip/main.nf +++ b/modules/nf-core/gunzip/main.nf @@ -12,7 +12,7 @@ process GUNZIP { output: tuple val(meta), path("${gunzip}"), emit: gunzip - path "versions.yml", emit: versions + tuple val("${task.process}"), val('gunzip'), eval('gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//"'), topic: versions, emit: versions_gunzip when: task.ext.when == null || task.ext.when @@ -32,24 +32,14 @@ process GUNZIP { ${args} \\ ${archive} \\ > ${gunzip} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ stub: - def args = task.ext.args ?: '' def extension = (archive.toString() - '.gz').tokenize('.')[-1] def name = archive.toString() - '.gz' - ".${extension}" def prefix = task.ext.prefix ?: name gunzip = prefix + ".${extension}" """ touch ${gunzip} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gunzip: \$(echo \$(gunzip --version 2>&1) | sed 's/^.*(gzip) //; s/ Copyright.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/gunzip/meta.yml b/modules/nf-core/gunzip/meta.yml index 926bb22..bba6b3b 100644 --- a/modules/nf-core/gunzip/meta.yml +++ b/modules/nf-core/gunzip/meta.yml @@ -34,13 +34,29 @@ output: description: Compressed/uncompressed file pattern: "*.*" ontologies: [] + versions_gunzip: + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - gunzip: + type: string + description: The tool name + - gunzip --version 2>&1 | head -1 | sed "s/^.*(gzip) //; s/ Copyright.*//": + type: eval + description: The expression to obtain the version of the tool + authors: - "@joseespinosa" - "@drpatelh" diff --git a/modules/nf-core/gunzip/tests/main.nf.test.snap b/modules/nf-core/gunzip/tests/main.nf.test.snap index a0f0e67..111ba1b 100644 --- a/modules/nf-core/gunzip/tests/main.nf.test.snap +++ b/modules/nf-core/gunzip/tests/main.nf.test.snap @@ -11,7 +11,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -21,16 +25,20 @@ "test.xyz.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:22.080222697" + "timestamp": "2026-01-19T17:21:56.633550769" }, "Should run without failures - stub": { "content": [ @@ -44,7 +52,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -54,16 +66,20 @@ "test_1.fastq:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:14.593020264" + "timestamp": "2026-01-19T17:21:51.435621199" }, "Should run without failures": { "content": [ @@ -77,7 +93,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -87,16 +107,20 @@ "test_1.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:01.295397925" + "timestamp": "2026-01-19T17:21:40.613975821" }, "Should run without failures - prefix": { "content": [ @@ -110,7 +134,11 @@ ] ], "1": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + [ + "GUNZIP", + "gunzip", + "1.13" + ] ], "gunzip": [ [ @@ -120,15 +148,19 @@ "test.xyz.fastq:md5,4161df271f9bfcd25d5845a1e220dbec" ] ], - "versions": [ - "versions.yml:md5,d327e4a19a6d5c5e974136cef8999d8c" + "versions_gunzip": [ + [ + "GUNZIP", + "gunzip", + "1.13" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2024-12-13T11:48:07.414271387" + "timestamp": "2026-01-19T17:21:46.086880414" } } \ No newline at end of file diff --git a/modules/nf-core/gunzip/tests/tags.yml b/modules/nf-core/gunzip/tests/tags.yml deleted file mode 100644 index fd3f691..0000000 --- a/modules/nf-core/gunzip/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -gunzip: - - modules/nf-core/gunzip/** diff --git a/modules/nf-core/minimap2/align/tests/main.nf.test b/modules/nf-core/minimap2/align/tests/main.nf.test index 4072c17..6506140 100644 --- a/modules/nf-core/minimap2/align/tests/main.nf.test +++ b/modules/nf-core/minimap2/align/tests/main.nf.test @@ -438,4 +438,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/minimap2/align/tests/tags.yml b/modules/nf-core/minimap2/align/tests/tags.yml deleted file mode 100644 index 39dba37..0000000 --- a/modules/nf-core/minimap2/align/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/align: - - "modules/nf-core/minimap2/align/**" diff --git a/modules/nf-core/minimap2/index/tests/main.nf.test b/modules/nf-core/minimap2/index/tests/main.nf.test index 97840ff..eec743c 100644 --- a/modules/nf-core/minimap2/index/tests/main.nf.test +++ b/modules/nf-core/minimap2/index/tests/main.nf.test @@ -29,4 +29,4 @@ nextflow_process { } -} \ No newline at end of file +} diff --git a/modules/nf-core/minimap2/index/tests/tags.yml b/modules/nf-core/minimap2/index/tests/tags.yml deleted file mode 100644 index e5ef8e1..0000000 --- a/modules/nf-core/minimap2/index/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -minimap2/index: - - modules/nf-core/minimap2/index/** diff --git a/modules/nf-core/multiqc/environment.yml b/modules/nf-core/multiqc/environment.yml index dd513cb..009874d 100644 --- a/modules/nf-core/multiqc/environment.yml +++ b/modules/nf-core/multiqc/environment.yml @@ -4,4 +4,4 @@ channels: - conda-forge - bioconda dependencies: - - bioconda::multiqc=1.31 + - bioconda::multiqc=1.33 diff --git a/modules/nf-core/multiqc/main.nf b/modules/nf-core/multiqc/main.nf index 5288f5c..3b0e975 100644 --- a/modules/nf-core/multiqc/main.nf +++ b/modules/nf-core/multiqc/main.nf @@ -3,11 +3,11 @@ process MULTIQC { 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/ef/eff0eafe78d5f3b65a6639265a16b89fdca88d06d18894f90fcdb50142004329/data' : - 'community.wave.seqera.io/library/multiqc:1.31--1efbafd542a23882' }" + 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data' : + 'community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b' }" input: - path multiqc_files, stageAs: "?/*" + path multiqc_files, stageAs: "?/*" path(multiqc_config) path(extra_multiqc_config) path(multiqc_logo) @@ -15,10 +15,11 @@ process MULTIQC { path(sample_names) output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions + path "*.html" , emit: report + path "*_data" , emit: data + path "*_plots" , optional:true, emit: plots + tuple val("${task.process}"), val('multiqc'), eval('multiqc --version | sed "s/.* //g"'), emit: versions + // MultiQC should not push its versions to the `versions` topic. Its input depends on the versions topic to be resolved thus outputting to the topic will let the pipeline hang forever when: task.ext.when == null || task.ext.when @@ -26,38 +27,29 @@ process MULTIQC { script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ? "--filename ${task.ext.prefix}.html" : '' - def config = multiqc_config ? "--config $multiqc_config" : '' - def extra_config = extra_multiqc_config ? "--config $extra_multiqc_config" : '' + def config = multiqc_config ? "--config ${multiqc_config}" : '' + def extra_config = extra_multiqc_config ? "--config ${extra_multiqc_config}" : '' def logo = multiqc_logo ? "--cl-config 'custom_logo: \"${multiqc_logo}\"'" : '' def replace = replace_names ? "--replace-names ${replace_names}" : '' def samples = sample_names ? "--sample-names ${sample_names}" : '' """ multiqc \\ --force \\ - $args \\ - $config \\ - $prefix \\ - $extra_config \\ - $logo \\ - $replace \\ - $samples \\ + ${args} \\ + ${config} \\ + ${prefix} \\ + ${extra_config} \\ + ${logo} \\ + ${replace} \\ + ${samples} \\ . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ stub: """ mkdir multiqc_data + touch multiqc_data/.stub mkdir multiqc_plots touch multiqc_report.html - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS """ } diff --git a/modules/nf-core/multiqc/meta.yml b/modules/nf-core/multiqc/meta.yml index ce30eb7..861cd7f 100644 --- a/modules/nf-core/multiqc/meta.yml +++ b/modules/nf-core/multiqc/meta.yml @@ -57,10 +57,10 @@ input: - edam: http://edamontology.org/format_3475 # TSV output: report: - - "*multiqc_report.html": + - "*.html": type: file description: MultiQC report file - pattern: "multiqc_report.html" + pattern: ".html" ontologies: [] data: - "*_data": @@ -74,12 +74,15 @@ output: pattern: "*_data" ontologies: [] versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - multiqc: + type: string + description: The tool name + - multiqc --version | sed "s/.* //g": + type: eval + description: The expression to obtain the version of the tool authors: - "@abhi18av" - "@bunop" @@ -90,3 +93,27 @@ maintainers: - "@bunop" - "@drpatelh" - "@jfy133" +containers: + conda: + linux/amd64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-ee7739d47738383b_1/condalock + linux/arm64: + lock_file: https://wave.seqera.io/v1alpha1/builds/bd-58d7dee710ab3aa8_1/condalock + docker: + linux/amd64: + build_id: bd-ee7739d47738383b_1 + name: community.wave.seqera.io/library/multiqc:1.33--ee7739d47738383b + scanId: sc-6ddec592dcadd583_4 + linux/arm64: + build_id: bd-58d7dee710ab3aa8_1 + name: community.wave.seqera.io/library/multiqc:1.33--58d7dee710ab3aa8 + scanId: sc-a04c42273e34c55c_2 + singularity: + linux/amd64: + build_id: bd-e3576ddf588fa00d_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/34/34e733a9ae16a27e80fe00f863ea1479c96416017f24a907996126283e7ecd4d/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--e3576ddf588fa00d + linux/arm64: + build_id: bd-2537ca5f8445e3c2_1 + https: https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/78/78b89e91d89e9cc99ad5ade5be311f347838cb2acbfb4f13bc343b170be09ce4/data + name: oras://community.wave.seqera.io/library/multiqc:1.33--2537ca5f8445e3c2 diff --git a/modules/nf-core/multiqc/tests/custom_prefix.config b/modules/nf-core/multiqc/tests/custom_prefix.config new file mode 100644 index 0000000..b30b135 --- /dev/null +++ b/modules/nf-core/multiqc/tests/custom_prefix.config @@ -0,0 +1,5 @@ +process { + withName: 'MULTIQC' { + ext.prefix = "custom_prefix" + } +} diff --git a/modules/nf-core/multiqc/tests/main.nf.test b/modules/nf-core/multiqc/tests/main.nf.test index 33316a7..d1ae8b0 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test +++ b/modules/nf-core/multiqc/tests/main.nf.test @@ -30,7 +30,33 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_single") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } + ) + } + + } + + test("sarscov2 single-end [fastqc] - custom prefix") { + config "./custom_prefix.config" + + when { + process { + """ + input[0] = Channel.of(file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastqc/test_fastqc.zip', checkIfExists: true)) + input[1] = [] + input[2] = [] + input[3] = [] + input[4] = [] + input[5] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert process.out.report[0] ==~ ".*/custom_prefix.html" }, + { assert process.out.data[0] ==~ ".*/custom_prefix_data" } ) } @@ -56,7 +82,7 @@ nextflow_process { { assert process.success }, { assert process.out.report[0] ==~ ".*/multiqc_report.html" }, { assert process.out.data[0] ==~ ".*/multiqc_data" }, - { assert snapshot(process.out.versions).match("multiqc_versions_config") } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions")}).match() } ) } } @@ -84,7 +110,7 @@ nextflow_process { { assert snapshot(process.out.report.collect { file(it).getName() } + process.out.data.collect { file(it).getName() } + process.out.plots.collect { file(it).getName() } + - process.out.versions ).match("multiqc_stub") } + process.out.findAll { key, val -> key.startsWith("versions")} ).match() } ) } diff --git a/modules/nf-core/multiqc/tests/main.nf.test.snap b/modules/nf-core/multiqc/tests/main.nf.test.snap index 17881d1..d72d35b 100644 --- a/modules/nf-core/multiqc/tests/main.nf.test.snap +++ b/modules/nf-core/multiqc/tests/main.nf.test.snap @@ -1,41 +1,61 @@ { - "multiqc_versions_single": { + "sarscov2 single-end [fastqc]": { "content": [ - [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-08T20:57:36.139055243" + "timestamp": "2025-12-09T10:10:43.020315838" }, - "multiqc_stub": { + "sarscov2 single-end [fastqc] - stub": { "content": [ [ "multiqc_report.html", "multiqc_data", "multiqc_plots", - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-08T20:59:15.142230631" + "timestamp": "2025-12-09T10:11:14.131950776" }, - "multiqc_versions_config": { + "sarscov2 single-end [fastqc] [config]": { "content": [ - [ - "versions.yml:md5,8968b114a3e20756d8af2b80713bcc4f" - ] + { + "versions": [ + [ + "MULTIQC", + "multiqc", + "1.33" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-08T20:58:29.629087066" + "timestamp": "2025-12-09T10:11:07.15692209" } } \ No newline at end of file diff --git a/modules/nf-core/porechop/porechop/main.nf b/modules/nf-core/porechop/porechop/main.nf index 34daf3e..dd148cf 100644 --- a/modules/nf-core/porechop/porechop/main.nf +++ b/modules/nf-core/porechop/porechop/main.nf @@ -3,7 +3,7 @@ process PORECHOP_PORECHOP { label 'process_medium' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://community-cr-prod.seqera.io/docker/registry/v2/blobs/sha256/2b/2bce1f10c51906a66c4c4d3a7485394f67e304177192ad1cce6cf586a3a18bae/data' : 'community.wave.seqera.io/library/porechop_pigz:d1655e5b5bad786c' }" diff --git a/modules/nf-core/porechop/porechop/tests/tags.yml b/modules/nf-core/porechop/porechop/tests/tags.yml deleted file mode 100644 index 743645c..0000000 --- a/modules/nf-core/porechop/porechop/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -porechop/porechop: - - "modules/nf-core/porechop/porechop/**" diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index ed2d70a..57a0349 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -17,7 +17,7 @@ process SAMTOOLS_FAIDX { tuple val(meta), path ("*.sizes") , emit: sizes, optional: true tuple val(meta), path ("*.fai") , emit: fai, optional: true tuple val(meta), path ("*.gzi") , emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -32,11 +32,6 @@ process SAMTOOLS_FAIDX { $args ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -51,11 +46,5 @@ process SAMTOOLS_FAIDX { fi ${get_sizes_command} - - cat <<-END_VERSIONS > versions.yml - - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index b7a2e0c..163c301 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -86,13 +86,28 @@ output: description: Optional gzip index file for compressed inputs pattern: "*.gzi" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test index 64219b7..02ba504 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -8,10 +8,14 @@ nextflow_process { tag "modules_nfcore" tag "samtools" tag "samtools/faidx" + config "./nextflow.config" test("test_samtools_faidx") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -23,9 +27,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -33,6 +37,9 @@ nextflow_process { test("test_samtools_faidx_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -44,18 +51,19 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_fasta") { - config "./nextflow.config" - when { + params { + module_args = 'MT192765.1 -o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -68,18 +76,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fasta") { - config "./nextflow2.config" - + options "-stub" when { + params { + module_args = '-o extract.fa' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -92,16 +102,20 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } test("test_samtools_faidx_stub_fai") { + options "-stub" when { + params { + module_args = '' + } process { """ input[0] = [ [ id:'test', single_end:false ], // meta map @@ -113,9 +127,9 @@ nextflow_process { } then { + assert process.success assertAll( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out).match()} ) } } @@ -123,6 +137,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -136,9 +153,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -146,6 +163,9 @@ nextflow_process { test("test_samtools_faidx_get_sizes_bgzip") { when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -159,9 +179,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -171,6 +191,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -184,9 +207,9 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } @@ -196,6 +219,9 @@ nextflow_process { options "-stub" when { + params { + module_args = '' + } process { """ input[0] = Channel.of([ @@ -209,11 +235,11 @@ nextflow_process { } then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + assert process.success + assertAll( + { assert snapshot(process.out).match()} ) } } -} \ No newline at end of file +} diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap index 3be7b82..565d20e 100644 --- a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -21,7 +21,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -41,16 +45,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:38.874686" + "timestamp": "2025-12-23T14:02:40.159309157" }, "test_samtools_faidx_get_sizes_bgzip - stub": { "content": [ @@ -83,7 +91,11 @@ ] ], "4": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -112,16 +124,20 @@ "genome.fasta.gz.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:10.958397" + "timestamp": "2025-12-23T14:03:39.550619177" }, "test_samtools_faidx_get_sizes": { "content": [ @@ -149,7 +165,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -173,16 +193,20 @@ "genome.fasta.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:59.237249" + "timestamp": "2025-12-23T14:03:16.844965756" }, "test_samtools_faidx_bgzip": { "content": [ @@ -212,7 +236,11 @@ ] ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -238,16 +266,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:42.949204" + "timestamp": "2025-12-23T14:02:47.301476131" }, "test_samtools_faidx_fasta": { "content": [ @@ -271,7 +303,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -291,16 +327,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:46.914038" + "timestamp": "2025-12-23T09:44:40.559583279" }, "test_samtools_faidx_get_sizes - stub": { "content": [ @@ -328,7 +368,11 @@ ], "4": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -352,16 +396,20 @@ "genome.fasta.sizes:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,8e7d141eb8c2944042dfb5e942bffe08" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:06.961912" + "timestamp": "2025-12-23T14:03:31.989929281" }, "test_samtools_faidx_stub_fasta": { "content": [ @@ -372,7 +420,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "1": [ @@ -385,7 +433,11 @@ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ [ @@ -393,7 +445,7 @@ "id": "test", "single_end": false }, - "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "extract.fa:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "fai": [ @@ -405,16 +457,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:51.226016" + "timestamp": "2025-12-23T09:44:48.295693103" }, "test_samtools_faidx_stub_fai": { "content": [ @@ -431,14 +487,18 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "3": [ ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -449,7 +509,7 @@ "id": "test", "single_end": false }, - "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + "genome.fasta.fai:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], "gzi": [ @@ -458,16 +518,20 @@ "sizes": [ ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:09:55.423005" + "timestamp": "2025-12-23T14:03:09.784289542" }, "test_samtools_faidx_get_sizes_bgzip": { "content": [ @@ -500,7 +564,11 @@ ] ], "4": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ], "fa": [ @@ -529,15 +597,19 @@ "genome.fasta.gz.sizes:md5,a57c401f27ae5133823fb09fb21c8a3c" ] ], - "versions": [ - "versions.yml:md5,001211003daf11e8dd2f1aca7a378a68" + "versions_samtools": [ + [ + "SAMTOOLS_FAIDX", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.2" }, - "timestamp": "2025-09-10T13:10:03.04872" + "timestamp": "2025-12-23T14:03:24.814967939" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config index f76a3ba..202c036 100644 --- a/modules/nf-core/samtools/faidx/tests/nextflow.config +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -1,7 +1,7 @@ process { withName: SAMTOOLS_FAIDX { - ext.args = 'MT192765.1 -o extract.fa' + ext.args = params.module_args } } diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config deleted file mode 100644 index 33ebbd5..0000000 --- a/modules/nf-core/samtools/faidx/tests/nextflow2.config +++ /dev/null @@ -1,6 +0,0 @@ -process { - - withName: SAMTOOLS_FAIDX { - ext.args = '-o extract.fa' - } -} diff --git a/modules/nf-core/samtools/flagstat/main.nf b/modules/nf-core/samtools/flagstat/main.nf index 9e71843..f148f56 100644 --- a/modules/nf-core/samtools/flagstat/main.nf +++ b/modules/nf-core/samtools/flagstat/main.nf @@ -35,7 +35,19 @@ process SAMTOOLS_FLAGSTAT { stub: def prefix = task.ext.prefix ?: "${meta.id}" """ - touch ${prefix}.flagstat + cat <<-END_FLAGSTAT > ${prefix}.flagstat + 1000000 + 0 in total (QC-passed reads + QC-failed reads) + 0 + 0 secondary + 0 + 0 supplementary + 0 + 0 duplicates + 900000 + 0 mapped (90.00% : N/A) + 1000000 + 0 paired in sequencing + 500000 + 0 read1 + 500000 + 0 read2 + 800000 + 0 properly paired (80.00% : N/A) + 850000 + 0 with mate mapped to a different chr + 50000 + 0 with mate mapped to a different chr (mapQ>=5) + END_FLAGSTAT cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap index 79960bc..0a0a9b1 100644 --- a/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/flagstat/tests/main.nf.test.snap @@ -8,7 +8,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "1": [ @@ -20,7 +20,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "versions": [ @@ -32,7 +32,7 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:31:17.098789" + "timestamp": "2025-09-15T15:02:00.813612" }, "BAM": { "content": [ @@ -67,6 +67,6 @@ "nf-test": "0.9.2", "nextflow": "25.04.6" }, - "timestamp": "2025-09-10T13:31:12.661288" + "timestamp": "2025-09-15T15:01:55.232954" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index d4bd5a3..6b5aa31 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -19,7 +19,7 @@ process SAMTOOLS_SORT { tuple val(meta), path("${prefix}.${extension}.crai"), emit: crai, optional: true tuple val(meta), path("${prefix}.${extension}.csi"), emit: csi, optional: true tuple val(meta), path("${prefix}.${extension}.bai"), emit: bai, optional: true - path "versions.yml", emit: versions + tuple val("${task.process}"), val('samtools'), eval("samtools version | sed '1!d;s/.* //'"), topic: versions, emit: versions_samtools when: task.ext.when == null || task.ext.when @@ -53,10 +53,6 @@ process SAMTOOLS_SORT { -o ${output_file} \\ - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: @@ -78,9 +74,5 @@ process SAMTOOLS_SORT { touch ${prefix}.${extension} ${index} - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 4c4010b..6996830 100644 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -76,7 +76,6 @@ output: description: Sorted SAM file pattern: "*.{sam}" ontologies: [] - crai: - - meta: type: map @@ -110,13 +109,29 @@ output: description: BAM index file (optional) pattern: "*.bai" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The process the versions were collected from + - samtools: + type: string + description: The tool name + - "samtools version | sed '1!d;s/.* //'": + type: string + description: The command used to generate the version of the tool + authors: - "@drpatelh" - "@ewels" diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test b/modules/nf-core/samtools/sort/tests/main.nf.test index fa27787..df47bb2 100644 --- a/modules/nf-core/samtools/sort/tests/main.nf.test +++ b/modules/nf-core/samtools/sort/tests/main.nf.test @@ -34,7 +34,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -66,12 +66,12 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } } - + test("bam_csi_index") { config "./nextflow.config" @@ -98,7 +98,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -133,7 +133,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -168,12 +168,12 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.bai.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } } - + test("multiple bam csi index") { config "./nextflow.config" @@ -203,7 +203,7 @@ nextflow_process { { assert snapshot( process.out.bam, process.out.csi.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -235,7 +235,7 @@ nextflow_process { { assert snapshot( process.out.cram.collect { it.collect { it instanceof Map ? it : file(it).name } }, process.out.crai.collect { it.collect { it instanceof Map ? it : file(it).name } }, - process.out.versions + process.out.findAll { key, val -> key.startsWith("versions") } ).match()} ) } @@ -265,7 +265,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } @@ -296,7 +296,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } @@ -325,7 +325,7 @@ nextflow_process { then { assertAll ( { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(process.out.findAll { key, val -> key.startsWith("versions") }).match() } ) } } diff --git a/modules/nf-core/samtools/sort/tests/main.nf.test.snap b/modules/nf-core/samtools/sort/tests/main.nf.test.snap index 473e174..4e618fa 100644 --- a/modules/nf-core/samtools/sort/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/sort/tests/main.nf.test.snap @@ -19,80 +19,21 @@ "test.sorted.cram.crai" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-10T14:43:31.395604" - }, - "bam - stub": { - "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:37.387063" + "timestamp": "2025-10-29T12:47:01.171084" }, "bam_csi_index": { "content": [ @@ -114,15 +55,39 @@ "test.sorted.bam.csi:md5,01394e702c729cb478df914ffaf9f7f8" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:06.976036" + "timestamp": "2025-10-29T12:46:00.961675" + }, + "bam - stub": { + "content": [ + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.0" + }, + "timestamp": "2025-10-29T12:47:12.154354" }, "multiple bam bai index": { "content": [ @@ -144,80 +109,39 @@ "test.sorted.bam.bai" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:18.72271" + "timestamp": "2025-10-29T12:46:25.488622" }, "cram - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ - - ], - "crai": [ - - ], - "cram": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.cram:md5,d41d8cd98f00b204e9800998ecf8427e" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:48.734367" + "timestamp": "2025-10-29T12:47:28.485045" }, "multiple bam": { "content": [ @@ -233,80 +157,39 @@ [ ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:12.989244" + "timestamp": "2025-10-29T12:46:13.168476" }, "multiple bam - stub": { "content": [ { - "0": [ + "versions_samtools": [ [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,cd4eb0077f25e9cff395366b8883dd1f" + "SAMTOOLS_SORT", + "samtools", + "1.22.1" ] - ], - "1": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ], - "bai": [ - - ], - "bam": [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,cd4eb0077f25e9cff395366b8883dd1f" - ] - ], - "crai": [ - - ], - "cram": [ - - ], - "csi": [ - - ], - "sam": [ - - ], - "versions": [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:43.196638" + "timestamp": "2025-10-29T12:47:21.628088" }, "bam_no_index": { "content": [ @@ -322,15 +205,21 @@ [ ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:42:54.926504" + "timestamp": "2025-10-29T12:45:47.139418" }, "multiple bam csi index": { "content": [ @@ -352,45 +241,21 @@ "test.sorted.bam.csi" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] - ], - "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" - }, - "timestamp": "2025-09-10T14:43:25.059178" - }, - "bam": { - "content": [ - [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam:md5,34aa85e86abefe637f7a4a9887f016fc" - ] - ], - [ - [ - { - "id": "test", - "single_end": false - }, - "test.sorted.bam.csi" + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] ] - ], - [ - "versions.yml:md5,2659b187d681241451539d4c53500b9f" - ] + } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.09.0" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-10-08T11:59:46.372244" + "timestamp": "2025-10-29T12:46:51.5531" }, "bam_bai_index": { "content": [ @@ -412,14 +277,20 @@ "test.sorted.bam.bai:md5,50dd467c169545a4d5d1f709f7e986e0" ] ], - [ - "versions.yml:md5,18e8b3709b62aa2ba61966672eee91b2" - ] + { + "versions_samtools": [ + [ + "SAMTOOLS_SORT", + "samtools", + "1.22.1" + ] + ] + } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T14:43:00.82974" + "timestamp": "2025-10-29T12:45:52.796936" } } \ No newline at end of file diff --git a/modules/nf-core/samtools/stats/main.nf b/modules/nf-core/samtools/stats/main.nf index c06ad3b..57d2468 100644 --- a/modules/nf-core/samtools/stats/main.nf +++ b/modules/nf-core/samtools/stats/main.nf @@ -13,36 +13,28 @@ process SAMTOOLS_STATS { output: tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('samtools'), eval('samtools version | sed "1!d;s/.* //"'), emit: versions_samtools, topic: versions when: task.ext.when == null || task.ext.when script: - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" """ samtools \\ stats \\ + ${args} \\ --threads ${task.cpus} \\ ${reference} \\ ${input} \\ > ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ stub: def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.stats - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS """ } diff --git a/modules/nf-core/samtools/stats/meta.yml b/modules/nf-core/samtools/stats/meta.yml index 6dc5188..5c59cce 100644 --- a/modules/nf-core/samtools/stats/meta.yml +++ b/modules/nf-core/samtools/stats/meta.yml @@ -55,13 +55,29 @@ output: description: File containing samtools stats output pattern: "*.{stats}" ontologies: [] + versions_samtools: + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: Name of the process + - samtools: + type: string + description: Name of the tool + - samtools version | sed "1!d;s/.* //": + type: eval + description: The expression to obtain the version of the tool + authors: - "@drpatelh" - "@FriederikeHanssen" diff --git a/modules/nf-core/samtools/stats/tests/main.nf.test.snap b/modules/nf-core/samtools/stats/tests/main.nf.test.snap index a451c04..94d981b 100644 --- a/modules/nf-core/samtools/stats/tests/main.nf.test.snap +++ b/modules/nf-core/samtools/stats/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -23,16 +27,20 @@ "test.stats:md5,f4aec6c41b73d34ac2fc6b3253aa39ba" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:52.878044" + "timestamp": "2025-11-01T02:27:18.460724" }, "bam - stub": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -58,16 +70,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:56.722672" + "timestamp": "2025-11-01T02:27:30.245839" }, "cram - stub": { "content": [ @@ -82,7 +98,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -93,16 +113,20 @@ "test.stats:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:06:13.766719" + "timestamp": "2025-11-01T02:27:39.041649" }, "bam": { "content": [ @@ -117,7 +141,11 @@ ] ], "1": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ], "stats": [ [ @@ -128,15 +156,19 @@ "test.stats:md5,41ba8ad30ddb598dadb177a54c222ab9" ] ], - "versions": [ - "versions.yml:md5,7668882f411d0f6356f14a1b8b56fa3c" + "versions_samtools": [ + [ + "SAMTOOLS_STATS", + "samtools", + "1.22.1" + ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T15:05:30.301153" + "timestamp": "2025-11-01T02:26:55.988241" } } \ No newline at end of file diff --git a/modules/nf-core/seqtk/comp/main.nf b/modules/nf-core/seqtk/comp/main.nf index 8ae9e02..627279f 100644 --- a/modules/nf-core/seqtk/comp/main.nf +++ b/modules/nf-core/seqtk/comp/main.nf @@ -13,7 +13,7 @@ process SEQTK_COMP { output: tuple val(meta), path("*.seqtk_stats.tsv"), emit: seqtk_stats - path "versions.yml" , emit: versions + tuple val("${task.process}"), val('seqtk'), eval("seqtk 2>&1 | sed -n 's/^Version: //p'"), emit: versions_seqtk, topic: versions when: task.ext.when == null || task.ext.when @@ -26,11 +26,6 @@ process SEQTK_COMP { seqtk comp \\ ${args} \\ ${fastx} > ${prefix}.seqtk_stats.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - seqtk: \$(seqtk |& sed '/Version/!d; s/.* //') - END_VERSIONS """ stub: @@ -39,10 +34,5 @@ process SEQTK_COMP { """ echo "" > ${prefix}.seqtk_stats.tsv - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - seqtk: \$(seqtk |& sed '/Version/!d; s/.* //') - END_VERSIONS """ } diff --git a/modules/nf-core/seqtk/comp/meta.yml b/modules/nf-core/seqtk/comp/meta.yml index 48565b9..bcdd15d 100644 --- a/modules/nf-core/seqtk/comp/meta.yml +++ b/modules/nf-core/seqtk/comp/meta.yml @@ -8,7 +8,7 @@ keywords: tools: - "seqtk_comp": description: | - Seqtk is a fast and lightweight tool for processing sequences in the FASTA or FASTQ format. + Seqtk is a fast and lightweight tool for processing sequences in the FASTA or FASTQ format. The seqtk comp command computes base composition, sequence length, and GC content for quality control. homepage: https://github.com/lh3/seqtk @@ -39,20 +39,34 @@ output: e.g. [ id:'sample1', single_end:false ] - "*.seqtk_stats.tsv": type: file - description: The output TSV file summarizing sequence statistics with columns - for sequence name, length, counts of A, C, G, T, and N bases, and GC content - percentage." + description: The output TSV file summarizing sequence statistics with + columns for sequence name, length, counts of A, C, G, T, and N bases, + and GC content percentage." pattern: "*.seqtk_stats.tsv" ontologies: - edam: http://edamontology.org/format_3475 # TSV + versions_seqtk: + - - ${task.process}: + type: string + description: The name of the process + - seqtk: + type: string + description: The name of the tool + - "seqtk 2>&1 | sed -n 's/^Version: //p'": + type: eval + description: The expression to obtain the version of the tool +topics: versions: - - versions.yml: - type: file - description: File containing software versions - pattern: "versions.yml" - ontologies: - - edam: http://edamontology.org/format_3750 # YAML + - - ${task.process}: + type: string + description: The name of the process + - seqtk: + type: string + description: The name of the tool + - "seqtk 2>&1 | sed -n 's/^Version: //p'": + type: eval + description: The expression to obtain the version of the tool authors: - "@sainsachiko" maintainers: diff --git a/modules/nf-core/seqtk/comp/tests/main.nf.test b/modules/nf-core/seqtk/comp/tests/main.nf.test index 19581de..8149813 100644 --- a/modules/nf-core/seqtk/comp/tests/main.nf.test +++ b/modules/nf-core/seqtk/comp/tests/main.nf.test @@ -13,7 +13,7 @@ nextflow_process { when { process { - """ + """ input[0] = [ [ id:'test', single_end:true ], file( params.modules_testdata_base_path + 'genomics/prokaryotes/bacteroides_fragilis/genome/genome.fna.gz', checkIfExists: true), @@ -40,7 +40,7 @@ nextflow_process { when { process { - """ + """ input[0] = [ [ id:'test', single_end:true ], file( params.modules_testdata_base_path + 'genomics/prokaryotes/bacteroides_fragilis/genome/genome.fna.gz', checkIfExists: true), @@ -57,4 +57,3 @@ nextflow_process { } } } - diff --git a/modules/nf-core/seqtk/comp/tests/main.nf.test.snap b/modules/nf-core/seqtk/comp/tests/main.nf.test.snap index c93834a..a78f282 100644 --- a/modules/nf-core/seqtk/comp/tests/main.nf.test.snap +++ b/modules/nf-core/seqtk/comp/tests/main.nf.test.snap @@ -12,7 +12,11 @@ ] ], "1": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ], "seqtk_stats": [ [ @@ -23,16 +27,20 @@ "test.seqtk_stats.tsv:md5,46c8788954c64c718a799c0f6a41ecdc" ] ], - "versions": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + "versions_seqtk": [ + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nextflow": "25.10.2" }, - "timestamp": "2025-03-26T19:53:51.1946864" + "timestamp": "2026-01-14T12:07:29.217316713" }, "bacteroides_fragilis - fasta - stub": { "content": [ @@ -47,7 +55,11 @@ ] ], "1": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ], "seqtk_stats": [ [ @@ -58,15 +70,19 @@ "test.seqtk_stats.tsv:md5,68b329da9893e34099c7d8ad5cb9c940" ] ], - "versions": [ - "versions.yml:md5,f374db7a2510fc66d62d68e309971657" + "versions_seqtk": [ + [ + "SEQTK_COMP", + "seqtk", + "1.4-r122" + ] ] } ], "meta": { "nf-test": "0.9.2", - "nextflow": "24.10.2" + "nextflow": "25.10.2" }, - "timestamp": "2025-03-26T19:53:56.444250615" + "timestamp": "2026-01-14T12:07:37.125237854" } } \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 4dc9aa8..516ba5a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -323,46 +323,19 @@ manifest { description = """A mapping-based pipeline for bacterial whole genome sequences""" mainScript = 'main.nf' defaultBranch = 'master' - nextflowVersion = '!>=24.10.5' + nextflowVersion = '!>=25.10.0' version = '2.0.0' doi = '' } // Nextflow plugins plugins { - id 'nf-schema@2.3.0' // Validation of pipeline parameters and creation of an input channel from a sample sheet + id 'nf-schema@2.5.1' // Validation of pipeline parameters and creation of an input channel from a sample sheet } validation { defaultIgnoreParams = ["genomes"] monochromeLogs = params.monochrome_logs - help { - enabled = true - command = "nextflow run nf-core/bactmap -profile --input samplesheet.csv --outdir " - fullParameter = "help_full" - showHiddenParameter = "show_hidden" - beforeText = """ --\033[2m----------------------------------------------------\033[0m- - \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m -\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m -\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m -\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m - \033[0;32m`._,._,\'\033[0m -\033[0;35m nf-core/bactmap ${manifest.version}\033[0m --\033[2m----------------------------------------------------\033[0m- -""" - afterText = """${manifest.doi ? "\n* The pipeline\n" : ""}${manifest.doi.tokenize(",").collect { " https://doi.org/${it.trim().replace('https://doi.org/','')}"}.join("\n")}${manifest.doi ? "\n" : ""} -* The nf-core framework - https://doi.org/10.1038/s41587-020-0439-x - -* Software dependencies - https://github.com/nf-core/bactmap/blob/master/CITATIONS.md -""" - } - summary { - beforeText = validation.help.beforeText - afterText = validation.help.afterText - } } // Load modules.config for DSL2 module specific options diff --git a/nextflow_schema.json b/nextflow_schema.json index ba53cd4..2dbc68c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -226,16 +226,16 @@ "hidden": true }, "help": { - "type": "string", - "hidden": true + "type": ["boolean", "string"], + "description": "Display the help message." }, "help_full": { - "type": "string", - "hidden": true + "type": "boolean", + "description": "Display the full detailed help message." }, "show_hidden": { - "type": "string", - "hidden": true + "type": "boolean", + "description": "Display hidden parameters in the help message (only works when --help or --help_full are provided)." } } }, diff --git a/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf b/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf index f12a140..e192cc6 100644 --- a/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf +++ b/subworkflows/local/bam_variant_calling_sort_freebayes_bcftools/main.nf @@ -13,7 +13,7 @@ workflow BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // Variant calling FREEBAYES ( ch_input, ch_fasta_fai.map{ meta, fasta, fai -> [ meta, fasta ] }, ch_fasta_fai.map{ meta, fasta, fai -> [ meta, fai ] }, ch_samples, ch_populations, ch_cnv ) @@ -21,11 +21,9 @@ workflow BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS { // Sort VCF files BCFTOOLS_SORT ( FREEBAYES.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions.first()) // Index VCF files BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) emit: vcf = BCFTOOLS_SORT.out.vcf // channel: [ val(meta), path(vcf) ] diff --git a/subworkflows/local/consensus_bcftools/main.nf b/subworkflows/local/consensus_bcftools/main.nf index dcac510..e89e7e7 100644 --- a/subworkflows/local/consensus_bcftools/main.nf +++ b/subworkflows/local/consensus_bcftools/main.nf @@ -18,7 +18,7 @@ workflow CONSENSUS_BCFTOOLS { ch_fasta // channel: /path/to/genome.fasta main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Filter variants by allele frequency, zip and index @@ -34,7 +34,6 @@ workflow CONSENSUS_BCFTOOLS { [], [] ) - // ch_versions = ch_versions.mix(BCFTOOLS_QUERY.out.versions.first()) ch_genomecov = ch_bam .multiMap { @@ -55,7 +54,6 @@ workflow CONSENSUS_BCFTOOLS { BEDTOOLS_SUBTRACT ( ch_bedtools_subtract ) - ch_versions = ch_versions.mix(BEDTOOLS_SUBTRACT.out.versions.first()) ch_consensus = ch_vcf .join( ch_tbi) diff --git a/subworkflows/local/fastq_align_bwamem2/main.nf b/subworkflows/local/fastq_align_bwamem2/main.nf index e581143..70c4576 100644 --- a/subworkflows/local/fastq_align_bwamem2/main.nf +++ b/subworkflows/local/fastq_align_bwamem2/main.nf @@ -11,7 +11,7 @@ workflow FASTQ_ALIGN_BWAMEM2 { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Map reads with BWA 2 mem diff --git a/subworkflows/local/longread_adapterremoval/main.nf b/subworkflows/local/longread_adapterremoval/main.nf index 66e532b..b9b0dea 100644 --- a/subworkflows/local/longread_adapterremoval/main.nf +++ b/subworkflows/local/longread_adapterremoval/main.nf @@ -2,35 +2,35 @@ // Process long raw reads with porechop or porechop_abi // -include { PORECHOP_PORECHOP } from '../../../modules/nf-core/porechop/porechop/main' -include { PORECHOP_ABI } from '../../../modules/nf-core/porechop/abi/main' +include { PORECHOP_PORECHOP } from '../../../modules/nf-core/porechop/porechop/main' +include { PORECHOP_ABI } from '../../../modules/nf-core/porechop/abi/main' workflow LONGREAD_ADAPTERREMOVAL { take: reads main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( params.longread_adapterremoval_tool == 'porechop_abi' ) { - PORECHOP_ABI ( reads ) - ch_processed_reads = PORECHOP_ABI.out.reads - .map { meta, reads -> [meta + [ single_end: true ], reads ] } - ch_versions = ch_versions.mix( PORECHOP_ABI.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( PORECHOP_ABI.out.log ) - } else if ( params.longread_adapterremoval_tool == 'porechop' ) { - PORECHOP_PORECHOP ( reads ) - ch_processed_reads = PORECHOP_PORECHOP.out.reads - .map { meta, reads -> [ meta + [ single_end: true ], reads ] } - ch_versions = ch_versions.mix( PORECHOP_PORECHOP.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( PORECHOP_PORECHOP.out.log ) - } else { + if (params.longread_adapterremoval_tool == 'porechop_abi') { + PORECHOP_ABI(reads) + ch_processed_reads = PORECHOP_ABI.out.reads.map { meta, chopped_reads -> [meta + [single_end: true], chopped_reads] } + ch_versions = ch_versions.mix(PORECHOP_ABI.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(PORECHOP_ABI.out.log) + } + else if (params.longread_adapterremoval_tool == 'porechop') { + PORECHOP_PORECHOP(reads) + ch_processed_reads = PORECHOP_PORECHOP.out.reads.map { meta, chopped_reads -> [meta + [single_end: true], chopped_reads] } + ch_versions = ch_versions.mix(PORECHOP_PORECHOP.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(PORECHOP_PORECHOP.out.log) + } + else { ch_processed_reads = reads } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_filtering/main.nf b/subworkflows/local/longread_filtering/main.nf index e48ca0b..510bf82 100644 --- a/subworkflows/local/longread_filtering/main.nf +++ b/subworkflows/local/longread_filtering/main.nf @@ -2,32 +2,34 @@ // Perform filtering // -include { FILTLONG } from '../../../modules/nf-core/filtlong/main' -include { NANOQ } from '../../../modules/nf-core/nanoq/main' +include { FILTLONG } from '../../../modules/nf-core/filtlong/main' +include { NANOQ } from '../../../modules/nf-core/nanoq/main' workflow LONGREAD_FILTERING { take: reads // [ [ meta ], [ reads ] ] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // fastp complexity filtering is activated via modules.conf in shortread_preprocessing - if ( params.longread_filter_tool == 'filtlong' ) { - ch_filtered_reads = FILTLONG ( reads.map { meta, reads -> [ meta, [], reads ] } ).reads - ch_versions = ch_versions.mix( FILTLONG.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( FILTLONG.out.log ) - } else if ( params.longread_filter_tool == 'nanoq' ) { - ch_filtered_reads = NANOQ ( reads , 'fastq.gz' ).reads - ch_versions = ch_versions.mix( NANOQ.out.versions.first() ) - ch_multiqc_files = ch_multiqc_files.mix( NANOQ.out.stats ) - } else { + if (params.longread_filter_tool == 'filtlong') { + ch_filtered_reads = FILTLONG(reads.map { meta, long_reads -> [meta, [], long_reads] }).reads + ch_versions = ch_versions.mix(FILTLONG.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(FILTLONG.out.log) + } + else if (params.longread_filter_tool == 'nanoq') { + ch_filtered_reads = NANOQ(reads, 'fastq.gz').reads + ch_versions = ch_versions.mix(NANOQ.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(NANOQ.out.stats) + } + else { ch_filtered_reads = reads } emit: - reads = ch_filtered_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_filtered_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_mapping/main.nf b/subworkflows/local/longread_mapping/main.nf index 87ff5f3..96f8ba2 100644 --- a/subworkflows/local/longread_mapping/main.nf +++ b/subworkflows/local/longread_mapping/main.nf @@ -7,7 +7,8 @@ include { BAM_SORT_STATS_SAMTOOLS } from '../../nf-core/bam_sort_stats_samtools/ include { CLAIR3 } from '../../../modules/local/clair3/main' include { BCFTOOLS_SORT } from '../../../modules/nf-core/bcftools/sort/main' include { BCFTOOLS_INDEX } from '../../../modules/nf-core/bcftools/index/main' -include { BCFTOOLS_FILTER } from '../../../modules/nf-core/bcftools/filter/main' +include { BCFTOOLS_VIEW } from '../../../modules/nf-core/bcftools/view/main' +include { BCFTOOLS_NORM } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_STATS } from '../../../modules/nf-core/bcftools/stats/main' include { CONSENSUS_BCFTOOLS } from '../consensus_bcftools/main' include { SEQTK_COMP } from '../../../modules/nf-core/seqtk/comp/main.nf' @@ -20,8 +21,8 @@ workflow LONGREAD_MAPPING { reads // channel: [meta2, fasta/fastq] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() MINIMAP2_ALIGNMENT( ch_fasta, reads ) ch_versions = ch_versions.mix(MINIMAP2_ALIGNMENT.out.versions) @@ -41,33 +42,31 @@ workflow LONGREAD_MAPPING { ch_versions = ch_versions.mix(CLAIR3.out.versions.first()) BCFTOOLS_SORT ( CLAIR3.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_SORT.out.versions.first()) BCFTOOLS_INDEX ( BCFTOOLS_SORT.out.vcf ) - ch_versions = ch_versions.mix(BCFTOOLS_INDEX.out.versions.first()) - ch_bcftool_filter_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) - BCFTOOLS_FILTER ( ch_bcftool_filter_input ) - ch_versions = ch_versions.mix(BCFTOOLS_FILTER.out.versions.first()) + ch_bcftool_view_input = BCFTOOLS_SORT.out.vcf.join(BCFTOOLS_INDEX.out.tbi) + BCFTOOLS_VIEW ( ch_bcftool_view_input, [], [], [] ) - ch_bcftool_stats_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + ch_bcftool_norm_input = BCFTOOLS_VIEW.out.vcf.join(BCFTOOLS_VIEW.out.tbi) + BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) + + ch_bcftool_stats_input = BCFTOOLS_NORM.out.vcf.join(BCFTOOLS_NORM.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) - ch_versions = ch_versions.mix(BCFTOOLS_STATS.out.versions.first()) - CONSENSUS_BCFTOOLS ( BAM_SORT_STATS_SAMTOOLS.out.bam, BCFTOOLS_FILTER.out.vcf, BCFTOOLS_FILTER.out.tbi, ch_fasta ) + CONSENSUS_BCFTOOLS ( BAM_SORT_STATS_SAMTOOLS.out.bam, BCFTOOLS_NORM.out.vcf, BCFTOOLS_NORM.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions ) emit: bam = BAM_SORT_STATS_SAMTOOLS.out.bam // channel: [ val(meta), [ bam ] ] bai = BAM_SORT_STATS_SAMTOOLS.out.bai // channel: [ val(meta), [ bai ] ] - vcf = BCFTOOLS_FILTER.out.vcf // channel: [meta, vcf] - csi = BCFTOOLS_FILTER.out.csi // channel: [ val(meta), path(csi) ] - tbi = BCFTOOLS_FILTER.out.tbi // channel; [meta, tbi] + vcf = BCFTOOLS_NORM.out.vcf // channel: [meta, vcf] + csi = BCFTOOLS_NORM.out.csi // channel: [ val(meta), path(csi) ] + tbi = BCFTOOLS_NORM.out.tbi // channel; [meta, tbi] stats = BCFTOOLS_STATS.out.stats // channel: [meta, stats] consensus = CONSENSUS_BCFTOOLS.out.consensus // channel: [ val(meta), path(consensus) ] seqtk_stats = SEQTK_COMP.out.seqtk_stats // channel: [meta, stats] diff --git a/subworkflows/local/longread_mapping/meta.yml b/subworkflows/local/longread_mapping/meta.yml index 707e25b..9f72ee3 100644 --- a/subworkflows/local/longread_mapping/meta.yml +++ b/subworkflows/local/longread_mapping/meta.yml @@ -13,7 +13,8 @@ components: - clair3 - bcftools/sort - bcftools/index - - bcftools/filter + - bcftools/view + - bcftools/norm - bcftools/stats - consensus_bcftools - seqtk/comp diff --git a/subworkflows/local/longread_preprocessing/main.nf b/subworkflows/local/longread_preprocessing/main.nf index 8e8a8a1..a6e6b44 100644 --- a/subworkflows/local/longread_preprocessing/main.nf +++ b/subworkflows/local/longread_preprocessing/main.nf @@ -2,44 +2,55 @@ // Perform read trimming and filtering // -include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FALCO as FALCO_PROCESSED } from '../../../modules/nf-core/falco/main' -include { LONGREAD_ADAPTERREMOVAL } from '../longread_adapterremoval/main' -include { LONGREAD_FILTERING } from '../longread_filtering/main' +include { LONGREAD_ADAPTERREMOVAL } from '../longread_adapterremoval/main' +include { LONGREAD_FILTERING } from '../longread_filtering/main' workflow LONGREAD_PREPROCESSING { take: reads main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( !params.longread_qc_skipadaptertrim && params.longread_qc_skipqualityfilter) { - ch_processed_reads = LONGREAD_ADAPTERREMOVAL ( reads ).reads - ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_ADAPTERREMOVAL.out.mqc ) - } else if ( params.longread_qc_skipadaptertrim && !params.longread_qc_skipqualityfilter) { - ch_processed_reads = LONGREAD_FILTERING ( reads ).reads - ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_FILTERING.out.mqc ) - } else { - LONGREAD_ADAPTERREMOVAL ( reads ) - ch_clipped_reads = LONGREAD_ADAPTERREMOVAL.out.reads - .map { meta, reads -> [ meta + [single_end: true], reads ] } - ch_processed_reads = LONGREAD_FILTERING ( ch_clipped_reads ).reads - ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) - ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_ADAPTERREMOVAL.out.mqc ) - ch_multiqc_files = ch_multiqc_files.mix( LONGREAD_FILTERING.out.mqc ) + if (!params.longread_qc_skipadaptertrim && params.longread_qc_skipqualityfilter) { + LONGREAD_ADAPTERREMOVAL(reads) + ch_processed_reads = LONGREAD_ADAPTERREMOVAL.out.reads + ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_ADAPTERREMOVAL.out.mqc) + } + else if (params.longread_qc_skipadaptertrim && !params.longread_qc_skipqualityfilter) { + LONGREAD_FILTERING(reads) + ch_processed_reads = LONGREAD_FILTERING.out.reads + ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_FILTERING.out.mqc) + } + else { + LONGREAD_ADAPTERREMOVAL(reads) + ch_clipped_reads = LONGREAD_ADAPTERREMOVAL.out.reads.map { meta, clipped_long_reads -> [meta + [single_end: true], clipped_long_reads] } + LONGREAD_FILTERING(ch_clipped_reads) + ch_processed_reads = LONGREAD_FILTERING.out.reads + ch_versions = ch_versions.mix(LONGREAD_ADAPTERREMOVAL.out.versions.first()) + ch_versions = ch_versions.mix(LONGREAD_FILTERING.out.versions.first()) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_ADAPTERREMOVAL.out.mqc) + ch_multiqc_files = ch_multiqc_files.mix(LONGREAD_FILTERING.out.mqc) } - FASTQC_PROCESSED ( ch_processed_reads ) - ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( FASTQC_PROCESSED.out.zip ) + if (params.preprocessing_qc_tool == 'fastqc') { + FASTQC_PROCESSED(ch_processed_reads) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) + } + else if (params.preprocessing_qc_tool == 'falco') { + FALCO_PROCESSED(ch_processed_reads) + ch_versions = ch_versions.mix(FALCO_PROCESSED.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(FALCO_PROCESSED.out.txt) + } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/longread_preprocessing/meta.yml b/subworkflows/local/longread_preprocessing/meta.yml index 337fee9..613cb1c 100644 --- a/subworkflows/local/longread_preprocessing/meta.yml +++ b/subworkflows/local/longread_preprocessing/meta.yml @@ -7,6 +7,7 @@ keywords: - fastq components: - fastqc + - falco - longread_adapterremoval - longread_filtering input: diff --git a/subworkflows/local/minimap2_alignment/main.nf b/subworkflows/local/minimap2_alignment/main.nf index cfb0782..7b91616 100644 --- a/subworkflows/local/minimap2_alignment/main.nf +++ b/subworkflows/local/minimap2_alignment/main.nf @@ -10,7 +10,7 @@ workflow MINIMAP2_ALIGNMENT { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() MINIMAP2_INDEX ( ch_ref ) ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) diff --git a/subworkflows/local/shortread_adapterremoval/main.nf b/subworkflows/local/shortread_adapterremoval/main.nf index 99376e7..cf19970 100644 --- a/subworkflows/local/shortread_adapterremoval/main.nf +++ b/subworkflows/local/shortread_adapterremoval/main.nf @@ -2,66 +2,62 @@ // Process short raw reads with AdapterRemoval // -include { ADAPTERREMOVAL as ADAPTERREMOVAL_SINGLE } from '../../../modules/nf-core/adapterremoval/main' -include { ADAPTERREMOVAL as ADAPTERREMOVAL_PAIRED } from '../../../modules/nf-core/adapterremoval/main' -include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' +include { ADAPTERREMOVAL as ADAPTERREMOVAL_SINGLE } from '../../../modules/nf-core/adapterremoval/main' +include { ADAPTERREMOVAL as ADAPTERREMOVAL_PAIRED } from '../../../modules/nf-core/adapterremoval/main' +include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' workflow SHORTREAD_ADAPTERREMOVAL { - take: - reads // [[meta], [reads]] + reads // [[meta], [reads]] adapterlist // file main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - ch_input_for_adapterremoval = reads - .branch{ - single: it[0].single_end - paired: !it[0].single_end - } + ch_input_for_adapterremoval = reads.branch { + single: it[0].single_end + paired: !it[0].single_end + } - ADAPTERREMOVAL_SINGLE ( ch_input_for_adapterremoval.single, adapterlist ) - ADAPTERREMOVAL_PAIRED ( ch_input_for_adapterremoval.paired, adapterlist ) + ADAPTERREMOVAL_SINGLE(ch_input_for_adapterremoval.single, adapterlist) + ADAPTERREMOVAL_PAIRED(ch_input_for_adapterremoval.paired, adapterlist) /* * Due to the ~slightly~ very ugly output implementation of the current AdapterRemoval2 version, each file * has to be exported in a separate channel and we must manually recombine when necessary. */ - if ( params.shortread_qc_mergepairs && params.shortread_qc_includeunmerged ) { + if (params.shortread_qc_mergepairs && params.shortread_qc_includeunmerged) { - ch_concat_fastq = Channel.empty() + ch_concat_fastq = channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, ADAPTERREMOVAL_PAIRED.out.singles_truncated, - ADAPTERREMOVAL_PAIRED.out.paired_truncated + ADAPTERREMOVAL_PAIRED.out.paired_truncated, ) - .map { meta, reads -> - [meta + [single_end: true], reads] + .map { meta, adapterremoved_reads -> + [meta + [single_end: true], adapterremoved_reads] } .groupTuple() - // Paired-end reads cause a nested tuple during grouping. - // We want to present a flat list of files to `CAT_FASTQ`. .map { meta, fastq -> [meta, fastq.flatten()] } - + // Paired-end reads cause a nested tuple during grouping. + // We want to present a flat list of files to `CAT_FASTQ`, thus the flatten CAT_FASTQ(ch_concat_fastq) - ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) - - } else if ( params.shortread_qc_mergepairs && !params.shortread_qc_includeunmerged ) { + ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + } + else if (params.shortread_qc_mergepairs && !params.shortread_qc_includeunmerged) { - ch_concat_fastq = Channel.empty() + ch_concat_fastq = channel.empty() .mix( ADAPTERREMOVAL_PAIRED.out.collapsed, - ADAPTERREMOVAL_PAIRED.out.collapsed_truncated + ADAPTERREMOVAL_PAIRED.out.collapsed_truncated, ) - .map { meta, reads -> - [meta + [single_end: true], reads] + .map { meta, input_reads -> + [meta + [single_end: true], input_reads] } .groupTuple() .map { meta, fastq -> [meta, fastq.flatten()] } @@ -69,27 +65,23 @@ workflow SHORTREAD_ADAPTERREMOVAL { CAT_FASTQ(ch_concat_fastq) - ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) - - } else { - - ch_adapterremoval_reads_prepped = ADAPTERREMOVAL_PAIRED.out.paired_truncated - .mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + ch_adapterremoval_reads_prepped = CAT_FASTQ.out.reads.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) + } + else { + ch_adapterremoval_reads_prepped = ADAPTERREMOVAL_PAIRED.out.paired_truncated.mix(ADAPTERREMOVAL_SINGLE.out.singles_truncated) } - ch_versions = ch_versions.mix( ADAPTERREMOVAL_SINGLE.out.versions.first() ) - ch_versions = ch_versions.mix( ADAPTERREMOVAL_PAIRED.out.versions.first() ) - ch_versions = ch_versions.mix( CAT_FASTQ.out.versions.first() ) + ch_versions = ch_versions.mix(ADAPTERREMOVAL_SINGLE.out.versions.first()) + ch_versions = ch_versions.mix(ADAPTERREMOVAL_PAIRED.out.versions.first()) ch_multiqc_files = ch_multiqc_files.mix( ADAPTERREMOVAL_PAIRED.out.settings, - ADAPTERREMOVAL_SINGLE.out.settings + ADAPTERREMOVAL_SINGLE.out.settings, ) emit: - reads = ch_adapterremoval_reads_prepped // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_adapterremoval_reads_prepped // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_fastp/main.nf b/subworkflows/local/shortread_fastp/main.nf index bde47a4..108b9a7 100644 --- a/subworkflows/local/shortread_fastp/main.nf +++ b/subworkflows/local/shortread_fastp/main.nf @@ -2,41 +2,41 @@ // Process short raw reads with FastP // -include { FASTP as FASTP_SINGLE } from '../../../modules/nf-core/fastp/main' -include { FASTP as FASTP_PAIRED } from '../../../modules/nf-core/fastp/main' +include { FASTP as FASTP_SINGLE } from '../../../modules/nf-core/fastp/main' +include { FASTP as FASTP_PAIRED } from '../../../modules/nf-core/fastp/main' workflow SHORTREAD_FASTP { take: - reads // [[meta], [reads]] + reads // [[meta], [reads]] adapterlist main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - ch_input_for_fastp = reads - .branch{ - single: it[0]['single_end'] == true - paired: it[0]['single_end'] == false - } + ch_input_for_fastp = reads.branch { + single: it[0]['single_end'] == true + paired: it[0]['single_end'] == false + } - FASTP_SINGLE ( ch_input_for_fastp.single, adapterlist, false, false, false ) - // Last parameter here turns on merging of PE data - FASTP_PAIRED ( ch_input_for_fastp.paired, adapterlist, false, false, params.shortread_qc_mergepairs ) + ch_fastp_input_single = ch_input_for_fastp.single + .map { meta, reads -> [meta, reads, [] ] } + ch_fastp_input_paired = ch_input_for_fastp.paired + .map { meta, reads -> [meta, reads, [] ] } - if ( params.shortread_qc_mergepairs ) { - ch_fastp_reads_prepped_pe = FASTP_PAIRED.out.reads_merged - .map { - meta, reads -> - def meta_new = meta + [single_end: true] - [ meta + [single_end:true], [ reads ].flatten() ] - } + FASTP_SINGLE(ch_fastp_input_single, false, false, false) + // Last parameter here turns on merging of PE data + FASTP_PAIRED(ch_fastp_input_paired, false, false, params.shortread_qc_mergepairs) - ch_fastp_reads_prepped = ch_fastp_reads_prepped_pe.mix( FASTP_SINGLE.out.reads ) + if (params.shortread_qc_mergepairs) { + ch_fastp_reads_prepped_pe = FASTP_PAIRED.out.reads_merged.map { meta, merged_reads -> + [meta + [single_end: true], [merged_reads].flatten()] + } - } else { - ch_fastp_reads_prepped = FASTP_PAIRED.out.reads - .mix( FASTP_SINGLE.out.reads ) + ch_fastp_reads_prepped = ch_fastp_reads_prepped_pe.mix(FASTP_SINGLE.out.reads) + } + else { + ch_fastp_reads_prepped = FASTP_PAIRED.out.reads.mix(FASTP_SINGLE.out.reads) } ch_versions = ch_versions.mix(FASTP_SINGLE.out.versions.first()) @@ -44,11 +44,11 @@ workflow SHORTREAD_FASTP { ch_processed_reads = ch_fastp_reads_prepped - ch_multiqc_files = ch_multiqc_files.mix( FASTP_SINGLE.out.json ) - ch_multiqc_files = ch_multiqc_files.mix( FASTP_PAIRED.out.json ) + ch_multiqc_files = ch_multiqc_files.mix(FASTP_SINGLE.out.json) + ch_multiqc_files = ch_multiqc_files.mix(FASTP_PAIRED.out.json) emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_mapping/main.nf b/subworkflows/local/shortread_mapping/main.nf index 146fc47..7d8dc0c 100644 --- a/subworkflows/local/shortread_mapping/main.nf +++ b/subworkflows/local/shortread_mapping/main.nf @@ -6,6 +6,7 @@ include { FASTQ_ALIGN_BWAMEM2 } from '../fastq_align_bwa include { FASTQ_ALIGN_BOWTIE2 } from '../../nf-core/fastq_align_bowtie2/main' include { BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS } from '../../local/bam_variant_calling_sort_freebayes_bcftools/main' include { BCFTOOLS_FILTER } from '../../../modules/nf-core/bcftools/filter/main' +include { BCFTOOLS_NORM } from '../../../modules/nf-core/bcftools/norm/main' include { BCFTOOLS_STATS } from '../../../modules/nf-core/bcftools/stats/main' include { CONSENSUS_BCFTOOLS } from '../consensus_bcftools/main' include { SEQTK_COMP } from '../../../modules/nf-core/seqtk/comp/main.nf' @@ -19,8 +20,8 @@ workflow SHORTREAD_MAPPING { ch_faidx // channel: [meta, ref fai] main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() if (params.shortread_mapping_tool == 'bowtie2') { FASTQ_ALIGN_BOWTIE2 ( @@ -69,26 +70,26 @@ workflow SHORTREAD_MAPPING { .join(BAM_VARIANT_CALLING_SORT_FREEBAYES_BCFTOOLS.out.tbi) BCFTOOLS_FILTER ( ch_bcftool_filter_input ) - ch_versions = ch_versions.mix(BCFTOOLS_FILTER.out.versions.first()) - ch_bcftool_stats_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + ch_bcftool_norm_input = BCFTOOLS_FILTER.out.vcf.join(BCFTOOLS_FILTER.out.tbi) + BCFTOOLS_NORM ( ch_bcftool_norm_input, ch_fasta ) + + ch_bcftool_stats_input = BCFTOOLS_NORM.out.vcf.join(BCFTOOLS_NORM.out.tbi) BCFTOOLS_STATS ( ch_bcftool_stats_input, [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ], [ [:], [] ] ) ch_multiqc_files = ch_multiqc_files.mix( BCFTOOLS_STATS.out.stats ) - ch_versions = ch_versions.mix(BCFTOOLS_STATS.out.versions.first()) - CONSENSUS_BCFTOOLS ( ch_bam, BCFTOOLS_FILTER.out.vcf, BCFTOOLS_FILTER.out.tbi, ch_fasta ) + CONSENSUS_BCFTOOLS ( ch_bam, BCFTOOLS_NORM.out.vcf, BCFTOOLS_NORM.out.tbi, ch_fasta ) ch_versions = ch_versions.mix( CONSENSUS_BCFTOOLS.out.versions ) SEQTK_COMP( CONSENSUS_BCFTOOLS.out.consensus ) - ch_versions = ch_versions.mix( SEQTK_COMP.out.versions ) emit: bam = ch_bam // channel: [ val(meta), [ bam ] ] bai = ch_index // channel: [ val(meta), [ bai ] ] - vcf = BCFTOOLS_FILTER.out.vcf // channel: [ val(meta), path(vcf) ] - csi = BCFTOOLS_FILTER.out.csi // channel: [ val(meta), path(csi) ] - tbi = BCFTOOLS_FILTER.out.tbi // channel: [ val(meta), path(tbi) ] + vcf = BCFTOOLS_NORM.out.vcf // channel: [meta, vcf] + csi = BCFTOOLS_NORM.out.csi // channel: [ val(meta), path(csi) ] + tbi = BCFTOOLS_NORM.out.tbi // channel; [meta, tbi] stats = BCFTOOLS_STATS.out.stats // channel: [meta, stats] consensus = CONSENSUS_BCFTOOLS.out.consensus // channel: [ val(meta), path(consensus) ] seqtk_stats = SEQTK_COMP.out.seqtk_stats // channel: [meta, stats] diff --git a/subworkflows/local/shortread_preprocessing/main.nf b/subworkflows/local/shortread_preprocessing/main.nf index 3cb355a..919bf28 100644 --- a/subworkflows/local/shortread_preprocessing/main.nf +++ b/subworkflows/local/shortread_preprocessing/main.nf @@ -1,6 +1,12 @@ -include { SHORTREAD_FASTP } from '../shortread_fastp/main' -include { SHORTREAD_ADAPTERREMOVAL } from '../shortread_adapterremoval/main' -include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +// +// Perform read trimming and merging +// + + +include { SHORTREAD_FASTP } from '../shortread_fastp/main' +include { SHORTREAD_ADAPTERREMOVAL } from '../shortread_adapterremoval/main' +include { FASTQC as FASTQC_PROCESSED } from '../../../modules/nf-core/fastqc/main' +include { FALCO as FALCO_PROCESSED } from '../../../modules/nf-core/falco/main' workflow SHORTREAD_PREPROCESSING { take: @@ -8,27 +14,37 @@ workflow SHORTREAD_PREPROCESSING { adapterlist // file main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() - if ( params.shortread_qc_tool == "fastp" ) { - ch_processed_reads = SHORTREAD_FASTP ( reads, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_FASTP.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( SHORTREAD_FASTP.out.mqc ) - } else if ( params.shortread_qc_tool == "adapterremoval" ) { - ch_processed_reads = SHORTREAD_ADAPTERREMOVAL ( reads, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_ADAPTERREMOVAL.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( SHORTREAD_ADAPTERREMOVAL.out.mqc ) - } else { + if (params.shortread_qc_tool == "fastp") { + SHORTREAD_FASTP(reads, adapterlist) + ch_processed_reads = SHORTREAD_FASTP.out.reads + ch_versions = ch_versions.mix(SHORTREAD_FASTP.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(SHORTREAD_FASTP.out.mqc) + } + else if (params.shortread_qc_tool == "adapterremoval") { + SHORTREAD_ADAPTERREMOVAL(reads, adapterlist) + ch_processed_reads = SHORTREAD_ADAPTERREMOVAL.out.reads + ch_versions = ch_versions.mix(SHORTREAD_ADAPTERREMOVAL.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(SHORTREAD_ADAPTERREMOVAL.out.mqc) + } + else { ch_processed_reads = reads } - FASTQC_PROCESSED ( ch_processed_reads ) - ch_versions = ch_versions.mix( FASTQC_PROCESSED.out.versions ) - ch_multiqc_files = ch_multiqc_files.mix( FASTQC_PROCESSED.out.zip ) + if (params.preprocessing_qc_tool == 'fastqc') { + FASTQC_PROCESSED(ch_processed_reads) + ch_multiqc_files = ch_multiqc_files.mix(FASTQC_PROCESSED.out.zip) + } + else if (params.preprocessing_qc_tool == 'falco') { + FALCO_PROCESSED(ch_processed_reads) + ch_versions = ch_versions.mix(FALCO_PROCESSED.out.versions) + ch_multiqc_files = ch_multiqc_files.mix(FALCO_PROCESSED.out.txt) + } emit: - reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] - versions = ch_versions // channel: [ versions.yml ] + reads = ch_processed_reads // channel: [ val(meta), [ reads ] ] + versions = ch_versions // channel: [ versions.yml ] mqc = ch_multiqc_files } diff --git a/subworkflows/local/shortread_preprocessing/meta.yml b/subworkflows/local/shortread_preprocessing/meta.yml index ff55e7d..5f1d352 100644 --- a/subworkflows/local/shortread_preprocessing/meta.yml +++ b/subworkflows/local/shortread_preprocessing/meta.yml @@ -9,6 +9,7 @@ components: - shortread_fastp - shortread_adapterremoval - fastqc + - falco input: - meta: type: map diff --git a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf index 0fe64ef..160295f 100644 --- a/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_bactmap_pipeline/main.nf @@ -11,6 +11,7 @@ include { UTILS_NFSCHEMA_PLUGIN } from '../../nf-core/utils_nfschema_plugin' include { paramsSummaryMap } from 'plugin/nf-schema' include { samplesheetToList } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' include { completionEmail } from '../../nf-core/utils_nfcore_pipeline' include { completionSummary } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } from '../../nf-core/utils_nfcore_pipeline' @@ -32,10 +33,13 @@ workflow PIPELINE_INITIALISATION { nextflow_cli_args // array: List of positional nextflow CLI args outdir // string: The output directory where the results will be saved input // string: Path to input samplesheet + help // boolean: Display help message and exit + help_full // boolean: Show the full help message + show_hidden // boolean: Show hidden parameters in the help message main: - ch_versions = Channel.empty() + ch_versions = channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -50,10 +54,35 @@ workflow PIPELINE_INITIALISATION { // // Validate parameters and generate parameter summary to stdout // + before_text = """ +-\033[2m----------------------------------------------------\033[0m- + \033[0;32m,--.\033[0;30m/\033[0;32m,-.\033[0m +\033[0;34m ___ __ __ __ ___ \033[0;32m/,-._.--~\'\033[0m +\033[0;34m |\\ | |__ __ / ` / \\ |__) |__ \033[0;33m} {\033[0m +\033[0;34m | \\| | \\__, \\__/ | \\ |___ \033[0;32m\\`-._,-`-,\033[0m + \033[0;32m`._,._,\'\033[0m +\033[0;35m nf-core/bactmap ${workflow.manifest.version}\033[0m +-\033[2m----------------------------------------------------\033[0m- +""" + after_text = """${workflow.manifest.doi ? "\n* The pipeline\n" : ""}${workflow.manifest.doi.tokenize(",").collect { doi -> " https://doi.org/${doi.trim().replace('https://doi.org/','')}"}.join("\n")}${workflow.manifest.doi ? "\n" : ""} +* The nf-core framework + https://doi.org/10.1038/s41587-020-0439-x + +* Software dependencies + https://github.com/nf-core/taxprofiler/blob/master/CITATIONS.md +""" + command = "nextflow run ${workflow.manifest.name} -profile --input samplesheet.csv --outdir " + UTILS_NFSCHEMA_PLUGIN ( workflow, validate_params, - null + null, + help, + help_full, + show_hidden, + before_text, + after_text, + command ) // @@ -72,7 +101,7 @@ workflow PIPELINE_INITIALISATION { // Create channel from input file provided through params.input // - Channel + channel .fromList(samplesheetToList(params.input, "assets/schema_input.json")) .set { ch_samplesheet } diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf index 4607263..e457949 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_sort_stats_samtools/main.nf @@ -13,10 +13,9 @@ workflow BAM_SORT_STATS_SAMTOOLS { main: - ch_versions = Channel.empty() + ch_versions = channel.empty() SAMTOOLS_SORT ( ch_bam, ch_fasta, '' ) - ch_versions = ch_versions.mix(SAMTOOLS_SORT.out.versions.first()) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) ch_versions = ch_versions.mix(SAMTOOLS_INDEX.out.versions.first()) diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap index c3c9a04..239f163 100644 --- a/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_sort_stats_samtools/tests/main.nf.test.snap @@ -25,22 +25,20 @@ "id": "test", "single_end": false }, - "test.stats:md5,2fe0f3a7a1f07906061c1dadb62e0d05" + "test.stats:md5,1101fe711c4a389fdb5c4a1532107d1f" ] ], [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:26:24.36986488" + "timestamp": "2025-11-01T03:04:39.140333" }, "test_bam_sort_stats_samtools_paired_end": { "content": [ @@ -68,22 +66,20 @@ "id": "test", "single_end": false }, - "test.stats:md5,ba007b13981dad548358c7c957d41e12" + "test.stats:md5,f26c554c244ee86c89d62ebed509fd95" ] ], [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:26:38.683996037" + "timestamp": "2025-11-01T03:04:48.787289" }, "test_bam_sort_stats_samtools_single_end - stub": { "content": [ @@ -124,7 +120,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "5": [ @@ -137,11 +133,9 @@ ] ], "6": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ], "bai": [ [ @@ -170,7 +164,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -192,19 +186,17 @@ ] ], "versions": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:07:18.896460047" + "timestamp": "2025-11-01T03:05:00.693649" }, "test_bam_sort_stats_samtools_paired_end - stub": { "content": [ @@ -245,7 +237,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "5": [ @@ -258,11 +250,9 @@ ] ], "6": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ], "bai": [ [ @@ -291,7 +281,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -313,18 +303,16 @@ ] ], "versions": [ - "versions.yml:md5,032c89015461d597fcc5a5331b619d0a", - "versions.yml:md5,416c5e4a374c61167db999b0e400e3cf", - "versions.yml:md5,721391fd94c417808516480c9451c6fd", - "versions.yml:md5,9e12386b91a2977d23292754e3bcb522", - "versions.yml:md5,c294c162aeb09862cc5e55b602647452" + "versions.yml:md5,54f02345c3a7699f9272e6ef9ce916c5", + "versions.yml:md5,6a93080732801bacb21c3acbe13858a5", + "versions.yml:md5,de3b0ae7c3ac4188662d57fd3219e312" ] } ], "meta": { - "nf-test": "0.9.0", - "nextflow": "24.04.4" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2024-09-16T08:07:39.028688324" + "timestamp": "2025-11-01T03:05:10.863912" } } \ No newline at end of file diff --git a/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml b/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml deleted file mode 100644 index 30b69d6..0000000 --- a/subworkflows/nf-core/bam_sort_stats_samtools/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -subworkflows/bam_sort_stats_samtools: - - subworkflows/nf-core/bam_sort_stats_samtools/** diff --git a/subworkflows/nf-core/bam_stats_samtools/main.nf b/subworkflows/nf-core/bam_stats_samtools/main.nf index 44d4c01..a79d957 100644 --- a/subworkflows/nf-core/bam_stats_samtools/main.nf +++ b/subworkflows/nf-core/bam_stats_samtools/main.nf @@ -12,10 +12,9 @@ workflow BAM_STATS_SAMTOOLS { ch_fasta // channel: [ val(meta), path(fasta) ] main: - ch_versions = Channel.empty() + ch_versions = channel.empty() SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) - ch_versions = ch_versions.mix(SAMTOOLS_STATS.out.versions) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) ch_versions = ch_versions.mix(SAMTOOLS_FLAGSTAT.out.versions) diff --git a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap index fa4a194..3c54319 100644 --- a/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap +++ b/subworkflows/nf-core/bam_stats_samtools/tests/main.nf.test.snap @@ -17,7 +17,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -31,8 +31,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -40,7 +39,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -63,16 +62,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:48.492968" + "timestamp": "2025-11-01T02:39:28.707989" }, "test_bam_stats_samtools_single_end - stub": { "content": [ @@ -92,7 +90,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -106,8 +104,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -115,7 +112,7 @@ "id": "test", "single_end": true }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -138,16 +135,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:43.4053" + "timestamp": "2025-11-01T02:39:20.473816" }, "test_bam_stats_samtools_paired_end_cram - stub": { "content": [ @@ -167,7 +163,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "2": [ @@ -181,8 +177,7 @@ ], "3": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ], "flagstat": [ [ @@ -190,7 +185,7 @@ "id": "test", "single_end": false }, - "test.flagstat:md5,d41d8cd98f00b204e9800998ecf8427e" + "test.flagstat:md5,67394650dbae96d1a4fcc70484822159" ] ], "idxstats": [ @@ -213,16 +208,15 @@ ], "versions": [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:53.52248" + "timestamp": "2025-11-01T02:39:37.697552" }, "test_bam_stats_samtools_single_end": { "content": [ @@ -255,15 +249,14 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:27.672053" + "timestamp": "2025-11-01T02:38:50.143087" }, "test_bam_stats_samtools_paired_end": { "content": [ @@ -296,15 +289,14 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:32.985079" + "timestamp": "2025-11-01T02:39:01.02311" }, "test_bam_stats_samtools_paired_end_cram": { "content": [ @@ -337,14 +329,13 @@ ], [ "versions.yml:md5,088c14fc7d21fa2e662860d7cbf9a181", - "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa", - "versions.yml:md5,c7826ee705b3af5245db8d9cf64ed520" + "versions.yml:md5,ade6457ea5ae73a41c505bb22681d0fa" ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.0" }, - "timestamp": "2025-09-10T13:37:38.347584" + "timestamp": "2025-11-01T02:39:12.503355" } } \ No newline at end of file diff --git a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf index bfd2587..2f30e9a 100644 --- a/subworkflows/nf-core/utils_nfcore_pipeline/main.nf +++ b/subworkflows/nf-core/utils_nfcore_pipeline/main.nf @@ -98,7 +98,7 @@ def workflowVersionToYAML() { // Get channel of software versions used in pipeline in YAML format // def softwareVersionsToYAML(ch_versions) { - return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(Channel.of(workflowVersionToYAML())) + return ch_versions.unique().map { version -> processVersionsFromYAML(version) }.unique().mix(channel.of(workflowVersionToYAML())) } // diff --git a/subworkflows/nf-core/utils_nfschema_plugin/main.nf b/subworkflows/nf-core/utils_nfschema_plugin/main.nf index 4994303..1df8b76 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/main.nf +++ b/subworkflows/nf-core/utils_nfschema_plugin/main.nf @@ -4,6 +4,7 @@ include { paramsSummaryLog } from 'plugin/nf-schema' include { validateParameters } from 'plugin/nf-schema' +include { paramsHelp } from 'plugin/nf-schema' workflow UTILS_NFSCHEMA_PLUGIN { @@ -15,32 +16,58 @@ workflow UTILS_NFSCHEMA_PLUGIN { // when this input is empty it will automatically use the configured schema or // "${projectDir}/nextflow_schema.json" as default. This input should not be empty // for meta pipelines + help // boolean: show help message + help_full // boolean: show full help message + show_hidden // boolean: show hidden parameters in help message + before_text // string: text to show before the help message and parameters summary + after_text // string: text to show after the help message and parameters summary + command // string: an example command of the pipeline main: + if(help || help_full) { + help_options = [ + beforeText: before_text, + afterText: after_text, + command: command, + showHidden: show_hidden, + fullHelp: help_full, + ] + if(parameters_schema) { + help_options << [parametersSchema: parameters_schema] + } + log.info paramsHelp( + help_options, + (params.help instanceof String && params.help != "true") ? params.help : "", + ) + exit 0 + } + // // Print parameter summary to stdout. This will display the parameters // that differ from the default given in the JSON schema // + + summary_options = [:] if(parameters_schema) { - log.info paramsSummaryLog(input_workflow, parameters_schema:parameters_schema) - } else { - log.info paramsSummaryLog(input_workflow) + summary_options << [parametersSchema: parameters_schema] } + log.info before_text + log.info paramsSummaryLog(summary_options, input_workflow) + log.info after_text // // Validate the parameters using nextflow_schema.json or the schema // given via the validation.parametersSchema configuration option // if(validate_params) { + validateOptions = [:] if(parameters_schema) { - validateParameters(parameters_schema:parameters_schema) - } else { - validateParameters() + validateOptions << [parametersSchema: parameters_schema] } + validateParameters(validateOptions) } emit: dummy_emit = true } - diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test index 8fb3016..c977917 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/main.nf.test @@ -25,6 +25,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -51,6 +57,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -77,6 +89,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -103,6 +121,12 @@ nextflow_workflow { input[0] = workflow input[1] = validate_params input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = false + input[4] = false + input[5] = false + input[6] = "" + input[7] = "" + input[8] = "" """ } } @@ -114,4 +138,36 @@ nextflow_workflow { ) } } + + test("Should create a help message") { + + when { + + params { + test_data = '' + outdir = null + } + + workflow { + """ + validate_params = true + input[0] = workflow + input[1] = validate_params + input[2] = "${projectDir}/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow_schema.json" + input[3] = true + input[4] = false + input[5] = false + input[6] = "Before" + input[7] = "After" + input[8] = "nextflow run test/test" + """ + } + } + + then { + assertAll( + { assert workflow.success } + ) + } + } } diff --git a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config index 443e828..f6537cc 100644 --- a/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config +++ b/subworkflows/nf-core/utils_nfschema_plugin/tests/nextflow.config @@ -1,5 +1,5 @@ plugins { - id "nf-schema@2.4.2" + id "nf-schema@2.6.1" } validation { diff --git a/tests/default.nf.test.snap b/tests/default.nf.test.snap index 562b7a3..8cfb934 100644 --- a/tests/default.nf.test.snap +++ b/tests/default.nf.test.snap @@ -1,7 +1,7 @@ { "-profile test": { "content": [ - 61, + 63, { "ALIGNPSEUDOGENOMES": { "multi2single_sequence.py": 1.0 @@ -15,6 +15,12 @@ "BCFTOOLS_INDEX": { "bcftools": 1.22 }, + "BCFTOOLS_NORM": { + "bcftools": 1.22 + }, + "BCFTOOLS_QUERY": { + "bcftools": 1.22 + }, "BCFTOOLS_SORT": { "bcftools": 1.22 }, @@ -182,6 +188,11 @@ "fastqscan/raw", "fastqscan/raw/01_test_1.raw.json", "fastqscan/raw/02_test_2.raw.json", + "filtered_variants", + "filtered_variants/01.filtered.norm.vcf.gz", + "filtered_variants/01.filtered.norm.vcf.gz.tbi", + "filtered_variants/02.filtered.norm.vcf.gz", + "filtered_variants/02.filtered.norm.vcf.gz.tbi", "freebayes", "freebayes/01.vcf.gz", "freebayes/02.vcf.gz", @@ -396,18 +407,18 @@ [ "01.fa:md5,17e6433115d1ad1b4ffdf384d783dc29", "02.fa:md5,9048642262df13a6fc427b2d971b7546", - "01.filtered.vcf.gz:md5,9f24409ae4638b0ed0fa8891bec1659b", + "01.filtered.vcf.gz:md5,ced07b77c22cba9a53f2815c0256aa29", "01.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.filtered.vcf.gz:md5,1253ca69cd259bdf2f14a378a4df96e5", + "02.filtered.vcf.gz:md5,7e7c04e92033cfb373c511691dae53c5", "02.filtered.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", "01.txt:md5,d41d8cd98f00b204e9800998ecf8427e", "02.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "01.sorted.vcf.gz:md5,b70e6dd2223d07d8d233d9eb54f16fb1", - "01.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "02.sorted.vcf.gz:md5,208451945ce7c9be754fea959aa083c1", + "01.sorted.vcf.gz:md5,5998257ae03a4beb8931f67d8eed764f", + "01.sorted.vcf.gz.tbi:md5,93413e333781d63d89023745e5ed4ed4", + "02.sorted.vcf.gz:md5,b6eafab8154ecb0a7a9ee893dffcc54f", "02.sorted.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", - "01.bcftools_stats.txt:md5,defae651d5565681d95172331c428d9d", - "02.bcftools_stats.txt:md5,64ce5bc394014836c039d2f98503ee8e", + "01.bcftools_stats.txt:md5,71a4d86f777c160fd969b6382c2f5655", + "02.bcftools_stats.txt:md5,e4d4ebc423228aa03e48babac21ccf44", "01.bed:md5,3610ca49fad02e567afc984e5ae0cce8", "02.bed:md5,37284f438898485550db0a584251e69f", "01.subtracted.bed:md5,3610ca49fad02e567afc984e5ae0cce8", @@ -421,34 +432,38 @@ "genome.fna.rev.1.bt2:md5,a1cc6383eb8d90710502a540f87bfa13", "genome.fna.rev.2.bt2:md5,871b69582268b9404cb1884a401cdc39", "versions.yml:md5,f986bc29ed66b12ac01d6a64a13c3227", - "01_test_1.fastp.html:md5,14e71d9c1f15f781897369739c461176", - "01_test_1.fastp.json:md5,8c5669f673278a2178784d153de87050", - "01_test_1.fastp.log:md5,b55b929ce1d3387d19e9310fc83b4cb9", - "02_test_2.fastp.html:md5,b815b81b18cd8876e8bb1c255da785d2", - "02_test_2.fastp.json:md5,09d0c941bb86ac309d93bc24d27fbd9b", - "02_test_2.fastp.log:md5,f3c8e20f1004e380dbe89b639f462c70", - "01_test_1_processed_1_fastqc.html:md5,9bd362ca57f59414f87dff6874cc0cfc", - "01_test_1_processed_1_fastqc.zip:md5,e0e90e71511d97a735c094a83bd72134", - "01_test_1_processed_2_fastqc.html:md5,7b433a3300a18167c5ba77206f65ce29", - "01_test_1_processed_2_fastqc.zip:md5,560fe56d458e32af3a8533cece92bfe5", - "02_test_2_processed_1_fastqc.html:md5,94979e55cae0f243e7ee9ac8889baa50", - "02_test_2_processed_1_fastqc.zip:md5,774c632f16a113a663a92128615336b5", - "02_test_2_processed_2_fastqc.html:md5,6f0e819a782f2de05489cf666278186d", - "02_test_2_processed_2_fastqc.zip:md5,946cb78c801cd2fa706da3e562861d84", - "01_test_1_raw_1_fastqc.html:md5,b9a29b3ea3beaf5a3e71e5f57a2a6871", - "01_test_1_raw_1_fastqc.zip:md5,2adf6891d78ff09ebeb50300ffa1668a", - "01_test_1_raw_2_fastqc.html:md5,b2f3607d678ea3aa66685d9f6bd14617", - "01_test_1_raw_2_fastqc.zip:md5,3278ca109e0e87c66501f1b511ea6a0c", - "02_test_2_raw_1_fastqc.html:md5,be150d5833bb946e941e100756bb3e98", - "02_test_2_raw_1_fastqc.zip:md5,1b1387115d48acbf1d55749905423955", - "02_test_2_raw_2_fastqc.html:md5,56ea6990e2e0457bf1dcb1b5416c9e2b", - "02_test_2_raw_2_fastqc.zip:md5,c020a963ba6f09ef6fe02c6ae4552929", + "01_test_1.fastp.html:md5,77e3843e6fa6a069f76576a5c8c99b91", + "01_test_1.fastp.json:md5,200f46137ea23811d26f756e9cbc633c", + "01_test_1.fastp.log:md5,da47c5a68d591c795a302a930503db0c", + "02_test_2.fastp.html:md5,78636145d5ed1c0f68945fc69d4dc5bf", + "02_test_2.fastp.json:md5,d79d41c98f5835ead398e63a9185facc", + "02_test_2.fastp.log:md5,5fbbb767c45c35133888febdd030275c", + "01_test_1_processed_1_fastqc.html:md5,b2327ae1715a8169942c99126b2f8dbd", + "01_test_1_processed_1_fastqc.zip:md5,198e2c2a57347258ab6eddfc3e4e1e80", + "01_test_1_processed_2_fastqc.html:md5,a4be338edad02af650571fead2a225e1", + "01_test_1_processed_2_fastqc.zip:md5,9341885ca56f8c00e8e47920565e3f9f", + "02_test_2_processed_1_fastqc.html:md5,ebe6a21831477e4d244208cdf455f2e3", + "02_test_2_processed_1_fastqc.zip:md5,53c004c3f30c9b524ced1a432441e500", + "02_test_2_processed_2_fastqc.html:md5,397100c73a84a419fbd2631d781cb4d3", + "02_test_2_processed_2_fastqc.zip:md5,9505777b26366459e64cecb7faa336ef", + "01_test_1_raw_1_fastqc.html:md5,2c11d2e70ed3ca42106d1ffaa753812c", + "01_test_1_raw_1_fastqc.zip:md5,41bed910f3ce5e74b97f974ceed9b8f1", + "01_test_1_raw_2_fastqc.html:md5,bbed35e4e0267f7b0d889a47be342120", + "01_test_1_raw_2_fastqc.zip:md5,1ea438b21c3b284f199afe7d533630ca", + "02_test_2_raw_1_fastqc.html:md5,e2a92f934b54d68da36a9454b6d53318", + "02_test_2_raw_1_fastqc.zip:md5,504092823ad31ab4a129ce6df77beed1", + "02_test_2_raw_2_fastqc.html:md5,263f1bafbd45d321bb8c34caaebb4ab8", + "02_test_2_raw_2_fastqc.zip:md5,b2a4a24d0a171ff26dfc22964123ab06", "01_test_1.processed.json:md5,125efed1942221fbf536885fbf475e66", "02_test_2.processed.json:md5,78fbdb421671f255b1c0e12cfe0653a4", "01_test_1.raw.json:md5,39066d3164d2dbdc7a198468cacaf838", "02_test_2.raw.json:md5,3cb79d84ea9de94940e4d1799c0e1c2b", - "01.vcf.gz:md5,1803ee1ae2773c7b85d833d435b544dc", - "02.vcf.gz:md5,293004bea2752b8f1f5f6ee8634eb374", + "01.filtered.norm.vcf.gz:md5,e905f8aace7118fd7c775e83d24b4cd9", + "01.filtered.norm.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "02.filtered.norm.vcf.gz:md5,d97deb363c2dcba13e8a181a1fd5136c", + "02.filtered.norm.vcf.gz.tbi:md5,4cb176febbc8c26d717a6c6e67b9c905", + "01.vcf.gz:md5,5ea465b34918c42c67e4d8f7999614c7", + "02.vcf.gz:md5,1dc400334499b315df22498b8c588bda", "genome.fna:md5,dafd38f5454b54fbea38245d773062a5", "genome.mmi:md5,76c23f17ce1cade4a054bf2763b081db", "fastp-insert-size-plot.txt:md5,162036bf69d2dc7386b43f2bdadac877", @@ -482,20 +497,20 @@ "fastqc_sequence_counts_plot.txt:md5,d1c81af14b6675c3f9f04125c1ecb484", "fastqc_sequence_duplication_levels_plot.txt:md5,e32366bc23f5fb89aa60ef7b0f29de03", "fastqc_sequence_length_distribution_plot.txt:md5,cb379474706e24255b725ac25b7d141e", - "llms-full.txt:md5,dd007f04c1c596fc6d2cdf44b3b41d98", - "multiqc.parquet:md5,f43674dc04859e0fd3660d488247ece1", - "multiqc_bcftools_stats_bcftools.txt:md5,c3ed02e08a492df1f0f889fcd03e331d", + "llms-full.txt:md5,17bbaebc278b8479d023d7606e18bc06", + "multiqc.parquet:md5,e3c7ec53526a88f66c4aca145dcb6e3c", + "multiqc_bcftools_stats_bcftools.txt:md5,356ce8604c4042691dad523ef4768e39", "multiqc_citations.txt:md5,57db2426be011862828d18f767d25b57", - "multiqc_fastp.txt:md5,699888aa8b30449fc313819952c69876", + "multiqc_fastp.txt:md5,56d6d92282eff1929dc1d594df1cb9d8", "multiqc_fastqc.txt:md5,1dbca9f02b1b75f5df2ac02c81d78411", "multiqc_fastqc_fastqc-1.txt:md5,6fb9e3135beb3f43f193bdcb67d247b2", - "multiqc_general_stats.txt:md5,314ca8131542969bbf41ffe8be336796", + "multiqc_general_stats.txt:md5,7e1ff0593f1debb00f03f556197541b1", "multiqc_samtools_stats_samtools.txt:md5,bc33622a9e4c162e1cb0ff5cabede2a6", "samtools-stats-dp.txt:md5,4b8fe2e0db527dc98fc21d27f2df0e11", "samtools_alignment_plot.txt:md5,164ec8a3eceb8d56809f7970f1d0290b", "01.fa:md5,ec73cef39989caf8e39d94271a64612c", "02.fa:md5,5a1b47e59b09692f7ea9d35da64c0558", - "aligned_pseudogenomes.fas:md5,335eef26460547a611e0f65e547c9432", + "aligned_pseudogenomes.fas:md5,bf5d42e4d26f61cbf702d30f140f74a8", "01.subsampled_1.fastq.gz:md5,67f961708debdc99dd25b6e45199bd5e", "01.subsampled_2.fastq.gz:md5,7d173d53ad835ed689ab7a5c5ac3d89b", "02.subsampled_1.fastq.gz:md5,c3a57b07c737ea41807a08e4d72d5100", @@ -503,9 +518,9 @@ "01_test_1.read_stats.csv:md5,ff40aaa6720a766448a3b8bde72f530f", "02_test_2.read_stats.csv:md5,c0186b0b0464a58d780334ebb63cc70a", "genome.fna.fai:md5,aa44b24652a42e538478dea3492480dd", - "01.sorted.bam:md5,dc79ff95cc093e543bb490711b961551", + "01.sorted.bam:md5,2182496d237e58f5c9e54057ce6ac785", "01.sorted.bam.bai:md5,194c81a937bc1defaffe2e0aa1ddd8e6", - "02.sorted.bam:md5,8ac62b020645a540c193f507086697b4", + "02.sorted.bam:md5,5a07f35cf8efedded9bec741eab2c84f", "02.sorted.bam.bai:md5,40d3309085ab80106f2f0c67b5dab19d", "01.sorted.flagstat:md5,4f152687b9140a16a48856b0bb216289", "01.sorted.idxstats:md5,aa16d5da39ddbdc94dbeb52ed994c515", @@ -522,9 +537,9 @@ ] ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.04.6" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-09-15T15:01:03.587767" + "timestamp": "2026-02-03T17:23:29.845485" } } \ No newline at end of file diff --git a/workflows/bactmap.nf b/workflows/bactmap.nf index f841a85..d375955 100644 --- a/workflows/bactmap.nf +++ b/workflows/bactmap.nf @@ -78,8 +78,8 @@ workflow BACTMAP { adapterlist = params.shortread_qc_adapterlist ? file(params.shortread_qc_adapterlist) : [] if ( params.shortread_qc_adapterlist ) { - if ( params.shortread_qc_tool == 'adapterremoval' && !(adapterlist.extension == 'txt') ) error "[nf-core/taxprofiler] ERROR: AdapterRemoval2 adapter list requires a `.txt` format and extension. Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" - if ( params.shortread_qc_tool == 'fastp' && !adapterlist.extension.matches(".*(fa|fasta|fna|fas)") ) error "[nf-core/taxprofiler] ERROR: fastp adapter list requires a `.fasta` format and extension (or fa, fas, fna). Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" + if ( params.shortread_qc_tool == 'adapterremoval' && !(adapterlist.extension == 'txt') ) error "[nf-core/bactmap] ERROR: AdapterRemoval2 adapter list requires a `.txt` format and extension. Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" + if ( params.shortread_qc_tool == 'fastp' && !adapterlist.extension.matches(".*(fa|fasta|fna|fas)") ) error "[nf-core/bactmap] ERROR: fastp adapter list requires a `.fasta` format and extension (or fa, fas, fna). Check input: --shortread_qc_adapterlist ${params.shortread_qc_adapterlist}" } take: @@ -88,8 +88,8 @@ workflow BACTMAP { main: - ch_versions = Channel.empty() - ch_multiqc_files = Channel.empty() + ch_versions = channel.empty() + ch_multiqc_files = channel.empty() // Validate input files and create separate channels for FASTQ, FASTA, and Nanopore data ch_input = samplesheet @@ -131,14 +131,12 @@ workflow BACTMAP { */ ch_unzipped_fasta = GUNZIP ( ch_fasta ).gunzip - ch_versions = ch_versions.mix( GUNZIP.out.versions ) SAMTOOLS_FAIDX ( ch_unzipped_fasta, [ [ id:'no_fai' ],[] ], true ) - ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions ) /* MODULE: Get genome size @@ -154,15 +152,19 @@ workflow BACTMAP { FASTQSCAN_RAW ( ch_input_for_fastqc ) + ch_versions = ch_versions.mix(FASTQSCAN_RAW.out.versions ) + ch_fastqscanraw_fastqscanparse = FASTQSCAN_RAW.out.json - ch_fastqscanraw_readstats = FASTQSCAN_RAW.out.json - ch_versions = ch_versions.mix(FASTQSCAN_RAW.out.versions ) + .map { it[1] } + .collect() + + ch_fastqscanraw_readstats = FASTQSCAN_RAW.out.json /* MODULE: Run fastqscanparse */ FASTQSCANPARSE_RAW ( - ch_fastqscanraw_fastqscanparse.collect{it[1]}.ifEmpty([]) + ch_fastqscanraw_fastqscanparse ) ch_versions = ch_versions.mix( FASTQSCANPARSE_RAW.out.versions ) @@ -176,7 +178,6 @@ workflow BACTMAP { ch_versions = ch_versions.mix( FALCO.out.versions ) } else { FASTQC ( ch_input_for_fastqc ) - ch_versions = ch_versions.mix( FASTQC.out.versions ) } } @@ -184,10 +185,12 @@ workflow BACTMAP { SUBWORKFLOW: PERFORM PREPROCESSING */ - if ( params.perform_shortread_qc ) { - ch_shortreads_preprocessed = SHORTREAD_PREPROCESSING ( ch_input.fastq, adapterlist ).reads - ch_versions = ch_versions.mix( SHORTREAD_PREPROCESSING.out.versions ) - } else { + if (params.perform_shortread_qc) { + SHORTREAD_PREPROCESSING(ch_input.fastq, adapterlist) + ch_shortreads_preprocessed = SHORTREAD_PREPROCESSING.out.reads + ch_versions = ch_versions.mix(SHORTREAD_PREPROCESSING.out.versions) + } + else { ch_shortreads_preprocessed = ch_input.fastq } @@ -208,15 +211,19 @@ workflow BACTMAP { FASTQSCAN_PROCESSED ( ch_reads_for_fastqscan ) + ch_versions = ch_versions.mix( FASTQSCAN_PROCESSED.out.versions ) + ch_fastqscanprocessed_fastqscanparse = FASTQSCAN_PROCESSED.out.json - ch_fastqscanprocessed_readstats = FASTQSCAN_PROCESSED.out.json - ch_versions = ch_versions.mix( FASTQSCAN_PROCESSED.out.versions ) + .map { it[1] } + .collect() + + ch_fastqscanprocessed_readstats = FASTQSCAN_PROCESSED.out.json /* MODULE: Run fastqscanparse */ FASTQSCANPARSE_PROCESSED ( - ch_fastqscanprocessed_fastqscanparse.collect{it[1]}.ifEmpty([]) + ch_fastqscanprocessed_fastqscanparse ) ch_versions = ch_versions.mix( FASTQSCANPARSE_PROCESSED.out.versions ) @@ -230,14 +237,17 @@ workflow BACTMAP { READ_STATS ( ch_readstats ) + ch_versions = ch_versions.mix(READ_STATS.out.versions) + ch_readstats_readstatsparse = READ_STATS.out.csv - ch_versions = ch_versions.mix(READ_STATS.out.versions) + .map { it[1] } + .collect() /* MODULE: Summarise read stats outputs */ READSTATS_PARSE ( - ch_readstats_readstatsparse.collect{it[1]}.ifEmpty([]) + ch_readstats_readstatsparse ) ch_versions = ch_versions.mix(READSTATS_PARSE.out.versions) /* @@ -272,7 +282,7 @@ workflow BACTMAP { [ meta, [ reads ].flatten() ] } - ch_versions = ch_versions.mix(MERGE_RUNS.out.versions) + //ch_versions = ch_versions.mix(MERGE_RUNS.out.versions_cat) } else { ch_reads_runmerged = ch_shortreads_preprocessed @@ -364,7 +374,25 @@ workflow BACTMAP { /* Collate and save software versions */ - softwareVersionsToYAML(ch_versions) + def topic_versions = channel.topic("versions") + .distinct() + .branch { entry -> + versions_file: entry instanceof Path + versions_tuple: true + } + + def topic_versions_string = topic_versions.versions_tuple + .map { process, tool, version -> + [ process[process.lastIndexOf(':')+1..-1], " ${tool}: ${version}" ] + } + .groupTuple(by:0) + .map { process, tool_versions -> + tool_versions.unique().sort() + "${process}:\n${tool_versions.join('\n')}" + } + + softwareVersionsToYAML(ch_versions.mix(topic_versions.versions_file)) + .mix(topic_versions_string) .collectFile( storeDir: "${params.outdir}/pipeline_info", name: 'nf_core_' + 'bactmap_software_' + 'mqc_' + 'versions.yml', @@ -375,45 +403,43 @@ workflow BACTMAP { /* MODULE: MultiQC */ - ch_multiqc_config = Channel.fromPath( + ch_multiqc_config = channel.fromPath( "$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? - Channel.fromPath(params.multiqc_config, checkIfExists: true) : - Channel.empty() + channel.fromPath(params.multiqc_config, checkIfExists: true) : + channel.empty() ch_multiqc_logo = params.multiqc_logo ? - Channel.fromPath(params.multiqc_logo, checkIfExists: true) : - Channel.fromPath("${workflow.projectDir}/docs/images/nf-core-bactmap_logo_light.png", checkIfExists: true) + channel.fromPath(params.multiqc_logo, checkIfExists: true) : + channel.empty() summary_params = paramsSummaryMap( workflow, parameters_schema: "nextflow_schema.json") - ch_workflow_summary = Channel.value(paramsSummaryMultiqc(summary_params)) - + ch_workflow_summary = channel.value(paramsSummaryMultiqc(summary_params)) + ch_multiqc_files = ch_multiqc_files.mix( + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true) - ch_methods_description = Channel.value( + ch_methods_description = channel.value( methodsDescriptionText(ch_multiqc_custom_methods_description)) - ch_multiqc_files = ch_multiqc_files.mix( - ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) ch_multiqc_files = ch_multiqc_files.mix(ch_collated_versions) ch_multiqc_files = ch_multiqc_files.mix( ch_methods_description.collectFile( name: 'methods_description_mqc.yaml', - sort: true + sort: true, ) ) - if ( !params.skip_preprocessing_qc ) { - if ( params.preprocessing_qc_tool == 'falco' ) { + if (!params.skip_preprocessing_qc) { + if (params.preprocessing_qc_tool == 'falco') { // only mix in files actually used by MultiQC - ch_multiqc_files = ch_multiqc_files.mix(FALCO.out.txt - .map { meta, reports -> reports } - .flatten() - .filter { path -> path.name.endsWith('_data.txt')} - .ifEmpty([])) - } else { - ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) + ch_multiqc_files = ch_multiqc_files.mix( + FALCO.out.txt.map { _meta, reports -> reports }.flatten().filter { path -> path.name.endsWith('_data.txt') }.ifEmpty([]) + ) + } + else { + ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect { it[1] }.ifEmpty([])) } }