Bedingte Ausführung von Snakemake-Regeln basierend auf der Spalte in Metatable
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
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_pe
Regel 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.