1 import re
2 import sys
3
4 from obitools.utils import universalOpen
5 from obitools.phylogeny import PhylogenicTree
6
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
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
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
91
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
124