def __init__(self, tree, alg_type=None, ncbitaxa=True): self.tree = tree self.tree.dist = 0 self.svg = None self.layouts = None self.treestyle = TreeStyle() self.alg_type = alg_type ts = self.treestyle ts.draw_aligned_faces_as_table = False ts.draw_guiding_lines = False ts.show_leaf_name = False ts.show_branch_support = False ts.tree_width = 250 ts.layout_fn = [self.ly_basic, self.ly_leaf_names, self.ly_supports] self.ncbitaxa = ncbitaxa if ncbitaxa: ts.layout_fn.append(self.ly_tax_labels) if self.alg_type == 'condensed': ts.layout_fn.append(self.ly_condensed_alg) elif self.alg_type == 'block': ts.layout_fn.append(self.ly_block_alg) self.TRACKED_CLADES = set() if ncbitaxa: tree.set_species_naming_function(spname) annotate_tree_with_ncbi(tree) for lf in tree: for lname in getattr(lf, 'named_lineage', [])[2:9]: self.TRACKED_CLADES.add(lname.lower()) self.TRACKED_CLADES.update(map(lower, ["Eukaryota", "Viridiplantae", "Fungi", "birds", "Basidiomycota", "Ascomycota", "Alveolata", "Metazoa", "Stramenopiles", "Rhodophyta", "mammalia", "Primates", "Amoebozoa", "Crypthophyta", "Bacteria","Archaea", "Arthropoda", "rodentia", "laurastheria", "Alphaproteobacteria", "Betaproteobacteria", "Cyanobacteria", "Gammaproteobacteria",])) colors = random_color(num=len(self.TRACKED_CLADES), s=0.45) self.LIN2COLOR = dict([(ln, colors[i]) for i, ln in enumerate(sorted(self.TRACKED_CLADES))]) self.LIN2FACE = {} for tname in self.TRACKED_CLADES: linF = TextFace(tname, fsize=10, fgcolor='white', tight_text=False, ftype="Arial") linF.margin_left = 3 linF.margin_right = 2 linF.inner_background.color = self.LIN2COLOR[tname.lower()] self.LIN2FACE[tname.lower()] = linF self.LABEL_START_COL = 100 self.ALG_START_COL = len(self.TRACKED_CLADES)+11 #tree.ladderize() self.svg, self.img_map = tree.render("%%return", tree_style=ts)
def ly_tax_labels(node): if node.is_leaf(): c = LABEL_START_COL largest = 0 for tname in TRACKED_CLADES: if hasattr(node, "named_lineage") and tname in node.named_lineage: linF = TextFace(tname, fsize=10, fgcolor='white') linF.margin_left = 3 linF.margin_right = 2 linF.background.color = lin2color[tname] add_face_to_node(linF, node, c, position='aligned') c += 1 for n in xrange(c, len(TRACKED_CLADES)): add_face_to_node(TextFace('', fsize=10, fgcolor='slategrey'), node, c, position='aligned') c+=1
def ly(node): node.img_style['vt_line_width'] = 1 node.img_style['hz_line_width'] = 1 if node.is_leaf(): add_face_to_node(TextFace( ' (%s)' % node.name.split()[0].replace("/exon2", ""), fsize=10, fgcolor='slategrey', tight_text=False), node, 1, position='branch-right') add_face_to_node(TextFace(node.species, fsize=12, fgcolor='black', fstyle='italic', tight_text=False), node, 0, position='branch-right') c = 1 for tname in tracked_clades: if tname in node.named_lineage: linF = TextFace(tname, fsize=10, fgcolor='white') linF.margin_left = 3 linF.background.color = lin2color[tname] add_face_to_node(linF, node, c, position='aligned') c += 1 for n in xrange(1, 20 - (c - 1)): add_face_to_node(TextFace('', fsize=10, fgcolor='slategrey'), node, c, position='aligned') c += 1 if draw_alg and 'sequence' in node.features: #seqFace = SequenceFace(node.sequence,"aa",13) seqFace = SeqMotifFace(node.sequence, []) # [10, 100, "[]", None, 10, "black", "rgradient:blue", "arial|8|white|domain Name"], motifs = [] last_lt = None for c, lt in enumerate(node.sequence): if lt != '-': if last_lt is None: last_lt = c if c + 1 == len(node.sequence): start, end = last_lt, c w = end - start motifs.append([ start, end, "[]", w, 13, "slategrey", "slategrey", None ]) last_lt = None elif lt == '-': if last_lt is not None: start, end = last_lt, c - 1 w = end - start motifs.append([ start, end, "[]", w, 13, "slategrey", "slategrey", None ]) last_lt = None if not motifs: print node, node.sequence seqFace = SeqMotifFace(node.sequence, motifs, intermotif_format="line", seqtail_format="line", scale_factor=1) add_face_to_node(seqFace, node, 20, aligned=True) else: if node.up: add_face_to_node(TextFace('% 3g' % node.support, fsize=11, fgcolor='indianred'), node, 0, position='branch-top') if hasattr(node, "support2") and node.up: add_face_to_node(TextFace('% 3g' % float(node.support2), fsize=11, fgcolor='steelblue'), node, 0, position='branch-bottom') node.img_style['size'] = 0 node.img_style['hz_line_color'] = 'black' node.img_style['vt_line_color'] = 'black'
def ly(node): node.img_style['vt_line_width'] = 1 node.img_style['hz_line_width'] = 1 if node.is_leaf(): add_face_to_node(TextFace(' (%s)' %node.name.split()[0].replace("/exon2", ""), fsize=10, fgcolor='slategrey', tight_text=False), node, 1, position='branch-right') add_face_to_node(TextFace(node.species, fsize=12, fgcolor='black', fstyle='italic', tight_text=False), node, 0, position='branch-right') c = 1 for tname in tracked_clades: if tname in node.named_lineage: linF = TextFace(tname, fsize=10, fgcolor='white') linF.margin_left = 3 linF.background.color = lin2color[tname] add_face_to_node(linF, node, c, position='aligned') c += 1 for n in xrange(1, 20-(c-1)): add_face_to_node(TextFace('', fsize=10, fgcolor='slategrey'), node, c, position='aligned') c+=1 if draw_alg and 'sequence' in node.features: #seqFace = SequenceFace(node.sequence,"aa",13) seqFace = SeqMotifFace(node.sequence, []) # [10, 100, "[]", None, 10, "black", "rgradient:blue", "arial|8|white|domain Name"], motifs = [] last_lt = None for c, lt in enumerate(node.sequence): if lt != '-': if last_lt is None: last_lt = c if c+1 == len(node.sequence): start, end = last_lt, c w = end-start motifs.append([start, end, "[]", w, 13, "slategrey", "slategrey", None]) last_lt = None elif lt == '-': if last_lt is not None: start, end = last_lt, c-1 w = end-start motifs.append([start, end, "[]", w, 13, "slategrey", "slategrey", None]) last_lt = None if not motifs: print node, node.sequence seqFace = SeqMotifFace(node.sequence, motifs, intermotif_format="line", seqtail_format="line", scale_factor=1) add_face_to_node(seqFace, node, 20, aligned=True) else: if node.up: add_face_to_node(TextFace('% 3g' %node.support, fsize=11, fgcolor='indianred'), node, 0, position='branch-top') if hasattr(node, "support2") and node.up: add_face_to_node(TextFace('% 3g' %float(node.support2), fsize=11, fgcolor='steelblue'), node, 0, position='branch-bottom') node.img_style['size'] = 0 node.img_style['hz_line_color'] = 'black' node.img_style['vt_line_color'] = 'black'