def printer_prune_taxa(): tlist = get_treelist() try: i = int(request.vars.i) t = tlist.trees[i] except: session.flash = "no tree '%s'" % i redirect("index") v = request.vars.nodeselect if v: nodes = [n for n in t.root.iternodes() if str(n.id) in v] ## for n in nodes: while nodes: n = nodes[0] if n.parent: p = n.parent p.children.remove(n) if p.parent and len(p.children) == 1: gp = p.parent c = p.children[0] if p.length: c.length += p.length c.parent = gp gp.children.insert(gp.children.index(p), c) gp.children.remove(p) nodes = [n for n in t.root.iternodes() if str(n.id) in v] t.newick = newick.tostring(t.root) + ";" t.count_nodes() redirect(URL(r=request, f="printer", vars=dict(i=i)))
def parse(self, s=None): if s: self.newick = s self.root = newick.parse(self.newick) scaled = True for i, n in enumerate(self.root.iternodes(phylo.POSTORDER)): n.number = i if (not n.istip) and (not n.label): n.label = "N%s" % n.number n.age = None if n.parent and (n.length is None): scaled = False self.newick = newick.tostring(self.root)+";" self.scaled = scaled
def printer_reroot(): tlist = get_treelist() try: i = int(request.vars.i) t = tlist.trees[i] except: session.flash = "no tree '%s'" % i redirect("index") v = request.vars.nodeselect if v: nodes = [n for n in t.root.iternodes() if str(n.id) in v] newroot = t.root.mrca([n.label for n in nodes]) if newroot: newroot = phylo.reroot(t.root, newroot) t.newick = newick.tostring(newroot) + ";" t.parse() redirect(URL(r=request, f="printer", vars=dict(i=i)))
def printer(): tlist = get_treelist() try: i = int(request.vars.i) except TypeError: redirect("index") try: t = tlist.trees[i] except IndexError: session.flash = "no tree '%s'" % i redirect("index") if request.vars.ladderize: t.root.order_subtrees_by_size(recurse=True, reverse=bool(request.vars.rev)) t.newick = newick.tostring(t.root) + ";" fname = "tred-" + response.session_id opts = t.printopts v = request.vars if v.parsevars: t.labelfilter = v.labelfilter or "" t.labeltype = v.labeltype or t.labeltype t.labelsort = v.labelsort or t.labelsort opts.title = v.title or opts.title or "%s-%s" % (t.source, t.name) opts.pagesize = v.pagesize or opts.pagesize or "letter" #print opts.pagesize opts.draw_phylogram = v.draw_phylogram and t.phylogram opts.baseheight = float(v.baseheight or 0) or opts.baseheight opts.unitwidth = float(v.unitwidth or 0) or opts.unitwidth opts.border = float(v.border or 0) or opts.border opts.vpad = float(v.vpad or 1.1) if v.draw_intlabels and "intlabel" not in opts.visible: opts.visible.append("intlabel") if (not v.draw_intlabels) and "intlabel" in opts.visible: opts.visible.remove("intlabel") node, mapping = drawtree.traverse(t.root, opts) thicken_branches(node) node.set_attr("vpad", opts.vpad, 1) d = drawtree.draw(node, opts) t.drawing = d buf = StringIO() npages, scalefact = drawtree.render_multipage(d, opts, buf) f = open("/tmp/%s.pdf" % fname, "w") f.write(buf.getvalue()) f.close() # use graphicsmagick convert (page numbers *.png.0, *.png.1, ...) commands.getoutput("rm /tmp/%s*.png*" % fname) cmd = "convert /tmp/%s.pdf /tmp/%s.png" % (fname, fname) exit, out = commands.getstatusoutput(cmd) # pngs = glob.glob("/tmp/%s*.png*" % fname) if npages > 1: pngs = ['%s.png.%s' % (fname, i) for i in range(npages)] else: pngs = ['%s.png' % fname] if scalefact < 1.0: response.flash = "To fit the page width, "\ "the drawing has been scaled by %0.2f" % scalefact return dict(tree=t, pngs=pngs)
def printer(): tlist = get_treelist() try: i = int(request.vars.i) except TypeError: redirect("index") try: t = tlist.trees[i] except IndexError: session.flash = "no tree '%s'" % i redirect("index") if request.vars.ladderize: t.root.order_subtrees_by_size(recurse=True, reverse=bool(request.vars.rev)) t.newick = newick.tostring(t.root) + ";" fname = "tred-" + response.session_id opts = t.printopts v = request.vars if v.parsevars: t.labelfilter = v.labelfilter or "" t.labeltype = v.labeltype or t.labeltype t.labelsort = v.labelsort or t.labelsort opts.title = v.title or opts.title or "%s-%s" % (t.source, t.name) opts.pagesize = v.pagesize or opts.pagesize or "letter" # print opts.pagesize opts.draw_phylogram = v.draw_phylogram and t.phylogram opts.baseheight = float(v.baseheight or 0) or opts.baseheight opts.unitwidth = float(v.unitwidth or 0) or opts.unitwidth opts.border = float(v.border or 0) or opts.border opts.vpad = float(v.vpad or 1.1) if v.draw_intlabels and "intlabel" not in opts.visible: opts.visible.append("intlabel") if (not v.draw_intlabels) and "intlabel" in opts.visible: opts.visible.remove("intlabel") node, mapping = drawtree.traverse(t.root, opts) thicken_branches(node) node.set_attr("vpad", opts.vpad, 1) d = drawtree.draw(node, opts) t.drawing = d buf = StringIO() npages, scalefact = drawtree.render_multipage(d, opts, buf) f = open("/tmp/%s.pdf" % fname, "w") f.write(buf.getvalue()) f.close() # use graphicsmagick convert (page numbers *.png.0, *.png.1, ...) commands.getoutput("rm /tmp/%s*.png*" % fname) cmd = "convert /tmp/%s.pdf /tmp/%s.png" % (fname, fname) exit, out = commands.getstatusoutput(cmd) # pngs = glob.glob("/tmp/%s*.png*" % fname) if npages > 1: pngs = ["%s.png.%s" % (fname, i) for i in range(npages)] else: pngs = ["%s.png" % fname] if scalefact < 1.0: response.flash = "To fit the page width, " "the drawing has been scaled by %0.2f" % scalefact return dict(tree=t, pngs=pngs)