Разделение файлов в Snakemake

#snakemake

Вопрос:

У меня есть простой вопрос, но я просто не могу понять его сам.

У меня есть список входных данных (a,b,c). Для каждого ввода мне нужно извлечь некоторые данные (от 1 до 23):

 bcftools view -H a.vcf.gz -r 1 > a_chr1.txt
...
bcftools view -H a.vcf.gz -r 23 > a_chr23.txt
 

Я могу сделать это с помощью цикла FOR в правиле змеиного змея:

 IDS=['a','b','c']
chrs=range(1,23)
rule:
    input:
        expand("{id}.vcf.gz", id=IDS)
    output:
        expand("{id}_{chr}.txt", chr=chrs, id=IDS)
    run:
        for i in IDS:
            for c in chrs:
                shell("bcftools view -H {i}.vcf.gz -r {c} > {i}_chr{c}.txt")
 

, но цикл FOR не распараллеливает его. Мне нужен правильный способ создания Змеи, как показано ниже, но это не работает.

 IDS=['a','b','c']
chrs=range(1,23)

rule:
    input:
        expand("{id}.vcf.gz", id=IDS)
    output:
        expand("{id}_{chr}.txt", chr=chrs, id=IDS)
    params:
        c=expand("{chr}", chr=chrs)
    shell:
        "bcftools view -H {input} -r {params.c} > {output}"
 

Не могли бы вы, пожалуйста, помочь?

Ответ №1:

Вы не используете здесь подстановочные знаки snakemake. Если вы укажете an expand в своих входах и выходах, то snakemake запустит правило только один раз. Он сообщает snakemake, что для выполнения правила необходимы все файлы vcf и что это правило приведет к созданию всех разделенных файлов. Что вам нужно, так это правило, которое может быть применено к любому файлу vcf и будет выдавать только один разделенный (по chr) вывод.

 IDS=['a','b','c']
chrs=range(1,23)

rule all:
    input: expand("{id}_{chr}.txt", chr=chrs, id=IDS)

rule splitByChr:
    input:
        "{id}.vcf.gz"
    output:
        "{id}_{chr}.txt"
    shell:
        "bcftools view -H {input} -r {wildcards.chr} > {output}"
 

rule all Здесь будет срабатывать rule splitByChr столько раз, сколько необходимо.
Также обратите внимание, что {id} и {chr} в функции расширения не являются подстановочными знаками. Они являются заполнителями для определенных аргументов расширения.