Использование snakemake для копирования файла в несколько каталогов, где подстановочный знак используется для части имени цели - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь использовать snakemake для копирования файла в несколько каталогов, и мне нужно иметь возможность использовать подстановочный знак для части имени цели. Ранее я пробовал это с помощью «dirs», указанного в Snakefile (это пример, у фактического приложения есть 15 каталогов).

dirs=['k_1','k2_10']
rule all:
        input:
                expand("{f}/practice_phased_reversed.vcf",f=dirs)
rule r1:
        input:
                "practice_phased_reversed.vcf"
        output:
                "{f}/{input}"
        shell:
               "cp {input} {output}"

Это копирует файл по желанию. Однако имя файла должно быть указано в правиле all. Как я могу изменить это так, чтобы я мог указать цель в командной строке, используя подстановочный знак для части имени?

Затем я попробовал это (ниже) с помощью команды "snakemake practice_phased_reversed.vcf", но она выдала ошибку: "MissingRuleException: нет правил для создания practice_phased_reversed.vcf"

dirs=['k_1','k2_10']
rule all:
        input:
                expand("{f}/{{base}}_phased_reversed.vcf",f=dirs)
rule r1:
        input:
                "{base}_phased_reversed.vcf"
        output:
                "{f}/{input}"
        shell:
               "cp {input} {output}"

Есть ли способ исправить это, чтобы я мог использовать командную строку и подстановочный знак. Спасибо за любую помощь.

1 Ответ

1 голос
/ 17 апреля 2020

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

Однако, если вы просто хотите express целей с помощью командной строки, вам не нужно беспокоиться про правило все. В правиле r1 вы, вероятно, хотите расширить вывод; Я не думаю, что ссылка input работает, и я удивлен, что это не ошибка ...

Итак:

rule r1:
        input:
                "{base}_phased_reversed.vcf"
        output:
                "{f}/{base}_phased_reversed.vcf"
        shell:
               "cp {input} {output}"

snakemake ./test_phased_reversed.vcf все равно будет ошибкой, потому что он пытается сделать файл как ввод и вывод одного и того же правила. Я согласен, что ошибка не очень информативна, поскольку входной файл существует. Может быть, под капотом змейка исключает из рассмотрения правило r1 из-за совпадения входов / выходов? snakemake test/test_phased_reversed.vcf дает копию в подкаталоге.

Надеюсь, это понятно. Я не совсем понимаю, что вы пытаетесь сделать sh хотя!

...