Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
cec1719
Added fq2bam
eduard-watchmaker Oct 30, 2025
e2a4e73
test fix
eduard-watchmaker Oct 30, 2025
548bcae
typo
eduard-watchmaker Oct 30, 2025
222cdc6
PE channel
eduard-watchmaker Oct 30, 2025
f3b9ad7
tidying
eduard-watchmaker Oct 30, 2025
fc3bd64
gpu snap
Oct 30, 2025
7688d5b
test fix for snaps
eduard-watchmaker Oct 30, 2025
370d087
Merge branch 'add_fq2bam_fq_align_dd_bwamem' of github.com:nf-core/mo…
eduard-watchmaker Oct 30, 2025
3a4c54b
gpu snapshot
Oct 30, 2025
0201ccb
PR feedback
eduard-watchmaker Oct 31, 2025
61a9670
tests
eduard-watchmaker Oct 31, 2025
4a214d0
cpu snapshot
Oct 31, 2025
d30ae9a
tests
eduard-watchmaker Oct 31, 2025
e8888ff
Merge branch 'add_fq2bam_fq_align_dd_bwamem' of github.com:nf-core/mo…
eduard-watchmaker Oct 31, 2025
33a8c26
last snapshot
Oct 31, 2025
021771c
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
eduard-watchmaker Oct 31, 2025
509acdc
fix channels
eduard-watchmaker Oct 31, 2025
e90793a
last snapshot
Oct 31, 2025
75c7cdf
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
eduard-watchmaker Nov 3, 2025
d40d5b5
PR feedback
eduard-watchmaker Nov 3, 2025
f02a8de
Merge branch 'add_fq2bam_fq_align_dd_bwamem' of github.com:nf-core/mo…
eduard-watchmaker Nov 3, 2025
3378759
PR feedback
eduard-watchmaker Nov 3, 2025
54d4284
new cpu snapshot
Nov 3, 2025
3cd511d
changing test
eduard-watchmaker Nov 3, 2025
1682b6b
changing test
eduard-watchmaker Nov 3, 2025
a1b02e2
new gpu snapshot
Nov 3, 2025
2a7d306
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
eduard-watchmaker Nov 3, 2025
1c96e28
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
eduard-watchmaker Nov 4, 2025
bb9dfe5
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
eduard-watchmaker Nov 5, 2025
509876c
[automated] Update gpu snapshot
nf-core-bot Nov 6, 2025
12e9cc6
Merge branch 'master' into add_fq2bam_fq_align_dd_bwamem
Joon-Klaps Nov 6, 2025
f87720b
PR feedback
Nov 6, 2025
66d1f4e
PR feedback
Nov 6, 2025
d80d9d0
PR feedback
Nov 6, 2025
dc03a66
PR feedback
Nov 6, 2025
20d20fa
PR feedback
Nov 6, 2025
8aee1e7
PR feedback
Nov 6, 2025
a420277
PR feedback
Nov 6, 2025
1835a16
PR feedback
Nov 6, 2025
11e81af
PR feedback
Nov 6, 2025
1b74374
PR feedback
Nov 6, 2025
5b8b7ba
PR feedback
Nov 7, 2025
b3b1e73
containerOptions back
Nov 7, 2025
ddbec0a
genome test name
Nov 7, 2025
40ae71a
genome test name
Nov 7, 2025
8a687c0
wrong comment
Nov 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions setup-nextflow
Submodule setup-nextflow added at 6c2e22
59 changes: 46 additions & 13 deletions subworkflows/nf-core/fastq_align_dedup_bwamem/main.nf
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
include { FASTQ_ALIGN_BWA } from '../fastq_align_bwa/main'
include { BAM_SORT_STATS_SAMTOOLS } from '../../nf-core/bam_sort_stats_samtools/main'
include { FASTQ_ALIGN_BWA } from '../../nf-core/fastq_align_bwa/main'
include { PICARD_ADDORREPLACEREADGROUPS } from '../../../modules/nf-core/picard/addorreplacereadgroups/main'
include { PICARD_MARKDUPLICATES } from '../../../modules/nf-core/picard/markduplicates/main'
include { PARABRICKS_FQ2BAM } from '../../../modules/nf-core/parabricks/fq2bam/main'
include { SAMTOOLS_INDEX } from '../../../modules/nf-core/samtools/index/main'

workflow FASTQ_ALIGN_DEDUP_BWAMEM {
Expand All @@ -12,6 +14,9 @@ workflow FASTQ_ALIGN_DEDUP_BWAMEM {
ch_bwamem_index // channel: [ val(meta), [ bwam index ] ]
skip_deduplication // boolean: whether to deduplicate alignments
use_gpu // boolean: whether to use GPU or CPU for bwamem alignment
output_fmt // string: output format for parabricks fq2bam (e.g., 'bam' or 'cram')
interval_file // channel: [ val(meta), [ interval file ] ]
known_sites // channel: [ val(meta), [ known sites ] ]

main:

Expand All @@ -23,18 +28,46 @@ workflow FASTQ_ALIGN_DEDUP_BWAMEM {
ch_multiqc_files = Channel.empty()
ch_versions = Channel.empty()

FASTQ_ALIGN_BWA (
ch_reads,
ch_bwamem_index,
true, // val_sort_bam hardcoded to true
ch_fasta
)
ch_alignment = ch_alignment.mix(FASTQ_ALIGN_BWA.out.bam)
ch_alignment_index = ch_alignment.mix(FASTQ_ALIGN_BWA.out.bai)
ch_stats = ch_alignment.mix(FASTQ_ALIGN_BWA.out.stats) // channel: [ val(meta), path(stats) ]
ch_flagstat = ch_alignment.mix(FASTQ_ALIGN_BWA.out.flagstat) // channel: [ val(meta), path(flagstat) ]
ch_idxstats = ch_alignment.mix(FASTQ_ALIGN_BWA.out.idxstats) // channel: [ val(meta), path(idxstats) ]
ch_versions = ch_versions.mix(FASTQ_ALIGN_BWA.out.versions.first())
if (use_gpu) {
/*
* Align with parabricks GPU enabled fq2bam implementation of bwa-mem
*/
PARABRICKS_FQ2BAM (
ch_reads, // channel: [ val(meta), [ reads ] ]
ch_fasta, // channel: [ val(meta), [ fasta ] ]
ch_bwamem_index, // channel: [ val(meta), [ bwamem index ] ]
interval_file, // channel: [ val(meta), [ interval file ] ]
known_sites, // channel: [ val(meta), [ known sites ] ]
output_fmt // string: output format
)
ch_alignment = PARABRICKS_FQ2BAM.out.bam
ch_versions = ch_versions.mix(PARABRICKS_FQ2BAM.out.versions.first())

BAM_SORT_STATS_SAMTOOLS (
ch_alignment,
ch_fasta
)
ch_alignment = BAM_SORT_STATS_SAMTOOLS.out.bam
ch_alignment_index = BAM_SORT_STATS_SAMTOOLS.out.bai
ch_stats = BAM_SORT_STATS_SAMTOOLS.out.stats // channel: [ val(meta), path(stats) ]
ch_flagstat = BAM_SORT_STATS_SAMTOOLS.out.flagstat // channel: [ val(meta), path(flagstat) ]
ch_idxstats = BAM_SORT_STATS_SAMTOOLS.out.idxstats // channel: [ val(meta), path(idxstats) ]
ch_versions = ch_versions.mix(BAM_SORT_STATS_SAMTOOLS.out.versions.first())
}
else {
FASTQ_ALIGN_BWA (
ch_reads,
ch_bwamem_index,
true, // val_sort_bam hardcoded to true
ch_fasta
)
ch_alignment = ch_alignment.mix(FASTQ_ALIGN_BWA.out.bam)
ch_alignment_index = ch_alignment.mix(FASTQ_ALIGN_BWA.out.bai)
ch_stats = ch_alignment.mix(FASTQ_ALIGN_BWA.out.stats) // channel: [ val(meta), path(stats) ]
ch_flagstat = ch_alignment.mix(FASTQ_ALIGN_BWA.out.flagstat) // channel: [ val(meta), path(flagstat) ]
ch_idxstats = ch_alignment.mix(FASTQ_ALIGN_BWA.out.idxstats) // channel: [ val(meta), path(idxstats) ]
ch_versions = ch_versions.mix(FASTQ_ALIGN_BWA.out.versions.first())
}

if (!skip_deduplication) {
/*
Expand Down
22 changes: 21 additions & 1 deletion subworkflows/nf-core/fastq_align_dedup_bwamem/meta.yml
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/subworkflows/yaml-schema.json
name: "fastq_align_dedup_bwamem"
description: Performs alignment of DNA or TAPS-treated reads using bwamem, sort and deduplicate
description: Performs alignment of DNA or TAPS-treated reads using bwamem or parabricks/fq2bam, sort and deduplicate
keywords:
- bwamem
- alignment
Expand All @@ -11,9 +11,11 @@ keywords:
- fastq
- bam
components:
- parabricks/fq2bam
- samtools/index
- picard/addorreplacereadgroups
- picard/markduplicates
- bam_sort_stats_samtools
- fastq_align_bwa
input:
- ch_reads:
Expand Down Expand Up @@ -41,6 +43,24 @@ input:
type: boolean
description: |
Skip deduplication of aligned reads
- use_gpu:
type: boolean
description: |
Use GPU for alignment
- output_fmt:
type: string
description: Output format for the alignment. Options are 'bam' or 'cram'
pattern: "{bam,cram}"
- interval_file:
type: file
description: |
Structure: [ val(meta), path(interval file) ]
pattern: "*.{bed,intervals}"
- known_sites:
type: file
description: |
Structure: [ val(meta), path(known sites) ]
pattern: "*.{vcf,vcf.gz}"
output:
- bam:
type: file
Expand Down
4 changes: 3 additions & 1 deletion subworkflows/nf-core/fastq_align_dedup_bwamem/nextflow.config
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// IMPORTANT: This config file should be included to ensure that the subworkflow works properly.
process {
withName: 'PARABRICKS_FQ2BAM' {
containerOptions = '--gpus all --memory=64g --memory-swap=64g'
}
withName: 'SAMTOOLS_SORT' {
ext.prefix = { "${meta.id}.sorted" }
}
Expand Down
213 changes: 213 additions & 0 deletions subworkflows/nf-core/fastq_align_dedup_bwamem/tests/gpu.nf.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
nextflow_workflow {

name "Test Subworkflow FASTQ_ALIGN_DEDUP_BWAMEM"
script "../main.nf"
workflow "FASTQ_ALIGN_DEDUP_BWAMEM"
config "./nextflow.config"

tag "gpu"
tag "subworkflows"
tag "subworkflows_nfcore"
tag "subworkflows/fastq_align_dedup_bwamem"
tag "parabricks/fq2bam"
tag "samtools/index"
tag "picard/markduplicates"
tag "bwa"
tag "bwa/index"
tag "parabricks/fq2bam"
tag "samtools"
tag "samtools/sort"
tag "samtools/index"
tag "samtools/idxstats"
tag "samtools/flagstat"
tag "samtools/stats"
tag "bam_sort_stats_samtools"
tag "picard/markduplicates"
tag "picard/addorreplacereadgroups"

setup {
run("BWA_INDEX") {
script "../../../../modules/nf-core/bwa/index/main.nf"
process {
"""
input[0] = Channel.of([ [ id:'test' ], file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)])
"""
}
}
}

test("Sarscov2 fasta - SE - deduplicate - with GPU parabricks/fq2bam") {
when {
workflow {
"""
input[0] = Channel.of([
[ id:'test', single_end:true ],
file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true)
])
input[1] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)
])
input[2] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)
])
input[3] = BWA_INDEX.out.index
input[4] = false // skip_deduplication
input[5] = true // use_gpu
input[6] = Channel.of([[:], []]) // interval_file
input[7] = Channel.of([[:], []]) // known_sites
input[8] = "bam" // output_fmt
"""
}
}

then {
assertAll(
{ assert workflow.success },
{ assert snapshot(
workflow.out.bam.collect { meta, bamfile -> bam(bamfile).getReadsMD5() },
workflow.out.bai.collect { meta, bai -> file(bai).name },
workflow.out.samtools_flagstat,
workflow.out.samtools_stats,
workflow.out.samtools_index_stats,
workflow.out.picard_metrics.collect { meta, metrics -> file(metrics).name },
workflow.out.multiqc.flatten().collect { path -> file(path).name },
workflow.out.versions
).match()
}
)
}
}

test("Sarscov2 fasta - SE - skip deduplication - with GPU parabricks/fq2bam") {
when {
workflow {
"""
input[0] = Channel.of([
[ id:'test', single_end:true ],
file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true)
])
input[1] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)
])
input[2] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)
])
input[3] = BWA_INDEX.out.index
input[4] = true // skip_deduplication
input[5] = true // use_gpu
input[6] = "bam" // output_fmt
input[7] = Channel.of([[:], []]) // interval_file
input[8] = Channel.of([[:], []]) // known_sites
"""
}
}

then {
assertAll(
{ assert workflow.success },
{ assert snapshot(
workflow.out.bam.collect { meta, bamfile -> bam(bamfile).getReadsMD5() },
workflow.out.bai.collect { meta, bai -> file(bai).name },
workflow.out.samtools_flagstat,
workflow.out.samtools_stats,
workflow.out.samtools_index_stats,
workflow.out.picard_metrics.collect { meta, metrics -> file(metrics).name },
workflow.out.multiqc.flatten().collect { path -> file(path).name },
workflow.out.versions
).match()
}
)
}
}

test("Sarscov2 fasta - PE - skip deduplication - with GPU parabricks/fq2bam") {

when {
workflow {
"""
input[0] = Channel.of([
[ id:'test', single_end:false ],
[
file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true),
file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true)
]
])
input[1] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)
])
input[2] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)
])
input[3] = BWA_INDEX.out.index
input[4] = true // skip_deduplication
input[5] = true // use_gpu
input[6] = "bam" // output_fmt
input[7] = [[:], [] ] // interval_file
input[8] = [[:], [] ] // known_sites
"""
}
}

then {
assertAll(
{ assert workflow.success },
{ assert snapshot(
workflow.out.bam.collect { meta, bamfile -> bam(bamfile).getReadsMD5() },
workflow.out.bai.collect { meta, bai -> file(bai).name },
workflow.out.samtools_flagstat,
workflow.out.samtools_stats,
workflow.out.samtools_index_stats,
workflow.out.picard_metrics.collect { meta, metrics -> file(metrics).name },
workflow.out.multiqc.flatten().collect { path -> file(path).name },
workflow.out.versions
).match()
}
)
}
}

test("Sarscov2 fasta - SE - skip deduplication - with GPU parabricks/fq2bam - stub") {
options '-stub'
when {
workflow {
"""
input[0] = Channel.of([
[ id:'test', single_end:true ],
file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true)
])
input[1] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true)
])
input[2] = Channel.of([
[:],
file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true)
])
input[3] = BWA_INDEX.out.index
input[4] = false // deduplicate
input[5] = true // use_gpu
input[6] = "bam" // output_fmt
input[7] = [[:], [] ] // interval_file
input[8] = [[:], [] ] // known_sites
"""
}
}

then {
assertAll(
{ assert workflow.success },
{ assert snapshot(
workflow.out,
workflow.out.versions.collect{ path(it).yaml }
).match()
}
)
}
}
}
Loading