esecuzione condizionale delle regole snakemake basate sulla colonna in metatable
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
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 ruleorder
per 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_pe
regola è 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.