def parse_trees(e, otus): "e is a nexml document parsed by etree" from ivy.tree import Node #from tree import Node v = [] for tb in e.findall(NEXML + "trees"): for te in tb.findall(NEXML + "tree"): t = Storage() t.attrib = Storage(te.attrib) t.nodes = {} for n in te.findall(NEXML + "node"): node = Node() if n.attrib.get("otu"): node.isleaf = True node.otu = otus[n.attrib["otu"]] node.label = node.otu.label t.nodes[n.attrib["id"]] = node for edge in te.findall(NEXML + "edge"): d = edge.attrib n = t.nodes[d["target"]] p = t.nodes[d["source"]] length = d.get("length") if length: n.length = float(length) p.add_child(n) r = [n for n in t.nodes.values() if not n.parent] assert len(r) == 1 r = r[0] r.isroot = True for i, n in enumerate(r): n.id = i + 1 t.root = r v.append(t) return v
def buildtree(t, otu_id2data): from ivy.tree import Node if t.has_key('nodeById'): # newer Nexson 1.2.1 node_id2data = t['nodeById'] else: # older Nexson 1.0.0 node_id2data = {} for n in t['node']: node_id2data[ n['@id'] ] = n root = None for i, d in node_id2data.iteritems(): n = Node() n.snode_id = i n.taxid = None if d.get('@root'): n.isroot = True root = n oid = d.get('@otu') if oid: n.isleaf = True try: n.otu = otu_id2data[oid] n.label = (n.otu.get('^ot:ottTaxonName') or n.otu.get('^ot:originalLabel')) n.taxid = n.otu.get('^ot:ottId') except KeyError: pass ## print t['nexson_file'], 'missing', oid n.nexson_id = i d['node'] = n if t.has_key('edgeBySourceId'): # newer Nexson 1.2.1 edges_by_source_id = t['edgeBySourceId'] else: # older Nexson 1.0.0 edges_by_source_id = {} for e in t['edge']: if not edges_by_source_id.has_key( e['@source'] ): edges_by_source_id[ e['@source'] ] = {} edges_by_source_id[ e['@source'] ][ e['@id'] ] = e for nid, ed in edges_by_source_id.iteritems(): n = node_id2data[nid] for e in ed.itervalues(): cd = node_id2data[e['@target']] c = cd['node'] c.length = e.get('@length') n['node'].add_child(c) root.tree_nexson = t root.stree = t['treeid'] root.ladderize() ivy.tree.index(root) return root