将可选的规则输入文件全部放入Snakemake

时间:2019-07-18 09:02:35

标签: python workflow pipeline snakemake

在我的Snakemake项目中,我有一个config.yaml文件,该文件允许用户运行管道的某些步骤,例如:

DEG : 
   exec : True

因此,在Snakefile中,我包括与DEG相关的规则:

if config["DEG"]["exec"]:
   include: "rules/classic_mapping.smk"
   include: "rules/counts.smk"
   include: "rules/run_DESeq2.smk"

问题是,现在我想在“ all”规则中动态指定输出文件,以便Snakemake根据用户输入的参数知道要生成哪些文件。例如,我想到要进行以下操作:

rule all:   
   input:
       if config["DEG"]["exec"]:
          "DEG/DEG.txt"
       if config["DTU"]["exec"]:
          "DTU/DTU.txt" 

但是它不起作用:     如果在规则定义中(Snakefile,第58行),则Unexpected关键字的第58行出现SyntaxError。

我需要一个外部的观点来寻找替代方案,因为Snakemake不应该以这种方式工作

先谢谢了

2 个答案:

答案 0 :(得分:2)

您可以使用snakemake的功能将函数作为输入并将if循环放入函数中。一个示例实现可以如下

def get_input(wildcards):
    input_list = []
    if config["DEG"]["exec"]:
          input_list.append("DEG/DEG.txt")
    if config["DTU"]["exec"]:
          input_list.append("DTU/DTU.txt")
    return input_list

rule all:
    input:
        get_input

如果需要,可以自定义get_input函数以包括其他条件。 here对此进行了进一步记录。

执行此操作的另一种替代方法如下:可读性差,不推荐使用,但是在避免使用附加功能的情况下可以使用

rule all:
    input:
        lambda wildcards: "DEG/DEG.txt" if config["DEG"]["exec"] else [],
        lambda wildcards: "DTU/DTU.txt" if config["DTU"]["exec"] else [],

答案 1 :(得分:1)

输入只是文件列表。您可以在规则定义之外定义它们:

deg_files = []
if config["DEG"]["exec"]:
    deg_files.append("DEG/DEG.txt")

dtu_files = []
if config["DTU"]["exec"]:
    dtu_files.append("DTU/DTU.txt")

rule all:
    input:
        deg_files,
        dtu_files,