Exemple #1
0
    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)