ejecución condicional de reglas de creación de serpientes basadas en la columna en la metatabla
Estoy tratando de usar una columna en un archivo de texto para ejecutar reglas condicionalmente en un flujo de trabajo de snakemake.
El archivo de texto es el siguiente:
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
Para cada muestra en el archivo de texto, si el valor en la columna final está emparejado, me gustaría usar la regla cp_fastq_pe y si el final es único, me gustaría usar la regla cp_fastq_pe para procesar los archivos fq1 y fq2 o solo fq1, respectivamente.
La parte relevante de Snakefile es la siguiente:
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}
"""
¿Es posible hacer esto?
Respuestas
Tuve un problema similar, que resolví aquí: ¿Cómo hacer que la entrada de Snakemake sea opcional pero no vacía?
Aquí está la idea ajustada a su problema. Primero, debe especificar ruleorder
para resolver la ambigüedad (de lo contrario, el sencillo siempre se podría aplicar siempre que sea posible el emparejamiento):
ruleorder: cp_fastq_pe > cp_fastq_se
A continuación, en su cp_fastq_pe
regla debe definir una función que devuelva un archivo válido (para el caso emparejado) o devuelva un marcador de posición para el archivo no existente:
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"
Esta regla se aplicaría a todas las muestras donde "fq2"
exista un campo y represente un archivo válido. La otra regla se seleccionaría para el resto de las muestras.