2017-08-28 62 views
0

正如你可以阅读标题,我有兴趣将存储shell命令的结果并将其传递给另一个规则。存储shell命令的结果

贝娄是我的规则:

SAMTOOLS = config["SAMTOOLS"] 
rule useDepth: 
    input: 
    depth = "{individual}_{chr}.fixmate.sort.rgmdup.bam.depth" 
    output: 
    tmpVCF = "{individual}_{chr}.vcf" 
    run: 
    depth = storage.fetch("chrDepth") 
    shell("echo {depth} | exit 1") 

rule calDepth: 
    input: 
    bam = "{individual}.fixmate.sort.rgmdup.bam" 
    output: 
    temp("{individual}_{chr}.fixmate.sort.rgmdup.bam.depth") 
    run: 
    import subprocess,shlex 
    depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 
    storage.store("chrDepth", depth) 
    shell("echo \"Depth for {wildcards.chr} has been calculated\" > {output[0]}") 

我肯定在这里接受,因为1号出口的错误!但那只是为了测试。

我试图解决的错误是subprocess.check_output()中{SAMTOOLS}的值!

depth: 1: depth: {SAMTOOLS}: not found 
Error in job chrDepth while creating output file 
RuleException: 
Command '['{SAMTOOLS}', 'depth', '-r', '{wildcards.chr}', '{input.bam}', '|', 'awk', '{{sum += $3}} END {{print sum/NR}}']' 

要更多的信息,因为不同势用户可能安装samtools在不同的地方,我们做samtools的地址,通过CONFIGFILE配置。但是,在这里我不能:

1)读取{SAMTOOLS}的正确值!

2)使整个命令可以运行!

那么,你能否告诉我是否有其他方式存储/传递规则的输出到另一个规则!?更特别的是,我如何增强snakemake来告诉shell {SAMTOOLS}可用。

谢谢!

回答

0

这是您设置访问权限以用作Python变量。

SAMTOOLS = config["SAMTOOLS"] 

但你尝试这里访问它,通过{} SAMTOOLS作为Snakemake规则特定通配符:

depth=subprocess.check_output(shlex.split("{SAMTOOLS} depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

Snakemake通配符不被访问的方式Python的变量相同。 此外,{SAMTOOLS}在这里被作为一个Snakemake通配符来访问,但是你不会在规则的输出中使用它作为通配符。

假设{wildcards.chr}有效,并且{SAMTOOLS}调用是唯一未找到的通配符(不仅是第一个未知的通配符),我认为您应该尝试两种方法之一。

没有预分配:

depth=subprocess.check_output(shlex.split("config['SAMTOOLS'] depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

访问它作为Python变量作为字符串(它是代表一个字符串的对象):

depth=subprocess.check_output(shlex.split(SAMTOOLS + " depth -r {wildcards.chr} {input.bam} | awk '{{sum += $3}} END {{print sum/NR}}'"),shell=True) 

最后,并且由于规则至少推荐它引入的规则耦合,有许多方法可以在Snakemake中通过规则传递变量,而且您已经在使用它了,但是,我不认为这是需要的。正确的访问和设计应该是足够的。

Snakemake Tutorial FAQ: How to pass variables between rules

旁注

为了消除跨规则的通过炭深度,同时也将其保存为文件名的路径,以及分离的规则,我强烈建议转换chrDepth到命名通配符...

喜欢的东西...

rule useDepth: 
    input: 
    depth = "{individual}_{chr}_of_{chrDepth}.fixmate.sort.rgmdup.bam.depth" 
    output: 
    tmpVCF = "{individual}_{chr}_of{chrDepth}.vcf" 

但我不知道你是如何计算chrDepth。它让我担心你在所有这些规则之间传递它,而不仅仅依赖于良好的命名约定。它可能会不必要地耦合你的代码,导致下游的问题和开销。

+0

正如你所建议的使用SAMTOOLS以外的折扣是诀窍!但是,我想知道为什么我以前没有收到这个错误。我正在使用{SAMTOOLS}或其他没有通配符的程序,我的规则都没有抱怨这种用法(即我在这些规则中使用shell)。 – khikho