def __init__(self, newick=None, alignment=None, alg_format="fasta", \ sp_naming_function=_parse_species, format=0): self.nexml_tree = FloatTree() self.nexml_tree.set_anyAttributes_({'xsi:type': 'FloatTree'}) self.nexml_node = TreeNode() self.nexml_edge = TreeFloatEdge() self.nexml_node.id = "node_%s" % hash(self) self.nexml_edge.id = "edge_%s" % hash(self) self.nexml_project = None self._nexml_support = LiteralMeta(datatype="float", property="branch_support", content=1.0) self.nexml_edge.length = 0.0 self.nexml_edge.add_meta(self._nexml_support) # Initialize empty PhyloTree super(NexmlTree, self).__init__() self._children = Children() self._children.node = self if alignment: self.link_to_alignment(alignment, alg_format) if newick: read_newick(newick, root_node=self, format=format) self.set_species_naming_function(sp_naming_function)
def build(self, node): self.nexml_tree = FloatTree() tree = self.nexml_tree tree.build(node) # This detects the outgroup of the tree even if the root tag # is not set in any node rootid = set([e.source for e in tree.edge]) - set([e.target for e in tree.edge]) nodeid2node = {rootid.pop(): self} for xmledge in tree.edge: child = nodeid2node.setdefault(xmledge.target, self.__class__() ) parent = nodeid2node.setdefault(xmledge.source, self.__class__() ) child.name = xmledge.target parent.name = xmledge.source child.nexml_edge = xmledge if xmledge.length is not None: child.dist = float(xmledge.length) parent.add_child(child) for xmlnode in tree.node: # just a warning. I don't know if this can occur if xmlnode.id not in nodeid2node: print >>sys.stderr, "unused node", xmlnode.id continue ete_node = nodeid2node[xmlnode.id] ete_node.nexml_node = xmlnode if xmlnode.id is not None: ete_node.name = xmlnode.id