dendropy.datamodel.treemodel: Trees¶
The Tree Class¶
- class dendropy.datamodel.treemodel.Tree(*args, **kwargs)[source]¶
An arborescence, i.e. a fully-connected directed acyclic graph with all edges directing away from the root and toward the tips. The “root” of the tree is represented by the
Tree.seed_nodeattribute. In unrooted trees, this node is an algorithmic artifact. In rooted trees this node is semantically equivalent to the root.The constructor can optionally construct a
Treeobject by cloning anotherTreeobject passed as the first positional argument, or out of a data source ifstreamandschemakeyword arguments are passed with a file-like object and a schema-specification string object values respectively.- Parameters:
*args (positional argument, optional) – If given, should be exactly one
Treeobject. The newTreewill then be a structural clone of this argument.**kwargs (keyword arguments, optional) –
The following optional keyword arguments are recognized and handled by this constructor:
labelThe label or description of the new
Treeobject.taxon_namespaceSpecifies the
TaxonNamespaceobject to be that the newTreeobject will reference.
Examples
Tree objects can be instantiated in the following ways:
# /usr/bin/env python try: from StringIO import StringIO except ImportError: from io import StringIO from dendropy import Tree, TaxonNamespace # empty tree t1 = Tree() # Tree objects can be instantiated from an external data source # using the 'get()' factory class method # From a file-like object t2 = Tree.get(file=open('treefile.tre', 'r'), schema="newick", tree_offset=0) # From a path t3 = Tree.get(path='sometrees.nexus', schema="nexus", collection_offset=2, tree_offset=1) # From a string s = "((A,B),(C,D));((A,C),(B,D));" # tree will be '((A,B),(C,D))' t4 = Tree.get(data=s, schema="newick") # tree will be '((A,C),(B,D))' t5 = Tree.get(data=s, schema="newick", tree_offset=1) # passing keywords to underlying tree parser t7 = dendropy.Tree.get( data="((A,B),(C,D));", schema="newick", taxon_namespace=t3.taxon_namespace, suppress_internal_node_taxa=False, preserve_underscores=True) # Tree objects can be written out using the 'write()' method. t1.write(file=open('treefile.tre', 'r'), schema="newick") t1.write(path='treefile.nex', schema="nexus") # Or returned as a string using the 'as_string()' method. s = t1.as_string("nexml") # tree structure deep-copied from another tree t8 = dendropy.Tree(t7) assert t8 is not t7 # Trees are distinct assert t8.symmetric_difference(t7) == 0 # and structure is identical assert t8.taxon_namespace is t7.taxon_namespace # BUT taxa are not cloned. nds3 = [nd for nd in t7.postorder_node_iter()] # Nodes in the two trees nds4 = [nd for nd in t8.postorder_node_iter()] # are distinct objects, for i, n in enumerate(nds3): # and can be manipulated assert nds3[i] is not nds4[i] # independentally. egs3 = [eg for eg in t7.postorder_edge_iter()] # Edges in the two trees egs4 = [eg for eg in t8.postorder_edge_iter()] # are also distinct objects, for i, e in enumerate(egs3): # and can also be manipulated assert egs3[i] is not egs4[i] # independentally. lves7 = t7.leaf_nodes() # Leaf nodes in the two trees lves8 = t8.leaf_nodes() # are also distinct objects, for i, lf in enumerate(lves3): # but order is the same, assert lves7[i] is not lves8[i] # and associated Taxon objects assert lves7[i].taxon is lves8[i].taxon # are the same. # To create deep copy of a tree with a different taxon namespace, # Use 'copy.deepcopy()' t9 = copy.deepcopy(t7) # Or explicitly pass in a new TaxonNamespace instance taxa = TaxonNamespace() t9 = dendropy.Tree(t7, taxon_namespace=taxa) assert t9 is not t7 # As above, the trees are distinct assert t9.symmetric_difference(t7) == 0 # and the structures are identical, assert t9.taxon_namespace is not t7.taxon_namespace # but this time, the taxa *are* different assert t9.taxon_namespace is taxa # as the given TaxonNamespace is used instead. lves3 = t7.leaf_nodes() # Leaf nodes (and, for that matter other nodes lves5 = t9.leaf_nodes() # as well as edges) are also distinct objects for i, lf in enumerate(lves3): # and the order is the same, as above, assert lves7[i] is not lves9[i] # but this time the associated Taxon assert lves7[i].taxon is not lves9[i].taxon # objects are distinct though the taxon assert lves7[i].taxon.label == lves9[i].taxon.label # labels are the same. # to 'switch out' the TaxonNamespace of a tree, replace the reference and # reindex the taxa: t11 = Tree.get(data='((A,B),(C,D));', 'newick') taxa = TaxonNamespace() t11.taxon_namespace = taxa t11.reindex_subcomponent_taxa() # You can also explicitly pass in a seed node: seed = Node(label="root") t12 = Tree(seed_node=seed) assert t12.seed_node is seed
- B1()[source]¶
DEPRECATED: Use
dendropy.calculate.treemeasure.B1.
- __iter__()[source]¶
Iterate over nodes on tree in pre-order.
Example
>>> for nd in tree: ... print(nd.label) ...
- Returns:
collections.Iterator[Node] – An iterator yielding the internal nodes of the subtree rooted at this node in post-order sequence.
- age_order_node_iter(include_leaves=True, filter_fn=None, descending=False)[source]¶
Deprecated: use
Tree.ageorder_node_iterinstead.
- ageorder_node_iter(include_leaves=True, filter_fn=None, descending=False)[source]¶
- Iterator over nodes of tree in order of the age of the node (i.e., the
time since the present).
Iterates over nodes in order of age (‘age’ is as given by the
ageattribute, which is usually the sum of edge lengths from tips to node, i.e., time since present). Ifinclude_leavesisTrue(default), leaves are included in the iteration; ifinclude_leavesisFalse, leaves will be skipped. IfdescendingisFalse(default), younger nodes will be returned before older ones; ifTrue, older nodes will be returned before younger ones.- Parameters:
include_leaves (boolean, optional) – If
True(default), then leaf nodes are included in the iteration. IfFalse, then leaf nodes are skipped.filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.descending (boolean, optional) – If
False(default), then younger nodes are visited before older ones. IfTrue, then older nodes are visited before younger ones.
- Returns:
collections.Iterator[Node] – Iterator over age-ordered sequence of nodes ofself.
- apply(before_fn=None, after_fn=None, leaf_fn=None)[source]¶
Applies function
before_fnandafter_fnto all internal nodes andleaf_fnto all terminal nodes in subtree starting withself, with nodes visited in pre-order.Given a tree with preorder sequence of nodes of [a,b,i,e,j,k,c,g,l,m,f,n,h,o,p,]:
a / \ / \ / \ / \ / \ / \ / c b / \ / \ / \ / e / f / / \ / / \ / / \ g / h / / \ / \ / / \ i j k l m n o p
the following order of function calls results:
before_fn(a) before_fn(b) leaf_fn(i) before_fn(e) leaf_fn(j) leaf_fn(k) after_fn(e) after_fn(b) before_fn(c) before_fn(g) leaf_fn(l) leaf_fn(m) after_fn(g) before_fn(f) leaf_fn(n) before_fn(h) leaf_fn(o) leaf_fn(p) after_fn(h) after_fn(f) after_fn(c) after_fn(a)
- Parameters:
Notes
Adapted from work by Mark T. Holder (the
peyotlmodule of the Open Tree of Life Project):
- as_ascii_plot(**kwargs)[source]¶
Returns a string representation a graphic of this tree using ASCII characters. See
AsciiTreePlotfor details on arguments.
- as_python_source(tree_obj_name=None, tree_args=None)[source]¶
Returns string that will rebuild this tree in Python.
- as_string(schema, **kwargs)¶
Composes and returns string representation of the data.
Mandatory Schema-Specification Keyword Argument:
schema (str) – Identifier of format of data. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.
Optional Schema-Specific Keyword Arguments:
These provide control over how the data is formatted, and supported argument names and values depend on the schema as specified by the value passed as the “
schema” argument. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.
- as_tikz_plot(**kwargs)[source]¶
Returns a string representation of this tree using TikZ code. See |TikzTreePlot| for details on arguments.
- calc_node_ages(ultrametricity_precision=1e-05, is_force_max_age=False, is_force_min_age=False, set_node_age_fn=None, is_return_internal_node_ages_only=False)[source]¶
Adds an attribute called “age” to each node, with the value equal to the sum of edge lengths from the node to the tips.
NOTE: Consider using the newer and more flexible
resolve_node_ages()instead of this.- Parameters:
ultrametricity_precision (numeric or bool or None) – If the lengths of different paths to the node differ by more than
ultrametricity_precision, then a ValueError exception will be raised indicating deviation from ultrametricity. Ifultrametricity_precisionis negative or False, then this check will be skipped.is_force_max_age (bool) – If
is_force_max_ageisTrue, then each node will be set to the maximum possible age, by being set to the oldest age given its child set and the subtending edge lengths. This option only makes a difference if the tree is not ultrametric, and so the ultrametricity precision check is ignore if this option is set to True.is_force_min_age (bool) – If
is_force_min_ageisTruethen each node will be set to the minimum possible age, by being set to the youngest age given its child set and the subtending edge lengths. This option only makes a difference if the tree is not ultrametric, and so the ultrametricity precision check is ignore if this option is set to True.set_node_age_fn (function object) –
If not
None, then this should be a function that takes a node as an argument and returnsNoneor a non-Nonevalue. IfNone, then this indicates that the node’s age should be calculated by this function. If notNone, then this is the value that this node’s age should be set to. This can be used to set non-contemporary tip ages by passing something like:f = lambda nd: None if not nd.is_leaf else nd.annotations[“height”]
which returns
Noneif the node is an internal node, but otherwise returns the value in theheightannotation.
- Returns:
a (iterable[numeric]) – Returns collection of node ages.
- calc_node_root_distances(return_leaf_distances_only=True)[source]¶
Adds attribute “root_distance” to each node, with value set to the sum of edge lengths from the node to the root. Returns list of distances. If
return_leaf_distances_onlyis True, then only leaf distances will be true.
- clone(depth=1)¶
Creates and returns a copy of
self.- Parameters:
depth (integer) –
The depth of the copy:
0: shallow-copy: All member objects are references, except for :attr:
annotation_setof top-level object and memberAnnotationobjects: these are full, independent instances (though any complex objects in thevaluefield ofAnnotationobjects are also just references).1: taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxoninstances: these are references.2: Exhaustive deep-copy: all objects are cloned.
- coalescence_intervals()[source]¶
Returns list of coalescence intervals of self., i.e., the waiting times between successive coalescence events.
- collapse_basal_bifurcation(set_as_unrooted_tree=True)[source]¶
Converts a degree-2 node at the root to a degree-3 node.
- collapse_unweighted_edges(threshold=1e-07, update_bipartitions=False)[source]¶
Collapse all internal edges with edge lengths less than or equal to
threshold(or withNonefor edge length).
- colless_tree_imbalance(normalize='max')[source]¶
DEPRECATED: Use ‘dendropy.calculate.treemeasure.colless_tree_imbalance()’.
- copy_annotations_from(other, attribute_object_mapper=None)¶
Copies annotations from
other, which must be ofAnnotabletype.Copies are deep-copies, in that the
Annotationobjects added to theannotation_setAnnotationSetcollection ofselfare independent copies of those in theannotate_setcollection ofother. However, dynamic bound-attribute annotations retain references to the original objects as given inother, which may or may not be desirable. This is handled by updated the objects to which attributes are bound via mappings found inattribute_object_mapper. In dynamic bound-attribute annotations, the_valueattribute of the annotations object (Annotation._value) is a tuple consisting of “(obj, attr_name)”, which instructs theAnnotationobject to return “getattr(obj, attr_name)” (via: “getattr(*self._value)”) when returning the value of the Annotation. “obj” is typically the object to which theAnnotationSetbelongs (i.e.,self). When a copy ofAnnotationis created, the object reference given in the first element of the_valuetuple of dynamic bound-attribute annotations are unchanged, unless the id of the object reference is fo- Parameters:
other (
Annotable) – Source of annotations to copy.attribute_object_mapper (dict) – Like the
memoof__deepcopy__, maps object id’s to objects. The purpose of this is to update the parent or owner objects of dynamic attribute annotations. If a dynamic attributeAnnotationgives objectxas the parent or owner of the attribute (that is, the first element of theAnnotation._valuetuple isother) andid(x)is found inattribute_object_mapper, then in the copy the owner of the attribute is changed toattribute_object_mapper[id(x)]. Ifattribute_object_mapperisNone(default), then the following mapping is automatically inserted:id(other): self. That is, any references tootherin anyAnnotationobject will be remapped toself. If really no reattribution mappings are desired, then an empty dictionary should be passed instead.
- deep_copy_annotations_from(other, memo=None)¶
Note that all references to
otherin any annotation value (and sub-annotation, and sub-sub-sub-annotation, etc.) will be replaced with references toself. This may not always make sense (i.e., a reference to a particular entity may be absolute regardless of context).
- description(depth=1, indent=0, itemize='', output=None)[source]¶
Returns description of object, up to level
depth.
- display_plot(**kwargs)[source]¶
Top-level display function. Delegation to other plotters possible in the future.
- encode_bipartitions(suppress_unifurcations=True, collapse_unrooted_basal_bifurcation=True, suppress_storage=False, is_bipartitions_mutable=False)[source]¶
Calculates the bipartitions of this tree.
- Parameters:
suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted as they are encountered.collapse_unrooted_basal_bifurcation (bool) – If
True, then a basal bifurcation on an unrooted tree will be collapsed to a trifurcation. This mean that an unrooted tree like ‘(A,(B,C))’ will be changed to ‘(A,B,C)’ after this.suppress_storage (bool) – By default, the bipartition encoding is stored as a list (assigned to
self.bipartition_encoding) and returned. Ifsuppress_storageisTrue, then the list is not created.is_bipartitions_mutable (bool) – By default, the
Bipartitioninstances coded will be locked or frozen, allowing their use in hashing containers such as dictionary (keys) and sets. To allow modification of values, theis_mutableattribute must be set toTrue.
- Returns:
list[|Bipartition|] or |None| – A list of
Bipartitionobjects of thisTreerepresenting the structure of this tree, or, ifsuppress_storageisTrue, thenNone.
- euclidean_distance(other_tree)[source]¶
DEPRECATED: Use ‘dendropy.treecompare.euclidean_distance()’.
- extract_tree(extraction_source_reference_attr_name='extraction_source', node_filter_fn=None, suppress_unifurcations=True, is_apply_filter_to_leaf_nodes=True, is_apply_filter_to_internal_nodes=False, tree_factory=None, node_factory=None)[source]¶
Returns a copy of this tree that only includes the basic structure (nodes, edges), and minimal attributes (edge lengths, node labels, and taxon associations). Annotations, comments, and other attributes are not copied.
- Parameters:
extraction_source_reference_attr_name (str) – Name of attribute to set on cloned nodes that references corresponding original node. If
None, then attribute (and reference) will not be created.node_filter_fn (None or function object) – If
None, then entire tree structure is cloned. If notNone, must be a function object that returnsTrueif a particularNodeinstance on the original tree should be included in the cloned tree, orFalseotherwise.suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted. Only will be done if some nodes are excluded from the cloned tree.is_apply_filter_to_leaf_nodes (bool) – If
Truethen the above filter will be applied to leaf nodes. IfFalsethen it will not (and all leaf nodes will be automatically included, unless excluded by an ancestral node being filtered out).is_apply_filter_to_internal_nodes (bool) – If
Truethen the above filter will be applied to internal nodes. IfFalsethen it will not (internal nodes without children will still be filtered out).tree_factory (function) – If not
None, must be a function that optionally takes aTaxonNamespaceas an argument and returns a newTree(or equivalent) instance.node_factory (function) – If not
None, must be a function that takes no arguments and returns a newNode(or equivalent) instance.
Examples
A simple clone:
tree0 = dendropy.Tree.get( path="mammals.tre", schema="newick") tree1 = tree0.extract_tree()
A clone that only extracts a subtree with taxa in the genus “Rhacophorus”:
tree0 = dendropy.Tree.get( path="old_world_frogs.tre", schema="newick") # Include taxa only if label starts with "Rhacophorus" node_filter_fn = lambda nd: nd.is_internal() or nd.taxon.label.startswith("Rhacophorus") tree1 = tree0.extract_tree(node_filter_fn=node_filter_fn) # Above is equivalent to, but more efficient than: # inclusion_set = [nd.taxon for nd in tree0.leaf_node_iter() # if nd.taxon.label.startswith("Rhacophorus)] # tree1 = dendropy.Tree(tree0) # tree1.retain_taxa(inclusion_set)
A clone that only extracts a subtree with nodes with taxa associated with the habitat “mountain” or “forest”:
tree0 = dendropy.Tree.get( path="birds.tre", schema="newick") include_habitats = set(["mountain", "forest"]) node_filter_fn = lambda nd: nd.taxon is None or nd.taxon.annotations["habitat"] in include_habitats tree1 = tree0.extract_tree(node_filter_fn=node_filter_fn)
- Returns:
t (|Tree|) – A new tree based on this one, with nodes filtered out if specified.
- extract_tree_with_taxa(taxa, extraction_source_reference_attr_name='extraction_source', suppress_unifurcations=True)[source]¶
Returns a copy of this tree that only includes leaf nodes if they are associated with the taxon objects listed in
taxa. Note that this copy will be a “thin” copy, including just the basic structure (nodes, edges) and minimal attributes (edge lengths, node labels, and taxon associations). Annotations, comments, and other attributes are not copied.- Parameters:
Examples
A clone that only extracts a subtree with taxa in the genus “Rhacophorus”:
tree0 = dendropy.Tree.get( path="old_world_frogs.tre", schema="newick") # Include taxa only if label starts with "Rhacophorus" taxa_to_retain = set([taxon for taxon in tree0.taxon_namespace if taxon.label.startswith("Rhacophorus")]) tree1 = tree0.extract_tree_with_taxa(taxa=taxa_to_retain) # Above is equivalent to, but more efficient than: # inclusion_set = [nd.taxon for nd in tree0.leaf_node_iter() # if nd.taxon.label.startswith("Rhacophorus)] # tree1 = dendropy.Tree(tree0) # tree1.retain_taxa(inclusion_set)
- Returns:
t (|Tree|) – A new tree based on this one, with nodes filtered out if specified.
- extract_tree_with_taxa_labels(labels, extraction_source_reference_attr_name='extraction_source', suppress_unifurcations=True)[source]¶
Returns a copy of this tree that only includes leaf nodes if they are associated with taxon objects with labels matching those listed in
labels. Note that this copy will be a “thin” copy, including just the basic structure (nodes, edges) and minimal attributes (edge lengths, node labels, and taxon associations). Annotations, comments, and other attributes are not copied.- Parameters:
labels (iterable of str instances) – List or some other iterable of strings to match.
suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted. Only will be done if some nodes are excluded from the cloned tree.
Examples
A clone that only extracts a subtree with taxa in the genus “Rhacophorus”:
tree0 = dendropy.Tree.get( path="old_world_frogs.tre", schema="newick") # Include taxa only if label starts with "Rhacophorus" labels = set([taxon.label for taxon in tree0.taxon_namespace if taxon.label.startswith("Rhacophorus")]) tree1 = tree0.extract_tree_with_taxa_labels(labels=labels) # Above is equivalent to, but more efficient than: # inclusion_set = [nd.taxon for nd in tree0.leaf_node_iter() # if nd.taxon.label.startswith("Rhacophorus)] # tree1 = dendropy.Tree(tree0) # tree1.retain_taxa(inclusion_set)
- Returns:
t (|Tree|) – A new tree based on this one, with nodes filtered out if specified.
- extract_tree_without_taxa(taxa, extraction_source_reference_attr_name='extraction_source', suppress_unifurcations=True)[source]¶
Returns a copy of this tree that only includes leaf nodes if they are NOT associated with the taxon objects listed in
taxa. Note that this copy will be a “thin” copy, including just the basic structure (nodes, edges) and minimal attributes (edge lengths, node labels, and taxon associations). Annotations, comments, and other attributes are not copied.- Parameters:
taxa (iterable of
Taxoninstances) – List or some other iterable ofTaxonobjects to exclude.suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted. Only will be done if some nodes are excluded from the cloned tree.is_apply_filter_to_leaf_nodes (bool) – If
Truethen the above filter will be applied to leaf nodes. IfFalsethen it will not (and all leaf nodes will be automatically included, unless excluded by an ancestral node being filtered out).is_apply_filter_to_internal_nodes (bool) – If
Truethen the above filter will be applied to internal nodes. IfFalsethen it will not (internal nodes without children will still be filtered out).
Examples
A clone that only extracts a subtree with taxa NOT in the genus “Rhacophorus”:
tree0 = dendropy.Tree.get( path="old_world_frogs.tre", schema="newick") # Exclude taxa if their name starts with "Rhacophorus" taxa_to_exclude = set([taxon for taxon in tree0.taxon_namespace if taxon.label.startswith("Rhacophorus")]) tree1 = tree0.extract_tree_with_taxa(taxa=taxa_to_retain) # Above is equivalent to, but more efficient than: # inclusion_set = [nd.taxon for nd in tree0.leaf_node_iter() # if nd.taxon.label.startswith("Rhacophorus)] # tree1 = dendropy.Tree(tree0) # tree1.retain_taxa(inclusion_set)
- Returns:
t (|Tree|) – A new tree based on this one, with nodes filtered out if specified.
- extract_tree_without_taxa_labels(labels, extraction_source_reference_attr_name='extraction_source', suppress_unifurcations=True)[source]¶
Returns a copy of this tree that only includes leaf nodes if they are NOT associated with the taxon objects listed in
taxa. Note that this copy will be a “thin” copy, including just the basic structure (nodes, edges) and minimal attributes (edge lengths, node labels, and taxon associations). Annotations, comments, and other attributes are not copied.- Parameters:
labels (iterable of str instances) – List or some other iterable of strings to match.
suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted. Only will be done if some nodes are excluded from the cloned tree.is_apply_filter_to_leaf_nodes (bool) – If
Truethen the above filter will be applied to leaf nodes. IfFalsethen it will not (and all leaf nodes will be automatically included, unless excluded by an ancestral node being filtered out).is_apply_filter_to_internal_nodes (bool) – If
Truethen the above filter will be applied to internal nodes. IfFalsethen it will not (internal nodes without children will still be filtered out).
Examples
A clone that only extracts a subtree with taxa NOT in the genus “Rhacophorus”:
tree0 = dendropy.Tree.get( path="old_world_frogs.tre", schema="newick") # Exclude taxa if label starts with "Rhacophorus" labels = set([taxon.label for taxon in tree0.taxon_namespace if taxon.label.startswith("Rhacophorus")]) tree1 = tree0.extract_tree_without_taxa_labels(labels=labels) # Above is equivalent to, but more efficient than: # inclusion_set = [nd.taxon for nd in tree0.leaf_node_iter() # if nd.taxon.label.startswith("Rhacophorus)] # tree1 = dendropy.Tree(tree0) # tree1.prune_taxa(inclusion_set)
- Returns:
t (|Tree|) – A new tree based on this one, with nodes filtered out if specified.
- false_positives_and_negatives(other_tree)[source]¶
DEPRECATED: Use ‘dendropy.treecompare.false_positives_and_negatives()’.
- filter_leaf_nodes(filter_fn, recursive=True, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Removes all leaves for which
filter_fnreturnsFalse. If recursive isTrue, then process is repeated until all leaf nodes in the tree will evaluate toTruewhen passed tofilter_fn.- Parameters:
filter_fn (function object) – A function that takes a
Nodeobject and returnsTrueif the object is to be allowed as a leaf node, andFalseif otherwise.recursive (bool) – If
True, then filter is repeatedly applied until all leaf nodes evaluate toTrueunderfilter_fn. IfFalse, then only a single pass is made on the current leaf set. This may result in new leaves for which thefilter_fnisFalse(e.g., the parent node of a cherry in which both children evaluated toFalseunderfilter_fnnow is a leaf node which may beFalseunderfilter_fn).suppress_unifurcations (bool) – If
True, nodes of outdegree 1 will be deleted as they are encountered.update_bipartitions (bool) – If
True, then bipartitions will be calculated.
- Returns:
nds (list[|Node|]) – List of nodes removed.
- find_missing_splits(other_tree)[source]¶
DEPRECATED: Use ‘dendropy.treecompare.find_missing_bipartitions()’.
- find_node(filter_fn)[source]¶
Finds the first node for which
filter_fn(node) == True.For example, if:
filter_fn = lambda n: hasattr(n, 'genes') and n.genes is not None
then:
node = t.find_node(filter_fn=filter_fn)
will return the first node which has the attribute ‘genes’ and this value is not None.
- find_node_with_label(label)[source]¶
Returns first node with
labelattribute matchinglabelargument.
- find_node_with_taxon(taxon_filter_fn=None)[source]¶
Returns node associated with
Taxonobject for whichtaxon_filter_fnreturnsTrue.- Parameters:
taxon_filter_fn (function object) – Takes a single
Taxonobject as an argument and returnsTrueif the node associated with thatTaxonshould be returned.- Returns:
|Node| or |None| – Returns first
Nodeobject withtaxonattribute passing filter functiontaxon_filter_fn, orNoneif no such node is found.
- find_node_with_taxon_label(label)[source]¶
Returns node associated with
Taxonobject with the specified label.
- find_nodes(filter_fn)[source]¶
Find all nodes for which
filter_fn(node) == True.For example, if:
filter_fn = lambda n: hasattr(n, 'genes') and n.genes is not None
then:
nodes = t.find_node(filter_fn=filter_fn)
will return all nodes which have the attribute ‘genes’ and this value is not None.
- classmethod from_bipartition_encoding(bipartition_encoding, taxon_namespace, is_rooted=False, edge_lengths=None)[source]¶
Reconstructs a tree from a bipartition encoding.
- Parameters:
bipartition_encoding (iterable[
Bipartition]) – An iterable ofBipartitioninstances representing a tree. Bipartitions will be added to the tree in the order given by iterating over this. Bipartitions that are incompatible with the tree will be skipped. So if not all bipartitions are compatible with each other, then the sequence of bipartitions given inbipartition_encodingshould be in order of their support values or some other preference criteria.taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to use to manage taxon definitions.is_rooted (bool) – Specifies whether or not the tree is rooted.
edge_lengths (iterable or
None) – An iterable of edge lengths. This should be in the same order as the bipartitions in the bipartition encoding.
- Returns:
|Tree| – The tree reconstructed from the given bipartition encoding.
- classmethod from_split_bitmasks(split_bitmasks, taxon_namespace, is_rooted=False, split_edge_lengths=None)[source]¶
Reconstructs a tree from a collection of splits represented as bitmasks.
- Parameters:
split_bitmasks (iterable[int]) – An iterable of split bitmasks representing a tree. Splits will be added to the tree in the order given by iterating over this. Splits that are incompatible with the tree will be skipped. So if not all splits are compatible with each other, then the sequence of splits given in
bipartition_encodingshould be in order of their support values or some other preference criteria.taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to use to manage taxon definitions.is_rooted (bool) – Specifies whether or not the tree is rooted.
edge_lengths (dict or
FalseorNone) – IfFalseorNone, then no edge lengths will be added. Otherwise, this should be a dictionary mapping splits to edge lengths.
- Returns:
|Tree| – The tree reconstructed from the given bipartition encoding.
- classmethod get(**kwargs)[source]¶
Instantiate and return a new
Treeobject from a data source.Mandatory Source-Specification Keyword Argument (Exactly One of the Following Required):
file (file) – File or file-like object of data opened for reading.
path (str) – Path to file of data.
url (str) – URL of data.
data (str) – Data given directly.
Mandatory Schema-Specification Keyword Argument:
schema (str) – Identifier of format of data given by the “
file”, “path”, “data”, or “url” argument specified above: “newick”, “nexus”, or “nexml”. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.
Optional General Keyword Arguments:
label (str) – Name or identifier to be assigned to the new object; if not given, will be assigned the one specified in the data source, or
Noneotherwise.taxon_namespace (
TaxonNamespace) – TheTaxonNamespaceinstance to use to manage the taxon names. If not specified, a new one will be created.collection_offset (int) – 0-based index of tree block or collection in source to be parsed. If not specified then the first collection (offset = 0) is assumed.
tree_offset (int) – 0-based index of tree within the collection specified by
collection_offsetto be parsed. If not specified, then the first tree (offset = 0) is assumed.ignore_unrecognized_keyword_arguments (bool) – If
True, then unsupported or unrecognized keyword arguments will not result in an error. Default isFalse: unsupported keyword arguments will result in an error.
Optional Schema-Specific Keyword Arguments:
These provide control over how the data is interpreted and processed, and supported argument names and values depend on the schema as specified by the value passed as the “
schema” argument. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.Examples:
# From a URL t1 = dendropy.Tree.get( url="http://api.opentreeoflife.org/v2/study/pg_1144/tree/tree2324.nex", schema="nexus") # From a file-like object t2 = Tree.get(file=open('treefile.tre', 'r'), schema="newick", tree_offset=0) # From a path t3 = Tree.get(path='sometrees.nexus', schema="nexus", collection_offset=2, tree_offset=1) # From a string s = "((A,B),(C,D));((A,C),(B,D));" # tree will be '((A,B),(C,D))' t4 = Tree.get(data=s, schema="newick") # tree will be '((A,C),(B,D))' t5 = Tree.get(data=s, schema="newick", tree_offset=1) # passing keywords to underlying tree parser t7 = dendropy.Tree.get( data="((A,B),(C,D));", schema="newick", taxon_namespace=t3.taxon_namespace, suppress_internal_node_taxa=False, preserve_underscores=True)
- classmethod get_from_path(src, schema, **kwargs)¶
Factory method to return new object of this class from file specified by string
src.- Parameters:
src (string) – Full file path to source of data.
schema (string) – Specification of data format (e.g., “nexus”).
kwargs (keyword arguments, optional) – Arguments to customize parsing, instantiation, processing, and accession of objects read from the data source, including schema- or format-specific handling. These will be passed to the underlying schema-specific reader for handling.
- Returns:
pdo (phylogenetic data object) – New instance of object, constructed and populated from data given in source.
- classmethod get_from_stream(src, schema, **kwargs)¶
Factory method to return new object of this class from file-like object
src.- Parameters:
src (file or file-like) – Source of data.
schema (string) – Specification of data format (e.g., “nexus”).
kwargs (keyword arguments, optional) – Arguments to customize parsing, instantiation, processing, and accession of objects read from the data source, including schema- or format-specific handling. These will be passed to the underlying schema-specific reader for handling.
- Returns:
pdo (phylogenetic data object) – New instance of object, constructed and populated from data given in source.
- classmethod get_from_string(src, schema, **kwargs)¶
Factory method to return new object of this class from string
src.- Parameters:
src (string) – Data as a string.
schema (string) – Specification of data format (e.g., “nexus”).
kwargs (keyword arguments, optional) – Arguments to customize parsing, instantiation, processing, and accession of objects read from the data source, including schema- or format-specific handling. These will be passed to the underlying schema-specific reader for handling.
- Returns:
pdo (phylogenetic data object) – New instance of object, constructed and populated from data given in source.
- classmethod get_from_url(src, schema, strip_markup=False, **kwargs)¶
Factory method to return a new object of this class from URL given by
src.- Parameters:
src (string) – URL of location providing source of data.
schema (string) – Specification of data format (e.g., “nexus”).
kwargs (keyword arguments, optional) – Arguments to customize parsing, instantiation, processing, and accession of objects read from the data source, including schema- or format-specific handling. These will be passed to the underlying schema-specific reader for handling.
- Returns:
pdo (phylogenetic data object) – New instance of object, constructed and populated from data given in source.
- infer_taxa()[source]¶
Creates (and returns) a new TaxonNamespace object for
selfpopulated with taxa from this tree.
- inorder_edge_iter(filter_fn=None)[source]¶
In-order iteration over edges of tree.
Visits edges in
self, with each edge visited in-between its children. Only valid for strictly-bifurcating trees. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen called with the edge as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.- Returns:
collections.Iterator[Edge] – An iterator yielding edges ofselfin infix or in-order sequence.
- inorder_node_iter(filter_fn=None)[source]¶
In-order iteration over nodes of tree.
Visits nodes in
self, with each node visited in-between its children. Only valid for strictly-bifurcating trees. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes ofselfin infix or in-order sequence.
- internal_node_ages(ultrametricity_precision=1e-05, is_force_max_age=False, is_force_min_age=False, set_node_age_fn=None)[source]¶
Returns list of ages of speciation events / coalescence times on tree.
- internal_nodes(exclude_seed_node=False)[source]¶
Returns list of internal nodes in the tree.
Root or seed node is included unless
exclude_seed_nodeisTrue.
- is_compatible_with_bipartition(bipartition, is_bipartitions_updated=False)[source]¶
Returns true if the
Bipartitionbipartitionis compatible with all bipartitions of this tree.
- ladderize(ascending=True)[source]¶
Sorts child nodes in ascending (if
ascendingisTrue) or descending (ifascendingisFalse) order in terms of the number of children each child node has.Ladderize sort is stable. To control order between nodes with same child count, call
reorderprior to ladderization.
- leaf_edge_iter(filter_fn=None)[source]¶
Iterate over all tips or leaves of tree.
Visits all leaf or tip in
self. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen called with the edge as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.- Returns:
collections.Iterator[Edge] – An iterator yielding leaf edges inself.
- leaf_iter(filter_fn=None)[source]¶
Deprecated: use
Tree.leaf_node_iterinstead.
- leaf_node_iter(filter_fn=None)[source]¶
Iterate over all tips or leaves of tree.
Visits all leaf or tip in
self. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding leaf nodes inself.
- length()[source]¶
Returns sum of edge lengths of self. Edges with no lengths defined (None) will be considered to have a length of 0. Note that we do not overrride
__len__as this requires an integer return value.
- level_order_edge_iter(filter_fn=None)[source]¶
Deprecated: use
Tree.levelorder_edge_iterinstead.
- level_order_node_iter(filter_fn=None)[source]¶
Deprecated: use
Tree.levelorder_node_iterinstead.
- levelorder_edge_iter(filter_fn=None)[source]¶
Level-order iteration over edges of tree.
Visits edges in
self, with each edge and other edges at the same level (distance from root) visited before their children. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen called with the edge as an argument are visited.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.- Returns:
collections.Iterator[Edge] – An iterator yielding edges ofselfin level-order sequence.
- levelorder_node_iter(filter_fn=None)[source]¶
Level-order iteration over nodes of tree.
Visits nodes in
self, with each node and other nodes at the same level (distance from root) visited before their children. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are visited.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes ofselfin level-order sequence.
- migrate_taxon_namespace(taxon_namespace, unify_taxa_by_label=True, taxon_mapping_memo=None)¶
Move this object and all members to a new operational taxonomic unit concept namespace scope.
Current
self.taxon_namespacevalue will be replaced with value given intaxon_namespaceif this is notNone, or a newTaxonNamespaceobject. Following this,reconstruct_taxon_namespace()will be called: each distinctTaxonobject associated withselfor members ofselfthat is not alread intaxon_namespacewill be replaced with a newTaxonobject that will be created with the same label and added toself.taxon_namespace. Calling this method results in the object (and all its member objects) being associated with a new, independent taxon namespace.Label mapping case sensitivity follows the
self.taxon_namespace.is_case_sensitivesetting. IfFalseandunify_taxa_by_labelis alsoTrue, then the establishment of correspondence betweenTaxonobjects in the old and new namespaces with be based on case-insensitive matching of labels. E.g., if there are fourTaxonobjects with labels ‘Foo’, ‘Foo’, ‘FOO’, and ‘FoO’ in the old namespace, then all objects that reference these will reference a single newTaxonobject in the new namespace (with a label some existing casing variant of ‘foo’). IfTrue: ifunify_taxa_by_labelisTrue,Taxonobjects with labels identical except in case will be considered distinct.- Parameters:
taxon_namespace (
TaxonNamespace) – TheTaxonNamespaceinto the scope of which this object will be moved.unify_taxa_by_label (boolean, optional) – If
True, then references to distinctTaxonobjects with identical labels in the current namespace will be replaced with a reference to a singleTaxonobject in the new namespace. IfFalse: references to distinctTaxonobjects will remain distinct, even if the labels are the same.taxon_mapping_memo (dictionary) – Similar to
memoof deepcopy, this is a dictionary that mapsTaxonobjects in the old namespace to correspondingTaxonobjects in the new namespace. Mostly for interal use when migrating complex data to a new namespace. Note that any mappings here take precedence over all other options: if aTaxonobject in the old namespace is found in this dictionary, the counterpart in the new namespace will be whatever value is mapped, regardless of, e.g. label values.
Examples
Use this method to move an object from one taxon namespace to another.
For example, to get a copy of an object associated with another taxon namespace and associate it with a different namespace:
# Get handle to the new TaxonNamespace other_taxon_namespace = some_other_data.taxon_namespace # Get a taxon-namespace scoped copy of a tree # in another namespace t2 = Tree(t1) # Replace taxon namespace of copy t2.migrate_taxon_namespace(other_taxon_namespace)
You can also use this method to get a copy of a structure and then move it to a new namespace:
t2 = Tree(t1) t2.migrate_taxon_namespace(TaxonNamespace())
# Note: the same effect can be achived by: t3 = copy.deepcopy(t1)
See also
- minmax_leaf_distance_from_root()[source]¶
Returns pair of values, representing the distance of the leaf closest to a furthest from the root.
- mrca(**kwargs)[source]¶
Returns most-recent common ancestor node of a set of taxa on the tree.
Returns the shallowest node in the tree (the node nearest the tips) that has all of the taxa that:
are specified by the leafset bitmask given by the keyword argument
leafset_bitmaskare in the list of Taxon objects given by the keyword argument
taxahave the labels specified by the list of strings given by the keyword argument
taxon_labels
Returns
Noneif no appropriate node is found. Assumes that bipartitions have been encoded on the tree. It is possible that the leafset bitmask is not compatible with the subtree that is returned! (compatibility tests are not fully performed). This function is used to find the “insertion point” for a new bipartition via a root to tip search.- Parameters:
**kwargs (keyword arguments) –
Exactly one of the following must be specified:
leafset_bitmaskintegerNode object subtended by the first edge compatible with this leafset bitmask will be returned.
taxacollections.Iterable [Taxon]Shallowest node object with descendent nodes associated with all the
Taxonobjects specified will be returned.taxon_labelscollections.Iterable [string]Shallowest node object with descendent nodes associated with the minimal set of Taxon objects that collectively have all the labels specified in
taxon_labelswill be returned.
In addition, the following optional keywords are supported:
start_nodeNode, optionalIf given, specifies the node at which to start searching. If not, defaults to the root or
seed_node.
- Returns:
|Node| or |None| – The most-recent common ancestor of the nodes specified, or
Noneif no such node exists.
- node_ages(ultrametricity_precision=1e-05, is_force_max_age=False, is_force_min_age=False, set_node_age_fn=None, internal_only=False)[source]¶
Returns list of ages of all nodes on tree. NOTE: Changed from DendroPy3: this function now returns the ages of ALL nodes. To get only internal node ages, use
Tree.internal_node_ages.
- classmethod node_factory(**kwargs)[source]¶
Creates and returns a
Nodeobject.Derived classes can override this method to provide support for specialized or different types of nodes on the tree.
- nodes(filter_fn=None)[source]¶
Returns list of nodes on tree.
- num_lineages_at(distance_from_root)[source]¶
Returns the number of lineages on the tree at a particular distance from the root.
- phylogenetic_distance_matrix(*args, **kwargs)[source]¶
Returns a
PhylogeneticDistanceMatrixinstance based on the tree (in its current state).- Returns:
pdc (a |PhylogeneticDistanceMatrix| instance) – A
PhylogeneticDistanceMatrixinstance corresponding to the tree in its current state.
- poll_taxa(taxa=None)[source]¶
Returns a set populated with all of
Taxoninstances associated withself.- Parameters:
taxa (set()) – Set to populate. If not specified, a new one will be created.
- Returns:
set[|Taxon|] – Set of taxa associated with
self.
- polytomize_root(set_as_unrooted_tree=True)[source]¶
Works recursively to set root as a degree-3 node.
If
selfhas two children and at least one of them is an internal node, then it will be converted to an out-degree three node (with the edge length added as needed).Similar to
Tree.collapse_basal_bifurcation, but works recursively to set root as a degree-3 node.
- postorder_edge_iter(filter_fn=None)[source]¶
Post-order iterator over edges of tree.
Visits edges in
self, with each edge visited after its children. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen called with the edge as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.- Returns:
collections.Iterator[Edge] – An iterator yielding the edges inselfin post-order sequence.
- postorder_internal_edge_iter(filter_fn=None, exclude_seed_edge=False)[source]¶
Pre-order iterator over internal edges tree.
Visits internal edges in
self, with each edge visited after its children. In DendroPy, “internal edges” are edges that have at least one child edge, and thus the root or seed edge is typically included unlessexclude_seed_edgeisTrue. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen passed the edge as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.exclude_seed_edge (boolean, optional) – If
False(default), then the seed edge or root is visited. IfTrue, then the seed edge is skipped.
- Returns:
collections.Iterator[Edge] – An iterator yielding the internal edges ofselfin post-order sequence.
- postorder_internal_node_iter(filter_fn=None, exclude_seed_node=False)[source]¶
Pre-order iterator over internal nodes tree.
Visits internal nodes in
self, with each node visited after its children. In DendroPy, “internal nodes” are nodes that have at least one child node, and thus the root or seed node is typically included unlessexclude_seed_nodeisTrue. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen passed the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.exclude_seed_node (boolean, optional) – If
False(default), then the seed node or root is visited. IfTrue, then the seed node is skipped.
- Returns:
collections.Iterator[Node] – An iterator yielding the internal nodes ofselfin post-order sequence.
- postorder_node_iter(filter_fn=None)[source]¶
Post-order iterator over nodes of tree.
Visits self and all descendant nodes, with each node visited after its children. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding the nodes inselfin post-order sequence.
- preorder_edge_iter(filter_fn=None)[source]¶
Pre-order iterator over nodes in tree.
Visits nodes in
self, with each node visited before its children. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes inselfin pre-order sequence.
- preorder_internal_edge_iter(filter_fn=None, exclude_seed_edge=False)[source]¶
Pre-order iterator over internal edges in tree.
Visits internal edges in
self, with each edge visited before its children. In DendroPy, “internal edges” are edges that have at least one child edge, and thus the root or seed edge is typically included unlessexclude_seed_edgeisTrue. Edges can optionally be filtered byfilter_fn: only edges for whichfilter_fnreturnsTruewhen passed the edge as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.exclude_seed_edge (boolean, optional) – If
False(default), then the edge subtending the seed node or root is visited. IfTrue, then this edge is skipped.
- Returns:
collections.Iterator[Edge] – An iterator yielding the internal edges ofself.
- preorder_internal_node_iter(filter_fn=None, exclude_seed_node=False)[source]¶
Pre-order iterator over internal nodes in tree.
Visits internal nodes in
self, with each node visited before its children. In DendroPy, “internal nodes” are nodes that have at least one child node, and thus the root or seed node is typically included unlessexclude_seed_nodeisTrue. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen passed the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.exclude_seed_node (boolean, optional) – If
False(default), then the seed node or root is visited. IfTrue, then the seed node is skipped.
- Returns:
collections.Iterator[Node] – An iterator yielding the internal nodes ofself.
- preorder_node_iter(filter_fn=None)[source]¶
Pre-order iterator over nodes in tree.
Visits nodes in
self, with each node visited before its children. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes inselfin pre-order sequence.
- prune_leaves_without_taxa(recursive=True, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Removes all terminal nodes that have their
taxonattribute set toNone.
- prune_subtree(node, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Removes subtree starting at
nodefrom tree.
- prune_taxa(taxa, update_bipartitions=False, suppress_unifurcations=True, is_apply_filter_to_leaf_nodes=True, is_apply_filter_to_internal_nodes=False)[source]¶
Removes terminal nodes associated with Taxon objects given by the container
taxa(which can be any iterable, including a TaxonNamespace object) fromself.
- prune_taxa_with_labels(labels, update_bipartitions=False, suppress_unifurcations=True, is_apply_filter_to_leaf_nodes=True, is_apply_filter_to_internal_nodes=False)[source]¶
Removes terminal nodes that are associated with Taxon objects with labels given by
labels.
- purge_taxon_namespace()¶
Remove all
Taxoninstances inself.taxon_namespacethat are not associated withselfor any item inself.
- pybus_harvey_gamma(prec=1e-05)[source]¶
DEPRECATED: Use ‘dendropy.calculate.treemeasure.pybus_harvey_gamma()’.
- randomly_assign_taxa(create_required_taxa=True, rng=None)[source]¶
Randomly assigns taxa to leaf nodes. If the number of taxa defined in the taxon set of the tree is more than the number of tips, then a random subset of taxa in
taxon_namespacewill be assigned to the tips of tree. If the number of tips is more than the number of taxa in thetaxon_namespace, andadd_extra_taxais not True [default], then new Taxon objects will be created and added to thetaxon_namespace; ifcreate_required_taxais False, then an exception is raised.In addition, a Random() object or equivalent can be passed using
rng; otherwise GLOBAL_RNG is used.
- randomly_reorient(rng=None, update_bipartitions=False)[source]¶
Randomly picks a new rooting position and rotates the branches around all internal nodes in the
self. Ifupdate_bipartitionsis True, the thebipartition_bitmaskandbipartition_edge_mapattributes kept valid.
- reconstruct_taxon_namespace(unify_taxa_by_label=True, taxon_mapping_memo=None)[source]¶
Repopulates the current taxon namespace with new taxon objects, preserving labels. Each distinct
Taxonobject associated withselfor members ofselfthat is not already inself.taxon_namespacewill be replaced with a newTaxonobject that will be created with the same label and added toself.taxon_namespace.Label mapping case sensitivity follows the
self.taxon_namespace.is_case_sensitivesetting. IfFalseandunify_taxa_by_labelis alsoTrue, then the establishment of correspondence betweenTaxonobjects in the old and new namespaces with be based on case-insensitive matching of labels. E.g., if there are fourTaxonobjects with labels ‘Foo’, ‘Foo’, ‘FOO’, and ‘FoO’ in the old namespace, then all objects that reference these will reference a single newTaxonobject in the new namespace (with a label some existing casing variant of ‘foo’). IfTrue: ifunify_taxa_by_labelisTrue,Taxonobjects with labels identical except in case will be considered distinct.Note
Existing
Taxonobjects inself.taxon_namespaceare not removed. This method should thus only be called only whenself.taxon_namespacehas been changed. In fact, typical usage would not involve calling this method directly, but rather through- Parameters:
unify_taxa_by_label (boolean, optional) – If
True, then references to distinctTaxonobjects with identical labels in the current namespace will be replaced with a reference to a singleTaxonobject in the new namespace. IfFalse: references to distinctTaxonobjects will remain distinct, even if the labels are the same.taxon_mapping_memo (dictionary) – Similar to
memoof deepcopy, this is a dictionary that mapsTaxonobjects in the old namespace to correspondingTaxonobjects in the new namespace. Mostly for interal use when migrating complex data to a new namespace.
- reindex_taxa(taxon_namespace=None, clear=False)¶
DEPRECATED: Use
migrate_taxon_namespace()instead. Rebuildstaxon_namespacefrom scratch, or assignsTaxonobjects from givenTaxonNamespaceobjecttaxon_namespacebased on label values.
- reorder(ascending=True, key=<function Tree.<lambda>>)[source]¶
Reorder the children of each node in the tree, by default in ascending order by Taxon with missing taxa treated as labeled as empty string. Does not alter tree topology.
Specify
keyto sort by a different attribute or function of nodes.
- reroot_at_edge(edge, length1=None, length2=None, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Takes an internal edge,
edge, adds a new node to it, and then roots the tree on the new node.length1will be assigned to the new (sub-)edge leading to the original parent of the original edge.length2will be assigned to the new (sub-)edge leading to the original child of the original edge. Ifupdate_bipartitionsis True, then the edges’bipartitionand the tree’sbipartition_encodingattributes will be updated. If the old root of the tree had an outdegree of 2, then after this operation, it will have an outdegree of one. In this case, unlesssuppress_unifurcationsis False, then it will be removed from the tree.
- reroot_at_midpoint(update_bipartitions=False, suppress_unifurcations=True, collapse_unrooted_basal_bifurcation=True)[source]¶
Reroots the tree at the the mid-point of the longest distance between two taxa in a tree. Sets the rooted flag on the tree to True. If
update_bipartitionsis True, then the edges’bipartitionand the tree’sbipartition_encodingattributes will be updated. If the old root of the tree had an outdegree of 2, then after this operation, it will have an outdegree of one. In this case, unlesssuppress_unifurcationsis False, then it will be removed from the tree.
- reroot_at_node(new_root_node, update_bipartitions=False, suppress_unifurcations=True, collapse_unrooted_basal_bifurcation=True)[source]¶
Takes an internal node,
new_seed_nodethat must already be in the tree and roots the tree at that node. This is a ‘hard’ rerooting – i.e., changes the tree representation so tree traversal behaves as if the tree is rooted at ‘new_seed_node’, and changes the tree’s rooting state. Ifupdate_bipartitionsis True, then the edges’bipartitionand the tree’sbipartition_encodingattributes will be updated. If the old root of the tree had an outdegree of 2, then after this operation, it will have an outdegree of one. In this case, unlesssuppress_unifurcationsis False, then it will be removed from the tree.
- reseed_at(new_seed_node, update_bipartitions=False, collapse_unrooted_basal_bifurcation=True, suppress_unifurcations=True)[source]¶
Reseeds the tree at a different (existing) node.
Takes an internal node,
new_seed_nodethat must already be in the tree and rotates the tree such thatnew_seed_nodeis theseed_nodeof the tree. This is a ‘soft’ rerooting – i.e., changes the tree representation so tree traversal behaves as if the tree is rooted at ‘new_seed_node’, but it does not actually change the tree’s rooting state. Ifupdate_bipartitionsis True, then the edges’bipartition_bitmaskand the tree’sbipartition_edge_mapattributes will be updated. If the old root of the tree had an outdegree of 2, then after this operation, it will have an outdegree of one. In this case, unlesssuppress_unifurcationsis False, then it will be removed from the tree.
- resolve_node_ages(node_callback_fn=None, node_edge_length_fn=None, attr_name='age')[source]¶
Adds an attribute called “age” to each node, with the value equal to the time elapsed since the present.
This is calculated by: (1) setting the age of the root node to the sum of path lengths to the most distant tip (2) setting the age of each other node as the sum of path lengths from the root.
Unlike the (legacy)
calc_node_ages()there is no ultrametricity requirement or check.
- resolve_node_depths(node_callback_fn=None, node_edge_length_fn=None, attr_name='depth')[source]¶
Adds an attribute given by
attr_nameto each node, with the value equal to the sum of edge lengths from the root.
- resolve_polytomies(limit=2, update_bipartitions=False, rng=None)[source]¶
Arbitrarily resolve polytomies using 0-length edges.
- Parameters:
limit (int) – The maximum number of children a node can have before being resolved.
update_bipartitions (bool) – If
True, then bipartitions will be calculated.rng (
random.Randomobject orNone) – Ifrngis an object with asample()method then the polytomy will be resolved by sequentially adding, generating all tree topologies equiprobably.rng.sample()should behave likerandom.sample()IfrngisNone, then polytomy is broken deterministically by repeatedly joining pairs of children.
- retain_taxa(taxa, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Removes terminal nodes that are not associated with any of the Taxon objects given by
taxa(which can be any iterable, including a TaxonNamespace object) from theself.
- retain_taxa_with_labels(labels, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Removes terminal nodes that are not associated with Taxon objects with labels given by
labels.
- robinson_foulds_distance(other_tree)[source]¶
DEPRECATED: Use ‘dendropy.treecompare.weighted_robinson_foulds_distance()’.
- sackin_index(normalize=True)[source]¶
DEPRECATED: Use ‘dendropy.calculate.treemeasure.sackin_index()’.
- scale_edges(edge_len_multiplier)[source]¶
Multiplies every edge length in
selfbyedge_len_multiplier
- set_edge_lengths_from_node_ages(minimum_edge_length=0.0, error_on_negative_edge_lengths=False)[source]¶
Sets the edge lengths of the tree so that the path lengths from the tips equal the value of the
ageattribute of the nodes.- Parameters:
minimum_edge_length (numeric) – All edge lengths calculated to have a value less than this will be set to this.
error_on_negative_edge_lengths (bool) – If
True, an inferred edge length that is less than 0 will result in a ValueError.
- shuffle_taxa(include_internal_nodes=False, rng=None)[source]¶
Randomly re-assigns taxa associated with nodes. Note that in the case of not all nodes being associated with taxa, this will NOT assign taxa to nodes that currently do not have them, nor will nodes currently associated with taxa end up not being associated with taxa. Returns a dictionary mapping the old taxa to their new counterparts.
- suppress_unifurcations(update_bipartitions=False)[source]¶
Delete all nodes of outdegree-one from this tree.
- Parameters:
update_bipartitions (bool) – If
Truethen the bipartitions encoding will be calculated.
- symmetric_difference(other_tree)[source]¶
DEPRECATED: Use ‘dendropy.treecompare.symmetric_difference()’.
- taxon_namespace_scoped_copy(memo=None)[source]¶
Cloning level: 1. Taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxonobjects: these are preserved as references.
- to_outgroup_position(outgroup_node, update_bipartitions=False, suppress_unifurcations=True)[source]¶
Reroots the tree at the parent of
outgroup_nodeand makesoutgroup_nodethe first child of the new root. This is just a convenience function to make it easy to place a clade as the first child under the root. Assumes thatoutgroup_nodeandoutgroup_node._parent_nodeand are in the tree/ Ifupdate_bipartitionsis True, then the edges’bipartitionand the tree’sbipartition_encodingattributes will be updated. If the old root of the tree had an outdegree of 2, then after this operation, it will have an outdegree of one. In this case, unlesssuppress_unifurcationsis False, then it will be removed from the tree.
- unassign_taxa(exclude_leaves=False, exclude_internal=False)[source]¶
Strips taxon assignments from tree. If
exclude_leavesis True, then taxa on leaves will be retained. Ifexclude_internalis True, then taxa on internal nodes will be retained. Thetaxon_namespaceis not affected by this operation.
- update_taxon_namespace()[source]¶
All
Taxonobjects inselfthat are not inself.taxon_namespacewill be added.
- write(**kwargs)¶
Writes out
selfinschemaformat.Mandatory Destination-Specification Keyword Argument (Exactly One of the Following Required):
file (file) – File or file-like object opened for writing.
path (str) – Path to file to which to write.
Mandatory Schema-Specification Keyword Argument:
schema (str) – Identifier of format of data. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.
Optional Schema-Specific Keyword Arguments:
These provide control over how the data is formatted, and supported argument names and values depend on the schema as specified by the value passed as the “
schema” argument. See “DendroPy Schemas: Phylogenetic and Evolutionary Biology Data Formats” for more details.Examples
# Using a file path: d.write(path="path/to/file.dat", schema="nexus") # Using an open file: with open("path/to/file.dat", "w") as f: d.write(file=f, schema="nexus")
- write_to_path(dest, schema, **kwargs)¶
Writes to file specified by
dest.
- write_to_stream(dest, schema, **kwargs)¶
Writes to file-like object
dest.
- classmethod yield_from_files(files, schema, taxon_namespace=None, **kwargs)[source]¶
Iterates over trees from files, returning them one-by-one instead of instantiating all of them in memory at once.
For operations where it is sufficient to process each tree individually (e.g., performing a calculation or set of calculations on a tree and storing the result, after the which the entire tree itself is not needed), this approach is far more performant that reading in the trees using a
TreeList. This is because a full tree structure requires significant memory overhead, and as memory gets used up and the OS starts page faulting, performance starts taking some serious hits.- Parameters:
files (iterable of file paths or file-like objects.) – Iterable of sources, which can either be strings specifying file paths or file-like objects open for reading. If a source element is a string (
isinstance(i,str) == True), then it is assumed to be a path to a file. Otherwise, the source is assumed to be a file-like object.schema (string) – The name of the data format (e.g., “newick” or “nexus”).
taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to use to manage taxon definitions.**kwargs (keyword arguments) – These will be passed directly to the schema-parser implementation.
- Yields:
t (|Tree|) – Trees as read from the file.
Examples
taxon_namespace = dendropy.TaxonNamespace() f1 = open("path/to/trees1.nex", "r") f2 = open("path/to/trees2.nex", "r") tree_yielder = dendropy.Tree.yield_from_files( files=[f1, f2, "path/to/trees3.nex", "path/to/trees4.nex"], schema="nexus", taxon_namespace=taxon_namespace, store_tree_weights=True, preserve_underscores=True, rooting="default-unrooted", ignore_unrecognized_keyword_arguments=True, ) lengths = [] root_ages = [] for tree in tree_yielder: length = 0.0 for edge in tree: length += edge.length lengths.append(length) tree.calc_node_ages() root_ages.append(tree.seed_node.age)
The Node Class¶
- class dendropy.datamodel.treemodel.Node(**kwargs)[source]¶
-
- Keyword Arguments:
- add_child(node)[source]¶
Adds a child node to this node if it is not already a child.
Results in the
parent_nodeattribute ofnodeas well as thetail_nodeattribute ofnode.edgebeing assigned toself.- Parameters:
node (
Node) – The node to be added as a child of this node.- Returns:
|Node| – The node that was added.
- age_order_iter(include_leaves=True, filter_fn=None, descending=False)[source]¶
Deprecated: use
Node.ageorder_iterinstead.
- ageorder_iter(filter_fn=None, include_leaves=True, descending=False)[source]¶
Iterator over nodes of subtree rooted at this node in order of the age of the node (i.e., the time since the present).
Iterates over nodes in order of age (‘age’ is as given by the
ageattribute, which is usually the sum of edge lengths from tips to node, i.e., time since present). Ifinclude_leavesisTrue(default), leaves are included in the iteration; ifinclude_leavesisFalse, leaves will be skipped. IfdescendingisFalse(default), younger nodes will be returned before older ones; ifTrue, older nodes will be returned before younger ones.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(defauinclude_leaves (boolean, optional) – If
True(default), then leaf nodes are included in the iteration. IfFalse, then leaf nodes are skipped.lt), then all nodes visited will be yielded.descending (boolean, optional) – If
False(default), then younger nodes are visited before older ones. IfTrue, then older nodes are visited before younger ones.
- Returns:
collections.Iterator[Node] – Iterator over age-ordered sequence of nodes in subtree rooted at this node.
- ancestor_iter(filter_fn=None, inclusive=False)[source]¶
Iterator over all ancestors of this node.
Visits all nodes that are the ancestors of this node. If
inclusiveisTrue,selfis returned as the first item of the sequence; otherwiseselfis skipped. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen passed the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.inclusive (boolean, optional) – If
True, includes this node in the sequence. IfFalse, this is skipped.
- Returns:
collections.Iterator[Node] – Iterator over all predecessor/ancestor nodes of this node.
- apply(before_fn=None, after_fn=None, leaf_fn=None)[source]¶
Applies function
before_fnandafter_fnto all internal nodes andleaf_fnto all terminal nodes in subtree starting withself, with nodes visited in pre-order.Given a tree with preorder sequence of nodes of [a,b,i,e,j,k,c,g,l,m,f,n,h,o,p,]:
a / \ / \ / \ / \ / \ / \ / c b / \ / \ / \ / e / f / / \ / / \ / / \ g / h / / \ / \ / / \ i j k l m n o p
the following order of function calls results:
before_fn(a) before_fn(b) leaf_fn(i) before_fn(e) leaf_fn(j) leaf_fn(k) after_fn(e) after_fn(b) before_fn(c) before_fn(g) leaf_fn(l) leaf_fn(m) after_fn(g) before_fn(f) leaf_fn(n) before_fn(h) leaf_fn(o) leaf_fn(p) after_fn(h) after_fn(f) after_fn(c) after_fn(a)
- Parameters:
Notes
Adapted from work by Mark T. Holder (the
peyotlmodule of the Open Tree of Life Project):
- property bipartition¶
Returns the bipartition for the edge subtending this node.
- child_edge_iter(filter_fn=None)[source]¶
Iterator over all edges that are the (immediate) children of this edge.
- Parameters:
filter_fn (function object, optional) – A function object that takes a
Edgeobject as an argument and returnsTrueif theEdgeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all edges visited will be yielded.- Returns:
collections.Iterator[Edge] – An iterator yielding edges that have this edge as a parent.
- child_edges()[source]¶
Returns a shallow-copy list of all child edges of this node.
Note
Unless an actual
listis needed, iterating over the child edges usingNode.child_edge_iteris preferable to avoid the overhead of list construction.
- child_node_iter(filter_fn=None)[source]¶
Iterator over all nodes that are the (immediate) children of this node.
- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes that have this node as a parent.
- child_nodes()[source]¶
Returns a shallow-copy list of all child nodes of this node.
Note
Unless an actual
listis needed, iterating over the child nodes usingNode.child_node_iteris preferable to avoid the overhead of list construction.
- clone(depth=1)¶
Creates and returns a copy of
self.- Parameters:
depth (integer) –
The depth of the copy:
0: shallow-copy: All member objects are references, except for :attr:
annotation_setof top-level object and memberAnnotationobjects: these are full, independent instances (though any complex objects in thevaluefield ofAnnotationobjects are also just references).1: taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxoninstances: these are references.2: Exhaustive deep-copy: all objects are cloned.
- collapse_conflicting(bipartition)[source]¶
Collapses every edge in the subtree that conflicts with the given bipartition. This can include the edge subtending subtree_root.
- copy_annotations_from(other, attribute_object_mapper=None)¶
Copies annotations from
other, which must be ofAnnotabletype.Copies are deep-copies, in that the
Annotationobjects added to theannotation_setAnnotationSetcollection ofselfare independent copies of those in theannotate_setcollection ofother. However, dynamic bound-attribute annotations retain references to the original objects as given inother, which may or may not be desirable. This is handled by updated the objects to which attributes are bound via mappings found inattribute_object_mapper. In dynamic bound-attribute annotations, the_valueattribute of the annotations object (Annotation._value) is a tuple consisting of “(obj, attr_name)”, which instructs theAnnotationobject to return “getattr(obj, attr_name)” (via: “getattr(*self._value)”) when returning the value of the Annotation. “obj” is typically the object to which theAnnotationSetbelongs (i.e.,self). When a copy ofAnnotationis created, the object reference given in the first element of the_valuetuple of dynamic bound-attribute annotations are unchanged, unless the id of the object reference is fo- Parameters:
other (
Annotable) – Source of annotations to copy.attribute_object_mapper (dict) – Like the
memoof__deepcopy__, maps object id’s to objects. The purpose of this is to update the parent or owner objects of dynamic attribute annotations. If a dynamic attributeAnnotationgives objectxas the parent or owner of the attribute (that is, the first element of theAnnotation._valuetuple isother) andid(x)is found inattribute_object_mapper, then in the copy the owner of the attribute is changed toattribute_object_mapper[id(x)]. Ifattribute_object_mapperisNone(default), then the following mapping is automatically inserted:id(other): self. That is, any references tootherin anyAnnotationobject will be remapped toself. If really no reattribution mappings are desired, then an empty dictionary should be passed instead.
- deep_copy_annotations_from(other, memo=None)¶
Note that all references to
otherin any annotation value (and sub-annotation, and sub-sub-sub-annotation, etc.) will be replaced with references toself. This may not always make sense (i.e., a reference to a particular entity may be absolute regardless of context).
- description(depth=1, indent=0, itemize='', output=None, taxon_namespace=None)[source]¶
Returns description of object, up to level
depth.
- distance_from_root()[source]¶
Weighted path length of
selffrom root.- Returns:
numeric – Total weight of all edges connecting
selfwith the root of the tree.
- distance_from_tip()[source]¶
Maximum weighted length of path of
selfto tip.If tree is not ultrametric (i.e., descendent edges have different lengths), then count the maximum of edge lengths. Note that
Tree.calc_node_agesis a more efficient way of doing this over the whole tree if this value is need for many or all the nodes on the tree.- Returns:
numeric – Maximum weight of edges connecting
selfto tip.
- property edge¶
Returns the edge subtending this node.
- classmethod edge_factory(**kwargs)[source]¶
Creates and returns a
Edgeobject.Derived classes can override this method to provide support for specialized or different types of edges on the tree.
- property edge_length¶
Returns the length of the edge subtending this node.
- extract_subtree(extraction_source_reference_attr_name='extraction_source', node_filter_fn=None, suppress_unifurcations=True, is_apply_filter_to_leaf_nodes=True, is_apply_filter_to_internal_nodes=False, node_factory=None)[source]¶
Returns a clone of the structure descending from this node.
- Parameters:
extraction_source_reference_attr_name (str) – Name of attribute to set on cloned nodes that references corresponding original node. If
None, then attribute (and reference) will not be created.node_filter_fn (None or function object) – If
None, then entire tree structure is cloned. If notNone, must be a function object that returnsTrueif a particularNodeinstance on the original tree should be included in the cloned tree, orFalseotherwise.is_apply_filter_to_leaf_nodes (bool) – If
Truethen the above filter will be applied to leaf nodes. IfFalsethen it will not (and all leaf nodes will be automatically included, unless excluded by an ancestral node being filtered out).is_apply_filter_to_internal_nodes (bool) – If
Truethen the above filter will be applied to internal nodes. IfFalsethen it will not (internal nodes without children will still be filtered out).node_factory (function) – If not
None, must be a function that takes no arguments and returns a newNode(or equivalent) instance.
- Returns:
nd (|Node|) – A node with descending subtree mirroring this one.
- get_incident_edges()[source]¶
Legacy synonym for
Node.incident_edges.
- inorder_iter(filter_fn=None)[source]¶
In-order iteration over nodes of subtree rooted at this node.
Visits self and all descendant nodes, with each node visited in-between its children. Only valid for strictly-bifurcating trees. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes of the subtree rooted at this node in infix or in-order sequence.
- insert_child(index, node)[source]¶
Adds a child node to this node.
If the node is already a child of this node, then it is moved to the specified position. Results in the
parent_nodeattribute ofnodeas well as thetail_nodeattribute ofnode.edgebeing assigned toself.- Parameters:
index (integer) – The index before which to insert the new node.
node (
Node) – The node to be added as a child of this node.
- Returns:
|Node| – The node that was added.
- insert_new_child(index, **kwargs)[source]¶
Create and add a new child to this node at a particular position.
Results in the
parent_nodeattribute ofnodeas well as thetail_nodeattribute ofnode.edgebeing assigned toself.- Parameters:
index (integer) – The index before which to insert the new node.
kwargs (keyword arguments, optional) – Keyword arguments will be passed directly to the
Nodeconstructor (Node.__init()__).
- Returns:
|Node| – The new child node that was created and added.
- is_internal()[source]¶
Returns
Trueif the node is not a tip or a leaf node.- Returns:
boolean –
Trueif the node is not a leaf.Falseotherwise.
- is_leaf()[source]¶
Returns
Trueif the node is a tip or a leaf node, i.e. has no child nodes.- Returns:
boolean –
Trueif the node is a leaf, i.e., has no child nodes.Falseotherwise.
- leaf_iter(filter_fn=None)[source]¶
Iterate over all tips or leaves that ultimately descend from this node.
Visits all leaf or tip nodes descended from this node. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding leaf nodes of the subtree rooted at this node.
- leaf_nodes()[source]¶
Returns list of all leaf_nodes descended from this node (or just list with
selfas the only member ifselfis a leaf).Note
Usage of
leaf_iter()is preferable for efficiency reasons unless actual list is required.
- level()[source]¶
Returns the number of nodes between
selfand the seed node of the tree.- Returns:
integer – The number of nodes between
selfand the seed node of the tree, or 0 ifselfhas no parent.
- level_order_iter(filter_fn=None)[source]¶
DEPRECATED: Use
Node.levelorder_iterinstead.
- levelorder_iter(filter_fn=None)[source]¶
Level-order iteration over nodes of subtree rooted at this node.
Visits self and all descendant nodes, with each node and other nodes at the same level (distance from root) visited before their children. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are visited.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes of the subtree rooted at this node in level-order sequence.
- new_child(**kwargs)[source]¶
Create and add a new child to this node.
- Parameters:
kwargs (keyword arguments) – Keyword arguments will be passed directly to the
Nodeconstructor (Node.__init()__).- Returns:
|Node| – The new child node that was created and added.
- num_child_nodes()[source]¶
Returns number of child nodes.
- Returns:
int – Number of children in
self.
- property parent_node¶
Returns the parent node of this node.
- postorder_internal_node_iter(filter_fn=None, exclude_seed_node=False)[source]¶
Pre-order iterator over internal nodes of subtree rooted at this node.
Visits self and all internal descendant nodes, with each node visited after its children. In DendroPy, “internal nodes” are nodes that have at least one child node, and thus the root or seed node is typically included unless
exclude_seed_nodeisTrue. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen passed the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.exclude_seed_node (boolean, optional) – If
False(default), then the seed node or root is visited. IfTrue, then the seed node is skipped.
- Returns:
collections.Iterator[Node] – An iterator yielding the internal nodes of the subtree rooted at this node in post-order sequence.
- postorder_iter(filter_fn=None)[source]¶
Post-order iterator over nodes of subtree rooted at this node.
Visits self and all descendant nodes, with each node visited after its children. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding the nodes of the subtree rooted at this node in post-order sequence.
- preorder_internal_node_iter(filter_fn=None, exclude_seed_node=False)[source]¶
Pre-order iterator over internal nodes of subtree rooted at this node.
Visits self and all internal descendant nodes, with each node visited before its children. In DendroPy, “internal nodes” are nodes that have at least one child node, and thus the root or seed node is typically included unless
exclude_seed_nodeisTrue. Nodes can optionally be filtered byfilter_fn: only nodes for whichfilter_fnreturnsTruewhen passed the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.exclude_seed_node (boolean, optional) – If
False(default), then the seed node or root is visited. IfTrue, then the seed node is skipped.
- Returns:
collections.Iterator[Node] – An iterator yielding the internal nodes of the subtree rooted at this node in pre-order sequence.
- preorder_iter(filter_fn=None)[source]¶
Pre-order iterator over nodes of subtree rooted at this node.
Visits self and all descendant nodes, with each node visited before its children. Nodes can optionally be filtered by
filter_fn: only nodes for whichfilter_fnreturnsTruewhen called with the node as an argument are yielded.- Parameters:
filter_fn (function object, optional) – A function object that takes a
Nodeobject as an argument and returnsTrueif theNodeobject is to be yielded by the iterator, orFalseif not. Iffilter_fnisNone(default), then all nodes visited will be yielded.- Returns:
collections.Iterator[Node] – An iterator yielding nodes of the subtree rooted at this node in pre-order sequence.
- reinsert_nodes(nd_connection_list)[source]¶
This function should be used to “undo” the effects of Node.reversible_remove_child NOTE: the behavior is only guaranteed if the tree has not been modified between the remove_child and reinsert_nodes calls! (or the tree has been restored such that the node/edge identities are identical to the state before the remove_child call.
The order of info in each tuple is:
0 - node removed 1 - parent of node removed 2 - pos in parent matrix 3 - children of node removed that were “stolen” 4 - edge that was lengthened by “stealing” length from node’s edge
- remove_child(node, suppress_unifurcations=False)[source]¶
Removes a node from the child set of this node.
Results in the parent of the node being removed set to
None. Ifsuppress_unifurcationsisTrue, if this node ends up having only one child after removal of the specified node, then this node will be removed from the tree, with its single child added to the child node set of its parent and the edge length adjusted accordingly.suppress_unifurcationsshould only beTruefor unrooted trees.- Parameters:
node (
Node) – The node to be removed.suppress_unifurcations (boolean, optional) – If
False(default), no action is taken. IfTrue, then if the node removal results in a node with degree of two (i.e., a single parent and a single child), then it will be removed from the tree and its (sole) child will be added as a child of its parent (with edge lengths adjusted accordingly).
- Returns:
|Node| – The node removed.
- reversible_remove_child(node, suppress_unifurcations=False)[source]¶
This function is a (less-efficient) version of remove_child that also returns the data needed by reinsert_nodes to “undo” the removal.
Returns a list of tuples. The first element of each tuple is the node removed, the other elements are the information needed by
reinsert_nodesin order to restore the tree to the same topology as it was before the call toremove_child.Ifsuppress_unifurcationsis False then the returned list will contain only one item.suppress_unifurcationsshould only be called on unrooted trees.
- set_child_nodes(child_nodes)[source]¶
Assigns the set of child nodes for this node.
Results in the
parent_nodeattribute of eachNodeinnodesas well as thetail_nodeattribute of correspondingEdgeobjects being assigned toself.- Parameters:
child_nodes (collections.Iterable[
Node]) – The (iterable) collection of child nodes to be assigned this node as a parent.
- set_children(child_nodes)[source]¶
Deprecated: use
Node.set_child_nodesinstead.
- sister_nodes()[source]¶
Legacy synonym for
Node.sister_nodes
- taxon_namespace_scoped_copy(memo=None)[source]¶
Cloning level: 1. Taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxonobjects: these are preserved as references.
The Edge Class¶
- class dendropy.datamodel.treemodel.Edge(**kwargs)[source]¶
An :term:
edgeon a :term:tree.- Keyword Arguments:
head_node (
Node, optional) – Node from to which this edge links, i.e., the child node of this nodetail_node.length (numerical, optional) – A value representing the weight of the edge.
rootedge (boolean, optional) – Is the child node of this edge the root or seed node of the tree?
label (string, optional) – Label for this edge.
- property adjacent_edges¶
Returns a list of all edges that “share” a node with
self.
- clone(depth=1)¶
Creates and returns a copy of
self.- Parameters:
depth (integer) –
The depth of the copy:
0: shallow-copy: All member objects are references, except for :attr:
annotation_setof top-level object and memberAnnotationobjects: these are full, independent instances (though any complex objects in thevaluefield ofAnnotationobjects are also just references).1: taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxoninstances: these are references.2: Exhaustive deep-copy: all objects are cloned.
- collapse(adjust_collapsed_head_children_edge_lengths=False)[source]¶
Inserts all children of the head_node of self as children of the tail_node of self in the same place in the child_node list that head_node had occupied. The edge length and head_node will no longer be part of the tree unless
adjust_collapsed_head_children_edge_lengths. is True.
- copy_annotations_from(other, attribute_object_mapper=None)¶
Copies annotations from
other, which must be ofAnnotabletype.Copies are deep-copies, in that the
Annotationobjects added to theannotation_setAnnotationSetcollection ofselfare independent copies of those in theannotate_setcollection ofother. However, dynamic bound-attribute annotations retain references to the original objects as given inother, which may or may not be desirable. This is handled by updated the objects to which attributes are bound via mappings found inattribute_object_mapper. In dynamic bound-attribute annotations, the_valueattribute of the annotations object (Annotation._value) is a tuple consisting of “(obj, attr_name)”, which instructs theAnnotationobject to return “getattr(obj, attr_name)” (via: “getattr(*self._value)”) when returning the value of the Annotation. “obj” is typically the object to which theAnnotationSetbelongs (i.e.,self). When a copy ofAnnotationis created, the object reference given in the first element of the_valuetuple of dynamic bound-attribute annotations are unchanged, unless the id of the object reference is fo- Parameters:
other (
Annotable) – Source of annotations to copy.attribute_object_mapper (dict) – Like the
memoof__deepcopy__, maps object id’s to objects. The purpose of this is to update the parent or owner objects of dynamic attribute annotations. If a dynamic attributeAnnotationgives objectxas the parent or owner of the attribute (that is, the first element of theAnnotation._valuetuple isother) andid(x)is found inattribute_object_mapper, then in the copy the owner of the attribute is changed toattribute_object_mapper[id(x)]. Ifattribute_object_mapperisNone(default), then the following mapping is automatically inserted:id(other): self. That is, any references tootherin anyAnnotationobject will be remapped toself. If really no reattribution mappings are desired, then an empty dictionary should be passed instead.
- deep_copy_annotations_from(other, memo=None)¶
Note that all references to
otherin any annotation value (and sub-annotation, and sub-sub-sub-annotation, etc.) will be replaced with references toself. This may not always make sense (i.e., a reference to a particular entity may be absolute regardless of context).
- description(depth=1, indent=0, itemize='', output=None, taxon_namespace=None)[source]¶
Returns description of object, up to level
depth.
- taxon_namespace_scoped_copy(memo=None)[source]¶
Cloning level: 1. Taxon-namespace-scoped copy: All member objects are full independent instances, except for
TaxonNamespaceandTaxonobjects: these are preserved as references.
The Bipartition Class¶
- class dendropy.datamodel.treemodel.Bipartition(**kwargs)[source]¶
A bipartition on a tree.
A bipartition of a tree is a division or sorting of the leaves/tips of a tree into two mutually-exclusive and collectively-comprehensive subsets, obtained by bisecting the tree at a particular edge. There is thus a one-to-one correspondence with an edge of a tree and a bipartition. The term “split” is often also used to refer to the same concept, though this is typically applied to unrooted trees.
A bipartition is modeled using a bitmask. This is a a bit array representing the membership of taxa, with the least-significant bit corresponding to the first taxon, the next least-signficant bit corresponding to the second taxon, and so on, till the last taxon corresponding to the most-significant bit. Taxon membership in one of two arbitrary groups, ‘0’ or ‘1’, is indicated by its corresponding bit being unset or set, respectively.
To allow comparisons and correct identification of the same bipartition across different rotational and orientiational representations of unrooted trees, we normalize the bipartition such that the first taxon is always assigned to group ‘0’ for bipartition representations of unrooted trees.
The normalization of the bitmask loses information about the actual descendents of a particular edge. Thus in addition to the
Bipartition.bitmaskattribute, eachBipartitionobject also maintains aBipartition.leafset_bitmaskattribute which is unnormalized. This is a bit array representing the presence or absence of taxa in the subtree descending from the child node of the edge of which this bipartition is associated. The least-significant bit corresponds to the first taxon, the next least-signficant bit corresponds to the second taxon, and so on, with the last taxon corresponding to the most-significant bit. For rooted trees, the value ofBipartition.bitmaskandBipartition.leafset_bitmaskare identical. For unrooted trees, they may or may not be equal.In general, we use
Bipartition.bitmaskdata to establish the identity of a split or bipartition across different trees: for example, when computing the Robinson-Foulds distances between trees, or in assessing the support for different bipartitions given an MCMC or bootstrap sample of trees. Here the normalization of the bitmask in unrooted trees allows for the (arbitrarily-labeled) group ‘0’ to be consistent across different representations, rotations, and orientations of trees.On the other hand, we use
Bipartition.leafset_bitmaskdata to work with various ancestor-descendent relationships within the same tree: for example, to quickly assess if a taxon descends from a particular node in a given tree, or if a particular node is a common ancestor of two taxa in a given tree.The
Bipartitionobject might be used in keys in dictionaries and look-up tables implemented as sets to allow for, e.g., calculation of support in terms of the number times a particular bipartition is observed. TheBipartition.bitmaskis used as hash value for this purpose. As such, it is crucial that this value does not change once a particularBipartitionobject is stored in a dictionary or set. To this end, we impose the constraint thatBipartitionobjects are immutable unless theis_mutableattribute is explicitly set toTrueas a sort of waiver signed by the client code. Client code does this at its risk, with the warning that anything up to and including the implosion of the universe may occur if theBipartitionobject is a member of an set of dictionary at the time (or, at the very least, the modifiedBipartitionobject may not be accessible from dictionaries and sets in which it is stored, or may occlude otherBipartitionobjects in the container).Note
There are two possible ways of mapping taxa to bits in a bitarray or bitstring.
In the “Least-Signficiant-Bit” (LSB) scheme, the first taxon corresponds to the least-significant, or left-most bit. So, given four taxa, indexed from 1 to 4, taxon 1 would map to 0b0001, taxon 2 would map to 0b0010, taxon 3 would map to 0b0100, and taxon 4 would map to 0b1000.
In the “Most-Significant-Bit” (MSB) scheme, on the other hand, the first taxon corresponds to the most-significant, or right-most bit. So, given four taxa, indexed from 1 to 4, taxon 1 would map to 0b1000, taxon 2 would map to 0b0100, taxon 3 would map to 0b0010, and taxon 4 would map to 0b0001.
We selected the Least Significant Bit (LSB) approach because the MSB scheme requires the size of the taxon namespace to fixed before the index can be assigned to any taxa. For example, under the MSB scheme, if there are 4 taxa, the bitmask for taxon 1 is 0b1000 == 8, but if another taxon is added, then the bitmask for taxon 1 will become 0b10000 == 16. On the other hand, under the LSB scheme, the bitmask for taxon 1 will be 0b0001 == 1 if there are 4 taxa, and 0b00001 == 1 if there 5 taxa, and so on. This stability of taxon indexes even as the taxon namespace grows is a strongly desirable property, and thus the adoption of the LSB scheme.
Constraining the first taxon to be in group 0 (LSB-0) rather than group 1 (LSB-1) is motivated by the fact that, in the former, we would combine the bitmasks of child nodes using OR (logical addition) operations when calculating the bitmask for a parent node, whereas, with the latter, we would need to use AND operations. The former strikes us as more intuitive.
- Keyword Arguments:
bitmask (integer) – A bit array representing the membership of taxa, with the least-significant bit corresponding to the first taxon, the next least-significant bit corresponding to the second taxon, and so on, till the last taxon corresponding to the most-significant bit. Taxon membership in one of two arbitrary groups, ‘0’ or ‘1’, is indicated by its corresponding bit being unset or set, respectively.
leafset_bitmask (integer) – A bit array representing the presence or absence of taxa in the subtree descending from the child node of the edge of which this bipartition is associated. The least-significant bit corresponds to the first taxon, the next least-significant bit corresponds to the second taxon, and so on, with the last taxon corresponding to the most-significant bit.
tree_leafset_bitmask (integer) – The
leafset_bitmaskof the root edge of the tree with which this bipartition is associated. In, general, this will be $0b1111…n$, where $n$ is the number of taxa, except in cases of trees with incomplete leaf-sets, where the positions corresponding to the missing taxa will have the bits unset.is_rooted (bool) – Specifies whether or not the tree with which this bipartition is associated is rooted.
is_mutable (bool) – Specifies whether or not the tree is mutable.
- compile_bipartition(is_mutable=None)[source]¶
Updates the values of the various masks specified and calculates the normalized bipartition bitmask.
If a rooted bipartition, then this is set to the value of the leafset bitmask. If an unrooted bipartition, then the leafset bitmask is normalized such that the lowest-significant bit (i.e., the group to which the first taxon belongs) is set to ‘0’.
Also makes this bipartition immutable (unless
is_mutableisFalse), which facilitates it being used in dictionaries and sets.- Note that this requires full population of the following fields:
self._leafset_bitmask
self._tree_leafset_bitmask
- compile_split_bitmask(leafset_bitmask=None, tree_leafset_bitmask=None, is_rooted=None, is_mutable=True)[source]¶
Updates the values of the various masks specified and calculates the normalized bipartition bitmask.
If a rooted bipartition, then this is set to the value of the leafset bitmask. If an unrooted bipartition, then the leafset bitmask is normalized such that the lowest-significant bit (i.e., the group to which the first taxon belongs) is set to ‘0’.
Also makes this bipartition immutable (unless
is_mutableisFalse), which facilitates it being used in dictionaries and sets.- Parameters:
leafset_bitmask (integer) – A bit array representing the presence or absence of taxa in the subtree descending from the child node of the edge of which this bipartition is associated. The least-significant bit corresponds to the first taxon, the next least-signficant bit corresponds to the second taxon, and so on, with the last taxon corresponding to the most-significant bit. If not specified or
None, the current value ofself.leafset_bitmaskis used.tree_leafset_bitmask (integer) – The
leafset_bitmaskof the root edge of the tree with which this bipartition is associated. In, general, this will be $0b1111…n$, where $n$ is the number of taxa, except in cases of trees with incomplete leaf-sets, where the positions corresponding to the missing taxa will have the bits unset. If not specified orNone, the current value ofself.tree_leafset_bitmaskis used.is_rooted (bool) – Specifies whether or not the tree with which this bipartition is associated is rooted. If not specified or
None, the current value ofself.is_rootedis used.
- Returns:
integer – The bipartition bitmask.
- compile_tree_leafset_bitmask(tree_leafset_bitmask, lowest_relevant_bit=None)[source]¶
Avoids recalculation of
lowest_relevant_bitif specified.
- static is_compatible_bitmasks(m1, m2, fill_bitmask)[source]¶
Returns
Trueifm1is compatible withm2
- is_compatible_with(other)[source]¶
Returns
Trueifotheris compatible with self.- Parameters:
other (
Bipartition) – The bipartition to check for compatibility.- Returns:
bool –
Trueifotheris compatible withself;Falseotherwise.
- is_incompatible_with(other)[source]¶
Returns
Trueifotherconflicts with self.- Parameters:
other (
Bipartition) – The bipartition to check for conflicts.- Returns:
bool –
Trueifotherconflicts withself;Falseotherwise.
- is_leafset_nested_within(other)[source]¶
Returns
Trueif the leafset ofselfis a subset of the leafset ofother.- Parameters:
other (
Bipartition) – The bipartition to check for compatibility.- Returns:
bool –
Trueif the leafset ofselfis contained inother.
- is_nested_within(other, is_other_masked_for_tree_leafset=False)[source]¶
Returns
Trueif the current bipartition is contained within other.- Parameters:
other (
Bipartition) – The bipartition to check.- Returns:
bool –
Trueif the the bipartition is “contained” withinother
- is_trivial()[source]¶
- Returns:
bool –
Trueif this bipartition divides a leaf and the rest of the tree.
- static is_trivial_bitmask(bitmask, fill_bitmask)[source]¶
Returns True if the bitmask occurs in any tree of the taxa
mask– if there is only fewer than two 1’s or fewer than two 0’s inbitmask(among all of the that are 1 in mask).
- leafset_as_bitstring(symbol0='0', symbol1='1', reverse=False)[source]¶
Composes and returns and representation of the bipartition leafset as a bitstring.
- Parameters:
- Returns:
str – The bitstring representing the bipartition.
Example
To represent a bipartition in the same scheme used by, e.g. PAUP* or Mr. Bayes:
print(bipartition.leafset_as_bitstring('.', '*', reverse=True))
- leafset_as_newick_string(taxon_namespace, preserve_spaces=False, quote_underscores=True)[source]¶
Represents this bipartition leafset as a newick string.
- Parameters:
taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to reference.preserve_spaces (boolean, optional) – If
False(default), then spaces in taxon labels will be replaced by underscores. IfTrue, then taxon labels with spaces will be wrapped in quotes.quote_underscores (boolean, optional) – If
True(default), then taxon labels with underscores will be wrapped in quotes. IfFalse, then the labels will not be wrapped in quotes.
- Returns:
string – NEWICK representation of split specified by
bitmask.
- leafset_taxa(taxon_namespace, index=0)[source]¶
Returns list of
Taxonobjects in the leafset of this bipartition.- Parameters:
taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to reference.index (integer, optional) – Start from this
Taxonobject instead of the firstTaxonobject in the collection.
- Returns:
list[Taxon] – List ofTaxonobjects specified or spanned bybitmask.
- normalize(bitmask, convention='lsb0')[source]¶
Return
bitmaskensuring that the bit corresponding to the first taxon is 1.
- split_as_bitstring(symbol0='0', symbol1='1', reverse=False)[source]¶
Composes and returns and representation of the bipartition as a bitstring.
- Parameters:
- Returns:
str – The bitstring representing the bipartition.
Example
To represent a bipartition in the same scheme used by, e.g. PAUP* or Mr. Bayes:
print(bipartition.split_as_bitstring('.', '*', reverse=True))
- split_as_newick_string(taxon_namespace, preserve_spaces=False, quote_underscores=True)[source]¶
Represents this bipartition split as a newick string.
- Parameters:
taxon_namespace (
TaxonNamespaceinstance) – The operational taxonomic unit concept namespace to reference.preserve_spaces (boolean, optional) – If
False(default), then spaces in taxon labels will be replaced by underscores. IfTrue, then taxon labels with spaces will be wrapped in quotes.quote_underscores (boolean, optional) – If
True(default), then taxon labels with underscores will be wrapped in quotes. IfFalse, then the labels will not be wrapped in quotes.
- Returns:
string – NEWICK representation of split specified by
bitmask.


