我需要在同一个snakefile中运行两个规则(gatk_Mutect2
和gatk_IndelRealigner
)。
如果将这些规则放在不同的snakefiles中,我可以毫无错误地运行它们。
我使用两个输入函数(get_files_somatic
和get_files
)。两者都使用案例名称作为字典键。 (每个案例都有正常)。
当我将这些规则放在同一个snakefile中时,snakemake会尝试在gatk_IndelRealigner
的输入上找到法线的id。
我的问题是:如何管理两条规则的含糊不清?我的意思是我希望snakemake不要尝试连接这两条规则。
def get_files_somatic(wildcards):
case = wildcards.case
control = aCondition[case][0]
return ["{}.sorted.dup.reca.cleaned.bam".format(case),"{}.sorted.dup.reca.cleaned.bam".format(control)]
rule all:
input: expand("{sample}.sorted.dup.reca.cleaned.bam",sample=create_tumor()),
expand("Results/vcf/{case}.vcf",case=create_tumor()),
include_prefix="rules"
include:
include_prefix + "/gatk2.rules"
include:
include_prefix + "/mutec2.rules"
rule gatk_Mutect2:
input: get_files_somatic,
output: "Results/vcf/{case}.vcf",
params:
log: "logs/{case}.mutect2.log"
threads: 8
shell:
rule gatk_IndelRealigner:
input:
get_files,
output:
"{case}.sorted.dup.reca.cleaned.bam",
"{case}.sorted.dup.reca.cleaned.bai",
params:
log:
"mapped_reads/merged_samples/logs/{case}_indel_realign_2.log"
threads: 8
shell:
def get_files(wildcards):
case = wildcards.case
control = aCondition[case][0]
wildcards.control = control
return ["mapped_reads/merged_samples/{}.sorted.dup.reca.bam".format(case), "mapped_reads/merged_samples/{}.sorted.dup.reca.bam".format(control),"mapped_reads/merged_samples/operation/{}_{}.realign.intervals".format(case,control)]
答案 0 :(得分:1)
我不确定我是否真的理解你的问题。例如,我不明白你的意思"每个案例都有正常的"。
但我可以看到gatk_IndelRealigner
("{case}.sorted.dup.reca.cleaned.bam"
)的输出恰好与get_files_somatic
("{}.sorted.dup.reca.cleaned.bam".format(case)
的结果之一相同,其中{ {1}}是case
)。
这就是为什么wildcards.case
获得"连接"到gatk_Mutect2
。
snakemake的本质是根据输入和输出之间的文件名匹配来连接规则。
如果您不希望链接这两个规则,则需要使用不同的文件名。