warunkowe wykonanie reguł snakemake na podstawie kolumny w metatable

Jan 15 2021

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

2 DmitryKuzminov Jan 15 2021 at 14:54

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ć, ruleorderaby 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_peregule 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.