2017-11-10 12 views
0

私は数十のルールを持つsnakefileを持っており、何千ものファイルを処理しています。これは、DNA配列解析のためのバイオインフォマティクスパイプラインです。今日私はサンプルセットにさらに2つのサンプルを追加しました。スネークメイクを実行できると思っていました。新しいサンプルファイルとそれに依存するすべてのファイルを処理するために、非常にトップレベルに。しかし、それは何もしません。そして-Rオプションはそれをしません。新しいファイルが階層の最下部に現れたときにSnakemakeを使って階層的なルールベースの方法でファイルを更新する方法はありますか?

問題はこのsnakefileで示されている:

> rm test*.txt 
> touch test2.txt 
> touch test1.txt 
> snakemake -s tst -F 

出力は次のとおりです:

Provided cores: 1 
Rules claiming more threads will be scaled down. 
Job counts: 
    count jobs 
    1 A 
    1 

rule A: 
    input: test2.txt 
    output: test1.txt 
    jobid: 0 

Finished job 0. 
1 of 1 steps (100%) done 

test5.txtが存在しないので、私は次のように

> cat tst 
rule A: 
    output: "test1.txt" 
    input: "test2.txt" 
    shell: "cp {input} {output}" 

rule B: 
    output: "test2.txt" 
    input: "test3.txt" 
    shell: "cp {input} {output}" 

rule C: 
    output: "test3.txt" 
    input: "test4.txt" 
    shell: "cp {input} {output}" 

rule D: 
    output: "test4.txt" 
    input: "test5.txt" 
    shell: "cp {input} {output}" 

はそれを実行しますその旨のエラーメッセージを期待していたが、それは起こらなかった。もちろん、test3.txtとtest4.txtは存在しません。

さらに、-Fの代わりに-Rを使用すると、「何もしない」という結果になります。 "-R A"を使用するとルールAのみが実行されます。

これは、ツリーの最上部にルールを作成するように指示し、そのルールの出力ファイルと入力ファイルが既に存在する場合、Snakemakeが依存ツリー全体を解析しないことを示しています。そして、-Rオプションはそれを強制しません。プロジェクトで-Fを実行しようとしたとき、再ビルドする必要のないファイルも含め、全体を再構築し始めました。

これはSnakemakeがやっているはずの基本であり、わかりません。新しいサンプルを分析するために私のパイプラインを得るために見ることができる唯一の方法は、新しいファイルに必要な各ルールを個別に呼び出すことです。それはあまりにも面倒で、私が最初にSnakemakeを使用した理由の1つです。

ヘルプ!

答えて

0

snakemakeは最初のルールの依存関係を満たしたいとし、最初の依存関係を満たすためにグラフの残りの部分で追加の依存関係を引き出してグラフを作成することを覚えておいてください。 test2.txtをタッチすると、最初のルールの依存関係を満たしているので、何もする必要はありません。 -R Aであっても、ルールAの依存関係を満たすために何も実行する必要はありません。ファイルはすでに存在しています。

Snakemakeは、新しいサンプルを追加してルールグラフ全体をそれらのサンプルで実行しますが、個々のルールを個別に呼び出す必要はありませんが、依存関係を考えているようです違う。私はあなたの新しいサンプルがあなたが与えた最初のサンプルにどこに合っているかを完全に理解しているとは確信していませんが、少なくとも2つの可能性があります。

グラフの依存関係はD->C->B->Aです。新しい入力データが追加されたと考えている場合(つまり、ルールDのtest5.txtという新しいサンプル)、依存関係があることを確認する必要があります(ルールAのtest2.txt)。 test2.txtに触れることでパイプラインが完成したので、依存関係はありません。 touch test5.txt(これが新しいデータです)の場合、サンプルが機能し、グラフ全体が実行されます。

あなたの例ではtest1.txttest2.txtを触っていたので、新しいサンプルを表現することを意図したのかもしれません。その場合は、依存グラフを追加してもグラフの残りの部分に依存関係が作成されないため、依存グラフを再考する必要があります。あなたの例では、test2.txtファイルは、あなたの端末の依存関係です(ワークフローの最終依存関係は入力ではありません)。あなたの最初の例では、新しいデータの必要性はtest5.txtというルールD(グラフの一番上)への入力として来て、ルールAの入力依存性を満たすために依存グラフを引っ張って得ます。これはtest2.txtです。新しい入力としてtest1.txtまたはtest2.txtのいずれかを考えているなら、グラフの下の依存関係を満たすためにsnakemakeがデータをグラフにプルし、上から下にデータをプッシュしないことを覚えておく必要があります。 snakemake -F --rulegraphを実行すると、グラフがD->C->B->Aで実行されるので、新しいデータをルールDに入力する必要があり、ルールAの依存関係としてグラフにプルされます。

+0

新しいサンプルが上記の例にどのように適合しているかを示します。ルールDを次のように変更します。 ' ルールD: 出力:" test4.txt " 入力:" test5.txt "、" test6.txt " シェル:" cat {input [0]} {input [1]} > {出力} " " – tedtoal

+0

コメント編集ルールが機能しない理由はわかりません。 – tedtoal

+0

ルールDをそれに変更して再実行すると、-Rを指定しても何も起こりません。 – tedtoal

0

新しい入力を追加するとSnakemakeは自動的に再実行をトリガしませんファイル(例:サンプル)をDAGに送信します。ただし、FAQで概説されているように、これを強制することができます。

これをデフォルトで実行しない理由は主に一貫性です。これを行うには、Snakemakeがメタ情報を格納する必要があります。したがって、メタ情報が失われた場合、それがそこにあった場合とは異なる動作をします。 しかし、今後これを変更する可能性があります。しかし、このような基本的な変更では、現在のデフォルトの動作が有利な反例を忘れることがないように、私は通常非常に注意しています。

+0

ありがとうございます。私は今、FAQを見る前に覚えています。 – tedtoal

関連する問題