4

我想知道 Snakemake 中是否有一种方法可以定义一个实际上不是输入文件的依赖项。我的意思是,有些程序期望某些文件存在,而命令行上没有提供。

让我们bwa作为一个例子来考虑。这是来自Johannes Köster 映射规则的规则

rule bwa_mem_map:
    input:
        lambda wildcards: config["references"][wildcards.reference],
        lambda wildcards: config["units"][wildcards.unit]
    output:
        "mapping/{reference}/units/{unit}.bam"
    params:
        sample=lambda wildcards: UNIT_TO_SAMPLE[wildcards.unit],
        custom=config.get("params_bwa_mem", "")
    log:
        "mapping/log/{reference}/{unit}.log"
    threads: 8
    shell:
        "bwa mem {params.custom} "
        r"-R '@RG\tID:{wildcards.unit}\t"
        "SM:{params.sample}\tPL:{config[platform]}' "
        "-t {threads} {input}  2> {log} "
        "| samtools view -Sbh - > {output}"

在这里,bwa 期望基因组索引文件存在,而它不是命令行参数(索引文件的路径是从基因组路径推导出来的)。

有没有办法告诉 Snakemake 索引文件是一个依赖项,如果 Snakemake 知道如何生成这个文件,他会查看它的规则吗?

我想您仍然可以将规则输入重写为:

rule bwa_mem_map:
    input:
        genome=lambda wildcards: config["references"][wildcards.reference],
        fastq=lambda wildcards: config["units"][wildcards.unit]
        index=foo.idx

并相应地调整规则run部分。这是最好的解决方案吗?

提前致谢。拜诺伊斯特

4

1 回答 1

2

我认为snakemake处理规则之间依赖关系的唯一方法是通过文件,所以当你将索引文件明确地作为input映射规则时,我会说你做对了,即使这个文件没有出现在映射命令中。

对于它的价值,我对 bam 索引文件做同样的事情,这是某些工具的隐式依赖项:我将排序的 bam 文件及其索引都设置为input,但只在shellorrun部分使用 bam 文件。而且我有一个规则生成两个文件都为output.

input并且output文件不需要出现在规则的shell/run部分中。

于 2016-11-25T14:46:47.707 回答