将命令行参数替换为集群配置文件中的通配符



我正在编写一个蛇形管道,以最终识别冠状病毒变种。

下面是一个包含三个步骤的最小示例:

LOGDIR = '/path/to/logDir'
barcodes = ['barcode49', 'barcode50', 'barcode51']
rule all:
input:
expand([
# guppyplex
"out/guppyplex/{barcode}/{barcode}.fastq",
# catFasta
"out/catFasta/cat_consensus.fasta",
], barcode = barcodes)

rule guppyplex:
input:
FQ = f"fastq/{{barcode}}" # FASTQ_PATH is parsed from config.yaml
output:
"out/guppyplex/{barcode}/{barcode}.fastq"
shell:
"touch {output}" # variables in CAPITALS are parsed from config.yaml

rule minion:
input:
INFQ = rules.guppyplex.output,
FAST5 = f"fasta/{{barcode}}"
params:
OUTDIR = "out/nanopolish/{barcode}"
output:
"out/nanopolish/{barcode}/{barcode}.consensus.fasta"
shell:
"""
touch {output} && echo {wildcards.barcode} > {output}
"""
rule catFasta:
input:
expand("out/nanopolish/{barcode}/{barcode}.consensus.fasta", barcode = barcodes)
output:
"out/catFasta/cat_consensus.fasta"
shell:
"cat {input} > {output}"

如果我通过调用snakemake -p --cores 1 all在本地运行snakemake,一切都正常。然而,我的最终目标是使用qsub在集群上运行作业。我还希望qsub中的stderr和stdout具有有意义的名称,其中包括通配符和每个作业的规则名称。

但是,如果我用调用snakemake

snakemake -p --cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}" all

我将得到以下错误:

AttributeError: 'Wildcards' object has no attribute 'barcode'

我最近阅读了snakemake文档,其中显示我可以用yaml文件替换命令行参数(--cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}"(。尽管文件对我来说不是那么清楚。

我在/home/user/.config/snakemake创建了一个config.yaml文件,看起来像这样:

cluster: 'qsub'
q: 'onlybngs05b'
e: '/home/ngs/tempOutSnakemake'
o: '/home/ngs/tempOutSnakemake'
j: 5
jobname: "{wildcards.barcode}.{rule}.{jobid}

但是后来看起来snakemake没有正确解析config.yaml。我得到

snakemake: error: ambiguous option: --o=/home/ngs/tempOutSnakemake could match --omit-from, --output-wait, --overwrite-shellcmd

我还试图用stdout(参数的长版本(几个程序的-h--help(替换配置文件中的o,但它不起作用。

因此,我的问题是如何用接受通配符的config.yaml文件替换命令行参数--cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}"

我认为问题在于规则catFasta不包含通配符barcode。如果你仔细想想,你希望{wildcards.barcode}.{rule}.{jobid}的工作名称是什么?

也许一个解决方案可以是向每个规则添加一个jobname参数,该参数可以是guppyplex{barcode}minion以及catFasta'all_barcodes'。然后使用--jobname "{params.jobname}.{rule}.{jobid}"

最新更新