2017-08-28 26 views
0

タイトルを読むと、シェルコマンドの結果を保存し、別のルールに渡すことに興味があります。シェルコマンドの結果を保存する

ベローは私のルールです:私はので、1番出口をここでエラーを受け取ったことを確認するために

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]}") 

!しかしそれはテストのためのものです。

私が解決しようとしているエラーは、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}}']' 

切り抜いたユーザーたちはconfigfileを介して構成samtoolsのアドレスを作る別の場所にsamtoolsをインストールする可能性があるため、より有益なことができます。しかし、ここで私はできません:

1){SAMTOOLS}の正しい値をお読みください!

2)コマンド全体を実行可能にしてください!

他の方法でルールの出力を保存/別のルールに渡すことができますか教えてください。より具体的には、{SAMTOOLS}が利用可能であることをシェルに伝えるためにsnakemakeをどのように強化できますか?

ありがとうございます!

答えて

0

これは、Python変数として使用するためのアクセス権を設定しています。

SAMTOOLS = config["SAMTOOLS"] 

しかし、あなたはSnakemakeルール特定のワイルドカードとして、{SAMTOOLS}を経由して、として、ここではそれにアクセスしよう:

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}の呼び出しが唯一のワイルドカードであると仮定すると、最初の未知のワイルドカードではなく、2つのいずれかを試してください。

なし事前割付:

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) 

最後に起因ルールに推奨少なくともsnugemakeのルール間で変数を渡す方法がありますが、既にそれを使用していますが、ここで必要とされているとは思いません。適切なアクセスと設計はそのままで十分です。

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

あなたはqutationの外でSAMTOOLSを使うことを提案したので、トリックでした!しかし、なぜ私はこのエラーを以前に受けていないのだろうと思っています。私は{SAMTOOLS}やその他のプログラムをワイルドカードなしで使用していましたが、私の規則のどれもがこの使用法について不平を言っていませんでした。 – khikho

関連する問題