##// END OF EJS Templates
2 canales plot
avaldezp -
r1435:23d43cc1bb72
parent child
Show More
@@ -1,1047 +1,1082
1 import os
1 import os
2 import datetime
2 import datetime
3 import numpy
3 import numpy
4
4
5 from schainpy.model.graphics.jroplot_base import Plot, plt
5 from schainpy.model.graphics.jroplot_base import Plot, plt
6 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot
6 from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot
7 from schainpy.utils import log
7 from schainpy.utils import log
8 # libreria wradlib
8 # libreria wradlib
9 import wradlib as wrl
9 import wradlib as wrl
10
10
11 EARTH_RADIUS = 6.3710e3
11 EARTH_RADIUS = 6.3710e3
12
12
13
13
14 def ll2xy(lat1, lon1, lat2, lon2):
14 def ll2xy(lat1, lon1, lat2, lon2):
15
15
16 p = 0.017453292519943295
16 p = 0.017453292519943295
17 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
17 a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \
18 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
18 numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2
19 r = 12742 * numpy.arcsin(numpy.sqrt(a))
19 r = 12742 * numpy.arcsin(numpy.sqrt(a))
20 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
20 theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p)
21 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
21 * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p))
22 theta = -theta + numpy.pi/2
22 theta = -theta + numpy.pi/2
23 return r*numpy.cos(theta), r*numpy.sin(theta)
23 return r*numpy.cos(theta), r*numpy.sin(theta)
24
24
25
25
26 def km2deg(km):
26 def km2deg(km):
27 '''
27 '''
28 Convert distance in km to degrees
28 Convert distance in km to degrees
29 '''
29 '''
30
30
31 return numpy.rad2deg(km/EARTH_RADIUS)
31 return numpy.rad2deg(km/EARTH_RADIUS)
32
32
33
33
34
34
35 class SpectralMomentsPlot(SpectraPlot):
35 class SpectralMomentsPlot(SpectraPlot):
36 '''
36 '''
37 Plot for Spectral Moments
37 Plot for Spectral Moments
38 '''
38 '''
39 CODE = 'spc_moments'
39 CODE = 'spc_moments'
40 # colormap = 'jet'
40 # colormap = 'jet'
41 # plot_type = 'pcolor'
41 # plot_type = 'pcolor'
42
42
43 class DobleGaussianPlot(SpectraPlot):
43 class DobleGaussianPlot(SpectraPlot):
44 '''
44 '''
45 Plot for Double Gaussian Plot
45 Plot for Double Gaussian Plot
46 '''
46 '''
47 CODE = 'gaussian_fit'
47 CODE = 'gaussian_fit'
48 # colormap = 'jet'
48 # colormap = 'jet'
49 # plot_type = 'pcolor'
49 # plot_type = 'pcolor'
50
50
51 class DoubleGaussianSpectraCutPlot(SpectraCutPlot):
51 class DoubleGaussianSpectraCutPlot(SpectraCutPlot):
52 '''
52 '''
53 Plot SpectraCut with Double Gaussian Fit
53 Plot SpectraCut with Double Gaussian Fit
54 '''
54 '''
55 CODE = 'cut_gaussian_fit'
55 CODE = 'cut_gaussian_fit'
56
56
57 class SnrPlot(RTIPlot):
57 class SnrPlot(RTIPlot):
58 '''
58 '''
59 Plot for SNR Data
59 Plot for SNR Data
60 '''
60 '''
61
61
62 CODE = 'snr'
62 CODE = 'snr'
63 colormap = 'jet'
63 colormap = 'jet'
64
64
65 def update(self, dataOut):
65 def update(self, dataOut):
66
66
67 data = {
67 data = {
68 'snr': 10*numpy.log10(dataOut.data_snr)
68 'snr': 10*numpy.log10(dataOut.data_snr)
69 }
69 }
70
70
71 return data, {}
71 return data, {}
72
72
73 class DopplerPlot(RTIPlot):
73 class DopplerPlot(RTIPlot):
74 '''
74 '''
75 Plot for DOPPLER Data (1st moment)
75 Plot for DOPPLER Data (1st moment)
76 '''
76 '''
77
77
78 CODE = 'dop'
78 CODE = 'dop'
79 colormap = 'jet'
79 colormap = 'jet'
80
80
81 def update(self, dataOut):
81 def update(self, dataOut):
82
82
83 data = {
83 data = {
84 'dop': 10*numpy.log10(dataOut.data_dop)
84 'dop': 10*numpy.log10(dataOut.data_dop)
85 }
85 }
86
86
87 return data, {}
87 return data, {}
88
88
89 class PowerPlot(RTIPlot):
89 class PowerPlot(RTIPlot):
90 '''
90 '''
91 Plot for Power Data (0 moment)
91 Plot for Power Data (0 moment)
92 '''
92 '''
93
93
94 CODE = 'pow'
94 CODE = 'pow'
95 colormap = 'jet'
95 colormap = 'jet'
96
96
97 def update(self, dataOut):
97 def update(self, dataOut):
98 data = {
98 data = {
99 'pow': 10*numpy.log10(dataOut.data_pow/dataOut.normFactor)
99 'pow': 10*numpy.log10(dataOut.data_pow/dataOut.normFactor)
100 }
100 }
101 return data, {}
101 return data, {}
102
102
103 class SpectralWidthPlot(RTIPlot):
103 class SpectralWidthPlot(RTIPlot):
104 '''
104 '''
105 Plot for Spectral Width Data (2nd moment)
105 Plot for Spectral Width Data (2nd moment)
106 '''
106 '''
107
107
108 CODE = 'width'
108 CODE = 'width'
109 colormap = 'jet'
109 colormap = 'jet'
110
110
111 def update(self, dataOut):
111 def update(self, dataOut):
112
112
113 data = {
113 data = {
114 'width': dataOut.data_width
114 'width': dataOut.data_width
115 }
115 }
116
116
117 return data, {}
117 return data, {}
118
118
119 class SkyMapPlot(Plot):
119 class SkyMapPlot(Plot):
120 '''
120 '''
121 Plot for meteors detection data
121 Plot for meteors detection data
122 '''
122 '''
123
123
124 CODE = 'param'
124 CODE = 'param'
125
125
126 def setup(self):
126 def setup(self):
127
127
128 self.ncols = 1
128 self.ncols = 1
129 self.nrows = 1
129 self.nrows = 1
130 self.width = 7.2
130 self.width = 7.2
131 self.height = 7.2
131 self.height = 7.2
132 self.nplots = 1
132 self.nplots = 1
133 self.xlabel = 'Zonal Zenith Angle (deg)'
133 self.xlabel = 'Zonal Zenith Angle (deg)'
134 self.ylabel = 'Meridional Zenith Angle (deg)'
134 self.ylabel = 'Meridional Zenith Angle (deg)'
135 self.polar = True
135 self.polar = True
136 self.ymin = -180
136 self.ymin = -180
137 self.ymax = 180
137 self.ymax = 180
138 self.colorbar = False
138 self.colorbar = False
139
139
140 def plot(self):
140 def plot(self):
141
141
142 arrayParameters = numpy.concatenate(self.data['param'])
142 arrayParameters = numpy.concatenate(self.data['param'])
143 error = arrayParameters[:, -1]
143 error = arrayParameters[:, -1]
144 indValid = numpy.where(error == 0)[0]
144 indValid = numpy.where(error == 0)[0]
145 finalMeteor = arrayParameters[indValid, :]
145 finalMeteor = arrayParameters[indValid, :]
146 finalAzimuth = finalMeteor[:, 3]
146 finalAzimuth = finalMeteor[:, 3]
147 finalZenith = finalMeteor[:, 4]
147 finalZenith = finalMeteor[:, 4]
148
148
149 x = finalAzimuth * numpy.pi / 180
149 x = finalAzimuth * numpy.pi / 180
150 y = finalZenith
150 y = finalZenith
151
151
152 ax = self.axes[0]
152 ax = self.axes[0]
153
153
154 if ax.firsttime:
154 if ax.firsttime:
155 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
155 ax.plot = ax.plot(x, y, 'bo', markersize=5)[0]
156 else:
156 else:
157 ax.plot.set_data(x, y)
157 ax.plot.set_data(x, y)
158
158
159 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
159 dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S')
160 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
160 dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S')
161 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
161 title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1,
162 dt2,
162 dt2,
163 len(x))
163 len(x))
164 self.titles[0] = title
164 self.titles[0] = title
165
165
166
166
167 class GenericRTIPlot(Plot):
167 class GenericRTIPlot(Plot):
168 '''
168 '''
169 Plot for data_xxxx object
169 Plot for data_xxxx object
170 '''
170 '''
171
171
172 CODE = 'param'
172 CODE = 'param'
173 colormap = 'viridis'
173 colormap = 'viridis'
174 plot_type = 'pcolorbuffer'
174 plot_type = 'pcolorbuffer'
175
175
176 def setup(self):
176 def setup(self):
177 self.xaxis = 'time'
177 self.xaxis = 'time'
178 self.ncols = 1
178 self.ncols = 1
179 self.nrows = self.data.shape('param')[0]
179 self.nrows = self.data.shape('param')[0]
180 self.nplots = self.nrows
180 self.nplots = self.nrows
181 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
181 self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95})
182
182
183 if not self.xlabel:
183 if not self.xlabel:
184 self.xlabel = 'Time'
184 self.xlabel = 'Time'
185
185
186 self.ylabel = 'Range [km]'
186 self.ylabel = 'Range [km]'
187 if not self.titles:
187 if not self.titles:
188 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
188 self.titles = ['Param {}'.format(x) for x in range(self.nrows)]
189
189
190 def update(self, dataOut):
190 def update(self, dataOut):
191
191
192 data = {
192 data = {
193 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
193 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0)
194 }
194 }
195
195
196 meta = {}
196 meta = {}
197
197
198 return data, meta
198 return data, meta
199
199
200 def plot(self):
200 def plot(self):
201 # self.data.normalize_heights()
201 # self.data.normalize_heights()
202 self.x = self.data.times
202 self.x = self.data.times
203 self.y = self.data.yrange
203 self.y = self.data.yrange
204 self.z = self.data['param']
204 self.z = self.data['param']
205 self.z = 10*numpy.log10(self.z)
205 self.z = 10*numpy.log10(self.z)
206 self.z = numpy.ma.masked_invalid(self.z)
206 self.z = numpy.ma.masked_invalid(self.z)
207
207
208 if self.decimation is None:
208 if self.decimation is None:
209 x, y, z = self.fill_gaps(self.x, self.y, self.z)
209 x, y, z = self.fill_gaps(self.x, self.y, self.z)
210 else:
210 else:
211 x, y, z = self.fill_gaps(*self.decimate())
211 x, y, z = self.fill_gaps(*self.decimate())
212
212
213 for n, ax in enumerate(self.axes):
213 for n, ax in enumerate(self.axes):
214
214
215 self.zmax = self.zmax if self.zmax is not None else numpy.max(
215 self.zmax = self.zmax if self.zmax is not None else numpy.max(
216 self.z[n])
216 self.z[n])
217 self.zmin = self.zmin if self.zmin is not None else numpy.min(
217 self.zmin = self.zmin if self.zmin is not None else numpy.min(
218 self.z[n])
218 self.z[n])
219
219
220 if ax.firsttime:
220 if ax.firsttime:
221 if self.zlimits is not None:
221 if self.zlimits is not None:
222 self.zmin, self.zmax = self.zlimits[n]
222 self.zmin, self.zmax = self.zlimits[n]
223
223
224 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
224 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
225 vmin=self.zmin,
225 vmin=self.zmin,
226 vmax=self.zmax,
226 vmax=self.zmax,
227 cmap=self.cmaps[n]
227 cmap=self.cmaps[n]
228 )
228 )
229 else:
229 else:
230 if self.zlimits is not None:
230 if self.zlimits is not None:
231 self.zmin, self.zmax = self.zlimits[n]
231 self.zmin, self.zmax = self.zlimits[n]
232 ax.collections.remove(ax.collections[0])
232 ax.collections.remove(ax.collections[0])
233 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
233 ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n],
234 vmin=self.zmin,
234 vmin=self.zmin,
235 vmax=self.zmax,
235 vmax=self.zmax,
236 cmap=self.cmaps[n]
236 cmap=self.cmaps[n]
237 )
237 )
238
238
239
239
240 class PolarMapPlot(Plot):
240 class PolarMapPlot(Plot):
241 '''
241 '''
242 Plot for weather radar
242 Plot for weather radar
243 '''
243 '''
244
244
245 CODE = 'param'
245 CODE = 'param'
246 colormap = 'seismic'
246 colormap = 'seismic'
247
247
248 def setup(self):
248 def setup(self):
249 self.ncols = 1
249 self.ncols = 1
250 self.nrows = 1
250 self.nrows = 1
251 self.width = 9
251 self.width = 9
252 self.height = 8
252 self.height = 8
253 self.mode = self.data.meta['mode']
253 self.mode = self.data.meta['mode']
254 if self.channels is not None:
254 if self.channels is not None:
255 self.nplots = len(self.channels)
255 self.nplots = len(self.channels)
256 self.nrows = len(self.channels)
256 self.nrows = len(self.channels)
257 else:
257 else:
258 self.nplots = self.data.shape(self.CODE)[0]
258 self.nplots = self.data.shape(self.CODE)[0]
259 self.nrows = self.nplots
259 self.nrows = self.nplots
260 self.channels = list(range(self.nplots))
260 self.channels = list(range(self.nplots))
261 if self.mode == 'E':
261 if self.mode == 'E':
262 self.xlabel = 'Longitude'
262 self.xlabel = 'Longitude'
263 self.ylabel = 'Latitude'
263 self.ylabel = 'Latitude'
264 else:
264 else:
265 self.xlabel = 'Range (km)'
265 self.xlabel = 'Range (km)'
266 self.ylabel = 'Height (km)'
266 self.ylabel = 'Height (km)'
267 self.bgcolor = 'white'
267 self.bgcolor = 'white'
268 self.cb_labels = self.data.meta['units']
268 self.cb_labels = self.data.meta['units']
269 self.lat = self.data.meta['latitude']
269 self.lat = self.data.meta['latitude']
270 self.lon = self.data.meta['longitude']
270 self.lon = self.data.meta['longitude']
271 self.xmin, self.xmax = float(
271 self.xmin, self.xmax = float(
272 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
272 km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon)
273 self.ymin, self.ymax = float(
273 self.ymin, self.ymax = float(
274 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
274 km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat)
275 # self.polar = True
275 # self.polar = True
276
276
277 def plot(self):
277 def plot(self):
278
278
279 for n, ax in enumerate(self.axes):
279 for n, ax in enumerate(self.axes):
280 data = self.data['param'][self.channels[n]]
280 data = self.data['param'][self.channels[n]]
281
281
282 zeniths = numpy.linspace(
282 zeniths = numpy.linspace(
283 0, self.data.meta['max_range'], data.shape[1])
283 0, self.data.meta['max_range'], data.shape[1])
284 if self.mode == 'E':
284 if self.mode == 'E':
285 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
285 azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2
286 r, theta = numpy.meshgrid(zeniths, azimuths)
286 r, theta = numpy.meshgrid(zeniths, azimuths)
287 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
287 x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin(
288 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
288 theta)*numpy.cos(numpy.radians(self.data.meta['elevation']))
289 x = km2deg(x) + self.lon
289 x = km2deg(x) + self.lon
290 y = km2deg(y) + self.lat
290 y = km2deg(y) + self.lat
291 else:
291 else:
292 azimuths = numpy.radians(self.data.yrange)
292 azimuths = numpy.radians(self.data.yrange)
293 r, theta = numpy.meshgrid(zeniths, azimuths)
293 r, theta = numpy.meshgrid(zeniths, azimuths)
294 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
294 x, y = r*numpy.cos(theta), r*numpy.sin(theta)
295 self.y = zeniths
295 self.y = zeniths
296
296
297 if ax.firsttime:
297 if ax.firsttime:
298 if self.zlimits is not None:
298 if self.zlimits is not None:
299 self.zmin, self.zmax = self.zlimits[n]
299 self.zmin, self.zmax = self.zlimits[n]
300 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
300 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
301 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
301 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
302 vmin=self.zmin,
302 vmin=self.zmin,
303 vmax=self.zmax,
303 vmax=self.zmax,
304 cmap=self.cmaps[n])
304 cmap=self.cmaps[n])
305 else:
305 else:
306 if self.zlimits is not None:
306 if self.zlimits is not None:
307 self.zmin, self.zmax = self.zlimits[n]
307 self.zmin, self.zmax = self.zlimits[n]
308 ax.collections.remove(ax.collections[0])
308 ax.collections.remove(ax.collections[0])
309 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
309 ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)),
310 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
310 x, y, numpy.ma.array(data, mask=numpy.isnan(data)),
311 vmin=self.zmin,
311 vmin=self.zmin,
312 vmax=self.zmax,
312 vmax=self.zmax,
313 cmap=self.cmaps[n])
313 cmap=self.cmaps[n])
314
314
315 if self.mode == 'A':
315 if self.mode == 'A':
316 continue
316 continue
317
317
318 # plot district names
318 # plot district names
319 f = open('/data/workspace/schain_scripts/distrito.csv')
319 f = open('/data/workspace/schain_scripts/distrito.csv')
320 for line in f:
320 for line in f:
321 label, lon, lat = [s.strip() for s in line.split(',') if s]
321 label, lon, lat = [s.strip() for s in line.split(',') if s]
322 lat = float(lat)
322 lat = float(lat)
323 lon = float(lon)
323 lon = float(lon)
324 # ax.plot(lon, lat, '.b', ms=2)
324 # ax.plot(lon, lat, '.b', ms=2)
325 ax.text(lon, lat, label.decode('utf8'), ha='center',
325 ax.text(lon, lat, label.decode('utf8'), ha='center',
326 va='bottom', size='8', color='black')
326 va='bottom', size='8', color='black')
327
327
328 # plot limites
328 # plot limites
329 limites = []
329 limites = []
330 tmp = []
330 tmp = []
331 for line in open('/data/workspace/schain_scripts/lima.csv'):
331 for line in open('/data/workspace/schain_scripts/lima.csv'):
332 if '#' in line:
332 if '#' in line:
333 if tmp:
333 if tmp:
334 limites.append(tmp)
334 limites.append(tmp)
335 tmp = []
335 tmp = []
336 continue
336 continue
337 values = line.strip().split(',')
337 values = line.strip().split(',')
338 tmp.append((float(values[0]), float(values[1])))
338 tmp.append((float(values[0]), float(values[1])))
339 for points in limites:
339 for points in limites:
340 ax.add_patch(
340 ax.add_patch(
341 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
341 Polygon(points, ec='k', fc='none', ls='--', lw=0.5))
342
342
343 # plot Cuencas
343 # plot Cuencas
344 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
344 for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'):
345 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
345 f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca))
346 values = [line.strip().split(',') for line in f]
346 values = [line.strip().split(',') for line in f]
347 points = [(float(s[0]), float(s[1])) for s in values]
347 points = [(float(s[0]), float(s[1])) for s in values]
348 ax.add_patch(Polygon(points, ec='b', fc='none'))
348 ax.add_patch(Polygon(points, ec='b', fc='none'))
349
349
350 # plot grid
350 # plot grid
351 for r in (15, 30, 45, 60):
351 for r in (15, 30, 45, 60):
352 ax.add_artist(plt.Circle((self.lon, self.lat),
352 ax.add_artist(plt.Circle((self.lon, self.lat),
353 km2deg(r), color='0.6', fill=False, lw=0.2))
353 km2deg(r), color='0.6', fill=False, lw=0.2))
354 ax.text(
354 ax.text(
355 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
355 self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180),
356 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
356 self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180),
357 '{}km'.format(r),
357 '{}km'.format(r),
358 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
358 ha='center', va='bottom', size='8', color='0.6', weight='heavy')
359
359
360 if self.mode == 'E':
360 if self.mode == 'E':
361 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
361 title = 'El={}$^\circ$'.format(self.data.meta['elevation'])
362 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
362 label = 'E{:02d}'.format(int(self.data.meta['elevation']))
363 else:
363 else:
364 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
364 title = 'Az={}$^\circ$'.format(self.data.meta['azimuth'])
365 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
365 label = 'A{:02d}'.format(int(self.data.meta['azimuth']))
366
366
367 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
367 self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels]
368 self.titles = ['{} {}'.format(
368 self.titles = ['{} {}'.format(
369 self.data.parameters[x], title) for x in self.channels]
369 self.data.parameters[x], title) for x in self.channels]
370
370
371 class WeatherPlot(Plot):
371 class WeatherPlot(Plot):
372 CODE = 'weather'
372 CODE = 'weather'
373 plot_name = 'weather'
373 plot_name = 'weather'
374 plot_type = 'ppistyle'
374 plot_type = 'ppistyle'
375 buffering = False
375 buffering = False
376
376
377 def setup(self):
377 def setup(self):
378 self.ncols = 1
378 self.ncols = 1
379 self.nrows = 1
379 self.nrows = 1
380 self.width =8
381 self.height =8
380 self.nplots= 1
382 self.nplots= 1
381 self.ylabel= 'Range [Km]'
383 self.ylabel= 'Range [Km]'
382 self.titles= ['Weather']
384 self.titles= ['Weather']
383 self.colorbar=False
385 self.colorbar=False
384 self.width =8
385 self.height =8
386 self.ini =0
386 self.ini =0
387 self.len_azi =0
387 self.len_azi =0
388 self.buffer_ini = None
388 self.buffer_ini = None
389 self.buffer_azi = None
389 self.buffer_azi = None
390 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
390 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
391 self.flag =0
391 self.flag =0
392 self.indicador= 0
392 self.indicador= 0
393 self.last_data_azi = None
393 self.last_data_azi = None
394 self.val_mean = None
394 self.val_mean = None
395
395
396 def update(self, dataOut):
396 def update(self, dataOut):
397
397
398 data = {}
398 data = {}
399 meta = {}
399 meta = {}
400 if hasattr(dataOut, 'dataPP_POWER'):
400 if hasattr(dataOut, 'dataPP_POWER'):
401 factor = 1
401 factor = 1
402 if hasattr(dataOut, 'nFFTPoints'):
402 if hasattr(dataOut, 'nFFTPoints'):
403 factor = dataOut.normFactor
403 factor = dataOut.normFactor
404 #print("DIME EL SHAPE PORFAVOR",dataOut.data_360.shape)
404 #print("DIME EL SHAPE PORFAVOR",dataOut.data_360.shape)
405 data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
405 data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
406 data['azi'] = dataOut.data_azi
406 data['azi'] = dataOut.data_azi
407 data['ele'] = dataOut.data_ele
407 data['ele'] = dataOut.data_ele
408 return data, meta
408 return data, meta
409
409
410 def get2List(self,angulos):
410 def get2List(self,angulos):
411 list1=[]
411 list1=[]
412 list2=[]
412 list2=[]
413 for i in reversed(range(len(angulos))):
413 for i in reversed(range(len(angulos))):
414 diff_ = angulos[i]-angulos[i-1]
414 diff_ = angulos[i]-angulos[i-1]
415 if diff_ >1.5:
415 if diff_ >1.5:
416 list1.append(i-1)
416 list1.append(i-1)
417 list2.append(diff_)
417 list2.append(diff_)
418 return list(reversed(list1)),list(reversed(list2))
418 return list(reversed(list1)),list(reversed(list2))
419
419
420 def fixData360(self,list_,ang_):
420 def fixData360(self,list_,ang_):
421 if list_[0]==-1:
421 if list_[0]==-1:
422 vec = numpy.where(ang_<ang_[0])
422 vec = numpy.where(ang_<ang_[0])
423 ang_[vec] = ang_[vec]+360
423 ang_[vec] = ang_[vec]+360
424 return ang_
424 return ang_
425 return ang_
425 return ang_
426
426
427 def fixData360HL(self,angulos):
427 def fixData360HL(self,angulos):
428 vec = numpy.where(angulos>=360)
428 vec = numpy.where(angulos>=360)
429 angulos[vec]=angulos[vec]-360
429 angulos[vec]=angulos[vec]-360
430 return angulos
430 return angulos
431
431
432 def search_pos(self,pos,list_):
432 def search_pos(self,pos,list_):
433 for i in range(len(list_)):
433 for i in range(len(list_)):
434 if pos == list_[i]:
434 if pos == list_[i]:
435 return True,i
435 return True,i
436 i=None
436 i=None
437 return False,i
437 return False,i
438
438
439 def fixDataComp(self,ang_,list1_,list2_):
439 def fixDataComp(self,ang_,list1_,list2_):
440 size = len(ang_)
440 size = len(ang_)
441 size2 = 0
441 size2 = 0
442 for i in range(len(list2_)):
442 for i in range(len(list2_)):
443 size2=size2+round(list2_[i])-1
443 size2=size2+round(list2_[i])-1
444 new_size= size+size2
444 new_size= size+size2
445 ang_new = numpy.zeros(new_size)
445 ang_new = numpy.zeros(new_size)
446 ang_new2 = numpy.zeros(new_size)
446 ang_new2 = numpy.zeros(new_size)
447
447
448 tmp = 0
448 tmp = 0
449 c = 0
449 c = 0
450 for i in range(len(ang_)):
450 for i in range(len(ang_)):
451 ang_new[tmp +c] = ang_[i]
451 ang_new[tmp +c] = ang_[i]
452 ang_new2[tmp+c] = ang_[i]
452 ang_new2[tmp+c] = ang_[i]
453 condition , value = self.search_pos(i,list1_)
453 condition , value = self.search_pos(i,list1_)
454 if condition:
454 if condition:
455 pos = tmp + c + 1
455 pos = tmp + c + 1
456 for k in range(round(list2_[value])-1):
456 for k in range(round(list2_[value])-1):
457 ang_new[pos+k] = ang_new[pos+k-1]+1
457 ang_new[pos+k] = ang_new[pos+k-1]+1
458 ang_new2[pos+k] = numpy.nan
458 ang_new2[pos+k] = numpy.nan
459 tmp = pos +k
459 tmp = pos +k
460 c = 0
460 c = 0
461 c=c+1
461 c=c+1
462 return ang_new,ang_new2
462 return ang_new,ang_new2
463
463
464 def globalCheckPED(self,angulos):
464 def globalCheckPED(self,angulos):
465 l1,l2 = self.get2List(angulos)
465 l1,l2 = self.get2List(angulos)
466 if len(l1)>0:
466 if len(l1)>0:
467 angulos2 = self.fixData360(list_=l1,ang_=angulos)
467 angulos2 = self.fixData360(list_=l1,ang_=angulos)
468 l1,l2 = self.get2List(angulos2)
468 l1,l2 = self.get2List(angulos2)
469
469
470 ang1_,ang2_ = self.fixDataComp(ang_=angulos2,list1_=l1,list2_=l2)
470 ang1_,ang2_ = self.fixDataComp(ang_=angulos2,list1_=l1,list2_=l2)
471 ang1_ = self.fixData360HL(ang1_)
471 ang1_ = self.fixData360HL(ang1_)
472 ang2_ = self.fixData360HL(ang2_)
472 ang2_ = self.fixData360HL(ang2_)
473 else:
473 else:
474 ang1_= angulos
474 ang1_= angulos
475 ang2_= angulos
475 ang2_= angulos
476 return ang1_,ang2_
476 return ang1_,ang2_
477
477
478 def analizeDATA(self,data_azi):
478 def analizeDATA(self,data_azi):
479 list1 = []
479 list1 = []
480 list2 = []
480 list2 = []
481 dat = data_azi
481 dat = data_azi
482 for i in reversed(range(1,len(dat))):
482 for i in reversed(range(1,len(dat))):
483 if dat[i]>dat[i-1]:
483 if dat[i]>dat[i-1]:
484 diff = int(dat[i])-int(dat[i-1])
484 diff = int(dat[i])-int(dat[i-1])
485 else:
485 else:
486 diff = 360+int(dat[i])-int(dat[i-1])
486 diff = 360+int(dat[i])-int(dat[i-1])
487 if diff > 1:
487 if diff > 1:
488 list1.append(i-1)
488 list1.append(i-1)
489 list2.append(diff-1)
489 list2.append(diff-1)
490 return list1,list2
490 return list1,list2
491
491
492 def fixDATANEW(self,data_azi,data_weather):
492 def fixDATANEW(self,data_azi,data_weather):
493 list1,list2 = self.analizeDATA(data_azi)
493 list1,list2 = self.analizeDATA(data_azi)
494 if len(list1)== 0:
494 if len(list1)== 0:
495 return data_azi,data_weather
495 return data_azi,data_weather
496 else:
496 else:
497 resize = 0
497 resize = 0
498 for i in range(len(list2)):
498 for i in range(len(list2)):
499 resize= resize + list2[i]
499 resize= resize + list2[i]
500 new_data_azi = numpy.resize(data_azi,resize)
500 new_data_azi = numpy.resize(data_azi,resize)
501 new_data_weather= numpy.resize(date_weather,resize)
501 new_data_weather= numpy.resize(date_weather,resize)
502
502
503 for i in range(len(list2)):
503 for i in range(len(list2)):
504 j=0
504 j=0
505 position=list1[i]+1
505 position=list1[i]+1
506 for j in range(list2[i]):
506 for j in range(list2[i]):
507 new_data_azi[position+j]=new_data_azi[position+j-1]+1
507 new_data_azi[position+j]=new_data_azi[position+j-1]+1
508 return new_data_azi
508 return new_data_azi
509
509
510 def fixDATA(self,data_azi):
510 def fixDATA(self,data_azi):
511 data=data_azi
511 data=data_azi
512 for i in range(len(data)):
512 for i in range(len(data)):
513 if numpy.isnan(data[i]):
513 if numpy.isnan(data[i]):
514 data[i]=data[i-1]+1
514 data[i]=data[i-1]+1
515 return data
515 return data
516
516
517 def replaceNAN(self,data_weather,data_azi,val):
517 def replaceNAN(self,data_weather,data_azi,val):
518 data= data_azi
518 data= data_azi
519 data_T= data_weather
519 data_T= data_weather
520 if data.shape[0]> data_T.shape[0]:
520 if data.shape[0]> data_T.shape[0]:
521 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
521 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
522 c = 0
522 c = 0
523 for i in range(len(data)):
523 for i in range(len(data)):
524 if numpy.isnan(data[i]):
524 if numpy.isnan(data[i]):
525 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
525 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
526 else:
526 else:
527 data_N[i,:]=data_T[c,:]
527 data_N[i,:]=data_T[c,:]
528 c=c+1
528 c=c+1
529 return data_N
529 return data_N
530 else:
530 else:
531 for i in range(len(data)):
531 for i in range(len(data)):
532 if numpy.isnan(data[i]):
532 if numpy.isnan(data[i]):
533 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
533 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
534 return data_T
534 return data_T
535
535
536 def const_ploteo(self,data_weather,data_azi,step,res):
536 def const_ploteo(self,data_weather,data_azi,step,res):
537 if self.ini==0:
537 if self.ini==0:
538 #-------
538 #-------
539 n = (360/res)-len(data_azi)
539 n = (360/res)-len(data_azi)
540 #--------------------- new -------------------------
540 #--------------------- new -------------------------
541 data_azi_new ,data_azi_old= self.globalCheckPED(data_azi)
541 data_azi_new ,data_azi_old= self.globalCheckPED(data_azi)
542 #------------------------
542 #------------------------
543 start = data_azi_new[-1] + res
543 start = data_azi_new[-1] + res
544 end = data_azi_new[0] - res
544 end = data_azi_new[0] - res
545 #------ new
545 #------ new
546 self.last_data_azi = end
546 self.last_data_azi = end
547 if start>end:
547 if start>end:
548 end = end + 360
548 end = end + 360
549 azi_vacia = numpy.linspace(start,end,int(n))
549 azi_vacia = numpy.linspace(start,end,int(n))
550 azi_vacia = numpy.where(azi_vacia>360,azi_vacia-360,azi_vacia)
550 azi_vacia = numpy.where(azi_vacia>360,azi_vacia-360,azi_vacia)
551 data_azi = numpy.hstack((data_azi_new,azi_vacia))
551 data_azi = numpy.hstack((data_azi_new,azi_vacia))
552 # RADAR
552 # RADAR
553 val_mean = numpy.mean(data_weather[:,-1])
553 val_mean = numpy.mean(data_weather[:,-1])
554 self.val_mean = val_mean
554 self.val_mean = val_mean
555 data_weather_cmp = numpy.ones([(360-data_weather.shape[0]),data_weather.shape[1]])*val_mean
555 data_weather_cmp = numpy.ones([(360-data_weather.shape[0]),data_weather.shape[1]])*val_mean
556 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
556 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
557 data_weather = numpy.vstack((data_weather,data_weather_cmp))
557 data_weather = numpy.vstack((data_weather,data_weather_cmp))
558 else:
558 else:
559 # azimuth
559 # azimuth
560 flag=0
560 flag=0
561 start_azi = self.res_azi[0]
561 start_azi = self.res_azi[0]
562 #-----------new------------
562 #-----------new------------
563 data_azi ,data_azi_old= self.globalCheckPED(data_azi)
563 data_azi ,data_azi_old= self.globalCheckPED(data_azi)
564 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
564 data_weather = self.replaceNAN(data_weather=data_weather,data_azi=data_azi_old,val=self.val_mean)
565 #--------------------------
565 #--------------------------
566 start = data_azi[0]
566 start = data_azi[0]
567 end = data_azi[-1]
567 end = data_azi[-1]
568 self.last_data_azi= end
568 self.last_data_azi= end
569 if start< start_azi:
569 if start< start_azi:
570 start = start +360
570 start = start +360
571 if end <start_azi:
571 if end <start_azi:
572 end = end +360
572 end = end +360
573
573
574 pos_ini = int((start-start_azi)/res)
574 pos_ini = int((start-start_azi)/res)
575 len_azi = len(data_azi)
575 len_azi = len(data_azi)
576 if (360-pos_ini)<len_azi:
576 if (360-pos_ini)<len_azi:
577 if pos_ini+1==360:
577 if pos_ini+1==360:
578 pos_ini=0
578 pos_ini=0
579 else:
579 else:
580 flag=1
580 flag=1
581 dif= 360-pos_ini
581 dif= 360-pos_ini
582 comp= len_azi-dif
582 comp= len_azi-dif
583 #-----------------
583 #-----------------
584 if flag==0:
584 if flag==0:
585 # AZIMUTH
585 # AZIMUTH
586 self.res_azi[pos_ini:pos_ini+len_azi] = data_azi
586 self.res_azi[pos_ini:pos_ini+len_azi] = data_azi
587 # RADAR
587 # RADAR
588 self.res_weather[pos_ini:pos_ini+len_azi,:] = data_weather
588 self.res_weather[pos_ini:pos_ini+len_azi,:] = data_weather
589 else:
589 else:
590 # AZIMUTH
590 # AZIMUTH
591 self.res_azi[pos_ini:pos_ini+dif] = data_azi[0:dif]
591 self.res_azi[pos_ini:pos_ini+dif] = data_azi[0:dif]
592 self.res_azi[0:comp] = data_azi[dif:]
592 self.res_azi[0:comp] = data_azi[dif:]
593 # RADAR
593 # RADAR
594 self.res_weather[pos_ini:pos_ini+dif,:] = data_weather[0:dif,:]
594 self.res_weather[pos_ini:pos_ini+dif,:] = data_weather[0:dif,:]
595 self.res_weather[0:comp,:] = data_weather[dif:,:]
595 self.res_weather[0:comp,:] = data_weather[dif:,:]
596 flag=0
596 flag=0
597 data_azi = self.res_azi
597 data_azi = self.res_azi
598 data_weather = self.res_weather
598 data_weather = self.res_weather
599
599
600 return data_weather,data_azi
600 return data_weather,data_azi
601
601
602 def plot(self):
602 def plot(self):
603 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
603 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
604 data = self.data[-1]
604 data = self.data[-1]
605 r = self.data.yrange
605 r = self.data.yrange
606 delta_height = r[1]-r[0]
606 delta_height = r[1]-r[0]
607 r_mask = numpy.where(r>=0)[0]
607 r_mask = numpy.where(r>=0)[0]
608 r = numpy.arange(len(r_mask))*delta_height
608 r = numpy.arange(len(r_mask))*delta_height
609 self.y = 2*r
609 self.y = 2*r
610 # RADAR
610 # RADAR
611 #data_weather = data['weather']
611 #data_weather = data['weather']
612 # PEDESTAL
612 # PEDESTAL
613 #data_azi = data['azi']
613 #data_azi = data['azi']
614 res = 1
614 res = 1
615 # STEP
615 # STEP
616 step = (360/(res*data['weather'].shape[0]))
616 step = (360/(res*data['weather'].shape[0]))
617
617
618 self.res_weather, self.res_azi = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_azi=data['azi'],step=step,res=res)
618 self.res_weather, self.res_azi = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_azi=data['azi'],step=step,res=res)
619 self.res_ele = numpy.mean(data['ele'])
619 self.res_ele = numpy.mean(data['ele'])
620 ################# PLOTEO ###################
620 ################# PLOTEO ###################
621 for i,ax in enumerate(self.axes):
621 for i,ax in enumerate(self.axes):
622 if ax.firsttime:
622 if ax.firsttime:
623 plt.clf()
623 plt.clf()
624 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
624 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
625 else:
625 else:
626 plt.clf()
626 plt.clf()
627 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
627 cgax, pm = wrl.vis.plot_ppi(self.res_weather,r=r,az=self.res_azi,fig=self.figures[0], proj='cg', vmin=20, vmax=80)
628 caax = cgax.parasites[0]
628 caax = cgax.parasites[0]
629 paax = cgax.parasites[1]
629 paax = cgax.parasites[1]
630 cbar = plt.gcf().colorbar(pm, pad=0.075)
630 cbar = plt.gcf().colorbar(pm, pad=0.075)
631 caax.set_xlabel('x_range [km]')
631 caax.set_xlabel('x_range [km]')
632 caax.set_ylabel('y_range [km]')
632 caax.set_ylabel('y_range [km]')
633 plt.text(1.0, 1.05, 'Azimuth '+str(thisDatetime)+" Step "+str(self.ini)+ " Elev: "+str(round(self.res_ele,2)), transform=caax.transAxes, va='bottom',ha='right')
633 plt.text(1.0, 1.05, 'Azimuth '+str(thisDatetime)+" Step "+str(self.ini)+ " Elev: "+str(round(self.res_ele,2)), transform=caax.transAxes, va='bottom',ha='right')
634
634
635 self.ini= self.ini+1
635 self.ini= self.ini+1
636
636
637
637
638 class WeatherRHIPlot(Plot):
638 class WeatherRHIPlot(Plot):
639 CODE = 'weather'
639 CODE = 'weather'
640 plot_name = 'weather'
640 plot_name = 'weather'
641 plot_type = 'rhistyle'
641 plot_type = 'rhistyle'
642 buffering = False
642 buffering = False
643 data_ele_tmp = None
643 data_ele_tmp = None
644
644
645 def setup(self):
645 def setup(self):
646 print("********************")
647 print("********************")
648 print("********************")
649 print("SETUP WEATHER PLOT")
646 self.ncols = 1
650 self.ncols = 1
647 self.nrows = 1
651 self.nrows = 1
648 self.nplots= 1
652 self.nplots= 1
649 self.ylabel= 'Range [Km]'
653 self.ylabel= 'Range [Km]'
650 self.titles= ['Weather']
654 self.titles= ['Weather']
655 if self.channels is not None:
656 self.nplots = len(self.channels)
657 self.nrows = len(self.channels)
658 else:
659 self.nplots = self.data.shape(self.CODE)[0]
660 self.nrows = self.nplots
661 self.channels = list(range(self.nplots))
662 print("channels",self.channels)
663 print("que saldra", self.data.shape(self.CODE)[0])
664 self.titles = ['{} Channel {}'.format(self.CODE.upper(), x) for x in range(self.nrows)]
665 print("self.titles",self.titles)
651 self.colorbar=False
666 self.colorbar=False
652 self.width =8
667 self.width =8
653 self.height =8
668 self.height =8
654 self.ini =0
669 self.ini =0
655 self.len_azi =0
670 self.len_azi =0
656 self.buffer_ini = None
671 self.buffer_ini = None
657 self.buffer_ele = None
672 self.buffer_ele = None
658 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
673 self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08})
659 self.flag =0
674 self.flag =0
660 self.indicador= 0
675 self.indicador= 0
661 self.last_data_ele = None
676 self.last_data_ele = None
662 self.val_mean = None
677 self.val_mean = None
663
678
664 def update(self, dataOut):
679 def update(self, dataOut):
665
680
666 data = {}
681 data = {}
667 meta = {}
682 meta = {}
668 if hasattr(dataOut, 'dataPP_POWER'):
683 if hasattr(dataOut, 'dataPP_POWER'):
669 factor = 1
684 factor = 1
670 if hasattr(dataOut, 'nFFTPoints'):
685 if hasattr(dataOut, 'nFFTPoints'):
671 factor = dataOut.normFactor
686 factor = dataOut.normFactor
672 data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
687 print("dataOut",dataOut.data_360.shape)
688 #
689 data['weather'] = 10*numpy.log10(dataOut.data_360/(factor))
690 #
691 #data['weather'] = 10*numpy.log10(dataOut.data_360[1]/(factor))
673 data['azi'] = dataOut.data_azi
692 data['azi'] = dataOut.data_azi
674 data['ele'] = dataOut.data_ele
693 data['ele'] = dataOut.data_ele
694 print("UPDATE")
695 print("data[weather]",data['weather'].shape)
696 print("data[azi]",data['azi'])
675 return data, meta
697 return data, meta
676
698
677 def get2List(self,angulos):
699 def get2List(self,angulos):
678 list1=[]
700 list1=[]
679 list2=[]
701 list2=[]
680 for i in reversed(range(len(angulos))):
702 for i in reversed(range(len(angulos))):
681 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
703 if not i==0:#el caso de i=0 evalula el primero de la lista con el ultimo y no es relevante
682 diff_ = angulos[i]-angulos[i-1]
704 diff_ = angulos[i]-angulos[i-1]
683 if abs(diff_) >1.5:
705 if abs(diff_) >1.5:
684 list1.append(i-1)
706 list1.append(i-1)
685 list2.append(diff_)
707 list2.append(diff_)
686 return list(reversed(list1)),list(reversed(list2))
708 return list(reversed(list1)),list(reversed(list2))
687
709
688 def fixData90(self,list_,ang_):
710 def fixData90(self,list_,ang_):
689 if list_[0]==-1:
711 if list_[0]==-1:
690 vec = numpy.where(ang_<ang_[0])
712 vec = numpy.where(ang_<ang_[0])
691 ang_[vec] = ang_[vec]+90
713 ang_[vec] = ang_[vec]+90
692 return ang_
714 return ang_
693 return ang_
715 return ang_
694
716
695 def fixData90HL(self,angulos):
717 def fixData90HL(self,angulos):
696 vec = numpy.where(angulos>=90)
718 vec = numpy.where(angulos>=90)
697 angulos[vec]=angulos[vec]-90
719 angulos[vec]=angulos[vec]-90
698 return angulos
720 return angulos
699
721
700
722
701 def search_pos(self,pos,list_):
723 def search_pos(self,pos,list_):
702 for i in range(len(list_)):
724 for i in range(len(list_)):
703 if pos == list_[i]:
725 if pos == list_[i]:
704 return True,i
726 return True,i
705 i=None
727 i=None
706 return False,i
728 return False,i
707
729
708 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
730 def fixDataComp(self,ang_,list1_,list2_,tipo_case):
709 size = len(ang_)
731 size = len(ang_)
710 size2 = 0
732 size2 = 0
711 for i in range(len(list2_)):
733 for i in range(len(list2_)):
712 size2=size2+round(abs(list2_[i]))-1
734 size2=size2+round(abs(list2_[i]))-1
713 new_size= size+size2
735 new_size= size+size2
714 ang_new = numpy.zeros(new_size)
736 ang_new = numpy.zeros(new_size)
715 ang_new2 = numpy.zeros(new_size)
737 ang_new2 = numpy.zeros(new_size)
716
738
717 tmp = 0
739 tmp = 0
718 c = 0
740 c = 0
719 for i in range(len(ang_)):
741 for i in range(len(ang_)):
720 ang_new[tmp +c] = ang_[i]
742 ang_new[tmp +c] = ang_[i]
721 ang_new2[tmp+c] = ang_[i]
743 ang_new2[tmp+c] = ang_[i]
722 condition , value = self.search_pos(i,list1_)
744 condition , value = self.search_pos(i,list1_)
723 if condition:
745 if condition:
724 pos = tmp + c + 1
746 pos = tmp + c + 1
725 for k in range(round(abs(list2_[value]))-1):
747 for k in range(round(abs(list2_[value]))-1):
726 if tipo_case==0 or tipo_case==3:#subida
748 if tipo_case==0 or tipo_case==3:#subida
727 ang_new[pos+k] = ang_new[pos+k-1]+1
749 ang_new[pos+k] = ang_new[pos+k-1]+1
728 ang_new2[pos+k] = numpy.nan
750 ang_new2[pos+k] = numpy.nan
729 elif tipo_case==1 or tipo_case==2:#bajada
751 elif tipo_case==1 or tipo_case==2:#bajada
730 ang_new[pos+k] = ang_new[pos+k-1]-1
752 ang_new[pos+k] = ang_new[pos+k-1]-1
731 ang_new2[pos+k] = numpy.nan
753 ang_new2[pos+k] = numpy.nan
732
754
733 tmp = pos +k
755 tmp = pos +k
734 c = 0
756 c = 0
735 c=c+1
757 c=c+1
736 return ang_new,ang_new2
758 return ang_new,ang_new2
737
759
738 def globalCheckPED(self,angulos,tipo_case):
760 def globalCheckPED(self,angulos,tipo_case):
739 l1,l2 = self.get2List(angulos)
761 l1,l2 = self.get2List(angulos)
740 ##print("l1",l1)
762 ##print("l1",l1)
741 ##print("l2",l2)
763 ##print("l2",l2)
742 if len(l1)>0:
764 if len(l1)>0:
743 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
765 #angulos2 = self.fixData90(list_=l1,ang_=angulos)
744 #l1,l2 = self.get2List(angulos2)
766 #l1,l2 = self.get2List(angulos2)
745 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
767 ang1_,ang2_ = self.fixDataComp(ang_=angulos,list1_=l1,list2_=l2,tipo_case=tipo_case)
746 #ang1_ = self.fixData90HL(ang1_)
768 #ang1_ = self.fixData90HL(ang1_)
747 #ang2_ = self.fixData90HL(ang2_)
769 #ang2_ = self.fixData90HL(ang2_)
748 else:
770 else:
749 ang1_= angulos
771 ang1_= angulos
750 ang2_= angulos
772 ang2_= angulos
751 return ang1_,ang2_
773 return ang1_,ang2_
752
774
753
775
754 def replaceNAN(self,data_weather,data_ele,val):
776 def replaceNAN(self,data_weather,data_ele,val):
755 data= data_ele
777 data= data_ele
756 data_T= data_weather
778 data_T= data_weather
757 if data.shape[0]> data_T.shape[0]:
779 if data.shape[0]> data_T.shape[0]:
758 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
780 data_N = numpy.ones( [data.shape[0],data_T.shape[1]])
759 c = 0
781 c = 0
760 for i in range(len(data)):
782 for i in range(len(data)):
761 if numpy.isnan(data[i]):
783 if numpy.isnan(data[i]):
762 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
784 data_N[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
763 else:
785 else:
764 data_N[i,:]=data_T[c,:]
786 data_N[i,:]=data_T[c,:]
765 c=c+1
787 c=c+1
766 return data_N
788 return data_N
767 else:
789 else:
768 for i in range(len(data)):
790 for i in range(len(data)):
769 if numpy.isnan(data[i]):
791 if numpy.isnan(data[i]):
770 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
792 data_T[i,:]=numpy.ones(data_T.shape[1])*numpy.nan
771 return data_T
793 return data_T
772
794
773 def check_case(self,data_ele,ang_max,ang_min):
795 def check_case(self,data_ele,ang_max,ang_min):
774 start = data_ele[0]
796 start = data_ele[0]
775 end = data_ele[-1]
797 end = data_ele[-1]
776 number = (end-start)
798 number = (end-start)
777 len_ang=len(data_ele)
799 len_ang=len(data_ele)
778
800
779 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
801 if start<end and (round(abs(number)+1)>=len_ang or (numpy.argmin(data_ele)==0)):#caso subida
780 return 0
802 return 0
781 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
803 #elif start>end and (round(abs(number)+1)>=len_ang or(numpy.argmax(data_ele)==0)):#caso bajada
782 # return 1
804 # return 1
783 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
805 elif round(abs(number)+1)>=len_ang and (start>end or(numpy.argmax(data_ele)==0)):#caso bajada
784 return 1
806 return 1
785 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
807 elif round(abs(number)+1)<len_ang and data_ele[-2]>data_ele[-1]:# caso BAJADA CAMBIO ANG MAX
786 return 2
808 return 2
787 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
809 elif round(abs(number)+1)<len_ang and data_ele[-2]<data_ele[-1] :# caso SUBIDA CAMBIO ANG MIN
788 return 3
810 return 3
789
811
790
812
791 def const_ploteo(self,data_weather,data_ele,step,res,ang_max,ang_min):
813 def const_ploteo(self,val_ch,data_weather,data_ele,step,res,ang_max,ang_min):
792 ang_max= ang_max
814 ang_max= ang_max
793 ang_min= ang_min
815 ang_min= ang_min
794 data_weather=data_weather
816 data_weather=data_weather
817 val_ch=val_ch
795 ##print("*********************DATA WEATHER**************************************")
818 ##print("*********************DATA WEATHER**************************************")
796 ##print(data_weather)
819 ##print(data_weather)
797 if self.ini==0:
820 if self.ini==0:
798 '''
821 '''
799 print("**********************************************")
822 print("**********************************************")
800 print("**********************************************")
823 print("**********************************************")
801 print("***************ini**************")
824 print("***************ini**************")
802 print("**********************************************")
825 print("**********************************************")
803 print("**********************************************")
826 print("**********************************************")
804 '''
827 '''
805 #print("data_ele",data_ele)
828 #print("data_ele",data_ele)
806 #----------------------------------------------------------
829 #----------------------------------------------------------
807 tipo_case = self.check_case(data_ele,ang_max,ang_min)
830 tipo_case = self.check_case(data_ele,ang_max,ang_min)
831 print("check_case",tipo_case)
808 #--------------------- new -------------------------
832 #--------------------- new -------------------------
809 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
833 data_ele_new ,data_ele_old= self.globalCheckPED(data_ele,tipo_case)
810
834
811 #-------------------------CAMBIOS RHI---------------------------------
835 #-------------------------CAMBIOS RHI---------------------------------
812 start= ang_min
836 start= ang_min
813 end = ang_max
837 end = ang_max
814 n= (ang_max-ang_min)/res
838 n= (ang_max-ang_min)/res
815 #------ new
839 #------ new
816 self.start_data_ele = data_ele_new[0]
840 self.start_data_ele = data_ele_new[0]
817 self.end_data_ele = data_ele_new[-1]
841 self.end_data_ele = data_ele_new[-1]
818 if tipo_case==0 or tipo_case==3: # SUBIDA
842 if tipo_case==0 or tipo_case==3: # SUBIDA
819 n1= round(self.start_data_ele)- start
843 n1= round(self.start_data_ele)- start
820 n2= end - round(self.end_data_ele)
844 n2= end - round(self.end_data_ele)
821 if n1>0:
845 if n1>0:
822 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
846 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
823 ele1_nan= numpy.ones(n1)*numpy.nan
847 ele1_nan= numpy.ones(n1)*numpy.nan
824 data_ele = numpy.hstack((ele1,data_ele_new))
848 data_ele = numpy.hstack((ele1,data_ele_new))
825 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
849 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
826 if n2>0:
850 if n2>0:
827 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
851 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
828 ele2_nan= numpy.ones(n2)*numpy.nan
852 ele2_nan= numpy.ones(n2)*numpy.nan
829 data_ele = numpy.hstack((data_ele,ele2))
853 data_ele = numpy.hstack((data_ele,ele2))
830 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
854 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
831
855
832 if tipo_case==1 or tipo_case==2: # BAJADA
856 if tipo_case==1 or tipo_case==2: # BAJADA
833 data_ele_new = data_ele_new[::-1] # reversa
857 data_ele_new = data_ele_new[::-1] # reversa
834 data_ele_old = data_ele_old[::-1]# reversa
858 data_ele_old = data_ele_old[::-1]# reversa
835 data_weather = data_weather[::-1,:]# reversa
859 data_weather = data_weather[::-1,:]# reversa
836 vec= numpy.where(data_ele_new<ang_max)
860 vec= numpy.where(data_ele_new<ang_max)
837 data_ele_new = data_ele_new[vec]
861 data_ele_new = data_ele_new[vec]
838 data_ele_old = data_ele_old[vec]
862 data_ele_old = data_ele_old[vec]
839 data_weather = data_weather[vec[0]]
863 data_weather = data_weather[vec[0]]
840 vec2= numpy.where(0<data_ele_new)
864 vec2= numpy.where(0<data_ele_new)
841 data_ele_new = data_ele_new[vec2]
865 data_ele_new = data_ele_new[vec2]
842 data_ele_old = data_ele_old[vec2]
866 data_ele_old = data_ele_old[vec2]
843 data_weather = data_weather[vec2[0]]
867 data_weather = data_weather[vec2[0]]
844 self.start_data_ele = data_ele_new[0]
868 self.start_data_ele = data_ele_new[0]
845 self.end_data_ele = data_ele_new[-1]
869 self.end_data_ele = data_ele_new[-1]
846
870
847 n1= round(self.start_data_ele)- start
871 n1= round(self.start_data_ele)- start
848 n2= end - round(self.end_data_ele)
872 n2= end - round(self.end_data_ele)-1
873 print(self.start_data_ele)
874 print(self.end_data_ele)
849 if n1>0:
875 if n1>0:
850 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
876 ele1= numpy.linspace(ang_min+1,self.start_data_ele-1,n1)
851 ele1_nan= numpy.ones(n1)*numpy.nan
877 ele1_nan= numpy.ones(n1)*numpy.nan
852 data_ele = numpy.hstack((ele1,data_ele_new))
878 data_ele = numpy.hstack((ele1,data_ele_new))
853 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
879 data_ele_old = numpy.hstack((ele1_nan,data_ele_old))
854 if n2>0:
880 if n2>0:
855 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
881 ele2= numpy.linspace(self.end_data_ele+1,end,n2)
856 ele2_nan= numpy.ones(n2)*numpy.nan
882 ele2_nan= numpy.ones(n2)*numpy.nan
857 data_ele = numpy.hstack((data_ele,ele2))
883 data_ele = numpy.hstack((data_ele,ele2))
858 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
884 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
859 # RADAR
885 # RADAR
860 # NOTA data_ele y data_weather es la variable que retorna
886 # NOTA data_ele y data_weather es la variable que retorna
861 val_mean = numpy.mean(data_weather[:,-1])
887 val_mean = numpy.mean(data_weather[:,-1])
862 self.val_mean = val_mean
888 self.val_mean = val_mean
863 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
889 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
864 self.data_ele_tmp= data_ele_old
890 self.data_ele_tmp[val_ch]= data_ele_old
865 else:
891 else:
866 #print("**********************************************")
892 #print("**********************************************")
867 #print("****************VARIABLE**********************")
893 #print("****************VARIABLE**********************")
868 #-------------------------CAMBIOS RHI---------------------------------
894 #-------------------------CAMBIOS RHI---------------------------------
869 #---------------------------------------------------------------------
895 #---------------------------------------------------------------------
870 ##print("INPUT data_ele",data_ele)
896 ##print("INPUT data_ele",data_ele)
871 flag=0
897 flag=0
872 start_ele = self.res_ele[0]
898 start_ele = self.res_ele[0]
873 tipo_case = self.check_case(data_ele,ang_max,ang_min)
899 tipo_case = self.check_case(data_ele,ang_max,ang_min)
874 #print("TIPO DE DATA",tipo_case)
900 #print("TIPO DE DATA",tipo_case)
875 #-----------new------------
901 #-----------new------------
876 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
902 data_ele ,data_ele_old = self.globalCheckPED(data_ele,tipo_case)
877 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
903 data_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
878
904
879 #-------------------------------NEW RHI ITERATIVO-------------------------
905 #-------------------------------NEW RHI ITERATIVO-------------------------
880
906
881 if tipo_case==0 : # SUBIDA
907 if tipo_case==0 : # SUBIDA
882 vec = numpy.where(data_ele<ang_max)
908 vec = numpy.where(data_ele<ang_max)
883 data_ele = data_ele[vec]
909 data_ele = data_ele[vec]
884 data_ele_old = data_ele_old[vec]
910 data_ele_old = data_ele_old[vec]
885 data_weather = data_weather[vec[0]]
911 data_weather = data_weather[vec[0]]
886
912
887 vec2 = numpy.where(0<data_ele)
913 vec2 = numpy.where(0<data_ele)
888 data_ele= data_ele[vec2]
914 data_ele= data_ele[vec2]
889 data_ele_old= data_ele_old[vec2]
915 data_ele_old= data_ele_old[vec2]
890 ##print(data_ele_new)
916 ##print(data_ele_new)
891 data_weather= data_weather[vec2[0]]
917 data_weather= data_weather[vec2[0]]
892
918
893 new_i_ele = int(round(data_ele[0]))
919 new_i_ele = int(round(data_ele[0]))
894 new_f_ele = int(round(data_ele[-1]))
920 new_f_ele = int(round(data_ele[-1]))
895 #print(new_i_ele)
921 #print(new_i_ele)
896 #print(new_f_ele)
922 #print(new_f_ele)
897 #print(data_ele,len(data_ele))
923 #print(data_ele,len(data_ele))
898 #print(data_ele_old,len(data_ele_old))
924 #print(data_ele_old,len(data_ele_old))
899 if new_i_ele< 2:
925 if new_i_ele< 2:
900 self.data_ele_tmp = numpy.ones(ang_max-ang_min)*numpy.nan
926 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
901 self.res_weather = self.replaceNAN(data_weather=self.res_weather,data_ele=self.data_ele_tmp,val=self.val_mean)
927 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
902 self.data_ele_tmp[new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
928 self.data_ele_tmp[val_ch][new_i_ele:new_i_ele+len(data_ele)]=data_ele_old
903 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
929 self.res_ele[new_i_ele:new_i_ele+len(data_ele)]= data_ele
904 self.res_weather[new_i_ele:new_i_ele+len(data_ele),:]= data_weather
930 self.res_weather[val_ch][new_i_ele:new_i_ele+len(data_ele),:]= data_weather
905 data_ele = self.res_ele
931 data_ele = self.res_ele
906 data_weather = self.res_weather
932 data_weather = self.res_weather[val_ch]
907
933
908 elif tipo_case==1 : #BAJADA
934 elif tipo_case==1 : #BAJADA
909 data_ele = data_ele[::-1] # reversa
935 data_ele = data_ele[::-1] # reversa
910 data_ele_old = data_ele_old[::-1]# reversa
936 data_ele_old = data_ele_old[::-1]# reversa
911 data_weather = data_weather[::-1,:]# reversa
937 data_weather = data_weather[::-1,:]# reversa
912 vec= numpy.where(data_ele<ang_max)
938 vec= numpy.where(data_ele<ang_max)
913 data_ele = data_ele[vec]
939 data_ele = data_ele[vec]
914 data_ele_old = data_ele_old[vec]
940 data_ele_old = data_ele_old[vec]
915 data_weather = data_weather[vec[0]]
941 data_weather = data_weather[vec[0]]
916 vec2= numpy.where(0<data_ele)
942 vec2= numpy.where(0<data_ele)
917 data_ele = data_ele[vec2]
943 data_ele = data_ele[vec2]
918 data_ele_old = data_ele_old[vec2]
944 data_ele_old = data_ele_old[vec2]
919 data_weather = data_weather[vec2[0]]
945 data_weather = data_weather[vec2[0]]
920
946
921
947
922 new_i_ele = int(round(data_ele[0]))
948 new_i_ele = int(round(data_ele[0]))
923 new_f_ele = int(round(data_ele[-1]))
949 new_f_ele = int(round(data_ele[-1]))
924 #print(data_ele)
950 #print(data_ele)
925 #print(ang_max)
951 #print(ang_max)
926 #print(data_ele_old)
952 #print(data_ele_old)
927 if new_i_ele <= 1:
953 if new_i_ele <= 1:
928 new_i_ele = 1
954 new_i_ele = 1
929 if round(data_ele[-1])>=ang_max-1:
955 if round(data_ele[-1])>=ang_max-1:
930 self.data_ele_tmp = numpy.ones(ang_max-ang_min)*numpy.nan
956 self.data_ele_tmp[val_ch] = numpy.ones(ang_max-ang_min)*numpy.nan
931 self.res_weather = self.replaceNAN(data_weather=self.res_weather,data_ele=self.data_ele_tmp,val=self.val_mean)
957 self.res_weather[val_ch] = self.replaceNAN(data_weather=self.res_weather[val_ch],data_ele=self.data_ele_tmp[val_ch],val=self.val_mean)
932 self.data_ele_tmp[new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
958 self.data_ele_tmp[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1]=data_ele_old
933 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
959 self.res_ele[new_i_ele-1:new_i_ele+len(data_ele)-1]= data_ele
934 self.res_weather[new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
960 self.res_weather[val_ch][new_i_ele-1:new_i_ele+len(data_ele)-1,:]= data_weather
935 data_ele = self.res_ele
961 data_ele = self.res_ele
936 data_weather = self.res_weather
962 data_weather = self.res_weather[val_ch]
937
963
938 elif tipo_case==2: #bajada
964 elif tipo_case==2: #bajada
939 vec = numpy.where(data_ele<ang_max)
965 vec = numpy.where(data_ele<ang_max)
940 data_ele = data_ele[vec]
966 data_ele = data_ele[vec]
941 data_weather= data_weather[vec[0]]
967 data_weather= data_weather[vec[0]]
942
968
943 len_vec = len(vec)
969 len_vec = len(vec)
944 data_ele_new = data_ele[::-1] # reversa
970 data_ele_new = data_ele[::-1] # reversa
945 data_weather = data_weather[::-1,:]
971 data_weather = data_weather[::-1,:]
946 new_i_ele = int(data_ele_new[0])
972 new_i_ele = int(data_ele_new[0])
947 new_f_ele = int(data_ele_new[-1])
973 new_f_ele = int(data_ele_new[-1])
948
974
949 n1= new_i_ele- ang_min
975 n1= new_i_ele- ang_min
950 n2= ang_max - new_f_ele-1
976 n2= ang_max - new_f_ele-1
951 if n1>0:
977 if n1>0:
952 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
978 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
953 ele1_nan= numpy.ones(n1)*numpy.nan
979 ele1_nan= numpy.ones(n1)*numpy.nan
954 data_ele = numpy.hstack((ele1,data_ele_new))
980 data_ele = numpy.hstack((ele1,data_ele_new))
955 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
981 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
956 if n2>0:
982 if n2>0:
957 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
983 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
958 ele2_nan= numpy.ones(n2)*numpy.nan
984 ele2_nan= numpy.ones(n2)*numpy.nan
959 data_ele = numpy.hstack((data_ele,ele2))
985 data_ele = numpy.hstack((data_ele,ele2))
960 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
986 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
961
987
962 self.data_ele_tmp = data_ele_old
988 self.data_ele_tmp[val_ch] = data_ele_old
963 self.res_ele = data_ele
989 self.res_ele = data_ele
964 self.res_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
990 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
965 data_ele = self.res_ele
991 data_ele = self.res_ele
966 data_weather = self.res_weather
992 data_weather = self.res_weather[val_ch]
967
993
968 elif tipo_case==3:#subida
994 elif tipo_case==3:#subida
969 vec = numpy.where(0<data_ele)
995 vec = numpy.where(0<data_ele)
970 data_ele= data_ele[vec]
996 data_ele= data_ele[vec]
971 data_ele_new = data_ele
997 data_ele_new = data_ele
972 data_ele_old= data_ele_old[vec]
998 data_ele_old= data_ele_old[vec]
973 data_weather= data_weather[vec[0]]
999 data_weather= data_weather[vec[0]]
974 pos_ini = numpy.argmin(data_ele)
1000 pos_ini = numpy.argmin(data_ele)
975 if pos_ini>0:
1001 if pos_ini>0:
976 len_vec= len(data_ele)
1002 len_vec= len(data_ele)
977 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
1003 vec3 = numpy.linspace(pos_ini,len_vec-1,len_vec-pos_ini).astype(int)
978 #print(vec3)
1004 #print(vec3)
979 data_ele= data_ele[vec3]
1005 data_ele= data_ele[vec3]
980 data_ele_new = data_ele
1006 data_ele_new = data_ele
981 data_ele_old= data_ele_old[vec3]
1007 data_ele_old= data_ele_old[vec3]
982 data_weather= data_weather[vec3]
1008 data_weather= data_weather[vec3]
983
1009
984 new_i_ele = int(data_ele_new[0])
1010 new_i_ele = int(data_ele_new[0])
985 new_f_ele = int(data_ele_new[-1])
1011 new_f_ele = int(data_ele_new[-1])
986 n1= new_i_ele- ang_min
1012 n1= new_i_ele- ang_min
987 n2= ang_max - new_f_ele-1
1013 n2= ang_max - new_f_ele-1
988 if n1>0:
1014 if n1>0:
989 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
1015 ele1= numpy.linspace(ang_min+1,new_i_ele-1,n1)
990 ele1_nan= numpy.ones(n1)*numpy.nan
1016 ele1_nan= numpy.ones(n1)*numpy.nan
991 data_ele = numpy.hstack((ele1,data_ele_new))
1017 data_ele = numpy.hstack((ele1,data_ele_new))
992 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
1018 data_ele_old = numpy.hstack((ele1_nan,data_ele_new))
993 if n2>0:
1019 if n2>0:
994 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
1020 ele2= numpy.linspace(new_f_ele+1,ang_max,n2)
995 ele2_nan= numpy.ones(n2)*numpy.nan
1021 ele2_nan= numpy.ones(n2)*numpy.nan
996 data_ele = numpy.hstack((data_ele,ele2))
1022 data_ele = numpy.hstack((data_ele,ele2))
997 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
1023 data_ele_old = numpy.hstack((data_ele_old,ele2_nan))
998
1024
999 self.data_ele_tmp = data_ele_old
1025 self.data_ele_tmp[val_ch] = data_ele_old
1000 self.res_ele = data_ele
1026 self.res_ele = data_ele
1001 self.res_weather = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1027 self.res_weather[val_ch] = self.replaceNAN(data_weather=data_weather,data_ele=data_ele_old,val=self.val_mean)
1002 data_ele = self.res_ele
1028 data_ele = self.res_ele
1003 data_weather = self.res_weather
1029 data_weather = self.res_weather[val_ch]
1004 #print("self.data_ele_tmp",self.data_ele_tmp)
1030 #print("self.data_ele_tmp",self.data_ele_tmp)
1005 return data_weather,data_ele
1031 return data_weather,data_ele
1006
1032
1007
1033
1008 def plot(self):
1034 def plot(self):
1009 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1035 thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]).strftime('%Y-%m-%d %H:%M:%S')
1010 data = self.data[-1]
1036 data = self.data[-1]
1011 r = self.data.yrange
1037 r = self.data.yrange
1012 delta_height = r[1]-r[0]
1038 delta_height = r[1]-r[0]
1013 r_mask = numpy.where(r>=0)[0]
1039 r_mask = numpy.where(r>=0)[0]
1014 ##print("delta_height",delta_height)
1040 ##print("delta_height",delta_height)
1015 #print("r_mask",r_mask,len(r_mask))
1041 #print("r_mask",r_mask,len(r_mask))
1016 r = numpy.arange(len(r_mask))*delta_height
1042 r = numpy.arange(len(r_mask))*delta_height
1017 self.y = 2*r
1043 self.y = 2*r
1018 res = 1
1044 res = 1
1019 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1045 ###print("data['weather'].shape[0]",data['weather'].shape[0])
1020 ang_max = self.ang_max
1046 ang_max = self.ang_max
1021 ang_min = self.ang_min
1047 ang_min = self.ang_min
1022 var_ang =ang_max - ang_min
1048 var_ang =ang_max - ang_min
1023 step = (int(var_ang)/(res*data['weather'].shape[0]))
1049 step = (int(var_ang)/(res*data['weather'].shape[0]))
1024 ###print("step",step)
1050 ###print("step",step)
1025 #--------------------------------------------------------
1051 #--------------------------------------------------------
1026 ##print('weather',data['weather'].shape)
1052 ##print('weather',data['weather'].shape)
1027 ##print('ele',data['ele'].shape)
1053 ##print('ele',data['ele'].shape)
1028
1054
1029 self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1055 ###self.res_weather, self.res_ele = self.const_ploteo(data_weather=data['weather'][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1030 self.res_azi = numpy.mean(data['azi'])
1056 ###self.res_azi = numpy.mean(data['azi'])
1031 ###print("self.res_ele",self.res_ele)
1057 ###print("self.res_ele",self.res_ele)
1058 plt.clf()
1059 subplots = [121, 122]
1060 if self.ini==0:
1061 self.data_ele_tmp = numpy.ones([self.nplots,int(var_ang)])*numpy.nan
1062 self.res_weather= numpy.ones([self.nplots,int(var_ang),len(r_mask)])*numpy.nan
1063 print("SHAPE",self.data_ele_tmp.shape)
1064
1032 for i,ax in enumerate(self.axes):
1065 for i,ax in enumerate(self.axes):
1066 self.res_weather[i], self.res_ele = self.const_ploteo(val_ch=i, data_weather=data['weather'][i][:,r_mask],data_ele=data['ele'],step=step,res=res,ang_max=ang_max,ang_min=ang_min)
1067 self.res_azi = numpy.mean(data['azi'])
1033 if ax.firsttime:
1068 if ax.firsttime:
1034 plt.clf()
1069 #plt.clf()
1035 cgax, pm = wrl.vis.plot_rhi(self.res_weather,r=r,th=self.res_ele,fig=self.figures[0], proj='cg',vmin=20, vmax=80)
1070 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1071 #fig=self.figures[0]
1036 else:
1072 else:
1037 plt.clf()
1073 #plt.clf()
1038 cgax, pm = wrl.vis.plot_rhi(self.res_weather,r=r,th=self.res_ele,fig=self.figures[0], proj='cg',vmin=20, vmax=80)
1074 cgax, pm = wrl.vis.plot_rhi(self.res_weather[i],r=r,th=self.res_ele,ax=subplots[i], proj='cg',vmin=20, vmax=80)
1039 caax = cgax.parasites[0]
1075 caax = cgax.parasites[0]
1040 paax = cgax.parasites[1]
1076 paax = cgax.parasites[1]
1041 cbar = plt.gcf().colorbar(pm, pad=0.075)
1077 cbar = plt.gcf().colorbar(pm, pad=0.075)
1042 caax.set_xlabel('x_range [km]')
1078 caax.set_xlabel('x_range [km]')
1043 caax.set_ylabel('y_range [km]')
1079 caax.set_ylabel('y_range [km]')
1044 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1080 plt.text(1.0, 1.05, 'Elevacion '+str(thisDatetime)+" Step "+str(self.ini)+ " Azi: "+str(round(self.res_azi,2)), transform=caax.transAxes, va='bottom',ha='right')
1045
1081 print("***************************self.ini****************************",self.ini)
1046 #print("***************************self.ini****************************",self.ini)
1047 self.ini= self.ini+1
1082 self.ini= self.ini+1
General Comments 0
You need to be logged in to leave comments. Login now