正如您可以阅读标题我感兴趣的是存储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,我们通过configfile使samtools的地址可配置。但是,我不能在这里:
1)阅读{SAMTOOLS}的正确值!
2)使整个命令可以运行!
那么,您能告诉我是否有其他方法可以将规则的输出存储/传递给另一个规则!?更具体地说,我如何增强snakemake来告诉shell {SAMTOOLS}可用。
谢谢!
答案 0 :(得分: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
旁注
为了消除跨规则传递的char深度,并将其保存为文件名的路径,并解除规则,我强烈建议将chrDepth转换为命名通配符...
像...一样的东西。
rule useDepth:
input:
depth = "{individual}_{chr}_of_{chrDepth}.fixmate.sort.rgmdup.bam.depth"
output:
tmpVCF = "{individual}_{chr}_of{chrDepth}.vcf"
但我不确定你是如何计算chrDepth的。我担心你在所有这些规则之间传递它,而不仅仅依赖于良好的命名约定。它可能会不必要地耦合您的代码,从而导致问题和下游开销。