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

У меня есть файл-змея с десятками правил, и он обрабатывает тысячи файлов. Это биоинформатический конвейер для анализа последовательности ДНК. Сегодня я добавил еще два образца в свой набор образцов, и я ожидал, что смогу запустить snakemake, и он автоматически определит, какие правила запускать, для каких файлов обрабатывать новые файлы образцов и все файлы, которые зависят от них, по иерархии. на самый верхний уровень. Однако ничего не делает. И опция -R тоже этого не делает.

Проблема проиллюстрирована этим змеиным файлом:

> cat tst
rule A:
    output: "test1.txt"
    input: "test2.txt"
    shell: "cp {input} {output}"

rule B:
    output: "test2.txt"
    input: "test3.txt"
    shell: "cp {input} {output}"

rule C:
    output: "test3.txt"
    input: "test4.txt"
    shell: "cp {input} {output}"

rule D:
    output: "test4.txt"
    input: "test5.txt"
    shell: "cp {input} {output}"

Выполните это следующим образом:

> rm test*.txt
> touch test2.txt
> touch test1.txt
> snakemake -s tst -F

Выход:

Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
    count   jobs
    1   A
    1

rule A:
    input: test2.txt
    output: test1.txt
    jobid: 0

Finished job 0.
1 of 1 steps (100%) done

Поскольку test5.txt не существует, я ожидал появления сообщения об ошибке, но этого не произошло. И, конечно же, test3.txt и test4.txt не существуют.

Более того, использование -R вместо -F приводит к «Ничего не нужно делать». Использование «-R A» запускает только правило A.

Это относится к моему проекту в том смысле, что он показывает, что Snakemake не анализирует все зависимое дерево, если вы укажете ему построить правило в верхней части дерева, а выходные и входные файлы этого правила уже существуют. И опция -R тоже не заставляет это делать. Когда я попробовал -F в своем проекте, он начал перестраивать все, включая файлы, которые не нужно было перестраивать.

Мне кажется, что это фундаментально для того, что должен делать Snakemake, и я просто этого не понимаю. Единственный способ заставить мой конвейер анализировать новые образцы - это индивидуально вызывать каждое правило, необходимое для новых файлов, по порядку. И это слишком утомительно, и это одна из причин, почему я вообще использовал Snakemake.

Помощь!


person tedtoal    schedule 10.11.2017    source источник


Ответы (2)


Snakemake не запускает автоматически повторные запуски при добавлении новых входных файлов (например, сэмплов) в DAG. Однако вы можете обеспечить это, как указано в FAQ.

Причина, по которой это не делается по умолчанию, в основном заключается в согласованности: для этого Snakemake должен хранить метаинформацию. Следовательно, если метаинформация будет потеряна, вы будете вести себя иначе, чем если бы она была там. Однако я могу изменить это в будущем. Однако с такими фундаментальными изменениями я обычно очень осторожен, чтобы не забыть встречный пример, в котором текущее поведение по умолчанию является преимуществом.

person Johannes Köster    schedule 13.11.2017
comment
Спасибо. Теперь я помню, что видел раньше этот FAQ. - person tedtoal; 15.11.2017

Помните, что snakemake хочет удовлетворить зависимость первого правила и строит граф, протягивая дополнительные зависимости через остальную часть графа, чтобы удовлетворить эту начальную зависимость. Прикоснувшись к test2.txt, вы удовлетворили зависимость для первого правила, поэтому больше ничего делать не нужно. Даже с -R A больше ничего не нужно запускать, чтобы удовлетворить зависимость правила A - файлы уже существуют.

Snakemake определенно делает то, что вы хотите (добавляйте новые образцы, и весь граф правил запускается на этих образцах), и вам не нужно индивидуально вызывать каждое правило, но мне кажется, что вы можете неправильно думать о зависимостях. Я не уверен, что полностью понимаю, где ваши новые образцы вписываются в приведенный вами пример tst, но я вижу по крайней мере две возможности.

Зависимость вашего графика работает D->C->B->A, поэтому, если вы думаете, что добавили новые входные данные вверху (т. Е. Новый образец как test5.txt в правиле D), вы должны быть уверены, что у вас есть зависимость на конечной точке ( test2.txt в правиле А). Прикоснувшись к test2.txt, вы только что завершили свой конвейер, поэтому никаких зависимостей не существует. Если touch test5.txt (это ваши новые данные), то ваш пример работает и весь график работает.

Поскольку вы коснулись test1.txt и test2.txt в выполнении примера, возможно, вы хотели, чтобы они представляли новые образцы. Если это так, то вам нужно переосмыслить свой граф зависимостей, потому что их добавление не создает зависимости от остальной части графа. В вашем примере файл test2.txt - это ваша терминальная зависимость (последняя зависимость вашего рабочего процесса, а не вход в него). В вашем tst примере новые данные должны поступать как test5.txt в качестве входных данных для правила D (верхняя часть вашего графика) и проходить через граф зависимостей, чтобы удовлетворить входную зависимость правила A, которая равна test2.txt. Если вы думаете о test1.txt или test2.txt в качестве нового ввода, тогда вам нужно помнить, что snakemake протягивает данные через граф для удовлетворения зависимостей в нижней части графика, а не проталкивает данные сверху вниз. Запустите snakemake -F --rulegraph и убедитесь, что график работает D->C->B->A и поэтому должны поступать новые данные в качестве входных данных для правила D и протягиваться через график в качестве зависимости от правила A.

person Barry Moore    schedule 10.11.2017
comment
Вот как новый образец вписывается в приведенный выше пример. Измените правило D на: `rule D: output: test4.txt input: test5.txt, test6.txt shell: cat {input [0]} {input [1]}› {output} ` - person tedtoal; 10.11.2017
comment
Не знаю, почему не работают правила редактирования комментариев. - person tedtoal; 10.11.2017
comment
Если вы измените правило D на это, а затем снова запустите, ничего не произойдет, даже с -R. - person tedtoal; 10.11.2017
comment
Хорошо, теперь я определил, что, хотя SnakeMake не будет сообщать об отсутствующем входном файле, когда выходной файл уже существует, он правильно создает новые образцы, которые я добавляю как файлы необработанных данных в листьях моего дерева зависимостей. Добавление таких файлов вызывает переоценку всех правил, на которые влияет изменение. И это самое главное, чего я хотел. Я думал, что вчера видел другое поведение, но на данный момент оно работает правильно, и я не могу реконструировать то, что видел. Может позже, когда добавлю еще один новый образец! - person tedtoal; 11.11.2017