def is_read_exonic(aligned_segments, exon_breaks, first_exon, last_exon, min_overlap_frac=0.5):
for read_start, read_end, _ in aligned_segments:
ex_idx = bisect.bisect(exon_breaks, read_start, lo=2*first_exon, hi=2*(last_exon+1)) - 1
if ex_idx > 2*last_exon:
# read is out of bounds
return False
elif ex_idx % 2 == 1:
# read starts in an intron
exon_start = exon_breaks[ex_idx+1]
exon_end = exon_breaks[ex_idx+2]
else:
# read starts in an exon
exon_start = exon_breaks[ex_idx]
exon_end = exon_breaks[ex_idx+1]
segment_exonic = overlaps(read_start, read_end, exon_start, exon_end, min_overlap_frac)
if not segment_exonic:
return False
return True
评论列表
文章目录