在Shell中格式化Snakemake输入文件

2024-04-28 22:44:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用snakemake管道来运行GATKMarkDuplicate命令,该命令包含来自不同读取组的多个输入bam文件

rule mark_duplicates:
    input:
        get_dedup_input
    output:
        bam=temp("bams/{patient}.{sample_type}.markdups.bam"),
        md5=temp("bams/{patient}.{sample_type}.markdups.bam.md5"),
        metrics="qc/gatk/{patient}_{sample_type}_dup_metrics.txt"
    conda:
        "../envs/gatk.yml"
    shell:
        """
        gatk MarkDuplicates -I {input} -O {output.bam} -M {output.metrics} \
            --CREATE_MD5_FILE true --ASSUME_SORT_ORDER "queryname"
        """

get_dedup_input返回输入bam文件的列表MarkDuplicates要求使用-I标志指定每个输入文件。如果我只有一个bam文件,我可以简单地写-I {input}, 但是这失败了,因为它指定了-I file1.bam file2.bam它需要是-I file1.bam -I file2.bam。格式化输入的最佳方式是什么,以便将每个输入文件指定为-I [input file]

下面有两个场景来说明如果手动运行命令,输入、输出和shell命令会是什么样子。为了简洁起见,我省略了一些非必要的MarkDuplicate标志:

一个阅读组

Inputs: patient101.normal.rg1.bam
Output: patient101.normal.markdups.bam
Shell: 
gatk MarkDuplicates -I patient101.normal.rg1.bam \
-O patient101.normal.markdups.bam \
-M metrics.txt

两个阅读组

Inputs: patient101.normal.rg1.bam, patient101.normal.rg2.bam
Output: patient101.normal.markdups.bam
Shell: 
gatk MarkDuplicates -I patient101.normal.rg1.bam \
-I patient101.normal.rg2.bam \
-O patient101.normal.markdups.bam \
-M metrics.txt

Tags: 文件sample命令inputoutputtypemetricsnormal
1条回答
网友
1楼 · 发布于 2024-04-28 22:44:52

谢谢你更新你的答案

因此,最好的办法可能是创建一个参数,使其成为我们需要的字符串,如下所示:

rule mark_duplicates:
    input:
        get_dedup_input
    output:
        bam=temp("bams/{patient}.{sample_type}.markdups.bam"),
        md5=temp("bams/{patient}.{sample_type}.markdups.bam.md5"),
        metrics="qc/gatk/{patient}_{sample_type}_dup_metrics.txt"
    conda:
        "../envs/gatk.yml"
    params:
        input=lambda wildcards, input: " -I ".join(input)
    shell:
        """
        gatk MarkDuplicates -I {params.input} -O {output.bam} -M {output.metrics} \
             CREATE_MD5_FILE true  ASSUME_SORT_ORDER "queryname"
        """

如果我们的输入是单个bam,params.input将只是patient101.normal.rg1.bam,并且-I会像平常一样添加到前面

如果有两个输入BAM,lambda函数将-I放在它们之间,shell命令将-I添加到前面

相关问题 更多 >