Snakemake,使用通配符时如何更改输出文件名

Snakemake, how to change output filename when using wildcards

我想我有一个简单的问题,但我不知道如何解决它。

我的输入文件夹包含这样的文件:

AAAAA_S1_R1_001.fastq
AAAAA_S1_R2_001.fastq
BBBBB_S2_R1_001.fastq
BBBBB_S2_R2_001.fastq

我的 snakemake 代码:

import glob

samples = [os.path.basename(x) for x in sorted(glob.glob("input/*.fastq"))]
name = []
for x in samples:
    if "_R1_" in x:
        name.append(x.split("_R1_")[0])
NAME = name

rule all:
    input:
        expand("output/{sp}_mapped.bam", sp=NAME),

rule bwa:
    input:
        R1 = "input/{sample}_R1_001.fastq",
        R2 = "input/{sample}_R2_001.fastq"
    output:
        mapped = "output/{sample}_mapped.bam"
    params:
        ref = "refs/AF086833.fa"
    run:
        shell("bwa mem {params.ref} {input.R1} {input.R2} | samtools sort > {output.mapped}")

输出文件名是:

AAAAA_S1_mapped.bam
BBBBB_S2_mapped.bam

我希望输出文件为:

AAAAA_mapped.bam
BBBBB_mapped.bam

如何更改输出名称或重命名 bwa 规则之前或之后的文件。

试试这个:

import pathlib

indir = pathlib.Path("input")
paths = indir.glob("*_S?_R?_001.fastq")
samples = set([x.stem.split("_")[0] for x in paths])

rule all:
    input:
        expand("output/{sample}_mapped.bam", sample=samples)


def find_fastqs(wildcards):
    fastqs = [str(x) for x in indir.glob(f"{wildcards.sample}_*.fastq")]
    return sorted(fastqs)


rule bwa:
    input:
        fastqs = find_fastqs
    output:
        mapped = "output/{sample}_mapped.bam"
    params:
        ref = "refs/AF086833.fa"
    shell:
        "bwa mem {params.ref} {input.fastqs} | samtools sort > {output.mapped}"

使用输入函数为 rule bwa 找到正确的样本。可能有更优雅的解决方案,但我现在看不到。不过,我认为这应该可行。

(编辑以反映 OP 的编辑。)

不幸的是,我也遇到过文件名的问题,逻辑如下:{batch}/{seq_run}_{index}_{flowcell}_{lane}_{read_orientation}.fastq.gz.

我认为核心问题是 none 的个别通配符是唯一的。此外,并非所有通配符的所有值都可以组合; seq_run1 在车道 1 上是 运行,而不是车道 2。因此,expand() 不起作用。

在 Snakemake 中多次尝试后(见下文),我的解决方案是使用 mv / sed / rename 标准化输入。删除 {batch}{flowcell}{lane} 可以使用 {sample},这是 {seq_run}{index} 的独特组合。


什么没有起作用(但对于处于相同情况的其他人可能值得尝试):