微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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”(以及更多规则),以便我可以一次轻松地运行所有规则?

非常感谢您!

解决方法

对于您的问题,我不是很肯定,但是就规则而言,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,'B',...,'Z']

rule all:
  input:
    expand('{label}-{analysis}.out',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脚本作为值来分析字典,但这确实很难遵循!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。