warunkowe wykonanie reguł snakemake na podstawie kolumny w metatable
Próbuję użyć kolumny w pliku tekstowym do warunkowego wykonywania reguł w przepływie pracy snakemake.
Plik tekstowy jest następujący:
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
Dla każdej próbki w pliku tekstowym, jeśli wartość w kolumnie końcowej jest sparowana, chciałbym użyć reguły cp_fastq_pe, a jeśli koniec jest pojedynczy, chciałbym użyć reguły cp_fastq_pe do przetworzenia odpowiednio plików fq1 i fq2 lub tylko fq1.
odpowiednia część Snakefile jest następująca:
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}
"""
Czy da się to zrobić?
Odpowiedzi
Miałem podobny problem, który tutaj rozwiązałem: Jak sprawić, by wejście Snakemake było opcjonalne, ale nie puste?
Oto pomysł dostosowany do Twojego problemu. Najpierw musisz określić, ruleorder
aby rozwiązać niejednoznaczność (w przeciwnym razie singiel można zawsze zastosować, gdy tylko sparowanie jest możliwe):
ruleorder: cp_fastq_pe > cp_fastq_se
Następnie w swojej cp_fastq_pe
regule musisz zdefiniować funkcję, która albo zwraca prawidłowy plik (dla sparowanej sprawy), albo zwraca symbol zastępczy dla nieistniejącego pliku:
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"
Ta reguła będzie stosowana do wszystkich próbek, gdziekolwiek "fq2"
istnieje pole i reprezentuje prawidłowy plik. Druga reguła zostanie wybrana do pozostałych próbek.