jroplot_voltage.py
417 lines
| 13.6 KiB
| text/x-python
|
PythonLexer
|
r487 | ''' | |
|
r568 | Created on Jul 9, 2014 | |
|
r487 | ||
|
r568 | @author: roj-idl71 | |
''' | |||
import os | |||
|
r487 | import datetime | |
import numpy | |||
|
r1285 | from schainpy.model.graphics.jroplot_base import Plot, plt | |
|
r1173 | ||
|
r1285 | ||
class ScopePlot(Plot): | |||
''' | |||
Plot for Scope | |||
r1296 | ''' | ||
|
r1285 | ||
CODE = 'scope' | |||
plot_type = 'scatter' | |||
r1296 | |||
|
r1285 | def setup(self): | |
self.xaxis = 'Range (Km)' | |||
r1385 | self.nplots = len(self.data.channels) | ||
self.nrows = int(numpy.ceil(self.nplots/2)) | |||
self.ncols = int(numpy.ceil(self.nplots/self.nrows)) | |||
|
r1285 | self.ylabel = 'Intensity [dB]' | |
r1385 | self.titles = ['Channel '+str(self.data.channels[i])+" " for i in self.data.channels] | ||
|
r1285 | self.colorbar = False | |
self.width = 6 | |||
self.height = 4 | |||
r1343 | def update(self, dataOut): | ||
data = {} | |||
meta = { | |||
'nProfiles': dataOut.nProfiles, | |||
'flagDataAsBlock': dataOut.flagDataAsBlock, | |||
'profileIndex': dataOut.profileIndex, | |||
} | |||
if self.CODE == 'scope': | |||
data[self.CODE] = dataOut.data | |||
elif self.CODE == 'pp_power': | |||
data[self.CODE] = dataOut.dataPP_POWER | |||
elif self.CODE == 'pp_signal': | |||
data[self.CODE] = dataOut.dataPP_POW | |||
elif self.CODE == 'pp_velocity': | |||
data[self.CODE] = dataOut.dataPP_DOP | |||
elif self.CODE == 'pp_specwidth': | |||
data[self.CODE] = dataOut.dataPP_WIDTH | |||
return data, meta | |||
|
r1285 | def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle): | |
r1296 | |||
|
r487 | yreal = y[channelIndexList,:].real | |
yimag = y[channelIndexList,:].imag | |||
r1385 | Maintitle = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) | ||
|
r1285 | self.xlabel = "Range (Km)" | |
self.ylabel = "Intensity - IQ" | |||
r1296 | |||
|
r1285 | self.y = yreal | |
self.x = x | |||
r1296 | |||
|
r1285 | for i,ax in enumerate(self.axes): | |
title = "Channel %d" %(i) | |||
if ax.firsttime: | |||
r1343 | self.xmin = min(x) | ||
self.xmax = max(x) | |||
|
r1285 | ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0] | |
ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0] | |||
else: | |||
ax.plt_r.set_data(x, yreal[i,:]) | |||
ax.plt_i.set_data(x, yimag[i,:]) | |||
r1385 | plt.suptitle(Maintitle) | ||
r1296 | |||
|
r1285 | def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle): | |
|
r487 | y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) | |
yreal = y.real | |||
r1296 | yreal = 10*numpy.log10(yreal) | ||
|
r1285 | self.y = yreal | |
r1343 | title = wintitle + " Power: %s" %(thisDatetime.strftime("%d-%b-%Y")) | ||
|
r1285 | self.xlabel = "Range (Km)" | |
r1343 | self.ylabel = "Intensity [dB]" | ||
r1296 | |||
|
r1285 | self.titles[0] = title | |
for i,ax in enumerate(self.axes): | |||
title = "Channel %d" %(i) | |||
ychannel = yreal[i,:] | |||
r1296 | |||
if ax.firsttime: | |||
r1343 | self.xmin = min(x) | ||
self.xmax = max(x) | |||
|
r1285 | ax.plt_r = ax.plot(x, ychannel)[0] | |
else: | |||
ax.plt_r.set_data(x, ychannel) | |||
r1296 | |||
r1385 | |||
r1296 | def plot_weatherpower(self, x, y, channelIndexList, thisDatetime, wintitle): | ||
y = y[channelIndexList,:] | |||
yreal = y.real | |||
yreal = 10*numpy.log10(yreal) | |||
self.y = yreal | |||
title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
self.xlabel = "Range (Km)" | |||
self.ylabel = "Intensity" | |||
self.xmin = min(x) | |||
self.xmax = max(x) | |||
self.titles[0] =title | |||
for i,ax in enumerate(self.axes): | |||
title = "Channel %d" %(i) | |||
ychannel = yreal[i,:] | |||
if ax.firsttime: | |||
ax.plt_r = ax.plot(x, ychannel)[0] | |||
else: | |||
#pass | |||
ax.plt_r.set_data(x, ychannel) | |||
def plot_weathervelocity(self, x, y, channelIndexList, thisDatetime, wintitle): | |||
x = x[channelIndexList,:] | |||
yreal = y | |||
self.y = yreal | |||
title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
self.xlabel = "Velocity (m/s)" | |||
self.ylabel = "Range (Km)" | |||
self.xmin = numpy.min(x) | |||
self.xmax = numpy.max(x) | |||
self.titles[0] =title | |||
for i,ax in enumerate(self.axes): | |||
title = "Channel %d" %(i) | |||
xchannel = x[i,:] | |||
if ax.firsttime: | |||
ax.plt_r = ax.plot(xchannel, yreal)[0] | |||
else: | |||
#pass | |||
ax.plt_r.set_data(xchannel, yreal) | |||
|
r487 | ||
r1305 | def plot_weatherspecwidth(self, x, y, channelIndexList, thisDatetime, wintitle): | ||
x = x[channelIndexList,:] | |||
yreal = y | |||
self.y = yreal | |||
title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) | |||
self.xlabel = "width " | |||
self.ylabel = "Range (Km)" | |||
self.xmin = numpy.min(x) | |||
self.xmax = numpy.max(x) | |||
self.titles[0] =title | |||
for i,ax in enumerate(self.axes): | |||
title = "Channel %d" %(i) | |||
xchannel = x[i,:] | |||
if ax.firsttime: | |||
ax.plt_r = ax.plot(xchannel, yreal)[0] | |||
else: | |||
#pass | |||
ax.plt_r.set_data(xchannel, yreal) | |||
|
r1285 | def plot(self): | |
if self.channels: | |||
channels = self.channels | |||
|
r487 | else: | |
|
r1285 | channels = self.data.channels | |
thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]) | |||
r1343 | |||
scope = self.data[-1][self.CODE] | |||
r1296 | |||
|
r1285 | if self.data.flagDataAsBlock: | |
r1296 | |||
|
r1285 | for i in range(self.data.nProfiles): | |
wintitle1 = " [Profile = %d] " %i | |||
r1296 | if self.CODE =="scope": | ||
if self.type == "power": | |||
r1343 | self.plot_power(self.data.yrange, | ||
r1296 | scope[:,i,:], | ||
channels, | |||
thisDatetime, | |||
wintitle1 | |||
) | |||
if self.type == "iq": | |||
r1343 | self.plot_iq(self.data.yrange, | ||
r1296 | scope[:,i,:], | ||
channels, | |||
thisDatetime, | |||
wintitle1 | |||
|
r1285 | ) | |
r1296 | if self.CODE=="pp_power": | ||
r1343 | self.plot_weatherpower(self.data.yrange, | ||
r1296 | scope[:,i,:], | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
) | |||
r1312 | if self.CODE=="pp_signal": | ||
r1343 | self.plot_weatherpower(self.data.yrange, | ||
r1312 | scope[:,i,:], | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
) | |||
r1296 | if self.CODE=="pp_velocity": | ||
self.plot_weathervelocity(scope[:,i,:], | |||
r1343 | self.data.yrange, | ||
r1296 | channels, | ||
thisDatetime, | |||
wintitle | |||
) | |||
r1305 | if self.CODE=="pp_spcwidth": | ||
self.plot_weatherspecwidth(scope[:,i,:], | |||
r1343 | self.data.yrange, | ||
r1305 | channels, | ||
thisDatetime, | |||
wintitle | |||
) | |||
r1296 | else: | ||
wintitle = " [Profile = %d] " %self.data.profileIndex | |||
if self.CODE== "scope": | |||
if self.type == "power": | |||
r1343 | self.plot_power(self.data.yrange, | ||
r1296 | scope, | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
) | |||
|
r1285 | ||
if self.type == "iq": | |||
r1343 | self.plot_iq(self.data.yrange, | ||
r1296 | scope, | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
|
r1285 | ) | |
r1296 | if self.CODE=="pp_power": | ||
r1343 | self.plot_weatherpower(self.data.yrange, | ||
r1296 | scope, | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
) | |||
r1312 | if self.CODE=="pp_signal": | ||
r1343 | self.plot_weatherpower(self.data.yrange, | ||
r1312 | scope, | ||
channels, | |||
thisDatetime, | |||
wintitle | |||
) | |||
r1296 | if self.CODE=="pp_velocity": | ||
self.plot_weathervelocity(scope, | |||
r1343 | self.data.yrange, | ||
r1296 | channels, | ||
thisDatetime, | |||
wintitle | |||
) | |||
r1305 | if self.CODE=="pp_specwidth": | ||
self.plot_weatherspecwidth(scope, | |||
r1343 | self.data.yrange, | ||
r1305 | channels, | ||
thisDatetime, | |||
wintitle | |||
) | |||
r1296 | |||
class PulsepairPowerPlot(ScopePlot): | |||
''' | |||
r1312 | Plot for P= S+N | ||
r1296 | ''' | ||
CODE = 'pp_power' | |||
plot_type = 'scatter' | |||
class PulsepairVelocityPlot(ScopePlot): | |||
''' | |||
r1312 | Plot for VELOCITY | ||
r1296 | ''' | ||
CODE = 'pp_velocity' | |||
plot_type = 'scatter' | |||
r1305 | |||
class PulsepairSpecwidthPlot(ScopePlot): | |||
''' | |||
r1312 | Plot for WIDTH | ||
r1305 | ''' | ||
CODE = 'pp_specwidth' | |||
plot_type = 'scatter' | |||
r1312 | |||
class PulsepairSignalPlot(ScopePlot): | |||
''' | |||
Plot for S | |||
''' | |||
CODE = 'pp_signal' | |||
plot_type = 'scatter' | |||
r1660 | |||
class Spectra2DPlot(Plot): | |||
''' | |||
Plot for 2D Spectra data | |||
r1664 | Necessary data as Block | ||
you could use profiles2Block Operation | |||
Example: | |||
# opObj11 = volts_proc.addOperation(name='profiles2Block', optype='other') | |||
# # opObj11.addParameter(name='n', value=10, format='int') | |||
# opObj11.addParameter(name='timeInterval', value='2', format='int') | |||
# opObj12 = volts_proc.addOperation(name='Spectra2DPlot', optype='external') | |||
r1660 | ''' | ||
CODE = 'spc' | |||
colormap = 'jet' | |||
plot_type = 'pcolor' | |||
buffering = False | |||
channelList = [] | |||
elevationList = [] | |||
azimuthList = [] | |||
def setup(self): | |||
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.height = 3.4 * self.nrows | |||
self.cb_label = 'dB' | |||
if self.showprofile: | |||
self.width = 5.2 * self.ncols | |||
else: | |||
self.width = 4.2* self.ncols | |||
self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.12}) | |||
self.ylabel = 'Range [km]' | |||
def update_list(self,dataOut): | |||
if len(self.channelList) == 0: | |||
self.channelList = dataOut.channelList | |||
if len(self.elevationList) == 0: | |||
self.elevationList = dataOut.elevationList | |||
if len(self.azimuthList) == 0: | |||
self.azimuthList = dataOut.azimuthList | |||
def update(self, dataOut): | |||
self.update_list(dataOut) | |||
data = {} | |||
meta = {} | |||
spectrum = numpy.fft.fftshift(numpy.fft.fft2(dataOut.data, axes=(1,2))) | |||
z = numpy.abs(spectrum) | |||
phase = numpy.angle(spectrum) | |||
z = numpy.where(numpy.isfinite(z), z, numpy.NAN) | |||
spc = 10*numpy.log10(z) | |||
dt1 = dataOut.ippSeconds | |||
dt2 = dataOut.radarControllerHeaderObj.heightResolution/150000 | |||
data['spc'] = spc | |||
#print(spc[0].shape) | |||
data['phase'] = phase | |||
f1 = numpy.fft.fftshift(numpy.fft.fftfreq(spectrum.shape[1],d=dt1)/1000) | |||
f2 = numpy.fft.fftshift(numpy.fft.fftfreq(spectrum.shape[2],d=dt2)/1000) | |||
meta['range'] = (f1, f2) | |||
return data, meta | |||
def plot(self): | |||
x = self.data.range[0] | |||
y = self.data.range[1] | |||
self.xlabel = "Frequency (kHz)" | |||
self.ylabel = "Frequency (kHz)" | |||
# if self.xaxis == "frequency": | |||
# x = self.data.range[1] | |||
# y = self.data.range[2] | |||
# self.xlabel = "Frequency (kHz)" | |||
# self.ylabel = "Frequency (kHz)" | |||
# else: | |||
# x = self.data.xrange[2] | |||
# self.xlabel = "Velocity (m/s)" | |||
self.titles = [] | |||
self.y = y | |||
data = self.data[-1] | |||
z = data['spc'] | |||
#print(z.shape, x.shape, y.shape) | |||
for n, ax in enumerate(self.axes): | |||
# noise = self.data['noise'][n][0] | |||
#print(noise) | |||
if ax.firsttime: | |||
self.xmax = self.xmax if self.xmax else numpy.nanmax(x) | |||
self.xmin = self.xmin if self.xmin else -self.xmax | |||
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) | |||
) | |||
else: | |||
ax.plt.set_array(z[n].T.ravel()) | |||
if len(self.azimuthList) > 0 and len(self.elevationList) > 0: | |||
self.titles.append('CH {}: {:2.1f}elv {:2.1f} az '.format(self.channelList[n], self.elevationList[n], self.azimuthList[n])) | |||
else: | |||
self.titles.append('CH {}: '.format(self.channelList[n])) |