メタテーブルの列に基づくsnakemakeルールの条件付き実行

Jan 15 2021

テキストファイルの列を使用して、snakemakeワークフローでルールを条件付きで実行しようとしています。

テキストファイルは次のとおりです。

id  end sample_name fq1 fq2
a   paired  test_paired resources/SRR1945436_1.fastq.gz resources/SRR1945436_2.fastq.gz
b   single  test_single resources/SRR1945436.fastq.gz   NA

テキストファイルの各サンプルについて、end列の値がペアになっている場合は、ルールcp_fastq_peを使用し、endが単一の場合は、ルールcp_fastq_peを使用して、それぞれfq1ファイルとfq2ファイルまたはfq1ファイルのみを処理します。

Snakefileの関連部分は次のとおりです。

import pandas as pd
samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
all_ids=list(samples["id"])

rule cp_fastq_pe:
    """
    copy file to resources
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"]
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        cp {input.fq1} {output[0]}
        cp {input.fq2} {output[1]}
        """

rule cp_fastq_se:
    """
    copy file to resources
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"]
    output:
        "resources/fq/{id}.fq.gz",
    shell:
        """
        cp {input.fq1} {output}
        """

これを行うことは可能ですか?

回答

2 DmitryKuzminov Jan 15 2021 at 14:54

私はここで解決した同様の問題を抱えていました:Snakemake入力をオプションにするが空ではないようにする方法は?

これがあなたの問題に合わせたアイデアです。まず、ruleorderあいまいさを解決するためにを指定する必要があります(そうしないと、ペアリングが可能な場合は常にシングルを適用できます)。

ruleorder: cp_fastq_pe > cp_fastq_se

次に、cp_fastq_peルールで、有効なファイル(ペアの場合)を返すか、存在しないファイルのプレースホルダーを返す関数を定義する必要があります。

rule cp_fastq_pe:
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"] if "fq2" in samples else "non-existing-filename"

このルールは、"fq2"フィールドが存在し、有効なファイルを表す場合は常に、すべてのサンプルに適用されます。他のルールは、残りのサンプルに対して選択されます。