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

Source Code for Module obitools.tree.newick

  1  import re 
  2  import sys 
  3   
  4  from obitools.utils import universalOpen 
  5  from obitools.tree import Tree,TreeNode 
  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 = Tree() 52 data = _cleanTreeData.sub(' ',data).strip() 53 54 parsedNode = nodeParser(data) 55 node = TreeNode(tree, 56 parsedNode['name'], 57 parsedNode['distance'], 58 parsedNode['bootstrap']) 59 60 node.linkToParent(parent) 61 62 if parsedNode['subnodes']: 63 for subnode in subNodeIterator(parsedNode['subnodes']): 64 treeParser(subnode,tree,node) 65 return tree
66 67 _treecomment=re.compile('\[.*\]') 68
69 -def treeIterator(file):
70 file = universalOpen(file) 71 data = file.read() 72 73 comment = _treecomment.findall(data) 74 data=_treecomment.sub('',data).strip() 75 76 if comment: 77 comment=comment[0] 78 else: 79 comment=None 80 for tree in data.split(';'): 81 t = treeParser(tree) 82 if comment: 83 t.comment=comment 84 yield t
85
86 -def nodeWriter(tree,node,deep=0):
87 name = node._name 88 if name is None: 89 name='' 90 91 distance=node._dist 92 if distance is None: 93 distance='' 94 else: 95 distance = ':%6.5f' % distance 96 97 bootstrap=node._bootstrap 98 if bootstrap is None: 99 bootstrap='' 100 else: 101 bootstrap=' %d' % int(bootstrap) 102 103 nodeseparator = ',\n' + ' ' * (deep+1) 104 105 subnodes = nodeseparator.join([nodeWriter(tree, x, deep+1) 106 for x in tree.childNodeIterator(node)]) 107 if subnodes: 108 subnodes='(\n' + ' ' * (deep+1) + subnodes + '\n' + ' ' * deep + ')' 109 110 return '%s%s%s%s' % (subnodes,name,bootstrap,distance)
111
112 -def treeWriter(tree,startnode=None):
113 if startnode is not None: 114 root=startnode 115 else: 116 root = tree.getRoot() 117 return nodeWriter(tree,root)+';'
118