In [1]:
import dendropy
In [2]:
ebola_raxml = dendropy.Tree.get_from_path('my_ebola.nex', 'nexus')
In [3]:
def compute_level(node, level=0):
for child in node.child_nodes():
compute_level(child, level + 1)
if node.taxon is not None:
print("%s: %d %d" % (node.taxon, node.level(), level))
compute_level(ebola_raxml.seed_node)
In [4]:
def compute_height(node):
children = node.child_nodes()
if len(children) == 0:
height = 0
else:
height = 1 + max(map(lambda x: compute_height(x), children))
desc = node.taxon or 'Internal'
print("%s: %d %d" % (desc, height, node.level()))
return height
compute_height(ebola_raxml.seed_node)
Out[4]:
In [5]:
def compute_nofs(node):
children = node.child_nodes()
nofs = len(children)
map(lambda x: compute_nofs(x), children)
desc = node.taxon or 'Internal'
print("%s: %d %d" % (desc, nofs, node.level()))
compute_nofs(ebola_raxml.seed_node)
In [6]:
def print_nodes(node):
for child in node.child_nodes():
print_nodes(child)
if node.taxon is not None:
print('%s (%d)' % (node.taxon, node.level()))
print_nodes(ebola_raxml.seed_node)
In [7]:
from collections import deque
def print_breadth(tree):
queue = deque()
queue.append(tree.seed_node)
while len(queue) > 0:
process_node = queue.popleft()
if process_node.taxon is not None:
print('%s (%d)' % (process_node.taxon, process_node.level()))
else:
for child in process_node.child_nodes():
queue.append(child)
print_breadth(ebola_raxml)
In [8]:
#remove
#def clean_comments(node, depth=0):
# for child in node.child_nodes():
# clean_comments(child, depth + 1)
# if node.taxon is None:
# node.comments = None
#clean_comments(ebola_raxml.seed_node)
#ebola_raxml.write_to_path('ebola_clean.nex', 'nexus')
#ebov_2014_raxml = dendropy.Tree.get_from_path('my_ebov_2014.nex', 'nexus')
#clean_comments(ebov_2014_raxml.seed_node)
#ebov_2014_raxml.write_to_path('ebov_2014_clean.nex', 'nexus')
In [10]:
from copy import deepcopy
simple_ebola = deepcopy(ebola_raxml)
def simplify_tree(node):
prefs = set()
for leaf in node.leaf_nodes():
my_toks = leaf.taxon.label.split(' ')[0].split('_')
if my_toks[0] == 'EBOV':
prefs.add('EBOV' + my_toks[1])
else:
prefs.add(my_toks[0])
if len(prefs) == 1:
print(prefs, len(node.leaf_nodes()))
node.taxon = dendropy.Taxon(label=list(prefs)[0])
#node.collapse_clade()
node.set_child_nodes([])
else:
for child in node.child_nodes():
simplify_tree(child)
simplify_tree(simple_ebola.seed_node)
simple_ebola.ladderize()
simple_ebola.write_to_path('ebola_simple.nex', 'nexus')
In [ ]: