访问规则中的嵌套配置变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问规则中的嵌套配置变量相关的知识,希望对你有一定的参考价值。

我是Snakemake的新手,并试图弄清楚嵌套配置值是如何工作的。我创建了以下配置文件...

# dummyconfig.json
{
    "fam1": {
        "numchr": 1,
        "chrlen": 2500000,
        "seeds": {
            "genome": 8013785666,
            "simtrio": 1776,
            "simseq": {
                "mother": 2053695854357871005,
                "father": 4517457392071889495,
                "proband": 2574020394472462046
            }
        },
        "ninherited": 100,
        "ndenovo": 5,
        "numreads": 375000
    }
}

...在我的Snakefile中遵循这条规则(以及其他规则)。

# Snakefile
rule simgenome:
    input:
        "human.order6.mm",
    output:
        "{family}-refr.fa.gz"
    shell:
        "nuclmm simulate --out - --order 6 --numseqs {config[wildcards.family][numchr]} --seqlen {config[wildcards.family][chrlen]} --seed {config[wildcards.family][seeds][genome]} {input} | gzip -c > {output}"

然后我想通过调用fam1-refr.fa.gz来创建snakemake --configfile dummyconfig.json fam1-refr.fa.gz。当我这样做时,我收到以下错误消息。

Building DAG of jobs...

rule simgenome:
    input: human.order6.mm
    output: fam1-refr.fa.gz
    jobid: 0
    wildcards: family=fam1

RuleException in line 1 of /Users/standage/Projects/noble/Snakefile:
NameError: The name 'wildcards.family' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be escaped by repeating them, i.e. {{print $1}}

所以fam1被正确地识别为family通配符的值,但它似乎不像{config[wildcards.family][numchr]}这样的变量访问工作。

是否可以以这种方式遍历嵌套配置,或者Snakemake是否仅支持访问顶级变量?

答案

解决它的一种方法是使用params并解析shell块之外的变量。

rule simgenome:
    input:
        "human.order6.mm",
    output:
        "{family}-refr.fa.gz"
    params:
        seed=lambda w: config[w.family]['seeds']['genome'],
        numseqs=lambda w: config[w.family]['numchr'],
        seqlen=lambda w: config[w.family]['chrlen']
    shell:
        "nuclmm simulate --out - --order 6 --numseqs {params.numseqs} --seqlen {params.seqlen} --seed {params.seed} {input} | gzip -c > {output}"

以上是关于访问规则中的嵌套配置变量的主要内容,如果未能解决你的问题,请参考以下文章

访问嵌套片段的文本字段

Firestore - 访问安全规则中的事务/嵌套数据

Recyclerview 滚动在嵌套滚动视图中的片段中不起作用

Python嵌套函数和闭包

ZeroC ICE源代码中的那些事 - 嵌套类和局部类

js代码嵌套问题,为啥外层定义的变量内层不能使用