如何解决snakemake - 通过集群配置文件用通配符替换命令行参数
我正在编写一条蛇形管道,以最终识别冠状病毒变种。
下面是一个包含三个步骤的最小示例:
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 具有有意义的名称,其中包括通配符和每个作业的规则名称。
但是,如果我用
调用snakemakesnakemake -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 documentation,似乎可以用 yaml 文件替换命令行参数 (--cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}"
)。虽然文档对我来说不是很清楚。
我在 config.yaml
创建了一个 /home/user/.config/snakemake
文件,如下所示:
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
我还尝试将配置文件中的 o
替换为 stdout
(参数的长版本(-h
与 --help
对于多个程序),不过它不起作用。
因此,我的问题是如何将命令行参数 --cluster "qsub -q onlybngs05b -e {LOGDIR} -o {LOGDIR} -j y" -j 5 --jobname "{wildcards.barcode}.{rule}.{jobid}"
替换为接受通配符的 config.yaml
文件?
解决方法
我认为问题在于规则 catFasta
不包含通配符 barcode
。如果您想一想,您希望{wildcards.barcode}.{rule}.{jobid}
中的职位名称是什么?
也许一种解决方案是向每个规则添加一个 jobname
参数,该参数可以是 {barcode}
的 guppyplex
和 minion
和 'all_barcodes'
的 catFasta
}}。然后使用 --jobname "{params.jobname}.{rule}.{jobid}"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。