diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf index f5629527d12e..53b5d61caf0a 100644 --- a/modules/nf-core/fastqc/main.nf +++ b/modules/nf-core/fastqc/main.nf @@ -3,28 +3,28 @@ process FASTQC { label 'process_low' conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" + container "${workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container + ? 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' + : 'biocontainers/fastqc:0.12.1--hdfd78af_0'}" input: tuple val(meta), path(reads) output: - tuple val(meta) , path("*.html") , emit: html - tuple val(meta) , path("*.zip") , emit: zip + tuple val(meta), val("${task.process}"), val('fastqc'), path("*.html"), topic: multiqc_files, emit: html + tuple val(meta), val("${task.process}"), val('fastqc'), path("*.zip"), topic: multiqc_files, 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 script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ _old_name, new_name -> new_name }.join(' ') + def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[reads, "${prefix}.${reads.extension}"]] : reads.withIndex().collect { entry, index -> [entry, "${prefix}_${index + 1}.${entry.extension}"] } + def rename_to = old_new_pairs*.join(' ').join(' ') + def renamed_files = old_new_pairs.collect { _old_name, new_name -> new_name }.join(' ') // The total amount of allocated RAM by FastQC is equal to the number of threads defined (--threads) time the amount of RAM defined (--memory) // https://github.com/s-andrews/FastQC/blob/1faeea0412093224d7f6a07f777fad60a5650795/fastqc#L211-L222 diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml index 49164c88fb6a..ef120680bc4f 100644 --- a/modules/nf-core/fastqc/meta.yml +++ b/modules/nf-core/fastqc/meta.yml @@ -16,7 +16,8 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ["GPL-2.0-only"] + licence: + - "GPL-2.0-only" identifier: biotools:fastqc input: - - meta: @@ -37,6 +38,12 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name - "*.html": type: file description: FastQC report @@ -48,6 +55,12 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name - "*.zip": type: file description: FastQC report archive @@ -63,7 +76,6 @@ output: - fastqc --version | sed "/FastQC v/!d; s/.*v//": type: eval description: The expression to obtain the version of the tool - topics: versions: - - ${task.process}: @@ -75,6 +87,35 @@ topics: - fastqc --version | sed "/FastQC v/!d; s/.*v//": type: eval description: The expression to obtain the version of the tool + multiqc_files: + - - meta: + type: string + description: The name of the process + - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - "*.html": + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + ontologies: [] + - - meta: + type: string + description: The name of the process + - ${task.process}: + type: string + description: The process the versions were collected from + - fastqc: + type: string + description: The tool name + - "*.zip": + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + ontologies: [] authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test index 66c44da9bf2b..d89b287faf05 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ b/modules/nf-core/fastqc/tests/main.nf.test @@ -22,15 +22,17 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. // looks like this:
Mon 2 Oct 2023
test.gz
// https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -50,15 +52,15 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][3][1]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -77,12 +79,14 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -101,12 +105,14 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -128,21 +134,17 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][1]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][2]).text.contains("File typeConventional base calls") }, - { assert path(process.out.html[0][1][3]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3][0]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][3][1]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][3][2]).text.contains("File typeConventional base calls") }, + { assert path(process.out.html[0][3][3]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -161,12 +163,14 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("File typeConventional base calls") }, - { assert snapshot(sanitizeOutput(process.out).findAll { key, val -> key != 'html' && key != 'zip' }).match() } + { assert path(process.out.html[0][3]).text.contains("File typeConventional base calls") }, + { assert snapshot( + process.out.html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + process.out.findAll { key, val -> key.startsWith("versions") } + ).match() } ) } } @@ -186,9 +190,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } @@ -209,9 +213,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } @@ -231,9 +235,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } @@ -253,9 +257,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } @@ -278,9 +282,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } @@ -300,9 +304,9 @@ nextflow_process { } then { + assert process.success assertAll ( - { assert process.success }, - { assert snapshot(process.out).match() } + { assert snapshot(sanitizeOutput(process.out)).match() } ) } } diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap index c8ee120f56b6..9fc9e62db826 100644 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ b/modules/nf-core/fastqc/tests/main.nf.test.snap @@ -1,6 +1,12 @@ { "sarscov2 custom_prefix": { "content": [ + [ + "mysample_fastqc.html" + ], + [ + "mysample_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -12,45 +18,22 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:14.518503" + "timestamp": "2026-02-11T14:33:12.319467851" }, "sarscov2 single-end [fastq] - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "test", "single_end": true }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": true - }, "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -67,51 +50,30 @@ "id": "test", "single_end": true }, + "FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:19.309008" + "timestamp": "2026-02-11T14:38:23.147388614" }, "sarscov2 custom_prefix - stub": { "content": [ { - "0": [ - [ - { - "id": "mysample", - "single_end": true - }, - "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "mysample", "single_end": true }, - "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "mysample", - "single_end": true - }, "mysample.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -128,19 +90,27 @@ "id": "mysample", "single_end": true }, + "FASTQC", + "fastqc", "mysample.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:44.94888" + "timestamp": "2026-02-11T14:39:01.896543843" }, "sarscov2 interleaved [fastq]": { "content": [ + [ + "test_fastqc.html" + ], + [ + "test_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -152,13 +122,19 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:38:45.168496" + "timestamp": "2026-02-11T14:32:43.093082785" }, "sarscov2 paired-end [bam]": { "content": [ + [ + "test_fastqc.html" + ], + [ + "test_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -170,13 +146,25 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:38:53.268919" + "timestamp": "2026-02-11T14:32:52.50059813" }, "sarscov2 multiple [fastq]": { "content": [ + [ + "test_1_fastqc.html", + "test_2_fastqc.html", + "test_3_fastqc.html", + "test_4_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip", + "test_3_fastqc.zip", + "test_4_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -188,13 +176,21 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:05.050305" + "timestamp": "2026-02-11T14:33:02.862562448" }, "sarscov2 paired-end [fastq]": { "content": [ + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -206,45 +202,22 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:38:37.2373" + "timestamp": "2026-02-11T10:31:19.451776613" }, "sarscov2 paired-end [fastq] - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "test", "single_end": false }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -261,51 +234,30 @@ "id": "test", "single_end": false }, + "FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:24.450398" + "timestamp": "2026-02-11T14:38:30.061273733" }, "sarscov2 multiple [fastq] - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "test", "single_end": false }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -322,19 +274,27 @@ "id": "test", "single_end": false }, + "FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:39.758762" + "timestamp": "2026-02-11T14:38:53.737196741" }, "sarscov2 single-end [fastq]": { "content": [ + [ + "test_fastqc.html" + ], + [ + "test_fastqc.zip" + ], { "versions_fastqc": [ [ @@ -346,45 +306,22 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:38:29.555068" + "timestamp": "2026-02-11T14:32:21.756344375" }, "sarscov2 interleaved [fastq] - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "test", "single_end": false }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -401,51 +338,30 @@ "id": "test", "single_end": false }, + "FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:29.193136" + "timestamp": "2026-02-11T14:38:38.338009706" }, "sarscov2 paired-end [bam] - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "1": [ + "html": [ [ { "id": "test", "single_end": false }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ "FASTQC", "fastqc", - "0.12.1" - ] - ], - "html": [ - [ - { - "id": "test", - "single_end": false - }, "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -462,15 +378,17 @@ "id": "test", "single_end": false }, + "FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ] } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.4" }, - "timestamp": "2025-10-28T16:39:34.144919" + "timestamp": "2026-02-11T14:38:45.842081984" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf index 04e03c6454c2..8dcc1a428d14 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/main.nf @@ -1,10 +1,10 @@ // // Read QC, UMI extraction and trimming // -include { FASTQC as FASTQC_RAW } from '../../../modules/nf-core/fastqc/main' -include { FASTQC as FASTQC_TRIM } from '../../../modules/nf-core/fastqc/main' -include { UMITOOLS_EXTRACT } from '../../../modules/nf-core/umitools/extract/main' -include { FASTP } from '../../../modules/nf-core/fastp/main' +include { FASTP } from '../../../modules/nf-core/fastp' +include { FASTQC as FASTQC_RAW } from '../../../modules/nf-core/fastqc' +include { FASTQC as FASTQC_TRIM } from '../../../modules/nf-core/fastqc' +include { UMITOOLS_EXTRACT } from '../../../modules/nf-core/umitools/extract' // // Function that parses fastp json output file to get total number of reads after trimming @@ -37,14 +37,14 @@ def getFastpAdapterSequence(json_file) { workflow FASTQ_FASTQC_UMITOOLS_FASTP { take: - reads // channel: [ val(meta), [ reads ], adapter_fasta ] - skip_fastqc // boolean: true/false - with_umi // boolean: true/false - skip_umi_extract // boolean: true/false - umi_discard_read // integer: 0, 1 or 2 - skip_trimming // boolean: true/false + reads // channel: [ val(meta), [ reads ], adapter_fasta ] + skip_fastqc // boolean: true/false + with_umi // boolean: true/false + skip_umi_extract // boolean: true/false + umi_discard_read // integer: 0, 1 or 2 + skip_trimming // boolean: true/false save_trimmed_fail // boolean: true/false - save_merged // boolean: true/false + save_merged // boolean: true/false min_trimmed_reads // integer: > 0 main: @@ -62,12 +62,11 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { adapter_seq = channel.empty() // Split input channel for reads-only operations - reads_only = reads.map { meta, reads_files, _adapter_fasta -> [ meta, reads_files ] } + reads_only = reads.map { meta, reads_files, _adapter_fasta -> [meta, reads_files] } if (!skip_fastqc) { - FASTQC_RAW( - reads_only - ) + FASTQC_RAW(reads_only) + fastqc_raw_html = FASTQC_RAW.out.html fastqc_raw_zip = FASTQC_RAW.out.zip } @@ -107,7 +106,7 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { umi_reads_with_adapters, false, save_trimmed_fail, - save_merged + save_merged, ) trim_json = FASTP.out.json trim_html = FASTP.out.html @@ -134,9 +133,8 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { .set { adapter_seq } if (!skip_fastqc) { - FASTQC_TRIM( - trim_reads - ) + FASTQC_TRIM(trim_reads) + fastqc_trim_html = FASTQC_TRIM.out.html fastqc_trim_zip = FASTQC_TRIM.out.zip } @@ -144,17 +142,17 @@ workflow FASTQ_FASTQC_UMITOOLS_FASTP { emit: reads = trim_reads // channel: [ val(meta), [ reads ] ] - fastqc_raw_html // channel: [ val(meta), [ html ] ] - fastqc_raw_zip // channel: [ val(meta), [ zip ] ] - umi_log // channel: [ val(meta), [ log ] ] - umi_reads // channel: [ val(meta), [ reads ] ] - adapter_seq // channel: [ val(meta), [ adapter_seq] ] - trim_json // channel: [ val(meta), [ json ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_log // channel: [ val(meta), [ log ] ] - trim_reads_fail // channel: [ val(meta), [ fastq.gz ] ] + fastqc_raw_html // channel: [ val(meta), process, tool, [ html ] ] + fastqc_raw_zip // channel: [ val(meta), process, tool, [ zip ] ] + umi_log // channel: [ val(meta), [ log ] ] + umi_reads // channel: [ val(meta), [ reads ] ] + adapter_seq // channel: [ val(meta), [ adapter_seq] ] + trim_json // channel: [ val(meta), [ json ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_log // channel: [ val(meta), [ log ] ] + trim_reads_fail // channel: [ val(meta), [ fastq.gz ] ] trim_reads_merged // channel: [ val(meta), [ fastq.gz ] ] - trim_read_count // channel: [ val(meta), val(count) ] - fastqc_trim_html // channel: [ val(meta), [ html ] ] - fastqc_trim_zip // channel: [ val(meta), [ zip ] ] + trim_read_count // channel: [ val(meta), val(count) ] + fastqc_trim_html // channel: [ val(meta), process, tool, [ html ] ] + fastqc_trim_zip // channel: [ val(meta), process, tool, [ zip ] ] } diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test index 2daf04102821..467da6284736 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test @@ -53,14 +53,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -169,12 +169,12 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -225,14 +225,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -283,14 +283,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -341,8 +341,6 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, { assert !workflow.out.fastqc_trim_html }, { assert !workflow.out.fastqc_trim_zip }, { assert !workflow.out.trim_html }, @@ -350,7 +348,9 @@ nextflow_workflow { { assert snapshot( // If we skip trimming then input is output, so not snapshotting workflow.out.adapter_seq, - workflow.out.reads.get(0).get(0), // Reads meta map + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.reads[0][0], // Reads meta map workflow.out.trim_read_count, workflow.out.trim_reads_fail, workflow.out.trim_reads_merged, @@ -400,14 +400,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -458,14 +458,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -517,14 +517,14 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert workflow.out.fastqc_raw_html }, - { assert workflow.out.fastqc_raw_zip }, - { assert workflow.out.fastqc_trim_html }, - { assert workflow.out.fastqc_trim_zip }, { assert workflow.out.trim_html }, { assert workflow.out.trim_log }, { assert snapshot( workflow.out.adapter_seq, + workflow.out.fastqc_raw_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_raw_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_trim_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_reads_fail, @@ -576,7 +576,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -621,7 +621,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -664,9 +664,9 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -712,7 +712,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -757,7 +757,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -800,8 +800,8 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success }, { assert snapshot( workflow.out.adapter_seq, workflow.out.fastqc_raw_html, @@ -859,7 +859,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -902,9 +902,9 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success }, - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -950,7 +950,7 @@ nextflow_workflow { then { assert workflow.success assertAll( - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap index 37955fbb9193..2c20989524a4 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_fastqc_umitools_fastp/tests/main.nf.test.snap @@ -10,6 +10,22 @@ "unspecified" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -43,9 +59,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:18:53.838884403" + "timestamp": "2026-02-11T14:43:36.048228098" }, "sarscov2 paired-end [fastq] | with_umi": { "content": [ @@ -58,6 +74,14 @@ "" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -85,118 +109,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:18:44.18362126" + "timestamp": "2026-02-11T14:43:21.694691754" }, "sarscov2 paired-end [fastq] | umi_discard_read = 2 - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 1 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -212,6 +131,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -221,6 +142,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -230,6 +153,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -239,6 +164,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -306,9 +233,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:16.937742298" + "timestamp": "2026-02-11T14:45:24.147203186" }, "sarscov2 paired-end [fastq] | skip_trimming - stub": { "content": [ @@ -321,6 +248,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -330,6 +259,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -365,12 +296,20 @@ "nf-test": "0.9.3", "nextflow": "25.10.3" }, - "timestamp": "2026-02-03T13:20:23.046804125" + "timestamp": "2026-02-10T19:22:55.894857041" }, "sarscov2 paired-end [fastq] | skip_trimming": { "content": [ [ + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" ], { "id": "test", @@ -391,9 +330,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:12.020305151" + "timestamp": "2026-02-11T14:43:59.551167396" }, "sarscov2 paired-end [fastq] | umi_discard_read = 2": { "content": [ @@ -406,6 +345,22 @@ "unspecified" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -439,124 +394,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:03.546158761" + "timestamp": "2026-02-11T14:43:49.365663656" }, "sarscov2 paired-end [fastq] | min_trimmed_reads = 26 - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - [ - { - "id": "test", - "single_end": false - }, - "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 26 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -572,6 +416,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -581,6 +427,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -590,6 +438,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -599,6 +449,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -672,9 +524,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:43.232621634" + "timestamp": "2026-02-11T14:46:00.201401055" }, "sarscov2 paired-end [fastq] | save_trimmed_fail": { "content": [ @@ -687,6 +539,22 @@ "unspecified" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -730,9 +598,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:21.78045793" + "timestamp": "2026-02-11T14:44:11.543627633" }, "sarscov2 paired-end [fastq] | skip_fastqc": { "content": [ @@ -785,82 +653,81 @@ "sarscov2 paired-end [fastq] | save_trimmed_fail - stub": { "content": [ { - "0": [ + "adapter_seq": [ [ { "id": "test", "single_end": false }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] + "" ] ], - "1": [ + "fastqc_raw_html": [ [ { "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "10": [ - - ], - "11": [ + "fastqc_raw_zip": [ [ { "id": "test", "single_end": false }, - 1 + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", + "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "12": [ + "fastqc_trim_html": [ [ { "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "13": [ + "fastqc_trim_zip": [ [ { "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "2": [ + "reads": [ [ { "id": "test", "single_end": false }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" + [ + "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", + "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] ] ], - "3": [ - - ], - "4": [ - - ], - "5": [ + "trim_html": [ [ { "id": "test", "single_end": false }, - "" + "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "6": [ + "trim_json": [ [ { "id": "test", @@ -869,113 +736,7 @@ "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.paired.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R1.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fail.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "adapter_seq": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "fastqc_raw_html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "fastqc_raw_zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "fastqc_trim_html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "fastqc_trim_zip": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "reads": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "trim_html": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "trim_json": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "trim_log": [ + "trim_log": [ [ { "id": "test", @@ -1019,94 +780,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:29.76860289" + "timestamp": "2026-02-11T14:45:41.491484521" }, "sarscov2 paired-end [fastq] | skip_fastqc - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - - ], - "10": [ - - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 1 - ] - ], - "12": [ - - ], - "13": [ - - ], - "2": [ - - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -1192,124 +872,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:54.094320651" + "timestamp": "2026-02-11T14:44:54.570745009" }, "sarscov2 paired-end [fastq] | save_merged - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - [ - { - "id": "test", - "single_end": false - }, - "test.merged.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 1 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -1325,6 +894,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1334,6 +905,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1343,6 +916,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1352,6 +927,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1425,9 +1002,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:36.446963981" + "timestamp": "2026-02-11T14:45:51.156903793" }, "sarscov2 paired-end [fastq] | min_trimmed_reads = 26": { "content": [ @@ -1440,6 +1017,22 @@ "unspecified" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -1479,9 +1072,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:41.14746713" + "timestamp": "2026-02-11T14:44:36.994836206" }, "sarscov2 paired-end [fastq]": { "content": [ @@ -1495,150 +1088,61 @@ ] ], [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", - "test_R2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" - ] - ] - ], - [ - [ - { - "id": "test", - "single_end": false - }, - 198 - ] + "test_1_fastqc.html", + "test_2_fastqc.html" ], - [ - - ], - [ - - ], - [ - - ] - ], - "meta": { - "nf-test": "0.9.3", - "nextflow": "25.10.3" - }, - "timestamp": "2026-02-03T13:18:22.011891063" - }, - "sarscov2 paired-end [fastq] - stub": { - "content": [ - { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 1 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + [ + { + "id": "test", + "single_end": false + }, [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" + "test_R1.fastp.fastq.gz:md5,67b2bbae47f073e05a97a9c2edce23c7", + "test_R2.fastp.fastq.gz:md5,25cbdca08e2083dbd4f0502de6b62f39" ] - ], - "9": [ - - ], + ] + ], + [ + [ + { + "id": "test", + "single_end": false + }, + 198 + ] + ], + [ + + ], + [ + + ], + [ + + ] + ], + "meta": { + "nf-test": "0.9.3", + "nextflow": "25.10.4" + }, + "timestamp": "2026-02-11T14:42:55.981762464" + }, + "sarscov2 paired-end [fastq] - stub": { + "content": [ + { "adapter_seq": [ [ { @@ -1654,6 +1158,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1663,6 +1169,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1672,6 +1180,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1681,6 +1191,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1748,9 +1260,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:47.918568452" + "timestamp": "2026-02-11T14:44:45.667083742" }, "sarscov2 paired-end [fastq] | save_merged": { "content": [ @@ -1763,6 +1275,22 @@ "unspecified" ] ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -1802,130 +1330,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:19:31.453483505" + "timestamp": "2026-02-11T14:44:23.552180268" }, "sarscov2 paired-end [fastq] | with_umi - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - - ], - "11": [ - [ - { - "id": "test", - "single_end": true - }, - 1 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "test", - "single_end": false - }, - "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "5": [ - [ - { - "id": "test", - "single_end": true - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -1941,6 +1352,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1950,6 +1363,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1959,6 +1374,8 @@ "id": "test", "single_end": true }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -1968,6 +1385,8 @@ "id": "test", "single_end": true }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -2047,118 +1466,13 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:03.594981453" + "timestamp": "2026-02-11T14:45:06.09054678" }, "sarscov2 paired-end [fastq] | skip_umi_extract - stub": { "content": [ { - "0": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_R1.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test_R2.fastp.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "10": [ - - ], - "11": [ - [ - { - "id": "test", - "single_end": false - }, - 1 - ] - ], - "12": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "13": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - [ - { - "id": "test", - "single_end": false - }, - "" - ] - ], - "6": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.json:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "7": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - "test.fastp.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - - ], "adapter_seq": [ [ { @@ -2174,6 +1488,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -2183,6 +1499,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -2192,6 +1510,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -2201,6 +1521,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_FASTP:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -2268,8 +1590,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:20:10.2749087" + "timestamp": "2026-02-11T14:45:15.220321082" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf index 262cbf530c69..adc0e7638520 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/main.nf @@ -2,9 +2,9 @@ // Read QC, UMI extraction and trimming // -include { FASTQC } from '../../../modules/nf-core/fastqc/main' -include { UMITOOLS_EXTRACT } from '../../../modules/nf-core/umitools/extract/main' -include { TRIMGALORE } from '../../../modules/nf-core/trimgalore/main' +include { FASTQC } from '../../../modules/nf-core/fastqc' +include { TRIMGALORE } from '../../../modules/nf-core/trimgalore' +include { UMITOOLS_EXTRACT } from '../../../modules/nf-core/umitools/extract' // // Function that parses TrimGalore log output file to get total number of reads after trimming @@ -27,12 +27,12 @@ def getTrimGaloreReadsAfterFiltering(log_file) { workflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE { take: - reads // channel: [ val(meta), [ reads ] ] - skip_fastqc // boolean: true/false - with_umi // boolean: true/false - skip_umi_extract // boolean: true/false - skip_trimming // boolean: true/false - umi_discard_read // integer: 0, 1 or 2 + reads // channel: [ val(meta), [ reads ] ] + skip_fastqc // boolean: true/false + with_umi // boolean: true/false + skip_umi_extract // boolean: true/false + skip_trimming // boolean: true/false + umi_discard_read // integer: 0, 1 or 2 min_trimmed_reads // integer: > 0 main: @@ -40,6 +40,7 @@ workflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE { fastqc_zip = channel.empty() if (!skip_fastqc) { FASTQC(reads) + fastqc_html = FASTQC.out.html fastqc_zip = FASTQC.out.zip } @@ -104,13 +105,13 @@ workflow FASTQ_FASTQC_UMITOOLS_TRIMGALORE { emit: reads = trim_reads // channel: [ val(meta), [ reads ] ] - fastqc_html // channel: [ val(meta), [ html ] ] - fastqc_zip // channel: [ val(meta), [ zip ] ] - umi_log // channel: [ val(meta), [ log ] ] - umi_reads // channel: [ val(meta), [ reads ] ] - trim_unpaired // channel: [ val(meta), [ reads ] ] - trim_html // channel: [ val(meta), [ html ] ] - trim_zip // channel: [ val(meta), [ zip ] ] - trim_log // channel: [ val(meta), [ txt ] ] + fastqc_html // channel: [ val(meta), process, tool, [ html ] ] + fastqc_zip // channel: [ val(meta), process, tool, [ zip ] ] + umi_log // channel: [ val(meta), [ log ] ] + umi_reads // channel: [ val(meta), [ reads ] ] + trim_unpaired // channel: [ val(meta), [ reads ] ] + trim_html // channel: [ val(meta), [ html ] ] + trim_zip // channel: [ val(meta), [ zip ] ] + trim_log // channel: [ val(meta), [ txt ] ] trim_read_count // channel: [ val(meta), val(count) ] } diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test index 1c66c0687be4..8dc8a77b850e 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test @@ -36,14 +36,15 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, - { assert path(workflow.out.fastqc_html[0][1]).text.contains("File typeConventional base calls") }, { assert snapshot( + workflow.out.fastqc_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_unpaired, -).match() } + ).match() } ) } } @@ -71,13 +72,15 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, { assert snapshot( + workflow.out.fastqc_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_unpaired, -).match() } + ).match() } ) } } @@ -104,13 +107,15 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, { assert snapshot( + workflow.out.fastqc_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, workflow.out.reads, workflow.out.trim_read_count, workflow.out.trim_unpaired, -).match() } + ).match() } ) } } @@ -138,12 +143,14 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, + { assert !workflow.out.fastqc_html }, + { assert !workflow.out.fastqc_zip }, { assert snapshot( workflow.out.trim_read_count, workflow.out.trim_unpaired, -).match() } + ).match() } ) } } @@ -170,9 +177,9 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -202,9 +209,9 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } @@ -233,9 +240,9 @@ nextflow_workflow { } then { + assert workflow.success assertAll( - { assert workflow.success}, - { assert snapshot(workflow.out).match() } + { assert snapshot(sanitizeOutput(workflow.out)).match() } ) } } diff --git a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap index a22db98bc89e..eafb3f94bed5 100644 --- a/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_fastqc_umitools_trimgalore/tests/main.nf.test.snap @@ -2,81 +2,14 @@ "test paired end read with UMI - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "test", - "single_end": false - }, - "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test.umi_extract_1.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940", - "test.umi_extract_2.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ] - ], - "5": [ - - ], - "6": [ - - ], - "7": [ - - ], - "8": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": true - }, - 0 - ] - ], "fastqc_html": [ [ { "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -86,6 +19,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -144,76 +79,21 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:45.022632239" + "timestamp": "2026-02-11T14:47:05.647721208" }, "test paired end read without UMI - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": false - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": false - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - - ], - "4": [ - - ], - "5": [ - - ], - "6": [ - - ], - "7": [ - - ], - "8": [ - [ - { - "id": "test", - "single_end": false - }, - [ - "test_1.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e", - "test_2.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": false - }, - 0 - ] - ], "fastqc_html": [ [ { "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -223,6 +103,8 @@ "id": "test", "single_end": false }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -269,12 +151,20 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:51.075428076" + "timestamp": "2026-02-11T14:47:14.08042154" }, "test paired end read without UMI": { "content": [ + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -302,12 +192,18 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:22.252381045" + "timestamp": "2026-02-11T14:46:37.294916439" }, "test single end read with UMI": { "content": [ + [ + "test_fastqc.html" + ], + [ + "test_fastqc.zip" + ], [ [ { @@ -332,12 +228,20 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:01.887880112" + "timestamp": "2026-02-11T14:46:13.310452258" }, "test paired end read with UMI": { "content": [ + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], [ [ { @@ -362,9 +266,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:13.989761245" + "timestamp": "2026-02-11T14:46:27.2011909" }, "test skip all steps": { "content": [ @@ -384,78 +288,14 @@ "test single end read with UMI - stub": { "content": [ { - "0": [ - - ], - "1": [ - [ - { - "id": "test", - "single_end": true - }, - "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "2": [ - [ - { - "id": "test", - "single_end": true - }, - "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "3": [ - [ - { - "id": "test", - "single_end": true - }, - "test.umi_extract.log:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "4": [ - [ - { - "id": "test", - "single_end": true - }, - "test.umi_extract.fastq.gz:md5,68b329da9893e34099c7d8ad5cb9c940" - ] - ], - "5": [ - - ], - "6": [ - - ], - "7": [ - - ], - "8": [ - [ - { - "id": "test", - "single_end": true - }, - "test.fastq.gz_trimming_report.txt:md5,d41d8cd98f00b204e9800998ecf8427e" - ] - ], - "9": [ - [ - { - "id": "test", - "single_end": true - }, - 0 - ] - ], "fastqc_html": [ [ { "id": "test", "single_end": true }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -465,6 +305,8 @@ "id": "test", "single_end": true }, + "FASTQ_FASTQC_UMITOOLS_TRIMGALORE:FASTQC", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -520,8 +362,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:21:36.092099503" + "timestamp": "2026-02-11T14:46:54.690152145" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test b/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test index f19d4979bf35..1717dc6a300c 100644 --- a/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test @@ -35,8 +35,8 @@ nextflow_workflow { assertAll( { assert workflow.success }, { assert snapshot( - file(workflow.out.fastqc_html[0][1]).name, - file(workflow.out.fastqc_zip[0][1]).name, + file(workflow.out.fastqc_html[0][3]).name, + file(workflow.out.fastqc_zip[0][3]).name, workflow.out.seqfu_check, workflow.out.seqfu_stats, workflow.out.seqfu_multiqc, @@ -95,10 +95,8 @@ nextflow_workflow { assertAll( { assert workflow.success }, { assert snapshot( - file(workflow.out.fastqc_html[0][1][0]).name, - file(workflow.out.fastqc_zip[0][1][0]).name, - file(workflow.out.fastqc_html[0][1][1]).name, - file(workflow.out.fastqc_zip[0][1][1]).name, + workflow.out.fastqc_html[0][3].collect { f -> file(f).name }, + workflow.out.fastqc_zip[0][3].collect { f -> file(f).name }, workflow.out.seqfu_check, workflow.out.seqfu_stats, workflow.out.seqfu_multiqc, diff --git a/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test.snap index 0b16d4ceb6c3..cb7a2e74368e 100644 --- a/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_qc_stats/tests/main.nf.test.snap @@ -8,6 +8,8 @@ "id": "test_single", "single_end": true }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_single.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -17,6 +19,8 @@ "id": "test_single", "single_end": true }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_single.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -75,6 +79,8 @@ "id": "test_single", "single_end": true }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_single.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -84,6 +90,8 @@ "id": "test_single", "single_end": true }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_single.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -152,9 +160,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:30:28.391994301" + "timestamp": "2026-02-11T09:43:56.533348924" }, "sarscov2 - fastq - single_end - skip all": { "content": [ @@ -271,16 +279,20 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:30:09.161775877" + "timestamp": "2026-02-11T09:43:34.42198883" }, "sarscov2 - fastq - paired_end": { "content": [ - "test_paired_1_fastqc.html", - "test_paired_1_fastqc.zip", - "test_paired_2_fastqc.html", - "test_paired_2_fastqc.zip", + [ + "test_paired_1_fastqc.html", + "test_paired_2_fastqc.html" + ], + [ + "test_paired_1_fastqc.zip", + "test_paired_2_fastqc.zip" + ], [ [ { @@ -333,9 +345,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:30:22.113056749" + "timestamp": "2026-02-11T10:40:26.810051472" }, "sarscov2 - fastq - paired_end - stub": { "content": [ @@ -346,6 +358,8 @@ "id": "test_paired", "single_end": false }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_paired.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -355,6 +369,8 @@ "id": "test_paired", "single_end": false }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_paired.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -413,6 +429,8 @@ "id": "test_paired", "single_end": false }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_paired.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -422,6 +440,8 @@ "id": "test_paired", "single_end": false }, + "FASTQ_QC_STATS:FASTQC", + "fastqc", "test_paired.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -490,8 +510,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T13:30:34.56299164" + "timestamp": "2026-02-11T09:44:03.432690545" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf index 3b9173de74c1..6c5715f3fc46 100644 --- a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/main.nf @@ -1,14 +1,14 @@ include { BBMAP_BBSPLIT } from '../../../modules/nf-core/bbmap/bbsplit' +include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq' include { FASTQC as FASTQC_FILTERED } from '../../../modules/nf-core/fastqc' -include { CAT_FASTQ } from '../../../modules/nf-core/cat/fastq/main' -include { FQ_LINT } from '../../../modules/nf-core/fq/lint/main' -include { FQ_LINT as FQ_LINT_AFTER_TRIMMING } from '../../../modules/nf-core/fq/lint/main' -include { FQ_LINT as FQ_LINT_AFTER_BBSPLIT } from '../../../modules/nf-core/fq/lint/main' -include { FQ_LINT as FQ_LINT_AFTER_RIBO_REMOVAL } from '../../../modules/nf-core/fq/lint/main' -include { FASTQ_REMOVE_RRNA } from '../fastq_remove_rrna' -include { FASTQ_SUBSAMPLE_FQ_SALMON } from '../fastq_subsample_fq_salmon' +include { FQ_LINT } from '../../../modules/nf-core/fq/lint' +include { FQ_LINT as FQ_LINT_AFTER_BBSPLIT } from '../../../modules/nf-core/fq/lint' +include { FQ_LINT as FQ_LINT_AFTER_RIBO_REMOVAL } from '../../../modules/nf-core/fq/lint' +include { FQ_LINT as FQ_LINT_AFTER_TRIMMING } from '../../../modules/nf-core/fq/lint' include { FASTQ_FASTQC_UMITOOLS_TRIMGALORE } from '../fastq_fastqc_umitools_trimgalore' include { FASTQ_FASTQC_UMITOOLS_FASTP } from '../fastq_fastqc_umitools_fastp' +include { FASTQ_REMOVE_RRNA } from '../fastq_remove_rrna' +include { FASTQ_SUBSAMPLE_FQ_SALMON } from '../fastq_subsample_fq_salmon' // // Function to determine library type by comparing type counts. @@ -84,45 +84,32 @@ def multiqcTsvFromList(tsv_data, header) { workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { take: - // Input channels - ch_reads // channel: [ val(meta), [ reads ] ] - ch_fasta // channel: /path/to/genome.fasta - ch_transcript_fasta // channel: /path/to/transcript.fasta - ch_gtf // channel: /path/to/genome.gtf - ch_salmon_index // channel: /path/to/salmon/index/ (optional) - ch_sortmerna_index // channel: /path/to/sortmerna/index/ (optional) - ch_bowtie2_index // channel: /path/to/bowtie2/index/ (optional) - ch_bbsplit_index // channel: /path/to/bbsplit/index/ (optional) - ch_rrna_fastas // channel: one or more fasta files containing rrna sequences to be passed to SortMeRNA/Bowtie2 (optional) - - // Skip options - skip_bbsplit // boolean: Skip BBSplit for removal of non-reference genome reads. - skip_fastqc // boolean: true/false - skip_trimming // boolean: true/false - skip_umi_extract // boolean: true/false - skip_linting // boolean: true/false - - // Index generation - make_salmon_index // boolean: Whether to create salmon index before running salmon quant + ch_reads // channel: [ val(meta), [ reads ] ] + ch_fasta // channel: /path/to/genome.fasta + ch_transcript_fasta // channel: /path/to/transcript.fasta + ch_gtf // channel: /path/to/genome.gtf + ch_salmon_index // channel: /path/to/salmon/index/ (optional) + ch_sortmerna_index // channel: /path/to/sortmerna/index/ (optional) + ch_bowtie2_index // channel: /path/to/bowtie2/index/ (optional) + ch_bbsplit_index // channel: /path/to/bbsplit/index/ (optional) + ch_rrna_fastas // channel: one or more fasta files containing rrna sequences to be passed to SortMeRNA/Bowtie2 (optional) + skip_bbsplit // boolean: Skip BBSplit for removal of non-reference genome reads. + skip_fastqc // boolean: true/false + skip_trimming // boolean: true/false + skip_umi_extract // boolean: true/false + skip_linting // boolean: true/false + make_salmon_index // boolean: Whether to create salmon index before running salmon quant make_sortmerna_index // boolean: Whether to create a sortmerna index before running sortmerna - make_bowtie2_index // boolean: Whether to create a bowtie2 index before running bowtie2 - - // Trimming options - trimmer // string (enum): 'fastp' or 'trimgalore' - min_trimmed_reads // integer: > 0 - save_trimmed // boolean: true/false - fastp_merge // boolean: true/false: whether to stitch paired end reads together in FASTP output - - // rRNA removal options - remove_ribo_rna // boolean: true/false: whether to remove rRNA - ribo_removal_tool // string (enum): 'sortmerna', 'ribodetector', or 'bowtie2' - - // UMI options - with_umi // boolean: true/false: Enable UMI-based read deduplication. - umi_discard_read // integer: 0, 1 or 2 - - // Strandedness thresholds - stranded_threshold // float: The fraction of stranded reads that must be assigned to a strandedness for confident assignment. Must be at least 0.5 + make_bowtie2_index // boolean: Whether to create a bowtie2 index before running bowtie2 + trimmer // string (enum): 'fastp' or 'trimgalore' + min_trimmed_reads // integer: > 0 + save_trimmed // boolean: true/false + fastp_merge // boolean: true/false: whether to stitch paired end reads together in FASTP output + remove_ribo_rna // boolean: true/false: whether to remove rRNA + ribo_removal_tool // string (enum): 'sortmerna', 'ribodetector', or 'bowtie2' + with_umi // boolean: true/false: Enable UMI-based read deduplication. + umi_discard_read // integer: 0, 1 or 2 + stranded_threshold // float: The fraction of stranded reads that must be assigned to a strandedness for confident assignment. Must be at least 0.5 unstranded_threshold // float: The difference in fraction of stranded reads assigned to 'forward' and 'reverse' below which a sample is classified as 'unstranded' main: @@ -136,27 +123,27 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { ch_lint_log_ribo = channel.empty() // Individual output channels for workflow outputs - ch_fastqc_raw_html = channel.empty() - ch_fastqc_raw_zip = channel.empty() - ch_fastqc_trim_html = channel.empty() - ch_fastqc_trim_zip = channel.empty() - ch_trim_html = channel.empty() - ch_trim_zip = channel.empty() - ch_trim_log = channel.empty() - ch_trim_json = channel.empty() - ch_trim_unpaired = channel.empty() - ch_umi_log = channel.empty() - ch_umi_reads = channel.empty() - ch_bbsplit_stats = channel.empty() - ch_sortmerna_log = channel.empty() - ch_ribodetector_log = channel.empty() - ch_seqkit_stats = channel.empty() - ch_bowtie2_log = channel.empty() - ch_bowtie2_index = channel.empty() - ch_seqkit_prefixed = channel.empty() - ch_seqkit_converted = channel.empty() + ch_fastqc_raw_html = channel.empty() + ch_fastqc_raw_zip = channel.empty() + ch_fastqc_trim_html = channel.empty() + ch_fastqc_trim_zip = channel.empty() + ch_trim_html = channel.empty() + ch_trim_zip = channel.empty() + ch_trim_log = channel.empty() + ch_trim_json = channel.empty() + ch_trim_unpaired = channel.empty() + ch_umi_log = channel.empty() + ch_umi_reads = channel.empty() + ch_bbsplit_stats = channel.empty() + ch_sortmerna_log = channel.empty() + ch_ribodetector_log = channel.empty() + ch_seqkit_stats = channel.empty() + ch_bowtie2_log = channel.empty() + ch_bowtie2_index = channel.empty() + ch_seqkit_prefixed = channel.empty() + ch_seqkit_converted = channel.empty() ch_fastqc_filtered_html = channel.empty() - ch_fastqc_filtered_zip = channel.empty() + ch_fastqc_filtered_zip = channel.empty() ch_reads .branch { meta, fastqs -> @@ -204,19 +191,19 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { // Capture individual outputs for workflow outputs ch_fastqc_raw_html = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_html - ch_fastqc_raw_zip = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip + ch_fastqc_raw_zip = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip ch_fastqc_trim_html = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_html - ch_fastqc_trim_zip = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip - ch_trim_log = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log - ch_trim_unpaired = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_unpaired - ch_umi_log = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.umi_log - ch_umi_reads = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.umi_reads - - ch_multiqc_files = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip + ch_fastqc_trim_zip = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip + ch_trim_log = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log + ch_trim_unpaired = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_unpaired + ch_umi_log = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.umi_log + ch_umi_reads = FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.umi_reads + + ch_multiqc_files = ch_multiqc_files + .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.fastqc_zip.map { meta, _process, _tool, file -> [meta, file] }) .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_zip) .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.trim_log) .mix(FASTQ_FASTQC_UMITOOLS_TRIMGALORE.out.umi_log) - .mix(ch_multiqc_files) } // @@ -224,7 +211,7 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { // if (trimmer == 'fastp') { FASTQ_FASTQC_UMITOOLS_FASTP( - ch_filtered_reads.map { meta, reads -> tuple(meta, reads, []) }, // Add empty adapter sequence + ch_filtered_reads.map { meta, reads -> tuple(meta, reads, []) }, skip_fastqc, with_umi, skip_umi_extract, @@ -238,21 +225,21 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { ch_trim_read_count = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_read_count // Capture individual outputs for workflow outputs - ch_fastqc_raw_html = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_html - ch_fastqc_raw_zip = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip + ch_fastqc_raw_html = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_html + ch_fastqc_raw_zip = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip ch_fastqc_trim_html = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_html - ch_fastqc_trim_zip = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip - ch_trim_json = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_json - ch_trim_html = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_html - ch_trim_log = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_log - ch_umi_log = FASTQ_FASTQC_UMITOOLS_FASTP.out.umi_log - ch_umi_reads = FASTQ_FASTQC_UMITOOLS_FASTP.out.umi_reads - - ch_multiqc_files = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip - .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip) + ch_fastqc_trim_zip = FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip + ch_trim_json = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_json + ch_trim_html = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_html + ch_trim_log = FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_log + ch_umi_log = FASTQ_FASTQC_UMITOOLS_FASTP.out.umi_log + ch_umi_reads = FASTQ_FASTQC_UMITOOLS_FASTP.out.umi_reads + + ch_multiqc_files = ch_multiqc_files + .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_raw_zip.map { meta, _process, _tool, file -> [meta, file] }) + .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.fastqc_trim_zip.map { meta, _process, _tool, file -> [meta, file] }) .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.trim_json) .mix(FASTQ_FASTQC_UMITOOLS_FASTP.out.umi_log) - .mix(ch_multiqc_files) } def pass_trimmed_reads = [:] @@ -329,12 +316,12 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { ) ch_filtered_reads = FASTQ_REMOVE_RRNA.out.reads - ch_sortmerna_log = FASTQ_REMOVE_RRNA.out.sortmerna_log + ch_sortmerna_log = FASTQ_REMOVE_RRNA.out.sortmerna_log ch_ribodetector_log = FASTQ_REMOVE_RRNA.out.ribodetector_log - ch_seqkit_stats = FASTQ_REMOVE_RRNA.out.seqkit_stats - ch_bowtie2_log = FASTQ_REMOVE_RRNA.out.bowtie2_log - ch_bowtie2_index = FASTQ_REMOVE_RRNA.out.bowtie2_index - ch_seqkit_prefixed = FASTQ_REMOVE_RRNA.out.seqkit_prefixed + ch_seqkit_stats = FASTQ_REMOVE_RRNA.out.seqkit_stats + ch_bowtie2_log = FASTQ_REMOVE_RRNA.out.bowtie2_log + ch_bowtie2_index = FASTQ_REMOVE_RRNA.out.bowtie2_index + ch_seqkit_prefixed = FASTQ_REMOVE_RRNA.out.seqkit_prefixed ch_seqkit_converted = FASTQ_REMOVE_RRNA.out.seqkit_converted ch_multiqc_files = ch_multiqc_files.mix(FASTQ_REMOVE_RRNA.out.multiqc_files) @@ -355,8 +342,8 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { ch_filtered_reads ) ch_fastqc_filtered_html = FASTQC_FILTERED.out.html - ch_fastqc_filtered_zip = FASTQC_FILTERED.out.zip - ch_multiqc_files = ch_multiqc_files.mix(FASTQC_FILTERED.out.zip) + ch_fastqc_filtered_zip = FASTQC_FILTERED.out.zip + ch_multiqc_files = ch_multiqc_files.mix(FASTQC_FILTERED.out.zip.map { meta, _process, _tool, file -> [meta, file] }) } // Branch FastQ channels if 'auto' specified to infer strandedness @@ -403,34 +390,32 @@ workflow FASTQ_QC_TRIM_FILTER_SETSTRANDEDNESS { .set { ch_strand_inferred_fastq } emit: - reads = ch_strand_inferred_fastq - trim_read_count = ch_trim_read_count - multiqc_files = ch_multiqc_files.transpose().map { _meta, file -> file } - - // Individual outputs for workflow outputs - lint_log_raw = ch_lint_log_raw - lint_log_trimmed = ch_lint_log_trimmed - lint_log_bbsplit = ch_lint_log_bbsplit - lint_log_ribo = ch_lint_log_ribo - fastqc_raw_html = ch_fastqc_raw_html - fastqc_raw_zip = ch_fastqc_raw_zip - fastqc_trim_html = ch_fastqc_trim_html - fastqc_trim_zip = ch_fastqc_trim_zip - trim_html = ch_trim_html - trim_zip = ch_trim_zip - trim_log = ch_trim_log - trim_json = ch_trim_json - trim_unpaired = ch_trim_unpaired - umi_log = ch_umi_log - umi_reads = ch_umi_reads - bbsplit_stats = ch_bbsplit_stats - sortmerna_log = ch_sortmerna_log - ribodetector_log = ch_ribodetector_log - seqkit_stats = ch_seqkit_stats - bowtie2_log = ch_bowtie2_log - bowtie2_index = ch_bowtie2_index + reads = ch_strand_inferred_fastq + trim_read_count = ch_trim_read_count + multiqc_files = ch_multiqc_files.transpose().map { _meta, file -> file } + lint_log_raw = ch_lint_log_raw + lint_log_trimmed = ch_lint_log_trimmed + lint_log_bbsplit = ch_lint_log_bbsplit + lint_log_ribo = ch_lint_log_ribo + fastqc_raw_html = ch_fastqc_raw_html + fastqc_raw_zip = ch_fastqc_raw_zip + fastqc_trim_html = ch_fastqc_trim_html + fastqc_trim_zip = ch_fastqc_trim_zip + trim_html = ch_trim_html + trim_zip = ch_trim_zip + trim_log = ch_trim_log + trim_json = ch_trim_json + trim_unpaired = ch_trim_unpaired + umi_log = ch_umi_log + umi_reads = ch_umi_reads + bbsplit_stats = ch_bbsplit_stats + sortmerna_log = ch_sortmerna_log + ribodetector_log = ch_ribodetector_log + seqkit_stats = ch_seqkit_stats + bowtie2_log = ch_bowtie2_log + bowtie2_index = ch_bowtie2_index fastqc_filtered_html = ch_fastqc_filtered_html fastqc_filtered_zip = ch_fastqc_filtered_zip - seqkit_prefixed = ch_seqkit_prefixed - seqkit_converted = ch_seqkit_converted + seqkit_prefixed = ch_seqkit_prefixed + seqkit_converted = ch_seqkit_converted } diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test index 3f0ee1513dd5..09849096dfa4 100644 --- a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.function.nf.test @@ -41,7 +41,6 @@ nextflow_function { { assert snapshot(function.result).match() } ) } - } test("Test Function getSalmonInferredStrandedness forward") { @@ -77,7 +76,6 @@ nextflow_function { { assert snapshot(function.result).match() } ) } - } test("Test Function getSalmonInferredStrandedness reverse") { @@ -113,6 +111,5 @@ nextflow_function { { assert snapshot(function.result).match() } ) } - } } diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test index 753b67d6785a..d3f9588efb57 100644 --- a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test @@ -123,10 +123,8 @@ nextflow_workflow { pelines1.join('\n').md5(), pelines2.join('\n').md5(), processed_ribo_removal_lint_report, - file(workflow.out.fastqc_filtered_html[0][1][0]).name, - file(workflow.out.fastqc_filtered_html[0][1][1]).name, - file(workflow.out.fastqc_filtered_zip[0][1][0]).name, - file(workflow.out.fastqc_filtered_zip[0][1][1]).name, + workflow.out.fastqc_filtered_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_filtered_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, ).match() } ) } @@ -213,10 +211,8 @@ nextflow_workflow { pelines1.join('\n').md5(), pelines2.join('\n').md5(), processed_ribo_removal_lint_report.md5(), - file(workflow.out.fastqc_filtered_html[0][1][0]).name, - file(workflow.out.fastqc_filtered_html[0][1][1]).name, - file(workflow.out.fastqc_filtered_zip[0][1][0]).name, - file(workflow.out.fastqc_filtered_zip[0][1][1]).name, + workflow.out.fastqc_filtered_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_filtered_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, ).match() } ) } @@ -301,10 +297,8 @@ nextflow_workflow { pelines1.join('\n').md5(), pelines2.join('\n').md5(), processed_ribo_removal_lint_report.md5(), - file(workflow.out.fastqc_filtered_html[0][1][0]).name, - file(workflow.out.fastqc_filtered_html[0][1][1]).name, - file(workflow.out.fastqc_filtered_zip[0][1][0]).name, - file(workflow.out.fastqc_filtered_zip[0][1][1]).name, + workflow.out.fastqc_filtered_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_filtered_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, ).match() } ) } @@ -395,10 +389,8 @@ nextflow_workflow { pelines1.join('\n').md5(), pelines2.join('\n').md5(), processed_ribo_removal_lint_report.md5(), - file(workflow.out.fastqc_filtered_html[0][1][0]).name, - file(workflow.out.fastqc_filtered_html[0][1][1]).name, - file(workflow.out.fastqc_filtered_zip[0][1][0]).name, - file(workflow.out.fastqc_filtered_zip[0][1][1]).name, + workflow.out.fastqc_filtered_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_filtered_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, ).match() } ) } @@ -503,8 +495,8 @@ nextflow_workflow { { assert snapshot( selines.join('\n').md5(), processed_ribo_removal_lint_report.md5(), - file(workflow.out.fastqc_filtered_html[0][1]).name, - file(workflow.out.fastqc_filtered_zip[0][1]).name, + workflow.out.fastqc_filtered_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.fastqc_filtered_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, ).match() } ) } diff --git a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap index 69a3a21263ca..2392dfd19f7b 100644 --- a/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_qc_trim_filter_setstrandedness/tests/main.nf.test.snap @@ -4,76 +4,96 @@ "427d190cd40caeff5e2bd1967a21facb", "5d74b788577eb11cf8c858ca94e2f787", "\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m fq-lint start\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m validating paired end reads\n\u001b[32m INFO\u001b[0m \u001b[2mfq::validators\u001b[0m\u001b[2m:\u001b[0m disabled validators: []\n\u001b[32m INFO\u001b[0m \u001b[2mfq::validators\u001b[0m\u001b[2m:\u001b[0m enabled single read validators: [\"[S003] NameValidator\", \"[S004] CompleteValidator\", \"[S002] AlphabetValidator\", \"[S001] PlusLineValidator\", \"[S005] ConsistentSeqQualValidator\", \"[S006] QualityStringValidator\"]\n\u001b[32m INFO\u001b[0m \u001b[2mfq::validators\u001b[0m\u001b[2m:\u001b[0m enabled paired read validators: [\"[P001] NamesValidator\"]\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m enabled special validators: [\"[S007] DuplicateNameValidator\"]\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m starting validation (pass 1)\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m read 1127 * 2 records\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m starting validation (pass 2)\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m read 1127 records\n\u001b[32m INFO\u001b[0m \u001b[2mfq::commands::lint\u001b[0m\u001b[2m:\u001b[0m fq-lint end", - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.zip", - "test_2_fastqc.zip" + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-12T09:05:53.923664771" + "timestamp": "2026-02-12T15:07:59.122815005" }, "homo_sapiens paired-end [fastq] fastp ribodetector": { "content": [ "5f14496c2cc20412609a0005ac6d10c4", "888d06ce2b2c67c8b8fc94eae65870ed", "13bd489c0acd9f79cfa291e982c6ba21", - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.zip", - "test_2_fastqc.zip" + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-12T09:06:16.903127796" + "timestamp": "2026-02-12T15:08:26.494865291" }, "homo_sapiens paired-end [fastq] trimgalore sortmerna": { "content": [ "d4b38548c21fb1a703204a38df4f6577", "546d6903d24642870c2ef7bdbc435758", "42c4b902767edb12752797e908f66d6c", - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.zip", - "test_2_fastqc.zip" + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-12T09:06:33.867211398" + "timestamp": "2026-02-12T15:08:50.272644661" }, "homo_sapiens paired-end [fastq] fastp bowtie2": { "content": [ "e4b3f501156cf176093c712e7a1bc0e1", "f79feea1f5d509b4bcfd0a637b5d8558", "0a6ee69d1a42f5e38ad2d4dfe9faf5a6", - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.zip", - "test_2_fastqc.zip" + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-12T09:06:51.756578633" + "timestamp": "2026-02-12T15:09:14.037822812" }, "homo_sapiens single-end [fastq] fastp bowtie2": { "content": [ "b423f619ae31c22b2bf99bdcb89bf852", "5c1e74518dd70e4f1506b4f64da7b5f3", - "test_se_fastqc.html", - "test_se_fastqc.zip" + [ + "test_se_fastqc.html" + ], + [ + "test_se_fastqc.zip" + ] ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-12T09:07:08.160495752" + "timestamp": "2026-02-12T15:09:36.85865527" } } \ No newline at end of file diff --git a/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test b/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test index 563ec899cffd..c02f40c5e748 100644 --- a/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test +++ b/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test @@ -228,14 +228,10 @@ nextflow_workflow { { assert snapshot( path(workflow.out.reads[0][1][0]).linesGzip.size(), path(workflow.out.reads[0][1][1]).linesGzip.size(), - file(workflow.out.pre_stats_fastqc_html[0][1][0]).name, - file(workflow.out.pre_stats_fastqc_html[0][1][1]).name, - file(workflow.out.post_stats_fastqc_html[0][1][0]).name, - file(workflow.out.post_stats_fastqc_html[0][1][1]).name, - file(workflow.out.pre_stats_fastqc_zip[0][1][0]).name, - file(workflow.out.pre_stats_fastqc_zip[0][1][1]).name, - file(workflow.out.post_stats_fastqc_zip[0][1][0]).name, - file(workflow.out.post_stats_fastqc_zip[0][1][1]).name, + workflow.out.pre_stats_fastqc_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.pre_stats_fastqc_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.post_stats_fastqc_html.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, + workflow.out.post_stats_fastqc_zip.collect().flatten().findAll { !(it instanceof Map) && it.startsWith("/") }.collect { file(it).name }, path(workflow.out.clumpify_log[0][1]).readLines().size(), workflow.out.versions.collect { path(it).yaml } ).match() } diff --git a/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test.snap index ef44fac6bd0a..7fd0007448cb 100644 --- a/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_shortreads_preprocess_qc/tests/main.nf.test.snap @@ -139,14 +139,22 @@ "content": [ 400, 400, - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.html", - "test_2_fastqc.html", - "test_1_fastqc.zip", - "test_2_fastqc.zip", - "test_1_fastqc.zip", - "test_2_fastqc.zip", + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], + [ + "test_1_fastqc.html", + "test_2_fastqc.html" + ], + [ + "test_1_fastqc.zip", + "test_2_fastqc.zip" + ], 41, [ { @@ -178,9 +186,9 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.3" + "nextflow": "25.10.4" }, - "timestamp": "2026-02-03T15:12:04.335584164" + "timestamp": "2026-02-11T10:41:33.298600818" }, "sarscov2 - fastq - skip all - single_end": { "content": [ diff --git a/subworkflows/nf-core/fastq_trim_fastp_fastqc/tests/main.nf.test.snap b/subworkflows/nf-core/fastq_trim_fastp_fastqc/tests/main.nf.test.snap index 331913ad6704..a1edc75ad7a3 100644 --- a/subworkflows/nf-core/fastq_trim_fastp_fastqc/tests/main.nf.test.snap +++ b/subworkflows/nf-core/fastq_trim_fastp_fastqc/tests/main.nf.test.snap @@ -199,6 +199,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -208,6 +210,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -223,6 +227,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -232,6 +238,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -274,10 +282,10 @@ } ], "meta": { - "nf-test": "0.9.2", - "nextflow": "25.10.0" + "nf-test": "0.9.3", + "nextflow": "25.10.3" }, - "timestamp": "2025-10-29T12:30:36.850497" + "timestamp": "2026-02-10T19:26:04.97139095" }, "sarscov2 paired-end [fastq] | skip_fastp": { "content": [ @@ -390,6 +398,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -399,6 +409,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -408,6 +420,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -417,6 +431,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -426,6 +442,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -435,6 +453,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_RAW", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -444,6 +464,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_TRIM", + "fastqc", "test.html:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -453,6 +475,8 @@ "id": "test", "single_end": false }, + "FASTQ_TRIM_FASTP_FASTQC:FASTQC_TRIM", + "fastqc", "test.zip:md5,d41d8cd98f00b204e9800998ecf8427e" ] ], @@ -508,8 +532,8 @@ ], "meta": { "nf-test": "0.9.3", - "nextflow": "25.10.2" + "nextflow": "25.10.3" }, - "timestamp": "2026-01-23T11:00:12.756883609" + "timestamp": "2026-02-10T19:25:50.450039777" } } \ No newline at end of file