ejecución condicional de reglas de creación de serpientes basadas en la columna en la metatabla

Jan 15 2021

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

2 DmitryKuzminov Jan 15 2021 at 14:54

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 ruleorderpara 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_peregla 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.