00001
00002
00003
00004
00005 Intersect = lambda l1,l2: filter(lambda x: x in l1,l2)
00006
00007
00008 from ete2 import faces, TreeImageProperties
00009
00010
00011 Black = "#000000"
00012 White = "#FFFFFF"
00013 Red = "#FF0000"
00014 Green = "#00FF00"
00015 Blue = "#0000FF"
00016 ETE2fg= "#0030c1"
00017
00018 Solid =0
00019 Dashed=1
00020
00021
00022
00023 def AddTextFace(n,text,col=0):
00024 faces.add_face_to_node(faces.TextFace(text),n,col)
00025
00026 def AddAttrFace(n, attr, col=0):
00027 faces.add_face_to_node(faces.AttrFace(attr),n,col)
00028
00029
00030
00031
00032
00033 Undef, Root, Internal, Module, Leaf = -1,0,1,2,3
00034
00035
00036
00037
00038
00039 DefaultImgPropDic={
00040 "force_topology" : False,
00041 "draw_branch_length " : False,
00042 "align_leaf_faces " : False,
00043 "orientation" : 0,
00044 "general_font_type" : "Verdana",
00045 "branch_length_font_color" : "#222",
00046 "branch_length_font_size" : 6,
00047 "branch_support_font_color" : "red",
00048 "branch_support_font_size" : 9,
00049 "tree_width" : 850,
00050 "self.min_branch_separation": 1
00051 }
00052
00053
00054 class ImgProps(TreeImageProperties):
00055
00056 def __init__(self, PropDic=DefaultImgPropDic):
00057 TreeImageProperties.__init__(self)
00058 self.Update(PropDic)
00059
00060 def Update(self, PropDic):
00061 for p in PropDic:
00062 setattr(self,p, PropDic[p])
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 DefaultStyle = {
00075 'vlwidth' : 3,
00076 'vt_line_color' : Black,
00077 'draw_descendants': 1,
00078 'hz_line_color' : Black,
00079 'hlwidth' : 3,
00080 'bgcolor' : White,
00081 'shape' : 'sphere',
00082 'line_type' : 0,
00083 'ymargin' : 0,
00084 'fgcolor' : ETE2fg,
00085 'size' : 6
00086 }
00087
00088 class Style(dict):
00089
00090 def __init__(self, BaseStyle=DefaultStyle, styledic={}):
00091
00092 for style in Undef, Root, Internal, Module, Leaf:
00093 self[style] = dict(BaseStyle)
00094
00095 for style in styledic:
00096 self[style].update(styledic[style])
00097
00098
00099
00100
00101 ExplBaseStyle = dict(DefaultStyle)
00102 ExplBaseStyle.update({
00103 'vlwidth': 3,
00104 'hlwidth': 3,
00105 'fgcolor': White,
00106 'size' : 10 })
00107
00108 ExplStyles = {
00109 Root : {'fgcolor': Red },
00110 Module : {'fgcolor': Blue },
00111 Internal : {'fgcolor': Black},
00112 Leaf : {'fgcolor' :Green}
00113 }
00114
00115 ExplStyle = Style(ExplBaseStyle, ExplStyles)
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130 class Layout:
00131
00132 def __init__(self, StyleDic=ExplStyle):
00133
00134 self.StyleDic = StyleDic
00135
00136 def Layout(self, n):
00137
00138 self.AllNodes(n)
00139
00140 NodeType = n.GetNodeType()
00141
00142 n.img_style.update(self.StyleDic[NodeType])
00143
00144 {
00145 Root : self.Root,
00146 Internal : self.Internal,
00147 Module : self.Module,
00148 Leaf : self.Leaf
00149 } [NodeType](n)
00150
00151 def AllNodes(self, n):
00152 pass
00153
00154 def Root(self,n):
00155 AddAttrFace(n,"name")
00156
00157 def Internal(self,n):
00158 AddAttrFace(n,"name")
00159
00160 def Module(self, n):
00161 AddAttrFace(n,"name")
00162
00163 def Leaf(self, n):
00164 AddAttrFace(n,"name")
00165
00166 DefaultLayout = Layout()
00167
00168
00169
00170
00171
00172
00173 class _LastModule(Layout):
00174
00175 def Module(self,n):
00176
00177 if not n.HasModule():
00178 n.collapsed = True
00179 lenstr = n.nLeafStr()
00180 else:
00181 lenstr = ""
00182
00183 AddTextFace(n, n.name+lenstr)
00184
00185
00186 def Internal(self, n):
00187
00188 if not n.HasModule():
00189 n.collapsed = True
00190 lenstr = n.nLeafStr()
00191 AddTextFace(n, lenstr)
00192
00193 def Leaf(self,n):
00194 pass
00195
00196 LastModule = _LastModule()
00197
00198
00199
00200 class _FirstModule(_LastModule):
00201
00202 def Root(self,n):
00203
00204 n.dist = n.MeanDist()
00205
00206 def Module(self,n):
00207
00208 n.collapsed = True
00209 AddTextFace(n, n.name + n.nLeafStr())
00210
00211 FirstModule = _FirstModule()
00212
00213
00214
00215
00216
00217
00218 class _InternalOnly(Layout):
00219
00220 def Internal(self, n):
00221
00222
00223 if not n.HasModule():
00224 n.collapsed = True
00225 AddTextFace(n, n.nLeafStr())
00226
00227
00228 def Module(self, n):
00229
00230 if n.HasModule():
00231
00232 AddAttrFace(n,"name")
00233 else:
00234 n.collapsed = True
00235 AddTextFace(n, n.name + n.nLeafStr())
00236
00237
00238
00239 InternalOnly = _InternalOnly()
00240
00241
00242
00243
00244
00245 class _CollapsePreserveTargs(Layout):
00246
00247 def Module(self, n):
00248
00249 AddAttrFace(n,"name")
00250 LNames = map(lambda node: node.name, n.get_leaves())
00251
00252 if len(Intersect(LNames, n.GetRoot().LayoutData)) == 0:
00253 n.collapsed = True
00254 else:
00255 n.collapsed = False
00256
00257
00258 def Internal(self,n):
00259
00260 LNames = map(lambda node: node.name, n.get_leaves())
00261 if len(Intersect(LNames, n.GetRoot().LayoutData)) == 0:
00262 n.collapsed = True
00263 else:
00264 n.collapsed = False
00265 AddAttrFace(n,"name")
00266
00267
00268 def Leaf(self, n):
00269
00270 if n.name in n.GetRoot().LayoutData:
00271 AddAttrFace(n,"name")
00272
00273
00274
00275
00276
00277 CollapsePreserveTargs = _CollapsePreserveTargs()
00278
00279
00280
00281
00282
00283
00284
00285
00286 EditBaseStyle = dict(DefaultStyle)
00287
00288 EditBaseStyle['size'] = 0
00289 EditStyles = {
00290 Root : {'fgcolor': Red },
00291 Module : {'fgcolor': Blue },
00292 Internal : {'fgcolor': Black, "size":5},
00293 }
00294
00295 EditStyle = Style(EditBaseStyle, EditStyles)
00296
00297
00298 class _Edit(Layout):
00299
00300 def Module(self,n):
00301 AddAttrFace(n,"name")
00302 n.dist=0
00303
00304 def Leaf(self, n):
00305 AddAttrFace(n,"name")
00306
00307 Edit = _Edit(EditStyle)
00308 Explore = _Edit(ExplStyle)
00309
00310
00311 class _LeavesAndModules(_Edit):
00312
00313 def Internal(self, n):
00314 pass
00315
00316 LeavesAndModules = _LeavesAndModules(ExplStyle)
00317
00318
00319
00320
00321
00322
00323 SkelBaseStyle = dict(DefaultStyle)
00324 SkelBaseStyle["size"] = 0
00325 SkelBaseStyle['fgcolor'] = Black
00326 SkelStyle = Style(SkelBaseStyle)
00327
00328
00329 class _Skeleton (Layout):
00330 def __init__(self):
00331 Layout.__init__(self,SkelStyle)
00332
00333 def Root(self, n):
00334 n.dist = n.MeanDist()
00335 n.SetAllLeafMean()
00336
00337
00338 def Module(self, n):
00339 pass
00340
00341 def Internal(self, n):
00342 pass
00343
00344 def Leaf(self, n):
00345 pass
00346
00347 Skeleton = _Skeleton()
00348
00349 class _LeafNameOnly(_Skeleton):
00350
00351 def __init__(self):
00352 _Skeleton.__init__(self)
00353
00354 def Leaf(self, n):
00355 AddAttrFace(n,"name")
00356
00357 LeafNameOnly = _LeafNameOnly()
00358
00359
00360
00361
00362
00363
00364 Layouts = {
00365 "LastModule" : lambda n:LastModule.Layout(n),
00366 "FirstModule" : lambda n:FirstModule.Layout(n),
00367 "InternalOnly" : lambda n:InternalOnly.Layout(n),
00368 "Default" : lambda n:Default.Layout(n),
00369 "Edit" : lambda n:Edit.Layout(n),
00370 "Explore" : lambda n:Explore.Layout(n),
00371 "Skeleton" : lambda n:Skeleton.Layout(n),
00372 "LeafNameOnly" : lambda n:LeafNameOnly.Layout(n),
00373 "LeavesAndModules":lambda n:LeavesAndModules.Layout(n),
00374 "CollapsePreserveTargs": lambda n:CollapsePreserveTargs.Layout(n)
00375 }
00376
00377
00378
00379