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
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)
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()
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
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
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
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()
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()
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()
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()
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
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)
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)
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)
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)
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
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)
#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)
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
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
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)]
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)
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)
def parse(self, newick=newick): assert self.newick self.root = newick.parse( self.newick, ttable=self.ttable, treename=self.name ) return self.root
# 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):
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)
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
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
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)]
"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)
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):
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)