我正在尝试构建一个简单的工作流,以将参数列表提供给脚本。为了说明:
SAMPLES=['A','B']
rule test:
params:
sample=expand("{sample}", sample=SAMPLES)
script:
"test.py {params.sample}"
但是,snakemake仅使用示例A
而不是B
执行脚本。换句话说,我相信它正在执行python test.py A B
,而不是python test.py A
然后执行python test.py B
。同样,我认为可以通过以下方式说明这一点:
SAMPLES=['A','B']
rule print_samples:
params:
sample=expand("{sample}", sample=SAMPLES)
script:
"echo {params.sample} \n"
我希望看到A
和B
在不同的行上打印出来,但是相反,它在同一行上打印A B
。
我是否缺少关于使用params进行扩展的方式的某些信息?理想情况下,我想添加-j
标志以并行运行它们(目前-j
仅使用A
单独执行)。
答案 0 :(得分:4)
这是预期的输出。在这种情况下,expand只是一个包装器
[str(sample) for sample in SAMPLES]
当输入到shell或脚本中时,它们变成在A B
之间加空格的项。
相反,您想要一条适用于任何样本的通用规则(您还需要一个输出文件):
rule test:
output: "{sample}.out"
shell:
"test.py {wildcards.sample}" # no need for params, assume this writes output {sample}.out
此处test.py是可执行文件。
因此,当您要求A.out时,test.py A
运行,对于B.out,您得到test.py B
。
接下来,您需要询问所需的输出。通常,这是蛇文件中的第一条规则,并称为all:
rule all:
input: expand('{sample}.out', sample=SAMPLES)
再次,展开将为您提供示例列表,对于您而言,规则全部变为:
rule all:
input: 'A.out', 'B.out'
使用指定的输出文件,snakemake确定规则测试需要运行两次,一次使用A,一次使用B。
所以请记住,将您的规则写为任何 one 示例的概括。您可能只需要在全部规则中进行一次扩展就可以针对每个样本专门化规则。 Snakemake负责确定需要运行的内容,如果为它提供了更多的内核,则可以同时针对单独的作业执行此操作。