タイトルを読んでわかるように、シェルコマンドの結果を保存して別のルールに渡すことに興味があります。
以下は私のルールです:
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 を拡張して {SAMTOOLS} が利用可能であることをシェルに伝えるにはどうすればよいですか。
ありがとう!