#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
инструкцию, чтобы у каждого имени гена был свой собственный файл, и функция перечислила/изменила все эти файлы для ввода агрегированного правила.