存储shell命令的结果
正如你可以阅读标题,我有兴趣将存储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}可用。
谢谢!
这是您设置访问权限以用作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。它让我担心你在所有这些规则之间传递它,而不仅仅依赖于良好的命名约定。它可能会不必要地耦合你的代码,导致下游的问题和开销。
正如你所建议的使用SAMTOOLS以外的折扣是诀窍!但是,我想知道为什么我以前没有收到这个错误。我正在使用{SAMTOOLS}或其他没有通配符的程序,我的规则都没有抱怨这种用法(即我在这些规则中使用shell)。 – khikho