Snakemake: расширить параметры - PullRequest
2 голосов
/ 11 февраля 2020

Я пытаюсь создать простой рабочий процесс для подачи списка параметров в сценарий. Для иллюстрации:

SAMPLES=['A','B']

rule test:
    params:
        sample=expand("{sample}", sample=SAMPLES)
    script:
        "test.py {params.sample}"

Однако snakemake выполняет сценарий только с примером A, а не B. Другими словами, я считаю, что выполняется python test.py A B, а не python test.py A, а затем python test.py B. Точно так же я думаю, что это иллюстрируется:

SAMPLES=['A','B']

rule print_samples:
    params:
        sample=expand("{sample}", sample=SAMPLES)
    script:
        "echo {params.sample} \n"

Я ожидал бы увидеть A и B, напечатанные в отдельных строках, но вместо этого он напечатает A B в той же строке.

Я что-то упускаю из-за того, как расширение работает с параметрами? В идеале я хотел бы добавить флаг -j, чтобы запустить их параллельно (в настоящее время -j просто выполняется только с A).

1 Ответ

3 голосов
/ 11 февраля 2020

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

[str(sample) for sample in SAMPLES]

, которая при вводе в оболочку или скрипт превращается в элементы, объединенные с пробелом между A B.

Вместо этого вы хотите Общее правило, которое будет работать для любого примера (вам также нужен выходной файл):

rule test:
   output: "{sample}.out"
   shell:
      "test.py {wildcards.sample}"  # no need for params, assume this writes output {sample}.out

Здесь test.py - исполняемый файл. Поэтому, когда вы запрашиваете A.out, запускается test.py A, для B.out вы получаете test.py B.

Далее вы должны запрашивать желаемые результаты. Обычно это первое правило в файле змеи, и оно называется all:

rule all:
   input: expand('{sample}.out', sample=SAMPLES)

Опять, расширение даст вам список сэмплов, и в вашем случае, все правило становится:

rule all:
   input: 'A.out', 'B.out'

С указанными выходными файлами snakemake определяет, что тест правил нужно запускать дважды, один раз с A и один раз с B.

Запомните, напишите свои правила как обобщение для любого one образец. Вам может понадобиться только одно расширение в правиле all, чтобы специализировать ваши правила для каждого образца. Snakemake отвечает за определение того, что нужно запустить, и если вы дадите ему дополнительные ядра, он может сделать это одновременно для отдельных заданий.

...