Выполнить одно правило условно для входных файлов
Я только начал изучать 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