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

时间:2019-11-09 15:49:17

标签: bioinformatics snakemake

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

我的输入文件夹包含以下文件:

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规则之前或之后更改输出名称或重命名文件。

2 个答案:

答案 0 :(得分:1)

尝试一下:

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的编辑。)

答案 1 :(得分:0)

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

我认为核心问题是各个通配符都不是唯一的。同样,并非所有通配符的所有值都可以合并; seq_run1在lane1而不是lane2上运行。因此,expand()不起作用。

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


不起作用的工作原理(但在相同情况下尝试其他人也值得):