1 __VERSION__="ete2-2.0rev86"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 import copy
26 from evolevents import EvolEvent
27
29 """ Returns the recoliation gene tree with a provided species
30 topology """
31
32 if len(node.children)==2:
33
34 morphed_childs =[]
35 for ch in node.children:
36 mc, ev = get_reconciled_tree(ch, sptree, events)
37 morphed_childs.append(mc)
38
39
40
41
42 sp_child_0 = morphed_childs[0].get_species()
43 sp_child_1 = morphed_childs[1].get_species()
44 all_species = sp_child_1 | sp_child_0
45
46
47
48 if len(sp_child_0 & sp_child_1)>0:
49 newnode = copy.deepcopy(node)
50 newnode.up = None
51 newnode.children = []
52 template = _get_expected_topology(sptree, all_species)
53
54 newmorphed0, matchnode = _replace_on_template(template, morphed_childs[0])
55
56 newmorphed1, matchnode = _replace_on_template(template, morphed_childs[1])
57 newnode.add_child(newmorphed0)
58 newnode.add_child(newmorphed1)
59 newnode.add_feature("evoltype","D")
60 node.add_feature("evoltype","D")
61 e = EvolEvent()
62 e.etype = "D"
63 e.inparalogs = node.children[0].get_leaf_names()
64 e.outparalogs = node.children[1].get_leaf_names()
65 e.in_seqs = node.children[0].get_leaf_names()
66 e.out_seqs = node.children[1].get_leaf_names()
67 events.append(e)
68 return newnode, events
69
70
71
72 else:
73
74 template = _get_expected_topology(sptree, all_species)
75
76 template, matchnode = _replace_on_template(template, morphed_childs[0] )
77
78 template, matchnode = _replace_on_template(template, morphed_childs[1])
79 template.add_feature("evoltype","S")
80 node.add_feature("evoltype","S")
81 e = EvolEvent()
82 e.etype = "S"
83 e.inparalogs = node.children[0].get_leaf_names()
84 e.orthologs = node.children[1].get_leaf_names()
85 e.in_seqs = node.children[0].get_leaf_names()
86 e.out_seqs = node.children[1].get_leaf_names()
87 events.append(e)
88 return template, events
89 elif len(node.children)==0:
90 return copy.deepcopy(node), events
91 else:
92 raise ValueError, "Algorithm can only work with binary trees."
93
95 template = copy.deepcopy(orig_template)
96
97 nodespcs = node.get_species()
98 spseed = list(nodespcs)[0]
99
100 subtopo = template.search_nodes(children=[], name=spseed)[0]
101
102 while len(nodespcs - set(subtopo.get_leaf_names() ) )>0:
103 subtopo= subtopo.up
104
105 nodecp = copy.deepcopy(node)
106 if subtopo.up is None:
107 return nodecp, nodecp
108 else:
109 parent = subtopo.up
110 parent.remove_child(subtopo)
111 parent.add_child(nodecp)
112 return template, nodecp
113
132
135