Package obitools :: Package phylogeny
[hide private]
[frames] | no frames]

Source Code for Package obitools.phylogeny

  1   
  2  from obitools.graph.tree import Forest,TreeNode 
  3  from obitools.graph import Edge 
  4   
  5   
  6   
7 -class PhylogenicTree(Forest):
8
9 - def __init__(self,label='G',indexer=None,nodes=None,edges=None):
10 Forest.__init__(self, label, indexer, nodes, edges) 11 self.root=None 12 self.comment=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):
21 if index is None: 22 index = self._index.getIndex(node, True) 23 return PhylogenicNode(index,self)
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
43 -class PhylogenicNode(TreeNode):
44
45 - def getLabel(self):
46 label = TreeNode.getLabel(self) 47 if label[0:2]=='__': 48 return None 49 else: 50 return label
51
52 - def __str__(self):
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
70 - def distanceTo(self,node=None,index=None):
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
99 -class PhylogenicEdge(Edge):
100
101 - def __str__(self):
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