예제 #1
0
    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()
예제 #2
0
    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()
예제 #3
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 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
예제 #4
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 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