【发布时间】:2021-02-19 10:01:46
【问题描述】:
我有一个我认为应该很容易解决的问题,但由于某种原因我无法解决它.. 我在 Snakemake 中使用 GNU 并行来执行一些变体调用。
我的输入文件 (contigs.txt) 看起来像这样:
GL000207.1
GL000226.1
GL000229.1
GL000231.1
GL000210.1
GL000239.1
GL000235.1
最终执行的命令如下所示:
"name=$(bash get_name.sh normal_recal.bam) \n"
"cat {input.contigs} | "
"env_parallel --env name --jobs {threads} "
"'({input.GATK} Mutect2 -I {input.tumor} -I {input.normal} "
"-R {input.reference} -normal $name "
"--native-pair-hmm-threads 4 "
"-L {{}} --germline-resource {input.gnomAD} "
"-O {input.path}/{wildcards.sample_id}/{{}}.somatic.vcf "
"--f1r2-tar-gz {input.path}/{wildcards.sample_id}/{{}}.f1r2.tar.gz) &> {log.err}.{{}}.err' \n"
如果我在交互式终端中执行此脚本,一切都会按预期工作。但是,当我尝试在snakemake 中执行它时,程序只是结束而没有错误。我想我已经用这个简单的例子找到了问题所在:
cat contigs | env_parallel --env name --jobs 4 'echo $name'
这会打印出类似这样的内容:
sample_tumor GL000207.1
sample_tumor GL000226.1
sample_tumor GL000229.1
sample_tumor GL000231.1
我认为问题在于,输入变量也被传递给$name 变量,这导致程序崩溃。
我想知道如何才能实现,只有实际的$name(即这里的sample_tumor)才能通过。所以上面例子的输出是
sample_tumor
sample_tumor
sample_tumor
sample_tumor
干杯!
【问题讨论】:
-
要避免
{{}},您可以使用-I ++,然后在GNU Parallel 中使用++而不是{}。env_parallel --dryrun ...的输出是什么? -
我目前无法访问集群以检查确切的输出。但我记得输出正是我所期望的。如果我复制了“dryrun commands”之一并手动执行它们,一切都会按预期进行。
-
这也是您应该创建 MCVE stackoverflow.com/help/minimal-reproducible-example 的另一个原因
-
(gatk Mutect2 -I normal_recal.bam -R genome.fa -normal sample_buffy-coat11-01 --native-pair-hmm-threads 4 -L phiX174 --germline-resource af_only_processed_gnomad_with_head.vcf.gz -O phiX174.somatic.vcf --f1r2-tar-gz phiX174.f1r2.tar.gz) &> logs/Mutect2.phiX174.err这是dryrun输出的命令之一。其他的仅在 contig Mutect2 操作上有所不同。就像我说的,如果我在终端中复制此命令,它会按预期工作。 -
您的命令不是 MCVE。你没有包含你正在使用的所有文件,所以我不能在我的电脑上运行那个确切的命令。
标签: parallel-processing snakemake gnu-parallel