Для рабочего процесса 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)
Этот скрипт работает хорошо автономно, но я не смог понять, как его интегрировать с помощьюдиректива о змейке script
.Я предпочитаю этот способ минимизировать использование ввода-вывода и оперативной памяти.
Редактировать: прибегать к прямой загрузке для исправления тега 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()
РЕДАКТИРОВАТЬ: установлены директивы Snakemakes run:
и shell:
каталог workdir:
, в то время как директива script:
работает относительно каталога, в котором был запущен Snakefile (сохраняя все аккуратно и аккуратно).Отсюда проблема размещения потокового процессора под script:
.