最近,我开始使用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”(以及更多规则),以便我可以一次轻松地运行所有规则?
非常感谢您!
答案 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脚本作为值来分析字典,但这确实很难遵循!