# -*- coding: utf-8 -*-
import six
from collections import OrderedDict
[docs]class SamWriter:
""" Simple class to write SAM files. """
def __init__(self, out_file, header=None):
""" Initialise SAM writer object """
self.out_file = out_file
self.header = header
self.out_handler = open(out_file, 'w')
if header is not None:
self._write_header()
def _write_header(self):
"""Write SAM header."""
for record_type, records in six.iteritems(self.header):
for record in records:
self.out_handler.write("@{}".format(record_type))
for key, value in six.iteritems(record):
self.out_handler.write("\t{}:{}".format(key, value))
self.out_handler.write("\n")
[docs] def new_sam_record(self, qname, flag, rname, pos, mapq, cigar, rnext, pnext, tlen, seq, qual, tags):
"""Create new SAM record structure.
:param self: object
:param qname: Read name.
:param rname: Reference name.
:param pos: Position in reference.
:param mapq: Mapping quality.
:param cigar: CIGAR string.
:param rnext: Reference of next read.
:param pnext: Position of next read.
:param tlen: Template length.
:param seq: Read sequence.
:param qual: Base qualities.
:param tags: Optional tags.
:returns: SAM record.
:rtype: OrderedDict
"""
record = OrderedDict()
record['QNAME'] = qname
record['FLAG'] = flag
record['RNAME'] = rname
record['POS'] = pos
record['MAPQ'] = mapq
record['CIGAR'] = cigar
record['RNEXT'] = rnext
record['PNEXT'] = pnext
record['TLEN'] = tlen
record['SEQ'] = seq
record['QUAL'] = qual
record['TAGS'] = tags
return record
[docs] def write(self, record):
"""Write SAM record to file.
:param self: object
:param record: SAM record.
:returns: None
:rtype: object
"""
self.out_handler.write("{}\n".format("\t".join(map(lambda x: str(x), six.itervalues(record)))))
[docs] def close(self):
"""Close SAM file.
:param self: object
:returns: None
:rtype: object
"""
self.out_handler.flush()
self.out_handler.close()