Snakemake 将多个命令行集成在一个规则中
Snakemake integrate the multiple command lines in a rule
我的第一个命令行 "bcftools query -l {input.invcf} | head -n 1"
的输出打印了 vcf 文件的第一个个体的名称(即 IND1
)。我想在 selectvariants GATK
in -sn IND1
选项中使用该输出。如何在 snakemake 中集成第一条命令行以便在下一条中使用它的输出?
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ind= ???
ref="ref.fasta"
output:
out="{family}.dn.vcf"
shell:
"""
bcftools query -l {input.invcf} | head -n 1 > {params.ind}
gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn {params.ind} -O {output.out}
"""
我想我找到了解决办法:
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ref="ref.fasta"
output:
out="{family}.dn.vcf"
shell:
"""
gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn `bcftools query -l {input.invcf} | head -n 1` -O {output.out}
"""
有多种选择,但最简单的一种是将结果存储到临时 bash 变量中:
rule selectvar:
...
shell:
"""
myparam=$(bcftools query -l {input.invcf} | head -n 1)
gatk -sn "$myparam" ...
"""
如@dariober 所述,如果修改 pipefail
行为,可能会出现意外结果,请参阅 。
当我不得不做这些事情的时候我更喜欢用运行而不是shell,然后shell只在最后出来。
这样做的原因是因为它使 snakemake 可以检查 运行 语句,并在出现问题时提前退出,而不是继续执行损坏的 shell 命令。
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ref="ref.fasta"
gatk_opts='--java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants'
output:
out="{family}.dn.vcf"
run:
opts = "{params.gatk_opts} -R {params.ref} -V {input.invcf} -O {output.out}"
sn_parameter = shell("bcftools query -l {input.invcf} | head -n 1")
# we could add a sanity check here if necessary, before shelling out
shell(f"gatk {options} {sn_parameter}")
"""
我的第一个命令行 "bcftools query -l {input.invcf} | head -n 1"
的输出打印了 vcf 文件的第一个个体的名称(即 IND1
)。我想在 selectvariants GATK
in -sn IND1
选项中使用该输出。如何在 snakemake 中集成第一条命令行以便在下一条中使用它的输出?
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ind= ???
ref="ref.fasta"
output:
out="{family}.dn.vcf"
shell:
"""
bcftools query -l {input.invcf} | head -n 1 > {params.ind}
gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn {params.ind} -O {output.out}
"""
我想我找到了解决办法:
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ref="ref.fasta"
output:
out="{family}.dn.vcf"
shell:
"""
gatk --java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants -R {params.ref} -V {input.invcf} -sn `bcftools query -l {input.invcf} | head -n 1` -O {output.out}
"""
有多种选择,但最简单的一种是将结果存储到临时 bash 变量中:
rule selectvar:
...
shell:
"""
myparam=$(bcftools query -l {input.invcf} | head -n 1)
gatk -sn "$myparam" ...
"""
如@dariober 所述,如果修改 pipefail
行为,可能会出现意外结果,请参阅
当我不得不做这些事情的时候我更喜欢用运行而不是shell,然后shell只在最后出来。 这样做的原因是因为它使 snakemake 可以检查 运行 语句,并在出现问题时提前退出,而不是继续执行损坏的 shell 命令。
rule selectvar:
input:
invcf="{family}_my.vcf"
params:
ref="ref.fasta"
gatk_opts='--java-options "-Xms2G -Xmx2g -XX:ParallelGCThreads=2" SelectVariants'
output:
out="{family}.dn.vcf"
run:
opts = "{params.gatk_opts} -R {params.ref} -V {input.invcf} -O {output.out}"
sn_parameter = shell("bcftools query -l {input.invcf} | head -n 1")
# we could add a sanity check here if necessary, before shelling out
shell(f"gatk {options} {sn_parameter}")
"""