我有两个规则能够根据通配符值生成相同的输出,这会导致模糊规则异常。
我阅读了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"
提前谢谢。
答案 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"