2016-12-06 3 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. Просто отметьте Ouput SaM файл в «bwa_mem_map_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

На основании вышеприведенных комментариев вы хотите спросить пользователя, хочет ли он вывести 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}"""