Snakemake:展开参数

问题描述 投票:0回答:1

我正在尝试构建一个简单的工作流,以将参数列表提供给脚本。举例说明:

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"

我希望看到AB在不同的行上打印出来,但相反,它在同一行上打印A B

我是否缺少有关使用params进行扩展的方式的某些信息?理想情况下,我想添加-j标志以并行运行它们(此刻-j仅使用A即可执行)。

parameters expand snakemake
1个回答
0
投票

这是预期的输出。在这种情况下,扩展仅是

的包装
[str(sample) for sample in SAMPLES]

当输入到外壳程序或脚本中时,这些将成为在A B之间插入空格的项目。

相反,您想要一条适用于任何样本的通用规则(您还需要一个输出文件:]

rule test:
   output: {sample}.out
   script:
      "test.py {wildcards.sample}"  # no need for params, assume this writes output {sample}.out

因此,当您要求A.out时,test.py A运行,对于B.out,您会得到test.py B

接下来,您需要询问所需的输出。这通常是snakefile中的第一条规则,并称为all:

rule all:
   input: expand('{sample}.out', sample=SAMPLES)

再次,展开将给您示例列表,并且在您的情况下,规则全部变为:

rule all:
   input: 'A.out', 'B.out'

使用指定的输出文件,snakemake确定需要两次运行规则测试,一次使用A,一次使用B。

所以请记住,将您的规则写为任何one示例的概括。您可能只需要对所有规则进行一次扩展就可以针对每个样本专门化规则。 Snakemake负责确定需要运行的内容,如果为它提供了更多的内核,则可以同时针对单独的作业执行此操作。

© www.soinside.com 2019 - 2024. All rights reserved.