Правило Snakemake для анализа, в котором для разных параметров создается один файл результатов, а параметр поступает из содержимого вывода другого правила

#python #snakemake

Вопрос:

У меня есть следующая базовая настройка snakemake:

 rule step1:
    """
    The output will contain a list of GENEs in a txt file.
    """

    input: "input1.txt"

    output: "output1.txt"

    shell:
        """
        analysis1.R {input} {output}
        """

rule step2:
    """
    Analysis step2.
    """

    input: "input2.txt"

    output: "output2.txt"

    shell:
        """
        analysis2.py {input} {output}
        """

rule step3:
    """
    GENE should be coming from the step1 output file, with a GENE name on each
    line.
    """

    input: rules.step2.output

    output: "output3-GENE.txt"

    shell:
        """
        analysis3.py -i {input} -o {output} -p GENE
        """
 

Я создаю файл со списком генов (параметров) в шаге 1 для шага 3 и еще один файл в шаге 2. Что я хотел бы сделать, так это запустить шаг 3 столько раз, сколько строк у меня есть, output1.txt где содержимое строки является параметром для шага 3, и оно также должно быть частью имени выходного файла, но я не могу понять это. Есть какие-нибудь идеи? Спасибо за помощь!

Ответ №1:

Вы можете использовать контрольные точки.

Если вы знаете список файлов, которые step3 должен генерировать ваш файл, вы можете определить aggregate правило:

 rule aggregate:
    input:
        # List of files that step3 needs to generate
 

Это позволит вам запускать rule step3 его столько раз, сколько потребуется.

Самое сложное-определить список этих файлов. Это будет зависеть от результата rule step1 :

 def aggregate_input(wildcards):
    with checkpoints.rile1.get().output[0].open() as f:
        return f.readlines()

rule aggregate:
    input:
        aggregate_input
 

В этом случае rule step1 пункт должен стать контрольно-пропускным пунктом:

 checkpoint step1:
    """
    The output will contain a list of GENEs in a txt file.
    """

    input: "input1.txt"

    output: "output1.txt"

    shell:
        """
        analysis1.R {input} {output}
        """
 

В моем примере я упростил функцию aggregate_input , чтобы возвращать только строки вывода step1 . Если вам нужна более сложная функция, вы можете создать свою собственную.

Комментарии:

1. Да, контрольная точка и функция сделали это. Хотя я добавил в конце правила 1 split -l инструкцию, чтобы у каждого имени гена был свой собственный файл, и функция перечислила/изменила все эти файлы для ввода агрегированного правила.