Snakemake-如何输入以数字形式描绘的一系列不同文件?

时间:2019-08-21 19:22:02

标签: python snakemake

这似乎是一个基本问题,但我不断得到一些变化的错误:No values given for wildcard

我有22个名为Ne-sQTL_perind.counts.gz.qqnorm_chr{#}.gz的文件。我想按规则对他们采取行动。我最初的样子是这样的:

rule QTLtools_filter:
    input:
        file=expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz",i=range(1,22)),
        chk=".prepare_phen_table.chkpnt"
    output:
        expand("{input.file}.qtltools")
    message:
        "Making phenotype files QTLtools compatible..."
    shell:
        "cat {input.file} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {input.file}.qtltools"

但是,我得到No values found for wildcare 'input',这使我感到困惑,因为在文档中we have a clear example of this working with the wildcare replicates。如何扩展此通配符,使其包括1-22之间编号的所有文件?我还尝试根据this SO post的建议定义一个函数来为我完成此操作,但无济于事;仍然是相同的错误消息。

def expandChromo(wildcards):
    return expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz",i=range(1,22))
...
rule QTLtools_filter:
    input:
        expandChromo,
        chk=".prepare_phen_table.chkpnt"
    output:
        expand("{wildcards.expandChromo}.qtltools")
    message:
        "Making phenotype files QTLtools compatible..."
    shell:
        "cat {wildcards.expandChromo} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {wildcards.expandChromo}.qtltools"

1 个答案:

答案 0 :(得分:1)

您需要有2条规则。第一个(我们称其为all)没有输出,但明确说明了您希望通过管道获得的结果:

rule all:
    input: expand("Ne-sQTL_perind.counts.gz.qqnorm_chr{i}.gz.qtltools", i=range(1,22))

这会让Snakemake知道您的22个目标文件。

现在,您可以教Snakemake创建这些文件了:

rule QTLtools_filter:
    input:
        "{file}.gz"
    output:
        "{file}.gz.qtltools"
    message:
        "Making phenotype files QTLtools compatible..."
    shell:
        "cat {input} | awk '{ $4=$4\" . +\"; print $0 }' | tr " " \"\t\" | bgzip -c > {input}.qtltools"

请注意,此规则将单个文件作为输入,将单个文件作为输出,通配符允许Snakemake为您范围内的每个i匹配此对。我没有发现将chk=".prepare_phen_table.chkpnt"设置为输入的任何理由,但这是您可能需要添加的内容。