0

正如您在标题中看到的那样,我对存储 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)使整个命令可运行!

那么,您能否告诉我是否有任何其他方法可以将规则的输出存储/传递给另一个规则!?更具体地说,我如何增强蛇形来告诉 shell {SAMTOOLS} 可用。

谢谢!

4

1 回答 1

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 教程常见问题:如何在规则之间传递变量

边注

为了消除跨规则传递的字符深度,并将其保存为文件名的路径,并解耦规则,我强烈建议将 chrDepth 转换为命名通配符...

就像是 ...

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

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

于 2017-08-28T16:20:27.810 回答