【发布时间】:2020-10-24 01:49:15
【问题描述】:
我是构建 Snakefiles 的新手,对于我的生物信息学研究,我正在尝试在多个样本上循环我的规则。我寻找了类似的问题和答案,但我似乎无法解决这个问题。这可能是因为我仍然不太了解 Snakemake 是如何工作的。如果你们能帮助我,那就太好了。
目前我有多个规则,目前适用于一个示例:
# variables for every species
SAMPLE = "SRR8528338"
SAMPLES = "SRR8528338 SRR8528339 SRR8528340".split()
configfile: "./envs/contigs/" + SAMPLE + ".yaml"
var_variables = expand("results/4_mapped_contigs/" + SAMPLE + "/var/Contig{nr}_AT_sort.var", nr = config["contig_nrs"])
#make_contig_consensus = expand("results/5_consensus_contigs/{sample}", sample = SAMPLES)
rule all:
input:
var_variables
# make_contig_consensus
rule convert_to_fBAM:
input:
"results/4_mapped_contigs/" + SAMPLE + "/sam/Contig{nr}_AT.sam"
output:
"results/4_mapped_contigs/" + SAMPLE + "/bam/Contig{nr}_AT.bam"
shell:
"samtools view -bS {input} > {output}"
rule sort_fBAM:
input:
"results/4_mapped_contigs/" + SAMPLE + "/bam/Contig{nr}_AT.bam"
output:
"results/4_mapped_contigs/" + SAMPLE + "/sorted_bam/Contig{nr}_AT_sort.bam"
shell:
"samtools sort -m5G {input} -o {output}"
rule convert_to_fpileup:
input:
"results/4_mapped_contigs/" + SAMPLE + "/sorted_bam/Contig{nr}_AT_sort.bam"
output:
"results/4_mapped_contigs/" + SAMPLE + "/pileup/Contig{nr}_AT_sort.pileup"
shell:
"samtools mpileup -B {input} > {output}"
rule SNP_calling:
input:
"results/4_mapped_contigs/" + SAMPLE + "/pileup/Contig{nr}_AT_sort.pileup"
output:
"results/4_mapped_contigs/" + SAMPLE + "/var/Contig{nr}_AT_sort.var"
shell:
"varscan pileup2cns {input} "
"--min-freq-for-hom 0.6 "
"--min-coverage 5 "
"--min-var-freq 0.6 "
"--p-value 0.1 "
"--min-reads2 5 "
"> {output}"
rule make_contig_consensus:
input:
"src/read_var.py"
output:
"results/5_consensus_contigs/{sample}"
params:
"{sample}"
shell:
"python3 {input} {params}"
每个样本的配置文件都不同(重叠群的数量)。对于 SRR8528338,它看起来像这样:
contig_nrs:
1: ./results/4_mapped_contigs/SRR8528338/var/Contig1_AT_sort.var
2: ./results/4_mapped_contigs/SRR8528338/var/Contig2_AT_sort.var
3: ./results/4_mapped_contigs/SRR8528338/var/Contig3_AT_sort.var
...
2146: ./results/4_mapped_contigs/SRR8528338/var/Contig2146_AT_sort.var
但是,我想在“SAMPLES”变量中引用的多个样本上循环所有这些规则。 现在我之前尝试使用双括号,它适用于多个样本。 (将所有 'SAMPLES' 更改为 {{sample}} 并添加:,sample = SAMPLES)。那么我的代码应该是这样的:
# variables for every species
SAMPLES = "SRR8528338 SRR8528339 SRR8528340".split()
for sample in SAMPLES:
configfile: "./envs/contigs/" + sample + ".yaml"
var_variables = expand("results/4_mapped_contigs/{sample}/var/Contig{nr}_AT_sort.var", sample = SAMPLES, nr = config["contig_nrs"])
make_contig_consensus = expand("results/5_consensus_contigs/{sample}", sample = SAMPLES)
rule all:
input:
var_variables
# make_contig_consensus
rule convert_to_fBAM:
input:
"results/4_mapped_contigs/{{sample}}/sam/Contig{nr}_AT.sam"
output:
"results/4_mapped_contigs/{{sample}}/bam/Contig{nr}_AT.bam"
shell:
"samtools view -bS {input} > {output}"
rule sort_fBAM:
input:
"results/4_mapped_contigs/{{sample}}/bam/Contig{nr}_AT.bam"
output:
"results/4_mapped_contigs/{{sample}}/sorted_bam/Contig{nr}_AT_sort.bam"
shell:
"samtools sort -m5G {input} -o {output}"
rule convert_to_fpileup:
input:
"results/4_mapped_contigs/{{sample}}/sorted_bam/Contig{nr}_AT_sort.bam"
output:
"results/4_mapped_contigs/{{sample}}/pileup/Contig{nr}_AT_sort.pileup"
shell:
"samtools mpileup -B {input} > {output}"
rule SNP_calling:
input:
"results/4_mapped_contigs/{{sample}}/pileup/Contig{nr}_AT_sort.pileup"
output:
"results/4_mapped_contigs/{{sample}}/var/Contig{nr}_AT_sort.var"
shell:
"varscan pileup2cns {input} "
"--min-freq-for-hom 0.6 "
"--min-coverage 5 "
"--min-var-freq 0.6 "
"--p-value 0.1 "
"--min-reads2 5 "
"> {output}"
rule make_contig_consensus:
input:
"src/read_var.py"
output:
"results/5_consensus_contigs/{sample}"
params:
"{sample}"
shell:
"python3 {input} {params}"
但是,当我运行它时,我得到一个错误。我不太确定,但我认为这是因为 for 循环(SAMPLES 中的示例):
Missing input files for rule all:
results/4_mapped_contigs/SRR8528338/var/Contig1266_AT_sort.var
results/4_mapped_contigs/SRR8528338/var/Contig1299_AT_sort.var
...
现在我想知道:有没有办法通过使用通配符来扩展配置文件?比如:
configfile: expand("./envs/contigs/{sample}.yaml", sample = SAMPLES)
这样做会给我错误:
TypeError in line 4
expected str, bytes or os.PathLike object, not list
或者你有其他解决这个问题的方法吗?
谢谢!
更新:
我一直在尝试一些事情,我认为将配置文件更改为嵌套字典而不是单独的字典会很有用。它应该看起来像这样:
contigs:
SRR8528336: - 1
- 2
- ...
- 2113
SRR8528337: - 1
...
...
exons:
SRR8528336: - 1
...
- 1827
SRR8528337: - 1
...
- 1826
...
例如,如果我想运行样本:SRR8528338 直到 SRR8528340,我将其作为输入:
SAMPLES = "SRR8528338 SRR8528339 SRR8528340".split()
并按样本名称调用重叠群:
var_variables = expand("results/4_mapped_contigs/{{sample}}/var/Contig{nr}_AT_sort.var", nr = config["contigs"][wildcards.sample])
或外显子:
expand("results/7_exons/{{sample}}/var/exon{nr}_AT_sort.var", nr = config["exons"][wildcards.sample])
如果我只想获取值,“wildcards.sample”是如何工作的?
解决方案(以及下一个问题)2020 年 7 月 31 日
我根据 bli 进行了更改,现在正在运行:
# variables for every species
SAMPLES = "SRR8528347 SRR8528355 SRR8528356".split()
configfile: "./envs/config_contigs.yaml"
# bam = []
# sort_bam = []
# fpileup = []
var_variables = []
make_contig_consensus = []
blat_variables = []
extract_hits_psl = []
for sample in SAMPLES:
contig_nrs = config[sample]
for nr in contig_nrs:
# bam.append("results/A04_mapped_contigs/{sample}/bam/Contig{nr}_AT.bam".format(sample=sample, nr=nr))
# sort_bam.append("results/A04_mapped_contigs/{sample}/sorted_bam/Contig{nr}_AT_sort.bam".format(sample=sample, nr=nr))
# fpileup.append("results/A04_mapped_contigs/{sample}/pileup/Contig{nr}_AT_sort.pileup".format(sample=sample, nr=nr))
var_variables.append("results/A04_mapped_contigs/{sample}/var/Contig{nr}_AT_sort.var".format(sample=sample, nr=nr))
make_contig_consensus.append("results/A05_consensus_contigs/{sample}/Contig{nr}.fasta".format(sample=sample, nr=nr))
blat_variables.append("results/A06_identified_contigs_blat/{sample}/contig{nr}_AT.psl".format(sample=sample, nr=nr))
extract_hits_psl.append("results/A07_mapped_exons/{sample}/".format(sample=sample, nr=nr))
rule all:
input:
# bam,
# sort_bam,
# fpileup,
var_variables,
make_contig_consensus,
blat_variables,
extract_hits_psl
rule convert_to_fBAM:
input:
"results/A04_mapped_contigs/{sample}/sam/Contig{nr}_AT.sam"
output:
"results/A04_mapped_contigs/{sample}/bam/Contig{nr}_AT.bam"
shell:
"samtools view -bS {input} > {output}"
rule sort_fBAM:
input:
"results/A04_mapped_contigs/{sample}/bam/Contig{nr}_AT.bam"
output:
"results/A04_mapped_contigs/{sample}/sorted_bam/Contig{nr}_AT_sort.bam"
shell:
"samtools sort -m5G {input} -o {output}"
rule convert_to_fpileup:
input:
"results/A04_mapped_contigs/{sample}/sorted_bam/Contig{nr}_AT_sort.bam"
output:
"results/A04_mapped_contigs/{sample}/pileup/Contig{nr}_AT_sort.pileup"
shell:
"samtools mpileup -B {input} > {output}"
rule SNP_calling:
input:
"results/A04_mapped_contigs/{sample}/pileup/Contig{nr}_AT_sort.pileup"
output:
"results/A04_mapped_contigs/{sample}/var/Contig{nr}_AT_sort.var"
shell:
"varscan pileup2cns {input} "
"--min-freq-for-hom 0.6 "
"--min-coverage 5 "
"--min-var-freq 0.6 "
"--p-value 0.1 "
"--min-reads2 5 "
"> {output}"
rule make_contig_consensus:
input:
script = "src/read_var.py",
file = "results/A04_mapped_contigs/{sample}/var/Contig{nr}_AT_sort.var"
output:
"results/A05_consensus_contigs/{sample}/Contig{nr}.fasta"
params:
"{sample}"
shell:
"python3 {input.script} {params}"
rule BLAT_assembled:
input:
"data/exons/exons_AT.fasta",
"results/A05_consensus_contigs/{sample}/Contig{nr}.fasta"
output:
"results/A06_identified_contigs_blat/{sample}/contig{nr}_AT.psl"
shell:
"blat "
"-t=dnax "
"-q=dnax "
"-stepSize=5 "
"-repMatch=2253 "
"-minScore=0 "
"-minIdentity=0 "
"{input} {output}"
rule extract_hits_psl:
input:
script = "src/extract_hits_psl.py"
# file = "results/A06_identified_contigs_blat/{sample}/contig{nr}_AT.psl"
output:
"results/A07_mapped_exons/{sample}/"
params:
"{sample}"
shell:
"python {input.script} {params}"
config_contigs.yaml:
SRR8528347:
- 1
- ...
- 5
SRR8528348:
- 1
- ...
- 5
...
现在从 .yaml 调用它们是有效的,但规则应该按照与编写的顺序相同的顺序运行(从上到下)。运行此命令时,规则以不同的顺序运行,因此由于文件尚不存在而出现错误。我读到之前订单的输出应该和之后的输入一样,但是它不起作用。
【问题讨论】:
-
关于您的最后一个错误:
expand创建一个字符串列表,但configfile应该是文件的路径(可以表示为字符串),而不是字符串列表.如果您实际上每个样本都有一个配置文件,这意味着您的工作流程一次只能处理一个样本。我写了这个答案,我试图解释各种有用的东西来了解蛇的工作原理:stackoverflow.com/questions/50198628/…也许它对你有用。 -
谢谢!我看了看,确实帮助了我更多的理解,但我仍然卡住了。我看到你使用类似'config [sample] [wildcards.sample]'的东西。我想如果我可以像这样从配置文件中获取我的值,那会有所帮助。但我不明白如何获取这些值(请参阅上面的编辑帖子)。
-
我不确定您关于执行顺序的问题。你可以再详细一点吗?在 Snakemake 中,执行顺序将根据规则之间的显式依赖关系(即输入和输出部分)确定。如果没有这样的依赖,就无法保证执行顺序。
-
所以当我运行这个蛇文件时,它会运行规则 convert_to_fBAM 直到 convert_to_fpileup。但它不是在之后运行 SNP_calling,而是跳过此规则并转到下一个规则“make_contig_consensus”。然后会发生错误,因为“results/A04_mapped_contigs/{sample}/var/Contig{nr}_AT_sort.var”不存在。我将当前代码添加到主要问题 (31/07/2020)
-
这很奇怪。据我所知,
make_contig_consensus的输入依赖于SNP_calling的输出,所以 Snakemake 不应该直接跳到make_contig_consensus。您可以在帖子中添加确切的错误消息吗?
标签: python config wildcard bioinformatics snakemake