使用相同的输入和单个参数的值范围并行执行snakemake规则

时间:2019-01-29 14:12:34

标签: snakemake

我正在将bash脚本转换为snakemake,并且我想使用for循环并行化之前处理的步骤。我遇到的问题是,snakemake最终没有尝试运行并行进程,而是尝试使用所有参数运行一个进程而失败。

我原来的bash脚本针对参数K的值范围多次运行程序。

for num in {1..3}
do
  structure.py -K $num --input=fileprefix --output=fileprefix
done

有多个以fileprefix开头的输入文件。每次运行有两个主要输出,例如对于K = 1,它们是fileprefix.1.meanPfileprefix.1.meanQ。我的配置文件和snakemake文件如下。

配置:

cat config.yaml

infile: fileprefix
K:
  - 1
  - 2
  - 3

Snakemake:

configfile: 'config.yaml'

rule all:
    input:
        expand("output/{sample}.{K}.{ext}",
            sample = config['infile'],
            K = config['K'],
            ext = ['meanQ', 'meanP'])

rule structure:
    output:
        "output/{sample}.{K}.meanQ",
        "output/{sample}.{K}.meanP"
    params:
        prefix = config['infile'],
        K = config['K']
    threads: 3
    shell:
        """
        structure.py -K {params.K} \
        --input=output/{params.prefix} \
        --output=output/{params.prefix}
        """

这是用snakemake --cores 3执行的。当我仅使用一个线程时,问题仍然存在。

我期望上述每个K值的输出,但是运行失败并出现以下错误:

RuleException:
CalledProcessError in line 84 of Snakefile:
Command ' set -euo pipefail;  structure.py -K 1 2 3 --input=output/fileprefix \
--output=output/fileprefix ' returned non-zero exit status 2.
  File "Snakefile", line 84, in __rule_Structure
  File "snake/lib/python3.6/concurrent/futures/thread.py", line 56, in run

当我将K设置为诸如K = ['1']之类的单个值时,一切正常。因此,问题似乎在于,执行shell命令时,{params.K}被扩展为K的所有值。我今天开始教自己做蛇制作,并且效果很好,但与此同时我碰到了砖墙。

1 个答案:

答案 0 :(得分:1)

您需要从通配符而不是从配置文件中检索-K的参数。配置文件将仅返回您的可能值列表,这是一个简单的python字典。

configfile: 'config.yaml'

rule all:
    input:
        expand("output/{sample}.{K}.{ext}",
               sample = config['infile'],
               K = config['K'],
               ext = ['meanQ', 'meanP'])

rule structure:
    output:
        "output/{sample}.{K}.meanQ",
        "output/{sample}.{K}.meanP"
    params:
        prefix = config['invcf'],
        K = config['K']
    threads: 3
    shell:
        "structure.py -K {wildcards.K} "
        "--input=output/{params.prefix} "
        "--output=output/{params.prefix}"

请注意,这里还有更多需要改进的地方。例如,规则structure尽管定义了一个输入文件,但并未定义任何输入文件。