在params上使用通配符

时间:2018-03-29 17:19:19

标签: bioinformatics snakemake

我尝试使用一个工具,我需要在输入时使用通配符。

这是一个例子:

aDict = {"120":"121" } #tumor : normal


rule all:
 input: expand("{case}.mutect2.vcf",case=aDict.keys())


def get_files_somatic(wildcards):
 case = wildcards.case
 control = aDict[wildcards.case]
 return [case + ".sorted.bam", control + ".sorted.bam"]



rule gatk_Mutect2:
    input:
        get_files_somatic,

    output:
        "{case}.mutect2.vcf"

    params:
        genome="ref/hg19.fa",
        target= "chr12",
        name_tumor='{case}'
    log:
        "logs/{case}.mutect2.log"
    threads: 8
    shell:
        " gatk-launch Mutect2 -R {params.genome} -I {input[0]} -tumor {params.name_tumor} -I {input[1]} -normal {wildcards.control}"
        " -L {params.target} -O {output}"

我有这个错误:

'Wildcards' object has no attribute 'control'

所以我有一个包含大小写和控件的函数。我无法提取代码。

2 个答案:

答案 0 :(得分:2)

通配符源自输出文件/模式。这就是为什么你只有名为case的通配符。你必须从中派生控件。尝试用以下代码替换shell语句:

run:
    control = aDict[wildcards.case]
    shell(
        "gatk-launch Mutect2 -R {params.genome} -I {input[0]} "
        "-tumor {params.name_tumor} -I {input[1]} -normal {control} "
        "-L {input.target2} -O {output}"
    )

答案 1 :(得分:2)

您可以在control中定义params。 shell命令中的{input.target2}也会导致错误。可能它应该是params.target

rule gatk_Mutect2:
    input:
        get_files_somatic,
    output:
        "{case}.mutect2.vcf"
    params:
        genome="ref/hg19.fa",
        target= "chr12",
        name_tumor='{case}',
        control = lambda wildcards: aDict[wildcards.case]
    shell:
        """
        gatk-launch Mutect2 -R {params.genome} -I {input[0]} -tumor {params.name_tumor} \\
            -I {input[1]} -normal {params.control} -L {params.target} -O {output}
        """