def polishSegment(self, seg, als): # type: (Segment, List[AlignmentPiece]) -> AlignmentPiece sys.stdout.trace("Polishing segment", seg) w = max(900, params.k) r = 50 first = seg.left / w last = min(seg.right + w - 1, len(seg.contig)) / w segs = [] for i in range(first, last + 1): segs.append( Segment(seg.contig, max(0, i * w - r), min(len(seg.contig), (i + 1) * w + r))) als_by_segment = [[] for i in range(last - first + 1)] for al in als: l = al.seg_to.left / w r = al.seg_to.right / w + 1 for i in range(max(0, l - first - 1), min(last - first + 1, r - first + 2)): if al.seg_to.inter(segs[i]): als_by_segment[i].append(al) res_als = [] for seg1, seg_als in zip(segs, als_by_segment): if seg1.inter(seg): res_als.append(self.polishSmallSegment(seg1, seg_als)) res = AlignmentPiece.GlueOverlappingAlignments(res_als) return res.reduce(target=seg)
def testManual(self): contig1 = Contig("ACGTACGTA", "from") contig2 = Contig("ACTACGTACGTACAT", "to") al1 = AlignmentPiece(contig1.asSegment(), contig2.segment(0, 8), "2M1I6M") al2 = AlignmentPiece(contig1.segment(0, 8), contig2.segment(7, 15), "8M") glued = AlignmentPiece.GlueOverlappingAlignments([al1, al2]) assert glued.cigar == "2M1I5M8M", str(glued) + " " + glued.cigar assert glued.seg_from.Seq( ) == "ACGTACGTACGTACGT", str(glued) + " " + glued.cigar assert al1.reduce(query=contig1.segment(0, 2)).cigar == "2M" assert al1.reduce(query=contig1.segment(0, 3)).cigar == "2M" assert al1.reduce(query=contig1.segment(0, 4)).cigar == "2M1I1M"