3

のみを変更するsnakemakeでルールを再利用する方法はありparamsますか?

例えば:

rule job1:
    ...
    params:
        reference = "path/to/ref1"
    ...

rule job2:
    input: rules.job1.output
    ...
    params:
        reference = "path/to/ref2"

job1ルールは同じことを行っていますが、job2それらを連続して呼び出す必要があり、referenceパラメーターを変更する必要があります。非常によく似たタスクに対して多くのコードを生成します。

このステップのサブワークフローを作成しようとしましたが、メインの Snakefile の方が読みやすいです。ただし、サブワークフロー コードはまだ繰り返されています。

アイデアや提案はありますか?私は何か見落としてますか?

EDIT
より具体的には、job1 の出力を使用して、job1 の後に job2 を実行する必要があります。

4

2 に答える 2

3

ルールが同じであれば、出力ファイルの名前付けにワイルドカードを使用できます。このように、同じルールが 2 回実行されます。

references = ["ref1", "ref2"]

rule all:
  input: expand("my_output_{ref}", ref=references)

rule job:
    input: "my_input"
    output: "my_output_{ref}"
    params: ref = "path/to/{ref}"
    shell: "... {params.ref} {output}"

これが役に立てば幸いです。そうでない場合は、質問をより具体的にすることができますか?

編集

さて、Python 関数を使用して、ルールのカスタム入力を定義する可能性があります。たぶん、あなたはこの方向に進むことができます。次の実際の例を参照してください。

references = ["ref1", "ref2"]

rule all:
  input: expand("my_output_{ref}", ref=references)


def rule_input(wildcards):
    if (wildcards.ref == "ref1"):
        input = "my_first_input"
    elif (wildcards.ref == "ref2"):
        input = "my_output_ref1"
    return(input)

rule job:
    input: rule_input
    output: "my_output_{ref}"
    params: ref = "path/to/{ref}"
    shell: "echo input: {input} ; echo output: {output} ; touch {output}"
于 2016-12-06T23:28:43.147 に答える
2

Snakemake はルール間の継承をサポートしていません。そのため、ケースにワイルドカードを使用できない場合、1 つのオプションは委任を使用することです。2 つのルールの定数部分を変数に事前定義し、ルール本体からこれらを参照します。もう 1 つのオプションは、input/params 関数 (ドキュメントとチュートリアルを参照) と 1 つのルール定義のみです。このようにして、ワイルドカードなどの値に基づくいくつかのロジックに従って、完全に異なる入力ファイルを持つことができます。

于 2016-12-07T11:31:34.120 に答える