esecuzione condizionale delle regole snakemake basate sulla colonna in metatable

Jan 15 2021

Sto cercando di utilizzare una colonna in un file di testo per eseguire le regole in modo condizionale in un flusso di lavoro snakemake.

Il file di testo è il seguente:

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

Per ogni campione nel file di testo, se il valore nella colonna di fine è accoppiato, vorrei usare la regola cp_fastq_pe e se la fine è singola, allora vorrei usare la regola cp_fastq_pe per elaborare rispettivamente i file fq1 e fq2 o solo fq1.

parte rilevante di Snakefile è la seguente:

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

È possibile farlo?

Risposte

2 DmitryKuzminov Jan 15 2021 at 14:54

Ho avuto un problema simile, che ho risolto qui: come rendere l'input di Snakemake opzionale ma non vuoto?

Ecco l'idea adattata al tuo problema. Innanzitutto, è necessario specificare il ruleorderper risolvere l'ambiguità (altrimenti il ​​singolo potrebbe sempre essere applicato ogni volta che è possibile l'accoppiamento):

ruleorder: cp_fastq_pe > cp_fastq_se

Successivamente, nella cp_fastq_peregola è necessario definire una funzione che restituisca un file valido (per il caso accoppiato) o restituisca un segnaposto per file non esistenti:

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"

Questa regola verrà applicata a tutti i campioni ovunque il "fq2"campo esista e rappresenti un file valido. L'altra regola verrebbe selezionata per il resto dei campioni.