Bedingte Ausführung von Snakemake-Regeln basierend auf der Spalte in Metatable

Jan 15 2021

Ich versuche, eine Spalte in einer Textdatei zu verwenden, um Regeln in einem Snakemake-Workflow bedingt auszuführen.

Die Textdatei lautet wie folgt:

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

Wenn für jedes Beispiel in der Textdatei der Wert in der Endspalte gepaart ist, möchte ich die Regel cp_fastq_pe verwenden, und wenn das Ende einfach ist, möchte ich die Regel cp_fastq_pe verwenden, um die Dateien fq1 & fq2 bzw. nur fq1 zu verarbeiten.

relevanter Teil von Snakefile ist wie folgt:

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

Ist das möglich?

Antworten

2 DmitryKuzminov Jan 15 2021 at 14:54

Ich hatte ein ähnliches Problem, das ich hier gelöst habe: Wie kann ich die Snakemake-Eingabe optional, aber nicht leer machen?

Hier ist die Idee an Ihr Problem angepasst. Zuerst müssen Sie die angeben ruleorder, um die Mehrdeutigkeit aufzulösen (andernfalls könnte die Single immer angewendet werden, wenn die Paarung möglich ist):

ruleorder: cp_fastq_pe > cp_fastq_se

Als Nächstes müssen Sie in Ihrer cp_fastq_peRegel eine Funktion definieren, die entweder eine gültige Datei (für den gepaarten Fall) oder einen Platzhalter für eine nicht vorhandene Datei zurückgibt:

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"

Diese Regel wird auf alle Beispiele angewendet, wo immer ein "fq2"Feld vorhanden ist, und stellt eine gültige Datei dar. Die andere Regel würde für den Rest der Stichproben ausgewählt.