diff --git a/schainpy/Graphics/BaseGraph.py b/schainpy/Graphics/BaseGraph.py index 12a8628..74d4b52 100644 --- a/schainpy/Graphics/BaseGraph.py +++ b/schainpy/Graphics/BaseGraph.py @@ -14,122 +14,59 @@ class BaseGraph: """ - hasNotRange = True - - xrange = None - yrange = None - zrange = None - - xlabel = None - ylabel = None - title = None - - legends = None - - __name = None - __subpage = None - __szchar = None - - __colormap = None - __colbox = None - __colleg = None - - __xpos = None - __ypos = None - - __xopt = None #"bcnst" - __yopt = None #"bcnstv" - - __xlpos = None - __ylpos = None - - __xrangeIsTime = False - - #Advanced - __xg = None - __yg = None + def __init__(self): """ """ - pass - - def hasNotXrange(self): + self.hasNotRange = True - if self.xrange == None: - return 1 + self.xrange = None + self.yrange = None + self.zrange = None - return 0 - - def hasNotYrange(self): + self.xlabel = None + self.ylabel = None + self.title = None - if self.yrange == None: - return 1 + self.legends = None - return 0 - - def hasNotZrange(self): + self.__name = None + + self.__colormap = None + self.__colbox = None + self.__colleg = None + + self.__xpos = None + self.__ypos = None - if self.zrange == None: - return 1 + self.__xopt = None #"bcnst" + self.__yopt = None #"bcnstv" + + self.__xlpos = None + self.__ylpos = None + + self.__xrangeIsTime = False + + #Advanced + self.__xg = None + self.__yg = None - return 0 def setName(self, name): self.__name = name def setScreenPos(self, xpos, ypos): self.__xpos = xpos self.__ypos = ypos - - def setScreenPosbyWidth(self, xoff, yoff, xw, yw): - self.__xpos = [xoff, xoff + xw] - self.__ypos = [yoff, yoff + yw] - - def setSubpage(self, subpage): - self.__subpage = subpage - - def setSzchar(self, szchar): - self.__szchar = szchar def setOpt(self, xopt, yopt): self.__xopt = xopt self.__yopt = yopt - - def setRanges(self, xrange, yrange, zrange=None): - """ - """ - self.xrange = xrange - - self.yrange = yrange - - if zrange != None: - self.zrange = zrange - - self.hasNotRange = False - - def setColormap(self, colormap=None): - if colormap == None: - colormap = self.__colormap - - cmap1_init(colormap) - def setXAxisAsTime(self): self.__xrangeIsTime = True - - def plotBox(self): - """ - - """ - plplot.plvpor(self.__xpos[0], self.__xpos[1], self.__ypos[0], self.__ypos[1]) - plplot.plwind(float(self.xrange[0]), - float(self.xrange[1]), - float(self.yrange[0]), - float(self.yrange[1]) - ) - plplot.plbox(self.__xopt, 0.0, 0, self.__yopt, 0.0, 0) - plplot.pllab(self.xlabel, self.ylabel, self.title) + def setup(self, title=None, xlabel=None, ylabel=None, colormap=None): """ @@ -138,64 +75,63 @@ class BaseGraph: self.xlabel = xlabel self.ylabel = ylabel self.__colormap = colormap - - def initSubpage(self): - - if plplot.plgdev() == '': - raise ValueError, "Plot device has not been initialize" - - plplot.pladv(self.__subpage) - plplot.plschr(0.0, self.__szchar) + + def plotBox(self, xmin, xmax, ymin, ymax): + """ + """ if self.__xrangeIsTime: plplot.pltimefmt("%H:%M") - self.setColormap() - self.initPlot() - - def initPlot(self): - """ - - """ - if plplot.plgdev() == '': - raise ValueError, "Plot device has not been initialize" - - xrange = self.xrange - if xrange == None: - xrange = [0., 1.] - - yrange = self.yrange - if yrange == None: - yrange = [0., 1.] - - self.plotBox() + plplot.plvpor(self.__xpos[0], self.__xpos[1], self.__ypos[0], self.__ypos[1]) + plplot.plwind(float(xmin), + float(xmax), + float(ymin), + float(ymax) + ) + plplot.plbox(self.__xopt, 0.0, 0, self.__yopt, 0.0, 0) + plplot.pllab(self.xlabel, self.ylabel, self.title) + - def colorbarPlot(self): + def colorbarPlot(self, xmin=0., xmax=1., ymin=0., ymax=1.): data = numpy.arange(256) data = numpy.reshape(data, (1,-1)) - self.plotBox() + self.plotBox(xmin, xmax, ymin, ymax) plplot.plimage(data, - self.xrange[0], - self.xrange[1], - self.yrange[0], - self.yrange[1], + float(xmin), + float(xmax), + float(ymin), + float(ymax), 0., 255., - self.xrange[0], - self.xrange[1], - self.yrange[0], - self.yrange[1],) + float(xmin), + float(xmax), + float(ymin), + float(ymax)) + + 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] - def basicXYPlot(self, x, y): - self.plotBox() plplot.plline(x, y) def basicXYwithErrorPlot(self): pass - def basicLineTimePlot(self): - pass + 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 basicPcolorPlot(self, data, x, y, xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None): """ @@ -207,7 +143,6 @@ class BaseGraph: if zmin == None: zmin = numpy.nanmin(data) if zmax == None: zmax = numpy.nanmax(data) - self.plotBox() plplot.plimage(data, float(x[0]), float(x[-1]), @@ -248,6 +183,129 @@ class BaseGraph: plplot.plimagefr(data, x[0], x[-1], y[0], y[-1], 0., 0., zmin, zmax, plplot.pltr2, self.__xg, self.__yg) +class LinearPlot(): + + __szchar = 1.0 + __xrange = None + __yrange = None + + m_BaseGraph = None + + def __init__(self): + + + key = "linearplot" + self.m_BaseGraph = BaseGraph() + self.m_BaseGraph.setName(key) + + def setColormap(self, colormap="br_green"): + + if colormap == None: + colormap = self.__colormap + + cmap1_init(colormap) + + def iniSubpage(self): + + if plplot.plgdev() == '': + raise ValueError, "Plot device has not been initialize" + + plplot.pladv(self.__subpage) + plplot.plschr(0.0, self.__szchar) + + self.setColormap() + + def setScreenPos(self, width='small'): + + if width == 'small': + xi = 0.12; yi = 0.14; xw = 0.78; yw = 0.80 + + if width == 'medium': + xi = 0.07; yi = 0.10; xw = 0.90; yw = 0.60 + + xf = xi + xw + yf = yi + yw + + self.m_BaseGraph.setScreenPos([xi, xf], [yi, yf]) + + def setup(self, subpage, title="", xlabel="", ylabel="", XAxisAsTime=False): + """ + """ + + self.m_BaseGraph.setOpt("bcnts","bcntsv") + self.m_BaseGraph.setup(title, + xlabel, + ylabel + ) + + self.setScreenPos(width='medium') + + if XAxisAsTime: + self.m_BaseGraph.setXAxisAsTime() + + self.__subpage = subpage +# def setRanges(self, xrange, yrange, zrange): +# +# self.m_BaseGraph.setRanges(xrange, yrange, zrange) + + def plotData(self, x, y=None, xmin=None, xmax=None, ymin=None, ymax=None, colline=1): + """ + Inputs: + + x : Numpy array of dimension 1 + y : Numpy array of dimension 1 + + """ + + try: + nX = numpy.shape(x) + except: + raise ValueError, "x is not a numpy array" + + if y == None: y = numpy.arange(nX) + + if xmin == None: xmin = x[0] + if xmax == None: xmax = x[-1] + if ymin == None: ymin = y[0] + if ymax == None: ymax = y[-1] + + self.m_BaseGraph.plotBox(xmin, xmax, ymin, ymax) + self.m_BaseGraph.basicLineTimePlot(x, y, xmin, xmax, ymin, ymax, colline) + + def plotComplexData(self, x, y, xmin=None, xmax=None, ymin=None, ymax=None, colline=1, type='power'): + """ + Inputs: + + x : Numpy array of dimension 1 + y : Complex numpy array of dimension 1 + + """ + + try: + nX = numpy.shape(x) + except: + raise ValueError, "x is not a numpy array" + + try: + nY = numpy.shape(y) + except: + raise ValueError, "y is not a numpy array" + + if xmin == None: xmin = x[0] + if xmax == None: xmax = x[-1] + if ymin == None: ymin = y[0] + if ymax == None: ymax = y[-1] + + self.m_BaseGraph.plotBox(xmin, xmax, ymin, ymax) + + if type.lower() == 'power': + self.m_BaseGraph.basicLineTimePlot(x, abs(y), xmin, xmax, ymin, ymax, colline) + + if type.lower() == 'iq': + + self.m_BaseGraph.basicLineTimePlot(x, y.real, xmin, xmax, ymin, ymax, colline) + self.m_BaseGraph.basicLineTimePlot(x, y.imag, xmin, xmax, ymin, ymax, colline+1) + class ColorPlot(): @@ -275,7 +333,7 @@ class ColorPlot(): self.m_BaseGraph.setSubpage(subpage) self.m_BaseGraph.setSzchar(self.__szchar) - self.m_BaseGraph.setOpt("bcnts","bcnts") + self.m_BaseGraph.setOpt("bcnts","bcntsv") self.m_BaseGraph.setup(title, xlabel, ylabel, @@ -315,14 +373,14 @@ class ColorPlot(): self.showColorbar = showColorbar self.showPowerProfile = showPowerProfile - self.setPos() + self.setScreenPos() if XAxisAsTime: self.m_BaseGraph.setXAxisAsTime() - #self.setPos(xi = 0.05, yi = 0.18, xw = 0.92, yw = 0.74, xcmapw = 0.015, xpoww = 0.14, deltaxcmap = 0.01, deltaxpow = 0.02) + #self.setScreenPos(xi = 0.05, yi = 0.18, xw = 0.92, yw = 0.74, xcmapw = 0.015, xpoww = 0.14, deltaxcmap = 0.01, deltaxpow = 0.02) - def setPos(self, xi = 0.12, yi = 0.14, xw = 0.78, yw = 0.80, xcmapw = 0.05, xpoww = 0.24, deltaxcmap = 0.02, deltaxpow = 0.06): + def setScreenPos(self, xi = 0.12, yi = 0.14, xw = 0.78, yw = 0.80, xcmapw = 0.05, xpoww = 0.24, deltaxcmap = 0.02, deltaxpow = 0.06): if self.showColorbar: xw -= xcmapw + deltaxcmap @@ -409,67 +467,6 @@ class ColorPlot(): powObj = self.graphObjDict[key] powObj.basicXYPlot(power, heis) -class LinearPlot(): - - __szchar = 0.7 - __xrange = None - __yrange = None - - m_BaseGraph = BaseGraph() - - def __init__(self): - - key = "linearplot" - self.m_BaseGraph.setName(key) - - self.graphObjDict[key] = self.m_BaseGraph - - def setup(self, subpage, title="", xlabel="", ylabel="", colormap="jet", XAxisAsTime=False): - """ - """ - - self.m_BaseGraph.setSubpage(subpage) - self.m_BaseGraph.setSzchar(self.__szchar) - self.m_BaseGraph.setOpt("bcnts","bcnts") - self.m_BaseGraph.setup(title, - xlabel, - ylabel, - colormap) - - self.setPos() - - if XAxisAsTime: - self.m_BaseGraph.setXAxisAsTime() - #self.setPos(xi = 0.05, yi = 0.18, xw = 0.92, yw = 0.74, xcmapw = 0.015, xpoww = 0.14, deltaxcmap = 0.01, deltaxpow = 0.02) - - - def setPos(self, xi = 0.12, yi = 0.14, xw = 0.78, yw = 0.80): - - xf = xi + xw - yf = yi + yw - - self.m_BaseGraph.setScreenPos([xi, xf], [yi, yf]) - - def setRanges(self, xrange, yrange, zrange): - - self.m_BaseGraph.setRanges(xrange, yrange, zrange) - - def plotData(self, x, y): - """ - """ - xmin = x[0] - xmax = x[-1] - - ymin = y[0] - ymax = y[-1] - - if self.m_BaseGraph.hasNotRange: - self.setRanges([xmin, xmax], [ymin,ymax]) - - self.m_BaseGraph.initSubpage() - self.m_BaseGraph.basicLineTimePlot(x, y) - - def cmap1_init(colormap="gray"): ncolor = None diff --git a/schainpy/Graphics/VoltagePlot.py b/schainpy/Graphics/VoltagePlot.py index a858d5d..1ae3ef2 100644 --- a/schainpy/Graphics/VoltagePlot.py +++ b/schainpy/Graphics/VoltagePlot.py @@ -11,39 +11,118 @@ import plplot path = os.path.split(os.getcwd())[0] sys.path.append(path) -from Graphics.BasicGraph import * +from Graphics.BaseGraph import * from Model.Voltage import Voltage class Osciloscope(): - graphObjDict = {} - showPower = True - - __szchar = 0.7 - __xrange = None - __yrange = None - __zrange = None - - def __init__(self): - key = "osc" + def __init__(self, Voltage): - baseObj = BasicGraph() - baseObj.setName(key) + """ - self.graphObjDict[key] = baseObj + Inputs: + + type: "power" ->> Potencia + "iq" ->> Real + Imaginario + """ + + self.__isPlotConfig = False + + self.__isPlotIni = False + + self.__xrange = None + + self.__yrange = None + + self.m_Voltage = None + + self.nGraphs = 0 + + self.graphObjList = [] + + self.m_Voltage = Voltage - def setup(self, subpage, title="", xlabel="", ylabel="", colormap="jet", showColorbar=False, showPowerProfile=False): - pass - - def setRanges(self, xrange, yrange, zrange): - pass + def __addGraph(self, subpage, title="", xlabel="", ylabel="", XAxisAsTime=False): + + graphObj = LinearPlot() + graphObj.setup(subpage, title="", xlabel="", ylabel="", XAxisAsTime=False) + #graphObj.setScreenPos() + + self.graphObjList.append(graphObj) + + del graphObj - def plotData(self, data , xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None): - pass +# def setXRange(self, xmin, xmax): +# self.__xrange = (xmin, xmax) +# +# def setYRange(self, ymin, ymax): +# self.__yrange = (ymin, ymax) + + def setup(self, titleList=None, xlabelList=None, ylabelList=None, XAxisAsTime=False): + + nChan = int(self.m_Voltage.m_SystemHeader.numChannels) + + myTitle = "" + myXlabel = "" + myYlabel = "" + + for i in range(nChan): + if titleList != None: + myTitle = titleList[i] + myXlabel = xlabelList[i] + myYlabel = ylabelList[i] + + self.__addGraph(i+1, title=myTitle, xlabel=myXlabel, ylabel=myYlabel, XAxisAsTime=XAxisAsTime) + + self.nGraphs = nChan + self.__isPlotConfig = True + def iniPlot(self): + plplot.plsetopt("geometry", "%dx%d" %(700, 115*self.nGraphs)) + plplot.plsdev("xcairo") + plplot.plscolbg(255,255,255) + plplot.plscol0(1,0,0,0) + plplot.plinit() + plplot.plspause(False) + plplot.plssub(1, self.nGraphs) + + self.__isPlotIni = True + + def plotData(self, xmin=None, xmax=None, ymin=None, ymax=None, idProfile=None, titleList=None, xlabelList=None, ylabelList=None, XAxisAsTime=False, type='iq'): + + if idProfile != None and idProfile != self.m_Voltage.idProfile: + return + + if not(self.__isPlotConfig): + self.setup(titleList, xlabelList, ylabelList, XAxisAsTime) + + if not(self.__isPlotIni): + self.iniPlot() + + data = self.m_Voltage.data + + x = self.m_Voltage.heights + + if xmin == None: xmin = x[0] + if xmax == None: xmax = x[-1] + if ymin == None: ymin = numpy.nanmin(abs(data)) + if ymax == None: ymax = numpy.nanmax(abs(data)) + + plplot.plbop() + for i in range(self.nGraphs): + y = data[:,i] + + self.graphObjList[i].iniSubpage() + self.graphObjList[i].plotComplexData(x, y, xmin, xmax, ymin, ymax, 8, type) + + plplot.plflush() + plplot.pleop() + def end(self): + plplot.plend() + class VoltagePlot(object): ''' classdocs diff --git a/schainpy/IO/Correlation.py b/schainpy/IO/CorrelationIO.py similarity index 84% rename from schainpy/IO/Correlation.py rename to schainpy/IO/CorrelationIO.py index 6eed3c0..78e58dd 100644 --- a/schainpy/IO/Correlation.py +++ b/schainpy/IO/CorrelationIO.py @@ -5,8 +5,8 @@ Created on 23/01/2012 @version $Id$ ''' -from Data import DataReader -from Data import DataWriter +from DataIO import DataReader +from DataIO import DataWriter class CorrelationReader(DataReader): def __init__(self): diff --git a/schainpy/IO/Data.py b/schainpy/IO/DataIO.py similarity index 100% rename from schainpy/IO/Data.py rename to schainpy/IO/DataIO.py diff --git a/schainpy/IO/Header.py b/schainpy/IO/HeaderIO.py similarity index 73% rename from schainpy/IO/Header.py rename to schainpy/IO/HeaderIO.py index 664f9f8..ce02d6e 100644 --- a/schainpy/IO/Header.py +++ b/schainpy/IO/HeaderIO.py @@ -7,43 +7,6 @@ Created on 23/01/2012 import numpy -class PROCFLAG: - COHERENT_INTEGRATION = numpy.uint32(0x00000001) - DECODE_DATA = numpy.uint32(0x00000002) - SPECTRA_CALC = numpy.uint32(0x00000004) - INCOHERENT_INTEGRATION = numpy.uint32(0x00000008) - POST_COHERENT_INTEGRATION = numpy.uint32(0x00000010) - SHIFT_FFT_DATA = numpy.uint32(0x00000020) - - DATATYPE_CHAR = numpy.uint32(0x00000040) - DATATYPE_SHORT = numpy.uint32(0x00000080) - DATATYPE_LONG = numpy.uint32(0x00000100) - DATATYPE_INT64 = numpy.uint32(0x00000200) - DATATYPE_FLOAT = numpy.uint32(0x00000400) - DATATYPE_DOUBLE = numpy.uint32(0x00000800) - - DATAARRANGE_CONTIGUOUS_CH = numpy.uint32(0x00001000) - DATAARRANGE_CONTIGUOUS_H = numpy.uint32(0x00002000) - DATAARRANGE_CONTIGUOUS_P = numpy.uint32(0x00004000) - - SAVE_CHANNELS_DC = numpy.uint32(0x00008000) - DEFLIP_DATA = numpy.uint32(0x00010000) - DEFINE_PROCESS_CODE = numpy.uint32(0x00020000) - - ACQ_SYS_NATALIA = numpy.uint32(0x00040000) - ACQ_SYS_ECHOTEK = numpy.uint32(0x00080000) - ACQ_SYS_ADRXD = numpy.uint32(0x000C0000) - ACQ_SYS_JULIA = numpy.uint32(0x00100000) - ACQ_SYS_XXXXXX = numpy.uint32(0x00140000) - - EXP_NAME_ESP = numpy.uint32(0x00200000) - CHANNEL_NAMES_ESP = numpy.uint32(0x00400000) - - OPERATION_MASK = numpy.uint32(0x0000003F) - DATATYPE_MASK = numpy.uint32(0x00000FC0) - DATAARRANGE_MASK = numpy.uint32(0x00007000) - ACQ_SYS_MASK = numpy.uint32(0x001C0000) - class BasicHeader: def __init__(self): @@ -314,4 +277,41 @@ class ProcessingHeader: obj.numBaud = self.numBaud obj.codes = self.codes - return obj \ No newline at end of file + return obj + +class PROCFLAG: + COHERENT_INTEGRATION = numpy.uint32(0x00000001) + DECODE_DATA = numpy.uint32(0x00000002) + SPECTRA_CALC = numpy.uint32(0x00000004) + INCOHERENT_INTEGRATION = numpy.uint32(0x00000008) + POST_COHERENT_INTEGRATION = numpy.uint32(0x00000010) + SHIFT_FFT_DATA = numpy.uint32(0x00000020) + + DATATYPE_CHAR = numpy.uint32(0x00000040) + DATATYPE_SHORT = numpy.uint32(0x00000080) + DATATYPE_LONG = numpy.uint32(0x00000100) + DATATYPE_INT64 = numpy.uint32(0x00000200) + DATATYPE_FLOAT = numpy.uint32(0x00000400) + DATATYPE_DOUBLE = numpy.uint32(0x00000800) + + DATAARRANGE_CONTIGUOUS_CH = numpy.uint32(0x00001000) + DATAARRANGE_CONTIGUOUS_H = numpy.uint32(0x00002000) + DATAARRANGE_CONTIGUOUS_P = numpy.uint32(0x00004000) + + SAVE_CHANNELS_DC = numpy.uint32(0x00008000) + DEFLIP_DATA = numpy.uint32(0x00010000) + DEFINE_PROCESS_CODE = numpy.uint32(0x00020000) + + ACQ_SYS_NATALIA = numpy.uint32(0x00040000) + ACQ_SYS_ECHOTEK = numpy.uint32(0x00080000) + ACQ_SYS_ADRXD = numpy.uint32(0x000C0000) + ACQ_SYS_JULIA = numpy.uint32(0x00100000) + ACQ_SYS_XXXXXX = numpy.uint32(0x00140000) + + EXP_NAME_ESP = numpy.uint32(0x00200000) + CHANNEL_NAMES_ESP = numpy.uint32(0x00400000) + + OPERATION_MASK = numpy.uint32(0x0000003F) + DATATYPE_MASK = numpy.uint32(0x00000FC0) + DATAARRANGE_MASK = numpy.uint32(0x00007000) + ACQ_SYS_MASK = numpy.uint32(0x001C0000) \ No newline at end of file diff --git a/schainpy/IO/Spectra.py b/schainpy/IO/SpectraIO.py similarity index 85% rename from schainpy/IO/Spectra.py rename to schainpy/IO/SpectraIO.py index 76d00f1..ee8361a 100644 --- a/schainpy/IO/Spectra.py +++ b/schainpy/IO/SpectraIO.py @@ -6,8 +6,8 @@ Created on 23/01/2012 ''' from Header import * -from Data import DataReader -from Data import DataWriter +from DataIO import DataReader +from DataIO import DataWriter class SpectraReader(DataReader): diff --git a/schainpy/IO/Voltage.py b/schainpy/IO/Voltage.py deleted file mode 100644 index bf5b891..0000000 --- a/schainpy/IO/Voltage.py +++ /dev/null @@ -1,626 +0,0 @@ -''' -Created on 23/01/2012 - -@author $Author$ -@version $Id$ -''' - -import os, sys -import numpy -import glob -import fnmatch -import time -import datetime - -path = os.path.split(os.getcwd())[0] -sys.path.append(path) - -from IO.Header import * -from IO.Data import DataReader -from IO.Data import DataWriter - -from Model.Voltage import Voltage - -class VoltageReader(DataReader): - - def __init__(self, m_Voltage = None): - - if m_Voltage == None: - m_Voltage = Voltage() - - self.m_Voltage = m_Voltage - - self.__idFile = None - - self.__fp = None - - self.__startDateTime = None - - self.__endDateTime = None - - self.__dataType = None - - self.__fileSizeByHeader = 0 - - self.__pathList = [] - - self.filenameList = [] - - self.__lastUTTime = 0 - - self.__maxTimeStep = 5 - - self.__flagIsNewFile = 0 - - self.__ippSeconds = 0 - - self.flagResetProcessing = 0 - - self.flagIsNewBlock = 0 - - self.noMoreFiles = 0 - - self.nReadBlocks = 0 - - self.online = 0 - - self.filename = None - - self.fileSize = None - - self.firstHeaderSize = 0 - - self.basicHeaderSize = 24 - - self.m_BasicHeader = BasicHeader() - - self.m_SystemHeader = SystemHeader() - - self.m_RadarControllerHeader = RadarControllerHeader() - - self.m_ProcessingHeader = ProcessingHeader() - - self.__buffer = 0 - - self.__buffer_id = 9999 - - def __rdSystemHeader(self,fp=None): - if fp == None: - fp = self.__fp - - self.m_SystemHeader.read(fp) - - def __rdRadarControllerHeader(self,fp=None): - if fp == None: - fp = self.__fp - - self.m_RadarControllerHeader.read(fp) - - def __rdProcessingHeader(self,fp=None): - if fp == None: - fp = self.__fp - - self.m_ProcessingHeader.read(fp) - - def __searchFiles(self,path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r"): - - print "Searching files ..." - - startUtSeconds = time.mktime(startDateTime.timetuple()) - endUtSeconds = time.mktime(endDateTime.timetuple()) - -# startYear = startDateTime.timetuple().tm_year -# endYear = endDateTime.timetuple().tm_year -# -# startDoy = startDateTime.timetuple().tm_yday -# endDoy = endDateTime.timetuple().tm_yday -# -# yearRange = range(startYear,endYear+1) -# -# doyDoubleList = [] -# if startYear == endYear: -# doyList = range(startDoy,endDoy+1) -# else: -# for year in yearRange: -# if (year == startYear): -# doyDoubleList.append(range(startDoy,365+1)) -# elif (year == endYear): -# doyDoubleList.append(range(1,endDoy+1)) -# else: -# doyDoubleList.append(range(1,365+1)) -# doyList = [] -# for list in doyDoubleList: -# doyList = doyList + list -# -# dirList = [] -# for thisPath in os.listdir(path): -# if os.path.isdir(os.path.join(path,thisPath)): -# #dirList.append(os.path.join(path,thisPath)) -# dirList.append(thisPath) -# -# pathList = [] -# pathDict = {} -# for year in yearRange: -# for doy in doyList: -# match = fnmatch.filter(dirList, 'D' + '%4.4d%3.3d' % (year,doy)) -# if len(match) == 0: -# match = fnmatch.filter(dirList, 'd' + '%4.4d%3.3d' % (year,doy)) -# if len(match) == 0: continue -# if expLabel == '': -# pathList.append(os.path.join(path,match[0])) -# pathDict.setdefault(os.path.join(path,match[0])) -# pathDict[os.path.join(path,match[0])] = [] -# else: -# pathList.append(os.path.join(path,os.path.join(match[0],expLabel))) -# pathDict.setdefault(os.path.join(path,os.path.join(match[0],expLabel))) -# pathDict[os.path.join(path,os.path.join(match[0],expLabel))] = [] - - - dirList = [] - for thisPath in os.listdir(path): - if os.path.isdir(os.path.join(path,thisPath)): - dirList.append(thisPath) - - pathList = [] - - thisDateTime = startDateTime - - while(thisDateTime <= endDateTime): - year = thisDateTime.timetuple().tm_year - doy = thisDateTime.timetuple().tm_yday - - match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) - if len(match) == 0: - thisDateTime += datetime.timedelta(1) - continue - - pathList.append(os.path.join(path,match[0],expLabel)) - thisDateTime += datetime.timedelta(1) - - filenameList = [] - for thisPath in pathList: - fileList = glob.glob1(thisPath, "*%s" %ext) - #pathDict[thisPath].append(fileList) - fileList.sort() - for file in fileList: - filename = os.path.join(thisPath,file) - if self.isThisFileinRange(filename, startUtSeconds, endUtSeconds): - filenameList.append(filename) - - self.filenameList = filenameList - - return pathList, filenameList - - def isThisFileinRange(self, filename, startUTSeconds=None, endUTSeconds=None): - - try: - fp = open(filename,'rb') - except: - raise IOError, "The file %s can't be opened" %(filename) - - if startUTSeconds==None: - startUTSeconds = self.startUTCSeconds - - if endUTSeconds==None: - endUTSeconds = self.endUTCSeconds - - m_BasicHeader = BasicHeader() - - if not(m_BasicHeader.read(fp)): - return 0 - - fp.close() - - if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds >= m_BasicHeader.utc)): - return 0 - - return 1 - - def __readBasicHeader(self, fp=None): - - if fp == None: - fp = self.__fp - - self.m_BasicHeader.read(fp) - - def __readFirstHeader(self): - - self.__readBasicHeader() - self.__rdSystemHeader() - self.__rdRadarControllerHeader() - self.__rdProcessingHeader() - self.firstHeaderSize = self.m_BasicHeader.size - - data_type=int(numpy.log2((self.m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR)) - if data_type == 0: - tmp=numpy.dtype([('real','= neededSize): - self.__readBasicHeader() - return 1 - - if not(self.__setNextFile()): - return 0 - - self.__readFirstHeader() - - deltaTime = self.m_BasicHeader.utc - self.__lastUTTime # check this - - self.flagResetProcessing = 0 - if deltaTime > self.__maxTimeStep: - self.flagResetProcessing = 1 - self.nReadBlocks = 0 - - return 1 - - def __readBlock(self): - """Lee el bloque de datos desde la posicion actual del puntero del archivo y - actualiza todos los parametros relacionados al bloque de datos (data, time, - etc). La data leida es almacenada en el buffer y el contador de datos leidos es - seteado a 0 - """ - - pts2read = self.m_ProcessingHeader.profilesPerBlock*self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels - - data = numpy.fromfile(self.__fp,self.__dataType,pts2read) - - data = data.reshape((self.m_ProcessingHeader.profilesPerBlock, self.m_ProcessingHeader.numHeights, self.m_SystemHeader.numChannels)) - - self.__flagIsNewFile = 0 - - self.flagIsNewBlock = 1 - - self.nReadBlocks += 1 - - self.__buffer = data - - self.__buffer_id = 0 - - def readNextBlock(self): - - if not(self.__setNewBlock()): - return 0 - - self.__readBlock() - - self.__lastUTTime = self.m_BasicHeader.utc - - return 1 - - def __hasNotDataInBuffer(self): - if self.__buffer_id >= self.m_ProcessingHeader.profilesPerBlock: - return 1 - - return 0 - - def getData(self): - """Obtiene un unidad de datos del buffer de lectura y es copiada a la clase "Voltage" - con todos los parametros asociados a este. cuando no hay datos en el buffer de - lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock" - """ - self.flagResetProcessing = 0 - self.flagIsNewBlock = 0 - - if self.__hasNotDataInBuffer(): - self.readNextBlock() - - if self.noMoreFiles == 1: - print 'Process finished' - return None - - #data es un numpy array de 3 dmensiones (perfiles, alturas y canales) - data = self.__buffer[self.__buffer_id,:,:] - - time = self.m_BasicHeader.utc + self.__buffer_id*self.__ippSeconds - - self.m_Voltage.m_BasicHeader = self.m_BasicHeader.copy() - self.m_Voltage.m_ProcessingHeader = self.m_ProcessingHeader.copy() - self.m_Voltage.m_RadarControllerHeader = self.m_RadarControllerHeader.copy() - self.m_Voltage.m_SystemHeader = self.m_SystemHeader.copy() - self.m_Voltage.m_BasicHeader.utc = time - self.m_Voltage.data = data - self.m_Voltage.dataType = self.__dataType - - self.__buffer_id += 1 - - #call setData - to Data Object - - return data - - - def setup(self, path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r", online = 0): - - if online == 0: - pathList, filenameList = self.__searchFiles(path, startDateTime, endDateTime, set, expLabel, ext) - - if len(filenameList) == 0: - self.__fp = None - self.noMoreFiles = 1 - print 'Do not exist files in range: %s - %s'%(startDateTime.ctime(), endDateTime.ctime()) - return 0 - -# for thisFile in filenameList: -# print thisFile - - self.__idFile = -1 - - if not(self.__setNextFile()): - print "No more files" - return 0 - - self.__readFirstHeader() - - self.startUTCSeconds = time.mktime(startDateTime.timetuple()) - self.endUTCSeconds = time.mktime(endDateTime.timetuple()) - - self.startYear = startDateTime.timetuple().tm_year - self.endYear = endDateTime.timetuple().tm_year - - self.startDoy = startDateTime.timetuple().tm_yday - self.endDoy = endDateTime.timetuple().tm_yday - #call fillHeaderValues() - to Data Object - - self.__pathList = pathList - self.filenameList = filenameList - self.online = online - -class VoltageWriter(DataWriter): - - - def __init__(self, m_Voltage = None): - - if m_Voltage == None: - m_Voltage = Voltage() - - self.m_Voltage = m_Voltage - - self.__fp = None - - self.__blocksCounter = 0 - - self.__setFile = None - - self.__flagIsNewFile = 0 - - self.__buffer = 0 - - self.__buffer_id = 0 - - self.__dataType = None - - self.__ext = None - - self.nWriteBlocks = 0 - - self.flagIsNewBlock = 0 - - self.noMoreFiles = 0 - - self.filename = None - - self.m_BasicHeader= BasicHeader() - - self.m_SystemHeader = SystemHeader() - - self.m_RadarControllerHeader = RadarControllerHeader() - - self.m_ProcessingHeader = ProcessingHeader() - - def __setNextFile(self): - setFile = self.__setFile - ext = self.__ext - path = self.__path - - setFile += 1 - - if not(self.__blocksCounter >= self.m_ProcessingHeader.dataBlocksPerFile): - self.__fp.close() - return 0 - - timeTuple = time.localtime(self.m_Voltage.m_BasicHeader.utc) # utc from m_Voltage - file = 'D%4.4d%3.3d%3.3d%s' % (timeTuple.tm_year,timeTuple.tm_doy,setFile,ext) - subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_doy) - tmp = os.path.join(path,subfolder) - if not(os.path.exists(tmp)): - os.mkdir(tmp) - - filename = os.path.join(path,subfolder,file) - fp = open(filename,'wb') - - - - #guardando atributos - self.filename = filename - self.__subfolder = subfolder - self.__fp = fp - self.__setFile = setFile - self.__flagIsNewFile = 1 - - print 'Writing the file: %s'%self.filename - - return 1 - - - - def __setNewBlock(self): - if self.__fp == None: - return 0 - - if self.__flagIsNewFile: - return 1 - - #Bloques completados? - if self.__blocksCounter < self.m_ProcessingHeader.profilesPerBlock: - self.__writeBasicHeader() - return 1 - - if not(self.__setNextFile()): - return 0 - - self.__writeFirstHeader() - - return 1 - - def __writeBlock(self): - - numpy.save(self.__fp,self.__buffer) - - self.__buffer = numpy.array([],self.__dataType) - - self.__buffer_id = 0 - - self.__flagIsNewFile = 0 - - self.flagIsNewBlock = 1 - - self.nWriteBlocks += 1 - - self.__blocksCounter += 1 - - def writeNextBlock(self): - if not(self.__setNewBlock()): - return 0 - - self.__writeBlock() - - return 1 - - def __hasAllDataInBuffer(self): - if self.__buffer_id >= self.m_ProcessingHeader.profilesPerBlock: - return 1 - - return 0 - - def putData(self): - self.flagIsNewBlock = 0 - - if self.m_Voltage.noData: - return None - - shape = self.m_Voltage.data.shape - data = numpy.zeros(shape,self.__dataType) - data['real'] = self.m_Voltage.data.real - data['imag'] = self.m_Voltage.data.imag - data = data.reshape((-1)) - - self.__buffer = numpy.hstack((self.__buffer,data)) - - self.__buffer_id += 1 - - if __hasAllDataInBuffer(): - self.writeNextBlock() - - - if self.noMoreFiles: - print 'Process finished' - return None - - return 1 - - - def setup(self,path,set=None,format=None): - - if set == None: - set = -1 - else: - set -= 1 - - if format == 'hdf5': - ext = '.hdf5' - print 'call hdf5 library' - return 0 - - if format == 'rawdata': - ext = '.r' - - #call to config_headers - - self.__setFile = set - - if not(self.__setNextFile()): - print "zzzzzzzzzzzz" - return 0 - - self.__writeFirstHeader() # dentro de esta funcion se debe setear e __dataType - - self.__buffer = numpy.array([],self.__dataType) - - - - def __writeBasicHeader(self): - pass - - def __writeFirstHeader(self): - pass \ No newline at end of file diff --git a/schainpy/IO/VoltageIO.py b/schainpy/IO/VoltageIO.py new file mode 100644 index 0000000..8ef59c0 --- /dev/null +++ b/schainpy/IO/VoltageIO.py @@ -0,0 +1,801 @@ +''' +Created on 23/01/2012 + +@author $Author$ +@version $Id$ +''' + +import os, sys +import numpy +import glob +import fnmatch +import time, datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from IO.HeaderIO import * +from IO.DataIO import DataReader +from IO.DataIO import DataWriter + +from Model.Voltage import Voltage + +def isThisFileinRange(filename, startUTSeconds, endUTSeconds): + """ + Esta funcion determina si un archivo de datos en formato Jicamarca(.r) se encuentra + o no dentro del rango de fecha especificado. + + Inputs: + filename : nombre completo del archivo de datos en formato Jicamarca (.r) + + startUTSeconds : fecha inicial del rango seleccionado. La fecha esta dada en + segundos contados desde 01/01/1970. + endUTSeconds : fecha final del rango seleccionado. La fecha esta dada en + segundos contados desde 01/01/1970. + + Return: + Boolean : Retorna True si el archivo de datos contiene datos en el rango de + fecha especificado, de lo contrario retorna False. + + Excepciones: + Si el archivo no existe o no puede ser abierto + Si la cabecera no puede ser leida. + + """ + m_BasicHeader = BasicHeader() + + try: + fp = open(filename,'rb') + except: + raise IOError, "The file %s can't be opened" %(filename) + + if not(m_BasicHeader.read(fp)): + raise IOError, "The file %s has not a valid header" %(filename) + + fp.close() + + if not ((startUTSeconds <= m_BasicHeader.utc) and (endUTSeconds >= m_BasicHeader.utc)): + return 0 + + return 1 + +class VoltageReader(DataReader): + """ + Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura + de los datos siempre se realiza por bloques. Los datos leidos (array de 3 dimensiones: + perfiles*alturas*canales) son almacenados en la variable "buffer". + + Esta clase contiene instancias (objetos) de las clases BasicHeader, SystemHeader, + RadarControllerHeader y Voltage. Los tres primeros se usan para almacenar informacion de la + cabecera de datos (metadata), y el cuarto (Voltage) para obtener y almacenar un perfil de + datos desde el "buffer" cada vez que se ejecute el metodo "getData". + + Example: + + dpath = "/home/myuser/data" + + startTime = datetime.datetime(2010,1,20,0,0,0,0,0,0) + + endTime = datetime.datetime(2010,1,21,23,59,59,0,0,0) + + readerObj = VoltageReader() + + readerObj.setup(dpath, startTime, endTime) + + while(True): + + readerObj.getData() + + print readerObj.m_Voltage.data + + if readerObj.noMoreFiles: + break + + """ + + #speed of light + __c = 3E8 + + def __init__(self, m_Voltage = None): + """ + Inicializador de la clase VoltageReader para la lectura de datos de voltage. + + Input: + m_Voltage : Objeto de la clase Voltage. Este objeto sera utilizado para + almacenar un perfil de datos cada vez que se haga un requerimiento + (getData). El perfil sera obtenido a partir del buffer de datos, + si el buffer esta vacio se hara un nuevo proceso de lectura de un + bloque de datos. + Si este parametro no es pasado se creara uno internamente. + + Variables afectadas: + self.m_Voltage + self.m_BasicHeader + self.m_SystemHeader + self.m_RadarControllerHeader + self.m_ProcessingHeader + + + Return: + Void + + """ + if m_Voltage == None: + m_Voltage = Voltage() + + if not(isinstance(m_Voltage, Voltage)): + raise ValueError, "in VoltageReader, m_Voltage must be an Voltage class object" + + self.m_Voltage = m_Voltage + + self.m_BasicHeader = BasicHeader() + + self.m_SystemHeader = SystemHeader() + + self.m_RadarControllerHeader = RadarControllerHeader() + + self.m_ProcessingHeader = ProcessingHeader() + + self.__fp = None + + self.__idFile = None + + self.__startDateTime = None + + self.__endDateTime = None + + self.__dataType = None + + self.__fileSizeByHeader = 0 + + self.__pathList = [] + + self.filenameList = [] + + self.__lastUTTime = 0 + + self.__maxTimeStep = 30 + + self.__flagIsNewFile = 0 + + self.__ippSeconds = 0 + + self.flagResetProcessing = 0 + + self.flagIsNewBlock = 0 + + self.noMoreFiles = 0 + + self.nReadBlocks = 0 + + self.online = 0 + + self.filename = None + + self.fileSize = None + + self.firstHeaderSize = 0 + + self.basicHeaderSize = 24 + + self.idProfile = 0 + + self.__buffer = 0 + + self.__buffer_id = 9999 + + def __rdSystemHeader(self,fp=None): + if fp == None: + fp = self.__fp + + self.m_SystemHeader.read(fp) + + def __rdRadarControllerHeader(self,fp=None): + if fp == None: + fp = self.__fp + + self.m_RadarControllerHeader.read(fp) + + def __rdProcessingHeader(self,fp=None): + if fp == None: + fp = self.__fp + + self.m_ProcessingHeader.read(fp) + + def __rdBasicHeader(self, fp=None): + + if fp == None: + fp = self.__fp + + self.m_BasicHeader.read(fp) + + def __readFirstHeader(self): + + self.__rdBasicHeader() + self.__rdSystemHeader() + self.__rdRadarControllerHeader() + self.__rdProcessingHeader() + self.firstHeaderSize = self.m_BasicHeader.size + + data_type=int(numpy.log2((self.m_ProcessingHeader.processFlags & PROCFLAG.DATATYPE_MASK))-numpy.log2(PROCFLAG.DATATYPE_CHAR)) + if data_type == 0: + tmp = numpy.dtype([('real','= neededSize): + self.__rdBasicHeader() + return 1 + + #Setting new file + if not(self.__setNextFile()): + return 0 + + deltaTime = self.m_BasicHeader.utc - self.__lastUTTime # check this + + self.flagResetProcessing = 0 + + if deltaTime > self.__maxTimeStep: + self.flagResetProcessing = 1 + self.nReadBlocks = 0 + + return 1 + + def __readBlock(self): + """ + __readBlock lee el bloque de datos desde la posicion actual del puntero del archivo + (self.__fp) y actualiza todos los parametros relacionados al bloque de datos + (metadata + data). La data leida es almacenada en el buffer y el contador del buffer + es seteado a 0 + + + Inputs: + None + + Return: + None + + Variables afectadas: + + self.__buffer_id + + self.__buffer + + self.__flagIsNewFile + + self.idProfile + + self.flagIsNewBlock + + self.nReadBlocks + + """ + + pts2read = self.m_ProcessingHeader.profilesPerBlock*self.m_ProcessingHeader.numHeights*self.m_SystemHeader.numChannels + + junk = numpy.fromfile(self.__fp, self.__dataType, pts2read) + + junk = junk.reshape((self.m_ProcessingHeader.profilesPerBlock, self.m_ProcessingHeader.numHeights, self.m_SystemHeader.numChannels)) + + data = junk['real'] + junk['imag']*1j + + self.__buffer_id = 0 + + self.__buffer = data + + self.__flagIsNewFile = 0 + + self.idProfile = 0 + + self.flagIsNewBlock = 1 + + self.nReadBlocks += 1 + + def __hasNotDataInBuffer(self): + if self.__buffer_id >= self.m_ProcessingHeader.profilesPerBlock: + return 1 + + return 0 + + def __searchFiles(self, path, startDateTime, endDateTime, set=None, expLabel = "", ext = ".r"): + """ + __searchFiles realiza una busqueda de los archivos que coincidan con los parametros + especificados y se encuentren ubicados en el path indicado. Para realizar una busqueda + correcta la estructura de directorios debe ser la siguiente: + + ...path/D[yyyy][ddd]/expLabel/D[yyyy][ddd][sss].ext + + [yyyy]: anio + [ddd] : dia del anio + [sss] : set del archivo + + Inputs: + path : Directorio de datos donde se realizara la busqueda. Todos los + ficheros que concidan con el criterio de busqueda seran + almacenados en una lista y luego retornados. + startDateTime : Fecha inicial. Rechaza todos los archivos donde + file end time < startDateTime (obejto datetime.datetime) + + endDateTime : Fecha final. Rechaza todos los archivos donde + file start time > endDateTime (obejto datetime.datetime) + + set : Set del primer archivo a leer. Por defecto None + + expLabel : Nombre del subdirectorio de datos. Por defecto "" + + ext : Extension de los archivos a leer. Por defecto .r + + Return: + + (pathList, filenameList) + + pathList : Lista de directorios donde se encontraron archivos dentro + de los parametros especificados + filenameList : Lista de archivos (ruta completa) que coincidieron con los + parametros especificados. + + Variables afectadas: + + self.filenameList: Lista de archivos (ruta completa) que la clase utiliza + como fuente para leer los bloque de datos, si se termina + de leer todos los bloques de datos de un determinado + archivo se pasa al siguiente archivo de la lista. + + Excepciones: + + """ + + print "Searching files ..." + + dirList = [] + for thisPath in os.listdir(path): + if os.path.isdir(os.path.join(path,thisPath)): + dirList.append(thisPath) + + pathList = [] + + thisDateTime = startDateTime + + while(thisDateTime <= endDateTime): + year = thisDateTime.timetuple().tm_year + doy = thisDateTime.timetuple().tm_yday + + match = fnmatch.filter(dirList, '?' + '%4.4d%3.3d' % (year,doy)) + if len(match) == 0: + thisDateTime += datetime.timedelta(1) + continue + + pathList.append(os.path.join(path,match[0],expLabel)) + thisDateTime += datetime.timedelta(1) + + startUtSeconds = time.mktime(startDateTime.timetuple()) + endUtSeconds = time.mktime(endDateTime.timetuple()) + + filenameList = [] + for thisPath in pathList: + fileList = glob.glob1(thisPath, "*%s" %ext) + fileList.sort() + for file in fileList: + filename = os.path.join(thisPath,file) + if isThisFileinRange(filename, startUtSeconds, endUtSeconds): + filenameList.append(filename) + + self.filenameList = filenameList + + return pathList, filenameList + + def setup(self, path, startDateTime, endDateTime=None, set=None, expLabel = "", ext = ".r", online = 0): + """ + setup configura los parametros de lectura de la clase VoltageReader. + + Si el modo de lectura es offline, primero se realiza una busqueda de todos los archivos + que coincidan con los parametros especificados; esta lista de archivos son almacenados en + self.filenameList. + + Input: + path : Directorios donde se ubican los datos a leer. Dentro de este + directorio deberia de estar subdirectorios de la forma: + + path/D[yyyy][ddd]/expLabel/P[yyyy][ddd][sss][ext] + + startDateTime : Fecha inicial. Rechaza todos los archivos donde + file end time < startDatetime (obejto datetime.datetime) + + endDateTime : Fecha final. Si no es None, rechaza todos los archivos donde + file end time < startDatetime (obejto datetime.datetime) + + set : Set del primer archivo a leer. Por defecto None + + expLabel : Nombre del subdirectorio de datos. Por defecto "" + + ext : Extension de los archivos a leer. Por defecto .r + + online : + + Return: + + Affected: + + Excepciones: + + Example: + + """ + + if online == 0: + pathList, filenameList = self.__searchFiles(path, startDateTime, endDateTime, set, expLabel, ext) + + self.__idFile = -1 + + if not(self.__setNextFile()): + print "No files in range: %s - %s" %(startDateTime.ctime(), endDateTime.ctime()) + return 0 + + self.startUTCSeconds = time.mktime(startDateTime.timetuple()) + self.endUTCSeconds = time.mktime(endDateTime.timetuple()) + + self.startYear = startDateTime.timetuple().tm_year + self.endYear = endDateTime.timetuple().tm_year + + self.startDoy = startDateTime.timetuple().tm_yday + self.endDoy = endDateTime.timetuple().tm_yday + #call fillHeaderValues() - to Data Object + + self.__pathList = pathList + self.filenameList = filenameList + self.online = online + + def readNextBlock(self): + """ + readNextBlock establece un nuevo bloque de datos a leer y los lee, si es que no existiese + mas bloques disponibles en el archivo actual salta al siguiente. + + """ + + if not(self.__setNewBlock()): + return 0 + + self.__readBlock() + + self.__lastUTTime = self.m_BasicHeader.utc + + return 1 + + def getData(self): + """ + getData obtiene una unidad de datos del buffer de lectura y la copia a la clase "Voltage" + con todos los parametros asociados a este (metadata). cuando no hay datos en el buffer de + lectura es necesario hacer una nueva lectura de los bloques de datos usando "readNextBlock" + + Ademas incrementa el contador del buffer en 1. + + Inputs: + None + + Return: + data : retorna un perfil de voltages (alturas * canales) copiados desde el + buffer. Si no hay mas archivos a leer retorna None. + + Variables afectadas: + self.m_Voltage + self.__buffer_id + self.idProfile + + Excepciones: + + """ + self.flagResetProcessing = 0 + self.flagIsNewBlock = 0 + + if self.__hasNotDataInBuffer(): + self.readNextBlock() + + if self.noMoreFiles == 1: + print 'Process finished' + return None + + #data es un numpy array de 3 dmensiones (perfiles, alturas y canales) + data = self.__buffer[self.__buffer_id,:,:] + + time = self.m_BasicHeader.utc + self.__buffer_id*self.__ippSeconds + + self.m_Voltage.m_BasicHeader = self.m_BasicHeader.copy() + self.m_Voltage.m_ProcessingHeader = self.m_ProcessingHeader.copy() + self.m_Voltage.m_RadarControllerHeader = self.m_RadarControllerHeader.copy() + self.m_Voltage.m_SystemHeader = self.m_SystemHeader.copy() + self.m_Voltage.m_BasicHeader.utc = time + self.m_Voltage.data = data + self.m_Voltage.heights = self.__heights + self.m_Voltage.idProfile = self.idProfile + self.m_Voltage.dataType = self.__dataType + + self.__buffer_id += 1 + self.idProfile += 1 + + #call setData - to Data Object + + return data + + + + +class VoltageWriter(DataWriter): + + + def __init__(self, m_Voltage = None): + + if m_Voltage == None: + m_Voltage = Voltage() + + self.m_Voltage = m_Voltage + + self.__fp = None + + self.__blocksCounter = 0 + + self.__setFile = None + + self.__flagIsNewFile = 0 + + self.__buffer = 0 + + self.__buffer_id = 0 + + self.__dataType = None + + self.__ext = None + + self.nWriteBlocks = 0 + + self.flagIsNewBlock = 0 + + self.noMoreFiles = 0 + + self.filename = None + + self.m_BasicHeader= BasicHeader() + + self.m_SystemHeader = SystemHeader() + + self.m_RadarControllerHeader = RadarControllerHeader() + + self.m_ProcessingHeader = ProcessingHeader() + + def __setNextFile(self): + setFile = self.__setFile + ext = self.__ext + path = self.__path + + setFile += 1 + + if not(self.__blocksCounter >= self.m_ProcessingHeader.dataBlocksPerFile): + self.__fp.close() + return 0 + + timeTuple = time.localtime(self.m_Voltage.m_BasicHeader.utc) # utc from m_Voltage + file = 'D%4.4d%3.3d%3.3d%s' % (timeTuple.tm_year,timeTuple.tm_doy,setFile,ext) + subfolder = 'D%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_doy) + tmp = os.path.join(path,subfolder) + if not(os.path.exists(tmp)): + os.mkdir(tmp) + + filename = os.path.join(path,subfolder,file) + fp = open(filename,'wb') + + + + #guardando atributos + self.filename = filename + self.__subfolder = subfolder + self.__fp = fp + self.__setFile = setFile + self.__flagIsNewFile = 1 + + print 'Writing the file: %s'%self.filename + + return 1 + + + + def __setNewBlock(self): + if self.__fp == None: + return 0 + + if self.__flagIsNewFile: + return 1 + + #Bloques completados? + if self.__blocksCounter < self.m_ProcessingHeader.profilesPerBlock: + self.__writeBasicHeader() + return 1 + + if not(self.__setNextFile()): + return 0 + + self.__writeFirstHeader() + + return 1 + + def __writeBlock(self): + + numpy.save(self.__fp,self.__buffer) + + self.__buffer = numpy.array([],self.__dataType) + + self.__buffer_id = 0 + + self.__flagIsNewFile = 0 + + self.flagIsNewBlock = 1 + + self.nWriteBlocks += 1 + + self.__blocksCounter += 1 + + def writeNextBlock(self): + if not(self.__setNewBlock()): + return 0 + + self.__writeBlock() + + return 1 + + def __hasAllDataInBuffer(self): + if self.__buffer_id >= self.m_ProcessingHeader.profilesPerBlock: + return 1 + + return 0 + + def putData(self): + self.flagIsNewBlock = 0 + + if self.m_Voltage.noData: + return None + + shape = self.m_Voltage.data.shape + data = numpy.zeros(shape,self.__dataType) + data['real'] = self.m_Voltage.data.real + data['imag'] = self.m_Voltage.data.imag + data = data.reshape((-1)) + + self.__buffer = numpy.hstack((self.__buffer,data)) + + self.__buffer_id += 1 + + if __hasAllDataInBuffer(): + self.writeNextBlock() + + + if self.noMoreFiles: + print 'Process finished' + return None + + return 1 + + + def setup(self,path,set=None,format=None): + + if set == None: + set = -1 + else: + set -= 1 + + if format == 'hdf5': + ext = '.hdf5' + print 'call hdf5 library' + return 0 + + if format == 'rawdata': + ext = '.r' + + #call to config_headers + + self.__setFile = set + + if not(self.__setNextFile()): + print "zzzzzzzzzzzz" + return 0 + + self.__writeFirstHeader() # dentro de esta funcion se debe setear e __dataType + + self.__buffer = numpy.array([],self.__dataType) + + + + def __writeBasicHeader(self): + pass + + def __writeFirstHeader(self): + pass \ No newline at end of file diff --git a/schainpy/Model/Voltage.py b/schainpy/Model/Voltage.py index 768e356..ae15641 100644 --- a/schainpy/Model/Voltage.py +++ b/schainpy/Model/Voltage.py @@ -10,39 +10,39 @@ path = os.path.split(os.getcwd())[0] sys.path.append(path) from Model.Data import Data -from IO.Header import * +from IO.HeaderIO import * class Voltage(Data): ''' classdocs ''' - - - - def __init__(self): ''' Constructor ''' self.m_RadarControllerHeader= RadarControllerHeader() - - self.m_ProcessingHeader= ProcessingHeader() + self.m_ProcessingHeader= ProcessingHeader() + self.m_SystemHeader= SystemHeader() - + self.m_BasicHeader= BasicHeader() #data es un numpy array de 3 dmensiones (perfiles, alturas y canales) self.data = None - self.dataType = None + self.heights = None self.noData = True + self.nProfiles = None + + self.idProfile = None + + self.dataType = None - def copy(self): obj = Voltage() obj.m_BasicHeader = self.m_BasicHeader.copy() @@ -50,5 +50,12 @@ class Voltage(Data): obj.m_RadarControllerHeader = self.m_RadarControllerHeader.copy() obj.m_ProcessingHeader = self.m_ProcessingHeader.copy() + obj.data = self.data + obj.heights = self.heights + obj.noData = self.noData + + obj.nProfiles = self.nProfiles + obj.idProfile = self.idProfile + return obj \ No newline at end of file diff --git a/schainpy/TestSChain.py b/schainpy/TestSChain.py new file mode 100644 index 0000000..0229b27 --- /dev/null +++ b/schainpy/TestSChain.py @@ -0,0 +1,59 @@ +''' +Created on 23/01/2012 + +@author $Author$ +@version $Id$ +''' +import os, sys +import time, datetime + +from Model.Voltage import Voltage +from IO.VoltageIO import VoltageReader +from Graphics.VoltagePlot import Osciloscope + +class TestSChain(): + + + def __init__(self): + self.setValues() + self.createObjects() + self.testSChain() + pass + + def setValues(self): + + self.path = '/home/roj-idl71/Data/RAWDATA/DP_Faraday/' + self.path = '/home/roj-idl71/Data/RAWDATA/IMAGING' + #self.path = '/remote/puma/2004_11/DVD/' + self.startDateTime = datetime.datetime(2004,5,1,17,49,0) + self.endDateTime = datetime.datetime(2012,5,1,18,10,0) + + def createObjects(self): + + self.voltageObj = Voltage() + self.readerObj = VoltageReader(self.voltageObj) + self.plotObj = Osciloscope(self.voltageObj) + + self.readerObj.setup(self.path, self.startDateTime, self.endDateTime) + + def testSChain(self): + + while(True): + + self.readerObj.getData() + self.plotObj.plotData(idProfile = 1, type='iq', ymin = -100, ymax = 100) + + if self.readerObj.flagResetProcessing: + print 'jump' + +# if self.readerObj.flagIsNewBlock: +# print 'Block No %04d, Time: %s'%(self.readerObj.nReadBlocks, +# datetime.datetime.fromtimestamp(self.readerObj.m_BasicHeader.utc)) + + if self.readerObj.noMoreFiles: + break + + self.plotObj.end() + +if __name__ == '__main__': + TestSChain() \ No newline at end of file