2016-04-08 1 views
2

スネークメークワークフロー用のSnakefileを作成しています。ワークフローの一環として、データベース内のレコードのセットが変更されたかどうか、またそれらのレコードを再ダウンロードしたかどうかを確認する必要があります。Snakefile(snakemake)で常にルールを実行する

私は、データベースのタイムスタンプをチェックし、それを出力ファイルに書き込むルールを書くことを考えました。タイムスタンプファイルをダウンロードルールの入力として使用します。問題は、タイムスタンプ・ファイルが書き込まれた後、タイムスタンプ・ルールが決して再び実行されないため、タイムスタンプが決して更新されないことです。

毎回このルールを実行する方法はありますか? (私はシェルから強制することができますが、私はSnakefileで指定したいと思います)またはこれを処理する良い方法がありますか?

答えて

3

ルールや関数定義の外でSnakefileに追加するコードは、通常のPythonスクリプトと同様に起動時に実行されるため、外部シェルスクリプトは必要ありません。 Pythonで必要とするロジックをSnakefileに実装することができます。必要に応じてshell()関数を使用します。

クラスタでワークフローを実行しようとすると、各クラスタジョブが実行されるたびにコードが実行されるという警告があります。

if '--nolock' not in sys.argv: 
    if check_database_for_updates(): 
     os.utime('touch.file') 

はその後、データベースから読み込んで自分のルールへのプロキシの入力としてtouch.file設定:これを回避するために、粗が、効果的な方法は、このようなチェックでそれを守ることです。それは理にかなっていますか?

TIM

0

v3.6.0以降、onstartハンドラは、ワークフローを開始する前に、常に何かを実行することができます。

Snakemake 3.6.0は、ワークフローを開始する前に実行されるonstartハンドラを追加します。ドライランはハンドラを起動させないことに注意してください。

ドライラン実行中にonstartが発生しないことは残念です。

同様に、onsuccessonerrorハンドラを使用して、ワークフローの成功とエラーに応じて実行するものをトリガすることができます。

関連する問題