Snakemake级联检查点不起作用

时间:2020-02-04 16:10:50

标签: nested snakemake

我有以下情况

  1. 检查点 A 在文件夹A_Out中创建文件(1或2)
  2. 检查点 B A_Out中的所有文件作为输入,并在B_Out中生成文件(1或2)
  3. 我有条件规则 C ,可以从A或B接收输入并产生最终输出

我正在使用以下代码,

checkpoint A:
   output: directory("A_Out")
   # Rest of the logic

def collect_a(wildcards):
   path = checkpoints.A.get(**wildcards).output[0]
   return expand("{path}/{file}.txt",
                  path=path,
                  file=glob_wildcards(os.path.join(path, "{name}.txt")).name)

checkpoint B:
   input: collect_a
   output: directory("B_Out")
   # Rest of the logic

def collect_b(wildcards):
   path = checkpoints.B.get(**wildcards).output[0]
   return expand("{path}/{file}.txt",
                  path=path,
                  file=glob_wildcards(os.path.join(path, "{name}.txt")).name)

def conditional_input(wildcards):
   if condition_A:
      return collect_a(wildcards)
   else:
      return collect_b(wildcards)

rule c:
   input: conditional_input
   # Rest of the logic

在上述情况下,当condition_a为False时,它仅评估检查点B,而不评估检查点A。如何解决此问题?还是还有其他优雅的方式?

1 个答案:

答案 0 :(得分:0)

这些级联的检查点调用非常有问题,并且存在一些与之相关的问题。如果您进一步充实示例,可以假定您使用的是最新版本的snakemake,可以将问题提交给github。

作为一种解决方法,您可以尝试在每个目录中添加一个临时信号文件以指示规则已完成。然后,您需要在规则代码中添加通配符。

不太好,但是可以工作。因为您有一个临时输入作为信号,所以即使其他文件已经存在,规则也会每次重新运行。 snakemake不知道它们是输出。另一种选择是预先检查您的输入,以确定是否将生成一个或两个文件,然后将其绕过检查点与您的输入函数逻辑联系起来。