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
Beispiel #2
0
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