在 Shell 中格式化 Snakemake 输入文件

Format Snakemake Input Files in the Shell

我正在使用 snakemake 管道 运行 GATK MarkDuplicate 命令以及来自不同读取组的多个输入 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 returns 输入 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

感谢更新您的回答。

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

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 正常添加在前面。

如果我们有两个输入 bams,我们的 lambda 函数会将 -I 放在它们之间,而 shell 命令会在前面添加 -I