Snakemake:为同一个参数创建多个通配符
Snakemake: create multiple wildcards for the same argument
我正在尝试 运行 一个 GenotypeGVCFs
许多 vcf 文件。命令行希望每个 vcf
文件都列为:
java-jar GenomeAnalysisTK.jar -T GenotypeGVCFs \
-R my.fasta \
-V bob.vcf \
-V smith.vcf \
-V kelly.vcf \
-o {output.out}
如何在 snakemake 中执行此操作?这是我的代码,但我不知道如何为 -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}
"""
你本末倒置。规则泛化需要通配符:您可以为规则定义一个模式,其中通配符用于定义通用部分。在您的示例中没有模式:一切都由 SAMPLES
的值定义。这不是使用 Snakemake 的推荐方式;管道应由文件系统定义:磁盘上存在哪些文件。
顺便说一句,您的代码将不起作用,因为 input
应定义文件名列表,而在您的示例中,您(错误地)试图定义 "-V filename"
之类的字符串。
所以,你有输出:"all_genotyped.vcf"
。您有输入:["bob.vcf", "smith.vcf", "kelly.vcf"]
。您甚至不需要在这里使用 lambda,因为输入不依赖于任何通配符。所以,你有:
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
list smells。或者:如果你已经定义了所有依赖项,你真的需要 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}
如何在 snakemake 中执行此操作?这是我的代码,但我不知道如何为 -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}
"""
你本末倒置。规则泛化需要通配符:您可以为规则定义一个模式,其中通配符用于定义通用部分。在您的示例中没有模式:一切都由 SAMPLES
的值定义。这不是使用 Snakemake 的推荐方式;管道应由文件系统定义:磁盘上存在哪些文件。
顺便说一句,您的代码将不起作用,因为 input
应定义文件名列表,而在您的示例中,您(错误地)试图定义 "-V filename"
之类的字符串。
所以,你有输出:"all_genotyped.vcf"
。您有输入:["bob.vcf", "smith.vcf", "kelly.vcf"]
。您甚至不需要在这里使用 lambda,因为输入不依赖于任何通配符。所以,你有:
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
list smells。或者:如果你已经定义了所有依赖项,你真的需要 Snakemake 吗?