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 参数,对于 guppyplexminion 以及 'all_barcodes' 可以是 {barcode} catFasta。然后使用 --jobname "{params.jobname}.{rule}.{jobid}"