首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >snakemake PICARD合并bam文件

snakemake PICARD合并bam文件
EN

Stack Overflow用户
提问于 2019-05-24 15:45:11
回答 1查看 324关注 0票数 1

我是新手使用snakemake,我有一个问题,当使用PICARD MergeSamFiles合并bam文件为一个bam文件。我想将1_sorted.bam 2_sorted.bam ...10_sorted.bam合并为一个带有目录名的bam文件。

代码语言:javascript
复制
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"

错误:

代码语言:javascript
复制
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文件的变量。敬请指教。

更新:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-25 02:31:15

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

代码语言:javascript
复制
rule all:
    input: f"bam/{NAME}.bam"

注意,我使用f字符串将{NAME}从通配符转换为来自变量NAME的确切字符串值。您可以选择任何其他方式完成此操作,例如"bam/{name}.bam".format(name=NAME)

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

还有一件事:我不确定您在bam_inputs函数中做了什么:

代码语言:javascript
复制
INPUT = "I="+files 

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

代码语言:javascript
复制
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"""
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56288018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档