Snakemake интегрирует несколько командных строк в правило
Вывод моей первой командной строки
"bcftools query -l {input.invcf} | head -n 1"
печатает имя первого индивидуума файла vcf (т.е.
IND1
). Я хочу использовать этот вывод в
selectvariants GATK
в
-sn IND1
вариант. Как можно интегрировать 1-ю командную строку в змейку, чтобы использовать ее вывод в следующей?
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}
"""
3 ответа
Есть несколько вариантов, но самый простой — сохранить результаты во временную переменную bash:
rule selectvar:
...
shell:
"""
myparam=$(bcftools query -l {input.invcf} | head -n 1)
gatk -sn "$myparam" ...
"""
Как отметил @dariober, если изменить
pipefail
поведение, могут быть неожиданные результаты, см . пример в этом ответе .
Когда мне приходится делать эти вещи, я предпочитаю использовать run вместо 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}")
"""
Я думаю, что нашел решение:
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}
"""