From 2fda0df5d67a1c8204e1e98e8b3398dee19cab1c Mon Sep 17 00:00:00 2001 From: Jacques Dainat Date: Mon, 23 Feb 2026 17:01:25 +0100 Subject: [PATCH 1/4] add bwa fastalign --- README.md | 14 +++- aline.nf | 115 +++++++++++++++++++++++++++++++-- config/softwares.config | 3 + modules/bash.nf | 55 +++++++++++++++- modules/bwafastalign.nf | 137 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 313 insertions(+), 11 deletions(-) create mode 100644 modules/bwafastalign.nf diff --git a/README.md b/README.md index 0e1d6a0..89b69e5 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,9 @@ You can choose to run one or several aligner in parallel. | bowtie | ✅ | ✅ | ⚠️ | ⚠️ | | bowtie2 | ✅ | ✅ | ⚠️ | ⚠️ | | bwaaln | ✅ | ✅ R1 and R2 independently aligned then merged with bwa sampe | ⚠️ | ⚠️ | +| bwafastalignaln | ✅ | ✅ R1 and R2 independently aligned then merged with bwa sampe | ⚠️ | ⚠️ | +| bwafastalignmem | ✅ | ✅ | ✅ | ✅ | +| bwafastalignsw | ✅ | ✅ | ⚠️ | ⚠️ | | bwamem | ✅ | ✅ | ✅ | ✅ | | bwamem2 | ✅ | ✅ | ✅ | ✅ | | bwasw | ✅ | ✅ | ⚠️ | ⚠️ | @@ -88,6 +91,9 @@ It is then translated to the correct option in the following aligners: | bowtie | --fr / --rf / --ff | ISF ISR IU / OSF OSR OU / MSF MSR MU| read orientation | | bowtie2 | --fr / --rf / --ff | ISF ISR IU / OSF OSR OU / MSF MSR MU| read orientation | | bwaaln | 🚫 | 🚫 | 🚫 | +| bwafastalignaln | 🚫 | 🚫 | 🚫 | +| bwafastalignmem | 🚫 | 🚫 | 🚫 | +| bwafastalignsw | 🚫 | 🚫 | 🚫 | | bwamem | 🚫 | 🚫 | 🚫 | | bwamem2 | 🚫 | 🚫 | 🚫 | | bwasw | 🚫 | 🚫 | 🚫 | @@ -126,6 +132,9 @@ If you provide an annotation file the pipeline will pass automatically the file | bowtie | 🚫 | | bowtie2 | 🚫 | | bwaaln | 🚫 | +| bwafastalignaln | 🚫 | +| bwafastalignmem | 🚫 | +| bwafastalignsw | 🚫 | | bwamem | 🚫 | | bwamem2 | 🚫 | | bwasw | 🚫 | @@ -273,7 +282,7 @@ nextflow run Juke34/AliNe \ --reads https://github.com/Juke34/AliNe/raw/refs/heads/main/test/illumina/yeast_R1.fastq.gz \ --reference https://raw.githubusercontent.com/Juke34/AliNe/refs/heads/main/test/yeast.fa \ --read_type short_single \ - --aligner bbmap,bowtie2,bwaaln,bwamem,bwasw,graphmap2,hisat2,minimap2,ngmlr,nucmer,star,subread,sublong \ + --aligner bbmap,bowtie2,bwaaln,bwafastalignaln,bwafastalignmem,bwafastalignsw,bwamem,bwasw,graphmap2,hisat2,minimap2,ngmlr,nucmer,star,subread,sublong \ --trimming_fastp \ --fastqc \ --samtools_stats \ @@ -337,7 +346,7 @@ On success you should get a message looking like this: control1,path/to/data1.fastq.gz,,auto,short_single,rna control2,path/to/data2_R1.fastq.gz,path/to/data2_R2.fastq.gz,auto,short_paired,rna --reference path to the reference file (fa, fa.gz, fasta or fasta.gz) - --aligner aligner(s) to use among this list (comma or space separated) [bbmap, bowtie, bowtie2, bwaaln, bwamem, bwamem2, bwasw, dragmap, graphmap2, hisat2, kallisto, minimap2, novoalign, nucmer, ngmlr, salmon, star, subread, sublong] + --aligner aligner(s) to use among this list (comma or space separated) [bbmap, bowtie, bowtie2, bwaaln, bwafastalign, bwamem, bwamem2, bwasw, dragmap, graphmap2, hisat2, kallisto, minimap2, novoalign, nucmer, ngmlr, salmon, star, subread, sublong] --outdir path to the output directory (default: alignment_results) --annotation [Optional][used by graphmap2, STAR, subread] Absolute path to the annotation file (gtf or gff3) @@ -364,6 +373,7 @@ On success you should get a message looking like this: --bowtie_options additional options for bowtie --bowtie2_options additional options for bowtie2 --bwaaln_options additional options for bwaaln + --bwafastalign_options additional options for bwafastalign --bwamem_options additional options for bwamem --bwamem2_options additional options for bwamem2 --bwasw_options additional options for bwasw diff --git a/aline.nf b/aline.nf index 4294e5b..bc3da66 100644 --- a/aline.nf +++ b/aline.nf @@ -37,12 +37,15 @@ params.annotation = "" params.trimming_fastp = false // Aligner params -align_tools = [ 'bbmap', 'bowtie', 'bowtie2', 'bwaaln', 'bwamem', 'bwamem2', 'bwasw', 'dragmap', 'graphmap2', 'hisat2', 'kallisto', 'last', 'minimap2', 'novoalign', 'nucmer', 'ngmlr', 'salmon', 'star', 'subread', 'sublong' ] +align_tools = [ 'bbmap', 'bowtie', 'bowtie2', 'bwaaln', 'bwamem', 'bwamem2', 'bwasw', 'bwafastalignaln','bwafastalignmem','bwafastalignsw', 'dragmap', 'graphmap2', 'hisat2', 'kallisto', 'last', 'minimap2', 'novoalign', 'nucmer', 'ngmlr', 'salmon', 'star', 'subread', 'sublong' ] params.aligner = '' params.bbmap_options = '' params.bowtie_options = '' params.bowtie2_options = '' params.bwaaln_options = '' +params.bwafastalignaln_options = '' +params.bwafastalignmem_options = '' +params.bwafastalignsw_options = '' params.bwamem_options = '' params.bwamem2_options = '' params.bwasw_options = '' @@ -270,6 +273,7 @@ include {bbmap_index; bbmap} from "$baseDir/modules/bbmap.nf" include {bowtie_index; bowtie} from "$baseDir/modules/bowtie.nf" include {bowtie2_index; bowtie2} from "$baseDir/modules/bowtie2.nf" include {bwa_index; bwaaln; bwamem; bwasw} from "$baseDir/modules/bwa.nf" +include {bwafastalign_index; bwafastalignaln; bwafastalignmem; bwafastalignsw} from "$baseDir/modules/bwafastalign.nf" include {bwamem2_index; bwamem2} from "$baseDir/modules/bwamem2.nf" include {dragmap_index; dragmap} from "$baseDir/modules/dragmap.nf" include {seqkit_convert; seqkit_clean_fasta_headers} from "$baseDir/modules/seqkit.nf" @@ -277,7 +281,8 @@ include {graphmap2_index; graphmap2} from "$baseDir/modules/graphmap2.nf" include {fastp} from "$baseDir/modules/fastp.nf" include {fastqc as fastqc_raw; fastqc as fastqc_fastp} from "$baseDir/modules/fastqc.nf" include {fastqc_ali as fastqc_ali_bbmap; fastqc_ali as fastqc_ali_bowtie ; fastqc_ali as fastqc_ali_bowtie2 ; - fastqc_ali as fastqc_ali_bwaaln; fastqc_ali as fastqc_ali_bwamem; fastqc_ali as fastqc_ali_bwamem2; fastqc_ali as fastqc_ali_bwasw; fastqc_ali as fastqc_ali_dragmap; fastqc_ali as fastqc_ali_graphmap2 ; + fastqc_ali as fastqc_ali_bwaaln; fastqc_ali as fastqc_ali_bwamem; fastqc_ali as fastqc_ali_bwamem2; fastqc_ali as fastqc_ali_bwasw; fastqc_ali as fastqc_ali_bwafastalignaln; + fastqc_ali as fastqc_ali_bwafastalignmem; fastqc_ali as fastqc_ali_bwafastalignsw; fastqc_ali as fastqc_ali_dragmap; fastqc_ali as fastqc_ali_graphmap2 ; fastqc_ali as fastqc_ali_hisat2; fastqc_ali as fastqc_ali_kallisto; fastqc_ali as fastqc_ali_last; fastqc_ali as fastqc_ali_minimap2; fastqc_ali as fastqc_ali_ngmlr; fastqc_ali as fastqc_ali_novoalign ; fastqc_ali as fastqc_ali_nucmer; fastqc_ali as fastqc_ali_salmon; fastqc_ali as fastqc_ali_star; fastqc_ali as fastqc_ali_subread ; fastqc_ali as fastqc_ali_sublong } from "$baseDir/modules/fastqc.nf" @@ -294,25 +299,29 @@ include {r_rendering} from "$baseDir/modules/r.nf" include {salmon_index; salmon_guess_lib; salmon} from "$baseDir/modules/salmon.nf" include {samtools_sam2bam_nucmer; samtools_sam2bam as samtools_sam2bam_bowtie; samtools_sam2bam as samtools_sam2bam_bowtie2; samtools_sam2bam as samtools_sam2bam_bwaaln; samtools_sam2bam as samtools_sam2bam_bwamem; samtools_sam2bam as samtools_sam2bam_bwamem2; - samtools_sam2bam as samtools_sam2bam_bwasw; samtools_sam2bam as samtools_sam2bam_dragmap; samtools_sam2bam as samtools_sam2bam_graphmap2; samtools_sam2bam as samtools_sam2bam_hisat2; + samtools_sam2bam as samtools_sam2bam_bwasw; samtools_sam2bam as samtools_sam2bam_bwafastalignaln; samtools_sam2bam as samtools_sam2bam_bwafastalignmem; + samtools_sam2bam as samtools_sam2bam_bwafastalignsw; samtools_sam2bam as samtools_sam2bam_dragmap; samtools_sam2bam as samtools_sam2bam_graphmap2; samtools_sam2bam as samtools_sam2bam_hisat2; samtools_sam2bam as samtools_sam2bam_last; samtools_sam2bam as samtools_sam2bam_minimap2; samtools_sam2bam as samtools_sam2bam_ngmlr; samtools_sam2bam as samtools_sam2bam_novoalign; samtools_sam2bam as samtools_sam2bam_salmon } from "$baseDir/modules/samtools.nf" include {samtools_bam2cram as samtools_bam2cram_star; samtools_bam2cram as samtools_bam2cram_subread} from "$baseDir/modules/samtools.nf" include {samtools_view_filter as samtools_view_filter_star; samtools_view_filter as samtools_view_filter_subread} from "$baseDir/modules/samtools.nf" include {samtools_sort as samtools_sort_bbmap; samtools_sort as samtools_sort_bowtie; samtools_sort as samtools_sort_bowtie2; samtools_sort as samtools_sort_bwaaln; - samtools_sort as samtools_sort_bwamem; samtools_sort as samtools_sort_bwamem2; samtools_sort as samtools_sort_bwasw; samtools_sort as samtools_sort_dragmap; samtools_sort as samtools_sort_graphmap2; + samtools_sort as samtools_sort_bwamem; samtools_sort as samtools_sort_bwamem2; samtools_sort as samtools_sort_bwasw; samtools_sort as samtools_sort_bwafastalignaln; + samtools_sort as samtools_sort_bwafastalignmem; samtools_sort as samtools_sort_bwafastalignsw; samtools_sort as samtools_sort_dragmap; samtools_sort as samtools_sort_graphmap2; samtools_sort as samtools_sort_hisat2; samtools_sort as samtools_sort_kallisto; samtools_sort as samtools_sort_last; samtools_sort as samtools_sort_minimap2; samtools_sort as samtools_sort_ngmlr; samtools_sort as samtools_sort_novoalign; samtools_sort as samtools_sort_nucmer; samtools_sort as samtools_sort_salmon; samtools_sort as samtools_sort_sublong; } from "$baseDir/modules/samtools.nf" include {samtools_stats as samtools_stats_ali_bbmap; samtools_stats as samtools_stats_ali_bowtie; samtools_stats as samtools_stats_ali_bowtie2 ; samtools_stats as samtools_stats_ali_bwaaln; samtools_stats as samtools_stats_ali_bwamem; samtools_stats as samtools_stats_ali_bwamem2; - samtools_stats as samtools_stats_ali_bwasw; samtools_stats as samtools_stats_ali_dragmap; samtools_stats as samtools_stats_ali_graphmap2; samtools_stats as samtools_stats_ali_hisat2; + samtools_stats as samtools_stats_ali_bwasw; samtools_stats as samtools_stats_ali_bwafastalignaln; samtools_stats as samtools_stats_ali_bwafastalignmem; + samtools_stats as samtools_stats_ali_bwafastalignsw; samtools_stats as samtools_stats_ali_dragmap; samtools_stats as samtools_stats_ali_graphmap2; samtools_stats as samtools_stats_ali_hisat2; samtools_stats as samtools_stats_ali_kallisto; samtools_stats as samtools_stats_ali_last; samtools_stats as samtools_stats_ali_minimap2; samtools_stats as samtools_stats_ali_ngmlr; samtools_stats as samtools_stats_ali_novoalign ; samtools_stats as samtools_stats_ali_nucmer; samtools_stats as samtools_stats_ali_salmon; samtools_stats as samtools_stats_ali_star; samtools_stats as samtools_stats_ali_subread; samtools_stats as samtools_stats_ali_sublong } from "$baseDir/modules/samtools.nf" include {samtools_merge_bam_if_paired} from "$baseDir/modules/samtools.nf" include {samtools_index as samtools_index_bbmap; samtools_index as samtools_index_bowtie; samtools_index as samtools_index_bowtie2; samtools_index as samtools_index_bwaaln; - samtools_index as samtools_index_bwamem; samtools_index as samtools_index_bwamem2; samtools_index as samtools_index_bwasw; samtools_index as samtools_index_dragmap; samtools_index as samtools_index_graphmap2; + samtools_index as samtools_index_bwamem; samtools_index as samtools_index_bwamem2; samtools_index as samtools_index_bwasw; samtools_index as samtools_index_bwafastalignaln; + samtools_index as samtools_index_bwafastalignmem; samtools_index as samtools_index_bwafastalignsw; samtools_index as samtools_index_dragmap; samtools_index as samtools_index_graphmap2; samtools_index as samtools_index_hisat2; samtools_index as samtools_index_kallisto; samtools_index as samtools_index_last; samtools_index as samtools_index_minimap2; samtools_index as samtools_index_ngmlr; samtools_index as samtools_index_novoalign; samtools_index as samtools_index_nucmer; samtools_index as samtools_index_salmon; samtools_index as samtools_index_star; samtools_index as samtools_index_subread; samtools_index as samtools_index_sublong} from "$baseDir/modules/samtools.nf" @@ -886,7 +895,7 @@ workflow { } } - // ------------------- BWA ALN/MEM/SW ----------------- + // ------------------- BWA ALN/MEM/SW/FASTALIGN ----------------- if ("bwaaln" in aligner_list || "bwamem" in aligner_list || "bwasw" in aligner_list){ // index bwa_index(reference.collect(), "alignment/bwa/indicies") @@ -960,6 +969,80 @@ workflow { } } } + // ------------------- BWAFASTALIGN ALN/MEM/SW/FASTALIGN ----------------- + if ("bwafastalignaln" in aligner_list || "bwafastalignmem" in aligner_list || "bwafastalignsw" in aligner_list){ + // index + bwafastalign_index(reference.collect(), "alignment/bwafastalign/indicies") + if ("bwafastalignaln" in aligner_list){ + // align + bwafastalignaln(reads, reference.collect(), bwafastalign_index.out.collect(), "alignment/bwafastalign/bwafastalignaln") + logs.concat(bwafastalignaln.out.bwafastalignaln_summary).set{logs} // save log + // convert sam to bam + samtools_sam2bam_bwafastalignaln(bwafastalignaln.out.tuple_sample_sam) + // sort and convert to cram + samtools_sort_bwafastalignaln(samtools_sam2bam_bwafastalignaln.out.tuple_sample_bam, reference.collect()) + // index + samtools_index_bwafastalignaln(samtools_sort_bwafastalignaln.out, "alignment/bwafastalign/bwafastalignaln") + samtools_index_bwafastalignaln.out.tuple_sample_ali.set{bwafastalignaln_ali} // set name + // save aligned reads + sorted_ali.concat(bwafastalignaln_ali).set{sorted_ali} + // stat on aligned reads + if(params.fastqc && !params.cram){ + fastqc_ali_bwafastalignaln(bwafastalignaln_ali, "fastqc/bwafastalignaln", "bwafastalignaln") + logs.concat(fastqc_ali_bwafastalignaln.out).set{logs} // save log + } + if(params.samtools_stats){ + samtools_stats_ali_bwafastalignaln(bwafastalignaln_ali, reference.collect(), "samtools_stats/bwafastalignaln", "bwafastalignaln") + logs.concat(samtools_stats_ali_bwafastalignaln.out).set{logs} // save log + } + } + if ("bwafastalignmem" in aligner_list){ + // align + bwafastalignmem(reads, reference.collect(), bwafastalign_index.out.collect(), "alignment/bwafastalign/bwafastalignmem") + logs.concat(bwafastalignmem.out.bwafastalignmem_summary).set{logs} // save log + // convert sam to bam + samtools_sam2bam_bwafastalignmem(bwafastalignmem.out.tuple_sample_sam) + // sort and convert to cram + samtools_sort_bwafastalignmem(samtools_sam2bam_bwafastalignmem.out.tuple_sample_bam, reference.collect()) + // index + samtools_index_bwafastalignmem(samtools_sort_bwafastalignmem.out, "alignment/bwafastalign/bwafastalignmem") + samtools_index_bwafastalignmem.out.tuple_sample_ali.set{bwafastalignmem_ali} // set name + // save aligned reads + sorted_ali.concat(bwafastalignmem_ali).set{sorted_ali} + // stat on aligned reads + if(params.fastqc && !params.cram){ + fastqc_ali_bwafastalignmem(bwafastalignmem_ali, "fastqc/bwafastalignmem", "bwafastalignmem") + logs.concat(fastqc_ali_bwafastalignmem.out).set{logs} // save log + } + if(params.samtools_stats){ + samtools_stats_ali_bwafastalignmem(bwafastalignmem_ali, reference.collect(), "samtools_stats/bwafastalignmem", "bwafastalignmem") + logs.concat(samtools_stats_ali_bwafastalignmem.out).set{logs} // save log + } + } + if ("bwafastalignsw" in aligner_list){ + // align + bwafastalignsw(reads, reference.collect(), bwafastalign_index.out.collect(), "alignment/bwafastalign/bwafastalignsw") + logs.concat(bwafastalignsw.out.bwafastalignsw_summary).set{logs} // save log + // convert sam to bam + samtools_sam2bam_bwafastalignsw(bwafastalignsw.out.tuple_sample_sam) + // sort and convert to cram + samtools_sort_bwafastalignsw(samtools_sam2bam_bwafastalignsw.out.tuple_sample_bam, reference.collect()) + // index + samtools_index_bwafastalignsw(samtools_sort_bwafastalignsw.out, "alignment/bwafastalign/bwafastalignsw") + samtools_index_bwafastalignsw.out.tuple_sample_ali.set{bwafastalignsw_ali} // set name + // save aligned reads + sorted_ali.concat(bwafastalignsw_ali).set{sorted_ali} + // stat on aligned reads + if(params.fastqc && !params.cram){ + fastqc_ali_bwafastalignsw(bwafastalignsw_ali, "fastqc/bwafastalignsw", "bwafastalignsw") + logs.concat(fastqc_ali_bwafastalignsw.out).set{logs} // save log + } + if(params.samtools_stats){ + samtools_stats_ali_bwafastalignsw(bwafastalignsw_ali, reference.collect(), "samtools_stats/bwafastalignsw", "bwafastalignsw") + logs.concat(samtools_stats_ali_bwafastalignsw.out).set{logs} // save log + } + } + } // ------------------- BWA MEM2 ----------------- if ("bwamem2" in aligner_list){ @@ -1451,6 +1534,9 @@ def helpMSG() { --bowtie_options additional options for bowtie --bowtie2_options additional options for bowtie2 --bwaaln_options additional options for bwaaln + --bwafastalignaln_options additional options for bwafastalignaln + --bwafastalignmem_options additional options for bwafastalignmem + --bwafastalignsw_options additional options for bwafastalignsw --bwamem_options additional options for bwamem --bwamem2_options additional options for bwamem2 --bwasw_options additional options for bwasw @@ -1517,6 +1603,21 @@ def printAlignerOptions(aligner_list) { bwasw parameters bwasw_options : ${params.bwasw_options} """} + if ("bwafastalignmem" in aligner_list){ + sentence += """ + bwafastalignmem parameters + bwafastalignmem_options : ${params.bwafastalignmem_options} + """} + if ("bwafastalignaln" in aligner_list){ + sentence += """ + bwafastalignaln parameters + bwafastalignaln_options : ${params.bwafastalignaln_options} + """} + if ("bwafastalign" in aligner_list){ + sentence += """ + bwafastalignsw parameters + bwafastalignsw_options : ${params.bwafastalignsw_options} + """} if ("dragmap" in aligner_list){ sentence += """ dragmap parameters diff --git a/config/softwares.config b/config/softwares.config index 2b568cf..bbf72d6 100644 --- a/config/softwares.config +++ b/config/softwares.config @@ -17,6 +17,9 @@ process { withLabel: 'bwamem2' { container = 'quay.io/biocontainers/bwa-mem2:2.2.1--he70b90d_8' } + withLabel: 'bwafastalign' { + container = 'quay.io/biocontainers/bwa-fastalign:1.0.0--hb7acf71_0' + } withLabel: 'dragmap' { container = 'quay.io/biocontainers/dragmap:1.3.0--h5ca1c30_7' } diff --git a/modules/bash.nf b/modules/bash.nf index c84a985..dd30c62 100644 --- a/modules/bash.nf +++ b/modules/bash.nf @@ -66,20 +66,30 @@ process check_aligner{ } } + // --- bwa fastalign aln tool --- + if ( "bwafastalignaln" in aligner_list ){ + if ( meta.read_type == "pacbio" || meta.read_type == "ont"){ + log.info "${meta.uid} => Bwafastalignaln aligner is not recommended to align long reads!" + } + } // --- bwa mem tool --- if ( "bwamem" in aligner_list ){ // short and long reads ok } + // --- bwa fastalign mem tool --- + if ( "bwafastalignmem" in aligner_list ){ + // short and long reads ok + } + // --- bwa mem2 tool --- if ("bwamem2" in aligner_list ){ if ( meta.read_type == "pacbio" || meta.read_type == "ont"){ log.info "${meta.uid} => Bwamem2 aligner is not recommended to align long reads!" } } - - + // --- bwa sw tool --- if ( "bwasw" in aligner_list ){ if (meta.read_type == "pacbio" || meta.read_type == "ont"){ @@ -87,6 +97,13 @@ process check_aligner{ } } + // --- bwa fastalign sw tool --- + if ( "bwafastalignsw" in aligner_list ){ + if (meta.read_type == "pacbio" || meta.read_type == "ont"){ + log.info "${meta.uid} => Bwafastalignsw aligner is not recommended to align long reads!" + } + } + // --- dragmap tool --- if ( "dragmap" in aligner_list ){ if (meta.read_type == "pacbio" || meta.read_type == "ont"){ @@ -336,6 +353,40 @@ process check_aligner_params{ meta.bwasw_options = bwasw_options } + // --- bwa fastalign aln tool --- + if ( "bwafastalignaln" in aligner_list ){ + def bwafastalignaln_options = params.bwafastalignaln_options ?: "" + meta.bwafastalignaln_options = bwafastalignaln_options + } + + // --- bwa fastalign mem tool --- + if ( "bwafastalignmem" in aligner_list ){ + def bwafastalignmem_options = params.bwafastalignmem_options ?: "" + if( !params.relax ){ + if (meta.read_type == "pacbio"){ + if ( ! bwafastalignmem_options.contains(" pacbio") ){ + bwafastalignmem_options += " -x pacbio" + log.info "${meta.uid} => Pacbio reads being used, setting -x pacbio to bwafastalignmem!\n" + + " However, if you know what you are doing you can activate the AliNe --relax parameter and avoid this behavior." + } + } + if (meta.read_type == "ont"){ + if ( ! bwafastalignmem_options.contains(" ont2d") ){ + bwafastalignmem_options += " -x ont2d" + log.info "${meta.uid} => Ont reads being used, setting -x ont2d to bwafastalignmem!\n" + + " However, if you know what you are doing you can activate the AliNe --relax parameter and avoid this behavior." + } + } + } + meta.bwafastalignmem_options = bwafastalignmem_options + } + + // --- bwa fastalign sw tool --- + if ( "bwafastalignsw" in aligner_list ){ + def bwafastalignsw_options = params.bwafastalignsw_options ?: "" + meta.bwafastalignsw_options = bwafastalignsw_options + } + // --- dragmap tool --- if ( "dragmap" in aligner_list ){ def dragmap_options = params.dragmap_options ?: "" diff --git a/modules/bwafastalign.nf b/modules/bwafastalign.nf new file mode 100644 index 0000000..201c3e5 --- /dev/null +++ b/modules/bwafastalign.nf @@ -0,0 +1,137 @@ +/* +* To align with BWA-fastalign +* The index used must be the basename of the genome reference file +*/ + +process bwafastalign_index { + label 'bwafastalign' + tag "$genome_fasta" + publishDir "${params.outdir}/${outpath}", mode: 'copy' + + input: + path(genome_fasta) + val outpath + + output: + path("*") + + script: + """ + bwa-fastalign index $genome_fasta -p ${genome_fasta.baseName} + """ +} + +/* +* To align with BWA FASTALIGN ALN +* The index used must be the basename of the genome reference file +*/ +process bwafastalignaln { + label 'bwafastalign' + tag "${meta.uid}" + publishDir "${params.outdir}/${outpath}", pattern: "*_sam.log", mode: 'copy' + + input: + tuple val(meta), path(reads) + path genome + path bwafastalign_index_files + val outpath + + output: + tuple val(meta), path ("*.sam"), emit: tuple_sample_sam + path "*_sam.log", emit: bwafastalignaln_summary + + script: + // options for bwafastalign-aln + def bwafastalignaln_options = meta.bwafastalignaln_options ?: "" + + // catch output file prefix + def fileName = meta.uid + meta.suffix + "_bwafastalignaln" + + if (meta.paired){ + """ + bwa-fastalign aln ${bwafastalignaln_options} -t ${task.cpus} ${genome.baseName} ${reads[0]} > ${reads[0].baseName}_r1.sai 2> ${reads[0].baseName}_r1_sai.log + bwa-fastalign aln ${bwafastalignaln_options} -t ${task.cpus} ${genome.baseName} ${reads[1]} > ${reads[1].baseName}_r2.sai 2> ${reads[1].baseName}_r2_sai.log + bwa-fastalign sampe ${genome.baseName} ${reads[0].baseName}_r1.sai ${reads[1].baseName}_r2.sai ${reads[0]} ${reads[1]} > ${fileName}.sam 2> ${fileName}_sam.log + + """ + } else { + """ + bwa-fastalign aln ${bwafastalignaln_options} -t ${task.cpus} ${genome.baseName} ${reads} > ${fileName}.sai 2> ${fileName}_sai.log + bwa-fastalign samse ${genome.baseName} ${fileName}.sai ${reads} > ${fileName}.sam 2> ${fileName}_sam.log + """ + } +} + +/* +* To align with BWA FASTALIGN MEM +* The index used must be the basename of the genome reference file +*/ +process bwafastalignmem { + label 'bwafastalign' + tag "${meta.uid}" + publishDir "${params.outdir}/${outpath}", pattern: "*bwafastalign.log", mode: 'copy' + + input: + tuple val(meta), path(reads) + path genome + path bwafastalign_index_files + val outpath + + output: + tuple val(meta), path ("*.sam"), emit: tuple_sample_sam + path "*.log", emit: bwafastalignmem_summary + + script: + // options for bwafastalign-mem + def bwafastalignmem_options = meta.bwafastalignmem_options ?: "" + + // catch output file prefix + def fileName = meta.uid + meta.suffix + "_bwafastalignmem" + + if (meta.paired){ + """ + bwa-fastalign mem ${bwafastalignmem_options} -t ${task.cpus} ${genome.baseName} ${reads[0]} ${reads[1]} > ${fileName}.sam 2> ${fileName}.log + """ + } else { + """ + bwa-fastalign mem ${bwafastalignmem_options} -t ${task.cpus} ${genome.baseName} ${reads} > ${fileName}.sam 2> ${fileName}.log + """ + } +} + +/* +* To align with BWA FASTALIGN MEM +* The index used must be the basename of the genome reference file +*/ +process bwafastalignsw { + label 'bwafastalign' + tag "${meta.uid}" + publishDir "${params.outdir}/${outpath}", pattern: "*.log", mode: 'copy' + + input: + tuple val(meta), path(reads) + path genome + path bwafastalign_index_files + val outpath + + output: + tuple val(meta), path ("*.sam"), emit: tuple_sample_sam + path "*.log", emit: bwafastalignsw_summary + + script: + // options for bwafastalign-mem + def bwafastalignsw_options = meta.bwafastalignsw_options ?: "" + + // catch output file prefix + def fileName = meta.uid + meta.suffix + "_bwafastalignsw" + + if (meta.paired){ + """ + bwa-fastalign bwasw ${bwafastalignsw_options} -t ${task.cpus} ${genome.baseName} ${reads[0]} ${reads[1]} > ${fileName}.sam 2> ${fileName}.log + """ + } else { + """ + bwa-fastalign bwasw ${bwafastalignsw_options} -t ${task.cpus} ${genome.baseName} ${reads} > ${fileName}.sam 2> ${fileName}.log + """ + } +} \ No newline at end of file From f80a3c77e7230183e17f61422d3fb3c2c98df1f7 Mon Sep 17 00:00:00 2001 From: Jacques Dainat Date: Tue, 24 Feb 2026 08:44:24 +0100 Subject: [PATCH 2/4] add test in CI --- .github/workflows/main.yml | 2 ++ README.md | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 9bf9c36..e79dffa 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,6 +57,8 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 # Run tests sequentialy + - name: test short single_fastalign + run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf --aligner bwafastalignaln,bwafastalignmem,bwafastalignsw - name: test short single run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf - name: test short single cram diff --git a/README.md b/README.md index 89b69e5..72fabd2 100644 --- a/README.md +++ b/README.md @@ -373,7 +373,9 @@ On success you should get a message looking like this: --bowtie_options additional options for bowtie --bowtie2_options additional options for bowtie2 --bwaaln_options additional options for bwaaln - --bwafastalign_options additional options for bwafastalign + --bwafastalignaln_options additional options for bwafastalignaln + --bwafastalignmem_options additional options for bwafastalignmem + --bwafastalignsw_options additional options for bwafastalignsw --bwamem_options additional options for bwamem --bwamem2_options additional options for bwamem2 --bwasw_options additional options for bwasw From 7503b4d474174cafa666db6357b0586ae594534a Mon Sep 17 00:00:00 2001 From: Jacques Dainat Date: Tue, 24 Feb 2026 09:40:37 +0100 Subject: [PATCH 3/4] Update test command to use bwafastalignmem only --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e79dffa..c549157 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -58,7 +58,7 @@ jobs: - uses: actions/checkout@v3 # Run tests sequentialy - name: test short single_fastalign - run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf --aligner bwafastalignaln,bwafastalignmem,bwafastalignsw + run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf --aligner bwafastalignmem - name: test short single run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf - name: test short single cram @@ -72,4 +72,4 @@ jobs: - name: test csv run: nextflow run -ansi-log -profile docker,test_csv aline.nf - name: test remote - run: nextflow run -ansi-log -profile docker,test_remote aline.nf \ No newline at end of file + run: nextflow run -ansi-log -profile docker,test_remote aline.nf From e5ef6f5c62aa812282b23b62599970e58108f55f Mon Sep 17 00:00:00 2001 From: Jacques Dainat Date: Wed, 25 Feb 2026 11:02:02 +0100 Subject: [PATCH 4/4] use of bwafastalignmem onlyn sw and aln seems to be bug https://github.com/zzhofict/BWA-FastAlign/issues/6 --- .github/workflows/main.yml | 2 -- README.md | 10 +--------- aline.nf | 4 +--- profiles/test_illumina_single.config | 2 +- 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index e79dffa..9bf9c36 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,8 +57,6 @@ jobs: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v3 # Run tests sequentialy - - name: test short single_fastalign - run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf --aligner bwafastalignaln,bwafastalignmem,bwafastalignsw - name: test short single run: nextflow run -ansi-log -profile docker,test_illumina_single aline.nf - name: test short single cram diff --git a/README.md b/README.md index 72fabd2..1e3cc60 100644 --- a/README.md +++ b/README.md @@ -52,9 +52,7 @@ You can choose to run one or several aligner in parallel. | bowtie | ✅ | ✅ | ⚠️ | ⚠️ | | bowtie2 | ✅ | ✅ | ⚠️ | ⚠️ | | bwaaln | ✅ | ✅ R1 and R2 independently aligned then merged with bwa sampe | ⚠️ | ⚠️ | -| bwafastalignaln | ✅ | ✅ R1 and R2 independently aligned then merged with bwa sampe | ⚠️ | ⚠️ | | bwafastalignmem | ✅ | ✅ | ✅ | ✅ | -| bwafastalignsw | ✅ | ✅ | ⚠️ | ⚠️ | | bwamem | ✅ | ✅ | ✅ | ✅ | | bwamem2 | ✅ | ✅ | ✅ | ✅ | | bwasw | ✅ | ✅ | ⚠️ | ⚠️ | @@ -91,9 +89,7 @@ It is then translated to the correct option in the following aligners: | bowtie | --fr / --rf / --ff | ISF ISR IU / OSF OSR OU / MSF MSR MU| read orientation | | bowtie2 | --fr / --rf / --ff | ISF ISR IU / OSF OSR OU / MSF MSR MU| read orientation | | bwaaln | 🚫 | 🚫 | 🚫 | -| bwafastalignaln | 🚫 | 🚫 | 🚫 | | bwafastalignmem | 🚫 | 🚫 | 🚫 | -| bwafastalignsw | 🚫 | 🚫 | 🚫 | | bwamem | 🚫 | 🚫 | 🚫 | | bwamem2 | 🚫 | 🚫 | 🚫 | | bwasw | 🚫 | 🚫 | 🚫 | @@ -132,9 +128,7 @@ If you provide an annotation file the pipeline will pass automatically the file | bowtie | 🚫 | | bowtie2 | 🚫 | | bwaaln | 🚫 | -| bwafastalignaln | 🚫 | | bwafastalignmem | 🚫 | -| bwafastalignsw | 🚫 | | bwamem | 🚫 | | bwamem2 | 🚫 | | bwasw | 🚫 | @@ -346,7 +340,7 @@ On success you should get a message looking like this: control1,path/to/data1.fastq.gz,,auto,short_single,rna control2,path/to/data2_R1.fastq.gz,path/to/data2_R2.fastq.gz,auto,short_paired,rna --reference path to the reference file (fa, fa.gz, fasta or fasta.gz) - --aligner aligner(s) to use among this list (comma or space separated) [bbmap, bowtie, bowtie2, bwaaln, bwafastalign, bwamem, bwamem2, bwasw, dragmap, graphmap2, hisat2, kallisto, minimap2, novoalign, nucmer, ngmlr, salmon, star, subread, sublong] + --aligner aligner(s) to use among this list (comma or space separated) [bbmap, bowtie, bowtie2, bwaaln, bwafastalignmem, bwamem, bwamem2, bwasw, dragmap, graphmap2, hisat2, kallisto, minimap2, novoalign, nucmer, ngmlr, salmon, star, subread, sublong] --outdir path to the output directory (default: alignment_results) --annotation [Optional][used by graphmap2, STAR, subread] Absolute path to the annotation file (gtf or gff3) @@ -373,9 +367,7 @@ On success you should get a message looking like this: --bowtie_options additional options for bowtie --bowtie2_options additional options for bowtie2 --bwaaln_options additional options for bwaaln - --bwafastalignaln_options additional options for bwafastalignaln --bwafastalignmem_options additional options for bwafastalignmem - --bwafastalignsw_options additional options for bwafastalignsw --bwamem_options additional options for bwamem --bwamem2_options additional options for bwamem2 --bwasw_options additional options for bwasw diff --git a/aline.nf b/aline.nf index bc3da66..d574dac 100644 --- a/aline.nf +++ b/aline.nf @@ -37,7 +37,7 @@ params.annotation = "" params.trimming_fastp = false // Aligner params -align_tools = [ 'bbmap', 'bowtie', 'bowtie2', 'bwaaln', 'bwamem', 'bwamem2', 'bwasw', 'bwafastalignaln','bwafastalignmem','bwafastalignsw', 'dragmap', 'graphmap2', 'hisat2', 'kallisto', 'last', 'minimap2', 'novoalign', 'nucmer', 'ngmlr', 'salmon', 'star', 'subread', 'sublong' ] +align_tools = [ 'bbmap', 'bowtie', 'bowtie2', 'bwaaln', 'bwamem', 'bwamem2', 'bwasw', 'bwafastalignmem', 'dragmap', 'graphmap2', 'hisat2', 'kallisto', 'last', 'minimap2', 'novoalign', 'nucmer', 'ngmlr', 'salmon', 'star', 'subread', 'sublong' ] params.aligner = '' params.bbmap_options = '' params.bowtie_options = '' @@ -1534,9 +1534,7 @@ def helpMSG() { --bowtie_options additional options for bowtie --bowtie2_options additional options for bowtie2 --bwaaln_options additional options for bwaaln - --bwafastalignaln_options additional options for bwafastalignaln --bwafastalignmem_options additional options for bwafastalignmem - --bwafastalignsw_options additional options for bwafastalignsw --bwamem_options additional options for bwamem --bwamem2_options additional options for bwamem2 --bwasw_options additional options for bwasw diff --git a/profiles/test_illumina_single.config b/profiles/test_illumina_single.config index a947ca1..d486bd2 100644 --- a/profiles/test_illumina_single.config +++ b/profiles/test_illumina_single.config @@ -11,7 +11,7 @@ params { annotation = "$baseDir/test/yeast.gtf" data_type = "RNA" read_type = "short_single" - aligner = 'bbmap,bowtie,bowtie2,bwaaln,bwamem,bwamem2,bwasw,graphmap2,hisat2,kallisto,last,minimap2,ngmlr,nucmer,salmon,star,subread,sublong' + aligner = 'bbmap,bowtie,bowtie2,bwaaln,bwamem,bwafastalignmem,bwamem2,bwasw,graphmap2,hisat2,kallisto,last,minimap2,ngmlr,nucmer,salmon,star,subread,sublong' trimming_fastp = true fastqc = true samtools_stats = true