根据可能的输入数量实现动态规则优先级? (snakemake)

时间:2018-04-17 06:36:15

标签: snakemake

在我的工作流程图中,我根据后缀合并了一个或多个输入文件。在给定后缀只有一个文件的情况下,合并操作很简单,可以在本地完成。如果要合并多个此类文件,则需要在群集上运行合并操作,并且需要数小时。

如果我提前知道所有输入文件,有没有办法指定/选择应该使用特定规则?换句话说,有没有办法根据规则的输入数量来表达规则优先级?

def _all_files_for_the_sample(wildcards):
    # lookup all known files and return list
    # of files matching wildcards.sample
    ...

# these two rules effectively have the same structure.
# I am omitting the implementation
rule super_fast_local_merge:
    input: _all_files_for_the_sample
    output: merged_{sample}.txt
    ...

rule super_slow_merge:
    input: _all_files_for_the_sample
    output: merged_{sample}.txt
    ...

现在,我还有一些规则可以对上述任一规则的输出进行计算。该手册提到,在链接多个规则链时,直接从规则全局引用符号更为有效(例如,说明rules.super_slow_merge.output而不是在不同的规则中复制merged_{sample}.txt。我被引导相信通过别名特定规则的输出,我将能够影响图形的形状:

def _choose_merged_file(wildcards):
    all_inputs = _all_files_for_the_sample(wildcards.sample)
    if len(all_inputs) <= 1:
        # use trivial merge
        return rules.super_fast_local_merge.output
    else:
        # fallback to slow merge
        return rules.super_slow_merge.output

rule work_on_merged_data:
    input: _choose_merged_file,
    output: final_result_{sample}.txt
    ...

如果我在这里运行类似上面的内容,那么Snakemake抱怨规则含糊不清。有没有办法修改_choose_merged_file输入函数来克服这个限制?是否有不同的方法来直接对我想要的规则进行别名?

注意:我已经设法通过使每个实现返回不同的文件名(例如merged_slow_{sample}.txtmerged_trivial_{sample}.txt)来获得一些工作,但这样做基本上会污染每个有效的规则合并数据与繁琐的输入函数

如果有人可以提供动态更改工作流程图的方法,那就太棒了。

1 个答案:

答案 0 :(得分:1)

我很遗憾地说,目前没有合理的方法来实现这一目标。但是,在不久的将来会有一个解决方案,即作业分组功能。它将允许您基于通配符,输入文件等来决定是否应将一些连接的作业一起提交(到群集上的同一节点)。这样,您可以将快速合并作业与更长时间运行的内容组合在一起。