def stats_from_aligned_read(read):
"""Create summary information for an aligned read
:param read: :class:`pysam.AlignedSegment` object
"""
tags = dict(read.tags)
try:
tags.get('NM')
except:
raise IOError("Read is missing required 'NM' tag. Try running 'samtools fillmd -S - ref.fa'.")
name = read.qname
if read.flag == 4:
return None
counts = defaultdict(int)
for (i, j) in read.cigar:
counts[i] += j
match = counts[0]
ins = counts[1]
delt = counts[2]
# NM is edit distance: NM = INS + DEL + SUB
sub = tags['NM'] - ins - delt
length = match + ins + delt
iden = 100*float(match - sub)/match
acc = 100 - 100*float(tags['NM'])/length
read_length = read.infer_read_length()
coverage = 100*float(read.query_alignment_length) / read_length
direction = '-' if read.is_reverse else '+'
results = {
"name":name,
"coverage":coverage,
"direction":direction,
"length":length,
"read_length":read_length,
"ins":ins,
"del":delt,
"sub":sub,
"iden":iden,
"acc":acc
}
return results
评论列表
文章目录