Пример #1
0
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
Пример #2
0
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