##// END OF EJS Templates
RTI & SNR in new plotter operation
Juan C. Valdez -
r866:ff577b5ae5e0
parent child
Show More
@@ -17,6 +17,7 d1970 = datetime.datetime(1970,1,1)
17
17
18 class PlotData(Operation):
18 class PlotData(Operation):
19
19
20 __code = 'Figure'
20 __MAXNUMX = 80
21 __MAXNUMX = 80
21 __MAXNUMY = 80
22 __MAXNUMY = 80
22 __missing = 1E30
23 __missing = 1E30
@@ -30,11 +31,12 class PlotData(Operation):
30 self.dataOut = None
31 self.dataOut = None
31 self.isConfig = False
32 self.isConfig = False
32 self.figure = None
33 self.figure = None
34 self.width = 6
35 self.height = 4
33
36
34 def setup(self, dataOut, **kwargs):
37 def setup(self, dataOut, **kwargs):
35
38
36 self.first = True
39 self.first = True
37 self.plottype = kwargs.pop('plottype', 'rti')
38 self.localtime = kwargs.pop('localtime', True)
40 self.localtime = kwargs.pop('localtime', True)
39 self.show = kwargs.pop('show', True)
41 self.show = kwargs.pop('show', True)
40 self.save = kwargs.pop('save', False)
42 self.save = kwargs.pop('save', False)
@@ -45,7 +47,7 class PlotData(Operation):
45 self.data = [{} for __ in dataOut.channelList]
47 self.data = [{} for __ in dataOut.channelList]
46 self.axes = []
48 self.axes = []
47 self.colormap = kwargs.get('colormap', 'jet')
49 self.colormap = kwargs.get('colormap', 'jet')
48 self.title = kwargs.get('wintitle', self.plottype.upper())
50 self.title = kwargs.get('wintitle', '')
49 self.xaxis = kwargs.get('xaxis', None)
51 self.xaxis = kwargs.get('xaxis', None)
50 self.zmin = kwargs.get('zmin', None)
52 self.zmin = kwargs.get('zmin', None)
51 self.zmax = kwargs.get('zmax', None)
53 self.zmax = kwargs.get('zmax', None)
@@ -60,27 +62,23 class PlotData(Operation):
60 self.xmin = (dtmin-d1970).total_seconds()
62 self.xmin = (dtmin-d1970).total_seconds()
61 self.xmax = (dtmax-d1970).total_seconds()
63 self.xmax = (dtmax-d1970).total_seconds()
62
64
63 if self.plottype in ('rti',):
65 self.ymin = kwargs.get('ymin', None)
64 self.ncols = 1
66 self.ymax = kwargs.get('ymax', None)
65 self.nrows = dataOut.nChannels
66 self.width = 8
67 self.height = 2.2*self.nrows
68 self.ylabel = 'Range [Km]'
69 self.y = dataOut.getHeiRange()
70
71 self.ymin = kwargs.get('ymin', min(self.y))
72 self.ymax = kwargs.get('ymax', max(self.y))
73
67
74 if self.figure is None:
68 if self.figure is None:
75 self.figure = plt.figure()
69 self.figure = plt.figure()
76 else:
70 else:
77 self.figure.clf()
71 self.figure.clf()
78
72
73 self.setup_fig()
74
79 for n in range(dataOut.nChannels):
75 for n in range(dataOut.nChannels):
80 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
76 ax = self.figure.add_subplot(self.nrows, self.ncols, n+1)
81 ax.firsttime = True
77 ax.firsttime = True
82 self.axes.append(ax)
78 self.axes.append(ax)
83
79
80 self.setup_fig()
81
84 self.figure.set_size_inches (self.width, self.height)
82 self.figure.set_size_inches (self.width, self.height)
85
83
86 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
84 def fill_gaps(self, x_buffer, y_buffer, z_buffer):
@@ -94,24 +92,116 class PlotData(Operation):
94 index = np.where(deltas > 5*x_median)
92 index = np.where(deltas > 5*x_median)
95
93
96 if len(index[0]) != 0:
94 if len(index[0]) != 0:
97 z_buffer[index[0],::] = self.__missing
95 z_buffer[::,index[0],::] = self.__missing
98 z_buffer = np.ma.masked_inside(z_buffer,
96 z_buffer = np.ma.masked_inside(z_buffer,
99 0.99*self.__missing,
97 0.99*self.__missing,
100 1.01*self.__missing)
98 1.01*self.__missing)
101
99
102 return x_buffer, y_buffer, z_buffer
100 return x_buffer, y_buffer, z_buffer
103
101
102 def decimate(self):
103
104 dx = int(len(self.x)/self.__MAXNUMX) + 1
105 dy = int(len(self.y)/self.__MAXNUMY) + 1
106
107 x = self.x[::dx]
108 y = self.y[::dy]
109 z = self.z[::, ::dx, ::dy]
110
111 return x, y, z
112
113 def _plot(self):
114
115 self.plot()
116
117 self.figure.suptitle(self.title+self.__code)
118
119 if self.save:
120 figname = os.path.join(self.save, '{}_{}.png'.format(self.__code,
121 self.plot_dt.strftime('%y%m%d_%H%M%S')))
122 print 'Saving figure: {}'.format(figname)
123 self.figure.savefig(figname)
124
125 self.figure.canvas.draw()
126 if self.show:
127 self.figure.show()
128 if self.pause:
129 raw_input('Press <ENTER> to continue')
130
131
132 def update(self):
133
134 pass
135
136 def run(self, dataOut, **kwargs):
137
138 self.dataOut = dataOut
139
140 if not self.isConfig:
141 self.setup(dataOut, **kwargs)
142 self.isConfig = True
143
144 self.nblock += 1
145 self.update()
146
147 if dataOut.ltctime>=self.xmax:
148 self._plot()
149 self.isConfig = False
150
151 def close(self):
152 if self.dataOut:
153 self._plot()
154
155
156 class PlotSpectraData(PlotData):
157
158 __code = 'Spectra'
159
160 def setup_fig(self):
161 pass
162
163 def update(self):
164
165 for ch in self.dataOut.channelList:
166 self.data[ch] = self.dataOut.data_spc[ch]
167
104 def plot(self):
168 def plot(self):
169 pass
170
171
172 class PlotRTIData(PlotData):
173
174 __code = 'RTI'
175
176 def setup_fig(self):
177
178 self.ncols = 1
179 self.nrows = self.dataOut.nChannels
180 self.width = 8
181 self.height = 2.2*self.nrows
182 self.ylabel = 'Range [Km]'
183
184 def update(self):
185
186 self.time.append(self.dataOut.ltctime)
187
188 for ch in self.dataOut.channelList:
189 self.data[ch][self.dataOut.ltctime] = self.dataOut.getPower()[ch]
190
191 def plot(self):
192
193 self.plot_dt = datetime.datetime.utcfromtimestamp(self.time[-2])
105
194
106 dt = datetime.datetime.utcfromtimestamp(self.time[-2])
195 self.time.sort()
196 self.x = self.time
197 self.y = self.dataOut.getHeiRange()
198 self.z = []
107
199
108 if self.plottype=='rti':
200 for ch in self.dataOut.channelList:
109 self.time.sort()
201 self.z.append([self.data[ch][t] for t in self.time])
110 for ch in self.dataOut.channelList:
202
111 self.z.append([self.data[ch][t] for t in self.time])
203 self.x = np.array(self.x)
112 self.x = np.array(self.time)
204 self.z = np.array(self.z)
113 self.z = np.array(self.z)
114 self.plot_rti()
115
205
116 for n, ax in enumerate(self.axes):
206 for n, ax in enumerate(self.axes):
117
207
@@ -122,33 +212,25 class PlotData(Operation):
122 ax.yaxis.set_major_locator(LinearLocator(4))
212 ax.yaxis.set_major_locator(LinearLocator(4))
123
213
124 ax.set_ylabel(self.ylabel)
214 ax.set_ylabel(self.ylabel)
125 ax.set_ylim(self.ymin, self.ymax)
215
126 ax.set_xlim(self.xmin, self.xmax)
216 ax.set_xlim(self.xmin, self.xmax)
127
217
128 ax.set_title('Channel {} {}'.format(
218 ax.set_title('Channel {} {}'.format(self.dataOut.channelList[n],
129 self.dataOut.channelList[n],
219 self.plot_dt.strftime('%y/%m/%d %H:%M:%S')),
130 dt.strftime('%y/%m/%d %H:%M:%S'),
220 size=8)
131 size=6))
132
221
133 if self.save:
222 self.decimate()
134 figname = os.path.join(self.save, 'rti_{}.png'.format(dt.strftime('%y%m%d_%H%M%S')))
135 print 'Saving figure: {}'.format(figname)
136 self.figure.savefig(figname)
137
138 self.figure.canvas.draw()
139 if self.show:
140 self.figure.show()
141 if self.pause:
142 raw_input('Press <ENTER> to continue')
143
144 def plot_rti(self):
145
223
146 for n, ax in enumerate(self.axes):
224 for n, ax in enumerate(self.axes):
147 x, y, z = self.fill_gaps(self.x, self.y, self.z[n])
225
226 x, y, z = self.fill_gaps(*self.decimate())
227
148 if ax.firsttime:
228 if ax.firsttime:
229 ymin = self.ymin if self.ymin else np.nanmin(self.y)
230 ymax = self.ymax if self.ymax else np.nanmax(self.y)
149 zmin = self.zmin if self.zmin else np.nanmin(self.z)
231 zmin = self.zmin if self.zmin else np.nanmin(self.z)
150 zmax = self.zmax if self.zmax else np.nanmax(self.z)
232 zmax = self.zmax if self.zmax else np.nanmax(self.z)
151 plot = ax.pcolormesh(x, y, z.T,
233 plot = ax.pcolormesh(x, y, z[n].T,
152 vmin=zmin,
234 vmin=zmin,
153 vmax=zmax,
235 vmax=zmax,
154 cmap=plt.get_cmap(self.colormap)
236 cmap=plt.get_cmap(self.colormap)
@@ -157,40 +239,21 class PlotData(Operation):
157 cax = divider.new_horizontal(size='3%', pad=0.05)
239 cax = divider.new_horizontal(size='3%', pad=0.05)
158 self.figure.add_axes(cax)
240 self.figure.add_axes(cax)
159 plt.colorbar(plot, cax)
241 plt.colorbar(plot, cax)
242 ax.set_ylim(self.ymin, self.ymax)
160 ax.firsttime = False
243 ax.firsttime = False
161 else:
244 else:
162 plot = ax.pcolormesh(x, y, z.T,
245 plot = ax.pcolormesh(x, y, z[n].T)
163 vmin=zmin,
164 vmax=zmax,
165 cmap=plt.get_cmap(self.colormap)
166 )
167
246
168 self.figure.suptitle(self.title)
169 self.figure.subplots_adjust(wspace=None, hspace=0.5)
247 self.figure.subplots_adjust(wspace=None, hspace=0.5)
248
170
249
250 class PlotSNRData(PlotRTIData):
251
252 __code = 'SNR'
253
171 def update(self):
254 def update(self):
172
255
173 self.nblock += 1
174 self.time.append(self.dataOut.ltctime)
256 self.time.append(self.dataOut.ltctime)
175 if self.plottype=='rti':
176 for ch in self.dataOut.channelList:
177 self.data[ch][self.dataOut.ltctime] = self.dataOut.getPower()[ch]
178
179 def run(self, dataOut, **kwargs):
180
181 self.dataOut = dataOut
182
183 if not self.isConfig:
184 self.setup(dataOut, **kwargs)
185 self.isConfig = True
186
187 self.update()
188
189 if dataOut.ltctime>=self.xmax:
190 self.plot()
191 self.isConfig = False
192
193 def close(self):
194
257
195 self.plot()
258 for ch in self.dataOut.channelList:
196 No newline at end of file
259 self.data[ch][self.dataOut.ltctime] = 10*np.log10(self.dataOut.data_SNR[ch]) No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now