From 31ce410c0706f2f617c0db68b49694ca6f7b294e Mon Sep 17 00:00:00 2001 From: jahn Date: Fri, 2 Oct 2026 09:38:08 +0200 Subject: [PATCH 1/3] fix: wire fastplong into workflow as alt to fastp --- workflow/rules/bowtie2.smk | 3 ++- workflow/rules/bwamem2.smk | 3 ++- workflow/rules/common.smk | 18 +++++++++++++++++- workflow/rules/minimap2.smk | 3 ++- workflow/rules/star.smk | 16 ++++++++++++++-- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/workflow/rules/bowtie2.smk b/workflow/rules/bowtie2.smk index 5972de6..8192da9 100644 --- a/workflow/rules/bowtie2.smk +++ b/workflow/rules/bowtie2.smk @@ -25,8 +25,9 @@ rule bowtie2_build: rule bowtie2_align: input: sample=expand( - "results/fastp/{{sample}}_{read}.fastq.gz", + "results/{tool}/{{sample}}_{read}.fastq.gz", read=["read1", "read2"] if is_paired_end() else ["read1"], + tool=config["processing"]["tool"], ), idx=rules.bowtie2_build.output, output: diff --git a/workflow/rules/bwamem2.smk b/workflow/rules/bwamem2.smk index 178e930..3e28efe 100644 --- a/workflow/rules/bwamem2.smk +++ b/workflow/rules/bwamem2.smk @@ -21,8 +21,9 @@ rule bwa_mem2_index: rule bwa_mem2: input: reads=expand( - "results/fastp/{{sample}}_{read}.fastq.gz", + "results/{tool}/{{sample}}_{read}.fastq.gz", read=["read1", "read2"] if is_paired_end() else ["read1"], + tool=config["processing"]["tool"], ), idx=rules.bwa_mem2_index.output, output: diff --git a/workflow/rules/common.smk b/workflow/rules/common.smk index bed5b41..d863186 100644 --- a/workflow/rules/common.smk +++ b/workflow/rules/common.smk @@ -86,8 +86,9 @@ def get_multiqc_input(wildcards): tool=config["mapping"]["tool"], ) result += expand( - "results/fastp/{sample}.json", + "results/{tool}/{sample}.json", sample=samples.index, + tool=config["processing"]["tool"], ) result += expand( "results/rseqc/{tool}/{sample}.txt", @@ -120,3 +121,18 @@ def get_multiqc_input(wildcards): ), ) return result + + +# stop workflow when paired-end reads are used as input for fastplong +if is_paired_end() and config["processing"]["tool"] == "fastplong": + raise SystemExit( + "Error: fastplong cannot be used with paired-end reads in this workflow." + ) + +# trigger warning when paired-end reads are used with minimap2 +if is_paired_end() and config["mapping"]["tool"] == "minimap2": + print( + "WARNING: minimap2 is being used with paired-end reads.\n" + + "This is possible but may require additional parameters to run.\n" + + "Please consult the minimap2 documentation for details." + ) diff --git a/workflow/rules/minimap2.smk b/workflow/rules/minimap2.smk index 8316612..4b0c05e 100644 --- a/workflow/rules/minimap2.smk +++ b/workflow/rules/minimap2.smk @@ -16,8 +16,9 @@ rule minimap2_align: input: target=rules.minimap2_index.output.index, query=expand( - "results/fastp/{{sample}}_{read}.fastq.gz", + "results/{tool}/{{sample}}_{read}.fastq.gz", read=["read1", "read2"] if is_paired_end() else ["read1"], + tool=config["processing"]["tool"], ), output: "results/minimap2/align/{sample}/mapped.bam", diff --git a/workflow/rules/star.smk b/workflow/rules/star.smk index bd74482..0372bd2 100644 --- a/workflow/rules/star.smk +++ b/workflow/rules/star.smk @@ -16,8 +16,20 @@ rule star_index: rule star_align: input: - fq1="results/fastp/{sample}_read1.fastq.gz", - fq2="results/fastp/{sample}_read2.fastq.gz" if is_paired_end() else [], + fq1=expand( + "results/{tool}/{sample}_read1.fastq.gz", + sample=samples.index, + tool=config["processing"]["tool"], + ), + fq2=( + expand( + "results/{tool}/{sample}_read2.fastq.gz", + sample=samples.index, + tool=config["processing"]["tool"], + ) + if is_paired_end() + else [] + ), idx=rules.star_index.output, output: aln="results/star/align/{sample}/mapped.bam", From e2ca17d04e500980a53dd4b4c01bb28843c9cd9c Mon Sep 17 00:00:00 2001 From: jahn Date: Fri, 2 Oct 2026 10:43:53 +0200 Subject: [PATCH 2/3] fix: expose deeptools coverage args, defaults for better performance --- .test/config/config.yml | 2 +- config/config.yml | 2 +- config/schemas/config.schema.yml | 1 + workflow/rules/mapping_stats.smk | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.test/config/config.yml b/.test/config/config.yml index 5cccf41..9d023d4 100644 --- a/.test/config/config.yml +++ b/.test/config/config.yml @@ -60,7 +60,7 @@ mapping_stats: genome_size: 1000 extra: "" deeptools_plotcoverage: - extra: "" + extra: "--numberOfSamples 10000 --skipZeros --coverageThresholds 1" variant_calling: tool: "freebayes" diff --git a/config/config.yml b/config/config.yml index 5cccf41..9d023d4 100644 --- a/config/config.yml +++ b/config/config.yml @@ -60,7 +60,7 @@ mapping_stats: genome_size: 1000 extra: "" deeptools_plotcoverage: - extra: "" + extra: "--numberOfSamples 10000 --skipZeros --coverageThresholds 1" variant_calling: tool: "freebayes" diff --git a/config/schemas/config.schema.yml b/config/schemas/config.schema.yml index f74ca60..f607cda 100644 --- a/config/schemas/config.schema.yml +++ b/config/schemas/config.schema.yml @@ -169,6 +169,7 @@ properties: extra: type: string description: additional arguments to pass to DeepTools plotCoverage + default: "--numberOfSamples 10000 --skipZeros --coverageThresholds 1" required: - gffread - rseqc_infer_experiment diff --git a/workflow/rules/mapping_stats.smk b/workflow/rules/mapping_stats.smk index aadb6f5..0b299fe 100644 --- a/workflow/rules/mapping_stats.smk +++ b/workflow/rules/mapping_stats.smk @@ -111,6 +111,6 @@ rule deeptools_plotcoverage: "results/deeptools/coverage/{sample}_coverage.log", threads: 4 params: - extra="--coverageThresholds 1", + extra=config["mapping_stats"]["deeptools_plotcoverage"]["extra"], wrapper: "v5.6.0/bio/deeptools/plotcoverage" From 76caeccf3a6a34f3563299074138f8ffedee6c5a Mon Sep 17 00:00:00 2001 From: jahn Date: Fri, 2 Oct 2026 13:40:04 +0200 Subject: [PATCH 3/3] fix: review comments --- config/schemas/config.schema.yml | 1 + workflow/rules/common.smk | 14 +++++++++----- workflow/rules/star.smk | 6 ++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/config/schemas/config.schema.yml b/config/schemas/config.schema.yml index f607cda..aa96695 100644 --- a/config/schemas/config.schema.yml +++ b/config/schemas/config.schema.yml @@ -175,6 +175,7 @@ properties: - rseqc_infer_experiment - rseqc_bam_stat - deeptools_coverage + - deeptools_plotcoverage variant_calling: type: object properties: diff --git a/workflow/rules/common.smk b/workflow/rules/common.smk index d863186..e80dc8d 100644 --- a/workflow/rules/common.smk +++ b/workflow/rules/common.smk @@ -1,6 +1,7 @@ # import basic packages import pandas as pd from snakemake.utils import validate +from snakemake.logging import logger from pathlib import Path # read sample sheet @@ -125,14 +126,17 @@ def get_multiqc_input(wildcards): # stop workflow when paired-end reads are used as input for fastplong if is_paired_end() and config["processing"]["tool"] == "fastplong": - raise SystemExit( - "Error: fastplong cannot be used with paired-end reads in this workflow." + config["processing"]["tool"] = "fastp" + logger.warning( + "\nWARNING: fastplong cannot be used with paired-end reads in this workflow.\n" + + "Fastp will be used as a replacement.\n" + + "Please consult the fastplong documentation for details.\n" ) # trigger warning when paired-end reads are used with minimap2 if is_paired_end() and config["mapping"]["tool"] == "minimap2": - print( - "WARNING: minimap2 is being used with paired-end reads.\n" + logger.warning( + "\nWARNING: minimap2 is being used with paired-end reads.\n" + "This is possible but may require additional parameters to run.\n" - + "Please consult the minimap2 documentation for details." + + "Please consult the minimap2 documentation for details.\n" ) diff --git a/workflow/rules/star.smk b/workflow/rules/star.smk index 0372bd2..0c38f5a 100644 --- a/workflow/rules/star.smk +++ b/workflow/rules/star.smk @@ -17,14 +17,12 @@ rule star_index: rule star_align: input: fq1=expand( - "results/{tool}/{sample}_read1.fastq.gz", - sample=samples.index, + "results/{tool}/{{sample}}_read1.fastq.gz", tool=config["processing"]["tool"], ), fq2=( expand( - "results/{tool}/{sample}_read2.fastq.gz", - sample=samples.index, + "results/{tool}/{{sample}}_read2.fastq.gz", tool=config["processing"]["tool"], ) if is_paired_end()