def eps(self, fName=None, width=500, putInternalNodeNamesOnBranches=0): """Make a basic eps drawing of self. The 'width' is in postscript points. By default, internal node names label the node, where the node name goes on the right of the node. You can make the node name label the branch by setting 'putInternalNodeNamesOnBranches'. """ gm = ['Tree.eps()'] if not self.preAndPostOrderAreValid: self.setPreAndPostOrder() from treepicture import TreePicture p = TreePicture(self) p.addToBrLen = 0.0 p.width = width p.yScale = 17.0 p.xScale = None p.pointsPerLetter = 6.0 p.textSize = 11 p.labelTextSize = 8 p.putInternalNodeNamesOnBranches = putInternalNodeNamesOnBranches p.xOrigin = 5.0 p._setPos() s = p.vectorString() if not fName: if self.name: fName = '%s.eps' % self.name else: fName = '%i.eps' % os.getpid() # if not fName.endswith('.eps'): # fName = '%s.eps' % fName f = open(fName, 'w') f.write(s) f.close()
def eps(self, fName=None, width=500, putInternalNodeNamesOnBranches=0): """Make a basic eps drawing of self. The 'width' is in postscript points. By default, internal node names label the node, where the node name goes on the right of the node. You can make the node name label the branch by setting 'putInternalNodeNamesOnBranches'. """ gm = ['Tree.eps()'] if not self.preAndPostOrderAreValid: self.setPreAndPostOrder() from treepicture import TreePicture p = TreePicture(self) p.addToBrLen = 0.0 p.width = width p.yScale = 17.0 p.xScale = None p.pointsPerLetter = 6.0 p.textSize = 11 p.labelTextSize = 8 p.putInternalNodeNamesOnBranches = putInternalNodeNamesOnBranches p.xOrigin = 5.0 p._setPos() s = p.vectorString() if not fName: if self.name: fName = '%s.eps' % self.name else: fName = '%i.eps' % os.getpid() # if not fName.endswith('.eps'): # fName = '%s.eps' % fName f = file(fName, 'w') f.write(s) f.close()
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 P4Error(gm) if model: try: partNum = int(partNum) except: gm.append("partNum arg should be an integer.") raise P4Error(gm) if not self.model: gm.append("If model arg is set, then self.model must exist.") raise P4Error(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 P4Error(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 P4Error(gm) if model: try: partNum = int(partNum) except: gm.append("partNum arg should be an integer.") raise P4Error(gm) if not self.model: gm.append("If model arg is set, then self.model must exist.") raise P4Error(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 P4Error(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