合并Snakefile和配置文件中的技术复制的语法

时间:2019-03-01 02:24:12

标签: snakemake

我该如何在snakemake配置文件中指定技术复制的输入,目标是将配对末端读数与参考基因组比对,然后将复制的比对文件合并为每个人的单个文件?我的文件是根据模式raw-fastq/sampleX_groupX_RX.fq.gz命名的,其中每个样本都有多个组,每个组都有R1和R2。听起来解决方案可能是编写一个输入函数,该函数根据config文件创建正确的输入列表,但是似乎没有标准的方法可以做到这一点,而对于python来说,我并不是一个新手确定该如何处理。就我而言,每个样本恰好有两组,因此我尝试使用此简单的config.yaml

samples:
  - sample1
  - sample2

groups:
  - group1
  - group2

这是我想使用的工作流程,或类似的东西:

configfile: "config.yaml"

rule all:
    input: 
        expand("merged/{sample}.bam", sample=config["samples"])

rule cutadapt:
    input:
        expand(['raw-fastq/{sample}_{group}_R1.fq.gz', 'raw-fastq/{sample}_{group}_R2.fq.gz'], sample=config["samples"], group=config["groups"])
    output:
        read1 = temp("trimmed_reads/{sample}_{group}_R1.fq.gz"),
        read2 = temp("trimmed_reads/{sample}_{group}_R2.fq.gz")
    shell:
        "cutadapt -e 0.2 -O 5 -a AAGTCGGX -A AAGTCGGX -o {output.read1} -p {output.read2} {input.read1} {input.read2}"

rule bwa_mem:
    input:
        expand(['trimmed_reads/{sample}_{group}_R1.fq.gz', 'trimmed_reads/{sample}_{group}_R2.fq.gz'], sample=config["samples"], group=config["groups"])
    output:
        temp("mapped/{sample}_{group}.unsorted.sam")
    params:
        genome = "/path-to-genome"
    log:
        "mapped/log/{sample}_{group}_bwa_mem.log"
    benchmark:
        "benchmarks/bwa_mem/{sample}_{group}.txt"
    threads: 8
    shell:
        "bwa mem -R '@RG\tID:{wildcards.sample}_{wildcards.group}\tSM:{wildcards.sample}' -t {threads} {params.genome} {input} 2> {log} > {output}"

rule samtools_sort:
    input: 
        expand("mapped/{sample}_{group}.unsorted.bam", sample=config["samples"], group=config["groups"]
    output:
        "mapped/{sample}_{group}.sorted.bam"
    shell:
        "samtools sort {input} > {output}"

rule samtools_merge:
    input: 
        expand(['mapped/{sample}_group1.sorted.bam', 'mapped/{sample}_group2.sorted.bam'], sample=config["samples"])
    output:
        protected("merged/{sample}.merged.bam")
    shell:
        "samtools merge {output} {input}"

我希望这些规则能够从四个输入文件中生成单个文件merged/sample1.bam

raw-fastq/sample1_group1_R1.fq
raw-fastq/sample1_group1_R2.fq
raw-fastq/sample1_group2_R1.fq
raw-fastq/sample1_group2_R2.fq

每个样品同样如此。

运行snakemake -np不会引发任何错误,但是我可以确定尝试使用expand函数的方式存在问题:输入被带到所有可能组合的列表中,而不是遍历样本和组的列表。例如,DAG看起来像: enter image description here

所以我可以说我尝试指定输入的方式存在问题,但是我不知道这样做的正确方式。我想知道(1)在config.yaml文件和Snakefile中每个文件名中都有多个通配符的配对文件输入的正确语法是什么,以及(b)如何处理在samtools_merge规则期间将来自副本的多个输入合并到单个输出文件中的情况。

1 个答案:

答案 0 :(得分:1)

您的yaml配置文件似乎没有正确的lists format。他们需要连字符。否则,根据您的示例,看起来它像字符串一样被读取。

samples:
    - sample1
    - sample2

groups:
    - group1
    - group2

在您的rule all中,未定义通配符{sample}。应该是什么?另外,为进一步阐明您的问题,您能否提供一个示例-配置文件中样本和组的预期输出文件名是什么?

更新后的答案:

这里的问题是因为每个规则使用的文件数量都超过了所需数量。例如,rule cutadapt一次只能作用于一个样本和一组。并非所有样本和组。我建议您逐步浏览snakemake tutorial example,以更好地理解。

这里是修改后的代码。我没有尝试执行它,但是我认为这可以工作。

configfile: "config.yaml"

rule all:
    input: 
        expand("merged/{sample}.bam", sample=config["samples"])

rule cutadapt:
    input:
        expand('raw-fastq/{{sample}}_{{group}}_R{read}.fq.gz', 
                read=[1,2])
    output:
        read1 = temp("trimmed_reads/{sample}_{group}_R1.fq.gz"),
        read2 = temp("trimmed_reads/{sample}_{group}_R2.fq.gz")
    message:
        "Trimming adapters - {wildcards.sample}, {wildcards.group}"
    shell:
        "cutadapt -e 0.2 -O 5 -a AAGTCGGX -A AAGTCGGX -o {output.read1} -p {output.read2} {input.read1} {input.read2}"


rule bwa_mem:
    input:
        expand(['trimmed_reads/{{sample}}_{{group}}_R{read}.fq.gz', 
                read=[1,2])
    output:
        temp("mapped/{sample}_{group}.unsorted.sam")
    params:
        genome = "/path-to-genome"
    log:
        "mapped/log/{sample}_{group}_bwa_mem.log"
    benchmark:
        "benchmarks/bwa_mem/{sample}_{group}.txt"
    threads: 8
    shell:
        "bwa mem -R '@RG\tID:{wildcards.sample}_{wildcards.group}\tSM:{wildcards.sample}' -t {threads} {params.genome} {input} 2> {log} > {output}"


rule samtools_sort:
    input: 
        "mapped/{sample}_{group}.unsorted.bam"
    output:
        "mapped/{sample}_{group}.sorted.bam"
    shell:
        "samtools sort {input} > {output}"

rule samtools_merge:
    input: 
        expand('mapped/{{sample}}_{group}.sorted.bam', group=config['groups'])
    output:
        protected("merged/{sample}.merged.bam")
    shell:
        "samtools merge {output} {input}"