【发布时间】:2019-05-24 07:45:10
【问题描述】:
我是使用 snakemake 的新手,在使用 PICARD MergeSamFiles 将 bam 文件合并为一个 bam 文件时遇到问题。我想将 1_sorted.bam 2_sorted.bam ...10_sorted.bam 合并到一个带有目录名的 bam 文件中。
import snakemake.io
import os.path
PICARD="/data/src/picard.jar"
(SAMPLES,)=glob_wildcards("bam/{sample}_sorted.bam")
NAME=os.path.dirname
def bam_inputs(wildcards):
files = expand("bam/{sample}_sorted.bam", sample=SAMPLES)
INPUT = "I="+files
return INPUT
rule all:
input: "bam/{NAME}.bam"
rule merge_bams:
input: bam_inputs
output: "bam/{NAME}.bam"
params: mrkdup_jar="/data/src/picard.jar"
shell: "java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \
{input} \
O={output} \
SORT_ORDER=coordinate \
ASSUME_SORTED=false \
USE_THREADING=true"
错误:
Building DAG of jobs...
WildcardError in line 12 of /data/data/Samples/snakemake-example/WGS-test/step3.smk:
Wildcards in input files cannot be determined from output files:
'NAME'
我不知道如何将所有 bam 文件合并为一个,也不知道如何将目录名称设置为最终 bam 文件的变量。请指教。
更新:
import snakemake.io
PICARD="/data/src/picard.jar"
(SAMPLES,)=glob_wildcards("bam/{sample}_sorted.bam")
#NAME=os.path.dirname
NAME="test"
rule all:
input: "bam/{name}.bam".format(name=NAME)
rule merge_bams:
input: expand("bam/{sample}_sorted.bam",sample=SAMPLES)
output: "bam/{name}.bam".format(name=NAME)
params: mrkdup_jar="/data/src/picard.jar"
shell: """java -Xmx16G -jar {params.mrkdup_jar} MergeSamFiles \
{"I=" + input} \
O={output} \
SORT_ORDER=coordinate \
ASSUME_SORTED=false \
USE_THREADING=true """
ERROR:
RuleException in line 11 of /data/data/Samples/snakemake-example/WGS-test/step3.smk:
NameError: The name '"I=" + input' is unknown in this context. Please make sure that you defined that variable. Also note that braces not used for variable access have to be escaped by repeating them, i.e. {{print $1}}
MergeSamFiles \
I= sub1_sorted.bam I=sub2_sorted.bam I=sub3_sorted.bam \
O= sub.bam \
SORT_ORDER=coordinate \
ASSUME_SORTED=false \
USE_THREADING=true
【问题讨论】:
-
我不太了解snakemake,但我认为
"I="+files只是在每个bam 文件中添加了一个I=' to a list of files while you need to add a suffixI=`。另一种解决方案是创建一个包含 BAM 路径的所需.list后缀的文件,并使用I=my.list -
你的第一个问题是
NAME不是字符串:import os,NAME=os.path.dirname,NAME,<function dirname at 0x7f6e0e4ab7b8>` -
您需要在
rule all中定义通配符{NAME},以便snakemake 知道要创建的预期target files。这就是错误消息所指向的内容。 -
现在你可能会在stackoverflow的语法高亮中看到错误。第 12 行没有结束引号。
-
哦,谢谢。如何在蛇形输入中的每个输入 *_sorted.bam 中添加“I =”
标签: python bioinformatics snakemake snakeyaml