"""
Created on Feb 7, 2012

@autor $Author$
@version $Id$

"""
import os
import numpy
import sys
import time 
import datetime
import time
import plplot


def cmap1_init(colormap="gray"):
    
    if colormap == None:
        return
        
    ncolor = None
    rgb_lvl = None
    
    # Routine for defining a specific color map 1 in HLS space.
    # if gray is true, use basic grayscale variation from half-dark to light.
    # otherwise use false color variation from blue (240 deg) to red (360 deg).

    # Independent variable of control points.
    i = numpy.array((0., 1.))
    if colormap=="gray":
        ncolor = 256
        # Hue for control points.  Doesn't matter since saturation is zero.
        h = numpy.array((0., 0.))
        # Lightness ranging from half-dark (for interest) to light.
        l = numpy.array((0.5, 1.))
        # Gray scale has zero saturation
        s = numpy.array((0., 0.))
        
        # number of cmap1 colours is 256 in this case.
        plplot.plscmap1n(ncolor)
        # Interpolate between control points to set up cmap1.
        plplot.plscmap1l(0, i, h, l, s)
        
        return None
    
    if colormap == 'jet':
        ncolor = 256          
        pos = numpy.zeros((ncolor))
        r = numpy.zeros((ncolor))
        g = numpy.zeros((ncolor))
        b = numpy.zeros((ncolor))
        
        for i in range(ncolor):
            if(i <= 35.0/100*(ncolor-1)): rf = 0.0
            elif (i <= 66.0/100*(ncolor-1)): rf = (100.0/31)*i/(ncolor-1) - 35.0/31
            elif (i <= 89.0/100*(ncolor-1)): rf = 1.0
            else: rf = (-100.0/22)*i/(ncolor-1) + 111.0/22
    
            if(i <= 12.0/100*(ncolor-1)): gf = 0.0
            elif(i <= 38.0/100*(ncolor-1)): gf = (100.0/26)*i/(ncolor-1) - 12.0/26
            elif(i <= 64.0/100*(ncolor-1)): gf = 1.0
            elif(i <= 91.0/100*(ncolor-1)): gf = (-100.0/27)*i/(ncolor-1) + 91.0/27
            else: gf = 0.0
    
            if(i <= 11.0/100*(ncolor-1)): bf = (50.0/11)*i/(ncolor-1) + 0.5
            elif(i <= 34.0/100*(ncolor-1)): bf = 1.0
            elif(i <= 65.0/100*(ncolor-1)): bf = (-100.0/31)*i/(ncolor-1) + 65.0/31
            else: bf = 0           
            
            r[i] = rf
            g[i] = gf
            b[i] = bf
        
            pos[i] = float(i)/float(ncolor-1)
        

        plplot.plscmap1n(ncolor)
        plplot.plscmap1l(1, pos, r, g, b)
    
    
    
    if colormap=="br_green":
        ncolor = 256
        # Hue ranges from blue (240 deg) to red (0 or 360 deg)
        h = numpy.array((240., 0.))
        # Lightness and saturation are constant (values taken from C example).
        l = numpy.array((0.6, 0.6))
        s = numpy.array((0.8, 0.8))

        # number of cmap1 colours is 256 in this case.
        plplot.plscmap1n(ncolor)
        # Interpolate between control points to set up cmap1.
        plplot.plscmap1l(0, i, h, l, s)
        
        return None
    
    if colormap=="tricolor":
        ncolor = 3
        # Hue ranges from blue (240 deg) to red (0 or 360 deg)
        h = numpy.array((240., 0.))
        # Lightness and saturation are constant (values taken from C example).
        l = numpy.array((0.6, 0.6))
        s = numpy.array((0.8, 0.8))

        # number of cmap1 colours is 256 in this case.
        plplot.plscmap1n(ncolor)
        # Interpolate between control points to set up cmap1.
        plplot.plscmap1l(0, i, h, l, s)
        
        return None
    
    if colormap == 'rgb' or colormap == 'rgb666':
        
        color_sz = 6
        ncolor = color_sz*color_sz*color_sz
        pos = numpy.zeros((ncolor))
        r = numpy.zeros((ncolor))
        g = numpy.zeros((ncolor))
        b = numpy.zeros((ncolor))
        ind = 0
        for ri in range(color_sz):
            for gi in range(color_sz):
                for bi in range(color_sz):
                    r[ind] = ri/(color_sz-1.0)
                    g[ind] = gi/(color_sz-1.0)
                    b[ind] = bi/(color_sz-1.0)
                    pos[ind] = ind/(ncolor-1.0)
                    ind += 1
        rgb_lvl = [6,6,6]  #Levels for RGB colors
        
    if colormap == 'rgb676':
        ncolor = 6*7*6
        pos = numpy.zeros((ncolor))
        r = numpy.zeros((ncolor))
        g = numpy.zeros((ncolor))
        b = numpy.zeros((ncolor))
        ind = 0
        for ri in range(8):
            for gi in range(8):
                for bi in range(4):
                    r[ind] = ri/(6-1.0)
                    g[ind] = gi/(7-1.0)
                    b[ind] = bi/(6-1.0)
                    pos[ind] = ind/(ncolor-1.0)
                    ind += 1
        rgb_lvl = [6,7,6]  #Levels for RGB colors
    
    if colormap == 'rgb685':
        ncolor = 6*8*5
        pos = numpy.zeros((ncolor))
        r = numpy.zeros((ncolor))
        g = numpy.zeros((ncolor))
        b = numpy.zeros((ncolor))
        ind = 0
        for ri in range(8):
            for gi in range(8):
                for bi in range(4):
                    r[ind] = ri/(6-1.0)
                    g[ind] = gi/(8-1.0)
                    b[ind] = bi/(5-1.0)
                    pos[ind] = ind/(ncolor-1.0)
                    ind += 1
        rgb_lvl = [6,8,5]  #Levels for RGB colors
                    
    if colormap == 'rgb884':
        ncolor = 8*8*4
        pos = numpy.zeros((ncolor))
        r = numpy.zeros((ncolor))
        g = numpy.zeros((ncolor))
        b = numpy.zeros((ncolor))
        ind = 0
        for ri in range(8):
            for gi in range(8):
                for bi in range(4):
                    r[ind] = ri/(8-1.0)
                    g[ind] = gi/(8-1.0)
                    b[ind] = bi/(4-1.0)
                    pos[ind] = ind/(ncolor-1.0)
                    ind += 1
        rgb_lvl = [8,8,4]  #Levels for RGB colors
    
    if ncolor == None:
        raise ValueError, "The colormap selected is not valid"
    
    plplot.plscmap1n(ncolor)
    plplot.plscmap1l(1, pos, r, g, b)
    
    return rgb_lvl

def setColormap(colormap="jet"):
    cmap1_init(colormap)

def savePlplot(filename,width,height):
    curr_strm = plplot.plgstrm()
    save_strm = plplot.plmkstrm()
    plplot.plsetopt("geometry", "%dx%d"%(width,height))
    plplot.plsdev("png")
    plplot.plsfnam(filename)
    plplot.plcpstrm(curr_strm,0)
    plplot.plreplot()
    plplot.plend1()
    plplot.plsstrm(curr_strm)
    

def initPlplot(indexPlot,ncol,nrow,winTitle,width,height):
    plplot.plsstrm(indexPlot)
    plplot.plparseopts([winTitle],plplot.PL_PARSE_FULL)
    plplot.plsetopt("geometry", "%dx%d"%(width*ncol,height*nrow))
    plplot.plsdev("xwin")
    plplot.plscolbg(255,255,255)
    plplot.plscol0(1,0,0,0)
    plplot.plinit()
    plplot.plspause(False)
    plplot.plssub(ncol,nrow)

def setNewPage():
    plplot.plbop()
    plplot.pladv(0)

def closePage():
    plplot.pleop()
    
def clearData(objGraph):
    objGraph.plotBox(objGraph.xrange[0], objGraph.xrange[1], objGraph.yrange[0], objGraph.yrange[1], "bc", "bc")
    
    objGraph.setColor(15) #Setting Line Color to White
    
    if objGraph.datatype == "complex":        
        objGraph.basicXYPlot(objGraph.xdata,objGraph.ydata.real)
        objGraph.basicXYPlot(objGraph.xdata,objGraph.ydata.imag)

    if objGraph.datatype == "real":
        objGraph.basicXYPlot(objGraph.xdata,objGraph.ydata)
    
    objGraph.setColor(1) #Setting Line Color to Black
#    objGraph.setLineStyle(2)
#    objGraph.plotBox(objGraph.xrange[0], objGraph.xrange[1], objGraph.yrange[0], objGraph.yrange[1], "bcntg", "bc")
#    objGraph.setLineStyle(1)

def setStrm(indexPlot):
    plplot.plsstrm(indexPlot)

def plFlush():
    plplot.plflush()

def plShow():
    plplot.plspause(True)
    plplot.plend()
    
def setPlTitle(pltitle,color, szchar=0.7):
    setSubpages(1, 0)
    plplot.pladv(0)
    plplot.plvpor(0., 1., 0., 1.)
    
    if color == "black":
        plplot.plcol0(1)
    if color == "white":
        plplot.plcol0(15)
    
    plplot.plschr(0.0,szchar)
    plplot.plmtex("t",-1., 0.5, 0.5, pltitle)
    
def setSubpages(ncol,nrow):
    plplot.plssub(ncol,nrow)

class BaseGraph:
    
    __name = None
    __xpos = None
    __ypos = None
    __subplot = None
    __xg = None
    __yg = None
    xdata = None
    ydata = None
    getGrid = True
    xaxisIsTime = False
    deltax = None
    xmin = None
    xmax = None
    
    def __init__(self,name,subplot,xpos,ypos,xlabel,ylabel,title,szchar,xrange,yrange,zrange=None,deltax=1.0):
        
        self.setName(name)
        self.setScreenPos(xpos, ypos)
        self.setLabels(xlabel,ylabel,title)
        self.setSubPlot(subplot)
        self.setSizeOfChar(szchar)
        self.setXYZrange(xrange,yrange,zrange)
        self.getGrid = True
        self.xaxisIsTime = False
        self.deltax = deltax
    
    def setXYZrange(self,xrange,yrange,zrange):
        self.xrange = xrange
        self.yrange = yrange
        self.zrange = zrange
        
    def setName(self, name):
        self.__name = name
    
    def setScreenPos(self,xpos,ypos):
        self.__xpos = xpos
        self.__ypos = ypos
    
    def setXYData(self,xdata=None,ydata=None,datatype="real"):
        if((xdata != None) and (ydata != None)):
            self.xdata = xdata
            self.ydata = ydata
            self.datatype = datatype
            
        if((self.xdata == None) and (self.ydata == None)):
            return None
        
        return 1
    
    
    def setLabels(self,xlabel=None,ylabel=None,title=None):
        if xlabel != None: self.xlabel = xlabel
        if ylabel != None: self.ylabel = ylabel
        if title != None: self.title = title
    
    def setSubPlot(self,subplot):
        self.__subplot = subplot
    
    def setSizeOfChar(self,szchar):
        self.__szchar = szchar
        
    def setLineStyle(self,style):
        plplot.pllsty(style)
    
    def setColor(self,color):
        plplot.plcol0(color)
    
    def setXAxisAsTime(self,value=False):
        self.xaxisIsTime = value
    
    def basicLineTimePlot(self, x, y, xmin=None, xmax=None, ymin=None, ymax=None, colline=1):
        
        if xmin == None: xmin = x[0]
        if xmax == None: xmax = x[-1]
        if ymin == None: ymin = y[0]
        if ymax == None: ymax = y[-1]
        
        plplot.plcol0(colline)
        plplot.plline(x, y)
        plplot.plcol0(1)
    
    def basicXYPlot(self, x, y, xmin=None, xmax=None, ymin=None, ymax=None):
        
        if xmin == None: xmin = x[0]
        if xmax == None: xmax = x[-1]
        if ymin == None: ymin = y[0]
        if ymax == None: ymax = y[-1]
        
        plplot.plline(x, y)
    
    def basicPcolorPlot(self, data, x, y, xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None):
        """
        """
        if xmin == None: xmin = x[0]
        if xmax == None: xmax = x[-1]
        if ymin == None: ymin = y[0]
        if ymax == None: ymax = y[-1]
        if zmin == None: zmin = numpy.nanmin(data)
        if zmax == None: zmax = numpy.nanmax(data)
        
        plplot.plimage(data,
                       float(x[0]),
                       float(x[-1]),
                       float(y[0]),
                       float(y[-1]),
                       float(zmin),
                       float(zmax),
                       float(xmin),
                       float(xmax),
                       float(ymin),
                       float(ymax)
                       )
    
    def __getBoxpltr(self, x, y, deltax=None, deltay=None):        
        
        if not(len(x)>0 and len(y)>0):
            raise ValueError, "x axis and y axis are empty"
        
        if deltax == None: deltax = x[-1] - x[-2]
        if deltay == None: deltay = y[-1] - y[-2]
        
        x1 = numpy.append(x, x[-1] + deltax)
        y1 = numpy.append(y, y[-1] + deltay)
        
        xg = (numpy.multiply.outer(x1, numpy.ones(len(y1))))
        yg = (numpy.multiply.outer(numpy.ones(len(x1)), y1))
        
        self.__xg = xg
        self.__yg = yg
        
        return xg, yg
    
    
    def advPcolorPlot(self, data, x, y, xmin=None, xmax=None, ymin=None, ymax=None, zmin=0., zmax=0., deltax=1.0, deltay=None, getGrid = True):
        if getGrid:
            xg, yg = self.__getBoxpltr(x, y, deltax, deltay)
        else:
            xg = self.__xg
            yg = self.__yg    
        
        plplot.plimagefr(data, 
                         float(xmin), 
                         float(xmax), 
                         float(ymin), 
                         float(ymax), 
                         0., 
                         0., 
                         float(zmin), 
                         float(zmax), 
                         plplot.pltr2, 
                         xg, 
                         yg)


    def colorbarPlot(self, xmin=0., xmax=1., ymin=0., ymax=1.):
        data = numpy.arange(256)
        data = numpy.reshape(data, (1,-1))
        
        plplot.plimage(data,
                       float(xmin),
                       float(xmax),
                       float(ymin),
                       float(ymax),
                       0.,
                       255.,
                       float(xmin),
                       float(xmax),
                       float(ymin),
                       float(ymax))

    def plotBox(self, xmin, xmax, ymin, ymax, xopt, yopt, nolabels=False):
        
        plplot.plschr(0.0,self.__szchar-0.05)
        plplot.pladv(self.__subplot)
        plplot.plvpor(self.__xpos[0], self.__xpos[1], self.__ypos[0], self.__ypos[1])
        plplot.plwind(float(xmin), # self.xrange[0]
                      float(xmax), # self.xrange[1]
                      float(ymin), # self.yrange[0]
                      float(ymax) # self.yrange[1]
                      )
        
        
        
        if self.xaxisIsTime:
            plplot.pltimefmt("%H:%M")
            timedelta = (xmax - xmin + 1)/8.
            plplot.plbox(xopt, timedelta, 3, yopt, 0.0, 0)
        else:
            plplot.plbox(xopt, 0.0, 0, yopt, 0.0, 0)
        
        
        if not(nolabels):
            plplot.pllab(self.xlabel, self.ylabel, self.title)


    def delLabels(self):
        self.setColor(15) #Setting Line Color to White
        plplot.pllab(self.xlabel, self.ylabel, self.title)
        self.setColor(1) #Setting Line Color to Black
        
        
    
    def plotImage(self,x,y,z,xrange,yrange,zrange):
        xi = x[0]
        xf = x[-1]
        yi = y[0]
        yf = y[-1]
        
        plplot.plimage(z, 
                       float(xi), 
                       float(xf), 
                       float(yi), 
                       float(yf), 
                       float(zrange[0]), 
                       float(zrange[1]), 
                       float(xi), 
                       float(xf), 
                       float(yrange[0]), 
                       yrange[1])

class LinearPlot:
    linearObjDic = {}
    __xpos = None
    __ypos = None
    def __init__(self,indexPlot,nsubplot,winTitle):
        self.width = 700
        self.height = 150
        ncol = 1
        nrow = nsubplot
        initPlplot(indexPlot,ncol,nrow,winTitle,self.width,self.height)
    
    
    def setFigure(self,indexPlot):
        setStrm(indexPlot)
        
    def setPosition(self): 
        
        xi = 0.07; xf = 0.9 #0.8,0.7,0.5 
        yi = 0.15; yf = 0.8
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__xpos = xpos
        self.__ypos = ypos
        
        return xpos,ypos
    
    def show(self):
        plShow()
        
    def refresh(self):
        plFlush()
        
    def setup(self,subplot,xmin,xmax,ymin,ymax,title,xlabel,ylabel):
        szchar = 1.10
        name = "linear"
        key = name + "%d"%subplot
        xrange = [xmin,xmax]
        yrange = [ymin,ymax]
        
        xpos,ypos = self.setPosition()
        linearObj = BaseGraph(name,subplot,xpos,ypos,xlabel,ylabel,title,szchar,xrange,yrange)
        linearObj.plotBox(linearObj.xrange[0], linearObj.xrange[1], linearObj.yrange[0], linearObj.yrange[1], "bcnst", "bcnstv")
        self.linearObjDic[key] = linearObj
    
    def plot(self,subplot,x,y,type="power"):
        name = "linear"
        key = name + "%d"%subplot
        
        linearObj = self.linearObjDic[key]
        linearObj.plotBox(linearObj.xrange[0], linearObj.xrange[1], linearObj.yrange[0], linearObj.yrange[1], "bcst", "bcst")
        
        if linearObj.setXYData() != None:
                clearData(linearObj)
                
        else:
            if type.lower() == 'simple':
                linearObj.setXYData(x,y,"real")
            if type.lower() == 'power':
                linearObj.setXYData(x,abs(y),"real")
            if type.lower() == 'iq':
                linearObj.setXYData(x,y,"complex")
        
        if type.lower() == 'simple':
            colline = 9
            linearObj.basicLineTimePlot(x, y, xmin, xmax, ymin, ymax, colline)
            linearObj.setXYData(x,y,"real")
        
        if type.lower() == 'power':
            colline = 9
            linearObj.basicLineTimePlot(x, abs(y), xmin, xmax, ymin, ymax, colline)
            linearObj.setXYData(x,abs(y),"real")
        
        if type.lower() == 'iq':
            colline = 9
            linearObj.basicLineTimePlot(x=x, y=y.real, colline=colline)
            colline = 13
            linearObj.basicLineTimePlot(x=x, y=y.imag, colline=colline)
            
            linearObj.setXYData(x,y,"complex")
        
        linearObj.plotBox(linearObj.xrange[0], linearObj.xrange[1], linearObj.yrange[0], linearObj.yrange[1], "bcst", "bcst")
        
        
#        linearObj.plotBox(linearObj.xrange[0], linearObj.xrange[1], linearObj.yrange[0], linearObj.yrange[1], "bc", "bc")
#        linearObj.basicXYPlot(data,y)
#        linearObj.setXYData(data,y)
        
    

class PcolorPlot:
    pcolorObjDic = {}
    colorbarObjDic = {}
    pwprofileObjDic = {}
    showColorbar = None
    showPowerProfile = None
    XAxisAsTime = None
    width = None
    height = None
    __spcxpos = None
    __spcypos = None
    __cmapxpos = None
    __cmapypos = None
    __profxpos = None
    __profypos = None
    __lastTitle = None
    
    def __init__(self,indexPlot,nsubplot,winTitle,colormap,showColorbar,showPowerProfile,XAxisAsTime):
        self.width = 460
        self.height = 300
        self.showColorbar = showColorbar
        self.showPowerProfile = showPowerProfile
        self.XAxisAsTime = XAxisAsTime
        
        
        ncol = int(numpy.sqrt(nsubplot)+0.9)
        nrow = int(nsubplot*1./ncol + 0.9)
        
        initPlplot(indexPlot,ncol,nrow,winTitle,self.width,self.height)
        setColormap(colormap)
        self.ncol = ncol
        self.nrow = nrow

    def setFigure(self,indexPlot):
        setStrm(indexPlot)

    def setSpectraPos(self): #modificar valores de acuerdo al colorbar y pwprofile
        if self.showPowerProfile: xi = 0.09; xf = 0.6 #0.075
        else:   xi = 0.15; xf = 0.8 #0.8,0.7,0.5 
        yi = 0.15; yf = 0.80
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__spcxpos = xpos
        self.__spcypos = ypos
        
        return xpos,ypos
    
    def setColorbarScreenPos(self):
                        
        xi = self.__spcxpos[1] + 0.03; xf = xi + 0.03
        yi = self.__spcypos[0]; yf = self.__spcypos[1]
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__cmapxpos = xpos
        self.__cmapypos = ypos

        return xpos,ypos
    
    def setPowerprofileScreenPos(self):
        
        xi = self.__cmapxpos[1] + 0.07; xf = xi + 0.25
        yi = self.__spcypos[0]; yf = self.__spcypos[1]
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__profxpos = [xi,xf]
        self.__profypos = [yi,yf]

        return xpos,ypos
    
    def createObjects(self,subplot,xmin,xmax,ymin,ymax,zmin,zmax,title,xlabel,ylabel):
        """
        Crea los objetos necesarios para un subplot
        """
        
        # Config Spectra plot
        
        szchar = 0.7
        name = "spc"
        key = name + "%d"%subplot
        xrange = [xmin,xmax]
        yrange = [ymin,ymax]
        zrange = [zmin,zmax]
        
        xpos,ypos = self.setSpectraPos()
        pcolorObj = BaseGraph(name,subplot,xpos,ypos,xlabel,ylabel,title,szchar,xrange,yrange,zrange)
        self.pcolorObjDic[key] = pcolorObj
        
        # Config Colorbar
        if self.showColorbar:
            szchar = 0.65
            name = "colorbar"
            key = name + "%d"%subplot
            
            xpos,ypos = self.setColorbarScreenPos()
            xrange = [0.,1.]
            yrange = [zmin,zmax]
            cmapObj = BaseGraph(name,subplot,xpos,ypos,"","","dB",szchar,xrange,yrange)
            self.colorbarObjDic[key] = cmapObj
        
        # Config Power profile
        if self.showPowerProfile:
            szchar = 0.55
            name = "pwprofile"
            key = name + "%d"%subplot
            
            xpos,ypos = self.setPowerprofileScreenPos()
            xrange = [zmin,zmax]
            yrange = [ymin,ymax]
            powObj = BaseGraph(name,subplot,xpos,ypos,"dB","","Power Profile",szchar,xrange,yrange)
            self.pwprofileObjDic[key] = powObj
    
    def setNewPage(self, pltitle='No title'):
        szchar = 0.7
        setNewPage()
        setPlTitle(pltitle,"black", szchar=szchar)
        setSubpages(self.ncol, self.nrow)
        
    def closePage(self):
        closePage()
        
    def iniPlot(self,subplot):
        """
        Inicializa los subplots con su frame, titulo, etc
        """
        
        # Config Spectra plot
        name = "spc"
        key = name + "%d"%subplot
        
        pcolorObj = self.pcolorObjDic[key]
        pcolorObj.plotBox(pcolorObj.xrange[0], pcolorObj.xrange[1], pcolorObj.yrange[0], pcolorObj.yrange[1], "bcnst", "bcnstv")
        
        # Config Colorbar
        if self.showColorbar:
            name = "colorbar"
            key = name + "%d"%subplot
            
            cmapObj = self.colorbarObjDic[key]
            cmapObj.plotBox(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1], "bc", "bcmtsv")
            cmapObj.colorbarPlot(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1])
#            cmapObj.plotBox(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1], "bc", "bcmtsv")
            
        # Config Power profile
        if self.showPowerProfile:
            name = "pwprofile"
            key = name + "%d"%subplot
            
            powObj = self.pwprofileObjDic[key]
            powObj.setLineStyle(2)
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bcntg", "bc")
            powObj.setLineStyle(1)
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bc", "bc")
    
    def printTitle(self,pltitle):
#        if self.__lastTitle != None:
#            setPlTitle(self.__lastTitle,"white")
#            
#        self.__lastTitle = pltitle
        
        setPlTitle(pltitle,"black")
        
#        setSubpages(self.ncol,self.nrow)
        
    def plot(self,subplot,x,y,z,subtitle):
        # Spectra plot
        
        name = "spc"
        key = name + "%d"%subplot
        
#        newx = [x[0],x[-1]]
        pcolorObj = self.pcolorObjDic[key]
        
        pcolorObj.plotBox(pcolorObj.xrange[0], pcolorObj.xrange[1], pcolorObj.yrange[0], pcolorObj.yrange[1], "bcst", "bcst")
        
        #pcolorObj.delLabels()
        pcolorObj.setLabels(title=subtitle)

        deltax = None; deltay = None
        
        pcolorObj.advPcolorPlot(z, 
                                x,
                                y, 
                                xmin=pcolorObj.xrange[0], 
                                xmax=pcolorObj.xrange[1], 
                                ymin=pcolorObj.yrange[0], 
                                ymax=pcolorObj.yrange[1], 
                                zmin=pcolorObj.zrange[0], 
                                zmax=pcolorObj.zrange[1],
                                deltax=deltax, 
                                deltay=deltay, 
                                getGrid=pcolorObj.getGrid)
        
        #Solo se calcula la primera vez que se ingresa a la funcion
        pcolorObj.getGrid = False
        
        pcolorObj.plotBox(pcolorObj.xrange[0], pcolorObj.xrange[1], pcolorObj.yrange[0], pcolorObj.yrange[1], "bcst", "bcst", nolabels=True)
        
        # Power Profile
        if self.showPowerProfile:
            power = numpy.average(z, axis=0)
            name = "pwprofile"
            key = name + "%d"%subplot
            powObj = self.pwprofileObjDic[key]
            
            if powObj.setXYData() != None:
                #clearData(powObj)
                powObj.setLineStyle(2)
                powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bcntg", "bc")
                powObj.setLineStyle(1)
            else:
                powObj.setXYData(power,y)
            
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bc", "bc")
            powObj.basicXYPlot(power,y)
            powObj.setXYData(power,y)
    
    def savePlot(self,indexPlot,filename):
        
        width = self.width*self.ncol
        hei = self.height*self.nrow
        savePlplot(filename,width,hei)
    
    def refresh(self):
        plFlush()

class RtiPlot:
    
    pcolorObjDic = {}
    colorbarObjDic = {}
    pwprofileObjDic = {}
    showColorbar = None
    showPowerProfile = None
    XAxisAsTime = None
    widht = None
    height = None
    __rtixpos = None
    __rtiypos = None
    __cmapxpos = None
    __cmapypos = None
    __profxpos = None
    __profypos = None
    
    def __init__(self,indexPlot,nsubplot,winTitle,colormap,showColorbar,showPowerProfile,XAxisAsTime):
        self.width = 700
        self.height = 150
        self.showColorbar = showColorbar
        self.showPowerProfile = showPowerProfile
        self.XAxisAsTime = XAxisAsTime
        
        ncol = 1
        nrow = nsubplot
        initPlplot(indexPlot,ncol,nrow,winTitle,self.width,self.height)
        setColormap(colormap)
        self.ncol = ncol
        self.nrow = nrow
    
    def setFigure(self,indexPlot):
        setStrm(indexPlot)
    
    def setRtiScreenPos(self):
                    
        if self.showPowerProfile: xi = 0.07; xf = 0.65
        else:   xi = 0.07; xf = 0.9 
        yi = 0.15; yf = 0.80
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__rtixpos = xpos
        self.__rtiypos = ypos
        
        return xpos,ypos
    
    def setColorbarScreenPos(self):
                        
        xi = self.__rtixpos[1] + 0.03; xf = xi + 0.03
        
        yi = self.__rtiypos[0]; yf = self.__rtiypos[1]
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__cmapxpos = xpos
        self.__cmapypos = ypos

        return xpos,ypos
    
    def setPowerprofileScreenPos(self):
        
        xi = self.__cmapxpos[1] + 0.05; xf = xi + 0.20

        yi = self.__rtiypos[0]; yf = self.__rtiypos[1]
        
        xpos = [xi,xf]
        ypos = [yi,yf]
        
        self.__profxpos = [xi,xf]
        self.__profypos = [yi,yf]

        return xpos,ypos

    def setup(self,subplot,xmin,xmax,ymin,ymax,zmin,zmax,title,xlabel,ylabel,timedata,timezone="lt",npoints=100):
        # Config Rti plot
        szchar = 1.10
        name = "rti"
        key = name + "%d"%subplot
        
        # xmin, xmax --> minHour, max Hour : valores que definen el ejex x=[horaInicio,horaFinal]
        thisDateTime = datetime.datetime.fromtimestamp(timedata)
        startDateTime = datetime.datetime(thisDateTime.year,thisDateTime.month,thisDateTime.day,xmin,0,0)
        endDateTime = datetime.datetime(thisDateTime.year,thisDateTime.month,thisDateTime.day,xmax,59,59)
        deltaTime = 0
        if timezone == "lt":
            deltaTime = time.timezone
        startTimeInSecs = time.mktime(startDateTime.timetuple()) - deltaTime
        endTimeInSecs = time.mktime(endDateTime.timetuple()) - deltaTime
        
        xrange = [startTimeInSecs,endTimeInSecs]
        totalTimeInXrange = endTimeInSecs - startTimeInSecs + 1.
        deltax = totalTimeInXrange / npoints
        
        yrange = [ymin,ymax]
        zrange = [zmin,zmax] 
        
        xpos,ypos = self.setRtiScreenPos()
        pcolorObj = BaseGraph(name,subplot,xpos,ypos,xlabel,ylabel,title,szchar,xrange,yrange,zrange,deltax)
        if self.XAxisAsTime:
            pcolorObj.setXAxisAsTime(self.XAxisAsTime)
            xopt = "bcnstd"
            yopt = "bcnstv"
        else:
            xopt = "bcnst"
            yopt = "bcnstv"
        
        pcolorObj.plotBox(pcolorObj.xrange[0], pcolorObj.xrange[1], pcolorObj.yrange[0], pcolorObj.yrange[1], xopt, yopt)
        self.pcolorObjDic[key] = pcolorObj
        

        # Config Colorbar
        if self.showColorbar:
            szchar = 0.9
            name = "colorbar"
            key = name + "%d"%subplot
            
            xpos,ypos = self.setColorbarScreenPos()
            xrange = [0.,1.]
            yrange = [zmin,zmax]
            cmapObj = BaseGraph(name,subplot,xpos,ypos,"","","dB",szchar,xrange,yrange)
            cmapObj.plotBox(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1], "bc", "bcm")
            cmapObj.colorbarPlot(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1])
            cmapObj.plotBox(cmapObj.xrange[0], cmapObj.xrange[1], cmapObj.yrange[0], cmapObj.yrange[1], "bc", "bcmtsv")
            self.colorbarObjDic[key] = cmapObj
        
        
        # Config Power profile
        if self.showPowerProfile:
            szchar = 0.8
            name = "pwprofile"
            key = name + "%d"%subplot
            
            xpos,ypos = self.setPowerprofileScreenPos()
            xrange = [zmin,zmax]
            yrange = [ymin,ymax]
            powObj = BaseGraph(name,subplot,xpos,ypos,"dB","","Power Profile",szchar,xrange,yrange)
            powObj.setLineStyle(2)
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bcntg", "bc")
            powObj.setLineStyle(1)
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bc", "bc")
            self.pwprofileObjDic[key] = powObj

    
    def plot(self,subplot,x,y,z):
        # RTI plot
        name = "rti"
        key = name + "%d"%subplot
        
        data = numpy.reshape(z, (1,-1))
        data = numpy.abs(data)
        data = 10*numpy.log10(data)
        newx = [x,x+1]
        
        pcolorObj = self.pcolorObjDic[key]
        
        if pcolorObj.xaxisIsTime:
            xopt = "bcstd"
            yopt = "bcst"
        else:
            xopt = "bcst"
            yopt = "bcst"
            
        pcolorObj.plotBox(pcolorObj.xrange[0], pcolorObj.xrange[1], pcolorObj.yrange[0], pcolorObj.yrange[1], xopt, yopt)
        
        deltax = pcolorObj.deltax
        deltay = None
        
        if pcolorObj.xmin == None and pcolorObj.xmax == None:
            pcolorObj.xmin = x
            pcolorObj.xmax = x
        
        if x >= pcolorObj.xmax:
            xmin = x
            xmax = x + deltax
            x = [x]
            pcolorObj.advPcolorPlot(data, 
                                    x, 
                                    y, 
                                    xmin=xmin, 
                                    xmax=xmax, 
                                    ymin=pcolorObj.yrange[0], 
                                    ymax=pcolorObj.yrange[1], 
                                    zmin=pcolorObj.zrange[0], 
                                    zmax=pcolorObj.zrange[1],
                                    deltax=deltax, 
                                    deltay=deltay, 
                                    getGrid=pcolorObj.getGrid)
            
            pcolorObj.xmin = xmin
            pcolorObj.xmax = xmax
            
        
        # Power Profile
        if self.showPowerProfile:
            data = numpy.reshape(data,(numpy.size(data)))
            name = "pwprofile"
            key = name + "%d"%subplot
            powObj = self.pwprofileObjDic[key]
            
            if powObj.setXYData() != None:
                clearData(powObj)
                powObj.setLineStyle(2)
                powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bcntg", "bc")
                powObj.setLineStyle(1)
            else:
                powObj.setXYData(data,y)
            
            powObj.plotBox(powObj.xrange[0], powObj.xrange[1], powObj.yrange[0], powObj.yrange[1], "bc", "bc")
            powObj.basicXYPlot(data,y)
            powObj.setXYData(data,y)
            
    def savePlot(self,indexPlot,filename):
        
        width = self.width*self.ncol
        hei = self.height*self.nrow
        savePlplot(filename,width,hei)
        
    def refresh(self):
        plFlush()

if __name__ == '__main__':
    
    #Setting the signal
    fs = 8000
    f0 = 200
    f1 = 400
    T = 1./fs
    x = numpy.arange(160)
    y1 = numpy.sin(2*numpy.pi*f0*x*T)
    y2 = numpy.sin(2*numpy.pi*f1*x*T)
    signalList = [y1,y2]
    
    xmin = numpy.min(x)
    xmax = numpy.max(x)
    ymin = numpy.min(y1)
    ymax = numpy.max(y1)
    
    # Creating Object
    indexPlot = 1
    nsubplot = 2
    winTitle = "mi grafico v1"
    
    subplotTitle = "subplot - No."
    xlabel = ""
    ylabel = ""
    
    linearObj = LinearPlot(indexPlot,nsubplot,winTitle)
    
    #Config SubPlots
    for subplot in range(nsubplot):
        indexplot = subplot + 1
        title = subplotTitle + '%d'%indexplot
        linearObj.setup(indexplot, xmin, xmax, ymin, ymax, title, xlabel, ylabel)
    
    #Plotting
    type = "simple"
    for subplot in range(nsubplot):
        indexplot = subplot + 1
        y = signalList[subplot]
        linearObj.plot(indexplot, x, y, type)
        
    linearObj.refresh()
    linearObj.show()

    print "end"