##// END OF EJS Templates
Add new events to PlotData, fix utc times
Add new events to PlotData, fix utc times

File last commit:

r1087:27828ce411ee
r1087:27828ce411ee
Show More
jroplot_data.py
895 lines | 30.2 KiB | text/x-python | PythonLexer
Juan C. Valdez
New plotter operation
r865
import os
import time
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 import glob
Juan C. Valdez
New plotter operation
r865 import datetime
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 from multiprocessing import Process
import zmq
import numpy
José Chávez
ningun cambio
r927 import matplotlib
Juan C. Valdez
New plotter operation
r865 import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 from matplotlib.ticker import FuncFormatter, LinearLocator, MultipleLocator
Juan C. Valdez
New plotter operation
r865
from schainpy.model.proc.jroproc_base import Operation
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 from schainpy.utils import log
ReceiverData Operation, test PlotData
r889
Add interactive change of CMAP and localtime support
r1071 jet_values = matplotlib.pyplot.get_cmap("jet", 100)(numpy.arange(100))[10:90]
blu_values = matplotlib.pyplot.get_cmap("seismic_r", 20)(numpy.arange(20))[10:15]
ncmap = matplotlib.colors.LinearSegmentedColormap.from_list("jro", numpy.vstack((blu_values, jet_values)))
matplotlib.pyplot.register_cmap(cmap=ncmap)
José Chávez
cambios xmax xmin
r1004
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 func = lambda x, pos: '{}'.format(datetime.datetime.utcfromtimestamp(x).strftime('%H:%M'))
Add interactive change of CMAP and localtime support
r1071
CMAPS = [plt.get_cmap(s) for s in ('jro', 'jet', 'RdBu_r', 'seismic')]
Juan C. Valdez
New plotter operation
r865
ReceiverData Operation, test PlotData
r889 class PlotData(Operation, Process):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Base class for Schain plotting operations
'''
Juan C. Valdez
New plotter operation
r865
ReceiverData Operation, test PlotData
r889 CODE = 'Figure'
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 colormap = 'jro'
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 bgcolor = 'white'
José Chávez
finishing day, need testing
r931 CONFLATE = False
Juan C. Valdez
New plotter operation
r865 __MAXNUMX = 80
__missing = 1E30
ReceiverData Operation, test PlotData
r889 def __init__(self, **kwargs):
Juan C. Valdez
New plotter operation
r865
Juan C. Espinoza
Update version, fix kwargs for self operations (methods), Add SendToWeb...
r906 Operation.__init__(self, plot=True, **kwargs)
ReceiverData Operation, test PlotData
r889 Process.__init__(self)
Juan C. Espinoza
Update version, fix kwargs for self operations (methods), Add SendToWeb...
r906 self.kwargs['code'] = self.CODE
ReceiverData Operation, test PlotData
r889 self.mp = False
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.data = None
self.isConfig = False
self.figures = []
ReceiverData Operation, test PlotData
r889 self.axes = []
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.cb_axes = []
Juan C. Valdez
New plotter operation
r865 self.localtime = kwargs.pop('localtime', True)
ReceiverData Operation, test PlotData
r889 self.show = kwargs.get('show', True)
self.save = kwargs.get('save', False)
self.colormap = kwargs.get('colormap', self.colormap)
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.colormap_coh = kwargs.get('colormap_coh', 'jet')
self.colormap_phase = kwargs.get('colormap_phase', 'RdBu_r')
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.colormaps = kwargs.get('colormaps', None)
self.bgcolor = kwargs.get('bgcolor', self.bgcolor)
self.showprofile = kwargs.get('showprofile', False)
self.title = kwargs.get('wintitle', self.CODE.upper())
self.cb_label = kwargs.get('cb_label', None)
self.cb_labels = kwargs.get('cb_labels', None)
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.xaxis = kwargs.get('xaxis', 'frequency')
Juan C. Valdez
New plotter operation
r865 self.zmin = kwargs.get('zmin', None)
self.zmax = kwargs.get('zmax', None)
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.zlimits = kwargs.get('zlimits', None)
Add interactive change of CMAP and localtime support
r1071 self.xmin = kwargs.get('xmin', None)
ReceiverData Operation, test PlotData
r889 self.xmax = kwargs.get('xmax', None)
self.xrange = kwargs.get('xrange', 24)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.ymin = kwargs.get('ymin', None)
self.ymax = kwargs.get('ymax', None)
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xlabel = kwargs.get('xlabel', None)
self.__MAXNUMY = kwargs.get('decimation', 100)
self.showSNR = kwargs.get('showSNR', False)
self.oneFigure = kwargs.get('oneFigure', True)
self.width = kwargs.get('width', None)
self.height = kwargs.get('height', None)
self.colorbar = kwargs.get('colorbar', True)
self.factors = kwargs.get('factors', [1, 1, 1, 1, 1, 1, 1, 1])
self.titles = ['' for __ in range(16)]
def __setup(self):
'''
Common setup for all figures, here figures and axes are created
'''
self.setup()
Add interactive change of CMAP and localtime support
r1071 self.time_label = 'LT' if self.localtime else 'UTC'
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if self.width is None:
self.width = 8
José Chávez
funcionando multidia
r933
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.figures = []
self.axes = []
self.cb_axes = []
self.pf_axes = []
self.cmaps = []
size = '15%' if self.ncols==1 else '30%'
pad = '4%' if self.ncols==1 else '8%'
if self.oneFigure:
if self.height is None:
self.height = 1.4*self.nrows + 1
fig = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
self.figures.append(fig)
for n in range(self.nplots):
ax = fig.add_subplot(self.nrows, self.ncols, n+1)
ax.tick_params(labelsize=8)
ax.firsttime = True
Add interactive change of CMAP and localtime support
r1071 ax.index = 0
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 ax.press = None
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.axes.append(ax)
if self.showprofile:
cax = self.__add_axes(ax, size=size, pad=pad)
cax.tick_params(labelsize=8)
self.pf_axes.append(cax)
else:
if self.height is None:
self.height = 3
for n in range(self.nplots):
fig = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
ax = fig.add_subplot(1, 1, 1)
ax.tick_params(labelsize=8)
ax.firsttime = True
Add interactive change of CMAP and localtime support
r1071 ax.index = 0
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 ax.press = None
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.figures.append(fig)
self.axes.append(ax)
if self.showprofile:
cax = self.__add_axes(ax, size=size, pad=pad)
cax.tick_params(labelsize=8)
self.pf_axes.append(cax)
for n in range(self.nrows):
if self.colormaps is not None:
cmap = plt.get_cmap(self.colormaps[n])
else:
cmap = plt.get_cmap(self.colormap)
cmap.set_bad(self.bgcolor, 1.)
self.cmaps.append(cmap)
Add interactive change of CMAP and localtime support
r1071 for fig in self.figures:
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 fig.canvas.mpl_connect('key_press_event', self.OnKeyPress)
fig.canvas.mpl_connect('scroll_event', self.OnBtnScroll)
fig.canvas.mpl_connect('button_press_event', self.onBtnPress)
fig.canvas.mpl_connect('motion_notify_event', self.onMotion)
fig.canvas.mpl_connect('button_release_event', self.onBtnRelease)
def OnKeyPress(self, event):
'''
Event for pressing keys (up, down) change colormap
'''
ax = event.inaxes
if ax in self.axes:
if event.key == 'down':
ax.index += 1
elif event.key == 'up':
ax.index -= 1
if ax.index < 0:
ax.index = len(CMAPS) - 1
elif ax.index == len(CMAPS):
ax.index = 0
cmap = CMAPS[ax.index]
ax.cbar.set_cmap(cmap)
ax.cbar.draw_all()
ax.plt.set_cmap(cmap)
ax.cbar.patch.figure.canvas.draw()
Add interactive change of CMAP and localtime support
r1071
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 def OnBtnScroll(self, event):
Add interactive change of CMAP and localtime support
r1071 '''
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 Event for scrolling, scale figure
Add interactive change of CMAP and localtime support
r1071 '''
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 cb_ax = event.inaxes
if cb_ax in [ax.cbar.ax for ax in self.axes]:
ax = [ax for ax in self.axes if cb_ax == ax.cbar.ax][0]
pt = ax.cbar.ax.bbox.get_points()[:,1]
nrm = ax.cbar.norm
vmin, vmax, p0, p1, pS = (nrm.vmin, nrm.vmax, pt[0], pt[1], event.y)
scale = 2 if event.step == 1 else 0.5
point = vmin + (vmax - vmin) / (p1 - p0)*(pS - p0)
ax.cbar.norm.vmin = point - scale*(point - vmin)
ax.cbar.norm.vmax = point - scale*(point - vmax)
ax.plt.set_norm(ax.cbar.norm)
ax.cbar.draw_all()
ax.cbar.patch.figure.canvas.draw()
def onBtnPress(self, event):
'''
Event for mouse button press
'''
cb_ax = event.inaxes
if cb_ax is None:
return
Add interactive change of CMAP and localtime support
r1071
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 if cb_ax in [ax.cbar.ax for ax in self.axes]:
cb_ax.press = event.x, event.y
else:
cb_ax.press = None
def onMotion(self, event):
'''
Event for move inside colorbar
'''
cb_ax = event.inaxes
if cb_ax is None:
return
if cb_ax not in [ax.cbar.ax for ax in self.axes]:
return
if cb_ax.press is None:
return
ax = [ax for ax in self.axes if cb_ax == ax.cbar.ax][0]
xprev, yprev = cb_ax.press
dx = event.x - xprev
dy = event.y - yprev
cb_ax.press = event.x, event.y
scale = ax.cbar.norm.vmax - ax.cbar.norm.vmin
perc = 0.03
if event.button == 1:
ax.cbar.norm.vmin -= (perc*scale)*numpy.sign(dy)
ax.cbar.norm.vmax -= (perc*scale)*numpy.sign(dy)
elif event.button == 3:
ax.cbar.norm.vmin -= (perc*scale)*numpy.sign(dy)
ax.cbar.norm.vmax += (perc*scale)*numpy.sign(dy)
ax.cbar.draw_all()
ax.plt.set_norm(ax.cbar.norm)
ax.cbar.patch.figure.canvas.draw()
def onBtnRelease(self, event):
'''
Event for mouse button release
'''
cb_ax = event.inaxes
if cb_ax is not None:
cb_ax.press = None
Add interactive change of CMAP and localtime support
r1071
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 def __add_axes(self, ax, size='30%', pad='8%'):
J Gomez
Issue Listo graficas separadas 90%
r964 '''
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 Add new axes to the given figure
J Gomez
Issue Listo graficas separadas 90%
r964 '''
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 divider = make_axes_locatable(ax)
nax = divider.new_horizontal(size=size, pad=pad)
ax.figure.add_axes(nax)
return nax
J Gomez
Issue Listo graficas separadas 90%
r964
MADReader support for HDF5 (mad2 & mad3)
r1065 self.setup()
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 def setup(self):
'''
This method should be implemented in the child class, the following
attributes should be set:
self.nrows: number of rows
self.ncols: number of cols
self.nplots: number of plots (channels or pairs)
self.ylabel: label for Y axes
self.titles: list of axes title
'''
raise(NotImplementedError, 'Implement this method in child class')
Juan C. Valdez
New plotter operation
r865
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
'''
Create a masked array for missing data
'''
Juan C. Valdez
New plotter operation
r865 if x_buffer.shape[0] < 2:
return x_buffer, y_buffer, z_buffer
deltas = x_buffer[1:] - x_buffer[0:-1]
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x_median = numpy.median(deltas)
Juan C. Valdez
New plotter operation
r865
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 index = numpy.where(deltas > 5*x_median)
Juan C. Valdez
New plotter operation
r865
if len(index[0]) != 0:
José Chávez
cambiados los kwargs para cada operacion/unidad de procesamiento
r897 z_buffer[::, index[0], ::] = self.__missing
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 z_buffer = numpy.ma.masked_inside(z_buffer,
Juan C. Valdez
New plotter operation
r865 0.99*self.__missing,
1.01*self.__missing)
return x_buffer, y_buffer, z_buffer
Juan C. Valdez
RTI & SNR in new plotter operation
r866 def decimate(self):
ReceiverData Operation, test PlotData
r889
José Chávez
funcionando todo
r898 # dx = int(len(self.x)/self.__MAXNUMX) + 1
Juan C. Valdez
RTI & SNR in new plotter operation
r866 dy = int(len(self.y)/self.__MAXNUMY) + 1
ReceiverData Operation, test PlotData
r889
José Chávez
funcionando todo
r898 # x = self.x[::dx]
x = self.x
ReceiverData Operation, test PlotData
r889 y = self.y[::dy]
José Chávez
funcionando todo
r898 z = self.z[::, ::, ::dy]
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
Juan C. Valdez
RTI & SNR in new plotter operation
r866 return x, y, z
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 def format(self):
'''
Set min and max values, labels, ticks and titles
'''
J Gomez
PlotsListos Fase,Coh, Snr, Dop
r983
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if self.xmin is None:
xmin = self.min_time
else:
if self.xaxis is 'time':
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 dt = datetime.datetime.utcfromtimestamp(self.min_time)
xmin = (dt.replace(hour=int(self.xmin), minute=0, second=0) - datetime.datetime(1970, 1, 1)).total_seconds()
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 else:
xmin = self.xmin
J Gomez
PlotsListos Fase,Coh, Snr, Dop
r983
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if self.xmax is None:
xmax = xmin+self.xrange*60*60
else:
if self.xaxis is 'time':
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 dt = datetime.datetime.utcfromtimestamp(self.min_time)
xmax = (dt.replace(hour=int(self.xmax), minute=0, second=0) - datetime.datetime(1970, 1, 1)).total_seconds()
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 else:
xmax = self.xmax
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ymin = self.ymin if self.ymin else numpy.nanmin(self.y)
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 ymax = self.ymax if self.ymax else numpy.nanmax(self.y)
Y = numpy.array([10, 20, 50, 100, 200, 500, 1000, 2000])
i = 1 if numpy.where(ymax < Y)[0][0] < 0 else numpy.where(ymax < Y)[0][0]
ystep = Y[i-1]/5
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
for n, ax in enumerate(self.axes):
if ax.firsttime:
ax.set_facecolor(self.bgcolor)
ax.yaxis.set_major_locator(MultipleLocator(ystep))
if self.xaxis is 'time':
ax.xaxis.set_major_formatter(FuncFormatter(func))
ax.xaxis.set_major_locator(LinearLocator(9))
if self.xlabel is not None:
ax.set_xlabel(self.xlabel)
ax.set_ylabel(self.ylabel)
ax.firsttime = False
if self.showprofile:
self.pf_axes[n].set_ylim(ymin, ymax)
self.pf_axes[n].set_xlim(self.zmin, self.zmax)
self.pf_axes[n].set_xlabel('dB')
self.pf_axes[n].grid(b=True, axis='x')
[tick.set_visible(False) for tick in self.pf_axes[n].get_yticklabels()]
if self.colorbar:
Add interactive change of CMAP and localtime support
r1071 ax.cbar = plt.colorbar(ax.plt, ax=ax, pad=0.02, aspect=10)
ax.cbar.ax.tick_params(labelsize=8)
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 ax.cbar.ax.press = None
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if self.cb_label:
Add interactive change of CMAP and localtime support
r1071 ax.cbar.set_label(self.cb_label, size=8)
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 elif self.cb_labels:
Add interactive change of CMAP and localtime support
r1071 ax.cbar.set_label(self.cb_labels[n], size=8)
ax.set_title('{} - {} {}'.format(
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.titles[n],
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 datetime.datetime.utcfromtimestamp(self.max_time).strftime('%H:%M:%S'),
Add interactive change of CMAP and localtime support
r1071 self.time_label),
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 size=8)
ax.set_xlim(xmin, xmax)
ax.set_ylim(ymin, ymax)
J Gomez
Issues Arreglados
r971
ReceiverData Operation, test PlotData
r889 def __plot(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
'''
log.success('Plotting', self.name)
self.plot()
self.format()
for n, fig in enumerate(self.figures):
if self.nrows == 0 or self.nplots == 0:
log.warning('No data', self.name)
continue
J Gomez
Issue Listo graficas separadas 90%
r964 if self.show:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 fig.show()
fig.tight_layout()
fig.canvas.manager.set_window_title('{} - {}'.format(self.title,
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 datetime.datetime.utcfromtimestamp(self.max_time).strftime('%Y/%m/%d')))
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 # fig.canvas.draw()
if self.save and self.data.ended:
channels = range(self.nrows)
if self.oneFigure:
label = ''
else:
label = '_{}'.format(channels[n])
figname = os.path.join(
self.save,
'{}{}_{}.png'.format(
self.CODE,
label,
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 datetime.datetime.utcfromtimestamp(self.saveTime).strftime('%y%m%d_%H%M%S')
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 )
)
J Gomez
Issue Listo graficas separadas 90%
r964 print 'Saving figure: {}'.format(figname)
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 fig.savefig(figname)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 def plot(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
'''
raise(NotImplementedError, 'Implement this method in child class')
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 def run(self):
Juan C. Valdez
RTI & SNR in new plotter operation
r866
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 log.success('Starting', self.name)
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937
ReceiverData Operation, test PlotData
r889 context = zmq.Context()
receiver = context.socket(zmq.SUB)
receiver.setsockopt(zmq.SUBSCRIBE, '')
José Chávez
cambiados los kwargs para cada operacion/unidad de procesamiento
r897 receiver.setsockopt(zmq.CONFLATE, self.CONFLATE)
J Gomez
Antes del Branch a ind_plt_chs
r962
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937 if 'server' in self.kwargs['parent']:
receiver.connect('ipc:///tmp/{}.plots'.format(self.kwargs['parent']['server']))
else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 receiver.connect("ipc:///tmp/zmq.plots")
Juan C. Espinoza
fixing merge
r938
ReceiverData Operation, test PlotData
r889 while True:
try:
Add interactive change of CMAP and localtime support
r1071 self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)
if self.localtime:
self.times = self.data.times - time.timezone
else:
self.times = self.data.times
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
Add interactive change of CMAP and localtime support
r1071 self.min_time = self.times[0]
self.max_time = self.times[-1]
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 if self.isConfig is False:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.__setup()
ReceiverData Operation, test PlotData
r889 self.isConfig = True
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
self.__plot()
ReceiverData Operation, test PlotData
r889
except zmq.Again as e:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 log.log('Waiting for data...')
if self.data:
plt.pause(self.data.throttle)
else:
time.sleep(2)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
def close(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if self.data:
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.__plot()
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866 class PlotSpectraData(PlotData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for Spectra data
'''
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 CODE = 'spc'
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 colormap = 'jro'
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
ReceiverData Operation, test PlotData
r889 def setup(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.nplots = len(self.data.channels)
self.ncols = int(numpy.sqrt(self.nplots)+ 0.9)
self.nrows = int((1.0*self.nplots/self.ncols) + 0.9)
self.width = 3.4*self.ncols
self.height = 3*self.nrows
self.cb_label = 'dB'
if self.showprofile:
self.width += 0.8*self.ncols
ReceiverData Operation, test PlotData
r889
self.ylabel = 'Range [Km]'
Juan C. Valdez
New plotter operation
r865 def plot(self):
ReceiverData Operation, test PlotData
r889 if self.xaxis == "frequency":
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[0]
self.xlabel = "Frequency (kHz)"
ReceiverData Operation, test PlotData
r889 elif self.xaxis == "time":
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[1]
self.xlabel = "Time (ms)"
ReceiverData Operation, test PlotData
r889 else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[2]
self.xlabel = "Velocity (m/s)"
if self.CODE == 'spc_mean':
x = self.data.xrange[2]
self.xlabel = "Velocity (m/s)"
ReceiverData Operation, test PlotData
r889
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.titles = []
ReceiverData Operation, test PlotData
r889
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 y = self.data.heights
self.y = y
z = self.data['spc']
ReceiverData Operation, test PlotData
r889 for n, ax in enumerate(self.axes):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 noise = self.data['noise'][n][-1]
if self.CODE == 'spc_mean':
mean = self.data['mean'][n][-1]
ReceiverData Operation, test PlotData
r889 if ax.firsttime:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
ReceiverData Operation, test PlotData
r889 self.xmin = self.xmin if self.xmin else -self.xmax
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.zmin = self.zmin if self.zmin else numpy.nanmin(z)
self.zmax = self.zmax if self.zmax else numpy.nanmax(z)
ax.plt = ax.pcolormesh(x, y, z[n].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
ReceiverData Operation, test PlotData
r889
if self.showprofile:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax.plt_profile= self.pf_axes[n].plot(self.data['rti'][n][-1], y)[0]
ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y,
color="k", linestyle="dashed", lw=1)[0]
if self.CODE == 'spc_mean':
ax.plt_mean = ax.plot(mean, y, color='k')[0]
ReceiverData Operation, test PlotData
r889 else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax.plt.set_array(z[n].T.ravel())
ReceiverData Operation, test PlotData
r889 if self.showprofile:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax.plt_profile.set_data(self.data['rti'][n][-1], y)
ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y)
if self.CODE == 'spc_mean':
ax.plt_mean.set_data(mean, y)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.saveTime = self.max_time
class PlotCrossSpectraData(PlotData):
CODE = 'cspc'
zmin_coh = None
zmax_coh = None
zmin_phase = None
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 zmax_phase = None
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
def setup(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.ncols = 4
self.nrows = len(self.data.pairs)
self.nplots = self.nrows*4
self.width = 3.4*self.ncols
self.height = 3*self.nrows
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.ylabel = 'Range [Km]'
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.showprofile = False
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
def plot(self):
if self.xaxis == "frequency":
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[0]
self.xlabel = "Frequency (kHz)"
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 elif self.xaxis == "time":
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[1]
self.xlabel = "Time (ms)"
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 x = self.data.xrange[2]
self.xlabel = "Velocity (m/s)"
self.titles = []
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 y = self.data.heights
self.y = y
spc = self.data['spc']
cspc = self.data['cspc']
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
for n in range(self.nrows):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 noise = self.data['noise'][n][-1]
pair = self.data.pairs[n]
ax = self.axes[4*n]
ax3 = self.axes[4*n+3]
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 if ax.firsttime:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xmax = self.xmax if self.xmax else numpy.nanmax(x)
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.xmin = self.xmin if self.xmin else -self.xmax
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.zmin = self.zmin if self.zmin else numpy.nanmin(spc)
self.zmax = self.zmax if self.zmax else numpy.nanmax(spc)
ax.plt = ax.pcolormesh(x, y, spc[pair[0]].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax.plt.set_array(spc[pair[0]].T.ravel())
self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax = self.axes[4*n+1]
if ax.firsttime:
ax.plt = ax.pcolormesh(x, y, spc[pair[1]].T,
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax.plt.set_array(spc[pair[1]].T.ravel())
self.titles.append('CH {}: {:3.2f}dB'.format(n, noise))
out = cspc[n]/numpy.sqrt(spc[pair[0]]*spc[pair[1]])
coh = numpy.abs(out)
phase = numpy.arctan2(out.imag, out.real)*180/numpy.pi
ax = self.axes[4*n+2]
if ax.firsttime:
ax.plt = ax.pcolormesh(x, y, coh.T,
vmin=0,
vmax=1,
cmap=plt.get_cmap(self.colormap_coh)
)
else:
ax.plt.set_array(coh.T.ravel())
self.titles.append('Coherence Ch{} * Ch{}'.format(pair[0], pair[1]))
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 ax = self.axes[4*n+3]
if ax.firsttime:
ax.plt = ax.pcolormesh(x, y, phase.T,
vmin=-180,
vmax=180,
cmap=plt.get_cmap(self.colormap_phase)
)
else:
ax.plt.set_array(phase.T.ravel())
self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1]))
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.saveTime = self.max_time
Juan C. Valdez
RTI & SNR in new plotter operation
r866
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 class PlotSpectraMeanData(PlotSpectraData):
'''
Plot for Spectra and Mean
'''
CODE = 'spc_mean'
colormap = 'jro'
Juan C. Valdez
RTI & SNR in new plotter operation
r866 class PlotRTIData(PlotData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for RTI data
'''
ReceiverData Operation, test PlotData
r889
CODE = 'rti'
colormap = 'jro'
def setup(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xaxis = 'time'
self.ncols = 1
self.nrows = len(self.data.channels)
self.nplots = len(self.data.channels)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.ylabel = 'Range [Km]'
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.cb_label = 'dB'
self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Valdez
RTI & SNR in new plotter operation
r866 def plot(self):
Add interactive change of CMAP and localtime support
r1071 self.x = self.times
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.y = self.data.heights
self.z = self.data[self.CODE]
self.z = numpy.ma.masked_invalid(self.z)
Juan C. Valdez
New plotter operation
r865
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 for n, ax in enumerate(self.axes):
x, y, z = self.fill_gaps(*self.decimate())
self.zmin = self.zmin if self.zmin else numpy.min(self.z)
self.zmax = self.zmax if self.zmax else numpy.max(self.z)
if ax.firsttime:
ax.plt = ax.pcolormesh(x, y, z[n].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
if self.showprofile:
ax.plot_profile= self.pf_axes[n].plot(self.data['rti'][n][-1], self.y)[0]
ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y,
color="k", linestyle="dashed", lw=1)[0]
else:
ax.collections.remove(ax.collections[0])
ax.plt = ax.pcolormesh(x, y, z[n].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
if self.showprofile:
ax.plot_profile.set_data(self.data['rti'][n][-1], self.y)
ax.plot_noise.set_data(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y)
J Gomez
Issue Listo graficas separadas 90%
r964
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.saveTime = self.min_time
ReceiverData Operation, test PlotData
r889
class PlotCOHData(PlotRTIData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for Coherence data
'''
ReceiverData Operation, test PlotData
r889
CODE = 'coh'
def setup(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xaxis = 'time'
ReceiverData Operation, test PlotData
r889 self.ncols = 1
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.nrows = len(self.data.pairs)
self.nplots = len(self.data.pairs)
self.ylabel = 'Range [Km]'
if self.CODE == 'coh':
self.cb_label = ''
self.titles = ['Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
ReceiverData Operation, test PlotData
r889 else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.cb_label = 'Degrees'
self.titles = ['Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs]
ReceiverData Operation, test PlotData
r889
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
class PlotPHASEData(PlotCOHData):
'''
Plot for Phase map data
'''
CODE = 'phase'
colormap = 'seismic'
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
New plotter operation
r865
add NoisePlot
r907 class PlotNoiseData(PlotData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for noise
'''
add NoisePlot
r907 CODE = 'noise'
def setup(self):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.xaxis = 'time'
add NoisePlot
r907 self.ncols = 1
self.nrows = 1
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.nplots = 1
add NoisePlot
r907 self.ylabel = 'Intensity [dB]'
self.titles = ['Noise']
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.colorbar = False
add NoisePlot
r907
def plot(self):
Add interactive change of CMAP and localtime support
r1071 x = self.times
add NoisePlot
r907 xmin = self.min_time
xmax = xmin+self.xrange*60*60
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 Y = self.data[self.CODE]
if self.axes[0].firsttime:
for ch in self.data.channels:
y = Y[ch]
self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch))
add NoisePlot
r907 plt.legend()
else:
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 for ch in self.data.channels:
y = Y[ch]
self.axes[0].lines[ch].set_data(x, y)
self.ymin = numpy.nanmin(Y) - 5
self.ymax = numpy.nanmax(Y) + 5
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 self.saveTime = self.min_time
add NoisePlot
r907
class PlotSNRData(PlotRTIData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for SNR Data
'''
José Chávez
funcionando todo
r898 CODE = 'snr'
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922 colormap = 'jet'
ReceiverData Operation, test PlotData
r889
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
José Chávez
funcionando todo
r898 class PlotDOPData(PlotRTIData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for DOPPLER Data
'''
José Chávez
funcionando todo
r898 CODE = 'dop'
colormap = 'jet'
ReceiverData Operation, test PlotData
r889
Fix all PlotData, add SpectraMean, CrossSpectra plots, now Parameters extends Spectra fix bugs in ParametersProc
r922
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937 class PlotSkyMapData(PlotData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot for meteors detection data
'''
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937
CODE = 'met'
def setup(self):
self.ncols = 1
self.nrows = 1
self.width = 7.2
self.height = 7.2
self.xlabel = 'Zonal Zenith Angle (deg)'
self.ylabel = 'Meridional Zenith Angle (deg)'
if self.figure is None:
self.figure = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
else:
self.figure.clf()
self.ax = plt.subplot2grid((self.nrows, self.ncols), (0, 0), 1, 1, polar=True)
self.ax.firsttime = True
def plot(self):
Add interactive change of CMAP and localtime support
r1071 arrayParameters = numpy.concatenate([self.data['param'][t] for t in self.times])
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937 error = arrayParameters[:,-1]
indValid = numpy.where(error == 0)[0]
finalMeteor = arrayParameters[indValid,:]
finalAzimuth = finalMeteor[:,3]
finalZenith = finalMeteor[:,4]
x = finalAzimuth*numpy.pi/180
y = finalZenith
if self.ax.firsttime:
self.ax.plot = self.ax.plot(x, y, 'bo', markersize=5)[0]
self.ax.set_ylim(0,90)
self.ax.set_yticks(numpy.arange(0,90,20))
self.ax.set_xlabel(self.xlabel)
self.ax.set_ylabel(self.ylabel)
self.ax.yaxis.labelpad = 40
self.ax.firsttime = False
else:
self.ax.plot.set_data(x, y)
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 dt1 = datetime.datetime.utcfromtimestamp(self.min_time).strftime('%y/%m/%d %H:%M:%S')
dt2 = datetime.datetime.utcfromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')
Juan C. Espinoza
Add SkyMapPlotData, operation can access parent kwargs, fix server plot for multiple ReceiverData
r937 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
dt2,
len(x))
self.ax.set_title(title, size=8)
self.saveTime = self.max_time
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
class PlotParamData(PlotRTIData):
'''
Plot for data_param object
'''
CODE = 'param'
colormap = 'seismic'
def setup(self):
self.xaxis = 'time'
self.ncols = 1
self.nrows = self.data.shape(self.CODE)[0]
self.nplots = self.nrows
if self.showSNR:
self.nrows += 1
MADReader support for HDF5 (mad2 & mad3)
r1065 self.nplots += 1
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062
self.ylabel = 'Height [Km]'
self.titles = self.data.parameters \
if self.data.parameters else ['Param {}'.format(x) for x in xrange(self.nrows)]
if self.showSNR:
self.titles.append('SNR')
def plot(self):
self.data.normalize_heights()
Add interactive change of CMAP and localtime support
r1071 self.x = self.times
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 self.y = self.data.heights
if self.showSNR:
self.z = numpy.concatenate(
(self.data[self.CODE], self.data['snr'])
)
else:
self.z = self.data[self.CODE]
self.z = numpy.ma.masked_invalid(self.z)
for n, ax in enumerate(self.axes):
x, y, z = self.fill_gaps(*self.decimate())
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 self.zmax = self.zmax if self.zmax is not None else numpy.max(self.z[n])
self.zmin = self.zmin if self.zmin is not None else numpy.min(self.z[n])
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 if ax.firsttime:
if self.zlimits is not None:
self.zmin, self.zmax = self.zlimits[n]
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087
ax.plt = ax.pcolormesh(x, y, z[n].T*self.factors[n],
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 vmin=self.zmin,
vmax=self.zmax,
cmap=self.cmaps[n]
)
else:
if self.zlimits is not None:
self.zmin, self.zmax = self.zlimits[n]
ax.collections.remove(ax.collections[0])
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 ax.plt = ax.pcolormesh(x, y, z[n].T*self.factors[n],
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 vmin=self.zmin,
vmax=self.zmax,
cmap=self.cmaps[n]
)
self.saveTime = self.min_time
Juan C. Espinoza
Add new events to PlotData, fix utc times
r1087 class PlotOutputData(PlotParamData):
Juan C. Espinoza
Fix publish and plots operations issue #929
r1062 '''
Plot data_output object
'''
CODE = 'output'
MADReader support for HDF5 (mad2 & mad3)
r1065 colormap = 'seismic'