jroplot_parameters.py
1194 lines
| 41.2 KiB
| text/x-python
|
PythonLexer
|
r502 | import os | |
import datetime | |||
import numpy | |||
from figure import Figure, isRealtime | |||
class MomentsPlot(Figure): | |||
isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
PREFIX = 'prm' | |||
def __init__(self): | |||
self.isConfig = False | |||
self.__nsubplots = 1 | |||
self.WIDTH = 280 | |||
self.HEIGHT = 250 | |||
self.WIDTHPROF = 120 | |||
self.HEIGHTPROF = 0 | |||
self.counter_imagwr = 0 | |||
self.PLOT_CODE = 1 | |||
self.FTP_WEI = None | |||
self.EXP_CODE = None | |||
self.SUB_EXP_CODE = None | |||
self.PLOT_POS = None | |||
def getSubplots(self): | |||
ncol = int(numpy.sqrt(self.nplots)+0.9) | |||
nrow = int(self.nplots*1./ncol + 0.9) | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=True, show=True): | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 1 | |||
colspan = 1 | |||
if showprofile: | |||
ncolspan = 3 | |||
colspan = 2 | |||
self.__nsubplots = 2 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH + self.WIDTHPROF, | |||
heightplot = self.HEIGHT + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = self.getSubplots() | |||
counter = 0 | |||
for y in range(nrow): | |||
for x in range(ncol): | |||
if counter >= self.nplots: | |||
break | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) | |||
if showprofile: | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) | |||
counter += 1 | |||
def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, | |||
xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, | |||
save=False, figpath='', figfile=None, show=True, ftp=False, wr_period=1, | |||
server=None, folder=None, username=None, password=None, | |||
ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
ymin : None, | |||
ymax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
if dataOut.flagNoData: | |||
return None | |||
if realtime: | |||
if not(isRealtime(utcdatatime = dataOut.utctime)): | |||
print 'Skipping this plot function' | |||
return | |||
if channelList == None: | |||
channelIndexList = dataOut.channelIndexList | |||
else: | |||
channelIndexList = [] | |||
for channel in channelList: | |||
if channel not in dataOut.channelList: | |||
raise ValueError, "Channel %d is not in dataOut.channelList" | |||
channelIndexList.append(dataOut.channelList.index(channel)) | |||
factor = dataOut.normFactor | |||
|
r543 | x = dataOut.abscissaList | |
y = dataOut.heightList | |||
|
r502 | ||
z = dataOut.data_pre[channelIndexList,:,:]/factor | |||
z = numpy.where(numpy.isfinite(z), z, numpy.NAN) | |||
avg = numpy.average(z, axis=1) | |||
noise = dataOut.noise/factor | |||
zdB = 10*numpy.log10(z) | |||
avgdB = 10*numpy.log10(avg) | |||
noisedB = 10*numpy.log10(noise) | |||
#thisDatetime = dataOut.datatime | |||
thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1]) | |||
title = wintitle + " Parameters" | |||
xlabel = "Velocity (m/s)" | |||
ylabel = "Range (Km)" | |||
if not self.isConfig: | |||
nplots = len(channelIndexList) | |||
self.setup(id=id, | |||
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
if xmin == None: xmin = numpy.nanmin(x) | |||
if xmax == None: xmax = numpy.nanmax(x) | |||
if ymin == None: ymin = numpy.nanmin(y) | |||
if ymax == None: ymax = numpy.nanmax(y) | |||
if zmin == None: zmin = numpy.nanmin(avgdB)*0.9 | |||
if zmax == None: zmax = numpy.nanmax(avgdB)*0.9 | |||
self.FTP_WEI = ftp_wei | |||
self.EXP_CODE = exp_code | |||
self.SUB_EXP_CODE = sub_exp_code | |||
self.PLOT_POS = plot_pos | |||
self.isConfig = True | |||
self.setWinTitle(title) | |||
for i in range(self.nplots): | |||
str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) | |||
title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i]+1, noisedB[i], str_datetime) | |||
axes = self.axesList[i*self.__nsubplots] | |||
axes.pcolor(x, y, zdB[i,:,:], | |||
xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, | |||
xlabel=xlabel, ylabel=ylabel, title=title, | |||
ticksize=9, cblabel='') | |||
#Mean Line | |||
mean = dataOut.data_param[i, 1, :] | |||
axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1) | |||
if self.__showprofile: | |||
axes = self.axesList[i*self.__nsubplots +1] | |||
axes.pline(avgdB[i], y, | |||
xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, | |||
xlabel='dB', ylabel='', title='', | |||
ytick_visible=False, | |||
grid='x') | |||
noiseline = numpy.repeat(noisedB[i], len(y)) | |||
axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) | |||
self.draw() | |||
if figfile == None: | |||
str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
figfile = self.getFilename(name = str_datetime) | |||
if figpath != '': | |||
self.counter_imagwr += 1 | |||
if (self.counter_imagwr>=wr_period): | |||
# store png plot to local folder | |||
self.saveFigure(figpath, figfile) | |||
# store png plot to FTP server according to RT-Web format | |||
name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
ftp_filename = os.path.join(figpath, name) | |||
self.saveFigure(figpath, ftp_filename) | |||
self.counter_imagwr = 0 | |||
class SkyMapPlot(Figure): | |||
__isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
PREFIX = 'prm' | |||
def __init__(self): | |||
self.__isConfig = False | |||
self.__nsubplots = 1 | |||
# self.WIDTH = 280 | |||
# self.HEIGHT = 250 | |||
self.WIDTH = 600 | |||
self.HEIGHT = 600 | |||
self.WIDTHPROF = 120 | |||
self.HEIGHTPROF = 0 | |||
self.counter_imagwr = 0 | |||
self.PLOT_CODE = 1 | |||
self.FTP_WEI = None | |||
self.EXP_CODE = None | |||
self.SUB_EXP_CODE = None | |||
self.PLOT_POS = None | |||
def getSubplots(self): | |||
ncol = int(numpy.sqrt(self.nplots)+0.9) | |||
nrow = int(self.nplots*1./ncol + 0.9) | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=False, show=True): | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 1 | |||
colspan = 1 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH, #+ self.WIDTHPROF, | |||
heightplot = self.HEIGHT,# + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = 1,1 | |||
counter = 0 | |||
x = 0 | |||
y = 0 | |||
self.addAxes(1, 1, 0, 0, 1, 1, True) | |||
def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False, | |||
xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, | |||
save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, | |||
server=None, folder=None, username=None, password=None, | |||
ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
ymin : None, | |||
ymax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
arrayParameters = dataOut.data_param | |||
error = arrayParameters[:,-1] | |||
indValid = numpy.where(error == 0)[0] | |||
finalMeteor = arrayParameters[indValid,:] | |||
finalAzimuth = finalMeteor[:,4] | |||
finalZenith = finalMeteor[:,5] | |||
x = finalAzimuth*numpy.pi/180 | |||
y = finalZenith | |||
#thisDatetime = dataOut.datatime | |||
thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1]) | |||
title = wintitle + " Parameters" | |||
xlabel = "Zonal Zenith Angle (deg) " | |||
ylabel = "Meridional Zenith Angle (deg)" | |||
if not self.__isConfig: | |||
nplots = 1 | |||
self.setup(id=id, | |||
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
self.FTP_WEI = ftp_wei | |||
self.EXP_CODE = exp_code | |||
self.SUB_EXP_CODE = sub_exp_code | |||
self.PLOT_POS = plot_pos | |||
self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) | |||
self.__isConfig = True | |||
self.setWinTitle(title) | |||
i = 0 | |||
str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) | |||
axes = self.axesList[i*self.__nsubplots] | |||
nevents = axes.x_buffer.shape[0] + x.shape[0] | |||
title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents) | |||
axes.polar(x, y, | |||
title=title, xlabel=xlabel, ylabel=ylabel, | |||
ticksize=9, cblabel='') | |||
self.draw() | |||
if save: | |||
self.counter_imagwr += 1 | |||
if (self.counter_imagwr==wr_period): | |||
if figfile == None: | |||
figfile = self.getFilename(name = self.name) | |||
self.saveFigure(figpath, figfile) | |||
if ftp: | |||
#provisionalmente envia archivos en el formato de la web en tiempo real | |||
name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
path = '%s%03d' %(self.PREFIX, self.id) | |||
ftp_file = os.path.join(path,'ftp','%s.png'%name) | |||
self.saveFigure(figpath, ftp_file) | |||
ftp_filename = os.path.join(figpath,ftp_file) | |||
try: | |||
self.sendByFTP(ftp_filename, server, folder, username, password) | |||
except: | |||
self.counter_imagwr = 0 | |||
raise ValueError, 'Error FTP' | |||
self.counter_imagwr = 0 | |||
class WindProfilerPlot(Figure): | |||
__isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
PREFIX = 'wind' | |||
def __init__(self): | |||
self.timerange = 2*60*60 | |||
|
r509 | self.__isConfig = False | |
|
r502 | self.__nsubplots = 1 | |
self.WIDTH = 800 | |||
self.HEIGHT = 150 | |||
self.WIDTHPROF = 120 | |||
self.HEIGHTPROF = 0 | |||
self.counter_imagwr = 0 | |||
self.PLOT_CODE = 0 | |||
self.FTP_WEI = None | |||
self.EXP_CODE = None | |||
self.SUB_EXP_CODE = None | |||
self.PLOT_POS = None | |||
self.tmin = None | |||
self.tmax = None | |||
self.xmin = None | |||
self.xmax = None | |||
self.figfile = None | |||
def getSubplots(self): | |||
ncol = 1 | |||
nrow = self.nplots | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=True, show=True): | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 1 | |||
colspan = 1 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH + self.WIDTHPROF, | |||
heightplot = self.HEIGHT + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = self.getSubplots() | |||
counter = 0 | |||
for y in range(nrow): | |||
if counter >= self.nplots: | |||
break | |||
self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1) | |||
counter += 1 | |||
def run(self, dataOut, id, wintitle="", channelList=None, | |||
xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, | |||
zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None, | |||
timerange=None, SNRthresh = None, | |||
save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, | |||
server=None, folder=None, username=None, password=None, | |||
ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
ymin : None, | |||
ymax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
if channelList == None: | |||
channelIndexList = dataOut.channelIndexList | |||
else: | |||
channelIndexList = [] | |||
for channel in channelList: | |||
if channel not in dataOut.channelList: | |||
raise ValueError, "Channel %d is not in dataOut.channelList" | |||
channelIndexList.append(dataOut.channelList.index(channel)) | |||
if timerange != None: | |||
self.timerange = timerange | |||
tmin = None | |||
tmax = None | |||
x = dataOut.getTimeRange1() | |||
|
r543 | # y = dataOut.heightList | |
y = dataOut.heightList | |||
|
r502 | ||
|
r513 | z = dataOut.data_output.copy() | |
|
r502 | nplots = z.shape[0] #Number of wind dimensions estimated | |
nplotsw = nplots | |||
#If there is a SNR function defined | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r502 | nplots += 1 | |
|
r514 | SNR = dataOut.data_SNR | |
|
r502 | SNRavg = numpy.average(SNR, axis=0) | |
SNRdB = 10*numpy.log10(SNR) | |||
SNRavgdB = 10*numpy.log10(SNRavg) | |||
if SNRthresh == None: SNRthresh = -5.0 | |||
ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0] | |||
for i in range(nplotsw): | |||
z[i,ind] = numpy.nan | |||
showprofile = False | |||
# thisDatetime = dataOut.datatime | |||
thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1]) | |||
title = wintitle + "Wind" | |||
xlabel = "" | |||
ylabel = "Range (Km)" | |||
if not self.__isConfig: | |||
|
r509 | ||
|
r502 | self.setup(id=id, | |
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
|
r565 | self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange, timezone = dataOut.timezone) | |
|
r502 | ||
if ymin == None: ymin = numpy.nanmin(y) | |||
if ymax == None: ymax = numpy.nanmax(y) | |||
if zmax == None: zmax = numpy.nanmax(abs(z[range(2),:])) | |||
#if numpy.isnan(zmax): zmax = 50 | |||
if zmin == None: zmin = -zmax | |||
if nplotsw == 3: | |||
if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:])) | |||
if zmin_ver == None: zmin_ver = -zmax_ver | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r502 | if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB) | |
if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB) | |||
self.FTP_WEI = ftp_wei | |||
self.EXP_CODE = exp_code | |||
self.SUB_EXP_CODE = sub_exp_code | |||
self.PLOT_POS = plot_pos | |||
self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.__isConfig = True | |||
self.setWinTitle(title) | |||
if ((self.xmax - x[1]) < (x[1]-x[0])): | |||
x[1] = self.xmax | |||
strWind = ['Zonal', 'Meridional', 'Vertical'] | |||
strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)'] | |||
zmaxVector = [zmax, zmax, zmax_ver] | |||
zminVector = [zmin, zmin, zmin_ver] | |||
windFactor = [1,1,100] | |||
for i in range(nplotsw): | |||
title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
axes = self.axesList[i*self.__nsubplots] | |||
z1 = z[i,:].reshape((1,-1))*windFactor[i] | |||
axes.pcolorbuffer(x, y, z1, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i], | |||
xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, | |||
ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="RdBu_r" ) | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r502 | i += 1 | |
title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
axes = self.axesList[i*self.__nsubplots] | |||
SNRavgdB = SNRavgdB.reshape((1,-1)) | |||
axes.pcolorbuffer(x, y, SNRavgdB, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, | |||
xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, | |||
ticksize=9, cblabel='', cbsize="1%", colormap="jet") | |||
self.draw() | |||
|
r509 | ||
|
r502 | if self.figfile == None: | |
str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.figfile = self.getFilename(name = str_datetime) | |||
|
r509 | ||
|
r502 | if figpath != '': | |
|
r509 | ||
|
r502 | self.counter_imagwr += 1 | |
if (self.counter_imagwr>=wr_period): | |||
# store png plot to local folder | |||
self.saveFigure(figpath, self.figfile) | |||
# store png plot to FTP server according to RT-Web format | |||
name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
ftp_filename = os.path.join(figpath, name) | |||
self.saveFigure(figpath, ftp_filename) | |||
|
r509 | ||
|
r502 | self.counter_imagwr = 0 | |
|
r511 | if x[1] >= self.axesList[0].xmax: | |
self.counter_imagwr = wr_period | |||
self.__isConfig = False | |||
self.figfile = None | |||
|
r512 | class ParametersPlot(Figure): | |
|
r511 | ||
__isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
|
r512 | PREFIX = 'prm' | |
|
r511 | ||
def __init__(self): | |||
self.timerange = 2*60*60 | |||
self.__isConfig = False | |||
self.__nsubplots = 1 | |||
self.WIDTH = 800 | |||
self.HEIGHT = 150 | |||
self.WIDTHPROF = 120 | |||
self.HEIGHTPROF = 0 | |||
self.counter_imagwr = 0 | |||
self.PLOT_CODE = 0 | |||
self.FTP_WEI = None | |||
self.EXP_CODE = None | |||
self.SUB_EXP_CODE = None | |||
self.PLOT_POS = None | |||
self.tmin = None | |||
self.tmax = None | |||
self.xmin = None | |||
self.xmax = None | |||
self.figfile = None | |||
def getSubplots(self): | |||
ncol = 1 | |||
nrow = self.nplots | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=True, show=True): | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 1 | |||
colspan = 1 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH + self.WIDTHPROF, | |||
heightplot = self.HEIGHT + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = self.getSubplots() | |||
counter = 0 | |||
for y in range(nrow): | |||
for x in range(ncol): | |||
if counter >= self.nplots: | |||
break | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) | |||
if showprofile: | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) | |||
counter += 1 | |||
def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False, | |||
xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None, | |||
|
r543 | parameterIndex = None, onlyPositive = False, | |
|
r548 | SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, | |
|
r543 | zlabel = "", parameterName = "", parameterObject = "data_param", | |
|
r511 | save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, | |
server=None, folder=None, username=None, password=None, | |||
ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
ymin : None, | |||
ymax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
|
r543 | data_param = getattr(dataOut, parameterObject) | |
|
r511 | if channelList == None: | |
|
r543 | channelIndexList = numpy.arange(data_param.shape[0]) | |
|
r511 | else: | |
|
r550 | channelIndexList = numpy.array(channelList) | |
|
r543 | ||
|
r548 | nchan = len(channelIndexList) #Number of channels being plotted | |
|
r511 | if timerange != None: | |
self.timerange = timerange | |||
#tmin = None | |||
#tmax = None | |||
|
r543 | if parameterIndex == None: | |
parameterIndex = 1 | |||
|
r511 | x = dataOut.getTimeRange1() | |
|
r543 | y = dataOut.heightList | |
z = data_param[channelIndexList,parameterIndex,:].copy() | |||
|
r511 | ||
|
r543 | zRange = dataOut.abscissaList | |
|
r511 | nplots = z.shape[0] #Number of wind dimensions estimated | |
# thisDatetime = dataOut.datatime | |||
|
r548 | ||
if dataOut.data_SNR != None: | |||
|
r550 | SNRarray = dataOut.data_SNR[channelIndexList,:] | |
|
r548 | SNRdB = 10*numpy.log10(SNRarray) | |
# SNRavgdB = 10*numpy.log10(SNRavg) | |||
ind = numpy.where(SNRdB < 10**(SNRthresh/10)) | |||
z[ind] = numpy.nan | |||
|
r511 | thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1]) | |
|
r512 | title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y")) | |
|
r511 | xlabel = "" | |
|
r512 | ylabel = "Range (Km)" | |
|
r548 | if SNR: nplots = 2*nplots | |
|
r512 | if onlyPositive: | |
colormap = "jet" | |||
zmin = 0 | |||
else: colormap = "RdBu_r" | |||
|
r511 | ||
if not self.__isConfig: | |||
self.setup(id=id, | |||
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
|
r565 | self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange, timezone = dataOut.timezone) | |
|
r511 | ||
if ymin == None: ymin = numpy.nanmin(y) | |||
if ymax == None: ymax = numpy.nanmax(y) | |||
if zmin == None: zmin = numpy.nanmin(zRange) | |||
if zmax == None: zmax = numpy.nanmax(zRange) | |||
|
r548 | if SNR != None: | |
if SNRmin == None: SNRmin = numpy.nanmin(SNRdB) | |||
if SNRmax == None: SNRmax = numpy.nanmax(SNRdB) | |||
|
r511 | self.FTP_WEI = ftp_wei | |
self.EXP_CODE = exp_code | |||
self.SUB_EXP_CODE = sub_exp_code | |||
self.PLOT_POS = plot_pos | |||
self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.__isConfig = True | |||
self.figfile = figfile | |||
self.setWinTitle(title) | |||
if ((self.xmax - x[1]) < (x[1]-x[0])): | |||
x[1] = self.xmax | |||
|
r548 | ||
for i in range(nchan): | |||
if SNR: j = 2*i | |||
else: j = i | |||
title = "%s Channel %d: %s" %(parameterName, channelIndexList[i]+1, thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
|
r512 | ||
|
r511 | if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): | |
title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) | |||
|
r548 | axes = self.axesList[j*self.__nsubplots] | |
|
r511 | z1 = z[i,:].reshape((1,-1)) | |
axes.pcolorbuffer(x, y, z1, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, | |||
|
r512 | xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap, | |
ticksize=9, cblabel=zlabel, cbsize="1%") | |||
|
r548 | ||
if SNR: | |||
title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i]+1, thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
axes = self.axesList[(j + 1)*self.__nsubplots] | |||
z1 = SNRdB[i,:].reshape((1,-1)) | |||
axes.pcolorbuffer(x, y, z1, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, | |||
xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet", | |||
ticksize=9, cblabel=zlabel, cbsize="1%") | |||
|
r512 | ||
|
r511 | self.draw() | |
|
r513 | if self.figfile == None: | |
str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.figfile = self.getFilename(name = str_datetime) | |||
if figpath != '': | |||
self.counter_imagwr += 1 | |||
if (self.counter_imagwr>=wr_period): | |||
# store png plot to local folder | |||
self.saveFigure(figpath, self.figfile) | |||
# store png plot to FTP server according to RT-Web format | |||
name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
ftp_filename = os.path.join(figpath, name) | |||
self.saveFigure(figpath, ftp_filename) | |||
self.counter_imagwr = 0 | |||
if x[1] >= self.axesList[0].xmax: | |||
self.counter_imagwr = wr_period | |||
self.__isConfig = False | |||
self.figfile = None | |||
class SpectralFittingPlot(Figure): | |||
__isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
PREFIX = 'prm' | |||
N = None | |||
ippSeconds = None | |||
def __init__(self): | |||
self.__isConfig = False | |||
self.__nsubplots = 1 | |||
self.WIDTH = 450 | |||
self.HEIGHT = 250 | |||
self.WIDTHPROF = 0 | |||
self.HEIGHTPROF = 0 | |||
def getSubplots(self): | |||
ncol = int(numpy.sqrt(self.nplots)+0.9) | |||
nrow = int(self.nplots*1./ncol + 0.9) | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=False, show=True): | |||
showprofile = False | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 5 | |||
colspan = 4 | |||
if showprofile: | |||
ncolspan = 5 | |||
colspan = 4 | |||
self.__nsubplots = 2 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH + self.WIDTHPROF, | |||
heightplot = self.HEIGHT + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = self.getSubplots() | |||
counter = 0 | |||
for y in range(nrow): | |||
for x in range(ncol): | |||
if counter >= self.nplots: | |||
break | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) | |||
if showprofile: | |||
self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) | |||
counter += 1 | |||
def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True, | |||
xmin=None, xmax=None, ymin=None, ymax=None, | |||
save=False, figpath='./', figfile=None, show=True): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
if cutHeight==None: | |||
h=270 | |||
heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin() | |||
cutHeight = dataOut.heightList[heightindex] | |||
factor = dataOut.normFactor | |||
|
r543 | x = dataOut.abscissaList[:-1] | |
|
r513 | #y = dataOut.getHeiRange() | |
z = dataOut.data_pre[:,:,heightindex]/factor | |||
z = numpy.where(numpy.isfinite(z), z, numpy.NAN) | |||
avg = numpy.average(z, axis=1) | |||
listChannels = z.shape[0] | |||
#Reconstruct Function | |||
if fit==True: | |||
groupArray = dataOut.groupList | |||
listChannels = groupArray.reshape((groupArray.size)) | |||
listChannels.sort() | |||
spcFitLine = numpy.zeros(z.shape) | |||
constants = dataOut.constants | |||
nGroups = groupArray.shape[0] | |||
nChannels = groupArray.shape[1] | |||
nProfiles = z.shape[1] | |||
for f in range(nGroups): | |||
groupChann = groupArray[f,:] | |||
p = dataOut.data_param[f,:,heightindex] | |||
# p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167]) | |||
fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles | |||
fitLineAux = fitLineAux.reshape((nChannels,nProfiles)) | |||
spcFitLine[groupChann,:] = fitLineAux | |||
# spcFitLine = spcFitLine/factor | |||
z = z[listChannels,:] | |||
spcFitLine = spcFitLine[listChannels,:] | |||
spcFitLinedB = 10*numpy.log10(spcFitLine) | |||
zdB = 10*numpy.log10(z) | |||
#thisDatetime = dataOut.datatime | |||
thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[1]) | |||
title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
xlabel = "Velocity (m/s)" | |||
ylabel = "Spectrum" | |||
if not self.__isConfig: | |||
nplots = listChannels.size | |||
self.setup(id=id, | |||
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
if xmin == None: xmin = numpy.nanmin(x) | |||
if xmax == None: xmax = numpy.nanmax(x) | |||
if ymin == None: ymin = numpy.nanmin(zdB) | |||
if ymax == None: ymax = numpy.nanmax(zdB)+2 | |||
self.__isConfig = True | |||
self.setWinTitle(title) | |||
for i in range(self.nplots): | |||
# title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i]) | |||
title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i]+1) | |||
axes = self.axesList[i*self.__nsubplots] | |||
if fit == False: | |||
axes.pline(x, zdB[i,:], | |||
xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, | |||
xlabel=xlabel, ylabel=ylabel, title=title | |||
) | |||
if fit == True: | |||
fitline=spcFitLinedB[i,:] | |||
y=numpy.vstack([zdB[i,:],fitline] ) | |||
legendlabels=['Data','Fitting'] | |||
axes.pmultilineyaxis(x, y, | |||
xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, | |||
xlabel=xlabel, ylabel=ylabel, title=title, | |||
legendlabels=legendlabels, marker=None, | |||
linestyle='solid', grid='both') | |||
self.draw() | |||
if save: | |||
date = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
if figfile == None: | |||
figfile = self.getFilename(name = date) | |||
self.saveFigure(figpath, figfile) | |||
class EWDriftsPlot(Figure): | |||
__isConfig = None | |||
__nsubplots = None | |||
WIDTHPROF = None | |||
HEIGHTPROF = None | |||
PREFIX = 'drift' | |||
def __init__(self): | |||
self.timerange = 2*60*60 | |||
self.isConfig = False | |||
self.__nsubplots = 1 | |||
self.WIDTH = 800 | |||
self.HEIGHT = 150 | |||
self.WIDTHPROF = 120 | |||
self.HEIGHTPROF = 0 | |||
self.counter_imagwr = 0 | |||
self.PLOT_CODE = 0 | |||
self.FTP_WEI = None | |||
self.EXP_CODE = None | |||
self.SUB_EXP_CODE = None | |||
self.PLOT_POS = None | |||
self.tmin = None | |||
self.tmax = None | |||
self.xmin = None | |||
self.xmax = None | |||
self.figfile = None | |||
def getSubplots(self): | |||
ncol = 1 | |||
nrow = self.nplots | |||
return nrow, ncol | |||
def setup(self, id, nplots, wintitle, showprofile=True, show=True): | |||
self.__showprofile = showprofile | |||
self.nplots = nplots | |||
ncolspan = 1 | |||
colspan = 1 | |||
self.createFigure(id = id, | |||
wintitle = wintitle, | |||
widthplot = self.WIDTH + self.WIDTHPROF, | |||
heightplot = self.HEIGHT + self.HEIGHTPROF, | |||
show=show) | |||
nrow, ncol = self.getSubplots() | |||
counter = 0 | |||
for y in range(nrow): | |||
if counter >= self.nplots: | |||
break | |||
self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1) | |||
counter += 1 | |||
def run(self, dataOut, id, wintitle="", channelList=None, | |||
xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, | |||
zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None, | |||
timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False, | |||
save=False, figpath='', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, | |||
server=None, folder=None, username=None, password=None, | |||
ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): | |||
""" | |||
Input: | |||
dataOut : | |||
id : | |||
wintitle : | |||
channelList : | |||
showProfile : | |||
xmin : None, | |||
xmax : None, | |||
ymin : None, | |||
ymax : None, | |||
zmin : None, | |||
zmax : None | |||
""" | |||
if timerange != None: | |||
self.timerange = timerange | |||
tmin = None | |||
tmax = None | |||
x = dataOut.getTimeRange1() | |||
|
r543 | # y = dataOut.heightList | |
|
r513 | y = dataOut.heightList | |
z = dataOut.data_output | |||
nplots = z.shape[0] #Number of wind dimensions estimated | |||
nplotsw = nplots | |||
#If there is a SNR function defined | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r513 | nplots += 1 | |
|
r514 | SNR = dataOut.data_SNR | |
|
r513 | ||
if SNR_1: | |||
SNR += 1 | |||
SNRavg = numpy.average(SNR, axis=0) | |||
SNRdB = 10*numpy.log10(SNR) | |||
SNRavgdB = 10*numpy.log10(SNRavg) | |||
ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0] | |||
for i in range(nplotsw): | |||
z[i,ind] = numpy.nan | |||
showprofile = False | |||
# thisDatetime = dataOut.datatime | |||
|
r543 | thisDatetime = datetime.datetime.utcfromtimestamp(x[1]) | |
|
r513 | title = wintitle + " EW Drifts" | |
xlabel = "" | |||
ylabel = "Height (Km)" | |||
if not self.__isConfig: | |||
self.setup(id=id, | |||
nplots=nplots, | |||
wintitle=wintitle, | |||
showprofile=showprofile, | |||
show=show) | |||
|
r565 | self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange, timezone = dataOut.timezone) | |
|
r513 | ||
if ymin == None: ymin = numpy.nanmin(y) | |||
if ymax == None: ymax = numpy.nanmax(y) | |||
if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:])) | |||
if zminZonal == None: zminZonal = -zmaxZonal | |||
if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:])) | |||
if zminVertical == None: zminVertical = -zmaxVertical | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r513 | if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB) | |
if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB) | |||
self.FTP_WEI = ftp_wei | |||
self.EXP_CODE = exp_code | |||
self.SUB_EXP_CODE = sub_exp_code | |||
self.PLOT_POS = plot_pos | |||
self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.__isConfig = True | |||
self.setWinTitle(title) | |||
if ((self.xmax - x[1]) < (x[1]-x[0])): | |||
x[1] = self.xmax | |||
strWind = ['Zonal','Vertical'] | |||
strCb = 'Velocity (m/s)' | |||
zmaxVector = [zmaxZonal, zmaxVertical] | |||
zminVector = [zminZonal, zminVertical] | |||
for i in range(nplotsw): | |||
title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
axes = self.axesList[i*self.__nsubplots] | |||
z1 = z[i,:].reshape((1,-1)) | |||
axes.pcolorbuffer(x, y, z1, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i], | |||
xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, | |||
ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r") | |||
|
r514 | if dataOut.data_SNR != None: | |
|
r513 | i += 1 | |
if SNR_1: | |||
title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
else: | |||
title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) | |||
axes = self.axesList[i*self.__nsubplots] | |||
SNRavgdB = SNRavgdB.reshape((1,-1)) | |||
axes.pcolorbuffer(x, y, SNRavgdB, | |||
xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, | |||
xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, | |||
ticksize=9, cblabel='', cbsize="1%", colormap="jet") | |||
self.draw() | |||
|
r511 | if self.figfile == None: | |
str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") | |||
self.figfile = self.getFilename(name = str_datetime) | |||
if figpath != '': | |||
self.counter_imagwr += 1 | |||
if (self.counter_imagwr>=wr_period): | |||
# store png plot to local folder | |||
self.saveFigure(figpath, self.figfile) | |||
# store png plot to FTP server according to RT-Web format | |||
name = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) | |||
ftp_filename = os.path.join(figpath, name) | |||
self.saveFigure(figpath, ftp_filename) | |||
self.counter_imagwr = 0 | |||
|
r509 | if x[1] >= self.axesList[0].xmax: | |
self.counter_imagwr = wr_period | |||
self.__isConfig = False | |||
self.figfile = None |