условное выполнение правил создания змейки на основе столбца в метатаблице

Jan 15 2021

Я пытаюсь использовать столбец в текстовом файле для условного выполнения правил в рабочем процессе snakemake.

Текстовый файл выглядит следующим образом:

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

Для каждого образца в текстовом файле, если значение в конце столбца объединено в пару, я хотел бы использовать правило cp_fastq_pe, а если конец один, то я хотел бы использовать правило cp_fastq_pe для обработки файлов fq1 и fq2 или просто файлов fq1 соответственно.

соответствующая часть Snakefile выглядит следующим образом:

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

Можно ли это сделать?

Ответы

2 DmitryKuzminov Jan 15 2021 at 14:54

У меня была аналогичная проблема, которую я решил здесь: как сделать ввод Snakemake необязательным, но не пустым?

Вот идея, адаптированная к вашей проблеме. Во-первых, вам нужно указать, ruleorderчтобы разрешить двусмысленность (в противном случае сингл всегда может применяться всякий раз, когда возможна пара):

ruleorder: cp_fastq_pe > cp_fastq_se

Затем в своем cp_fastq_peправиле вам необходимо определить функцию, которая либо возвращает действительный файл (для парного случая), либо возвращает заполнитель для несуществующего файла:

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"

Это правило будет применяться ко всем образцам, где есть "fq2"поле и представляет собой допустимый файл. Другое правило будет выбрано для остальных образцов.