1
2 from obitools.graph.tree import Forest,TreeNode
3 from obitools.graph import Edge
4
5
6
8
9 - def __init__(self,label='G',indexer=None,nodes=None,edges=None):
13
14 - def addNode(self,node=None,index=None,**data):
15 if node is None and index is None:
16 node = '__%d' % (len(self._node)+1)
17
18 return Forest.addNode(self, node, index, **data)
19
20 - def getNode(self,node=None,index=None):
24
25 - def getEdge(self,node1=None,node2=None,index1=None,index2=None):
26 '''
27
28 @param node1:
29 @type node1:
30 @param node2:
31 @type node2:
32 @param index1:
33 @type index1:
34 @param index2:
35 @type index2:
36 '''
37 node1=self.getNode(node1, index1)
38 node2=self.getNode(node2, index2)
39 return PhylogenicEdge(node1,node2)
40
41
42
44
51
53
54 if self.index in self.graph._node_attrs:
55 keys = " ".join(['%s="%s"' % (x[0],str(x[1]).replace('"','\\"'))
56 for x in self.graph._node_attrs[self.index].iteritems()]
57 )
58 else:
59 keys=''
60
61 if self.label is None:
62 label=''
63 shape='point'
64 else:
65 label=self.label
66 shape='box'
67
68 return '%d [label="%s" shape="%s" %s]' % (self.index,str(label).replace('"','\\"'),shape,keys)
69
71 '''
72 compute branch length between the two nodes.
73 If distances are not secified for this tree, None is returned.
74
75 @param node: a node label or None
76 @param index: a node index or None. the parameter index
77 has a priority on the parameter node.
78 @type index: int
79
80 @return: the evolutive distance between the two nodes
81 @rtype: int, float or None
82 '''
83 path = self.shortestPathTo(node, index)
84
85 start = path.pop(0)
86 dist=0
87 for dest in path:
88 edge = self.graph.getEdge(index1=start,index2=dest)
89 if 'distance' in edge:
90 dist+=edge['distance']
91 else:
92 return None
93 start=dest
94
95 return dist
96
97 label = property(getLabel, None, None, "Label of the node")
98
100
102 e = (self.node1.index,self.node2.index)
103 if e in self.graph._edge_attrs:
104 keys = "[%s]" % " ".join(['%s="%s"' % (x[0],str(x[1]).replace('"','\\"'))
105 for x in self.graph._edge_attrs[e].iteritems()
106 if x[0] not in ('distance','bootstrap')]
107 )
108 else:
109 keys = ""
110
111
112
113 if self.directed:
114 link='->'
115 else:
116 link='--'
117
118 return "%d %s %d %s" % (self.node1.index,link,self.node2.index,keys)
119