在 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
。
我正在使用 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
。