Snakemake关于工作流设计的建议,以克服模棱两可的规则

时间:2018-02-01 17:07:23

标签: snakemake

我有两个规则能够根据通配符值生成相同的输出,这会导致模糊规则异常。
我阅读了http://snakemake.readthedocs.io/en/latest/snakefiles/rules.html?highlight=ruleorder#handling-ambiguous-rules关于处理模糊规则异常的文档。
似乎使用规则命令可能是解决方案。但是,我的规则 preprocess_zheng17 的输入取决于 simulate_data 规则的输出。因此,如果我使用ruleorder: simulate_data > preprocess_zheng17,那么preprocess_zheng17规则永远不会运行。
我想要做的是首先运行 simulate_data ,然后为每个通配符对运行 preprocess_zheng17 规则。我想知道什么是一个很好的工作流设计实践来应对这个问题。规则如下。

rule preprocess_zheng17:
    input:
        loom_file = SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}.loom'
    params:
        transpose = False
    output:
        SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}_zheng17.loom'
    script: 
        "scripts/preprocess_zheng17.py"

rule simulate_data:
    input:
        sample_loom = HDF5_OUTPUT+'/{sample}.loom'
    params:
        group_prob = config['splat_simulate']['group_prob'],
        dropout_present = config['splat_simulate']['dropout_present']
    output:
        SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}.loom'
    script:
        "scripts/data_simulation.R"

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的问题不是来自设计,而是来自您的两条规则的输出和使用的通配符无法区分的事实。 都 SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}_zheng17.loom'SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}.loom'
以相同的模式开始和结束,而snakemake无法确定_zheng17是否是通配符{loc}的一部分。

您既可以使用评论中描述的bli,也可以稍微更改一条规则的输出。例如:

rule preprocess_zheng17:
    input:
        loom_file = SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}.loom'
    params:
        transpose = False
    output:
        SIMULATED_DATA_OUTPUT+'/{sample}_sim_zheng17_loc{loc}.loom'
    script: 
        "scripts/preprocess_zheng17.py"

rule simulate_data:
    input:
        sample_loom = HDF5_OUTPUT+'/{sample}.loom'
    params:
        group_prob = config['splat_simulate']['group_prob'],
        dropout_present = config['splat_simulate']['dropout_present']
    output:
        SIMULATED_DATA_OUTPUT+'/{sample}_sim_loc{loc}.loom'
    script:
        "scripts/data_simulation.R"