Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python snakemake PICARD合并bam文件_Python_Bioinformatics_Snakemake_Snakeyaml - Fatal编程技术网

Python snakemake PICARD合并bam文件

Python snakemake PICARD合并bam文件,python,bioinformatics,snakemake,snakeyaml,Python,Bioinformatics,Snakemake,Snakeyaml,我是使用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.

我是使用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

让我们考虑一下
规则all
。您需要向snakemake显示您实际希望作为目标构建的文件。没有通配符:只是一些明确的东西。你说它应该是一个有目录名的bam文件

rule all:
    input: f"bam/{NAME}.bam"
注意,使用f-string,我将通配符中的
{NAME}
转换为变量
NAME
中的精确字符串值。您可以选择任何其他方式来执行此操作,即
“bam/{name}.bam”.format(name=name)

接下来,请记住,现在“all”规则中的
{NAME}
和“merge_bams”规则中的
{NAME}
是不同的实体,因此它们没有任何共同之处。此外,通配符不必等于您在第6行定义的
NAME
变量。我会以不同的方式调用通配符,以避免误解

还有一件事:我不确定您在
bam\u inputs
函数中做了什么:

INPUT = "I="+files 
expand函数的结果应足以指定merge_bams规则的输入。如果需要为列表中的每个文件添加“I=”,请尝试在
shell:
部分正确添加:

rule merge_bams:
    input: bam_inputs
    output: "bam/{NAME}.bam"
    params: mrkdup_jar="/data/src/picard.jar"
    shell: f"""java -Xmx16G -jar {{params.mrkdup_jar}} MergeSamFiles 
        {" ".join(["I=" + s for s in input])} 
        O={{output}} 
        SORT_ORDER=coordinate 
        ASSUME_SORTED=false 
        USE_THREADING=true"""

我不知道有多少snakemake,但我认为,
“I=“+files
只是在文件列表中添加了一个
I=”,而您需要在每个bam文件中添加一个后缀。另一种解决方案是创建一个包含BAMs路径的所需
.list
后缀的文件,并使用
I=my.list
您的第一个问题是
NAME
不是字符串:
import os
NAME=os.path.dirname
NAME
`您需要定义通配符
{NAME}
中的
规则所有
,以便蛇夫知道要创建的目标。这就是错误消息所指向的。现在,您甚至可以在stackoverflow的语法突出显示中看到错误。第12行中没有结束报价。哦,谢谢。如何在snakemake inputimport snakemake.io PICARD=“/data/src/PICARD.jar”(SAMPLES,)=glob_通配符(“bam/{sample}}{u sorted.bam”)#NAME=os.path.dirname=“test”规则全部:输入:“bam/{NAME}.bam”。format(NAME=NAME)规则合并_-bams:input:expand(“bam/{sample}}sorted.bam,sample=SAMPLES”)输出:“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\asure\SORTED=false\USE\u-THREADING=true”“但是错误:在扫描字符串literalbam_输入时,/data/data/Samples/snakemake example/WGS test/step3.smk:EOL的第12行出现语法错误:我想列出该目录中的所有bam文件,然后合并它们。”。我改为展开(“bam/{sample}\u sorted.bam,sample=SAMPLES)@PeterChung错误是一个语法问题。不幸的是,注释不允许正确的格式,因此无法检查语法。请将该代码作为问题的更新。请描述哪一行有数字12。