snakemake выполняет только первое правило, а не все

#workflow #rules #snakemake

Вопрос:

Мой snakefile выглядит следующим образом.

 rule do00_download_step01_download_:
    input:
        
    output:
        "data/00_download/scores.pqt"
    run:
        from lib.do00_download import do00_download_step01_download_
        do00_download_step01_download_()
rule do00_download_step02_get_the_mean_:
    input:
        "data/00_download/scores.pqt"
    output:
        "data/00_download/cleaned.pqt"
    run:
        from lib.do00_download import do00_download_step02_get_the_mean_
        do00_download_step02_get_the_mean_()
rule do01_corr_step01_correlate:
    input:
        "data/00_download/cleaned.pqt"
    output:
        "data/01_corr/corr.pqt"
    run:
        from lib.do01_corr import do01_corr_step01_correlate
        do01_corr_step01_correlate()
rule do95_plot_step01_correlations:
    input:
        "data/01_corr/corr.pqt"
    output:
        "plot/heatmap.png"
    run:
        from lib.do95_plot import do95_plot_step01_correlations
        do95_plot_step01_correlations()
rule do95_plot_step02_plot_dist:
    input:
        "data/00_download/cleaned.pqt"
    output:
        "plot/dist.png"
    run:
        from lib.do95_plot import do95_plot_step02_plot_dist
        do95_plot_step02_plot_dist()
rule do99_figures_step01_make_figure:
    input:
        "plot/dist.png"
        "plot/heatmap.png"
    output:
        "figs/fig01.svg"
    run:
        from lib.do99_figures import do99_figures_step01_make_figure
        do99_figures_step01_make_figure()
rule all:
    input:
        "figs/fig01.svg"
 

Я расположил правила последовательно, надеясь, что это обеспечит выполнение всех шагов в таком порядке. Однако, когда я запускаю snakemake , он запускает только первое правило, а затем завершает работу.

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

Ответ №1:

Это предполагаемое поведение. Вот соответствующий раздел из документов:

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

Если вы переместите rule all: в начало своего Snakefile, он должен работать так, как ожидалось.

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

1. Хм, я пропустил это в документах. Спасибо, что указали на это! Да, похоже, это rule all была проблема. Я поместил его наверх, и теперь выполняются другие правила.

2. Но по какой-то причине, чтобы иметь rulegraph то, что я намеревался иметь, мне пришлось добавить еще два ввода rule all : «plot / dist.png» и «plot / heatmap.png» в дополнение к «figs / fig01.svg». Я не понимаю, почему так. Как решить, какой файл должен быть включен во входные rule all данные?

3. @Ramirez snakemake рассматривает первое правило (условно названное all ), чтобы определить, каким будет конечный результат конвейера. Затем он возвращается назад, чтобы установить, какие файлы необходимы для создания такого конечного результата. Если plot/dist.png этого нет в правиле all и нет необходимости генерировать конечный результат, то создание правила plot/dist.png не выполняется. Все это немного нелогично, но как только вы привыкнете к этому, это полезное поведение.