#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}
в функции расширения не являются подстановочными знаками. Они являются заполнителями для определенных аргументов расширения.