.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 type | Conventional 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 type | Conventional base calls |
") },
{ assert path(process.out.html[0][1][1]).text.contains("| File type | Conventional 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 type | Conventional 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 type | Conventional 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 type | Conventional base calls |
") },
{ assert path(process.out.html[0][1][2]).text.contains("| File type | Conventional base calls |
") },
{ assert path(process.out.html[0][1][3]).text.contains("| File type | Conventional 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 type | Conventional 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([]))
}
}