我想知道Snakemake中是否有办法定义一个实际上不是输入文件的依赖项。 我的意思是,有些程序希望某些文件存在而命令行中没有提供。
我们以bwa
为例。
这是Johannes Köster mapping rules的规则:
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
部分。
这是最好的解决方案吗?
提前致谢。 Benoist
答案 0 :(得分:1)
我认为snakemake处理规则之间依赖关系的唯一方法是通过文件,因此当您将索引文件明确地作为映射规则的input
时,我说你正在正确地执行它,即使此文件不会出现在映射命令中。
对于它的价值,我对bam索引文件也这样做,这是一些工具的隐式依赖:我将排序的bam文件及其索引都放在input
,但只使用bam文件shell
或run
部分。我有一个规则生成两个文件output
。
input
和output
个文件无需显示在规则的shell
/ run
个部分中。