Snakemake: создать несколько подстановочных знаков для одного и того же аргумента
Я пытаюсь запустить
GenotypeGVCFs
на многих файлах vcf. Командная строка хочет, чтобы каждый
vcf
файлы будут перечислены как:
java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs \
-R my.fasta \
-V bob.vcf \
-V smith.vcf \
-V kelly.vcf \
-o {output.out}
Как это сделать в змейке? Это мой код, но я не знаю, как создать подстановочные знаки для -V.
workdir: "/path/to/workdir/"
SAMPLES=["bob","smith","kelly]
print (SAMPLES)
rule all:
input:
"all_genotyped.vcf"
rule genotype_GVCFs:
input:
lambda w: "-V" + expand("{sample}.vcf", sample=SAMPLES)
params:
ref="my.fasta"
output:
out="all_genotyped.vcf"
shell:
"""
java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs -R {params.ref} {input} -o {output.out}
"""
1 ответ
Вы ставите телегу впереди лошади. Подстановочные знаки необходимы для обобщения правил: вы можете определить шаблон для правила, в котором подстановочные знаки используются для определения общих частей. В вашем примере нет шаблонов: все определяется значением . Это не рекомендуемый способ использования Snakemake; конвейер должен определяться файловой системой: какие файлы присутствуют на вашем диске.
Кстати, ваш код не будет работать, так как должен определять список имен файлов, в то время как в вашем примере вы (неправильно) пытаетесь определить строки типа
"-V filename"
.
Итак, у вас есть вывод:
"all_genotyped.vcf"
. У вас есть вход:
["bob.vcf", "smith.vcf", "kelly.vcf"]
. Вам даже не нужно использовать здесь лямбду, так как ввод не зависит ни от какого подстановочного знака. Так что у тебя есть:
rule genotype_GVCFs:
input:
expand("{sample}.vcf", sample=SAMPLES)
output:
"all_genotyped.vcf"
...
На самом деле вам даже не нужно
input
раздел. Если вы точно знаете, что файлы из
SAMPLES
список существует, вы можете его пропустить.
значения для
-V
можно определить в параметрах:
rule genotype_GVCFs:
#input:
# expand("{sample}.vcf", sample=SAMPLES)
output:
"all_genotyped.vcf"
params:
ref = "my.fasta",
vcf = expand("-V {sample}", sample=SAMPLES)
shell:
"""
java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs -R {params.ref} {params.vcf} -o {output}
"""
Это должно решить вашу проблему, но я бы посоветовал вам переосмыслить свое решение. Использование
SAMPLE
перечислить запахи. В качестве альтернативы: вам действительно нужен Snakemake, если у вас уже определены все зависимости?