Snakemake:为特定目录中的所有文件组合不同的规则

时间:2020-10-23 12:52:39

标签: snakemake

最近,我开始使用snakemake进行数据分析。 我仍然是一个初学者,这是我有关stackoverflow的第一篇文章。

我有不同的规则产生不同的输出,但是所有规则都应在某个目录的所有文件上运行。

这是一个简化的示例:

LABELS, = glob_wildcards('{label}.dat')

rule all:
  input:
    expand('{label}-A.out', label=LABELS),
    expand('{label}-B.out', label=LABELS)

rule A:
  input: expand('{label}-A.out', label=LABELS)

rule B:
  input: expand('{label}-B.out', label=LABELS)

rule create_A_out:
  output:
    '{label}-A.out'
  shell:
    'touch {output}'

rule create_B_out:
  input:
    'test.dat'
  output:
    '{label}-B.out'
  shell:
    'touch {output}'

要一次更新所有输出文件,我是否需要编写一条像“全部”这样的规则来手动收集我需要的所有输出文件?

或者是否有一种方法可以组合规则“ A”和“ B”(以及更多规则),以便我可以一次轻松地运行所有规则?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

对于您的问题,我不是很肯定,但是就规则而言,A和B是多余的。如果您想直接链接规则输出,则可以使用rule dependencies,尽管我更喜欢保留文件名的明确性。也许您正在寻找更复杂的扩展,例如:

LABELS, = glob_wildcards('{label}.dat')
analyses = ['A', 'B']  # ...

rule all:
  input:
    expand('{label}-{analysis}.out',
           label=LABELS,
           analysis=analyses)

rule create_A_out:
  input:
    '{label}.dat'
  output:
    '{label}-A.out'
  shell:
    'touch {output}'

rule create_B_out:
  input:
    '{label}.dat'
  output:
    '{label}-B.out'
  shell:
    'touch {output}'

默认情况下,expand将产生您提供的所有列表的组合。我还向您的输入添加了通配符,并为您所针对的.dat文件添加了输入。如果您保持相同的通用格式,只需在分析中添加一条规则和一个元素即可。

如果您要进行大量分析,则还可以使用anonymous rules获得更出色的分析。假设我有python脚本analysis-[A-Z].py。您可以将它们链接到输出文件,如下所示:

LABELS, = glob_wildcards('{label}.dat')
analyses = ['A', 'B', ..., 'Z']

rule all:
  input:
    expand('{label}-{analysis}.out',
           label=LABELS,
           analysis=analyses)

for analysis in analyses:
   rule:
       input: '{label}.dat'
       output: f'{{label}}-{analysis}.dat'  # will be {label}-A.dat after formatting
       script: f'analysis-{analysis}.py'

您甚至可以使用shell脚本作为值来分析字典,但这确实很难遵循!