##// END OF EJS Templates
add multiSchain (@jchavez)
add multiSchain (@jchavez)

File last commit:

r892:30b3788062ca
r892:30b3788062ca
Show More
jroplot_data.py
377 lines | 12.5 KiB | text/x-python | PythonLexer
Juan C. Valdez
New plotter operation
r865
import os
ReceiverData Operation, test PlotData
r889 import zmq
Juan C. Valdez
New plotter operation
r865 import time
import numpy
import datetime
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.ticker import FuncFormatter, LinearLocator
ReceiverData Operation, test PlotData
r889 from multiprocessing import Process
Juan C. Valdez
New plotter operation
r865
from schainpy.model.proc.jroproc_base import Operation
ReceiverData Operation, test PlotData
r889 #plt.ion()
Juan C. Valdez
New plotter operation
r865 func = lambda x, pos: ('%s') %(datetime.datetime.utcfromtimestamp(x).strftime('%H:%M'))
d1970 = datetime.datetime(1970,1,1)
ReceiverData Operation, test PlotData
r889 class PlotData(Operation, Process):
Juan C. Valdez
New plotter operation
r865
ReceiverData Operation, test PlotData
r889 CODE = 'Figure'
colormap = 'jet'
Juan C. Valdez
New plotter operation
r865 __MAXNUMX = 80
__MAXNUMY = 80
__missing = 1E30
ReceiverData Operation, test PlotData
r889 def __init__(self, **kwargs):
Juan C. Valdez
New plotter operation
r865
Operation.__init__(self)
ReceiverData Operation, test PlotData
r889 Process.__init__(self)
self.mp = False
Juan C. Valdez
New plotter operation
r865 self.dataOut = None
self.isConfig = False
self.figure = None
ReceiverData Operation, test PlotData
r889 self.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)
self.showprofile = kwargs.get('showprofile', False)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.title = kwargs.get('wintitle', '')
ReceiverData Operation, test PlotData
r889 self.xaxis = kwargs.get('xaxis', 'time')
Juan C. Valdez
New plotter operation
r865 self.zmin = kwargs.get('zmin', None)
self.zmax = kwargs.get('zmax', None)
ReceiverData Operation, test PlotData
r889 self.xmin = kwargs.get('xmin', None)
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. Valdez
New plotter operation
r865
def fill_gaps(self, x_buffer, y_buffer, z_buffer):
if x_buffer.shape[0] < 2:
return x_buffer, y_buffer, z_buffer
deltas = x_buffer[1:] - x_buffer[0:-1]
x_median = np.median(deltas)
index = np.where(deltas > 5*x_median)
if len(index[0]) != 0:
Juan C. Valdez
RTI & SNR in new plotter operation
r866 z_buffer[::,index[0],::] = self.__missing
Juan C. Valdez
New plotter operation
r865 z_buffer = np.ma.masked_inside(z_buffer,
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
Juan C. Valdez
RTI & SNR in new plotter operation
r866 dx = int(len(self.x)/self.__MAXNUMX) + 1
dy = int(len(self.y)/self.__MAXNUMY) + 1
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866 x = self.x[::dx]
ReceiverData Operation, test PlotData
r889 y = self.y[::dy]
Juan C. Valdez
RTI & SNR in new plotter operation
r866 z = self.z[::, ::dx, ::dy]
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866 return x, y, z
ReceiverData Operation, test PlotData
r889 def __plot(self):
print 'plotting...{}'.format(self.CODE)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
self.plot()
add multiSchain (@jchavez)
r892 self.figure.suptitle('{} {} - Date:{}'.format(self.title, self.CODE.upper(),
datetime.datetime.utcfromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')))
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866 if self.save:
ReceiverData Operation, test PlotData
r889 figname = os.path.join(self.save, '{}_{}.png'.format(self.CODE,
datetime.datetime.utcfromtimestamp(self.times[-1]).strftime('%y%m%d_%H%M%S')))
Juan C. Valdez
RTI & SNR in new plotter operation
r866 print 'Saving figure: {}'.format(figname)
self.figure.savefig(figname)
self.figure.canvas.draw()
ReceiverData Operation, test PlotData
r889 def plot(self):
print 'plotting...{}'.format(self.CODE.upper())
return
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
ReceiverData Operation, test PlotData
r889 print '[Starting] {}'.format(self.name)
context = zmq.Context()
receiver = context.socket(zmq.SUB)
receiver.setsockopt(zmq.SUBSCRIBE, '')
receiver.setsockopt(zmq.CONFLATE, True)
receiver.connect("ipc:///tmp/zmq.plots")
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 while True:
try:
#if True:
self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)
self.dataOut = self.data['dataOut']
self.times = self.data['times']
self.times.sort()
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:
self.setup()
self.isConfig = True
Juan C. Valdez
RTI & SNR in new plotter operation
r866
ReceiverData Operation, test PlotData
r889 self.__plot()
if 'ENDED' in self.data:
#self.setup()
#self.__plot()
pass
except zmq.Again as e:
print 'Waiting for data...'
plt.pause(5)
#time.sleep(3)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
def close(self):
if self.dataOut:
self._plot()
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866
class PlotSpectraData(PlotData):
ReceiverData Operation, test PlotData
r889 CODE = 'spc'
colormap = 'jro'
def setup(self):
ncolspan = 1
colspan = 1
self.ncols = int(numpy.sqrt(self.dataOut.nChannels)+0.9)
self.nrows = int(self.dataOut.nChannels*1./self.ncols + 0.9)
self.width = 3.6*self.ncols
self.height = 3.2*self.nrows
if self.showprofile:
ncolspan = 3
colspan = 2
self.width += 1.2*self.ncols
self.ylabel = 'Range [Km]'
self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList]
if self.figure is None:
self.figure = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
else:
self.figure.clf()
n = 0
for y in range(self.nrows):
for x in range(self.ncols):
if n>=self.dataOut.nChannels:
break
ax = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan), 1, colspan)
if self.showprofile:
ax.ax_profile = plt.subplot2grid((self.nrows, self.ncols*ncolspan), (y, x*ncolspan+colspan), 1, 1)
ax.firsttime = True
self.axes.append(ax)
n += 1
self.figure.subplots_adjust(wspace=0.9, hspace=0.5)
self.figure.show()
Juan C. Valdez
RTI & SNR in new plotter operation
r866
Juan C. Valdez
New plotter operation
r865 def plot(self):
ReceiverData Operation, test PlotData
r889
if self.xaxis == "frequency":
x = self.dataOut.getFreqRange(1)/1000.
xlabel = "Frequency (kHz)"
elif self.xaxis == "time":
x = self.dataOut.getAcfRange(1)
xlabel = "Time (ms)"
else:
x = self.dataOut.getVelRange(1)
xlabel = "Velocity (m/s)"
y = self.dataOut.getHeiRange()
z = self.data[self.CODE]
for n, ax in enumerate(self.axes):
if ax.firsttime:
self.xmax = self.xmax if self.xmax else np.nanmax(x)
self.xmin = self.xmin if self.xmin else -self.xmax
self.ymin = self.ymin if self.ymin else np.nanmin(y)
self.ymax = self.ymax if self.ymax else np.nanmax(y)
self.zmin = self.zmin if self.zmin else np.nanmin(z)
self.zmax = self.zmax if self.zmax else np.nanmax(z)
ax.plot = ax.pcolormesh(x, y, z[n].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
divider = make_axes_locatable(ax)
cax = divider.new_horizontal(size='3%', pad=0.05)
self.figure.add_axes(cax)
plt.colorbar(ax.plot, cax)
ax.set_xlim(self.xmin, self.xmax)
ax.set_ylim(self.ymin, self.ymax)
ax.xaxis.set_major_locator(LinearLocator(5))
#ax.yaxis.set_major_locator(LinearLocator(4))
ax.set_ylabel(self.ylabel)
ax.set_xlabel(xlabel)
ax.firsttime = False
if self.showprofile:
ax.plot_profile= ax.ax_profile.plot(self.data['rti'][self.max_time][n], y)[0]
ax.ax_profile.set_xlim(self.zmin, self.zmax)
ax.ax_profile.set_ylim(self.ymin, self.ymax)
ax.ax_profile.set_xlabel('dB')
ax.ax_profile.grid(b=True, axis='x')
add multiSchain (@jchavez)
r892 ax.plot_noise = ax.ax_profile.plot(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y,
color="k", linestyle="dashed", lw=2)[0]
ReceiverData Operation, test PlotData
r889 [tick.set_visible(False) for tick in ax.ax_profile.get_yticklabels()]
else:
ax.plot.set_array(z[n].T.ravel())
if self.showprofile:
ax.plot_profile.set_data(self.data['rti'][self.max_time][n], y)
add multiSchain (@jchavez)
r892 ax.plot_noise.set_data(numpy.repeat(self.data['noise'][self.max_time][n], len(y)), y)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
add multiSchain (@jchavez)
r892 ax.set_title('{} - Noise: {:.2f} dB'.format(self.titles[n], self.data['noise'][self.max_time][n]),
size=8)
Juan C. Valdez
RTI & SNR in new plotter operation
r866
class PlotRTIData(PlotData):
ReceiverData Operation, test PlotData
r889
CODE = 'rti'
colormap = 'jro'
def setup(self):
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.ncols = 1
self.nrows = self.dataOut.nChannels
ReceiverData Operation, test PlotData
r889 self.width = 10
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.height = 2.2*self.nrows
self.ylabel = 'Range [Km]'
ReceiverData Operation, test PlotData
r889 self.titles = ['Channel {}'.format(x) for x in self.dataOut.channelList]
if self.figure is None:
self.figure = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
else:
self.figure.clf()
for n in range(self.nrows):
ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
ax.firsttime = True
self.axes.append(ax)
self.figure.subplots_adjust(hspace=0.5)
self.figure.show()
Juan C. Valdez
RTI & SNR in new plotter operation
r866 def plot(self):
Juan C. Valdez
New plotter operation
r865
ReceiverData Operation, test PlotData
r889 self.x = np.array(self.times)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 self.y = self.dataOut.getHeiRange()
self.z = []
ReceiverData Operation, test PlotData
r889
for ch in range(self.nrows):
self.z.append([self.data[self.CODE][t][ch] for t in self.times])
self.z = np.array(self.z)
Juan C. Valdez
New plotter operation
r865
for n, ax in enumerate(self.axes):
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
RTI & SNR in new plotter operation
r866 x, y, z = self.fill_gaps(*self.decimate())
ReceiverData Operation, test PlotData
r889
Juan C. Valdez
New plotter operation
r865 if ax.firsttime:
ReceiverData Operation, test PlotData
r889 self.ymin = self.ymin if self.ymin else np.nanmin(self.y)
self.ymax = self.ymax if self.ymax else np.nanmax(self.y)
self.zmin = self.zmin if self.zmin else np.nanmin(self.z)
Juan C. Valdez
New plotter operation
r865 zmax = self.zmax if self.zmax else np.nanmax(self.z)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 plot = ax.pcolormesh(x, y, z[n].T,
ReceiverData Operation, test PlotData
r889 vmin=self.zmin,
vmax=self.zmax,
Juan C. Valdez
New plotter operation
r865 cmap=plt.get_cmap(self.colormap)
)
divider = make_axes_locatable(ax)
ReceiverData Operation, test PlotData
r889 cax = divider.new_horizontal(size='2%', pad=0.05)
Juan C. Valdez
New plotter operation
r865 self.figure.add_axes(cax)
plt.colorbar(plot, cax)
Juan C. Valdez
RTI & SNR in new plotter operation
r866 ax.set_ylim(self.ymin, self.ymax)
ReceiverData Operation, test PlotData
r889 if self.xaxis=='time':
ax.xaxis.set_major_formatter(FuncFormatter(func))
ax.xaxis.set_major_locator(LinearLocator(6))
ax.yaxis.set_major_locator(LinearLocator(4))
ax.set_ylabel(self.ylabel)
if self.xmin is None:
print 'is none'
xmin = self.min_time
else:
xmin = (datetime.datetime.combine(self.dataOut.datatime.date(),
datetime.time(self.xmin, 0, 0))-d1970).total_seconds()
xmax = xmin+self.xrange*60*60
ax.set_xlim(xmin, xmax)
Juan C. Valdez
New plotter operation
r865 ax.firsttime = False
ReceiverData Operation, test PlotData
r889 else:
ax.collections.remove(ax.collections[0])
plot = ax.pcolormesh(x, y, z[n].T,
vmin=self.zmin,
vmax=self.zmax,
cmap=plt.get_cmap(self.colormap)
)
ax.set_title('{} {}'.format(self.titles[n],
datetime.datetime.utcfromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S')),
size=8)
class PlotCOHData(PlotRTIData):
CODE = 'coh'
def setup(self):
self.ncols = 1
self.nrows = self.dataOut.nPairs
self.width = 10
self.height = 2.2*self.nrows
self.ylabel = 'Range [Km]'
self.titles = ['Channels {}'.format(x) for x in self.dataOut.pairsList]
Juan C. Valdez
New plotter operation
r865
ReceiverData Operation, test PlotData
r889 if self.figure is None:
self.figure = plt.figure(figsize=(self.width, self.height),
edgecolor='k',
facecolor='w')
else:
self.figure.clf()
for n in range(self.nrows):
ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
ax.firsttime = True
self.axes.append(ax)
self.figure.subplots_adjust(hspace=0.5)
self.figure.show()
Juan C. Valdez
New plotter operation
r865
Juan C. Valdez
RTI & SNR in new plotter operation
r866 class PlotSNRData(PlotRTIData):
ReceiverData Operation, test PlotData
r889
CODE = 'coh'
class PlotPHASEData(PlotCOHData):
CODE = 'phase'
colormap = 'seismic'