def prettifyTree(ete_tree,
                 leaf_font_size=32,
                 branch_support_size=20,
                 show_bootstraps=True,
                 title=None,
                 ts=None):
    ''' Perform standardized functions to make the ETE trees easier to read:
    - Make the branch support bigger
    - Make the leaf fonts bigger
    - Turn off elongating branches for visualization purposes (i.e. make sure the real branch lengths are represented)
    - Change both to standard font (Times)
    - Standardize the tree's width (calculate based on the maximum length from the root to a tip)
    - (optional) add title to tree
    '''

    for node in ete_tree.traverse():
        if node.is_leaf():
            # Make text faces with name = the existing node name but with big font.
            # A side effect of this is that we also get the annotations lined up
            F = faces.TextFace(node.name, ftype="Times", fsize=leaf_font_size)
            node.add_face(F, 0, position="aligned")
        else:
            if show_bootstraps:
                # Make branch support bigger
                F = faces.TextFace(node._support,
                                   ftype="Times",
                                   fsize=branch_support_size)
                node.add_face(F, 0, position="branch-top")

    #correct the long root node bug (fixed in next release)
    ete_tree.dist = 0

    # Optionally create a new TreeStyle if we are not passing in an old one.
    if ts is None:
        ts = TreeStyle()

    # This "fixes" the dashed line issue but makes the tree look terrible.
    # There may be no way around this (and it's likely other tree viewers do the same thing
    # but just don't tell you).
    #ts.optimal_scale_level = "full"

    # We made these bigger so lets turn off the default ones too.
    ts.show_branch_support = False
    ts.show_leaf_name = False

    if title is not None:
        ts.title.clear()
        title = TextFace(title)
        title.hz_align = True
        title.fsize = 52
        ts.title.add_face(title, 0)

    return ete_tree, ts
Example #2
0
    def show(self, layout=None, tree_style=None, histfaces=None):
        '''
        call super show of PhyloTree
        histface should be a list of models to be displayes as histfaces

        :argument layout: a layout function
        :argument None tree_style: tree_style object
        :argument Nonehistface: an histogram face function. This is only to plot selective pressure among sites

        '''
        if TREEVIEW:
            if not tree_style:
                ts = TreeStyle()
            else:
                ts = tree_style
            if histfaces:
                for hist in histfaces:
                    try:
                        mdl = self.get_evol_model(hist)
                    except AttributeError:
                        warn('model %s not computed' % (hist))
                    if not 'histface' in mdl.properties:
                        if len(histfaces) > 1 and histfaces.index(hist) != 0:
                            mdl.set_histface(up=False)
                        else:
                            mdl.set_histface()
                    if mdl.properties['histface'].up:
                        ts.aligned_header.add_face(mdl.properties['histface'],
                                                   1)
                    else:
                        ts.aligned_foot.add_face(mdl.properties['histface'], 1)
            super(EvolTree, self).show(layout=layout, tree_style=ts)
        else:
            raise ValueError("Treeview module is disabled")
def prettifyTree(ete_tree, leaf_font_size = 32, branch_support_size = 20, show_bootstraps = True, title=None, ts = None):
    ''' Perform standardized functions to make the ETE trees easier to read:
    - Make the branch support bigger
    - Make the leaf fonts bigger
    - Turn off elongating branches for visualization purposes (i.e. make sure the real branch lengths are represented)
    - Change both to standard font (Times)
    - Standardize the tree's width (calculate based on the maximum length from the root to a tip)
    - (optional) add title to tree
    '''

    for node in ete_tree.traverse():
        if node.is_leaf():
            # Make text faces with name = the existing node name but with big font.
            # A side effect of this is that we also get the annotations lined up
            F = faces.TextFace(node.name, ftype="Times", fsize=leaf_font_size)
            node.add_face(F, 0, position="aligned")
        else:
            if show_bootstraps:
                # Make branch support bigger
                F = faces.TextFace(node._support, ftype="Times", fsize=branch_support_size)
                node.add_face(F, 0, position="branch-top")

    #correct the long root node bug (fixed in next release)
    ete_tree.dist=0

    # Optionally create a new TreeStyle if we are not passing in an old one.
    if ts is None:
        ts = TreeStyle()

    # This "fixes" the dashed line issue but makes the tree look terrible.
    # There may be no way around this (and it's likely other tree viewers do the same thing
    # but just don't tell you).
    #ts.optimal_scale_level = "full"

    # We made these bigger so lets turn off the default ones too.
    ts.show_branch_support = False
    ts.show_leaf_name = False

    if title is not None:
        ts.title.clear()
        title = TextFace(title)
        title.hz_align = True
        title.fsize = 52
        ts.title.add_face(title, 0)

    return ete_tree, ts
    if options.gene is None:
        gene = options.clusterrunid
    else:
        gene = options.gene

    # FIXME - if we declare this as a PhyloTree rather than just a Tree, ETE for some reason creates an
    # EXTRA COPY of the names (try it and see!) and therefore if you set show_leaf_names to True it shows
    # TWO copies of the leaf name at each leaf node (and if you set it to False it shows one, making it look
    # like it's ignoring you when you set it to False). The Tree class works as expected.
    #
    # Since we only need PhyloTree when we want to export to PhyloXML (not implemented yet), we should only create one
    # in that instance (due to the brokenness)
#    t = PhyloTree(treeinfile, sp_naming_function=parse_sp_name)
    t = Tree(treeinfile)
    ts = TreeStyle()

    con = sqlite3.connect(locateDatabase())
    cur = con.cursor()

    tempdir = tempfile.mkdtemp()

    t, ts = draw_tree_regions(clusterrunid,
                              t,
                              ts,
                              cur,
                              greyout=options.cutoff,
                              tempdir=tempdir,
                              label=options.label)

    # Now that we don't need to reference anything with the gene IDs any more, try to change them into
# FIXME - This should call the library functions to get geneinfo for specific sets of genes
# instead of doing this.
con = sqlite3.connect(locateDatabase())
cur = con.cursor()
cur.execute("SELECT * FROM processed;")

for l in cur:
    spl = [ str(s) for s in list(l) ]
    # The SVG parser whines with some special characters (i.e. ' )
    # I use the sanitized version as a key here so that the code will work whether or not the leaf names
    # have been sanitized in the input tree.
    geneToAnnote[sanitizeString(spl[0], False)] = sanitizeString(spl[9], False)
    geneToOrganism[sanitizeString(spl[0], False)] = sanitizeString(spl[1], False)

ts = TreeStyle()

# Now we try and add the heatmap
# if the user requests it
#
# I borrowed some of this code from the ETE tutorial.
if options.datafile is not None:
    array = t.arraytable
    numcols = len(array.colNames)
    matrix_dist = [i for r in range(len(array.matrix))\
                       for i in array.matrix[r] if numpy.isfinite(i)]
    matrix_max = numpy.max(matrix_dist)
    matrix_min = numpy.min(matrix_dist)
    matrix_avg = matrix_min+((matrix_max-matrix_min)/2)

    # Max, Min, Center, Width, Height, Type)