snakemake - 通过集群配置文件用通配符替换命令行参数
snakemake - replacing command line parameters with wildcards by cluster profile
我正在编写一个 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 具有有意义的名称,其中包括通配符和每个作业的规则名称。
但是,如果我用
调用 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 documentation,其中似乎我可以用 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
替换配置文件中的 o
(有点像参数的长版本(-h
vs --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
参数,对于 guppyplex
和 minion
以及 'all_barcodes'
可以是 {barcode}
catFasta
。然后使用 --jobname "{params.jobname}.{rule}.{jobid}"
我正在编写一个 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}"
)。虽然文档对我来说不是那么清楚。
我在 /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
替换配置文件中的 o
(有点像参数的长版本(-h
vs --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
参数,对于 guppyplex
和 minion
以及 'all_barcodes'
可以是 {barcode}
catFasta
。然后使用 --jobname "{params.jobname}.{rule}.{jobid}"