【问题标题】:snakemake: wildcards are changing in input functionsnakemake:通配符在输入函数中发生变化
【发布时间】:2017-11-07 02:21:50
【问题描述】:

我对以下规则有疑问,似乎通配符在中途发生了变化。

> maker_flow={'boot1':'init', 'boot2':'boot1', 'final':'boot2'} #this defines the bootstraping workflow {now:last}
> rule maker:
>     input: snap= 'another_file_string_with_same_'.format(), gff=lambda wc: 'maker/{lrun}/{name}_{lrun}.maker.output/{name}_{lrun}.all.gff'.format(lrun=maker_flow[wc.run], name=config['proj']['name'])
>     output:   master='another_file_string_with_same'.format(), gff='maker/{{run}}/{name}_{{run}.maker.output/{name}_{{run}}.all.gff'.format(name=config['proj']['name'])

当我注释掉gff 输入时,代码将运行。否则我会得到:

rule maker:
    input: maker/init/snap/hmm/test_10l_init.snap_hmm, maker/init/test_10l_init.maker.output/test_10l_init.all.gff
    output: maker/boot1/test_10l_boot1.maker.output/test_10l_boot1_master_datastore_index.log, maker/boot1/test_10l_boot1.maker.output/test_10l_boot1.all.gff
    log: /gpfs/projects/bgmp/shared/lizards/test_data/sandbox/snake/logs/test_10l_boot1_maker.log
    jobid: 4
    wildcards: run=boot1

InputFunctionException in line 95 of /gpfs/projects/bgmp/shared/lizards/test_data/sandbox/snake/Snakefile:
KeyError: 'init'
Wildcards:
run=init

这没有多大意义,因为 gff 文件的输入似乎已成功解析。而且通配符好像变了。

还有另一个创建“init”文件的规则

rule maker_init:
    output:
        'maker/{run}/{name}_{run}.maker.output/{name}_{run}_master_datastore_index.log'.format(name=config['proj']['name'], run='init'), gff=protected('maker/init/{name}_{run}.maker.output/{name}_init.all.gff'.format(name=config['proj']['name'], run='init'))

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    在评估 run=boot1 的规则时,snakemake 发现它需要文件“maker/init/test_10l_init.maker.output/test_10l_init.all.gff”。这个文件应该已经存在吗?如果是这样,似乎snakemake没有看到它,因为它看到它可以使用制造商规则模式来创建这个文件(所以现在它正在使用run = init评估规则,因此通配符更改)但是当它尝试在 maker_flow 中查找键“init”,它会得到一个 KeyError。

    【讨论】:

    • 是的,该文件是在 maker_init 规则中创建的。无论如何我可以尝试防止蛇制造这样的行为吗?我试过规则顺序:make_init>maker。两个文件输入也使用相同的通配符。这是否意味着每个文件都有独立的通配符?
    • 如果 ruleorder: make_init > maker 不起作用,那么 make_init 可能有问题,因此snakemake 不会将其视为创建 init 文件的选择。如果没有 ruleorder 行,如果 snakemake 发现两个规则都可以创建一个文件,那么它会给你一个关于模糊规则的错误。不过,我看不出 maker_init 有什么问题。您可以尝试使用 wildcard_constraints 来限制每个规则中的通配符。我会将 'final' 更改为 'bootFinal' 之类的,然后尝试 wildcard_constraints: run='boot.*'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多