2016-12-06 41 views
1

我不明白如何使用Snakemake规则删除一个无用的Snakemake输出文件。Snakemake:删除输出文件

具体而言,我有一个规则bwa_mem_sam,它创建一个名为{sample}.sam的文件。 我有这个其他规则,bwa_mem_bam创建一个名为{sample.bam}的文件。

这两个文件包含不同格式的相同信息,我想删除第一个不能成功做到这一点。

任何帮助将非常感激。 本。

rule bwa_mem_map: 
    input: 
     sam="{sample}.sam", 
     bam="{sample}.bam" 
    shell: 
     "rm {input.sam}" 

# Convert SAM to BAM. 
rule bwa_mem_map_bam: 
    input: 
     rules.sam_to_bam.output 


# Use bwa mem to map reads on a reference genome. 
rule bwa_mem_map_sam: 
    input: 
     reference=reference_genome(), 
     index=reference_genome_index(), 
     fastq=lambda wildcards: config["units"][SAMPLE_TO_UNIT[wildcards.sample]], 
    output: 
     "mapping/{sample}.sam" 
    threads: 12 
    log: 
     "mapping/{sample}.log" 
    shell: 
     "{BWA} mem -t {threads} {input.reference} {input.fastq} > {output} 2> {log} "\ 
     "|| (rc=$?; cat {log}; exit $rc;)" 


rule sam_to_bam: 
    input: 
     "{prefix}.sam" 
    output: 
     "{prefix}.bam" 
    threads: 8 
    shell: 
     "{SAMTOOLS} view --threads {threads} -b {input} > {output}" 

回答

1

你不需要一个规则来删除你的SAM文件。只是标志着“bwa_mem_map_sam”规则的输出中的SAM文件作为临时:

rule bwa_mem_map_sam: 
    input: 
     reference=reference_genome(), 
     index=reference_genome_index(), 
     fastq=lambda wildcards: config["units"][SAMPLE_TO_UNIT[wildcards.sample]], 
    output: 
     temp("mapping/{sample}.sam") 
    threads: 12 
    log: 
     "mapping/{sample}.log" 
    shell: 
     "{BWA} mem -t {threads} {input.reference} {input.fastq} > {output} 2> {log} "\ 
     "|| (rc=$?; cat {log}; exit $rc;)" 

就不需要临时文件了(即:不能用作任何其他规则输入),它将被snakemake去除。

编辑后评论: 如果我理解正确,您的陈述“如果用户要求sam ...”意味着sam文件被放入目标规则。如果是这种情况,那么只要目标规则的输入包含sam文件,文件将不会被删除(我猜)。如果bam文件放在目标规则(而不是sam)中,则它将被删除。

另一种方式是这样的:

rule bwa_mem_map: 
    input: 
     sam="{sample}.sam", 
     bam="{sample}.bam" 
    output: 
     touch("{sample}_samErased.txt") 
    shell: 
     "rm {input.sam}" 

,并在目标规则索要 “{}样品_samErased.txt”。

+0

谢谢您的回答。我想到了这一点,但我认为在建立一个完整的图书馆的背景下它不那么灵活。基本上我认为每个规则都应该是最小的,应该实施自治规则来增加更多的功能。因此,在这种情况下,我认为可能需要使用SAM输出,这就是为什么我想保留能够请求SAM的选项,并且如果用户要求提供BAM,那么SAM将被删除。 – blaurent

+0

@blaurent不用客气。如果它能解决您的问题,您可以将其标记为已接受! –

+0

抱歉我们的信息重叠。 – blaurent

0

根据上面的注释,你想问用户他是否想要一个山姆或巴姆输出。

你可以使用它作为一个配置参数:

snakemake --config output_format=sam

然后你使用这种Snakefile:

samples = ['A','B'] 

rule all: 
    input: 
     expand('{sample}.mapped.{output_format}', sample=samples, output_format=config['output_format']) 

rule bwa: 
    input: '{sample}.fastq' 
    output: temp('{sample}.mapped.sam') 
    shell: 
     """touch {output}""" 
rule sam_to_bam: 
    input: '{sample}.mapped.sam' 
    output: '{sample}.mapped.bam' 
    shell: 
     """touch {output}"""