treetime/merger_models.py
def calc_branch_count(self):
        '''
        calculates an interpolation object that maps time to the number of
        concurrent branches in the tree. The result is stored in self.nbranches
        '''

        # make a list of (time, merger or loss event) by root first iteration
        self.tree_events = np.array(sorted([(n.time_before_present, len(n.clades)-1)
                                for n in self.tree.find_clades() if not n.bad_branch],
                                key=lambda x:-x[0]))

        # collapse multiple events at one time point into sum of changes
        from collections import defaultdict
        dn_branch = defaultdict(int)
        for (t, dn) in self.tree_events:
            dn_branch[t]+=dn
        unique_mergers = np.array(sorted(dn_branch.items(), key = lambda x:-x[0]))

        # calculate the branch count at each point summing the delta branch counts
        nbranches = [[ttconf.BIG_NUMBER, 1], [unique_mergers[0,0]+ttconf.TINY_NUMBER, 1]]
        for ti, (t, dn) in enumerate(unique_mergers[:-1]):
            new_n = nbranches[-1][1]+dn
            next_t = unique_mergers[ti+1,0]+ttconf.TINY_NUMBER
            nbranches.append([t, new_n])
            nbranches.append([next_t, new_n])

        new_n += unique_mergers[-1,1]
        nbranches.append([next_t, new_n])
        nbranches.append([-ttconf.BIG_NUMBER, new_n])
        nbranches=np.array(nbranches)

        self.nbranches = interp1d(nbranches[:,0], nbranches[:,1], kind='linear')
def calc_branch_count(self):
        '''
        calculates an interpolation object that maps time to the number of
        concurrent branches in the tree. The result is stored in self.nbranches
        '''

        # make a list of (time, merger or loss event) by root first iteration
        self.tree_events = np.array(sorted([(n.time_before_present, len(n.clades)-1)
                                for n in self.tree.find_clades() if not n.bad_branch],
                                key=lambda x:-x[0]))

        # collapse multiple events at one time point into sum of changes
        from collections import defaultdict
        dn_branch = defaultdict(int)
        for (t, dn) in self.tree_events:
            dn_branch[t]+=dn
        unique_mergers = np.array(sorted(dn_branch.items(), key = lambda x:-x[0]))

        # calculate the branch count at each point summing the delta branch counts
        nbranches = [[ttconf.BIG_NUMBER, 1], [unique_mergers[0,0]+ttconf.TINY_NUMBER, 1]]
        for ti, (t, dn) in enumerate(unique_mergers[:-1]):
            new_n = nbranches[-1][1]+dn
            next_t = unique_mergers[ti+1,0]+ttconf.TINY_NUMBER
            nbranches.append([t, new_n])
            nbranches.append([next_t, new_n])

        new_n += unique_mergers[-1,1]
        nbranches.append([next_t, new_n])
        nbranches.append([-ttconf.BIG_NUMBER, new_n])
        nbranches=np.array(nbranches)

        self.nbranches = interp1d(nbranches[:,0], nbranches[:,1], kind='linear')
def calc_branch_count ( self ) : # make a list of (time, merger or loss event) by root first iteration self . tree_events = np . array ( sorted ( [ ( n . time_before_present , len ( n . clades ) - 1 ) for n in self . tree . find_clades ( ) if not n . bad_branch ] , key = lambda x : - x [ 0 ] ) ) # collapse multiple events at one time point into sum of changes from collections import defaultdict dn_branch = defaultdict ( int ) for ( t , dn ) in self . tree_events : dn_branch [ t ] += dn unique_mergers = np . array ( sorted ( dn_branch . items ( ) , key = lambda x : - x [ 0 ] ) ) # calculate the branch count at each point summing the delta branch counts nbranches = [ [ ttconf . BIG_NUMBER , 1 ] , [ unique_mergers [ 0 , 0 ] + ttconf . TINY_NUMBER , 1 ] ] for ti , ( t , dn ) in enumerate ( unique_mergers [ : - 1 ] ) : new_n = nbranches [ - 1 ] [ 1 ] + dn next_t = unique_mergers [ ti + 1 , 0 ] + ttconf . TINY_NUMBER nbranches . append ( [ t , new_n ] ) nbranches . append ( [ next_t , new_n ] ) new_n += unique_mergers [ - 1 , 1 ] nbranches . append ( [ next_t , new_n ] ) nbranches . append ( [ - ttconf . BIG_NUMBER , new_n ] ) nbranches = np . array ( nbranches ) self . nbranches = interp1d ( nbranches [ : , 0 ] , nbranches [ : , 1 ] , kind = 'linear' )
calculates an interpolation object that maps time to the number of
        concurrent branches in the tree. The result is stored in self.nbranches
calculates an interpolation object that maps time to the number of concurrent branches in the tree . The result is stored in self . nbranches