Snakemake,如何在使用通配符时更改输出文件名 [英] Snakemake, how to change output filename when using wildcards

查看:16
本文介绍了Snakemake,如何在使用通配符时更改输出文件名的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

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

我的造蛇器代码:

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

这篇关于Snakemake,如何在使用通配符时更改输出文件名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆