• Main Page
  • Namespaces
  • Classes
  • Files
  • File List

/home/mark/model/software/ScrumPy/ScrumPy/Util/TreeLayouts.py

00001 
00002 
00003 #
00004 # Put this in ScrumPy.Util.Set
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 # NodeTypes
00032 
00033 Undef, Root, Internal, Module, Leaf = -1,0,1,2,3
00034 
00035 
00036 
00037 ######################### Image Properties ######################
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, #200,  # This is used to scale the tree branches
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 ######################### Styles ######################
00069 ##
00070 #
00071 
00072 ######################### Default #####################
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 ############################  Explore   #####################
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 ########################## Layouts #########################
00124 ##
00125 #
00126 
00127 ########################## Default #########################
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 ########################## LastModule #########################
00171 
00172 # Expand all but the terminal modules    
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 ########################## InternalOnly #########################
00215 
00216 
00217 # only show nodes with no leaf children  and no modules
00218 class _InternalOnly(Layout):
00219 
00220     def Internal(self, n):
00221         
00222         #n.img_style["size"] = 0
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             #n.img_style["size"] = 0
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 ######################### Collapse preserving target leaves ######
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 ##########################  Edit layout  #########################
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 ##########################  Skeleton layout  #########################
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 

Generated on Tue Sep 4 2012 15:38:02 for ScrumPy by  doxygen 1.7.1