对于 Snakemake 工作流程,我需要处理许多 BAM 文件中的标签,并希望通过脚本(使用 Snakemake 脚本:指令)来处理这些标签。我这样做的具体方法是使用pysam 流处理。
infile = pysam.AlignmentFile("-", "rb")
outfile = pysam.AlignmentFile("-", "wb", template=infile)
for s in infile:
(flowcell, lane) = s.query_name.split(':')[0:2]
rg_id = ".".join([flowcell, lane])
s.set_tag('RG',rg_id,'Z')
outfile.write(s)
该脚本独立运行良好,但我无法弄清楚如何通过snakemakescript
指令集成它。我更喜欢这种方式来最小化 IO 和 RAM 的使用。
编辑:采用直接加载来修复 RG 标签。
# parameters passed from snakemake
bam_file = snakemake.input[0]
fixed_bam_file = snakemake.output[0]
bamfile = pysam.AlignmentFile(bam_file, "rb")
fixed_bamfile = pysam.AlignmentFile(fixed_bam_file, "wb", template = bamfile)
for i, read in enumerate(bamfile.fetch()):
(flowcell, lane) = read.query_name.split(':')[0:2]
rg_id = ".".join([flowcell, lane])
read.set_tag('RG',rg_id,'Z')
fixed_bamfile.write(read)
if not (i % 100000):
print("Updated the read group for {} reads to {}".format(i, rg_id))
bamfile.close()
fixed_bamfile.close()
编辑:Snakemakesrun:
和shell:
指令设置workdir:
目录,而script:
指令相对于执行 Snakefile 的目录进行操作(保持一切整洁)。因此,将流处理器置于script:
.