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

Source Code for Module obitools.phylogeny.newick

  1  import re 
  2  import sys 
  3   
  4  from obitools.utils import universalOpen 
  5  from obitools.phylogeny import PhylogenicTree 
  6   
7 -def subNodeIterator(data):
8 level=0 9 start = 1 10 if data[0]=='(': 11 for i in xrange(1,len(data)): 12 c=data[i] 13 if c=='(': 14 level+=1 15 elif c==')': 16 level-=1 17 if c==',' and not level: 18 yield data[start:i] 19 start = i+1 20 yield data[start:i] 21 else: 22 yield data
23 24 25 _nodeParser=re.compile('\s*(?P<subnodes>\(.*\))?(?P<name>[^ :]+)? *(?P<bootstrap>[0-9.]+)?(:(?P<distance>-?[0-9.]+))?') 26
27 -def nodeParser(data):
28 parsedNode = _nodeParser.match(data).groupdict(0) 29 if not parsedNode['name']: 30 parsedNode['name']=None 31 32 if not parsedNode['bootstrap']: 33 parsedNode['bootstrap']=None 34 else: 35 parsedNode['bootstrap']=float(parsedNode['bootstrap']) 36 37 if not parsedNode['distance']: 38 parsedNode['distance']=None 39 else: 40 parsedNode['distance']=float(parsedNode['distance']) 41 42 if not parsedNode['subnodes']: 43 parsedNode['subnodes']=None 44 45 return parsedNode
46 47 _cleanTreeData=re.compile('\s+') 48
49 -def treeParser(data,tree=None,parent=None):
50 if tree is None: 51 tree = PhylogenicTree() 52 data = _cleanTreeData.sub(' ',data).strip() 53 54 parsedNode = nodeParser(data) 55 56 if parent is not None: 57 son,parent = tree.addEdge(node1=parsedNode['name'], 58 index2=parent, 59 distance=parsedNode['distance'], 60 bootstrap=parsedNode['bootstrap']) 61 else: 62 son = tree.addNode(node1=parsedNode['name']) 63 tree.root=son 64 65 66 67 if parsedNode['subnodes']: 68 for subnode in subNodeIterator(parsedNode['subnodes']): 69 treeParser(subnode,tree,son) 70 71 return tree
72 73 _treecomment=re.compile('\[.*\]') 74
75 -def treeIterator(file):
76 file = universalOpen(file) 77 data = file.read() 78 79 comment = _treecomment.findall(data) 80 data=_treecomment.sub('',data).strip() 81 82 if comment: 83 comment=comment[0] 84 else: 85 comment=None 86 for tree in data.split(';'): 87 t = treeParser(tree) 88 if comment: 89 t.comment=comment 90 yield t
91
92 -def nodeWriter(tree,node,deep=0):
93 name = node._name 94 if name is None: 95 name='' 96 97 distance=node._dist 98 if distance is None: 99 distance='' 100 else: 101 distance = ':%6.5f' % distance 102 103 bootstrap=node._bootstrap 104 if bootstrap is None: 105 bootstrap='' 106 else: 107 bootstrap=' %d' % int(bootstrap) 108 109 nodeseparator = ',\n' + ' ' * (deep+1) 110 111 subnodes = nodeseparator.join([nodeWriter(tree, x, deep+1) 112 for x in tree.childNodeIterator(node)]) 113 if subnodes: 114 subnodes='(\n' + ' ' * (deep+1) + subnodes + '\n' + ' ' * deep + ')' 115 116 return '%s%s%s%s' % (subnodes,name,bootstrap,distance)
117
118 -def treeWriter(tree,startnode=None):
119 if startnode is not None: 120 root=startnode 121 else: 122 root = tree.getRoot() 123 return nodeWriter(tree,root)+';'
124