如何在输入和输出中正确使用通配符

时间:2019-08-27 13:38:11

标签: snakemake

我最近决定从snakemake开始。无论是在堆栈上还是在蛇形文档上,我都找不到适合我需要的东西。我觉得我听不懂,可能需要一些解释。

我正在尝试制作一个简单的snakemake工作流程,将其作为输入,一个fastq文件和一个测序摘要文件(其中包含有关读取的信息),并将快速文件中的读取内容过滤为多个文件(low.fastq和high .fastq)。

我要执行的输入数据和我的Snakefile是这样存储的:

.
├── data
│   ├── sequencing-summary-example.txt 
│   └── tiny-example.fastq 
├── Snakefile
└── split_fastq

这是我到目前为止所尝试的:

*imports*
rule targets:
    input:
        "split_fastq/low.fastq",
        "split_fastq/high.fastq"

rule split_fastq:
    input:
        "data/{reads}.fastq",
        "data/{seqsum}.txt"
    output:
        "split_fastq/low.fastq",
        "split_fastq/high.fastq"
    run:
        * do the thing *

我希望目录“ split_fastq”充满“ low”和“ high” fastq。但是相反,我得到了错误:

Building DAG of jobs...
WildcardError in line 10 of /work/sbsuser/test/roxane/alignement-ont/Snakefile:
Wildcards in input files cannot be determined from output files:
'reads'

即使这似乎是一个非常普遍的错误,我也不知道我是否不知道如何使用通配符或是否存在其他问题。我在正确使用“输入”和“输出”吗?

1 个答案:

答案 0 :(得分:3)

问题是输入中有通配符,但输出中没有通配符。输出中需要通配符。这样考虑一下,将通配符放入输入中,就可以创建一条规则,打算在许多不同的fastq文件上单独运行该规则。但是,对于每个不同的fastq文件,该规则的输出文件将完全相同。他们会互相覆盖!您希望将通配符合并到输出文件中,以便为每个可能的输入获得唯一的文件,例如:

rule split_fastq:
    input:
        "data/{reads}.fastq",
        "data/{seqsum}.txt"
    output:
        "split_fastq/{reads}.low.fastq",
        "split_fastq/{reads}.high.fastq"
    run:
        * do the thing *

现在以tiny-example.fastq作为输入,您将得到tiny-example.low.fastqtiny-example.high.fastq作为输出。而且,如果添加第二个fastq文件,您将获得该文件的不同的高低输出文件。但是该规则仍然无效,因为“ seqsum”通配符也不是输出的一部分。在这种情况下,您可能需要做的是让sequence-summary-example.txt合并fastq文件的名称,例如,将其命名为sequence-summary-tiny-example.txt。现在,您可以像这样制定规则:

rule split_fastq:
    input:
        "data/{reads}.fastq",
        "data/sequence-summary-{reads}.txt"
    output:
        "split_fastq/{reads}.low.fastq",
        "split_fastq/{reads}.high.fastq"
    run:
        * do the thing *

现在,如果您随后添加一个other-example.fastqsequence-summary-other-example.txt,您的snakemake管道应该能够创建other-example.low.fastqother-example.high.fastq

Snakemake总是从我们倾向于的思维方式向后思考。我们首先考虑输入,然后考虑所创建的输出。但是Snakemake知道它需要制作什么文件,并且它正在试图找出制作它需要什么输入。因此,在您的原始规则中,它知道需要制作low.fastq,并且看到split_fastq规则可以做到这一点,但是随后它不知道输入中的通配符“读取”了什么是。现在,在新规则中,它知道需要制作tiny-example.low.fastq,并且看到split_fastq可以创建模板{reads}.low.fastq的输出文件,因此它说:“嘿,如果我制作{{ 1}},那么我可以使用此规则!”然后它看着输入并说:“好吧,因为输入需要reads = tiny-example,我知道{reads}.fastq,那么这意味着输入需要reads = tiny-example,我就拥有了!” < / p>