from ete3 import Tree

# Loads a tree with branch lenght information. Note that if no
# distance info is provided in the newick, it will be initialized with
# the default dist value = 1.0
nw = """(((A:0.1, B:0.01):0.001, C:0.0001):1.0,
(((((D:0.00001,I:0):0,F:0):0,G:0):0,H:0):0,
E:0.000001):0.0000001):2.0;"""
t = Tree(nw)
print(t)
#                              /-A
#                    /--------|
#          /--------|          \-B
#         |         |
#         |          \-C
#         |
#         |                                                  /-D
#         |                                        /--------|
#---------|                              /--------|          \-I
#         |                             |         |
#         |                    /--------|          \-F
#         |                   |         |
#         |          /--------|          \-G
#         |         |         |
#          \--------|          \-H
#                   |
#                    \-E
#
# Locate some nodes
A = t&"A"
C = t&"C"
# Calculate distance from current node
print("The distance between A and C is",  A.get_distance("C"))
# Calculate distance between two descendants of current node
print("The distance between A and C is",  t.get_distance("A","C"))
# Calculate the toplogical distance (number of nodes in between)
print("The number of nodes between A and D is ",  \
    t.get_distance("A","D", topology_only=True))
# Calculate the farthest node from E within the whole structure
farthest, dist = (t&"E").get_farthest_node()
print("The farthest node from E is", farthest.name, "with dist=", dist)
# Calculate the farthest node from E within the whole structure,
# regarding the number of nodes in between as distance value
# Note that the result is differnt.
farthest, dist = (t&"E").get_farthest_node(topology_only=True)
print("The farthest (topologically) node from E is", \
    farthest.name, "with", dist, "nodes in between")
# Calculate farthest node from an internal node
farthest, dist = t.get_farthest_node()
print("The farthest node from root is", farthest.name, "with dist=", dist)
#
# The program results in the following information:
#
# The distance between A and C is 0.1011
# The distance between A and C is 0.1011
# The number of nodes between A and D is  8.0
# The farthest node from E is A with dist= 1.1010011
# The farthest (topologically) node from E is I with 5.0 nodes in between
# The farthest node from root is A with dist= 1.101
