3

Snakemake ルールを使用して、不要になった Snakemake 出力ファイルを削除する方法がわかりません。

具体的には、bwa_mem_samという名前のファイルを作成するルールがあります{sample}.sambwa_mem_bamという名前のファイルを作成するこの別のルールがあります{sample.bam}

2 つのファイルに同じ情報が異なる形式で含まれている場合、最初のファイルを削除したいのですが、うまくいきません。

どんな助けでも大歓迎です。ベン。

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;)"

一時ファイルが不要になると (つまり、他のルールで入力として使用されなくなると)、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}"

対象のルールで「{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 に答える