def re_annotate(self, from_edges=False, window=FULL_EXTEND): """create a position specific scoring matrix for the surrounding regions, see how far you can go while keeping conservation, using a maximum likelihood method. Can either annotate from feature (by default) or from edges""" if len(self.lst) < 2: return # unzip if from_edges: [befores, afters] = zip(*[e.around_IS(window) for e in self.lst]) else: [befores, afters] = zip(*[e.around_gene(window) for e in self.lst]) # make them the same length minlength_before = min([len(b) for b in befores]) minlength_after = min([len(a) for a in afters]) befores = [b[:minlength_before] for b in befores] afters = [a[:minlength_after] for a in afters] verbose = False individual = True before_lens = EdgeFinder.find_left_edges([str(s) for s in befores], individual, verbose) after_lens = EdgeFinder.find_left_edges([str(s) for s in afters], individual, verbose) for e, before_len, after_len in zip(self.lst, before_lens, after_lens): if from_edges: start = e.start end = e.end else: start = e.feature.location._start.position end = e.feature.location._end.position if e.direction == 1: newstart = start - before_len newend = end + after_len else: newstart = start - after_len newend = end + before_len e.change(newstart=newstart, newend=newend)