def coalesce(nodes, pop_size=None, period=None, rng=None, use_expected_tmrca=False): deprecate.dendropy_deprecation_warning( preamble="Deprecated since DendroPy 4: The 'dendropy.coalescent' module has moved to 'dendropy.model.coalescent', and this function has been renamed 'coalesce_nodes'.", old_construct="from dendropy import coalescent\ncoalescent.coalesce(...)", new_construct="from dendropy.model import coalescent\ncoalescent.coalesce_nodes(...)") return coalescent.coalesce_nodes( nodes=nodes, pop_size=pop_size, period=period, rng=rng, use_expected_tmrca=use_expected_tmrca)
def simulate_contained_kingman(self, edge_pop_size_attr='pop_size', default_pop_size=1, label=None, rng=None, use_expected_tmrca=False): """ Simulates and returns a "censored" (Kingman) neutral coalescence tree conditional on self. ``rng`` Random number generator to use. If |None|, the default will be used. ``edge_pop_size_attr`` Name of attribute of self's edges that specify the population size. If this attribute does not exist, then the population size is taken to be 1. Note that all edge-associated taxon sets must be up-to-date (otherwise, ``build_edge_taxa_sets()`` should be called), and that the tree is *not* added to the set of contained trees. For the latter, call ``embed_contained_kingman``. """ # Dictionary that maps nodes of containing tree to list of # corresponding nodes on gene tree, initially populated with leaf # nodes. contained_nodes = {} for nd in self.leaf_node_iter(): contained_nodes[nd] = [] for gt in nd.edge.contained_taxa: gn = dendropy.Node(taxon=gt) contained_nodes[nd].append(gn) # Generate the tree structure for edge in self.postorder_edge_iter(): if edge.head_node.parent_node is None: # root: run unconstrained coalescence until just one gene node # remaining if hasattr(edge, edge_pop_size_attr): pop_size = getattr(edge, edge_pop_size_attr) else: pop_size = default_pop_size if len(contained_nodes[edge.head_node]) > 1: final = coalescent.coalesce_nodes(nodes=contained_nodes[edge.head_node], pop_size=pop_size, period=None, rng=rng, use_expected_tmrca=use_expected_tmrca) else: final = contained_nodes[edge.head_node] else: # run until next coalescence event, as determined by this edge # size. if hasattr(edge, edge_pop_size_attr): pop_size = getattr(edge, edge_pop_size_attr) else: pop_size = default_pop_size remaining = coalescent.coalesce_nodes(nodes=contained_nodes[edge.head_node], pop_size=pop_size, period=edge.length, rng=rng, use_expected_tmrca=use_expected_tmrca) try: contained_nodes[edge.tail_node].extend(remaining) except KeyError: contained_nodes[edge.tail_node] = remaining # Create and return the full tree contained_tree = dendropy.Tree(taxon_namespace=self.contained_taxon_namespace, label=label) contained_tree.seed_node = final[0] contained_tree.is_rooted = True return contained_tree
def simulate_contained_kingman(self, edge_pop_size_attr='pop_size', default_pop_size=1, label=None, rng=None, use_expected_tmrca=False): """ Simulates and returns a "censored" (Kingman) neutral coalescence tree conditional on self. ``rng`` Random number generator to use. If |None|, the default will be used. ``edge_pop_size_attr`` Name of attribute of self's edges that specify the population size. If this attribute does not exist, then the population size is taken to be 1. Note that all edge-associated taxon sets must be up-to-date (otherwise, ``build_edge_taxa_sets()`` should be called), and that the tree is *not* added to the set of contained trees. For the latter, call ``embed_contained_kingman``. """ # Dictionary that maps nodes of containing tree to list of # corresponding nodes on gene tree, initially populated with leaf # nodes. contained_nodes = {} for nd in self.leaf_node_iter(): contained_nodes[nd] = [] for gt in nd.edge.contained_taxa: gn = dendropy.Node(taxon=gt) contained_nodes[nd].append(gn) # Generate the tree structure for edge in self.postorder_edge_iter(): if edge.head_node.parent_node is None: # root: run unconstrained coalescence until just one gene node # remaining if hasattr(edge, edge_pop_size_attr): pop_size = getattr(edge, edge_pop_size_attr) else: pop_size = default_pop_size if len(contained_nodes[edge.head_node]) > 1: final = coalescent.coalesce_nodes( nodes=contained_nodes[edge.head_node], pop_size=pop_size, period=None, rng=rng, use_expected_tmrca=use_expected_tmrca) else: final = contained_nodes[edge.head_node] else: # run until next coalescence event, as determined by this edge # size. if hasattr(edge, edge_pop_size_attr): pop_size = getattr(edge, edge_pop_size_attr) else: pop_size = default_pop_size remaining = coalescent.coalesce_nodes( nodes=contained_nodes[edge.head_node], pop_size=pop_size, period=edge.length, rng=rng, use_expected_tmrca=use_expected_tmrca) try: contained_nodes[edge.tail_node].extend(remaining) except KeyError: contained_nodes[edge.tail_node] = remaining # Create and return the full tree contained_tree = dendropy.Tree( taxon_namespace=self.contained_taxon_namespace, label=label) contained_tree.seed_node = final[0] contained_tree.is_rooted = True return contained_tree