我最近决定从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'
即使这似乎是一个非常普遍的错误,我也不知道我是否不知道如何使用通配符或是否存在其他问题。我在正确使用“输入”和“输出”吗?
答案 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.fastq
和tiny-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.fastq
和sequence-summary-other-example.txt
,您的snakemake管道应该能够创建other-example.low.fastq
和other-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>