def textDrawList( self, showInternalNodeNames=1, addToBrLen=0.2, width=None, autoIncreaseWidth=True, showNodeNums=1, partNum=0, model=False, ): if len(self.nodes) == 0: return [""] elif len(self.nodes) == 1: if showNodeNums: return ["%i:%s" % (self.nodes[0].nodeNum, self.nodes[0].name)] else: return ["%s" % self.nodes[0].name] gm = ["Tree.textDrawList()"] if not self.preAndPostOrderAreValid: self.setPreAndPostOrder() from TreePicture import TreePicture p = TreePicture(self) p.fName = None p.width = width p.xScale = None p.yScale = 1 p.pointsPerLetter = 1 p.addToBrLen = addToBrLen p.textShowNodeNums = showNodeNums p.showInternalNodeNames = showInternalNodeNames if showNodeNums: p.nameOffset = 0 else: p.nameOffset = 1 p.xOrigin = 0.0 p.yOrigin = 0.0 p.textSize = 1 p.labelTextSize = 1 # If the width is not specified, make a guess if width == None: tLen = 0 # Longest number of horizontal sections to draw longestNameLen = 0 for n in self.nodes: if n.isLeaf and n != self.root: if n.name: # This assumes short internal node name lengths if len(n.name) > longestNameLen: longestNameLen = len(n.name) thisLen = 0 n1 = n # print "x n1 is node %i" % n1.nodeNum while n1 != self.root: n1 = n1.parent # print "y n1 is node %i" % n1.nodeNum thisLen += 1 if thisLen > tLen: tLen = thisLen # print "tLen =", tLen # print "longestNameLen =", longestNameLen rootNameLen = 0 if self.root.name: rootNameLen = len(self.root.name) + 1 p.width = (10 * tLen) + rootNameLen + longestNameLen if p.width > 100: p.width = 100 # print "p.width =", p.width # import sys; sys.exit() # Make sure the names fit. if not autoIncreaseWidth: for n in self.nodes: if n.isLeaf and n != self.root: if n.name and len(n.name) > p.width: gm.append("There are long names, and the given width is not enough.") raise Glitch, gm if model: try: partNum = int(partNum) except: gm.append("partNum arg should be an integer.") raise Glitch, gm if not self.model: gm.append("If model arg is set, then self.model must exist.") raise Glitch, gm if partNum < 0 or partNum >= self.model.nParts: gm.append("Zero-based partNum %i is out of range of %s parts." % (partNum, self.model.nParts)) raise Glitch, gm p.partNum = partNum p.doModel = 1 doComps = 1 doRMatrices = 1 if self.model.parts[partNum].nComps < 2: doComps = 0 if self.model.parts[partNum].nRMatrices < 2: doRMatrices = 0 if not doComps and not doRMatrices: p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) s.append("Both the composition of the model and the rate matrix are homogeneous in part %i.\n" % partNum) return s # First do compositions s = [] if doComps: if 0: if self.model.nParts > 1: print "Compositions for part %i" % partNum else: print "\nCompositions\n------------" p.textDrawModelThing = var.TEXTDRAW_COMP p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) # print s # Then do RMatrices if doRMatrices: if 0: if self.model.nParts > 1: print "RMatrices for part %i" % partNum else: print "\nRMatrices\n---------" p.textDrawModelThing = var.TEXTDRAW_RMATRIX p.setPos(autoIncreaseWidth) if s: s += p.textString(returnAsList=True) else: s = p.textString(returnAsList=True) if self.model.parts[partNum].nComps == 1: s.append("The composition of the model is homogeneous in part %i\n" % partNum) elif self.model.parts[partNum].nRMatrices == 1: s.append("The rate matrix is homogeneous in part %i\n" % partNum) # Don't bother with GDASRV, yet return s else: p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) return s
def textDrawList(self, showInternalNodeNames=1, addToBrLen=0.2, width=None, autoIncreaseWidth=True, showNodeNums=1, partNum=0, model=False): if len(self.nodes) == 0: return [''] elif len(self.nodes) == 1: if showNodeNums: return ['%i:%s' % (self.nodes[0].nodeNum, self.nodes[0].name)] else: return ['%s' % self.nodes[0].name] gm = ['Tree.textDrawList()'] if not self.preAndPostOrderAreValid: self.setPreAndPostOrder() from TreePicture import TreePicture p = TreePicture(self) p.fName = None p.width = width p.xScale = None p.yScale = 1 p.pointsPerLetter = 1 p.addToBrLen = addToBrLen p.textShowNodeNums = showNodeNums p.showInternalNodeNames = showInternalNodeNames if showNodeNums: p.nameOffset = 0 else: p.nameOffset = 1 p.xOrigin = 0.0 p.yOrigin = 0.0 p.textSize = 1 p.labelTextSize = 1 # If the width is not specified, make a guess if width == None: tLen = 0 # Longest number of horizontal sections to draw longestNameLen = 0 for n in self.nodes: if n.isLeaf and n != self.root: if n.name: # This assumes short internal node name lengths if len(n.name) > longestNameLen: longestNameLen = len(n.name) thisLen = 0 n1 = n #print "x n1 is node %i" % n1.nodeNum while n1 != self.root: n1 = n1.parent #print "y n1 is node %i" % n1.nodeNum thisLen += 1 if thisLen > tLen: tLen = thisLen #print "tLen =", tLen #print "longestNameLen =", longestNameLen rootNameLen = 0 if self.root.name: rootNameLen = len(self.root.name) + 1 p.width = (10 * tLen) + rootNameLen + longestNameLen if p.width > 100: p.width = 100 #print "p.width =", p.width #import sys; sys.exit() # Make sure the names fit. if not autoIncreaseWidth: for n in self.nodes: if n.isLeaf and n != self.root: if n.name and len(n.name) > p.width: gm.append("There are long names, and the given width is not enough.") raise Glitch, gm if model: try: partNum = int(partNum) except: gm.append("partNum arg should be an integer.") raise Glitch, gm if not self.model: gm.append("If model arg is set, then self.model must exist.") raise Glitch, gm if partNum < 0 or partNum >= self.model.nParts: gm.append("Zero-based partNum %i is out of range of %s parts." % (partNum, self.model.nParts)) raise Glitch, gm p.partNum = partNum p.doModel = 1 doComps = 1 doRMatrices = 1 if self.model.parts[partNum].nComps < 2: doComps = 0 if self.model.parts[partNum].nRMatrices < 2: doRMatrices = 0 if not doComps and not doRMatrices: p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) s.append("Both the composition of the model and the rate matrix are homogeneous in part %i.\n" % partNum) return s # First do compositions s = [] if doComps: if 0: if self.model.nParts > 1: print "Compositions for part %i" % partNum else: print "\nCompositions\n------------" p.textDrawModelThing = var.TEXTDRAW_COMP p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) #print s # Then do RMatrices if doRMatrices: if 0: if self.model.nParts > 1: print "RMatrices for part %i" % partNum else: print "\nRMatrices\n---------" p.textDrawModelThing = var.TEXTDRAW_RMATRIX p.setPos(autoIncreaseWidth) if s: s += p.textString(returnAsList=True) else: s = p.textString(returnAsList=True) if self.model.parts[partNum].nComps == 1: s.append("The composition of the model is homogeneous in part %i\n" % partNum) elif self.model.parts[partNum].nRMatrices == 1: s.append("The rate matrix is homogeneous in part %i\n" % partNum) # Don't bother with GDASRV, yet return s else: p.setPos(autoIncreaseWidth) s = p.textString(returnAsList=True) return s