Example #1
0
def test():
    import newick, ascii
    n = newick.parse("(((a:1,b:2):3,(c:3,d:1):1,(e:0.5,f:3):2.5):1,g:4);")
    v = ltt(n)
    print ascii.render(n, scaled=1)
    for t, n in v:
        print t, n
Example #2
0
File: ltt.py Project: wennading/ivy
def test():
    import newick, ascii
    n = newick.parse("(((a:1,b:2):3,(c:3,d:1):1,(e:0.5,f:3):2.5):1,g:4);")
    v = ltt(n)
    print(ascii.render(n, scaled=1))
    for t, n in v:
        print(t, n)
Example #3
0
 def default_from_tree(self, i, nareas):
     t = newick.parse(self.model.treelist.trees[i].newick)
     self.taxa = [n.label for n in t.leaves()]
     self.labels = string.uppercase[:nareas]
     self.nlabels = len(self.labels)
     self.data = dict([(x, [False] * nareas) for x in self.taxa])
     self.data = dict([(x, []) for x in self.taxa])
     self.model.adjacencymatrix.default()
     self.model.dm.default()
Example #4
0
    def __init__(self, newickstr, periods=None, root_age=None):
        """
        newickstr: newick tree with branch lengths
        periods: list of durations ordered from present to past
        root_age: age of root node for branch length scaling
        """
        self.root = newick.parse(newickstr)
        phylo.polarize(self.root)
        self.periods = periods

        # initialize nodes (label interiors, etc)
        # and collect leaves and postorder sequence
        self.postorder_nodes = []
        self.leaves = []
        for i, node in enumerate(self.root.descendants(phylo.POSTORDER)):
            node.tree = self
            node.number = i
            node.segments = []
            if (not node.istip) and (not node.label):
                node.label = str(node.number)
            node.age = None
            if node.istip:
                #node.age = 0.0
                self.leaves.append(node)
            self.postorder_nodes.append(node)

        self.root_age = root_age
        if root_age:
            self.calibrate(root_age)

        self.label2node = dict([(n.label, n) for n in self.postorder_nodes ])

        self.assign_node_ages()
##         for node in self.postorder_nodes:
##             if node.parent and (node.parent.age is None):
##                 node.parent.age = node.age + node.length

        # initialize branch segments
        for node in self.postorder_nodes:
            if node.parent:
                periods = self.periods
                anc = node.parent.age
                des = node.age
                assert anc > des, "%s = %g, %s = %g\n%s" \
                       % (node.parent.label, anc, node.label, des,
                          self.root.render_ascii(scaled=1, minwidth=80))
                t = des
                for i, p in enumerate(periods):
                    s = sum(periods[:i+1])
                    if t < s:
                        duration = min((s - t, anc - t))
                        if duration > 0:
                            seg = BranchSegment(duration, i)
                            node.segments.append(seg)
                        t += p
                    if t > anc:
                        break
Example #5
0
 def errors(self):
     try:
         s = self.trees[0].newick
     except:
         return "no tree specified"
     n = newick.parse(s)
     leaves = [lf.label for lf in n.leaves()]
     for x in self.model.datamatrix.data.keys():
         if x not in leaves:
             return "%s not found among tree tips" % x
Example #6
0
 def errors(self):
     try:
         s = self.trees[0].newick
     except:
         return "no tree specified"
     n = newick.parse(s)
     leaves = [ lf.label for lf in n.leaves() ]
     for x in self.model.datamatrix.data.keys():
         if x not in leaves:
             return "%s not found among tree tips" % x
Example #7
0
 def default_from_tree(self, i, nareas):
     t = newick.parse(self.model.treelist.trees[i].newick)
     self.taxa = [ n.label for n in t.leaves() ]
     self.labels = string.uppercase[:nareas]
     self.nlabels = len(self.labels)
     self.data = dict(
         [ (x, [False]*nareas) for x in self.taxa ]
         )
     self.data = dict([ (x, []) for x in self.taxa ])
     self.model.adjacencymatrix.default()
     self.model.dm.default()
Example #8
0
def test():
    import newick
    node = newick.parse("(a:3,(b:2,(c:4,d:5):1,(e:3,(f:1,g:1):2):2):2);")
    for i, n in enumerate(node.iternodes()):
        if not n.isleaf:
            n.label = "node%s" % i
    node.label = "root"
    n2c = calc_node_positions(node, radius=100, scaled=False)

    from matplotlib.patches import Arc, PathPatch
    from matplotlib.collections import PatchCollection, LineCollection
    import matplotlib.pyplot as P
    f = P.figure()
    a = f.add_subplot(111)
    arcs = []
    lines = []
    for n in node.iternodes():
        c = n2c[n]
        if n.parent and n.children:
            theta1 = n2c[n.children[0]].angle
            theta2 = n2c[n.children[-1]].angle
            arc = Arc((0, 0),
                      c.depth * 2,
                      c.depth * 2,
                      theta1=theta1,
                      theta2=theta2)
            arcs.append(arc)
        if n.parent:
            p = n2c[n.parent]
            px = math.cos(math.radians(c.angle)) * p.depth
            py = math.sin(math.radians(c.angle)) * p.depth
            lines.append(((c.x, c.y), (px, py)))

        if n.label:
            txt = a.annotate(n.label,
                             xy=(c.x, c.y),
                             xytext=(0, 0),
                             textcoords="offset points")

    arcs = PatchCollection(arcs, match_original=True)
    a.add_collection(arcs)
    lines = LineCollection(lines)
    a.add_collection(lines)
    a.set_xlim((-100, 100))
    a.set_ylim((-100, 100))
    f.show()
Example #9
0
def readmany(data, format="newick"):
    """Iterate over trees from a source."""
    if type(data) in types.StringTypes:
        if os.path.isfile(data):
            data = open(data)
        else:
            data = StringIO(data)

    if format == "newick":
        for line in data:
            yield newick.parse(line)
    elif format == "nexus":
        for rec in newick.nexus_iter(data):
            yield rec.parse()
    else:
        raise Exception, "format '%s' not recognized" % format
    data.close()
Example #10
0
def test():
    import newick
    node = newick.parse("(a:3,(b:2,(c:4,d:5):1,(e:3,(f:1,g:1):2):2):2);")
    for i, n in enumerate(node.iternodes()):
        if not n.isleaf:
            n.label = "node%s" % i
    node.label = "root"
    n2c = calc_node_positions(node, radius=100, scaled=False)

    from matplotlib.patches import Arc, PathPatch
    from matplotlib.collections import PatchCollection, LineCollection
    import matplotlib.pyplot as P
    f = P.figure()
    a = f.add_subplot(111)
    arcs = []; lines = []
    for n in node.iternodes():
        c = n2c[n]
        if n.parent and n.children:
            theta1 = n2c[n.children[0]].angle
            theta2 = n2c[n.children[-1]].angle
            arc = Arc((0,0), c.depth*2, c.depth*2, theta1=theta1, theta2=theta2)
            arcs.append(arc)
        if n.parent:
            p = n2c[n.parent]
            px = math.cos(math.radians(c.angle))*p.depth
            py = math.sin(math.radians(c.angle))*p.depth
            lines.append(((c.x,c.y),(px, py)))

        if n.label:
            txt = a.annotate(
                n.label,
                xy=(c.x, c.y),
                xytext=(0, 0),
                textcoords="offset points"
                )


    arcs = PatchCollection(arcs, match_original=True)
    a.add_collection(arcs)
    lines = LineCollection(lines)
    a.add_collection(lines)
    a.set_xlim((-100,100))
    a.set_ylim((-100,100))
    f.show()
Example #11
0
def test_brownian():
    """
    Evolve a trait up an example tree of primates:.

    ((((H**o:0.21,Pongo:0.21)N1:0.28,Macaca:0.49)N2:0.13,
    Ateles:0.62)N3:0.38,Galago:1.00)root;

    Returns: (*root*, *data*) - the root node and evolved data.
    """
    import newick
    root = newick.parse(
        "((((H**o:0.21,Pongo:0.21)N1:0.28,Macaca:0.49)N2:0.13,"\
        "Ateles:0.62)N3:0.38,Galago:1.00)root;"
        )
    print(root.ascii(scaled=True))
    evolved = brownian(root)
    for node in root.iternodes():
        print(node.label, evolved[node])
    return root, evolved
Example #12
0
import newick, tree, cyexpokit
import numpy as np

s = '((((H**o:0.21,Pongo:0.21)A:0.28,Macaca:0.49)B:0.13,Ateles:0.62)C:0.38,Galago:1.00)root;'
r = newick.parse(s)
t = tree.Tree(r)
data = dict(zip(t.leaf_labels(), [1,0,0,0,0]))

qidx = np.array([[0,0,1,0],
                 [0,1,0,0]])

f = cyexpokit.make_mklnl_func(t, data, 2, 1, qidx)
Example #13
0
    v = []
    n = newroot
    while 1:
        v.append(n)
        if not n.parent: break
        n = n.parent
    #print [ x.label for x in v ]
    v.reverse()
    for i, cp in enumerate(v[:-1]):
        node = v[i+1]
        # node is current node; cp is current parent
        #print node.label, cp.label
        cp.remove_child(node)
        node.add_child(cp)
        cp.length = node.length
    return newroot


if __name__ == "__main__":
    import newick, ascii, os
    from numpy import array
    #tree = newick.parse("(a,(b,(c,(d,e))));")
    f = os.path.expanduser("~/Projects/pedic-sympatry/matrices/")
    tree = eval(file(f+"garli-ml.tree").read())
    treespp = tree["species"]
    root = newick.parse(tree["newick"])
    spp = ['alaschanica', 'cheilanthifolia', 'dichotoma', 'kansuensis',
           'oederi', 'plicata', 'przewalskii', 'remotiloba',
           'rhinanthoides', 'roylei', 'rupicola', 'scolopax']
    print root.subtree_mapping(spp, clean=1)
Example #14
0
            if node.label and show_internal_labels:
                label = node2label[node]
                buf.putstr(node.r, node.c - len(label), label)

        buf.putstr(node.r, node.c, "+")

    return str(buf)


render = tree2ascii

if __name__ == "__main__":
    import random
    rand = random.Random()

    t = newick.parse("(foo,((bar,(dog,cat)),(shoe,(fly,(cow, bowwow)))));")
    t = newick.parse("(((foo:4.6):5.6, (bar:6.5, baz:2.3):3.0):3.0);")
    data = {"foo": 1, "bar": 0, "baz": 1}
    #print t, t.next.back, t.next.next.back, t.next.next.next.back,
    ##     print t, t.next, t.next.next, t.next.next.next
    ##     print t.fnodes()
    #    sys.exit()
    i = 1
    for n in t.iternodes():
        #n.length = rand.random()
        if not n.istip:
            n.label = "n%s" % i
            i += 1

    print tree2ascii(t, scaled=1, show_internal_labels=0, data=data)
Example #15
0
    while 1:
        v.append(n)
        if not n.parent: break
        n = n.parent
    #print [ x.label for x in v ]
    v.reverse()
    for i, cp in enumerate(v[:-1]):
        node = v[i + 1]
        # node is current node; cp is current parent
        #print node.label, cp.label
        cp.remove_child(node)
        node.add_child(cp)
        cp.length = node.length
    return newroot


if __name__ == "__main__":
    import newick, ascii, os
    from numpy import array
    #tree = newick.parse("(a,(b,(c,(d,e))));")
    f = os.path.expanduser("~/Projects/pedic-sympatry/matrices/")
    tree = eval(file(f + "garli-ml.tree").read())
    treespp = tree["species"]
    root = newick.parse(tree["newick"])
    spp = [
        'alaschanica', 'cheilanthifolia', 'dichotoma', 'kansuensis', 'oederi',
        'plicata', 'przewalskii', 'remotiloba', 'rhinanthoides', 'roylei',
        'rupicola', 'scolopax'
    ]
    print root.subtree_mapping(spp, clean=1)
import newick, mcmc
r = newick.parse(open('/home/rree/src/ivy/examples/primates.newick').read())
mcmc.insert_knees(r)
Example #17
0
def read(data, format=None, treename=None, ttable=None):
    """
    Read a single tree from *data*, which can be a Newick string, a
    file name, or a file-like object with `tell` and 'read`
    methods. *treename* is an optional string that will be attached to
    all created nodes.

    Args:
        data: A file or file-like object or newick string

    Returns:
        Node: The root node.
    """
    import newick
    StringTypes = types.StringTypes

    def strip(s):
        fname = os.path.split(s)[-1]
        head, tail = os.path.splitext(fname)
        tail = tail.lower()
        if tail in (".nwk", ".tre", ".tree", ".newick", ".nex"):
            return head
        else:
            return fname

    if (not format):
        if (type(data) in StringTypes) and os.path.isfile(data):
            s = data.lower()
            for tail in ".nex", ".nexus", ".tre":
                if s.endswith(tail):
                    format="nexus"
                    break

    if (not format):
        format = "newick"

    if format == "newick":
        if type(data) in StringTypes:
            if os.path.isfile(data):
                treename = strip(data)
                return newick.parse(file(data), treename=treename,
                                    ttable=ttable)
            else:
                return newick.parse(data, ttable=ttable)

        elif (hasattr(data, "tell") and hasattr(data, "read")):
            treename = strip(getattr(data, "name", None))
            return newick.parse(data, treename=treename, ttable=ttable)
    elif format == "nexus-dendropy":
        import dendropy
        if type(data) in StringTypes:
            if os.path.isfile(data):
                treename = strip(data)
                return newick.parse(
                    str(dendropy.Tree.get_from_path(data, "nexus")),
                    treename=treename
                    )
            else:
                return newick.parse(
                    str(dendropy.Tree.get_from_string(data, "nexus"))
                    )

        elif (hasattr(data, "tell") and hasattr(data, "read")):
            treename = strip(getattr(data, "name", None))
            return newick.parse(
                str(dendropy.Tree.get_from_stream(data, "nexus")),
                treename=treename
                )
        else:
            pass

    elif format == "nexus":
        if type(data) in StringTypes:
            if os.path.isfile(data):
                with open(data) as infile:
                    rec = newick.nexus_iter(infile).next()
                    if rec: return rec.parse()
            else:
                rec = newick.nexus_iter(StringIO(data)).next()
                if rec: return rec.parse()
        else:
            rec = newick.nexus_iter(data).next()
            if rec: return rec.parse()
    else:
        # implement other tree formats here (nexus, nexml etc.)
        raise IOError, "format '%s' not implemented yet" % format

    raise IOError, "unable to read tree from '%s'" % data
Example #18
0
    import tempfile, commands, os, sys
    fname = tempfile.mktemp(suffix=".svg")
    svg = fig.SVG()
    vb = "%s %s %s %s" % (0, 0, w, h)
    svgfig.canvas(svg, width=w, height=h, viewBox=vb).save(fname)
    #svg.save(fname)
    width = float(commands.getoutput("inkscape -W '%s'" % fname))
    height = float(commands.getoutput("inkscape -H '%s'" % fname))
    os.remove(fname)
    return width, height


w = 400.0
h = 800.0

r = newick.parse(file("test.newick").read())
r.order_subtrees_by_size()
n2c = layout.calc_node_positions(r, w, h, scaled=True)

ntips = float(len(r.leaves()))
fontsize = h / ntips

## bbox = svgfig.Rect(1,1,w-1,h-1)
branches = []
labels = []
for n, c in n2c.items():
    if n.parent:
        pc = n2c[n.parent]
        d = ((c.x, c.y), (pc.x, c.y), (pc.x, pc.y))
        line = svgfig.Poly(d)
        branches.append(line)
Example #19
0
        #print n.label, c.x, c.y

    if not scaled:
        for i in range(10):
            smooth_xpos(node, n2coords, collapsed=collapsed)

    for coords in n2coords.values():
        coords.x += lpad
        coords.y += tpad

    for n, coords in n2coords.items():
        if n.parent:
            p = n2coords[n.parent]
            coords.px = p.x
            coords.py = p.y
        else:
            coords.px = None
            coords.py = None

    return n2coords


if __name__ == "__main__":
    import newick
    node = newick.parse("(a:3,(b:2,(c:4,d:5):1,(e:3,(f:1,g:1):2):2):2);")
    for i, n in enumerate(node.iternodes()):
        if not n.istip:
            n.label = "node%s" % i
    node.label = "root"
    calc_node_positions(node, width=10, height=10, scaled=True)
Example #20
0
    leaf_indices = list(RandomArray.permutation(len(leaves)))

    joined = [leaves[leaf_indices.pop()]]
    remaining = leaf_indices
    while remaining:
        i = RandomArray.randint(0, len(joined)-1)
        c1 = joined[i]
        if c1.back:
            n = c1.bisect()
        else:
            n = InternalNode()
            n.add_child(c1)
        c = leaves[remaining.pop()]
        n.add_child(c)
        joined.append(c)
        joined.append(n)

    for node in joined:
        if not node.back:
            node.isroot = 1
            return node


if __name__ == "__main__":
    import newick
    tree = newick.parse("(a,(b,(c,(d,e))));")
    for i, n in enumerate(tree.descendants(order=PREORDER)):
        print i, n.label or n
    #print tree.draw_ascii
Example #21
0
def get_input_tree(infile, opts=None):
    pos = infile.tell()
    line = infile.readline()
    infile.seek(pos)
    if line.upper().startswith("#NEXUS"):
        newick_trees = get_trees_from_nexus(infile)

    else:
        if opts.dsdn:
            opts.S, opts.N = map(float, infile.readline().split())
        newick_trees = infile.read().split(";")

    tree = newick.parse(newick_trees[0])
##     reroot(tree, ["ptheirospermum_tenuisec_28207", "seymeria_pectinata"])

    node, mapping = traverse(tree)
    node.sort()

    if opts.dsdn:
        def func(n):
            try:
                n.dS = n.length
                n.length = None
            except AttributeError: pass
        node.foreach(func)
        
        dN_newick = newick_trees[1].strip()
        assert dN_newick

        dN = newick.parse(dN_newick)
        labelset2treenode = tree_compare.set_labels(tree)
        labelset2dNnode = tree_compare.set_labels(dN)

        for labelset, dNnode in labelset2dNnode.items():
            treenode = labelset2treenode.get(labelset)
            if treenode:
                try:
                    gnode = mapping[treenode]
                    gnode.dN = dNnode.length
##                     gnode.dsdn = "%0.1f/%0.1f" % (gnode.dS*opts.S,
##                                                   gnode.dN*opts.N)
                    try:
                        if gnode.dN > 0.0:
                            gnode.dsdn = "%f" % (gnode.dN/gnode.dS)
                        else:
                            gnode.dsdn = ""
                    except ZeroDivisionError:
                        gnode.dsdn = ""
                except KeyError:
                    pass
        return node

    try:
        support_newick = newick_trees[1].strip()
        if support_newick:
            support = newick.parse(support_newick)
            labelset2treenode = tree_compare.set_labels(tree)
            labelset2supportnode = tree_compare.set_labels(support)

            for labelset, supportnode in labelset2supportnode.items():
                treenode = labelset2treenode.get(labelset)
                if treenode:
                    try:
                        gnode = mapping[treenode]
                        gnode.support = supportnode.length
                    except KeyError:
                        pass
    except IndexError:
        pass
        
    # add parsing for other file formats here

    return node
Example #22
0
    def __init__(self, newickstr, periods=None, root_age=None):
        """
        newickstr: newick tree with branch lengths
        periods: list of durations ordered from present to past
        root_age: age of root node for branch length scaling
        """
        self.root = newick.parse(newickstr)
        self.newick = newickstr
        #phylo.polarize(self.root)
        self.periods = periods

        # initialize nodes (label interiors, etc)
        # and collect leaves and postorder sequence
        self.postorder_nodes = []
        self.leaves = []
        #for i, node in enumerate(self.root.descendants(phylo.POSTORDER)):
        polytomies = []
        for i, node in enumerate(self.root.iternodes(phylo.POSTORDER)):
            node.tree = self
            node.number = i
            node.segments = []
            if (not node.istip) and (not node.label):
                node.label = "N%s" % node.number
            node.age = None
            if node.istip:
                #node.age = 0.0
                self.leaves.append(node)
            else:
                #nc = len(node.children())
                nc = node.nchildren
                if nc > 2:
                    polytomies.append((nc, node.label))
                ## if nc > 2:
                ##     print ascii.tree2ascii(self.root)
                ## assert nc == 2, \
                ##        "%s-way polytomy at node %s" % (nc, node.label)
            self.postorder_nodes.append(node)
        if polytomies:
            msg = []
            msg.append(", ".join([ "%s-way polytomy at node %s" % (nc, label) \
                                   for nc, label in polytomies ]))
            ## msg.append("Tree is:")
            ## msg.append(ascii.tree2ascii(self.root))
            #print "\n".join(msg)
            raise Error, "\n".join(msg)

        self.root_age = root_age
        if root_age:
            self.calibrate(root_age)

        self.label2node = dict([(n.label, n) for n in self.postorder_nodes])

        for node in self.postorder_nodes:
            if node.parent:
                if not (node.length > 0):
                    print >> sys.stderr, \
                          "Warning: node %s: "\
                          "changing branch length of %s to %g" \
                          % (node.label, node.length, SHORT)
                    node.length = SHORT

        self.assign_node_ages()
        ##         for node in self.postorder_nodes:
        ##             if node.parent and (node.parent.age is None):
        ##                 node.parent.age = node.age + node.length

        # initialize branch segments
        for node in self.postorder_nodes:
            if node.parent:
                periods = self.periods
                anc = node.parent.age
                des = node.age
                assert anc > des, "%s = %g, %s = %g\n%s" \
                       % (node.parent.label, anc, node.label, des,
                          self.root.render_ascii(scaled=1, minwidth=80))
                t = des
                if periods:
                    for i, p in enumerate(periods):
                        s = sum(periods[:i + 1])
                        if t < s:
                            duration = min((s - t, anc - t))
                            if duration > 0:
                                seg = BranchSegment(duration, i)
                                node.segments.append(seg)
                            #t += p
                            t += duration
                        if t > anc:
                            break
                else:
                    node.segments = [BranchSegment(node.length, 0)]
Example #23
0
        else:
            if node.label and show_internal_labels:
                label = node2label[node]
                buf.putstr(node.r, node.c-len(label), label)

        buf.putstr(node.r, node.c, "+")
        
    return str(buf)

render = tree2ascii

if __name__ == "__main__":
    import random
    rand = random.Random()
    
    t = newick.parse("(foo,((bar,(dog,cat)),(shoe,(fly,(cow, bowwow)))));")
    t = newick.parse("(((foo:4.6):5.6, (bar:6.5, baz:2.3):3.0):3.0);")
    data = {"foo":1, "bar":0, "baz":1}
    #print t, t.next.back, t.next.next.back, t.next.next.next.back,
##     print t, t.next, t.next.next, t.next.next.next
##     print t.fnodes()
#    sys.exit()
    i = 1
    for n in t.iternodes():
        #n.length = rand.random()
        if not n.istip:
            n.label = "n%s" % i
            i += 1

    print tree2ascii(t, scaled=1, show_internal_labels=0, data=data)
Example #24
0
        else:
            if node.label and show_internal_labels:
                buf.putstr(node.r, node.c - len(node.label), node.label)

        buf.putstr(node.r, node.c, "+")

    return str(buf)


render = tree2ascii

if __name__ == "__main__":
    import random
    rand = random.Random()

    t = newick.parse(
        "(foo,((bar,(dog,cat)dc)dcb,(shoe,(fly,(cow, bowwow)cowb)cbf)X)Y)Z;")

    #t = newick.parse("(((foo:4.6):5.6, (bar:6.5, baz:2.3):3.0):3.0);")
    #t = newick.parse("(foo:4.6, (bar:6.5, baz:2.3)X:3.0)Y:3.0;")
    i = 1
    ##     for n in t.descendants():
    ##         #n.length = rand.random()
    ##         if not n.istip:
    ##             n.label = "n%s" % i
    ##             print n, n.label
    ##             i += 1
    print tree2ascii(t, scaled=0, show_internal_labels=1)
    r = t.find_descendant("cat").parent
    phylo.reroot(t, r)
    tp = t.parent
    tp.remove_child(t)
Example #25
0
 def parse(self, newick=newick):
     assert self.newick
     self.root = newick.parse(
         self.newick, ttable=self.ttable, treename=self.name
         )
     return self.root
Example #26
0
File: ages.py Project: rhr/ivy
            # make the new age the average of parent and max child
            new_node_age = (parent_age + max_child_age)/2.0
            results[node] = new_node_age
        else:
            results[node] = node_ages[node]
    else:
        results[node] = node_ages[node]
    for child in node.children:
        smooth(child, node_ages, results)
    return results

if __name__ == "__main__":
    import newick, ascii

    s = "((((a,b),(c,d),(e,f)),g),h);"
    root = newick.parse(s)

    leaf_ages = {
        "a": 3,
        "b": 2,
        "c": 4,
        "d": 1,
        "e": 3,
        "f": 0.5,
        "g": 10,
        "h": 5,
        }

    ma = min_ages(root, leaf_ages)
    d = ma
    for i in range(10):
Example #27
0
            c.x = c.length_to_root * scale

    for n in node.iternodes(phylo.POSTORDER):
        c = n2coords[n]
        if not n.istip:
            children = n.children
            ymax = n2coords[children[0]].y
            ymin = n2coords[children[-1]].y
            c.y = (ymax + ymin)/2.0
            if not scaled:
                c.x = min([ n2coords[ch].x for ch in children ]) - unitwidth
            else:
                c.x = c.length_to_root * scale

        #print n.label, c.x, c.y

    if not scaled:
        for i in range(10):
            smooth_xpos(node, n2coords)

    return n2coords

if __name__ == "__main__":
    import newick
    node = newick.parse("(a:3,(b:2,(c:4,d:5):1,(e:3,(f:1,g:1):2):2):2);")
    for i, n in enumerate(node.iternodes()):
        if not n.istip:
            n.label = "node%s" % i
    node.label = "root"
    calc_node_positions(node, width=10, height=10, scaled=True)
Example #28
0
import newick, cy_tree
import numpy as np

s = '((((H**o:0.21,Pongo:0.21)A:0.28,Macaca:0.49)B:0.13,Ateles:0.62)C:0.38,Galago:1.00)root;'
r = newick.parse(s)
t = cy_tree.Tree(r)
a = np.empty(t.nnodes, dtype=int)
cy_tree.cladesizes3(t, a)
print a
Example #29
0
def get_input_tree(infile, opts=None):
    pos = infile.tell()
    line = infile.readline()
    infile.seek(pos)
    if line.upper().startswith("#NEXUS"):
        newick_trees = get_trees_from_nexus(infile)

    else:
        if opts.dsdn:
            opts.S, opts.N = map(float, infile.readline().split())
        newick_trees = infile.read().split(";")

    tree = newick.parse(newick_trees[0])
    ##     reroot(tree, ["ptheirospermum_tenuisec_28207", "seymeria_pectinata"])

    node, mapping = traverse(tree)
    node.sort()

    if opts.dsdn:

        def func(n):
            try:
                n.dS = n.length
                n.length = None
            except AttributeError:
                pass

        node.foreach(func)

        dN_newick = newick_trees[1].strip()
        assert dN_newick

        dN = newick.parse(dN_newick)
        labelset2treenode = tree_compare.set_labels(tree)
        labelset2dNnode = tree_compare.set_labels(dN)

        for labelset, dNnode in labelset2dNnode.items():
            treenode = labelset2treenode.get(labelset)
            if treenode:
                try:
                    gnode = mapping[treenode]
                    gnode.dN = dNnode.length
                    ##                     gnode.dsdn = "%0.1f/%0.1f" % (gnode.dS*opts.S,
                    ##                                                   gnode.dN*opts.N)
                    try:
                        if gnode.dN > 0.0:
                            gnode.dsdn = "%f" % (gnode.dN / gnode.dS)
                        else:
                            gnode.dsdn = ""
                    except ZeroDivisionError:
                        gnode.dsdn = ""
                except KeyError:
                    pass
        return node

    try:
        support_newick = newick_trees[1].strip()
        if support_newick:
            support = newick.parse(support_newick)
            labelset2treenode = tree_compare.set_labels(tree)
            labelset2supportnode = tree_compare.set_labels(support)

            for labelset, supportnode in labelset2supportnode.items():
                treenode = labelset2treenode.get(labelset)
                if treenode:
                    try:
                        gnode = mapping[treenode]
                        gnode.support = supportnode.length
                    except KeyError:
                        pass
    except IndexError:
        pass

    # add parsing for other file formats here

    return node
Example #30
0
    def __init__(self, newickstr, periods=None, root_age=None):
        """
        newickstr: newick tree with branch lengths
        periods: list of durations ordered from present to past
        root_age: age of root node for branch length scaling
        """
        self.root = newick.parse(newickstr)
        self.newick = newickstr
        #phylo.polarize(self.root)
        self.periods = periods

        # initialize nodes (label interiors, etc)
        # and collect leaves and postorder sequence
        self.postorder_nodes = []
        self.leaves = []
        #for i, node in enumerate(self.root.descendants(phylo.POSTORDER)):
        polytomies = []
        for i, node in enumerate(self.root.iternodes(phylo.POSTORDER)):
            node.tree = self
            node.number = i
            node.segments = []
            if (not node.istip) and (not node.label):
                node.label = "N%s" % node.number
            node.age = None
            if node.istip:
                #node.age = 0.0
                self.leaves.append(node)
            else:
                #nc = len(node.children())
                nc = node.nchildren
                if nc > 2:
                    polytomies.append((nc, node.label))
                ## if nc > 2:
                ##     print ascii.tree2ascii(self.root)
                ## assert nc == 2, \
                ##        "%s-way polytomy at node %s" % (nc, node.label)
            self.postorder_nodes.append(node)
        if polytomies:
            msg = []
            msg.append(", ".join([ "%s-way polytomy at node %s" % (nc, label) \
                                   for nc, label in polytomies ]))
            ## msg.append("Tree is:")
            ## msg.append(ascii.tree2ascii(self.root))
            #print "\n".join(msg)
            raise Error("\n".join(msg))

        self.root_age = root_age
        if root_age:
            self.calibrate(root_age)

        self.label2node = dict([(n.label, n) for n in self.postorder_nodes ])

        for node in self.postorder_nodes:
            if node.parent:
                if not (node.length > 0):
                    print("Warning: node %s: "\
                          "changing branch length of %s to %g" \
                          % (node.label, node.length, SHORT), file=sys.stderr)
                    node.length = SHORT

        self.assign_node_ages()
##         for node in self.postorder_nodes:
##             if node.parent and (node.parent.age is None):
##                 node.parent.age = node.age + node.length

        # initialize branch segments
        for node in self.postorder_nodes:
            if node.parent:
                periods = self.periods
                anc = node.parent.age
                des = node.age
                assert anc > des, "%s = %g, %s = %g\n%s" \
                       % (node.parent.label, anc, node.label, des,
                          self.root.render_ascii(scaled=1, minwidth=80))
                t = des
                if periods:
                    for i, p in enumerate(periods):
                        s = sum(periods[:i+1])
                        if t < s:
                            duration = min((s - t, anc - t))
                            if duration > 0:
                                seg = BranchSegment(duration, i)
                                node.segments.append(seg)
                            #t += p
                            t += duration
                        if t > anc:
                            break
                else:
                    node.segments = [BranchSegment(node.length, 0)]
Example #31
0
    "use inkscape to calculate the width and height of fig"
    import tempfile, commands, os, sys
    fname = tempfile.mktemp(suffix=".svg")
    svg = fig.SVG()
    vb = "%s %s %s %s" % (0, 0, w, h)
    svgfig.canvas(svg, width=w, height=h, viewBox=vb).save(fname)
    #svg.save(fname)
    width = float(commands.getoutput("inkscape -W '%s'" % fname))
    height = float(commands.getoutput("inkscape -H '%s'" % fname))
    os.remove(fname)
    return width, height

w = 400.0
h = 800.0

r = newick.parse(file("test.newick").read())
r.order_subtrees_by_size()
n2c = layout.calc_node_positions(r, w, h, scaled=True)

ntips = float(len(r.leaves()))
fontsize = h/ntips

## bbox = svgfig.Rect(1,1,w-1,h-1)
branches = []
labels = []
for n, c in n2c.items():
    if n.parent:
        pc = n2c[n.parent]
        d = ((c.x, c.y), (pc.x, c.y), (pc.x, pc.y))
        line = svgfig.Poly(d)
        branches.append(line)
Example #32
0
            new_node_age = (parent_age + max_child_age) / 2.0
            results[node] = new_node_age
        else:
            results[node] = node_ages[node]
    else:
        results[node] = node_ages[node]
    for child in node.children:
        smooth(child, node_ages, results)
    return results


if __name__ == "__main__":
    import newick, ascii

    s = "((((a,b),(c,d),(e,f)),g),h);"
    root = newick.parse(s)

    leaf_ages = {
        "a": 3,
        "b": 2,
        "c": 4,
        "d": 1,
        "e": 3,
        "f": 0.5,
        "g": 10,
        "h": 5,
    }

    ma = min_ages(root, leaf_ages)
    d = ma
    for i in range(10):
Example #33
0
            buf.putstr(node.r, node.c+1, " "+node.label)
        else:
            if node.label and show_internal_labels:
                buf.putstr(node.r, node.c-len(node.label), node.label)

        buf.putstr(node.r, node.c, "+")
        
    return str(buf)

render = tree2ascii

if __name__ == "__main__":
    import random
    rand = random.Random()
    
    t = newick.parse("(foo,((bar,(dog,cat)dc)dcb,(shoe,(fly,(cow, bowwow)cowb)cbf)X)Y)Z;")
    
    #t = newick.parse("(((foo:4.6):5.6, (bar:6.5, baz:2.3):3.0):3.0);")
    #t = newick.parse("(foo:4.6, (bar:6.5, baz:2.3)X:3.0)Y:3.0;")
    i = 1
##     for n in t.descendants():
##         #n.length = rand.random()
##         if not n.istip:
##             n.label = "n%s" % i
##             print n, n.label
##             i += 1
    print tree2ascii(t, scaled=0, show_internal_labels=1)
    r = t.find_descendant("cat").parent
    phylo.reroot(t, r)
    tp = t.parent
    tp.remove_child(t)