3

我看不到如何使用 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}"
4

2 回答 2

4

您不需要规则来删除您的 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;)"

一旦不再需要临时文件(即:不用作任何其他规则的输入),它将被蛇形删除。

评论后编辑:如果我理解正确,您的陈述“如果用户要求 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}"

并在目标规则中询问“{sample}_samErased.txt”。

于 2016-12-06T14:18:59.637 回答
2

根据上面的评论,您想询问用户是否需要 sam 或 bam 输出。

您可以将其用作配置参数:

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}"""
于 2018-01-17T14:49:57.110 回答