Выполнить одно правило условно для входных файлов

Я только начал изучать Snakemake, так что, возможно, это наивный вопрос. Мне нужно, чтобы правило запускалось в два разных момента конвейера, используя разные входы и создавая разные выходы.

Позвольте мне сделать глупый пример. Допустим, у меня есть 3 правила:

rule A:
    input:
        "data/sample.1.txt"
    output:
        "data/sample.2.sorted.txt"
    shell:
        "somethingsomething sort {input}"



rule B:
    input:
        "data/sample.2.sorted.txt"
    output:
        "data/sample.3.man.txt"
    shell:
        "somethingsomething manipulate {input}"


rule C:
    input:
        "data/sample.3.man.txt"
    output:
        "data/sample.4.man.sorted.txt"
    shell:
        "somethingsomething sort {input}"

В этом примере, где конвейер выполняет A > B > C, A и C делают точно то же самое, но один использует файл 1 и выводит 2, а другой использует 3 и выводит 4. Каково лучшее решение, чтобы просто иметь одно правило сортировки, поэтому конвейер делает A > B > A? (Возможно, есть какой-то способ сделать это с использованием символов подстановки, возможно, в сочетании с if if, но я не уверен, как это сделать)

Спасибо за ваше время

1 ответ

Решение

Возможно, есть какой-то способ повторно использовать правило, но я подозреваю, что это сделает код более сложным, чем необходимо.

Если вызов оболочки одинаков для правил A и C, и вы не хотите копировать и вставлять код, просто поместите код в переменную и повторно используйте эту переменную:

sorter= "somethingsomething sort {input}"

rule A:
    input:
        "data/sample.1.txt"
    output:
        "data/sample.2.sorted.txt"
    shell:
        sorter

rule B:
    input:
        "data/sample.2.sorted.txt"
    output:
        "data/sample.3.man.txt"
    shell:
        "somethingsomething manipulate {input}"

rule C:
    input:
        "data/sample.3.man.txt"
    output:
        "data/sample.4.man.sorted.txt"
    shell:
        sorter
Другие вопросы по тегам