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