Snakemake 关于克服规则模糊的工作流设计建议
Snakemake suggestions on the workflow design to overcome the ambiguous rules
我有两个规则能够根据通配符值生成相同的输出,这会导致规则不明确异常。
我阅读了 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"
提前致谢。
你的问题不是设计上的问题,而是你的两个规则的输出和使用的通配符无法区分。
两个都
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"
我有两个规则能够根据通配符值生成相同的输出,这会导致规则不明确异常。
我阅读了 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"
提前致谢。
你的问题不是设计上的问题,而是你的两个规则的输出和使用的通配符无法区分。
两个都
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"